Commit 14c126ba authored by Brendan Fennell's avatar Brendan Fennell Committed by Peter Maydell
Browse files

pl190: fix read of VECTADDR



Reading VECTADDR was causing us to set the current priority to
the wrong value, the most obvious effect of which was that we
would return the vector for the wrong interrupt as the result
of the read.
Signed-off-by: default avatarBrendan Fennell <bfennell@skynet.ie>
Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parent ac05f349
......@@ -117,12 +117,18 @@ static uint64_t pl190_read(void *opaque, target_phys_addr_t offset,
return s->protected;
case 12: /* VECTADDR */
/* Read vector address at the start of an ISR. Increases the
current priority level to that of the current interrupt. */
for (i = 0; i < s->priority; i++)
{
if ((s->level | s->soft_level) & s->prio_mask[i])
break;
}
* current priority level to that of the current interrupt.
*
* Since an enabled interrupt X at priority P causes prio_mask[Y]
* to have bit X set for all Y > P, this loop will stop with
* i == the priority of the highest priority set interrupt.
*/
for (i = 0; i < s->priority; i++) {
if ((s->level | s->soft_level) & s->prio_mask[i + 1]) {
break;
}
}
/* Reading this value with no pending interrupts is undefined.
We return the default address. */
if (i == PL190_NUM_PRIO)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment