diff options
author | Marcelo Tosatti <mtosatti@redhat.com> | 2012-10-11 05:07:45 -0300 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2012-10-11 05:07:45 -0300 |
commit | 487a26af87644923656e98a40f7801ec2f459b14 (patch) | |
tree | 0a45e66866231c9b48ed4ace875813d4aa035e55 /hw/pl190.c | |
parent | 6b852ae04e3aa1adfeac5a62d6ab71870bcc7c5d (diff) | |
parent | 92aa5c6d77ac29574c1717bcf57827fa1e586f31 (diff) |
Merge commit '92aa5c6d77ac29574c1717bcf57827fa1e586f31' into upstream-merge
* commit '92aa5c6d77ac29574c1717bcf57827fa1e586f31': (43 commits)
iostatus: move BlockdevOnError declaration to QAPI
iostatus: rename BlockErrorAction, BlockQMPEventAction
qemu-iotests: add test for pausing a streaming operation
qmp: add block-job-pause and block-job-resume
block: add support for job pause/resume
qmp: add 'busy' member to BlockJobInfo
block: add block_job_query
block: move job APIs to separate files
block: fix documentation of block_job_cancel_sync
qerror/block: introduce QERR_BLOCK_JOB_NOT_ACTIVE
qemu-iotests: add initial tests for live block commit
QAPI: add command for live block commit, 'block-commit'
block: helper function, to find the base image of a chain
blockdev: rename block_stream_cb to a generic block_job_cb
block: add live block commit functionality
block: add support functions for live commit, to find and delete images.
block: Support GlusterFS as a QEMU block backend.
configure: Add a config option for GlusterFS as block backend
aio: Another fix to the walking_handlers logic
qemu: URI parsing library
...
Conflicts:
blockdev.c
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'hw/pl190.c')
-rw-r--r-- | hw/pl190.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/hw/pl190.c b/hw/pl190.c index cb50afb9f..7332f4dba 100644 --- a/hw/pl190.c +++ b/hw/pl190.c @@ -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) |