Merge pull request #2230 from kamtom480/circuitpython-stack

Top and limit stack addresses
This commit is contained in:
Scott Shawcroft 2019-10-18 10:41:00 -07:00 committed by GitHub
commit 98e7579dee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 54 additions and 10 deletions

2
main.c
View File

@ -477,7 +477,7 @@ void gc_collect(void) {
// This naively collects all object references from an approximate stack // This naively collects all object references from an approximate stack
// range. // 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(); gc_collect_end();
} }

View File

@ -271,6 +271,14 @@ void reset_cpu(void) {
reset(); 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. // Place the word to save 8k from the end of RAM so we and the bootloader don't clobber it.
#ifdef SAMD21 #ifdef SAMD21
uint32_t* safe_word = (uint32_t*) (HMCRAMC0_ADDR + HMCRAMC0_SIZE - 0x2000); uint32_t* safe_word = (uint32_t*) (HMCRAMC0_ADDR + HMCRAMC0_SIZE - 0x2000);

View File

@ -90,6 +90,7 @@ INC += \
-I$(SPRESENSE_SDK)/nuttx/include \ -I$(SPRESENSE_SDK)/nuttx/include \
-I$(SPRESENSE_SDK)/nuttx/arch \ -I$(SPRESENSE_SDK)/nuttx/arch \
-I$(SPRESENSE_SDK)/nuttx/arch/chip \ -I$(SPRESENSE_SDK)/nuttx/arch/chip \
-I$(SPRESENSE_SDK)/nuttx/arch/os \
-I$(SPRESENSE_SDK)/sdk/bsp/include \ -I$(SPRESENSE_SDK)/sdk/bsp/include \
-I$(SPRESENSE_SDK)/sdk/bsp/include/sdk \ -I$(SPRESENSE_SDK)/sdk/bsp/include/sdk \
@ -124,7 +125,6 @@ LDFLAGS = \
--entry=__start \ --entry=__start \
-nostartfiles \ -nostartfiles \
-nodefaultlibs \ -nodefaultlibs \
--defsym __stack=_vectors+786432 \
-T$(SPRESENSE_SDK)/nuttx/build/ramconfig.ld \ -T$(SPRESENSE_SDK)/nuttx/build/ramconfig.ld \
--gc-sections \ --gc-sections \
-Map=$(BUILD)/output.map \ -Map=$(BUILD)/output.map \

View File

@ -27,8 +27,8 @@
#ifndef __INCLUDED_MPCONFIGPORT_H #ifndef __INCLUDED_MPCONFIGPORT_H
#define __INCLUDED_MPCONFIGPORT_H #define __INCLUDED_MPCONFIGPORT_H
// 24kiB stack // 64kiB stack
#define CIRCUITPY_DEFAULT_STACK_SIZE 0x6000 #define CIRCUITPY_DEFAULT_STACK_SIZE 0x10000
#include "py/circuitpy_mpconfig.h" #include "py/circuitpy_mpconfig.h"

@ -1 +1 @@
Subproject commit b473b28a14a03f3d416b6e2c071bcfd4fb92cb63 Subproject commit 7f6568c7f4898cdb24a2f06040784a836050686e

View File

@ -27,6 +27,8 @@
#include <stdint.h> #include <stdint.h>
#include <sys/boardctl.h> #include <sys/boardctl.h>
#include "sched/sched.h"
#include "boards/board.h" #include "boards/board.h"
#include "supervisor/port.h" #include "supervisor/port.h"
@ -67,6 +69,18 @@ void reset_port(void) {
void reset_to_bootloader(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; extern uint32_t _ebss;
// Place the word to save just after our BSS section that gets blanked. // Place the word to save just after our BSS section that gets blanked.

View File

@ -146,6 +146,14 @@ void reset_cpu(void) {
NVIC_SystemReset(); NVIC_SystemReset();
} }
uint32_t *port_stack_get_limit(void) {
return &_ebss;
}
uint32_t *port_stack_get_top(void) {
return &_estack;
}
extern uint32_t _ebss; extern uint32_t _ebss;
// Place the word to save just after our BSS section that gets blanked. // Place the word to save just after our BSS section that gets blanked.
void port_set_saved_word(uint32_t value) { void port_set_saved_word(uint32_t value) {

View File

@ -67,6 +67,14 @@ void reset_cpu(void) {
NVIC_SystemReset(); NVIC_SystemReset();
} }
uint32_t *port_stack_get_limit(void) {
return &_ebss;
}
uint32_t *port_stack_get_top(void) {
return &_estack;
}
extern uint32_t _ebss; extern uint32_t _ebss;
// Place the word to save just after our BSS section that gets blanked. // Place the word to save just after our BSS section that gets blanked.
void port_set_saved_word(uint32_t value) { void port_set_saved_word(uint32_t value) {

View File

@ -54,6 +54,12 @@ void reset_board(void);
// Reset to the bootloader // Reset to the bootloader
void reset_to_bootloader(void); 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. // Save and retrieve a word from memory that is preserved over reset. Used for safe mode.
void port_set_saved_word(uint32_t); void port_set_saved_word(uint32_t);
uint32_t port_get_saved_word(void); uint32_t port_get_saved_word(void);

View File

@ -25,6 +25,7 @@
*/ */
#include "supervisor/memory.h" #include "supervisor/memory.h"
#include "supervisor/port.h"
#include <stddef.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. // We use uint32_t* to ensure word (4 byte) alignment.
uint32_t* low_address; uint32_t* low_address;
uint32_t* high_address; uint32_t* high_address;
extern uint32_t _ebss;
extern uint32_t _estack;
void memory_init(void) { void memory_init(void) {
low_address = &_ebss; low_address = port_stack_get_limit();
high_address = &_estack; high_address = port_stack_get_top();
} }
void free_memory(supervisor_allocation* allocation) { void free_memory(supervisor_allocation* allocation) {

View File

@ -29,6 +29,7 @@
#include "py/mpconfig.h" #include "py/mpconfig.h"
#include "py/runtime.h" #include "py/runtime.h"
#include "supervisor/cpu.h" #include "supervisor/cpu.h"
#include "supervisor/port.h"
#include "supervisor/shared/safe_mode.h" #include "supervisor/shared/safe_mode.h"
extern uint32_t _estack; extern uint32_t _estack;
@ -43,7 +44,7 @@ void allocate_stack(void) {
mp_uint_t regs[10]; mp_uint_t regs[10];
mp_uint_t sp = cpu_get_regs_and_sp(regs); 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); stack_alloc = allocate_memory(c_size + next_stack_size + EXCEPTION_STACK_SIZE, true);
if (stack_alloc == NULL) { if (stack_alloc == NULL) {