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 (;;); 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 * \brief Disable the dispatcher
* *
@ -219,6 +233,7 @@ void disp_yield_disabled(dispatcher_handle_t handle)
*/ */
dispatcher_handle_t disp_disable(void) dispatcher_handle_t disp_disable(void)
{ {
allocate_stack();
dispatcher_handle_t handle = curdispatcher(); dispatcher_handle_t handle = curdispatcher();
struct dispatcher_shared_generic* disp = struct dispatcher_shared_generic* disp =
get_dispatcher_shared_generic(handle); get_dispatcher_shared_generic(handle);
@ -240,6 +255,7 @@ dispatcher_handle_t disp_disable(void)
*/ */
dispatcher_handle_t disp_try_disable(bool *was_enabled) dispatcher_handle_t disp_try_disable(bool *was_enabled)
{ {
allocate_stack();
dispatcher_handle_t handle = curdispatcher(); dispatcher_handle_t handle = curdispatcher();
struct dispatcher_shared_generic* disp = struct dispatcher_shared_generic* disp =
get_dispatcher_shared_generic(handle); get_dispatcher_shared_generic(handle);