1.0.41.27: ppc: Calling convention fixes for assembly-routines calling static-funs.
[sbcl.git] / src / runtime / ppc-bsd-os.c
1 #include <signal.h>
2 #include <machine/cpu.h>
3 #include "sbcl.h"
4 #include "runtime.h"
5 #include "thread.h"
6
7
8 int *
9 os_context_register_addr(os_context_t *context, int offset)
10 {
11 #if defined(LISP_FEATURE_NETBSD)
12     return &context->uc_mcontext.__gregs[offset];
13 #elif defined(LISP_FEATURE_OPENBSD)
14     return &context->sc_frame.fixreg[offset];
15 #endif
16 }
17
18 #if defined(ARCH_HAS_STACK_POINTER) /* It's not defined on PPC. */
19 int *
20 os_context_sp_addr(os_context_t *context)
21 {
22 #if defined(LISP_FEATURE_NETBSD)
23     return &(_UC_MACHINE_SP(context));
24 #endif
25 }
26 #endif
27
28
29 int *
30 os_context_pc_addr(os_context_t *context)
31 {
32 #if defined(LISP_FEATURE_NETBSD)
33     return &(_UC_MACHINE_PC(context));
34 #elif defined(LISP_FEATURE_OPENBSD)
35     return &context->sc_frame.srr0;
36 #endif
37 }
38
39 int *
40 os_context_lr_addr(os_context_t *context)
41 {
42 #if defined(LISP_FEATURE_NETBSD)
43     return &context->uc_mcontext.__gregs[_REG_LR];
44 #elif defined(LISP_FEATURE_OPENBSD)
45     return &context->sc_frame.lr;
46 #endif
47 }
48
49 os_context_register_t *
50 os_context_ctr_addr(os_context_t *context)
51 {
52 #if defined(LISP_FEATURE_NETBSD)
53     return &context->uc_mcontext.__gregs[_REG_CTR];
54 #elif defined(LISP_FEATURE_OPENBSD)
55     return &context->sc_frame.ctr;
56 #endif
57 }
58
59 os_context_register_t *
60 os_context_cr_addr(os_context_t *context)
61 {
62 #if defined(LISP_FEATURE_NETBSD)
63     return &context->uc_mcontext.__gregs[_REG_CR];
64 #elif defined(LISP_FEATURE_OPENBSD)
65     return &context->sc_frame.cr;
66 #endif
67 }
68
69 /* FIXME: If this can be a no-op on BSD/x86, then it
70  * deserves a more precise name.
71  *
72  * (Perhaps os_prepare_data_area_to_be_executed()?) */
73 void
74 os_flush_icache(os_vm_address_t address, os_vm_size_t length)
75 {
76    ppc_flush_icache(address, length);
77 }
78
79 int arch_os_thread_init(struct thread *thread) {
80
81 #ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
82     stack_t sigstack;
83
84     /* Signal handlers are run on the control stack, so if it is exhausted
85      * we had better use an alternate stack for whatever signal tells us
86      * we've exhausted it */
87     sigstack.ss_sp=((void *) thread)+dynamic_values_bytes;
88     sigstack.ss_flags=0;
89     sigstack.ss_size = 32*SIGSTKSZ;
90     sigaltstack(&sigstack,0);
91 #endif
92
93     return 1;                  /* success */
94 }
95
96 int arch_os_thread_cleanup(struct thread *thread) {
97
98     return 1;                  /* success */
99 }