arch: randomize initial user stack pointer
Inside the page randomization of initial user stack pointer is not only a part of ASLR implementation but also a performance improvement that helps eliminating aligned 64 kB data access. Minimal user stack size is increased to 8 kB in order to ensure that regardless of initial stack pointer value there is still enough space on stack.
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
#define USER_STACK_GUARD_SIZE (4 * B_PAGE_SIZE) // 16 kB
|
||||
#define USER_MAIN_THREAD_STACK_SIZE (16 * 1024 * 1024) // 16 MB
|
||||
#define USER_STACK_SIZE (256 * 1024) // 256 kB
|
||||
#define MIN_USER_STACK_SIZE (4 * 1024) // 4 KB
|
||||
#define MIN_USER_STACK_SIZE (8 * 1024) // 8 kB
|
||||
#define MAX_USER_STACK_SIZE (16 * 1024 * 1024) // 16 MB
|
||||
|
||||
|
||||
|
||||
@@ -200,6 +200,14 @@ arch_thread_dump_info(void *info)
|
||||
}
|
||||
|
||||
|
||||
static addr_t
|
||||
arch_randomize_stack_pointer(addr_t value)
|
||||
{
|
||||
value -= rand() & (B_PAGE_SIZE - 1);
|
||||
return value & ~0xful;
|
||||
}
|
||||
|
||||
|
||||
/*! Sets up initial thread context and enters user space
|
||||
*/
|
||||
status_t
|
||||
@@ -214,6 +222,8 @@ arch_thread_enter_userspace(Thread* thread, addr_t entry, void* args1,
|
||||
TRACE(("arch_thread_enter_userspace: entry 0x%lx, args %p %p, "
|
||||
"ustack_top 0x%lx\n", entry, args1, args2, stackTop));
|
||||
|
||||
stackTop = arch_randomize_stack_pointer(stackTop);
|
||||
|
||||
// copy the little stub that calls exit_thread() when the thread entry
|
||||
// function returns, as well as the arguments of the entry function
|
||||
stackTop -= codeSize;
|
||||
|
||||
@@ -197,6 +197,14 @@ arch_thread_dump_info(void* info)
|
||||
}
|
||||
|
||||
|
||||
static addr_t
|
||||
arch_randomize_stack_pointer(addr_t value)
|
||||
{
|
||||
value -= rand() & (B_PAGE_SIZE - 1);
|
||||
return value & ~0xful;
|
||||
}
|
||||
|
||||
|
||||
/*! Sets up initial thread context and enters user space
|
||||
*/
|
||||
status_t
|
||||
@@ -208,6 +216,8 @@ arch_thread_enter_userspace(Thread* thread, addr_t entry, void* args1,
|
||||
TRACE("arch_thread_enter_userspace: entry %#lx, args %p %p, "
|
||||
"stackTop %#lx\n", entry, args1, args2, stackTop);
|
||||
|
||||
stackTop = arch_randomize_stack_pointer(stackTop);
|
||||
|
||||
// Copy the little stub that calls exit_thread() when the thread entry
|
||||
// function returns.
|
||||
// TODO: This will become a problem later if we want to support execute
|
||||
|
||||
Reference in New Issue
Block a user