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 (;;);
|
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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user