Add a configuration option for dynamic stack management

This commit is contained in:
Gregory Nutt 2014-09-13 12:25:32 -06:00
parent 047eda6159
commit ed9fced470
8 changed files with 74 additions and 49 deletions

View File

@ -199,11 +199,6 @@ config ARCH_HEAP_VBASE
---help---
The virtual address of the beginning of the heap region.
config ARCH_STACK_VBASE
hex "Virtual stack base"
---help---
The virtual address of the beginning the stack region
config ARCH_TEXT_NPAGES
int "Max .text pages"
default 1
@ -228,6 +223,30 @@ config ARCH_HEAP_NPAGES
This, along with knowledge of the page size, determines the size of
the heap virtual address space. Default is 1.
config ARCH_STACK_DYNAMIC
bool "Dynamic stack"
default n if !BUILD_KERNEL || !LIBC_EXECFUNCS
default y if BUILD_KERNEL && LIBC_EXECFUNCS
---help---
Select this option if the user process stack resides in its own
address space. The naming of this selection implies that dynamic
stack allocation is supported. Certainly this option must be set if
dynamic stack allocation is supported by a platform. But the more
general meaning of this configuration environment is simply that the
stack has its own address space.
NOTE: This options is also *required* if BUILD_KERNEL and
LIBC_EXECFUNCS are selected. Why? Because the caller's stack must
be preserved in its own address space when we instantiate the
environment of the new process in order to initialize it.
if ARCH_STACK_DYNAMIC
config ARCH_STACK_VBASE
hex "Virtual stack base"
---help---
The virtual address of the beginning the stack region
config ARCH_STACK_NPAGES
int "Max. stack pages"
default 1
@ -236,6 +255,8 @@ config ARCH_STACK_NPAGES
This, along with knowledge of the page size, determines the size of
the stack virtual address space. Default is 1.
endif # ARCH_STACK_DYNAMIC
config ARCH_PGPOOL_MAPPING
bool "Have page pool mapping"
default n

View File

