4 #include "globalconfig.h"
5 #include "config_tcbsize.h"
8 /****************************
9 * some handy definitions
17 #define RF(reg, offs) (RF_##reg + (offs))
19 #define GET_HSR(ec) (ec << 26)
21 /**********************************************************************
22 * calculate the TCB address from a stack pointer
24 .macro CONTEXT_OF reg, ptr
25 bic \reg, \ptr, #((THREAD_BLOCK_SIZE-1) & 0xff)
26 bic \reg, \reg, #((THREAD_BLOCK_SIZE-1) & 0xff00)
29 /**********************************************************************
30 * Reset the thread cancel flag.
31 * Register r0 is scratched and contains the thread state afterwards
33 .macro RESET_THREAD_CANCEL_AT tcb
34 ldr r0, [\tcb, #(OFS__THREAD__STATE)]
35 bic r0, r0, #VAL__Thread_cancel
36 str r0, [\tcb, #(OFS__THREAD__STATE)]
40 /*****************************************************************************/
41 /* The syscall table stuff */
42 /*****************************************************************************/
43 .macro GEN_SYSCALL_TABLE
45 .global sys_call_table
51 .word sys_invoke_debug_wrapper
60 .macro GEN_VCPU_UPCALL THREAD_VCPU, LOAD_USR_SP, LOAD_USR_VCPU, USR_ONLY
62 .global leave_by_vcpu_upcall;
65 sub sp, sp, #(RF_SIZE + 3*4) @ restore old return frame
66 /* save r0, r1, r2 for scratch registers */
69 /* restore original IP */
71 ldr r2, [r1, #(\THREAD_VCPU)]
72 add r2, r2, #(VAL__SIZEOF_TRAP_STATE - RF_SIZE)
75 /* r2 = &vcpu_state->ts.r[13] */
77 ldr r0, [r1, #(OFS__THREAD__EXCEPTION_IP)]
78 str r0, [r2, #RF(PC, 0)]
80 ldr r0, [r1, #(OFS__THREAD__STATE)]
81 tst r0, #VAL__Thread_ext_vcpu_enabled
83 ldr r0, [r1, #(OFS__THREAD__EXCEPTION_PSR)]
84 str r0, [r2, #RF(PSR, 0)]
85 bic r0, #0x20 // force ARM mode
90 str r0, [sp, #RF(PSR, 3*4)]
92 ldr r0, [sp, #RF(USR_LR, 3*4)]
93 str r0, [r2, #RF(USR_LR, 0)]
95 ldr r0, [sp, #RF(USR_SP, 3*4)]
96 str r0, [r2, #RF(USR_SP, 0)]
99 str r0, [r1, #(OFS__THREAD__EXCEPTION_IP)]
104 /* Restore scratch registers saved previously */
113 sub r2, r2, #64 @ now r2 points to the VCPU STATE again
119 ldr r0, [r2, #(OFS__VCPU_STATE__ENTRY_IP)]
121 str r0, [sp, #RF(PC, 0)]
122 \LOAD_USR_VCPU r0, r2, r1
127 /**********************************************************************
129 **********************************************************************/
131 .macro DEBUGGER_ENTRY type
133 str sp, [sp, #(RF(USR_SP, -RF_SIZE))] @ save r[13]
134 sub sp, sp, #(RF_SIZE)
136 str lr, [sp, #RF(SVC_LR, 0)]
137 str lr, [sp, #RF(PC, 0)]
139 str lr, [sp, #RF(PSR, 0)]
141 stmdb sp!, {r0 - r12}
144 mov r1, #GET_HSR(0x33) @ err
145 orr r1, #\type @ + type
153 add sp, sp, #12 @ pfa, err and tpidruro
154 ldmia sp!, {r0 - r12}
155 ldr lr, [sp, #RF(PSR, 0)]
157 ldr lr, [sp, #RF(SVC_LR, 0)]
159 ldr sp, [sp, #(RF(USR_SP, 0))]
163 3: .word call_nested_trap_handler
170 .macro GEN_DEBUGGER_ENTRIES
171 .global kern_kdebug_entry
176 .global kern_kdebug_sequence_entry
178 kern_kdebug_sequence_entry:
184 .global kern_kdebug_ipi_entry
186 kern_kdebug_ipi_entry:
193 .macro align_and_save_sp orig_sp
201 .macro enter_slowtrap_w_stack errorcode, ec2 = 0
208 adr lr, exception_return
209 ldr pc, .LCslowtrap_entry
212 .macro GEN_EXCEPTION_RETURN
213 .global __return_from_user_invoke
217 __return_from_user_invoke:
218 add sp, sp, #12 // pfa, err & tpidruro
219 ldmia sp!, {r0 - r12}
220 return_from_exception
226 return_from_exception
229 .macro GEN_LEAVE_BY_TRIGGER_EXCEPTION
231 .global leave_by_trigger_exception
233 leave_by_trigger_exception:
234 sub sp, sp, #RF_SIZE @ restore old return frame
235 stmdb sp!, {r0 - r12}
239 /* restore original IP */
241 ldr r0, [r1, #(OFS__THREAD__EXCEPTION_IP)]
242 str r0, [sp, #RF(PC, 14*4)]
244 ldr r0, [r1, #(OFS__THREAD__EXCEPTION_PSR)]
245 str r0, [sp, #RF(PSR, 14*4)]
248 str r0, [r1, #(OFS__THREAD__EXCEPTION_IP)]
250 enter_slowtrap_w_stack GET_HSR(0x3e)