summaryrefslogtreecommitdiffstatshomepage
path: root/esp8266/gccollect.c
diff options
context:
space:
mode:
authorJosef Gajdusek <atx@atx.name>2015-05-06 14:34:32 +0200
committerDamien George <damien.p.george@gmail.com>2015-05-06 14:01:07 +0100
commit28076f3d4b3bf58aa86d6346af88665f7e5c6031 (patch)
tree4f77ce2f7411e5061c3485ef0abeeae8aacd781c /esp8266/gccollect.c
parent9a42eb541eb426a04bb0541ccf0e26ce82bdcb22 (diff)
downloadmicropython-28076f3d4b3bf58aa86d6346af88665f7e5c6031.tar.gz
micropython-28076f3d4b3bf58aa86d6346af88665f7e5c6031.zip
esp8266: Fix garbage collector by hard-coding stack end address.
As user_init() is not a true main functions, the stack pointer captured within is not pointing at the base of the stack. This caused gc_collect being called with sp being higher than stack_end, causing integer overflow and crashing as gc tried to scan almost the entire address space.
Diffstat (limited to 'esp8266/gccollect.c')
-rw-r--r--esp8266/gccollect.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/esp8266/gccollect.c b/esp8266/gccollect.c
index 46f9bb94ce..541500292e 100644
--- a/esp8266/gccollect.c
+++ b/esp8266/gccollect.c
@@ -29,17 +29,12 @@
#include "py/gc.h"
#include "gccollect.h"
-STATIC uint32_t stack_end;
+// As we do not have control over the application entry point, there is no way
+// to figure out the real stack base on runtime, so it needs to be hardcoded
+#define STACK_END 0x40000000
mp_uint_t gc_helper_get_regs_and_sp(mp_uint_t *regs);
-void gc_collect_init(void) {
- mp_uint_t regs[8];
- mp_uint_t sp = gc_helper_get_regs_and_sp(regs);
- stack_end = sp;
- //printf("stack=%p ram_end=%p %d\n", stack_end, &_ram_end);
-}
-
void gc_collect(void) {
// start the GC
gc_collect_start();
@@ -53,7 +48,7 @@ void gc_collect(void) {
mp_uint_t sp = gc_helper_get_regs_and_sp(regs);
// trace the stack, including the registers (since they live on the stack in this function)
- gc_collect_root((void**)sp, (stack_end - sp) / sizeof(uint32_t));
+ gc_collect_root((void**)sp, (STACK_END - sp) / sizeof(uint32_t));
// end the GC
gc_collect_end();