kernel: overhaul stack specification
The core kernel computes the initial stack pointer for a thread, properly aligning it and subtracting out any random offsets or thread-local storage areas. arch_new_thread() no longer needs to make any calculations, an initial stack frame may be placed at the bounds of the new 'stack_ptr' parameter passed in. This parameter replaces 'stack_size'. thread->stack_info is now set before arch_new_thread() is invoked, z_new_thread_init() has been removed. The values populated may need to be adjusted on arches which carve-out MPU guard space from the actual stack buffer. thread->stack_info now has a new member 'delta' which indicates any offset applied for TLS or random offset. It's used so the calculations don't need to be repeated if the thread later drops to user mode. CONFIG_INIT_STACKS logic is now performed inside z_setup_new_thread(), before arch_new_thread() is called. thread->stack_info is now defined as the canonical user-accessible area within the stack object, including random offsets and TLS. It will never include any carved-out memory for MPU guards and must be updated at runtime if guards are removed. Available stack space is now optimized. Some arches may need to significantly round up the buffer size to account for page-level granularity or MPU power-of-two requirements. This space is now accounted for and used by virtue of the Z_THREAD_STACK_SIZE_ADJUST() call in z_setup_new_thread. Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
This commit is contained in:
parent
d4b6226aa9
commit
b0c155f3ca
27 changed files with 570 additions and 764 deletions
|
@ -527,11 +527,20 @@ struct _thread_stack_info {
|
|||
*/
|
||||
uintptr_t start;
|
||||
|
||||
/* Stack Size - Thread writable stack buffer size. Represents
|
||||
* the size of the actual area, starting from the start member,
|
||||
* that should be writable by the thread
|
||||
/* Thread writable stack buffer size. Represents the size of the actual
|
||||
* buffer, starting from the 'start' member, that should be writable by
|
||||
* the thread. This comprises of the thread stack area, any area reserved
|
||||
* for local thread data storage, as well as any area left-out due to
|
||||
* random adjustments applied to the initial thread stack pointer during
|
||||
* thread initialization.
|
||||
*/
|
||||
size_t size;
|
||||
|
||||
/* Adjustment value to the size member, removing any storage
|
||||
* used for TLS or random stack base offsets. (start + size - delta)
|
||||
* is the initial stack pointer for a thread. May be 0.
|
||||
*/
|
||||
size_t delta;
|
||||
};
|
||||
|
||||
typedef struct _thread_stack_info _thread_stack_info_t;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue