summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Shawcroft <scott@adafruit.com>2019-10-18 10:41:00 -0700
committerGitHub <noreply@github.com>2019-10-18 10:41:00 -0700
commit98e7579dee646b340c20613342b3472690a38c73 (patch)
treed2e2345ce0e223fb478f221c0de0367d948dec33
parentbd6c7c5546a16bed74c19ef615728b5e9032a4ad (diff)
parente2cb29f2a0ca07c8b8b089675969e11d62cd13ac (diff)
Merge pull request #2230 from kamtom480/circuitpython-stack
Top and limit stack addresses
-rwxr-xr-xmain.c2
-rw-r--r--ports/atmel-samd/supervisor/port.c8
-rw-r--r--ports/cxd56/Makefile2
-rw-r--r--ports/cxd56/mpconfigport.h4
m---------ports/cxd56/spresense-exported-sdk0
-rw-r--r--ports/cxd56/supervisor/port.c14
-rw-r--r--ports/nrf/supervisor/port.c8
-rw-r--r--ports/stm32f4/supervisor/port.c8
-rw-r--r--supervisor/port.h6
-rwxr-xr-xsupervisor/shared/memory.c7
-rwxr-xr-xsupervisor/shared/stack.c3
11 files changed, 53 insertions, 9 deletions
diff --git a/main.c b/main.c
index 6b56f5ff6..8715672ea 100755
--- a/main.c
+++ b/main.c
@@ -477,7 +477,7 @@ void gc_collect(void) {
// This naively collects all object references from an approximate stack
// range.
- gc_collect_root((void**)sp, ((uint32_t)&_estack - sp) / sizeof(uint32_t));
+ gc_collect_root((void**)sp, ((uint32_t)port_stack_get_top() - sp) / sizeof(uint32_t));
gc_collect_end();
}
diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c
index 512fd8eb8..e962281c1 100644
--- a/ports/atmel-samd/supervisor/port.c
+++ b/ports/atmel-samd/supervisor/port.c
@@ -271,6 +271,14 @@ void reset_cpu(void) {
reset();
}
+uint32_t *port_stack_get_limit(void) {
+ return &_ebss;
+}
+
+uint32_t *port_stack_get_top(void) {
+ return &_estack;
+}
+
// Place the word to save 8k from the end of RAM so we and the bootloader don't clobber it.
#ifdef SAMD21
uint32_t* safe_word = (uint32_t*) (HMCRAMC0_ADDR + HMCRAMC0_SIZE - 0x2000);
diff --git a/ports/cxd56/Makefile b/ports/cxd56/Makefile
index 38ebd8305..d65c2e266 100644
--- a/ports/cxd56/Makefile
+++ b/ports/cxd56/Makefile
@@ -90,6 +90,7 @@ INC += \
-I$(SPRESENSE_SDK)/nuttx/include \
-I$(SPRESENSE_SDK)/nuttx/arch \
-I$(SPRESENSE_SDK)/nuttx/arch/chip \
+ -I$(SPRESENSE_SDK)/nuttx/arch/os \
-I$(SPRESENSE_SDK)/sdk/bsp/include \
-I$(SPRESENSE_SDK)/sdk/bsp/include/sdk \
@@ -124,7 +125,6 @@ LDFLAGS = \
--entry=__start \
-nostartfiles \
-nodefaultlibs \
- --defsym __stack=_vectors+786432 \
-T$(SPRESENSE_SDK)/nuttx/build/ramconfig.ld \
--gc-sections \
-Map=$(BUILD)/output.map \
diff --git a/ports/cxd56/mpconfigport.h b/ports/cxd56/mpconfigport.h
index 233b7b9a7..91ebfd98f 100644
--- a/ports/cxd56/mpconfigport.h
+++ b/ports/cxd56/mpconfigport.h
@@ -27,8 +27,8 @@
#ifndef __INCLUDED_MPCONFIGPORT_H
#define __INCLUDED_MPCONFIGPORT_H
-// 24kiB stack
-#define CIRCUITPY_DEFAULT_STACK_SIZE 0x6000
+// 64kiB stack
+#define CIRCUITPY_DEFAULT_STACK_SIZE 0x10000
#include "py/circuitpy_mpconfig.h"
diff --git a/ports/cxd56/spresense-exported-sdk b/ports/cxd56/spresense-exported-sdk
-Subproject b473b28a14a03f3d416b6e2c071bcfd4fb92cb6
+Subproject 7f6568c7f4898cdb24a2f06040784a836050686
diff --git a/ports/cxd56/supervisor/port.c b/ports/cxd56/supervisor/port.c
index 3fddfe52c..78d2f13f5 100644
--- a/ports/cxd56/supervisor/port.c
+++ b/ports/cxd56/supervisor/port.c
@@ -27,6 +27,8 @@
#include <stdint.h>
#include <sys/boardctl.h>
+#include "sched/sched.h"
+
#include "boards/board.h"
#include "supervisor/port.h"
@@ -67,6 +69,18 @@ void reset_port(void) {
void reset_to_bootloader(void) {
}
+uint32_t *port_stack_get_limit(void) {
+ struct tcb_s *rtcb = this_task();
+
+ return rtcb->adj_stack_ptr - (uint32_t)rtcb->adj_stack_size;
+}
+
+uint32_t *port_stack_get_top(void) {
+ struct tcb_s *rtcb = this_task();
+
+ return rtcb->adj_stack_ptr;
+}
+
extern uint32_t _ebss;
// Place the word to save just after our BSS section that gets blanked.
diff --git a/ports/nrf/supervisor/port.c b/ports/nrf/supervisor/port.c
index c69101070..af858aa4a 100644
--- a/ports/nrf/supervisor/port.c
+++ b/ports/nrf/supervisor/port.c
@@ -146,6 +146,14 @@ void reset_cpu(void) {
NVIC_SystemReset();
}
+uint32_t *port_stack_get_limit(void) {
+ return &_ebss;
+}
+
+uint32_t *port_stack_get_top(void) {
+ return &_estack;
+}
+
extern uint32_t _ebss;
// Place the word to save just after our BSS section that gets blanked.
void port_set_saved_word(uint32_t value) {
diff --git a/ports/stm32f4/supervisor/port.c b/ports/stm32f4/supervisor/port.c
index df7a6ca42..502202f52 100644
--- a/ports/stm32f4/supervisor/port.c
+++ b/ports/stm32f4/supervisor/port.c
@@ -67,6 +67,14 @@ void reset_cpu(void) {
NVIC_SystemReset();
}
+uint32_t *port_stack_get_limit(void) {
+ return &_ebss;
+}
+
+uint32_t *port_stack_get_top(void) {
+ return &_estack;
+}
+
extern uint32_t _ebss;
// Place the word to save just after our BSS section that gets blanked.
void port_set_saved_word(uint32_t value) {
diff --git a/supervisor/port.h b/supervisor/port.h
index 1430c6a50..c8a011978 100644
--- a/supervisor/port.h
+++ b/supervisor/port.h
@@ -54,6 +54,12 @@ void reset_board(void);
// Reset to the bootloader
void reset_to_bootloader(void);
+// Get stack limit address
+uint32_t *port_stack_get_limit(void);
+
+// Get stack top address
+uint32_t *port_stack_get_top(void);
+
// Save and retrieve a word from memory that is preserved over reset. Used for safe mode.
void port_set_saved_word(uint32_t);
uint32_t port_get_saved_word(void);
diff --git a/supervisor/shared/memory.c b/supervisor/shared/memory.c
index 11133415d..38040d11d 100755
--- a/supervisor/shared/memory.c
+++ b/supervisor/shared/memory.c
@@ -25,6 +25,7 @@
*/
#include "supervisor/memory.h"
+#include "supervisor/port.h"
#include <stddef.h>
@@ -36,12 +37,10 @@ static supervisor_allocation allocations[CIRCUITPY_SUPERVISOR_ALLOC_COUNT];
// We use uint32_t* to ensure word (4 byte) alignment.
uint32_t* low_address;
uint32_t* high_address;
-extern uint32_t _ebss;
-extern uint32_t _estack;
void memory_init(void) {
- low_address = &_ebss;
- high_address = &_estack;
+ low_address = port_stack_get_limit();
+ high_address = port_stack_get_top();
}
void free_memory(supervisor_allocation* allocation) {
diff --git a/supervisor/shared/stack.c b/supervisor/shared/stack.c
index 311fa31b2..dcecf2067 100755
--- a/supervisor/shared/stack.c
+++ b/supervisor/shared/stack.c
@@ -29,6 +29,7 @@
#include "py/mpconfig.h"
#include "py/runtime.h"
#include "supervisor/cpu.h"
+#include "supervisor/port.h"
#include "supervisor/shared/safe_mode.h"
extern uint32_t _estack;
@@ -43,7 +44,7 @@ void allocate_stack(void) {
mp_uint_t regs[10];
mp_uint_t sp = cpu_get_regs_and_sp(regs);
- mp_uint_t c_size = (uint32_t) &_estack - sp;
+ mp_uint_t c_size = (uint32_t) port_stack_get_top() - sp;
stack_alloc = allocate_memory(c_size + next_stack_size + EXCEPTION_STACK_SIZE, true);
if (stack_alloc == NULL) {