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_STACK_GUARD_SIZE (4 * B_PAGE_SIZE) // 16 kB
|
||||||
#define USER_MAIN_THREAD_STACK_SIZE (16 * 1024 * 1024) // 16 MB
|
#define USER_MAIN_THREAD_STACK_SIZE (16 * 1024 * 1024) // 16 MB
|
||||||
#define USER_STACK_SIZE (256 * 1024) // 256 kB
|
#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
|
#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
|
/*! Sets up initial thread context and enters user space
|
||||||
*/
|
*/
|
||||||
status_t
|
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, "
|
TRACE(("arch_thread_enter_userspace: entry 0x%lx, args %p %p, "
|
||||||
"ustack_top 0x%lx\n", entry, args1, args2, stackTop));
|
"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
|
// copy the little stub that calls exit_thread() when the thread entry
|
||||||
// function returns, as well as the arguments of the entry function
|
// function returns, as well as the arguments of the entry function
|
||||||
stackTop -= codeSize;
|
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
|
/*! Sets up initial thread context and enters user space
|
||||||
*/
|
*/
|
||||||
status_t
|
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, "
|
TRACE("arch_thread_enter_userspace: entry %#lx, args %p %p, "
|
||||||
"stackTop %#lx\n", entry, args1, args2, stackTop);
|
"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
|
// Copy the little stub that calls exit_thread() when the thread entry
|
||||||
// function returns.
|
// function returns.
|
||||||
// TODO: This will become a problem later if we want to support execute
|
// TODO: This will become a problem later if we want to support execute
|
||||||
|
|||||||
Reference in New Issue
Block a user