arm: Generate privileged stacks
This patch adds the generation and incorporation of privileged stack regions that are used by ARM user mode threads. This patch adds the infrastructure for privileged stacks. Later patches will utilize the generated stacks and helper functions. Signed-off-by: Chunlin Han <chunlin.han@linaro.org> Signed-off-by: Andy Gross <andy.gross@linaro.org>
This commit is contained in:
parent
e8860fe8be
commit
18560a01a4
10 changed files with 835 additions and 6 deletions
13
include/linker/priv_stacks-rom.ld
Normal file
13
include/linker/priv_stacks-rom.ld
Normal file
|
@ -0,0 +1,13 @@
|
|||
/*
|
||||
* Copyright (c) 2017 Linaro Limited.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_USERSPACE
|
||||
/* Kept in RAM on non-XIP */
|
||||
#ifdef CONFIG_XIP
|
||||
*(".priv_stacks.rodata*")
|
||||
#endif
|
||||
#endif /* CONFIG_USERSPACE */
|
||||
|
30
include/linker/priv_stacks-text.ld
Normal file
30
include/linker/priv_stacks-text.ld
Normal file
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* Copyright (c) 2017 Linaro Limited.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
#ifndef PRIV_STACKS_TEXT_AREA
|
||||
#if defined(CONFIG_DEBUG) || defined(CONFIG_STACK_CANARIES)
|
||||
#define PRIV_STACKS_TEXT_AREA 256
|
||||
#else
|
||||
#define PRIV_STACKS_TEXT_AREA 128
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_USERSPACE
|
||||
/* We need to reserve room for the gperf generated hash functions.
|
||||
* Fortunately, unlike the data tables, the size of the code is
|
||||
* reasonably predictable.
|
||||
*
|
||||
* The linker will error out complaining that the location pointer
|
||||
* is moving backwards if the reserved room isn't large enough.
|
||||
*/
|
||||
_priv_stacks_text_area_start = .;
|
||||
*(".priv_stacks.text*")
|
||||
_priv_stacks_text_area_end = .;
|
||||
#ifndef LINKER_PASS2
|
||||
PROVIDE(_k_priv_stack_find = .);
|
||||
#endif
|
||||
. += PRIV_STACKS_TEXT_AREA - (_priv_stacks_text_area_end - _priv_stacks_text_area_start);
|
||||
#endif /* CONFIG_USERSPACE */
|
||||
|
36
include/linker/priv_stacks.ld
Normal file
36
include/linker/priv_stacks.ld
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright (c) 2017 Linaro Limited
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_USERSPACE
|
||||
/* Constraints:
|
||||
*
|
||||
* - changes to the size of this section between build phases
|
||||
* *must not* shift the memory address of any kernel obejcts,
|
||||
* since it contains a hashtable of the memory addresses of those
|
||||
* kernel objects
|
||||
*
|
||||
* - It is OK if this section itself is shifted in between builds; for
|
||||
* example some arches may precede this section with generated MMU
|
||||
* page tables which are also unpredictable in size.
|
||||
*
|
||||
* The size of the
|
||||
* gperf tables is both a function of the number of kernel objects,
|
||||
* *and* the specific memory addresses being hashed. It is not something
|
||||
* that can be predicted without actually building and compling it.
|
||||
*/
|
||||
SECTION_DATA_PROLOGUE(priv_stacks, (OPTIONAL),)
|
||||
{
|
||||
*(".priv_stacks.data*")
|
||||
|
||||
/* This is also unpredictable in size, and has the same constraints.
|
||||
* On XIP systems this will get put at the very end of ROM.
|
||||
*/
|
||||
#ifndef CONFIG_XIP
|
||||
*(".priv_stacks.rodata*")
|
||||
#endif
|
||||
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
|
||||
#endif /* CONFIG_USERSPACE */
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue