Rename everything associated with the dynamic process stack to ustack to make room in the name space for a kstack
This commit is contained in:
parent
c71aabc6b2
commit
b255883b0a
@ -116,10 +116,10 @@
|
|||||||
<a href="#up_addrenv_clone">4.4.8 <code>up_addrenv_clone()</code></a></br>
|
<a href="#up_addrenv_clone">4.4.8 <code>up_addrenv_clone()</code></a></br>
|
||||||
<a href="#up_addrenv_attach">4.4.9 <code>up_addrenv_attach()</code></a></br>
|
<a href="#up_addrenv_attach">4.4.9 <code>up_addrenv_attach()</code></a></br>
|
||||||
<a href="#up_addrenv_detach">4.4.10 <code>up_addrenv_detach()</code></a></br>
|
<a href="#up_addrenv_detach">4.4.10 <code>up_addrenv_detach()</code></a></br>
|
||||||
<a href="#up_addrenv_stackalloc">4.4.11 <code>up_addrenv_stackalloc()</code></a></br>
|
<a href="#up_addrenv_ustackalloc">4.4.11 <code>up_addrenv_ustackalloc()</code></a></br>
|
||||||
<a href="#up_addrenv_stackfree">4.4.12 <code>up_addrenv_stackfree()</code></a></br>
|
<a href="#up_addrenv_ustackfree">4.4.12 <code>up_addrenv_ustackfree()</code></a></br>
|
||||||
<a href="#up_addrenv_vstack">4.4.13 <code>up_addrenv_vstack()</code></a></br>
|
<a href="#up_addrenv_vustack">4.4.13 <code>up_addrenv_vustack()</code></a></br>
|
||||||
<a href="#up_addrenv_stackselect">4.4.14 <code>up_addrenv_stackselect()</code></a>
|
<a href="#up_addrenv_ustackselect">4.4.14 <code>up_addrenv_ustackselect()</code></a>
|
||||||
</ul>
|
</ul>
|
||||||
<a href="#exports">4.5 APIs Exported by NuttX to Architecture-Specific Logic</a>
|
<a href="#exports">4.5 APIs Exported by NuttX to Architecture-Specific Logic</a>
|
||||||
<ul>
|
<ul>
|
||||||
@ -2985,16 +2985,16 @@ VxWorks provides the following comparable interface:
|
|||||||
</p>
|
</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<a href="#up_addrenv_stackalloc">4.4.11 <code>up_addrenv_stackalloc()</code></a>:
|
<a href="#up_addrenv_ustackalloc">4.4.11 <code>up_addrenv_ustackalloc()</code></a>:
|
||||||
Create a stack address environment
|
Create a stack address environment
|
||||||
<li>
|
<li>
|
||||||
<a href="#up_addrenv_stackfree">4.4.12 <code>up_addrenv_stackfree()</code></a>:
|
<a href="#up_addrenv_ustackfree">4.4.12 <code>up_addrenv_ustackfree()</code></a>:
|
||||||
Destroy a stack address environment.
|
Destroy a stack address environment.
|
||||||
<li>
|
<li>
|
||||||
<a href="#up_addrenv_vstack">4.4.13 <code>up_addrenv_vstack()</code></a>:
|
<a href="#up_addrenv_vustack">4.4.13 <code>up_addrenv_vustack()</code></a>:
|
||||||
Returns the virtual base address of the stack
|
Returns the virtual base address of the stack
|
||||||
<li>
|
<li>
|
||||||
<a href="#up_addrenv_stackselect">4.4.14 <code>up_addrenv_stackselect()</code></a>:
|
<a href="#up_addrenv_ustackselect">4.4.14 <code>up_addrenv_ustackselect()</code></a>:
|
||||||
Instantiate a stack address environment
|
Instantiate a stack address environment
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@ -3208,16 +3208,16 @@ VxWorks provides the following comparable interface:
|
|||||||
Zero (<code>OK</code>) on success; a negated <code>errno</code> value on failure.
|
Zero (<code>OK</code>) on success; a negated <code>errno</code> value on failure.
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3><a name="up_addrenv_stackalloc">4.4.11 <code>up_addrenv_stackalloc()</code></a></h3>
|
<h3><a name="up_addrenv_ustackalloc">4.4.11 <code>up_addrenv_ustackalloc()</code></a></h3>
|
||||||
<p><b>Function Prototype</b>:<p>
|
<p><b>Function Prototype</b>:<p>
|
||||||
<ul>
|
<ul>
|
||||||
<code>int up_addrenv_stackalloc(FAR struct tcb_s *tcb, size_t stacksize);</code>
|
<code>int up_addrenv_ustackalloc(FAR struct tcb_s *tcb, size_t stacksize);</code>
|
||||||
</ul>
|
</ul>
|
||||||
<p><b>Description</b>:</p>
|
<p><b>Description</b>:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<p>
|
<p>
|
||||||
This function is called when a new thread is created in order to instantiate an address environment for the new thread's stack.
|
This function is called when a new thread is created in order to instantiate an address environment for the new thread's stack.
|
||||||
<code>up_addrenv_stackalloc()</code> is essentially the allocator of the physical memory for the new task's stack.
|
<code>up_addrenv_ustackalloc()</code> is essentially the allocator of the physical memory for the new task's stack.
|
||||||
</p>
|
</p>
|
||||||
</ul>
|
</ul>
|
||||||
<p><b>Input Parameters</b>:</p>
|
<p><b>Input Parameters</b>:</p>
|
||||||
@ -3230,10 +3230,10 @@ VxWorks provides the following comparable interface:
|
|||||||
Zero (<code>OK</code>) on success; a negated <code>errno</code> value on failure.
|
Zero (<code>OK</code>) on success; a negated <code>errno</code> value on failure.
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3><a name="up_addrenv_up_addrenv_stackfreeattach">4.4.12 <code>up_addrenv_stackfree()</code></a></h3>
|
<h3><a name="up_addrenv_up_addrenv_ustackfreeattach">4.4.12 <code>up_addrenv_ustackfree()</code></a></h3>
|
||||||
<p><b>Function Prototype</b>:<p>
|
<p><b>Function Prototype</b>:<p>
|
||||||
<ul>
|
<ul>
|
||||||
<code>int up_addrenv_stackfree(FAR struct tcb_s *tcb);</code>
|
<code>int up_addrenv_ustackfree(FAR struct tcb_s *tcb);</code>
|
||||||
</ul>
|
</ul>
|
||||||
<p><b>Description</b>:</p>
|
<p><b>Description</b>:</p>
|
||||||
<ul>
|
<ul>
|
||||||
@ -3251,10 +3251,10 @@ VxWorks provides the following comparable interface:
|
|||||||
Zero (<code>OK</code>) on success; a negated <code>errno</code> value on failure.
|
Zero (<code>OK</code>) on success; a negated <code>errno</code> value on failure.
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3><a name="up_addrenv_vstack">4.4.13 <code>up_addrenv_vstack()</code></a></h3>
|
<h3><a name="up_addrenv_vustack">4.4.13 <code>up_addrenv_vustack()</code></a></h3>
|
||||||
<p><b>Function Prototype</b>:<p>
|
<p><b>Function Prototype</b>:<p>
|
||||||
<ul>
|
<ul>
|
||||||
<code>int up_addrenv_vstack(FAR const struct tcb_s *tcb, FAR void **vstack);</code>
|
<code>int up_addrenv_vustack(FAR const struct tcb_s *tcb, FAR void **vstack);</code>
|
||||||
</ul>
|
</ul>
|
||||||
<p><b>Description</b>:</p>
|
<p><b>Description</b>:</p>
|
||||||
<ul>
|
<ul>
|
||||||
@ -3272,15 +3272,15 @@ VxWorks provides the following comparable interface:
|
|||||||
Zero (<code>OK</code>) on success; a negated <code>errno</code> value on failure.
|
Zero (<code>OK</code>) on success; a negated <code>errno</code> value on failure.
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3><a name="up_addrenv_stackselect">4.4.14 <code>up_addrenv_stackselect()</code></a></h3>
|
<h3><a name="up_addrenv_ustackselect">4.4.14 <code>up_addrenv_ustackselect()</code></a></h3>
|
||||||
<p><b>Function Prototype</b>:<p>
|
<p><b>Function Prototype</b>:<p>
|
||||||
<ul>
|
<ul>
|
||||||
<code>int up_addrenv_stackselect(FAR const struct tcb_s *tcb);</code>
|
<code>int up_addrenv_ustackselect(FAR const struct tcb_s *tcb);</code>
|
||||||
</ul>
|
</ul>
|
||||||
<p><b>Description</b>:</p>
|
<p><b>Description</b>:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<P>
|
<P>
|
||||||
After an address environment has been established for a task's stack (via <code>up_addrenv_stackalloc()</code>.
|
After an address environment has been established for a task's stack (via <code>up_addrenv_ustackalloc()</code>.
|
||||||
This function may be called to instantiate that address environment in the virtual address space.
|
This function may be called to instantiate that address environment in the virtual address space.
|
||||||
This is a necessary step before each context switch to the newly created thread (including the initial thread startup).
|
This is a necessary step before each context switch to the newly created thread (including the initial thread startup).
|
||||||
</p>
|
</p>
|
||||||
|
47
arch/Kconfig
47
arch/Kconfig
@ -224,10 +224,9 @@ config ARCH_HEAP_NPAGES
|
|||||||
the heap virtual address space. Default is 1.
|
the heap virtual address space. Default is 1.
|
||||||
|
|
||||||
config ARCH_STACK_DYNAMIC
|
config ARCH_STACK_DYNAMIC
|
||||||
bool "Dynamic stack"
|
bool "Dynamic user stack"
|
||||||
default n if !BUILD_KERNEL || !LIBC_EXECFUNCS
|
default n
|
||||||
default y if BUILD_KERNEL && LIBC_EXECFUNCS
|
depends on BUILD_KERNEL && EXPERIMENTAL
|
||||||
depends on EXPERIMENTAL
|
|
||||||
---help---
|
---help---
|
||||||
Select this option if the user process stack resides in its own
|
Select this option if the user process stack resides in its own
|
||||||
address space. The naming of this selection implies that dynamic
|
address space. The naming of this selection implies that dynamic
|
||||||
@ -236,10 +235,9 @@ config ARCH_STACK_DYNAMIC
|
|||||||
general meaning of this configuration environment is simply that the
|
general meaning of this configuration environment is simply that the
|
||||||
stack has its own address space.
|
stack has its own address space.
|
||||||
|
|
||||||
NOTE: This option is also *required* if BUILD_KERNEL and
|
NOTE: This option not yet fully implemented in the code base.
|
||||||
LIBC_EXECFUNCS are selected. Why? Because the caller's stack must
|
Hence, it is marked EXPERIMENTAL: Do not enable it unless you plan
|
||||||
be preserved in its own address space when we instantiate the
|
finish the implementation.
|
||||||
environment of the new process in order to initialize it.
|
|
||||||
|
|
||||||
if ARCH_STACK_DYNAMIC
|
if ARCH_STACK_DYNAMIC
|
||||||
|
|
||||||
@ -258,6 +256,39 @@ config ARCH_STACK_NPAGES
|
|||||||
|
|
||||||
endif # ARCH_STACK_DYNAMIC
|
endif # ARCH_STACK_DYNAMIC
|
||||||
|
|
||||||
|
config ARCH_KERNEL_STACK
|
||||||
|
bool "Kernel process stack"
|
||||||
|
default n if !LIBC_EXECFUNCS
|
||||||
|
default y if LIBC_EXECFUNCS
|
||||||
|
depends on BUILD_KERNEL
|
||||||
|
---help---
|
||||||
|
It this option is selected, then every user process will have two
|
||||||
|
stacks: A large, potentially dynamically sized user stack and small
|
||||||
|
kernel stack that is used during system call process.
|
||||||
|
|
||||||
|
If this option is not selected, then kernel system calls will simply
|
||||||
|
use the caller's user stack. So, in most cases, this option is not
|
||||||
|
required. However, this option is *required* if both BUILD_KERNEL
|
||||||
|
and LIBC_EXECFUNCS are selected. Why? Because when we instantiate
|
||||||
|
and initialize the address environment of the new user process, we
|
||||||
|
will temporarily lose the address environment of the old user
|
||||||
|
process, including its stack contents. The kernel C logic will
|
||||||
|
crash immediately with no valid stack in place.
|
||||||
|
|
||||||
|
When this option is selected, the smaller kernel stack stays in
|
||||||
|
place during system call processing event though the original user
|
||||||
|
stack may or may not be accessible.
|
||||||
|
|
||||||
|
if ARCH_KERNEL_STACK
|
||||||
|
|
||||||
|
config ARCH_KERNEL_STACKSIZE
|
||||||
|
int "Kernel stack size"
|
||||||
|
default 1568
|
||||||
|
---help---
|
||||||
|
The common size of each process' kernel stack
|
||||||
|
|
||||||
|
endif # ARCH_KERNEL_STACK
|
||||||
|
|
||||||
config ARCH_PGPOOL_MAPPING
|
config ARCH_PGPOOL_MAPPING
|
||||||
bool "Have page pool mapping"
|
bool "Have page pool mapping"
|
||||||
default n
|
default n
|
||||||
|
@ -274,14 +274,27 @@ struct xcptcontext
|
|||||||
struct xcpt_syscall_s syscall[CONFIG_SYS_NNEST];
|
struct xcpt_syscall_s syscall[CONFIG_SYS_NNEST];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_ARCH_STACK_DYNAMIC)
|
#ifdef CONFIG_ARCH_ADDRENV
|
||||||
|
#ifdef CONFIG_ARCH_STACK_DYNAMIC
|
||||||
/* This table holds the physical address of the level 2 page table used
|
/* This table holds the physical address of the level 2 page table used
|
||||||
* to map the thread's stack memory. This array will be initially of
|
* to map the thread's stack memory. This array will be initially of
|
||||||
* zeroed and would be back-up up with pages during page fault exception
|
* zeroed and would be back-up up with pages during page fault exception
|
||||||
* handling to support dynamically sized stacks for each thread.
|
* handling to support dynamically sized stacks for each thread.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FAR uintptr_t *stack[ARCH_STACK_NSECTS];
|
FAR uintptr_t *ustack[ARCH_STACK_NSECTS];
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ARCH_KERNEL_STACK
|
||||||
|
/* In this configuration, all syscalls execute from an internal kernel
|
||||||
|
* stack. Why? Because when we instantiate and initialize the address
|
||||||
|
* environment of the new user process, we will temporarily lose the
|
||||||
|
* address environment of the old user process, including its stack
|
||||||
|
* contents. The kernel C logic will crash immediately with no valid
|
||||||
|
* stack in place.
|
||||||
|
*/
|
||||||
|
|
||||||
|
FAR uintptr_t *kstack;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@ -93,7 +93,10 @@ endif
|
|||||||
ifeq ($(CONFIG_ARCH_ADDRENV),y)
|
ifeq ($(CONFIG_ARCH_ADDRENV),y)
|
||||||
CMN_CSRCS += arm_addrenv.c arm_addrenv_utils.c arm_pgalloc.c
|
CMN_CSRCS += arm_addrenv.c arm_addrenv_utils.c arm_pgalloc.c
|
||||||
ifeq ($(CONFIG_ARCH_STACK_DYNAMIC),y)
|
ifeq ($(CONFIG_ARCH_STACK_DYNAMIC),y)
|
||||||
CMN_CSRCS += arm_addrenv_stack.c
|
CMN_CSRCS += arm_addrenv_ustack.c
|
||||||
|
endif
|
||||||
|
ifeq ($(CONFIG_ARCH_KERNEL_STACK),y)
|
||||||
|
CMN_CSRCS += arm_addrenv_kstack.c
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -79,10 +79,10 @@
|
|||||||
* If CONFIG_ARCH_STACK_DYNAMIC=y is selected then the platform specific
|
* If CONFIG_ARCH_STACK_DYNAMIC=y is selected then the platform specific
|
||||||
* code must export these additional interfaces:
|
* code must export these additional interfaces:
|
||||||
*
|
*
|
||||||
* up_addrenv_stackalloc - Create a stack address environment
|
* up_addrenv_ustackalloc - Create a stack address environment
|
||||||
* up_addrenv_stackfree - Destroy a stack address environment.
|
* up_addrenv_ustackfree - Destroy a stack address environment.
|
||||||
* up_addrenv_vstack - Returns the virtual base address of the stack
|
* up_addrenv_vustack - Returns the virtual base address of the stack
|
||||||
* up_addrenv_stackselect - Instantiate a stack address environment
|
* up_addrenv_ustackselect - Instantiate a stack address environment
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/armv7/arm_addrenv_stack.c
|
* arch/arm/src/armv7/arm_addrenv_ustack.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
@ -79,10 +79,10 @@
|
|||||||
* If CONFIG_ARCH_STACK_DYNAMIC=y is selected then the platform specific
|
* If CONFIG_ARCH_STACK_DYNAMIC=y is selected then the platform specific
|
||||||
* code must export these additional interfaces:
|
* code must export these additional interfaces:
|
||||||
*
|
*
|
||||||
* up_addrenv_stackalloc - Create a stack address environment
|
* up_addrenv_ustackalloc - Create a stack address environment
|
||||||
* up_addrenv_stackfree - Destroy a stack address environment.
|
* up_addrenv_ustackfree - Destroy a stack address environment.
|
||||||
* up_addrenv_vstack - Returns the virtual base address of the stack
|
* up_addrenv_vustack - Returns the virtual base address of the stack
|
||||||
* up_addrenv_stackselect - Instantiate a stack address environment
|
* up_addrenv_ustackselect - Instantiate a stack address environment
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
@ -129,12 +129,12 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: up_addrenv_stackalloc
|
* Name: up_addrenv_ustackalloc
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function is called when a new thread is created in order to
|
* This function is called when a new thread is created in order to
|
||||||
* instantiate an address environment for the new thread's stack.
|
* instantiate an address environment for the new thread's stack.
|
||||||
* up_addrenv_stackalloc() is essentially the allocator of the physical
|
* up_addrenv_ustackalloc() is essentially the allocator of the physical
|
||||||
* memory for the new task's stack.
|
* memory for the new task's stack.
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
@ -147,7 +147,7 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int up_addrenv_stackalloc(FAR struct tcb_s *tcb, size_t stacksize)
|
int up_addrenv_ustackalloc(FAR struct tcb_s *tcb, size_t stacksize)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -157,7 +157,7 @@ int up_addrenv_stackalloc(FAR struct tcb_s *tcb, size_t stacksize)
|
|||||||
|
|
||||||
/* Initialize the address environment list to all zeroes */
|
/* Initialize the address environment list to all zeroes */
|
||||||
|
|
||||||
memset(tcb->xcp.stack, 0, ARCH_STACK_NSECTS * sizeof(uintptr_t *));
|
memset(tcb->xcp.ustack, 0, ARCH_STACK_NSECTS * sizeof(uintptr_t *));
|
||||||
|
|
||||||
/* Back the allocation up with physical pages and set up the level 2 mapping
|
/* Back the allocation up with physical pages and set up the level 2 mapping
|
||||||
* (which of course does nothing until the L2 page table is hooked into
|
* (which of course does nothing until the L2 page table is hooked into
|
||||||
@ -166,13 +166,13 @@ int up_addrenv_stackalloc(FAR struct tcb_s *tcb, size_t stacksize)
|
|||||||
|
|
||||||
/* Allocate .text space pages */
|
/* Allocate .text space pages */
|
||||||
|
|
||||||
ret = arm_addrenv_create_region(tcb->xcp.stack, ARCH_STACK_NSECTS,
|
ret = arm_addrenv_create_region(tcb->xcp.ustack, ARCH_STACK_NSECTS,
|
||||||
CONFIG_ARCH_STACK_VBASE, stacksize,
|
CONFIG_ARCH_STACK_VBASE, stacksize,
|
||||||
MMU_L2_UDATAFLAGS);
|
MMU_L2_UDATAFLAGS);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
bdbg("ERROR: Failed to create stack region: %d\n", ret);
|
bdbg("ERROR: Failed to create stack region: %d\n", ret);
|
||||||
up_addrenv_stackfree(tcb);
|
up_addrenv_ustackfree(tcb);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,7 +180,7 @@ int up_addrenv_stackalloc(FAR struct tcb_s *tcb, size_t stacksize)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: up_addrenv_stackfree
|
* Name: up_addrenv_ustackfree
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function is called when any thread exits. This function then
|
* This function is called when any thread exits. This function then
|
||||||
@ -196,22 +196,22 @@ int up_addrenv_stackalloc(FAR struct tcb_s *tcb, size_t stacksize)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int up_addrenv_stackfree(FAR struct tcb_s *tcb)
|
int up_addrenv_ustackfree(FAR struct tcb_s *tcb)
|
||||||
{
|
{
|
||||||
bvdbg("tcb=%p\n", tcb);
|
bvdbg("tcb=%p\n", tcb);
|
||||||
DEBUGASSERT(tcb);
|
DEBUGASSERT(tcb);
|
||||||
|
|
||||||
/* Destroy the stack region */
|
/* Destroy the stack region */
|
||||||
|
|
||||||
arm_addrenv_destroy_region(tcb->xcp.stack, ARCH_STACK_NSECTS,
|
arm_addrenv_destroy_region(tcb->xcp.ustack, ARCH_STACK_NSECTS,
|
||||||
CONFIG_ARCH_STACK_VBASE);
|
CONFIG_ARCH_STACK_VBASE);
|
||||||
|
|
||||||
memset(tcb->xcp.stack, 0, ARCH_STACK_NSECTS * sizeof(uintptr_t *));
|
memset(tcb->xcp.ustack, 0, ARCH_STACK_NSECTS * sizeof(uintptr_t *));
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: up_addrenv_vstack
|
* Name: up_addrenv_vustack
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Return the virtual address associated with the newly create stack
|
* Return the virtual address associated with the newly create stack
|
||||||
@ -227,7 +227,7 @@ int up_addrenv_stackfree(FAR struct tcb_s *tcb)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int up_addrenv_vstack(FAR const struct tcb_s *tcb, FAR void **vstack)
|
int up_addrenv_vustack(FAR const struct tcb_s *tcb, FAR void **vstack)
|
||||||
{
|
{
|
||||||
bvdbg("Return=%p\n", (FAR void *)CONFIG_ARCH_STACK_VBASE);
|
bvdbg("Return=%p\n", (FAR void *)CONFIG_ARCH_STACK_VBASE);
|
||||||
|
|
||||||
@ -239,11 +239,11 @@ int up_addrenv_vstack(FAR const struct tcb_s *tcb, FAR void **vstack)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: up_addrenv_stackselect
|
* Name: up_addrenv_ustackselect
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* After an address environment has been established for a task's stack
|
* After an address environment has been established for a task's stack
|
||||||
* (via up_addrenv_stackalloc(). This function may be called to instantiate
|
* (via up_addrenv_ustackalloc(). This function may be called to instantiate
|
||||||
* that address environment in the virtual address space. This is a
|
* that address environment in the virtual address space. This is a
|
||||||
* necessary step before each context switch to the newly created thread
|
* necessary step before each context switch to the newly created thread
|
||||||
* (including the initial thread startup).
|
* (including the initial thread startup).
|
||||||
@ -257,7 +257,7 @@ int up_addrenv_vstack(FAR const struct tcb_s *tcb, FAR void **vstack)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int up_addrenv_stackselect(FAR const struct tcb_s *tcb)
|
int up_addrenv_ustackselect(FAR const struct tcb_s *tcb)
|
||||||
{
|
{
|
||||||
uintptr_t vaddr;
|
uintptr_t vaddr;
|
||||||
uintptr_t paddr;
|
uintptr_t paddr;
|
||||||
@ -271,7 +271,7 @@ int up_addrenv_stackselect(FAR const struct tcb_s *tcb)
|
|||||||
{
|
{
|
||||||
/* Set (or clear) the new page table entry */
|
/* Set (or clear) the new page table entry */
|
||||||
|
|
||||||
paddr = (uintptr_t)tcb->xcp.stack[i];
|
paddr = (uintptr_t)tcb->xcp.ustack[i];
|
||||||
if (paddr)
|
if (paddr)
|
||||||
{
|
{
|
||||||
mmu_l1_setentry(paddr, vaddr, MMU_L1_PGTABFLAGS);
|
mmu_l1_setentry(paddr, vaddr, MMU_L1_PGTABFLAGS);
|
@ -95,7 +95,10 @@ endif
|
|||||||
ifeq ($(CONFIG_ARCH_ADDRENV),y)
|
ifeq ($(CONFIG_ARCH_ADDRENV),y)
|
||||||
CMN_CSRCS += arm_addrenv.c arm_addrenv_utils.c arm_pgalloc.c
|
CMN_CSRCS += arm_addrenv.c arm_addrenv_utils.c arm_pgalloc.c
|
||||||
ifeq ($(CONFIG_ARCH_STACK_DYNAMIC),y)
|
ifeq ($(CONFIG_ARCH_STACK_DYNAMIC),y)
|
||||||
CMN_CSRCS += arm_addrenv_stack.c
|
CMN_CSRCS += arm_addrenv_ustack.c
|
||||||
|
endif
|
||||||
|
ifeq ($(CONFIG_ARCH_KERNEL_STACK),y)
|
||||||
|
CMN_CSRCS += arm_addrenv_kstack.c
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@
|
|||||||
#define ARCH_HEAP_VEND (CONFIG_ARCH_HEAP_VBASE + ARCH_HEAP_SIZE)
|
#define ARCH_HEAP_VEND (CONFIG_ARCH_HEAP_VBASE + ARCH_HEAP_SIZE)
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_STACK_DYNAMIC
|
#ifdef CONFIG_ARCH_STACK_DYNAMIC
|
||||||
/* Stack region */
|
/* User stack region */
|
||||||
|
|
||||||
# ifndef CONFIG_ARCH_STACK_VBASE
|
# ifndef CONFIG_ARCH_STACK_VBASE
|
||||||
# error CONFIG_ARCH_STACK_VBASE not defined
|
# error CONFIG_ARCH_STACK_VBASE not defined
|
||||||
@ -158,6 +158,14 @@
|
|||||||
# define ARCH_STACK_SIZE (CONFIG_ARCH_STACK_NPAGES * CONFIG_MM_PGSIZE)
|
# define ARCH_STACK_SIZE (CONFIG_ARCH_STACK_NPAGES * CONFIG_MM_PGSIZE)
|
||||||
# define ARCH_STACK_VEND (CONFIG_ARCH_STACK_VBASE + ARCH_STACK_SIZE)
|
# define ARCH_STACK_VEND (CONFIG_ARCH_STACK_VBASE + ARCH_STACK_SIZE)
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_KERNEL_STACK
|
||||||
|
/* Kernel stack */
|
||||||
|
|
||||||
|
# ifndef CONFIG_ARCH_KERNEL_STACKSIZE
|
||||||
|
# define CONFIG_ARCH_KERNEL_STACKSIZE 1568
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/* A single page scratch region used for temporary mappings */
|
/* A single page scratch region used for temporary mappings */
|
||||||
|
|
||||||
# define ARCH_SCRATCH_VBASE ARCH_STACK_VEND
|
# define ARCH_SCRATCH_VBASE ARCH_STACK_VEND
|
||||||
@ -290,10 +298,10 @@ struct addrenv_reserve_s
|
|||||||
* If CONFIG_ARCH_STACK_DYNAMIC=y is selected then the platform specific
|
* If CONFIG_ARCH_STACK_DYNAMIC=y is selected then the platform specific
|
||||||
* code must export these additional interfaces:
|
* code must export these additional interfaces:
|
||||||
*
|
*
|
||||||
* up_addrenv_stackalloc - Create a stack address environment
|
* up_addrenv_ustackalloc - Create a stack address environment
|
||||||
* up_addrenv_stackfree - Destroy a stack address environment.
|
* up_addrenv_ustackfree - Destroy a stack address environment.
|
||||||
* up_addrenv_vstack - Returns the virtual base address of the stack
|
* up_addrenv_vustack - Returns the virtual base address of the stack
|
||||||
* up_addrenv_stackselect - Instantiate a stack address environment
|
* up_addrenv_ustackselect - Instantiate a stack address environment
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
@ -763,10 +763,10 @@ uintptr_t pgalloc(uintptr_t brkaddr, unsigned int npages);
|
|||||||
* If CONFIG_ARCH_STACK_DYNAMIC=y is selected then the platform specific
|
* If CONFIG_ARCH_STACK_DYNAMIC=y is selected then the platform specific
|
||||||
* code must export these additional interfaces:
|
* code must export these additional interfaces:
|
||||||
*
|
*
|
||||||
* up_addrenv_stackalloc - Create a stack address environment
|
* up_addrenv_ustackalloc - Create a stack address environment
|
||||||
* up_addrenv_stackfree - Destroy a stack address environment.
|
* up_addrenv_ustackfree - Destroy a stack address environment.
|
||||||
* up_addrenv_vstack - Returns the virtual base address of the stack
|
* up_addrenv_vustack - Returns the virtual base address of the stack
|
||||||
* up_addrenv_stackselect - Instantiate a stack address environment
|
* up_addrenv_ustackselect - Instantiate a stack address environment
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -1044,12 +1044,12 @@ int up_addrenv_detach(FAR struct task_group_s *group, FAR struct tcb_s *tcb);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: up_addrenv_stackalloc
|
* Name: up_addrenv_ustackalloc
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function is called when a new thread is created in order to
|
* This function is called when a new thread is created in order to
|
||||||
* instantiate an address environment for the new thread's stack.
|
* instantiate an address environment for the new thread's stack.
|
||||||
* up_addrenv_stackalloc() is essentially the allocator of the physical
|
* up_addrenv_ustackalloc() is essentially the allocator of the physical
|
||||||
* memory for the new task's stack.
|
* memory for the new task's stack.
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
@ -1063,11 +1063,11 @@ int up_addrenv_detach(FAR struct task_group_s *group, FAR struct tcb_s *tcb);
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_ARCH_STACK_DYNAMIC)
|
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_ARCH_STACK_DYNAMIC)
|
||||||
int up_addrenv_stackalloc(FAR struct tcb_s *tcb, size_t stacksize);
|
int up_addrenv_ustackalloc(FAR struct tcb_s *tcb, size_t stacksize);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: up_addrenv_stackfree
|
* Name: up_addrenv_ustackfree
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* This function is called when any thread exits. This function then
|
* This function is called when any thread exits. This function then
|
||||||
@ -1084,11 +1084,11 @@ int up_addrenv_stackalloc(FAR struct tcb_s *tcb, size_t stacksize);
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_ARCH_STACK_DYNAMIC)
|
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_ARCH_STACK_DYNAMIC)
|
||||||
int up_addrenv_stackfree(FAR struct tcb_s *tcb);
|
int up_addrenv_ustackfree(FAR struct tcb_s *tcb);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: up_addrenv_vstack
|
* Name: up_addrenv_vustack
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Return the virtual address associated with the newly create stack
|
* Return the virtual address associated with the newly create stack
|
||||||
@ -1105,15 +1105,15 @@ int up_addrenv_stackfree(FAR struct tcb_s *tcb);
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_ARCH_STACK_DYNAMIC)
|
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_ARCH_STACK_DYNAMIC)
|
||||||
int up_addrenv_vstack(FAR const struct tcb_s *tcb, FAR void **vstack);
|
int up_addrenv_vustack(FAR const struct tcb_s *tcb, FAR void **vstack);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: up_addrenv_stackselect
|
* Name: up_addrenv_ustackselect
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* After an address environment has been established for a task's stack
|
* After an address environment has been established for a task's stack
|
||||||
* (via up_addrenv_stackalloc(). This function may be called to instantiate
|
* (via up_addrenv_ustackalloc(). This function may be called to instantiate
|
||||||
* that address environment in the virtual address space. This is a
|
* that address environment in the virtual address space. This is a
|
||||||
* necessary step before each context switch to the newly created thread
|
* necessary step before each context switch to the newly created thread
|
||||||
* (including the initial thread startup).
|
* (including the initial thread startup).
|
||||||
@ -1128,7 +1128,7 @@ int up_addrenv_vstack(FAR const struct tcb_s *tcb, FAR void **vstack);
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_ARCH_STACK_DYNAMIC)
|
#if defined(CONFIG_ARCH_ADDRENV) && defined(CONFIG_ARCH_STACK_DYNAMIC)
|
||||||
int up_addrenv_stackselect(FAR const struct tcb_s *tcb);
|
int up_addrenv_ustackselect(FAR const struct tcb_s *tcb);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* libc/string/lib_psa_init.c
|
* libc/string/lib_psa_init.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2013-2014 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
Loading…
Reference in New Issue
Block a user