From 302ad40fb28e96809b42c3387b6422994e032b21 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Wed, 24 Jan 2018 16:57:46 -0500 Subject: [PATCH 1/2] Revert "alloca seems buggy on M4" This reverts commit 4b1e9d8f92aa948f8ecccf364edcb911a135f2c8. --- extmod/modure.c | 2 +- py/runtime.c | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/extmod/modure.c b/extmod/modure.c index 3358b8e210e79..78de4706d27d9 100644 --- a/extmod/modure.c +++ b/extmod/modure.c @@ -144,7 +144,7 @@ STATIC mp_obj_t re_split(size_t n_args, const mp_obj_t *args) { } mp_obj_t retval = mp_obj_new_list(0, NULL); - const char* caps[caps_num]; + const char **caps = alloca(caps_num * sizeof(char*)); while (true) { // cast is a workaround for a bug in msvc: it treats const char** as a const pointer instead of a pointer to pointer to const char memset((char**)caps, 0, caps_num * sizeof(char*)); diff --git a/py/runtime.c b/py/runtime.c index 7a16e4a1b2f07..cbec82f17c7a6 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -1428,10 +1428,9 @@ mp_obj_t mp_import_from(mp_obj_t module, qstr name) { mp_load_method_maybe(module, MP_QSTR___name__, dest); size_t pkg_name_len; const char *pkg_name = mp_obj_str_get_data(dest[0], &pkg_name_len); + const uint dot_name_len = pkg_name_len + 1 + qstr_len(name); - // Previously dot_name was created using alloca(), but that caused run-time crashes on M4 due to - // stack corruption (compiler bug, it appears), so use an array instead. - char dot_name[dot_name_len]; + char *dot_name = alloca(dot_name_len); memcpy(dot_name, pkg_name, pkg_name_len); dot_name[pkg_name_len] = '.'; memcpy(dot_name + pkg_name_len + 1, qstr_str(name), qstr_len(name)); From efbf08266b6d17a383c498140c1498e0161139ce Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Wed, 24 Jan 2018 17:03:49 -0500 Subject: [PATCH 2/2] make _estack be double-word aligned --- ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld | 3 ++- .../boards/samd21x18-bootloader-external-flash-crystalless.ld | 3 ++- ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld | 3 ++- ports/atmel-samd/boards/samd21x18-bootloader.ld | 3 ++- ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld | 3 ++- ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld | 3 ++- ports/atmel-samd/boards/samd51x19-bootloader.ld | 3 ++- ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld | 3 ++- ports/atmel-samd/boards/samd51x20-bootloader.ld | 3 ++- 9 files changed, 18 insertions(+), 9 deletions(-) diff --git a/ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld b/ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld index 1d54bb88ca112..d329614ce3f2c 100644 --- a/ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld +++ b/ports/atmel-samd/boards/samd21x18-bootloader-crystalless.ld @@ -11,7 +11,8 @@ MEMORY } /* top end of the stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM) - 4; +/* stack must be double-word (8 byte) aligned */ +_estack = ORIGIN(RAM) + LENGTH(RAM) - 8; _bootloader_dbl_tap = _estack; /* define output sections */ diff --git a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld b/ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld index 81c1e8450184e..dc1c8512ab7a7 100644 --- a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld +++ b/ports/atmel-samd/boards/samd21x18-bootloader-external-flash-crystalless.ld @@ -11,7 +11,8 @@ MEMORY } /* top end of the stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM) - 4; +/* stack must be double-word (8 byte) aligned */ +_estack = ORIGIN(RAM) + LENGTH(RAM) - 8; _bootloader_dbl_tap = _estack; /* define output sections */ diff --git a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld index 8563ed3cb3a97..8a1cf89183441 100644 --- a/ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld +++ b/ports/atmel-samd/boards/samd21x18-bootloader-external-flash.ld @@ -10,7 +10,8 @@ MEMORY } /* top end of the stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM) - 4; +/* stack must be double-word (8 byte) aligned */ +_estack = ORIGIN(RAM) + LENGTH(RAM) - 8; _bootloader_dbl_tap = _estack; /* define output sections */ diff --git a/ports/atmel-samd/boards/samd21x18-bootloader.ld b/ports/atmel-samd/boards/samd21x18-bootloader.ld index 4d2005518f91d..6aabcd914efb8 100644 --- a/ports/atmel-samd/boards/samd21x18-bootloader.ld +++ b/ports/atmel-samd/boards/samd21x18-bootloader.ld @@ -11,7 +11,8 @@ MEMORY } /* top end of the stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM) - 4; +/* stack must be double-word (8 byte) aligned */ +_estack = ORIGIN(RAM) + LENGTH(RAM) - 8; _bootloader_dbl_tap = _estack; /* define output sections */ diff --git a/ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld index 73012b2008603..875376bc36fed 100644 --- a/ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld +++ b/ports/atmel-samd/boards/samd51x18-bootloader-external-flash.ld @@ -10,7 +10,8 @@ MEMORY } /* top end of the stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM) - 4; +/* stack must be double-word (8 byte) aligned */ +_estack = ORIGIN(RAM) + LENGTH(RAM) - 8; _bootloader_dbl_tap = _estack; /* define output sections */ diff --git a/ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld index c9247ec73bc72..c92d5901b4c3d 100644 --- a/ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld +++ b/ports/atmel-samd/boards/samd51x19-bootloader-external-flash.ld @@ -10,7 +10,8 @@ MEMORY } /* top end of the stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM) - 4; +/* stack must be double-word (8 byte) aligned */ +_estack = ORIGIN(RAM) + LENGTH(RAM) - 8; _bootloader_dbl_tap = _estack; /* define output sections */ diff --git a/ports/atmel-samd/boards/samd51x19-bootloader.ld b/ports/atmel-samd/boards/samd51x19-bootloader.ld index 02f38f39fc1cc..a9ff69a9f9fc3 100644 --- a/ports/atmel-samd/boards/samd51x19-bootloader.ld +++ b/ports/atmel-samd/boards/samd51x19-bootloader.ld @@ -10,7 +10,8 @@ MEMORY } /* top end of the stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM) - 4; +/* stack must be double-word (8 byte) aligned */ +_estack = ORIGIN(RAM) + LENGTH(RAM) - 8; _bootloader_dbl_tap = _estack; /* define output sections */ diff --git a/ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld b/ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld index bae25385af368..e005bd5eb6272 100644 --- a/ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld +++ b/ports/atmel-samd/boards/samd51x20-bootloader-external-flash.ld @@ -10,7 +10,8 @@ MEMORY } /* top end of the stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM) - 4; +/* stack must be double-word (8 byte) aligned */ +_estack = ORIGIN(RAM) + LENGTH(RAM) - 8; _bootloader_dbl_tap = _estack; /* define output sections */ diff --git a/ports/atmel-samd/boards/samd51x20-bootloader.ld b/ports/atmel-samd/boards/samd51x20-bootloader.ld index ee0dcfd7ae583..1e9f5d7749061 100644 --- a/ports/atmel-samd/boards/samd51x20-bootloader.ld +++ b/ports/atmel-samd/boards/samd51x20-bootloader.ld @@ -10,7 +10,8 @@ MEMORY } /* top end of the stack */ -_estack = ORIGIN(RAM) + LENGTH(RAM) - 4; +/* stack must be double-word (8 byte) aligned */ +_estack = ORIGIN(RAM) + LENGTH(RAM) - 8; _bootloader_dbl_tap = _estack; /* define output sections */