From 152568bcb61e65b700ca2b963534f2632d080345 Mon Sep 17 00:00:00 2001 From: Damien Date: Wed, 16 Oct 2013 00:46:39 +0100 Subject: NLR and Python exceptions work on the board. --- py/nlr.h | 10 ++++--- py/nlrthumb.s | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 py/nlrthumb.s (limited to 'py') diff --git a/py/nlr.h b/py/nlr.h index b824e4a63..fa4e2f45f 100644 --- a/py/nlr.h +++ b/py/nlr.h @@ -3,9 +3,9 @@ #include -#ifndef __WORDSIZE -#error __WORDSIZE needs to be defined -#endif +//#ifndef __WORDSIZE +//#error __WORDSIZE needs to be defined +//#endif typedef struct _nlr_buf_t nlr_buf_t; struct _nlr_buf_t { @@ -17,7 +17,9 @@ struct _nlr_buf_t { #elif __WORDSIZE == 64 void *regs[8]; #else -#error Unsupported __WORDSIZE + // hack for thumb + void *regs[10]; +//#error Unsupported __WORDSIZE #endif }; diff --git a/py/nlrthumb.s b/py/nlrthumb.s new file mode 100644 index 000000000..d4d1bff23 --- /dev/null +++ b/py/nlrthumb.s @@ -0,0 +1,91 @@ +@ thumb callee save: bx, bp, sp, r12, r14, r14, r15 + + .syntax unified + .cpu cortex-m4 + .thumb + .text + .align 2 + +@ uint nlr_push(r0=nlr_buf_t *nlr) + .global nlr_push + .thumb + .thumb_func + .type nlr_push, %function +nlr_push: + str lr, [r0, #8] @ store lr into nlr_buf + str r4, [r0, #12] @ store r4 into nlr_buf + str r5, [r0, #16] @ store r5 into nlr_buf + str r6, [r0, #20] @ store r6 into nlr_buf + str r7, [r0, #24] @ store r7 into nlr_buf + str r8, [r0, #28] @ store r8 into nlr_buf + str r9, [r0, #32] @ store r9 into nlr_buf + str r10, [r0, #36] @ store r10 into nlr_buf + str r11, [r0, #40] @ store r11 into nlr_buf + str r13, [r0, #44] @ store r13=sp into nlr_buf + + ldr r3, .L2 @ load addr of nlr_top + ldr r2, [r3] @ load nlr_top + str r2, [r0] @ store nlr_top into nlr_buf + str r0, [r3] @ store nlr_buf into nlr_top (to link list) + + movs r0, #0 @ return 0, normal return + bx lr @ return + .align 2 +.L2: + .word .LANCHOR0 + .size nlr_push, .-nlr_push + +@ void nlr_pop() + .global nlr_pop + .thumb + .thumb_func + .type nlr_pop, %function +nlr_pop: + ldr r3, .L5 @ load addr of nlr_top + ldr r2, [r3] @ load nlr_top + ldr r2, [r2] @ load prev nlr_buf + str r2, [r3] @ store prev nlr_buf to nlr_top (to unlink list) + bx lr @ return + .align 2 +.L5: + .word .LANCHOR0 + .size nlr_pop, .-nlr_pop + +@ void nlr_jump(r0=uint val) + .global nlr_jump + .thumb + .thumb_func + .type nlr_jump, %function +nlr_jump: + ldr r3, .L2 @ load addr of nlr_top + ldr r2, [r3] @ load nlr_top + str r0, [r2, #4] @ store return value + ldr r0, [r2] @ load prev nlr_buf + str r0, [r3] @ store prev nol_buf into nlr_top (to unlink list) + + ldr lr, [r2, #8] @ load lr from nlr_buf + ldr r4, [r2, #12] @ load r4 from nlr_buf + ldr r5, [r2, #16] @ load r5 from nlr_buf + ldr r6, [r2, #20] @ load r6 from nlr_buf + ldr r7, [r2, #24] @ load r7 from nlr_buf + ldr r8, [r2, #28] @ load r8 from nlr_buf + ldr r9, [r2, #32] @ load r9 from nlr_buf + ldr r10, [r2, #36] @ load r10 from nlr_buf + ldr r11, [r2, #40] @ load r11 from nlr_buf + ldr r13, [r2, #44] @ load r13=sp from nlr_buf + + movs r0, #1 @ return 1, non-local return + bx lr @ return + .align 2 +.L6: + .word .LANCHOR0 + .size nlr_jump, .-nlr_jump + +@ local variable nlr_top + .bss + .align 2 + .set .LANCHOR0,. + 0 + .type nlr_top, %object + .size nlr_top, 4 +nlr_top: + .space 4 -- cgit v1.2.3