-
- // common_code.
- // r0 and r14 must be saved by caller, r0 is arg for handle_op
- // on return everything is restored except lr, which is used to return
- emit_op_io(0xe50f1000, &g_linkpage->saved_regs[1]); // str r1, [->saved_regs[1]] @ save r1
- emit_op (0xe24f1000 + // sub r1, pc, =offs(saved_regs[2])
- (g_code_ptr - &g_linkpage->saved_regs[2] + 2) * 4);
- emit_op (0xe8813ffc); // stmia r1, {r2-r13}
- emit_op_io(0xe51fd000, // ldr sp, [->handler_stack]
- (u32 *)&g_linkpage->handler_stack);
- emit_op (0xe2414008); // sub r4, r1, #4*2
- emit_op (0xe10f1000); // mrs r1, cpsr
- emit_op_io(0xe50f1000, &g_linkpage->cpsr); // str r1, [->cpsr]
- emit_op (0xe1a0500e); // mov r5, lr
- emit_op (0xe1a0e00f); // mov lr, pc
- emit_op_io(0xe51ff000, (u32 *)&g_linkpage->handler); // ldr pc, =handle_op
- emit_op_io(0xe51f1000, &g_linkpage->cpsr); // ldr r1, [->cpsr]
- emit_op (0xe128f001); // msr cpsr_f, r1
- emit_op (0xe1a0e005); // mov lr, r5
- emit_op (0xe8943fff); // ldmia r4, {r0-r13}
- emit_op (0xe12fff1e); // bx lr @ return