diff --git a/py/nlr.h b/py/nlr.h index 4cc66d8c2..b94ca7d3f 100644 --- a/py/nlr.h +++ b/py/nlr.h @@ -11,7 +11,11 @@ struct _nlr_buf_t { #if defined(__i386__) void *regs[6]; #elif defined(__x86_64__) + #if defined(__CYGWIN__) + void *regs[12]; + #else void *regs[8]; + #endif #elif defined(__thumb2__) void *regs[10]; #else diff --git a/py/nlrx64.S b/py/nlrx64.S index c5711001e..a4073981a 100644 --- a/py/nlrx64.S +++ b/py/nlrx64.S @@ -4,6 +4,8 @@ .file "nlr.s" .text +#if !defined(__CYGWIN__) + /* uint nlr_push(rdi=nlr_buf_t *nlr) */ #if !(defined(__APPLE__) && defined(__MACH__)) .globl nlr_push @@ -82,4 +84,63 @@ nlr_jump: .local nlr_top #endif .comm nlr_top,8,8 -#endif + +#else // !defined(__CYGWIN__) + +/* uint nlr_push(rcx=nlr_buf_t *nlr) */ + .globl nlr_push +nlr_push: + movq (%rsp), %rax # load return %rip + movq %rax, 16(%rcx) # store %rip into nlr_buf + movq %rbp, 24(%rcx) # store %rbp into nlr_buf + movq %rsp, 32(%rcx) # store %rsp into nlr_buf + movq %rbx, 40(%rcx) # store %rbx into nlr_buf + movq %r12, 48(%rcx) # store %r12 into nlr_buf + movq %r13, 56(%rcx) # store %r13 into nlr_buf + movq %r14, 64(%rcx) # store %r14 into nlr_buf + movq %r15, 72(%rcx) # store %r15 into + movq %rdi, 80(%rcx) # store %rdr into + movq %rsi, 88(%rcx) # store %rsi into + movq nlr_top(%rip), %rax # get last nlr_buf + movq %rax, (%rcx) # store it + movq %rcx, nlr_top(%rip) # stor new nlr_buf (to make linked list) + xorq %rax, %rax # return 0, normal return + ret # return + +/* void nlr_jump(rcx=uint val) */ + + .globl nlr_jump +nlr_jump: + movq %rcx, %rax # put return value in %rax + movq nlr_top(%rip), %rcx # get nlr_top into %rsi + movq %rax, 8(%rcx) # store return value + movq (%rcx), %rax # load prev nlr_buf + movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) + movq 72(%rcx), %r15 # load saved %r15 + movq 64(%rcx), %r14 # load saved %r14 + movq 56(%rcx), %r13 # load saved %r13 + movq 48(%rcx), %r12 # load saved %r12 + movq 40(%rcx), %rbx # load saved %rbx + movq 32(%rcx), %rsp # load saved %rsp + movq 24(%rcx), %rbp # load saved %rbp + movq 16(%rcx), %rax # load saved %rip + movq 80(%rcx), %rdi # store %rdr into + movq 88(%rcx), %rsi # store %rsi into + movq %rax, (%rsp) # store saved %rip to stack + xorq %rax, %rax # clear return register + inc %al # increase to make 1, non-local return + ret # return + + .comm nlr_top,8,8 + + /* void nlr_pop() */ + .globl nlr_pop +nlr_pop: + movq nlr_top(%rip), %rax # get nlr_top into %rax + movq (%rax), %rax # load prev nlr_buf + movq %rax, nlr_top(%rip) # store prev nlr_buf (to unlink list) + ret # return + +#endif // !defined(__CYGWIN__) + +#endif // __x86_64__ diff --git a/tests/run-tests b/tests/run-tests index 1d99830bc..5be819297 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -36,7 +36,13 @@ if test_on_pyboard: for test_file in tests: test_name = os.path.splitext(os.path.basename(test_file))[0] - output_expected = subprocess.check_output([CPYTHON3, '-B', test_file]) + # run CPython + try: + output_expected = subprocess.check_output([CPYTHON3, '-B', test_file]) + except subprocess.CalledProcessError: + output_expected = b'CPYTHON3 CRASH' + + # run Micro Python try: if test_on_pyboard: pyb.enter_raw_repl() diff --git a/unix/gccollect.c b/unix/gccollect.c index 450a69778..33748d240 100644 --- a/unix/gccollect.c +++ b/unix/gccollect.c @@ -78,9 +78,14 @@ void gc_collect(void) { gc_collect_start(); // this traces .data and .bss sections - extern char __bss_start, _end; - //printf(".bss: %p-%p\n", &__bss_start, &_end); - gc_collect_root((void**)&__bss_start, ((machine_uint_t)&_end - (machine_uint_t)&__bss_start) / sizeof(machine_uint_t)); +#ifdef __CYGWIN__ +#define BSS_START __bss_start__ +#else +#define BSS_START __bss_start +#endif + extern char BSS_START, _end; + //printf(".bss: %p-%p\n", &BSS_START, &_end); + gc_collect_root((void**)&BSS_START, ((machine_uint_t)&_end - (machine_uint_t)&BSS_START) / sizeof(machine_uint_t)); regs_t regs; gc_helper_get_regs(regs); // GC stack (and regs because we captured them)