summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--py/nlr.h4
-rw-r--r--py/nlrx64.S63
-rwxr-xr-xtests/run-tests8
-rw-r--r--unix/gccollect.c11
4 files changed, 81 insertions, 5 deletions
diff --git a/py/nlr.h b/py/nlr.h
index 4cc66d8c20..b94ca7d3f8 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 c5711001e6..a4073981a5 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 1d99830bc6..5be8192971 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 450a697787..33748d240e 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)