#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #define FRAME_OFFSET_R19 0 #define FRAME_OFFSET_R20 4 #define FRAME_OFFSET_R21 8 #define FRAME_OFFSET_R22 12 #define FRAME_OFFSET_R23 16 #define FRAME_OFFSET_R24 20 #define FRAME_OFFSET_R25 24 #define FRAME_OFFSET_R26 28 #define FRAME_OFFSET_R27 32 #define FRAME_OFFSET_R28 36 #define FRAME_OFFSET_R29 40 #define FRAME_OFFSET_R30 44 #define FRAME_OFFSET_R31 48 #define FRAME_SIZE (FRAME_OFFSET_R31 + 4) .text .align 4 PUBLIC(_CPU_Context_validate) SYM(_CPU_Context_validate): /* Save */ addik r1, r1, -FRAME_SIZE swi r19, r1, FRAME_OFFSET_R19 swi r20, r1, FRAME_OFFSET_R20 swi r21, r1, FRAME_OFFSET_R21 swi r22, r1, FRAME_OFFSET_R22 swi r23, r1, FRAME_OFFSET_R23 swi r24, r1, FRAME_OFFSET_R24 swi r25, r1, FRAME_OFFSET_R25 swi r26, r1, FRAME_OFFSET_R26 swi r27, r1, FRAME_OFFSET_R27 swi r28, r1, FRAME_OFFSET_R28 swi r29, r1, FRAME_OFFSET_R29 swi r30, r1, FRAME_OFFSET_R30 swi r31, r1, FRAME_OFFSET_R31 /* Fill */ add r4, r0, r3 /* r7 contains the stack pointer */ add r7, r0, r1 .macro fill_register reg addi r4, r4, 1 add \reg, r0, r4 .endm fill_register r21 fill_register r22 fill_register r23 fill_register r24 fill_register r25 fill_register r26 fill_register r27 fill_register r28 fill_register r29 fill_register r30 fill_register r31 /* Check */ check: .macro check_register reg addi r4, r4, 1 cmp r6, \reg, r4 bnei r6, restore .endm cmp r6, r7, r1 bnei r6, restore add r4, r0, r3 check_register r21 check_register r22 check_register r23 check_register r24 check_register r25 check_register r26 check_register r27 check_register r28 check_register r29 check_register r30 check_register r31 brai check /* Restore */ restore: lwi r19, r1, FRAME_OFFSET_R19 lwi r20, r1, FRAME_OFFSET_R20 lwi r21, r1, FRAME_OFFSET_R21 lwi r22, r1, FRAME_OFFSET_R22 lwi r23, r1, FRAME_OFFSET_R23 lwi r24, r1, FRAME_OFFSET_R24 lwi r25, r1, FRAME_OFFSET_R25 lwi r26, r1, FRAME_OFFSET_R26 lwi r27, r1, FRAME_OFFSET_R27 lwi r28, r1, FRAME_OFFSET_R28 lwi r29, r1, FRAME_OFFSET_R29 lwi r30, r1, FRAME_OFFSET_R30 lwi r31, r1, FRAME_OFFSET_R31 addik r1, r1, FRAME_SIZE bra r15