summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAngus Gratton <angus@redyak.com.au>2024-08-13 16:12:25 +1000
committerDamien George <damien@micropython.org>2024-08-14 12:57:27 +1000
commita6fa85d8f96897863546423b2bbfc2c24237040f (patch)
tree9be6b5d4f9076e02b5fd64678298f0c9a6c68e0e
parentfbc19596f052016dee10a6af56441f4fb532243c (diff)
unix: Switch stack limit check to new cstack API.
Necessary to pass CI when testing the V2 preview APIs. Also adds an extra coverage test for the legacy stackctrl API, to maintain coverage and check for any regression. This work was funded through GitHub Sponsors. Signed-off-by: Angus Gratton <angus@redyak.com.au>
-rw-r--r--ports/unix/coverage.c27
-rw-r--r--ports/unix/main.c20
-rw-r--r--tests/ports/unix/extra_coverage.py.exp2
3 files changed, 39 insertions, 10 deletions
diff --git a/ports/unix/coverage.c b/ports/unix/coverage.c
index 99a6d8c8c..67052ea70 100644
--- a/ports/unix/coverage.c
+++ b/ports/unix/coverage.c
@@ -7,6 +7,7 @@
#include "py/objint.h"
#include "py/objstr.h"
#include "py/runtime.h"
+#include "py/stackctrl.h"
#include "py/gc.h"
#include "py/repl.h"
#include "py/mpz.h"
@@ -739,6 +740,32 @@ static mp_obj_t extra_coverage(void) {
mp_printf(&mp_plat_print, "%d %d\n", mp_obj_is_int(MP_OBJ_NEW_SMALL_INT(1)), mp_obj_is_int(mp_obj_new_int_from_ll(1)));
}
+ // Legacy stackctrl.h API, this has been replaced by cstack.h
+ {
+ mp_printf(&mp_plat_print, "# stackctrl\n");
+ char *old_stack_top = MP_STATE_THREAD(stack_top);
+ size_t old_stack_limit = 0;
+ size_t new_stack_limit = SIZE_MAX;
+ #if MICROPY_STACK_CHECK
+ old_stack_limit = MP_STATE_THREAD(stack_limit);
+ MP_STACK_CHECK();
+ #endif
+
+ mp_stack_ctrl_init(); // Will set stack top incorrectly
+ mp_stack_set_top(old_stack_top); // ... and restore it
+
+ #if MICROPY_STACK_CHECK
+ mp_stack_set_limit(MP_STATE_THREAD(stack_limit));
+ MP_STACK_CHECK();
+ new_stack_limit = MP_STATE_THREAD(stack_limit);
+ #endif
+
+ // Nothing should have changed
+ mp_printf(&mp_plat_print, "%d %d\n",
+ old_stack_top == MP_STATE_THREAD(stack_top),
+ MICROPY_STACK_CHECK == 0 || old_stack_limit == new_stack_limit);
+ }
+
mp_printf(&mp_plat_print, "# end coverage.c\n");
mp_obj_streamtest_t *s = mp_obj_malloc(mp_obj_streamtest_t, &mp_type_stest_fileio);
diff --git a/ports/unix/main.c b/ports/unix/main.c
index d9ee6eec4..e732105c7 100644
--- a/ports/unix/main.c
+++ b/ports/unix/main.c
@@ -44,7 +44,7 @@
#include "py/repl.h"
#include "py/gc.h"
#include "py/objstr.h"
-#include "py/stackctrl.h"
+#include "py/cstack.h"
#include "py/mphal.h"
#include "py/mpthread.h"
#include "extmod/misc.h"
@@ -468,12 +468,20 @@ int main(int argc, char **argv) {
#if MICROPY_PY_THREAD
mp_thread_init();
#endif
+
+ // Define a reasonable stack limit to detect stack overflow.
+ mp_uint_t stack_size = 40000 * (sizeof(void *) / 4);
+ #if defined(__arm__) && !defined(__thumb2__)
+ // ARM (non-Thumb) architectures require more stack.
+ stack_size *= 2;
+ #endif
+
// We should capture stack top ASAP after start, and it should be
// captured guaranteedly before any other stack variables are allocated.
// For this, actual main (renamed main_) should not be inlined into
// this function. main_() itself may have other functions inlined (with
// their own stack variables), that's why we need this main/main_ split.
- mp_stack_ctrl_init();
+ mp_cstack_init_with_sp_here(stack_size);
return main_(argc, argv);
}
@@ -492,14 +500,6 @@ MP_NOINLINE int main_(int argc, char **argv) {
signal(SIGPIPE, SIG_IGN);
#endif
- // Define a reasonable stack limit to detect stack overflow.
- mp_uint_t stack_limit = 40000 * (sizeof(void *) / 4);
- #if defined(__arm__) && !defined(__thumb2__)
- // ARM (non-Thumb) architectures require more stack.
- stack_limit *= 2;
- #endif
- mp_stack_set_limit(stack_limit);
-
pre_process_options(argc, argv);
#if MICROPY_ENABLE_GC
diff --git a/tests/ports/unix/extra_coverage.py.exp b/tests/ports/unix/extra_coverage.py.exp
index 5e806ebe5..a2b11638a 100644
--- a/tests/ports/unix/extra_coverage.py.exp
+++ b/tests/ports/unix/extra_coverage.py.exp
@@ -164,6 +164,8 @@ pop all: 1 2 4 5
1 1
0 0
1 1
+# stackctrl
+1 1
# end coverage.c
0123456789 b'0123456789'
7300