43 lines
1.2 KiB
C
43 lines
1.2 KiB
C
/*
|
|
* Copyright 2014, General Dynamics C4 Systems
|
|
*
|
|
* This software may be distributed and modified according to the terms of
|
|
* the GNU General Public License version 2. Note that NO WARRANTY is provided.
|
|
* See "LICENSE_GPLv2.txt" for details.
|
|
*
|
|
* @TAG(GD_GPL)
|
|
*/
|
|
|
|
#include <api/failures.h>
|
|
#include <model/preemption.h>
|
|
#include <model/statedata.h>
|
|
#include <plat/machine/hardware.h>
|
|
#include <config.h>
|
|
|
|
/*
|
|
* Possibly preempt the current thread to allow an interrupt to be handled.
|
|
*/
|
|
exception_t
|
|
preemptionPoint(void)
|
|
{
|
|
/* Record that we have performed some work. */
|
|
ksWorkUnitsCompleted++;
|
|
|
|
/*
|
|
* If we have performed a non-trivial amount of work since last time we
|
|
* checked for preemption, and there is an interrupt pending, handle the
|
|
* interrupt.
|
|
*
|
|
* We avoid checking for pending IRQs every call, as our callers tend to
|
|
* call us in a tight loop and checking for pending IRQs can be quite slow.
|
|
*/
|
|
if (ksWorkUnitsCompleted >= CONFIG_MAX_NUM_WORK_UNITS_PER_PREEMPTION) {
|
|
ksWorkUnitsCompleted = 0;
|
|
if (isIRQPending()) {
|
|
return EXCEPTION_PREEMPTED;
|
|
}
|
|
}
|
|
|
|
return EXCEPTION_NONE;
|
|
}
|
|
|