diff options
author | Andrew Baumann | 2015-12-17 14:37:13 +0100 |
---|---|---|
committer | Peter Maydell | 2015-12-17 14:37:13 +0100 |
commit | 30901475b91ef1f46304404ab4bfe89097f61b96 (patch) | |
tree | b84b67f2ea28863d0d1c13e2d5060d81efd733bb /target-arm/helper.c | |
parent | arm: soc-dma: use hwaddr instead of target_ulong in printf (diff) | |
download | qemu-30901475b91ef1f46304404ab4bfe89097f61b96.tar.gz qemu-30901475b91ef1f46304404ab4bfe89097f61b96.tar.xz qemu-30901475b91ef1f46304404ab4bfe89097f61b96.zip |
target-arm: raise exception on misaligned LDREX operands
Qemu does not generally perform alignment checks. However, the ARM ARM
requires implementation of alignment exceptions for a number of cases
including LDREX, and Windows-on-ARM relies on this.
This change adds plumbing to enable alignment checks on loads using
MO_ALIGN, a do_unaligned_access hook to raise the exception (data
abort), and uses the new aligned loads in LDREX (for all but
single-byte loads).
Signed-off-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
Message-id: 1449167808-5656-1-git-send-email-Andrew.Baumann@microsoft.com
[PMM: set WnR bits in syndrome and FSR as appropriate]
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'target-arm/helper.c')
-rw-r--r-- | target-arm/helper.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/target-arm/helper.c b/target-arm/helper.c index afc4163342..59d5a41b58 100644 --- a/target-arm/helper.c +++ b/target-arm/helper.c @@ -5996,6 +5996,14 @@ static inline bool regime_using_lpae_format(CPUARMState *env, return false; } +/* Returns true if the translation regime is using LPAE format page tables. + * Used when raising alignment exceptions, whose FSR changes depending on + * whether the long or short descriptor format is in use. */ +bool arm_regime_using_lpae_format(CPUARMState *env, ARMMMUIdx mmu_idx) +{ + return regime_using_lpae_format(env, mmu_idx); +} + static inline bool regime_is_user(CPUARMState *env, ARMMMUIdx mmu_idx) { switch (mmu_idx) { |