@ -99,17 +99,19 @@ do { \
/* Convert 4KiB pages to 1MiB sections */
# define __PG2SECT_SHIFT (20 - MM_PGSHIFT)
# define __PG2SECT_MASK ((1 << __PG2SECT_SHIFT) - 1)
# define __PG2SECT_SHIFT (20 - MM_PGSHIFT)
# define __PG2SECT_MASK ((1 << __PG2SECT_SHIFT) - 1)
# define ARCH_PG2SECT(p) (((p) + __PG2SECT_MASK) >> __PG2SECT_SHIFT)
# define ARCH_SECT2PG(s) ((s) << __PG2SECT_SHIFT)
# define ARCH_PG2SECT(p) (((p) + __PG2SECT_MASK) >> __PG2SECT_SHIFT)
# define ARCH_SECT2PG(s) ((s) << __PG2SECT_SHIFT)
# define ARCH_TEXT_NSECTS ARCH_PG2SECT(CONFIG_ARCH_TEXT_NPAGES)
# define ARCH_DATA_NSECTS ARCH_PG2SECT(CONFIG_ARCH_DATA_NPAGES)
# define ARCH_HEAP_NSECTS ARCH_PG2SECT(CONFIG_ARCH_HEAP_NPAGES)
# define ARCH_STACK_NSECTS ARCH_PG2SECT(CONFIG_ARCH_STACK_NPAGES)
# define ARCH_TEXT_NSECTS ARCH_PG2SECT(CONFIG_ARCH_TEXT_NPAGES)
# define ARCH_DATA_NSECTS ARCH_PG2SECT(CONFIG_ARCH_DATA_NPAGES)
# define ARCH_HEAP_NSECTS ARCH_PG2SECT(CONFIG_ARCH_HEAP_NPAGES)
# ifdef CONFIG_ARCH_STACK_DYNAMIC
# define ARCH_STACK_NSECTS ARCH_PG2SECT(CONFIG_ARCH_STACK_NPAGES)
# endif
#endif
/****************************************************************************

View File

@ -104,10 +104,6 @@
# error CONFIG_ARCH_HEAP_VBASE not aligned to section boundary
#endif
#if (CONFIG_ARCH_STACK_VBASE & SECTION_MASK) != 0
# error CONFIG_ARCH_STACK_VBASE not aligned to section boundary
#endif
/* Using a 4KiB page size, each 1MiB section maps to a PTE containing
* 256*2KiB entries
*/

View File

@ -137,8 +137,11 @@ uintptr_t sam_physpgaddr(uintptr_t vaddr)
if ((vaddr >= CONFIG_ARCH_TEXT_VBASE && vaddr < ARCH_TEXT_VEND) ||
(vaddr >= CONFIG_ARCH_DATA_VBASE && vaddr < ARCH_DATA_VEND) ||
(vaddr >= CONFIG_ARCH_HEAP_VBASE && vaddr < ARCH_HEAP_VEND) ||
(vaddr >= CONFIG_ARCH_STACK_VBASE && vaddr < ARCH_STACK_VEND))
(vaddr >= CONFIG_ARCH_HEAP_VBASE && vaddr < ARCH_HEAP_VEND)
#ifdef CONFIG_ARCH_STACK_DYNAMIC
|| (vaddr >= CONFIG_ARCH_STACK_VBASE && vaddr < ARCH_STACK_VEND)
#endif
)
{
/* Yes.. Get Level 1 page table entry corresponding to this virtual
* address.

View File

@ -266,11 +266,10 @@ CONFIG_ARCH_ADDRENV=y
CONFIG_ARCH_TEXT_VBASE=0x80000000
CONFIG_ARCH_DATA_VBASE=0x80100000
CONFIG_ARCH_HEAP_VBASE=0x80200000
CONFIG_ARCH_STACK_VBASE=0x80300000
CONFIG_ARCH_TEXT_NPAGES=256
CONFIG_ARCH_DATA_NPAGES=256
CONFIG_ARCH_HEAP_NPAGES=256
CONFIG_ARCH_STACK_NPAGES=256
# CONFIG_ARCH_STACK_DYNAMIC is not set
CONFIG_ARCH_PGPOOL_MAPPING=y
CONFIG_ARCH_PGPOOL_PBASE=0x28000000
CONFIG_ARCH_PGPOOL_VBASE=0x28000000

View File

@ -277,11 +277,10 @@ CONFIG_ARCH_ADDRENV=y
CONFIG_ARCH_TEXT_VBASE=0x80000000
CONFIG_ARCH_DATA_VBASE=0x80100000
CONFIG_ARCH_HEAP_VBASE=0x80200000
CONFIG_ARCH_STACK_VBASE=0x80300000
CONFIG_ARCH_TEXT_NPAGES=256
CONFIG_ARCH_DATA_NPAGES=256
CONFIG_ARCH_HEAP_NPAGES=256
CONFIG_ARCH_STACK_NPAGES=256
# CONFIG_ARCH_STACK_DYNAMIC is not set
CONFIG_ARCH_PGPOOL_MAPPING=y
CONFIG_ARCH_PGPOOL_PBASE=0x28000000
CONFIG_ARCH_PGPOOL_VBASE=0x28000000

View File

@ -261,11 +261,10 @@ CONFIG_ARCH_ADDRENV=y
CONFIG_ARCH_TEXT_VBASE=0x80000000
CONFIG_ARCH_DATA_VBASE=0x80100000
CONFIG_ARCH_HEAP_VBASE=0x80200000
CONFIG_ARCH_STACK_VBASE=0x80300000
CONFIG_ARCH_TEXT_NPAGES=256
CONFIG_ARCH_DATA_NPAGES=256
CONFIG_ARCH_HEAP_NPAGES=256
CONFIG_ARCH_STACK_NPAGES=256
# CONFIG_ARCH_STACK_DYNAMIC is not set
CONFIG_ARCH_PGPOOL_MAPPING=y
CONFIG_ARCH_PGPOOL_PBASE=0x28000000
CONFIG_ARCH_PGPOOL_VBASE=0x28000000

View File

@ -86,7 +86,7 @@
#ifndef CONFIG_ARCH_DATA_VBASE
# error CONFIG_ARCH_DATA_VBASE not defined
# define CONFIG_ARCH_DATA_VBASE (CONFIG_ARCH_TEXT_VBASE + ARCH_TEXT_SIZE)
# define CONFIG_ARCH_DATA_VBASE ARCH_TEXT_VEND
#endif
#if (CONFIG_ARCH_DATA_VBASE & CONFIG_MM_MASK) != 0
@ -123,7 +123,7 @@
#ifndef CONFIG_ARCH_HEAP_VBASE
# error CONFIG_ARCH_HEAP_VBASE not defined
# define CONFIG_ARCH_HEAP_VBASE (CONFIG_ARCH_DATA_VBASE + ARCH_DATA_SIZE)
# define CONFIG_ARCH_HEAP_VBASE ARCH_DATA_VEND
#endif
#if (CONFIG_ARCH_HEAP_VBASE & CONFIG_MM_MASK) != 0
@ -138,29 +138,35 @@
#define ARCH_HEAP_SIZE (CONFIG_ARCH_HEAP_NPAGES * CONFIG_MM_PGSIZE)
#define ARCH_HEAP_VEND (CONFIG_ARCH_HEAP_VBASE + ARCH_HEAP_SIZE)
/* Stack region */
#ifdef CONFIG_ARCH_STACK_DYNAMIC
/* Stack region */
#ifndef CONFIG_ARCH_STACK_VBASE
# error CONFIG_ARCH_STACK_VBASE not defined
# define CONFIG_ARCH_STACK_VBASE (CONFIG_ARCH_HEAP_VBASE + ARCH_HEAP_SIZE)
# ifndef CONFIG_ARCH_STACK_VBASE
# error CONFIG_ARCH_STACK_VBASE not defined
# define CONFIG_ARCH_STACK_VBASE ARCH_HEAP_VEND
# endif
# if (CONFIG_ARCH_STACK_VBASE & CONFIG_MM_MASK) != 0
# error CONFIG_ARCH_STACK_VBASE not aligned to page boundary
# endif
# ifndef CONFIG_ARCH_STACK_NPAGES
# warning CONFIG_ARCH_STACK_NPAGES not defined
# define CONFIG_ARCH_STACK_NPAGES 1
# endif
# define ARCH_STACK_SIZE (CONFIG_ARCH_STACK_NPAGES * CONFIG_MM_PGSIZE)
# define ARCH_STACK_VEND (CONFIG_ARCH_STACK_VBASE + ARCH_STACK_SIZE)
/* A single page scratch region used for temporary mappings */
# define ARCH_SCRATCH_VBASE ARCH_STACK_VEND
#else
/* A single page scratch region used for temporary mappings */
# define ARCH_SCRATCH_VBASE ARCH_HEAP_VEND
#endif
#if (CONFIG_ARCH_STACK_VBASE & CONFIG_MM_MASK) != 0
# error CONFIG_ARCH_STACK_VBASE not aligned to page boundary
#endif
#ifndef CONFIG_ARCH_STACK_NPAGES
# warning CONFIG_ARCH_STACK_NPAGES not defined
# define CONFIG_ARCH_STACK_NPAGES 1
#endif
#define ARCH_STACK_SIZE (CONFIG_ARCH_STACK_NPAGES * CONFIG_MM_PGSIZE)
#define ARCH_STACK_VEND (CONFIG_ARCH_STACK_VBASE + ARCH_STACK_SIZE)
/* A single page scratch region used for temporary mappings */
#define ARCH_SCRATCH_VBASE (CONFIG_ARCH_STACK_VBASE + ARCH_STACK_SIZE)
/* There is no need to use the scratch memory region if the page pool memory
* is statically mapped.
*/
@ -263,9 +269,9 @@ struct addrenv_reserve_s
*
* up_addrenv_attach - Clone the address environment assigned to one TCB
* to another. This operation is done when a pthread
* is created that share's the same address
* is created that share's the same group address
* environment.
* up_addrenv_detach - Release the threads reference to an address
* up_addrenv_detach - Release the thread's reference to an address
* environment when a task/thread exits.
*
****************************************************************************/