+static void init_linkpage(void)
+{
+ g_linkpage->handler = handle_op;
+ g_linkpage->handler_stack = g_handler_stack_end;
+ g_code_ptr = g_linkpage->code;
+
+ // 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
+}
+