switch.h
Go to the documentation of this file.00001
00041 #ifndef CPU_ARM_HW_SWITCH_H
00042 #define CPU_ARM_HW_SWITCH_H
00043
00044 #include <kern/proc_p.h>
00045
00050 #define SCHEDULER_IRQ_ENTRY \
00051 asm volatile("sub lr, lr, #4 \n\t" \
00052 "stmfd sp!, {r0} \n\t" \
00053 "stmfd sp, {sp}^ \n\t" \
00054 "sub sp, sp, #4 \n\t" \
00055 "ldmfd sp!, {r0} \n\t" \
00056 "stmfd r0!, {lr} \n\t" \
00057 "stmfd r0, {r1-r12,lr}^ \n\t" \
00058 "sub r0, r0, #52 \n\t" \
00059 "ldmfd sp!, {r1} \n\t" \
00060 "stmfd r0!, {r1} \n\t" \
00061 "mrs r1, spsr \n\t" \
00062 "stmfd r0!, {r1} \n\t" \
00063 "ldr r1, =CurrentProcess \n\t" \
00064 "ldr r1, [r1, %0] \n\t" \
00065 "str r0, [r1] \n\t" \
00066 "sub fp, sp, #4 \n\t" \
00067 : \
00068 : "n" (offsetof(Process, stack)) \
00069 )
00070
00071
00072 #define SCHEDULER_IRQ_EXIT \
00073 asm volatile("ldr lr, =CurrentProcess \n\t" \
00074 "ldr lr, [lr, %0] \n\t" \
00075 "ldr lr, [lr] \n\t" \
00076 "ldr r0, =0xFFFFF000 \n\t" \
00077 "str r0, [r0, #0x130] \n\t" \
00078 "ldmfd lr!, {r0} \n\t" \
00079 "msr spsr, r0 \n\t" \
00080 "ldmfd lr, {r0-r12,lr}^ \n\t" \
00081 "add lr, lr, #56 \n\t" \
00082 "stmfd sp!, {lr} \n\t" \
00083 "ldmfd sp, {sp}^ \n\t" \
00084 "sub sp, sp, #4 \n\t" \
00085 "ldmdb lr, {pc}^ \n\t" \
00086 : \
00087 : "n" (offsetof(Process, stack)) \
00088 )
00089
00090 #endif