Skip to content
Snippets Groups Projects
Commit 28076f3d authored by Josef Gajdusek's avatar Josef Gajdusek Committed by Damien George
Browse files

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.
parent 9a42eb54
Branches
No related tags found
No related merge requests found
...@@ -29,17 +29,12 @@ ...@@ -29,17 +29,12 @@
#include "py/gc.h" #include "py/gc.h"
#include "gccollect.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); 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) { void gc_collect(void) {
// start the GC // start the GC
gc_collect_start(); gc_collect_start();
...@@ -53,7 +48,7 @@ void gc_collect(void) { ...@@ -53,7 +48,7 @@ void gc_collect(void) {
mp_uint_t sp = gc_helper_get_regs_and_sp(regs); 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) // 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 // end the GC
gc_collect_end(); gc_collect_end();
......
...@@ -37,5 +37,4 @@ extern uint32_t _bss_end; ...@@ -37,5 +37,4 @@ extern uint32_t _bss_end;
extern uint32_t _heap_start; extern uint32_t _heap_start;
extern uint32_t _heap_end; extern uint32_t _heap_end;
void gc_collect_init(void);
void gc_collect(void); void gc_collect(void);
...@@ -43,7 +43,6 @@ STATIC void mp_reset(void) { ...@@ -43,7 +43,6 @@ STATIC void mp_reset(void) {
mp_stack_set_limit(10240); mp_stack_set_limit(10240);
mp_hal_init(); mp_hal_init();
gc_init(heap, heap + sizeof(heap)); gc_init(heap, heap + sizeof(heap));
gc_collect_init();
mp_init(); mp_init();
mp_obj_list_init(mp_sys_path, 0); mp_obj_list_init(mp_sys_path, 0);
mp_obj_list_init(mp_sys_argv, 0); mp_obj_list_init(mp_sys_argv, 0);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment