Fix for page fault while disabled

This commit is contained in:
Jan Schär 2022-04-13 15:47:38 +02:00
parent e5a5ec13bb
commit 42d51de0b1

View File

@ -208,6 +208,20 @@ void disp_yield_disabled(dispatcher_handle_t handle)
for (;;);
}
/**
* We must not cause page faults while disabled. So touch the stack now
* to potentially cause a page fault, so that we won't have one later.
* This assumes that we use at most sizeof(s) bytes of stack while disabled.
*/
static void allocate_stack(void)
{
volatile char s[2048];
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
s[0];
#pragma GCC diagnostic pop
}
/**
* \brief Disable the dispatcher
*
@ -219,6 +233,7 @@ void disp_yield_disabled(dispatcher_handle_t handle)
*/
dispatcher_handle_t disp_disable(void)
{
allocate_stack();
dispatcher_handle_t handle = curdispatcher();
struct dispatcher_shared_generic* disp =
get_dispatcher_shared_generic(handle);
@ -240,6 +255,7 @@ dispatcher_handle_t disp_disable(void)
*/
dispatcher_handle_t disp_try_disable(bool *was_enabled)
{
allocate_stack();
dispatcher_handle_t handle = curdispatcher();
struct dispatcher_shared_generic* disp =
get_dispatcher_shared_generic(handle);