135 __ASM_CLI(); // all interrupts off |
135 __ASM_CLI(); // all interrupts off |
136 SRSDBW(MODE_SVC); // save return address and return CPSR to supervisor stack |
136 SRSDBW(MODE_SVC); // save return address and return CPSR to supervisor stack |
137 asm("sub sp, sp, #%a0" : : "i" _FOFF(SThreadExcStack,iR15)); |
137 asm("sub sp, sp, #%a0" : : "i" _FOFF(SThreadExcStack,iR15)); |
138 asm("stmia sp, {r0-r14}^ "); // save R0-R12, R13_usr, R14_usr |
138 asm("stmia sp, {r0-r14}^ "); // save R0-R12, R13_usr, R14_usr |
139 asm("mov r4, #%a0" : : "i" ((TInt)SThreadExcStack::ESvc)); |
139 asm("mov r4, #%a0" : : "i" ((TInt)SThreadExcStack::ESvc)); |
|
140 asm("ldr r12, [lr, #-4] "); // get SWI opcode |
140 USER_MEMORY_GUARD_ON_IF_MODE_USR(r11); |
141 USER_MEMORY_GUARD_ON_IF_MODE_USR(r11); |
141 asm("ldr r12, [lr, #-4] "); // get SWI opcode |
|
142 GET_RWNO_TID(,r11); |
142 GET_RWNO_TID(,r11); |
143 asm("str r4, [sp, #%a0]" : : "i" _FOFF(SThreadExcStack,iExcCode)); // word describing exception type |
143 asm("str r4, [sp, #%a0]" : : "i" _FOFF(SThreadExcStack,iExcCode)); // word describing exception type |
144 asm("movs r12, r12, lsl #9 "); // 512*SWI number into r12 |
144 asm("movs r12, r12, lsl #9 "); // 512*SWI number into r12 |
145 asm("adr lr, fast_swi_exit "); |
145 asm("adr lr, fast_swi_exit "); |
146 asm("ldr r9, [r11, #%a0]" : : "i" _FOFF(TSubScheduler,iCurrentThread)); |
146 asm("ldr r9, [r11, #%a0]" : : "i" _FOFF(TSubScheduler,iCurrentThread)); |