Fix for page fault while disabled
This commit is contained in:
parent
e5a5ec13bb
commit
42d51de0b1
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user