1
Second ARM pull request of this week; this one has my next
1
Hi; here's the first target-arm pullreq for the 7.0 cycle.
2
set of v8M patches and a handful of more minor stuff from
3
other people.
4
2
5
thanks
3
thanks
6
-- PMM
4
-- PMM
7
5
8
The following changes since commit 8ee5f9b3ecc94e3eb7a8235f4b2c3ec9024807f6:
6
The following changes since commit 76b56fdfc9fa43ec6e5986aee33f108c6c6a511e:
9
7
10
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2017-09-07 10:45:18 +0100)
8
Merge tag 'block-pull-request' of https://gitlab.com/stefanha/qemu into staging (2021-12-14 12:46:18 -0800)
11
9
12
are available in the git repository at:
10
are available in the Git repository at:
13
11
14
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20170907
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20211215
15
13
16
for you to fetch changes up to c99a55d38dd5b5131f3fcbbaf41828a09ee62544:
14
for you to fetch changes up to aed176558806674d030a8305d989d4e6a5073359:
17
15
18
target/arm: Add Jazelle feature (2017-09-07 13:54:55 +0100)
16
tests/acpi: add expected blob for VIOT test on virt machine (2021-12-15 10:35:26 +0000)
19
17
20
----------------------------------------------------------------
18
----------------------------------------------------------------
21
target-arm:
19
target-arm queue:
22
* cleanups converting to DEFINE_PROP_LINK
20
* ITS: error reporting cleanup
23
* allwinner-a10: mark as not user-creatable
21
* aspeed: improve documentation
24
* initial patches working towards ARMv8M support
22
* Fix STM32F2XX USART data register readout
25
* implement generating aborts on memory transaction failures
23
* allow emulated GICv3 to be disabled in non-TCG builds
26
* make BXJ behave correctly (ie not UNDEF) on ARMv6-and-later
24
* fix exception priority for singlestep, misaligned PC, bp, etc
25
* Correct calculation of tlb range invalidate length
26
* npcm7xx_emc: fix missing queue_flush
27
* virt: Add VIOT ACPI table for virtio-iommu
28
* target/i386: Use assert() to sanity-check b1 in SSE decode
29
* Don't include qemu-common unnecessarily
27
30
28
----------------------------------------------------------------
31
----------------------------------------------------------------
29
Fam Zheng (6):
32
Alex Bennée (1):
30
armv7m: Convert bitband.source-memory to DEFINE_PROP_LINK
33
hw/intc: clean-up error reporting for failed ITS cmd
31
armv7m: Convert armv7m.memory to DEFINE_PROP_LINK
32
gicv3: Convert to DEFINE_PROP_LINK
33
xlnx_zynqmp: Convert to DEFINE_PROP_LINK
34
xilinx_axienet: Convert to DEFINE_PROP_LINK
35
xilinx_axidma: Convert to DEFINE_PROP_LINK
36
34
37
Peter Maydell (23):
35
Jean-Philippe Brucker (8):
38
target/arm: Implement ARMv8M's PMSAv8 registers
36
hw/arm/virt-acpi-build: Add VIOT table for virtio-iommu
39
target/arm: Implement new PMSAv8 behaviour
37
hw/arm/virt: Remove device tree restriction for virtio-iommu
40
target/arm: Add state field, feature bit and migration for v8M secure state
38
hw/arm/virt: Reject instantiation of multiple IOMMUs
41
target/arm: Register second AddressSpace for secure v8M CPUs
39
hw/arm/virt: Use object_property_set instead of qdev_prop_set
42
target/arm: Add MMU indexes for secure v8M
40
tests/acpi: allow updates of VIOT expected data files
43
target/arm: Make BASEPRI register banked for v8M
41
tests/acpi: add test case for VIOT
44
target/arm: Make PRIMASK register banked for v8M
42
tests/acpi: add expected blobs for VIOT test on q35 machine
45
target/arm: Make FAULTMASK register banked for v8M
43
tests/acpi: add expected blob for VIOT test on virt machine
46
target/arm: Make CONTROL register banked for v8M
47
nvic: Add NS alias SCS region
48
target/arm: Make VTOR register banked for v8M
49
target/arm: Make MPU_MAIR0, MPU_MAIR1 registers banked for v8M
50
target/arm: Make MPU_RBAR, MPU_RLAR banked for v8M
51
target/arm: Make MPU_RNR register banked for v8M
52
target/arm: Make MPU_CTRL register banked for v8M
53
target/arm: Make CCR register banked for v8M
54
target/arm: Make MMFAR banked for v8M
55
target/arm: Make CFSR register banked for v8M
56
target/arm: Move regime_is_secure() to target/arm/internals.h
57
target/arm: Implement BXNS, and banked stack pointers
58
boards.h: Define new flag ignore_memory_transaction_failures
59
hw/arm: Set ignore_memory_transaction_failures for most ARM boards
60
target/arm: Implement new do_transaction_failed hook
61
44
62
Portia Stephens (1):
45
Joel Stanley (4):
63
target/arm: Add Jazelle feature
46
docs: aspeed: Add new boards
47
docs: aspeed: Update OpenBMC image URL
48
docs: aspeed: Give an example of booting a kernel
49
docs: aspeed: ADC is now modelled
64
50
65
Thomas Huth (1):
51
Olivier Hériveaux (1):
66
hw/arm/allwinner-a10: Mark the allwinner-a10 device with user_creatable = false
52
Fix STM32F2XX USART data register readout
67
53
68
include/hw/boards.h | 11 ++
54
Patrick Venture (1):
69
include/hw/intc/armv7m_nvic.h | 1 +
55
hw/net: npcm7xx_emc fix missing queue_flush
70
include/qom/cpu.h | 7 +-
71
target/arm/cpu.h | 101 ++++++++++++--
72
target/arm/helper.h | 2 +
73
target/arm/internals.h | 36 +++++
74
target/arm/translate.h | 1 +
75
hw/arm/allwinner-a10.c | 2 +
76
hw/arm/armv7m.c | 16 +--
77
hw/arm/aspeed.c | 3 +
78
hw/arm/collie.c | 1 +
79
hw/arm/cubieboard.c | 1 +
80
hw/arm/digic_boards.c | 1 +
81
hw/arm/exynos4_boards.c | 2 +
82
hw/arm/gumstix.c | 2 +
83
hw/arm/highbank.c | 2 +
84
hw/arm/imx25_pdk.c | 1 +
85
hw/arm/integratorcp.c | 1 +
86
hw/arm/kzm.c | 1 +
87
hw/arm/mainstone.c | 1 +
88
hw/arm/musicpal.c | 1 +
89
hw/arm/netduino2.c | 1 +
90
hw/arm/nseries.c | 2 +
91
hw/arm/omap_sx1.c | 2 +
92
hw/arm/palm.c | 1 +
93
hw/arm/raspi.c | 1 +
94
hw/arm/realview.c | 4 +
95
hw/arm/sabrelite.c | 1 +
96
hw/arm/spitz.c | 4 +
97
hw/arm/stellaris.c | 2 +
98
hw/arm/tosa.c | 1 +
99
hw/arm/versatilepb.c | 2 +
100
hw/arm/vexpress.c | 1 +
101
hw/arm/xilinx_zynq.c | 1 +
102
hw/arm/xlnx-ep108.c | 2 +
103
hw/arm/xlnx-zynqmp.c | 7 +-
104
hw/arm/z2.c | 1 +
105
hw/dma/xilinx_axidma.c | 16 +--
106
hw/intc/arm_gicv3_its_kvm.c | 19 +--
107
hw/intc/armv7m_nvic.c | 291 ++++++++++++++++++++++++++++++++------
108
hw/net/xilinx_axienet.c | 16 +--
109
qom/cpu.c | 16 +++
110
target/arm/cpu.c | 88 +++++++++---
111
target/arm/helper.c | 315 +++++++++++++++++++++++++++++++++---------
112
target/arm/machine.c | 105 ++++++++++++--
113
target/arm/op_helper.c | 43 ++++++
114
target/arm/translate.c | 54 +++++++-
115
scripts/device-crash-test | 1 -
116
48 files changed, 978 insertions(+), 213 deletions(-)
117
56
57
Peter Maydell (6):
58
target/i386: Use assert() to sanity-check b1 in SSE decode
59
include/hw/i386: Don't include qemu-common.h in .h files
60
target/hexagon/cpu.h: don't include qemu-common.h
61
target/rx/cpu.h: Don't include qemu-common.h
62
hw/arm: Don't include qemu-common.h unnecessarily
63
target/arm: Correct calculation of tlb range invalidate length
64
65
Philippe Mathieu-Daudé (2):
66
hw/intc/arm_gicv3: Extract gicv3_set_gicv3state from arm_gicv3_cpuif.c
67
hw/intc/arm_gicv3: Introduce CONFIG_ARM_GIC_TCG Kconfig selector
68
69
Richard Henderson (10):
70
target/arm: Hoist pc_next to a local variable in aarch64_tr_translate_insn
71
target/arm: Hoist pc_next to a local variable in arm_tr_translate_insn
72
target/arm: Hoist pc_next to a local variable in thumb_tr_translate_insn
73
target/arm: Split arm_pre_translate_insn
74
target/arm: Advance pc for arch single-step exception
75
target/arm: Split compute_fsr_fsc out of arm_deliver_fault
76
target/arm: Take an exception if PC is misaligned
77
target/arm: Assert thumb pc is aligned
78
target/arm: Suppress bp for exceptions with more priority
79
tests/tcg: Add arm and aarch64 pc alignment tests
80
81
docs/system/arm/aspeed.rst | 26 ++++++++++++----
82
include/hw/i386/microvm.h | 1 -
83
include/hw/i386/x86.h | 1 -
84
target/arm/helper.h | 1 +
85
target/arm/syndrome.h | 5 +++
86
target/hexagon/cpu.h | 1 -
87
target/rx/cpu.h | 1 -
88
hw/arm/boot.c | 1 -
89
hw/arm/digic_boards.c | 1 -
90
hw/arm/highbank.c | 1 -
91
hw/arm/npcm7xx_boards.c | 1 -
92
hw/arm/sbsa-ref.c | 1 -
93
hw/arm/stm32f405_soc.c | 1 -
94
hw/arm/vexpress.c | 1 -
95
hw/arm/virt-acpi-build.c | 7 +++++
96
hw/arm/virt.c | 21 ++++++-------
97
hw/char/stm32f2xx_usart.c | 3 +-
98
hw/intc/arm_gicv3.c | 2 +-
99
hw/intc/arm_gicv3_cpuif.c | 10 +-----
100
hw/intc/arm_gicv3_cpuif_common.c | 22 +++++++++++++
101
hw/intc/arm_gicv3_its.c | 39 +++++++++++++++--------
102
hw/net/npcm7xx_emc.c | 18 +++++------
103
hw/virtio/virtio-iommu-pci.c | 12 ++------
104
linux-user/aarch64/cpu_loop.c | 46 ++++++++++++++++------------
105
linux-user/hexagon/cpu_loop.c | 1 +
106
target/arm/debug_helper.c | 23 ++++++++++++++
107
target/arm/gdbstub.c | 9 ++++--
108
target/arm/helper.c | 6 ++--
109
target/arm/machine.c | 10 ++++++
110
target/arm/tlb_helper.c | 63 ++++++++++++++++++++++++++++----------
111
target/arm/translate-a64.c | 23 ++++++++++++--
112
target/arm/translate.c | 58 ++++++++++++++++++++++++++---------
113
target/i386/tcg/translate.c | 12 ++------
114
tests/qtest/bios-tables-test.c | 38 +++++++++++++++++++++++
115
tests/tcg/aarch64/pcalign-a64.c | 37 ++++++++++++++++++++++
116
tests/tcg/arm/pcalign-a32.c | 46 ++++++++++++++++++++++++++++
117
hw/arm/Kconfig | 1 +
118
hw/intc/Kconfig | 5 +++
119
hw/intc/meson.build | 11 ++++---
120
tests/data/acpi/q35/DSDT.viot | Bin 0 -> 9398 bytes
121
tests/data/acpi/q35/VIOT.viot | Bin 0 -> 112 bytes
122
tests/data/acpi/virt/VIOT | Bin 0 -> 88 bytes
123
tests/tcg/aarch64/Makefile.target | 4 +--
124
tests/tcg/arm/Makefile.target | 4 +++
125
44 files changed, 429 insertions(+), 145 deletions(-)
126
create mode 100644 hw/intc/arm_gicv3_cpuif_common.c
127
create mode 100644 tests/tcg/aarch64/pcalign-a64.c
128
create mode 100644 tests/tcg/arm/pcalign-a32.c
129
create mode 100644 tests/data/acpi/q35/DSDT.viot
130
create mode 100644 tests/data/acpi/q35/VIOT.viot
131
create mode 100644 tests/data/acpi/virt/VIOT
132
diff view generated by jsdifflib
1
Make the MPU_CTRL register banked if v8M security extensions are
1
From: Alex Bennée <alex.bennee@linaro.org>
2
enabled.
3
2
3
While trying to debug a GIC ITS failure I saw some guest errors that
4
had poor formatting as well as leaving me confused as to what failed.
5
As most of the checks aren't possible without a valid dte split that
6
check apart and then check the other conditions in steps. This avoids
7
us relying on undefined data.
8
9
I still get a failure with the current kvm-unit-tests but at least I
10
know (partially) why now:
11
12
Exception return from AArch64 EL1 to AArch64 EL1 PC 0x40080588
13
PASS: gicv3: its-trigger: inv/invall: dev2/eventid=20 now triggers an LPI
14
ITS: MAPD devid=2 size = 0x8 itt=0x40430000 valid=0
15
INT dev_id=2 event_id=20
16
process_its_cmd: invalid command attributes: invalid dte: 0 for 2 (MEM_TX: 0)
17
PASS: gicv3: its-trigger: mapd valid=false: no LPI after device unmap
18
SUMMARY: 6 tests, 1 unexpected failures
19
20
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
22
Message-id: 20211112170454.3158925-1-alex.bennee@linaro.org
23
Cc: Shashi Mallela <shashi.mallela@linaro.org>
24
Cc: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 1503414539-28762-16-git-send-email-peter.maydell@linaro.org
7
---
26
---
8
target/arm/cpu.h | 2 +-
27
hw/intc/arm_gicv3_its.c | 39 +++++++++++++++++++++++++++------------
9
hw/intc/armv7m_nvic.c | 9 +++++----
28
1 file changed, 27 insertions(+), 12 deletions(-)
10
target/arm/helper.c | 5 +++--
11
target/arm/machine.c | 3 ++-
12
4 files changed, 11 insertions(+), 8 deletions(-)
13
29
14
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
30
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
15
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.h
32
--- a/hw/intc/arm_gicv3_its.c
17
+++ b/target/arm/cpu.h
33
+++ b/hw/intc/arm_gicv3_its.c
18
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
34
@@ -XXX,XX +XXX,XX @@ static bool process_its_cmd(GICv3ITSState *s, uint64_t value, uint32_t offset,
19
uint32_t dfsr; /* Debug Fault Status Register */
35
if (res != MEMTX_OK) {
20
uint32_t mmfar; /* MemManage Fault Address */
36
return result;
21
uint32_t bfar; /* BusFault Address */
22
- unsigned mpu_ctrl; /* MPU_CTRL */
23
+ unsigned mpu_ctrl[2]; /* MPU_CTRL */
24
int exception;
25
uint32_t primask[2];
26
uint32_t faultmask[2];
27
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/intc/armv7m_nvic.c
30
+++ b/hw/intc/armv7m_nvic.c
31
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
32
return cpu->pmsav7_dregion << 8;
33
break;
34
case 0xd94: /* MPU_CTRL */
35
- return cpu->env.v7m.mpu_ctrl;
36
+ return cpu->env.v7m.mpu_ctrl[attrs.secure];
37
case 0xd98: /* MPU_RNR */
38
return cpu->env.pmsav7.rnr[attrs.secure];
39
case 0xd9c: /* MPU_RBAR */
40
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
41
qemu_log_mask(LOG_GUEST_ERROR, "MPU_CTRL: HFNMIENA and !ENABLE is "
42
"UNPREDICTABLE\n");
43
}
37
}
44
- cpu->env.v7m.mpu_ctrl = value & (R_V7M_MPU_CTRL_ENABLE_MASK |
38
+ } else {
45
- R_V7M_MPU_CTRL_HFNMIENA_MASK |
39
+ qemu_log_mask(LOG_GUEST_ERROR,
46
- R_V7M_MPU_CTRL_PRIVDEFENA_MASK);
40
+ "%s: invalid command attributes: "
47
+ cpu->env.v7m.mpu_ctrl[attrs.secure]
41
+ "invalid dte: %"PRIx64" for %d (MEM_TX: %d)\n",
48
+ = value & (R_V7M_MPU_CTRL_ENABLE_MASK |
42
+ __func__, dte, devid, res);
49
+ R_V7M_MPU_CTRL_HFNMIENA_MASK |
43
+ return result;
50
+ R_V7M_MPU_CTRL_PRIVDEFENA_MASK);
51
tlb_flush(CPU(cpu));
52
break;
53
case 0xd98: /* MPU_RNR */
54
diff --git a/target/arm/helper.c b/target/arm/helper.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/target/arm/helper.c
57
+++ b/target/arm/helper.c
58
@@ -XXX,XX +XXX,XX @@ static inline bool regime_translation_disabled(CPUARMState *env,
59
ARMMMUIdx mmu_idx)
60
{
61
if (arm_feature(env, ARM_FEATURE_M)) {
62
- switch (env->v7m.mpu_ctrl &
63
+ switch (env->v7m.mpu_ctrl[regime_is_secure(env, mmu_idx)] &
64
(R_V7M_MPU_CTRL_ENABLE_MASK | R_V7M_MPU_CTRL_HFNMIENA_MASK)) {
65
case R_V7M_MPU_CTRL_ENABLE_MASK:
66
/* Enabled, but not for HardFault and NMI */
67
@@ -XXX,XX +XXX,XX @@ static bool pmsav7_use_background_region(ARMCPU *cpu,
68
}
44
}
69
45
70
if (arm_feature(env, ARM_FEATURE_M)) {
46
- if ((devid > s->dt.maxids.max_devids) || !dte_valid || !ite_valid ||
71
- return env->v7m.mpu_ctrl & R_V7M_MPU_CTRL_PRIVDEFENA_MASK;
47
- !cte_valid || (eventid > max_eventid)) {
72
+ return env->v7m.mpu_ctrl[regime_is_secure(env, mmu_idx)]
48
+
73
+ & R_V7M_MPU_CTRL_PRIVDEFENA_MASK;
49
+ /*
50
+ * In this implementation, in case of guest errors we ignore the
51
+ * command and move onto the next command in the queue.
52
+ */
53
+ if (devid > s->dt.maxids.max_devids) {
54
qemu_log_mask(LOG_GUEST_ERROR,
55
- "%s: invalid command attributes "
56
- "devid %d or eventid %d or invalid dte %d or"
57
- "invalid cte %d or invalid ite %d\n",
58
- __func__, devid, eventid, dte_valid, cte_valid,
59
- ite_valid);
60
- /*
61
- * in this implementation, in case of error
62
- * we ignore this command and move onto the next
63
- * command in the queue
64
- */
65
+ "%s: invalid command attributes: devid %d>%d",
66
+ __func__, devid, s->dt.maxids.max_devids);
67
+
68
+ } else if (!dte_valid || !ite_valid || !cte_valid) {
69
+ qemu_log_mask(LOG_GUEST_ERROR,
70
+ "%s: invalid command attributes: "
71
+ "dte: %s, ite: %s, cte: %s\n",
72
+ __func__,
73
+ dte_valid ? "valid" : "invalid",
74
+ ite_valid ? "valid" : "invalid",
75
+ cte_valid ? "valid" : "invalid");
76
+ } else if (eventid > max_eventid) {
77
+ qemu_log_mask(LOG_GUEST_ERROR,
78
+ "%s: invalid command attributes: eventid %d > %d\n",
79
+ __func__, eventid, max_eventid);
74
} else {
80
} else {
75
return regime_sctlr(env, mmu_idx) & SCTLR_BR;
81
/*
76
}
82
* Current implementation only supports rdbase == procnum
77
diff --git a/target/arm/machine.c b/target/arm/machine.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/target/arm/machine.c
80
+++ b/target/arm/machine.c
81
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m = {
82
VMSTATE_UINT32(env.v7m.dfsr, ARMCPU),
83
VMSTATE_UINT32(env.v7m.mmfar, ARMCPU),
84
VMSTATE_UINT32(env.v7m.bfar, ARMCPU),
85
- VMSTATE_UINT32(env.v7m.mpu_ctrl, ARMCPU),
86
+ VMSTATE_UINT32(env.v7m.mpu_ctrl[M_REG_NS], ARMCPU),
87
VMSTATE_INT32(env.v7m.exception, ARMCPU),
88
VMSTATE_END_OF_LIST()
89
},
90
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
91
0, vmstate_info_uint32, uint32_t),
92
VMSTATE_UINT32(env.pmsav7.rnr[M_REG_S], ARMCPU),
93
VMSTATE_VALIDATE("secure MPU_RNR is valid", s_rnr_vmstate_validate),
94
+ VMSTATE_UINT32(env.v7m.mpu_ctrl[M_REG_S], ARMCPU),
95
VMSTATE_END_OF_LIST()
96
}
97
};
98
--
83
--
99
2.7.4
84
2.25.1
100
85
101
86
diff view generated by jsdifflib
1
From: Fam Zheng <famz@redhat.com>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
Signed-off-by: Fam Zheng <famz@redhat.com>
3
Add X11, FP5280G2, G220A, Rainier and Fuji. Mention that Swift will be
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
removed in v7.0.
5
Message-id: 20170905131149.10669-7-famz@redhat.com
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Joel Stanley <joel@jms.id.au>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Message-id: 20211117065752.330632-2-joel@jms.id.au
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
10
---
9
hw/dma/xilinx_axidma.c | 16 ++++------------
11
docs/system/arm/aspeed.rst | 7 ++++++-
10
1 file changed, 4 insertions(+), 12 deletions(-)
12
1 file changed, 6 insertions(+), 1 deletion(-)
11
13
12
diff --git a/hw/dma/xilinx_axidma.c b/hw/dma/xilinx_axidma.c
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/dma/xilinx_axidma.c
16
--- a/docs/system/arm/aspeed.rst
15
+++ b/hw/dma/xilinx_axidma.c
17
+++ b/docs/system/arm/aspeed.rst
16
@@ -XXX,XX +XXX,XX @@ static void xilinx_axidma_init(Object *obj)
18
@@ -XXX,XX +XXX,XX @@ AST2400 SoC based machines :
17
XilinxAXIDMA *s = XILINX_AXI_DMA(obj);
19
18
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
20
- ``palmetto-bmc`` OpenPOWER Palmetto POWER8 BMC
19
21
- ``quanta-q71l-bmc`` OpenBMC Quanta BMC
20
- object_property_add_link(obj, "axistream-connected", TYPE_STREAM_SLAVE,
22
+- ``supermicrox11-bmc`` Supermicro X11 BMC
21
- (Object **)&s->tx_data_dev,
23
22
- qdev_prop_allow_set_link_before_realize,
24
AST2500 SoC based machines :
23
- OBJ_PROP_LINK_UNREF_ON_RELEASE,
25
24
- &error_abort);
26
@@ -XXX,XX +XXX,XX @@ AST2500 SoC based machines :
25
- object_property_add_link(obj, "axistream-control-connected",
27
- ``romulus-bmc`` OpenPOWER Romulus POWER9 BMC
26
- TYPE_STREAM_SLAVE,
28
- ``witherspoon-bmc`` OpenPOWER Witherspoon POWER9 BMC
27
- (Object **)&s->tx_control_dev,
29
- ``sonorapass-bmc`` OCP SonoraPass BMC
28
- qdev_prop_allow_set_link_before_realize,
30
-- ``swift-bmc`` OpenPOWER Swift BMC POWER9
29
- OBJ_PROP_LINK_UNREF_ON_RELEASE,
31
+- ``swift-bmc`` OpenPOWER Swift BMC POWER9 (to be removed in v7.0)
30
- &error_abort);
32
+- ``fp5280g2-bmc`` Inspur FP5280G2 BMC
31
-
33
+- ``g220a-bmc`` Bytedance G220A BMC
32
object_initialize(&s->rx_data_dev, sizeof(s->rx_data_dev),
34
33
TYPE_XILINX_AXI_DMA_DATA_STREAM);
35
AST2600 SoC based machines :
34
object_initialize(&s->rx_control_dev, sizeof(s->rx_control_dev),
36
35
@@ -XXX,XX +XXX,XX @@ static void xilinx_axidma_init(Object *obj)
37
- ``ast2600-evb`` Aspeed AST2600 Evaluation board (Cortex-A7)
36
38
- ``tacoma-bmc`` OpenPOWER Witherspoon POWER9 AST2600 BMC
37
static Property axidma_properties[] = {
39
+- ``rainier-bmc`` IBM Rainier POWER10 BMC
38
DEFINE_PROP_UINT32("freqhz", XilinxAXIDMA, freqhz, 50000000),
40
+- ``fuji-bmc`` Facebook Fuji BMC
39
+ DEFINE_PROP_LINK("axistream-connected", XilinxAXIDMA,
41
40
+ tx_data_dev, TYPE_STREAM_SLAVE, StreamSlave *),
42
Supported devices
41
+ DEFINE_PROP_LINK("axistream-control-connected", XilinxAXIDMA,
43
-----------------
42
+ tx_control_dev, TYPE_STREAM_SLAVE, StreamSlave *),
43
DEFINE_PROP_END_OF_LIST(),
44
};
45
46
--
44
--
47
2.7.4
45
2.25.1
48
46
49
47
diff view generated by jsdifflib
1
From: Fam Zheng <famz@redhat.com>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
Signed-off-by: Fam Zheng <famz@redhat.com>
3
This is the latest URL for the OpenBMC CI. The old URL still works, but
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
redirects.
5
Message-id: 20170905131149.10669-6-famz@redhat.com
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Signed-off-by: Joel Stanley <joel@jms.id.au>
8
Message-id: 20211117065752.330632-3-joel@jms.id.au
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
10
---
9
hw/net/xilinx_axienet.c | 16 ++++------------
11
docs/system/arm/aspeed.rst | 2 +-
10
1 file changed, 4 insertions(+), 12 deletions(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
11
13
12
diff --git a/hw/net/xilinx_axienet.c b/hw/net/xilinx_axienet.c
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/net/xilinx_axienet.c
16
--- a/docs/system/arm/aspeed.rst
15
+++ b/hw/net/xilinx_axienet.c
17
+++ b/docs/system/arm/aspeed.rst
16
@@ -XXX,XX +XXX,XX @@ static void xilinx_enet_init(Object *obj)
18
@@ -XXX,XX +XXX,XX @@ The Aspeed machines can be started using the ``-kernel`` option to
17
XilinxAXIEnet *s = XILINX_AXI_ENET(obj);
19
load a Linux kernel or from a firmware. Images can be downloaded from
18
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
20
the OpenBMC jenkins :
19
21
20
- object_property_add_link(obj, "axistream-connected", TYPE_STREAM_SLAVE,
22
- https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/distro=ubuntu,label=docker-builder
21
- (Object **) &s->tx_data_dev,
23
+ https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/
22
- qdev_prop_allow_set_link_before_realize,
24
23
- OBJ_PROP_LINK_UNREF_ON_RELEASE,
25
or directly from the OpenBMC GitHub release repository :
24
- &error_abort);
25
- object_property_add_link(obj, "axistream-control-connected",
26
- TYPE_STREAM_SLAVE,
27
- (Object **) &s->tx_control_dev,
28
- qdev_prop_allow_set_link_before_realize,
29
- OBJ_PROP_LINK_UNREF_ON_RELEASE,
30
- &error_abort);
31
-
32
object_initialize(&s->rx_data_dev, sizeof(s->rx_data_dev),
33
TYPE_XILINX_AXI_ENET_DATA_STREAM);
34
object_initialize(&s->rx_control_dev, sizeof(s->rx_control_dev),
35
@@ -XXX,XX +XXX,XX @@ static Property xilinx_enet_properties[] = {
36
DEFINE_PROP_UINT32("rxmem", XilinxAXIEnet, c_rxmem, 0x1000),
37
DEFINE_PROP_UINT32("txmem", XilinxAXIEnet, c_txmem, 0x1000),
38
DEFINE_NIC_PROPERTIES(XilinxAXIEnet, conf),
39
+ DEFINE_PROP_LINK("axistream-connected", XilinxAXIEnet,
40
+ tx_data_dev, TYPE_STREAM_SLAVE, StreamSlave *),
41
+ DEFINE_PROP_LINK("axistream-control-connected", XilinxAXIEnet,
42
+ tx_control_dev, TYPE_STREAM_SLAVE, StreamSlave *),
43
DEFINE_PROP_END_OF_LIST(),
44
};
45
26
46
--
27
--
47
2.7.4
28
2.25.1
48
29
49
30
diff view generated by jsdifflib
New patch
1
From: Joel Stanley <joel@jms.id.au>
1
2
3
A common use case for the ASPEED machine is to boot a Linux kernel.
4
Provide a full example command line.
5
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Signed-off-by: Joel Stanley <joel@jms.id.au>
8
Message-id: 20211117065752.330632-4-joel@jms.id.au
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
docs/system/arm/aspeed.rst | 15 ++++++++++++---
12
1 file changed, 12 insertions(+), 3 deletions(-)
13
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
15
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/system/arm/aspeed.rst
17
+++ b/docs/system/arm/aspeed.rst
18
@@ -XXX,XX +XXX,XX @@ Missing devices
19
Boot options
20
------------
21
22
-The Aspeed machines can be started using the ``-kernel`` option to
23
-load a Linux kernel or from a firmware. Images can be downloaded from
24
-the OpenBMC jenkins :
25
+The Aspeed machines can be started using the ``-kernel`` and ``-dtb`` options
26
+to load a Linux kernel or from a firmware. Images can be downloaded from the
27
+OpenBMC jenkins :
28
29
https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/
30
31
@@ -XXX,XX +XXX,XX @@ or directly from the OpenBMC GitHub release repository :
32
33
https://github.com/openbmc/openbmc/releases
34
35
+To boot a kernel directly from a Linux build tree:
36
+
37
+.. code-block:: bash
38
+
39
+ $ qemu-system-arm -M ast2600-evb -nographic \
40
+ -kernel arch/arm/boot/zImage \
41
+ -dtb arch/arm/boot/dts/aspeed-ast2600-evb.dtb \
42
+ -initrd rootfs.cpio
43
+
44
The image should be attached as an MTD drive. Run :
45
46
.. code-block:: bash
47
--
48
2.25.1
49
50
diff view generated by jsdifflib
New patch
1
From: Joel Stanley <joel@jms.id.au>
1
2
3
Move it to the supported list.
4
5
Signed-off-by: Joel Stanley <joel@jms.id.au>
6
Message-id: 20211117065752.330632-5-joel@jms.id.au
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
docs/system/arm/aspeed.rst | 2 +-
10
1 file changed, 1 insertion(+), 1 deletion(-)
11
12
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
13
index XXXXXXX..XXXXXXX 100644
14
--- a/docs/system/arm/aspeed.rst
15
+++ b/docs/system/arm/aspeed.rst
16
@@ -XXX,XX +XXX,XX @@ Supported devices
17
* Front LEDs (PCA9552 on I2C bus)
18
* LPC Peripheral Controller (a subset of subdevices are supported)
19
* Hash/Crypto Engine (HACE) - Hash support only. TODO: HMAC and RSA
20
+ * ADC
21
22
23
Missing devices
24
---------------
25
26
* Coprocessor support
27
- * ADC (out of tree implementation)
28
* PWM and Fan Controller
29
* Slave GPIO Controller
30
* Super I/O Controller
31
--
32
2.25.1
33
34
diff view generated by jsdifflib
1
Define a new MachineClass field ignore_memory_transaction_failures.
1
From: Olivier Hériveaux <olivier.heriveaux@ledger.fr>
2
If this is flag is true then the CPU will ignore memory transaction
3
failures which should cause the CPU to take an exception due to an
4
access to an unassigned physical address; the transaction will
5
instead return zero (for a read) or be ignored (for a write). This
6
should be set only by legacy board models which rely on the old
7
RAZ/WI behaviour for handling devices that QEMU does not yet model.
8
New board models should instead use "unimplemented-device" for all
9
memory ranges where the guest will attempt to probe for a device that
10
QEMU doesn't implement and a stub device is required.
11
2
12
We need this for ARM boards, where we're about to implement support for
3
Fix issue where the data register may be overwritten by next character
13
generating external aborts on memory transaction failures. Too many
4
reception before being read and returned.
14
of our legacy board models rely on the RAZ/WI behaviour and we
15
would break currently working guests when their "probe for device"
16
code provoked an external abort rather than a RAZ.
17
5
6
Signed-off-by: Olivier Hériveaux <olivier.heriveaux@ledger.fr>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20211128120723.4053-1-olivier.heriveaux@ledger.fr
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
21
Message-id: 1504626814-23124-2-git-send-email-peter.maydell@linaro.org
22
---
11
---
23
include/hw/boards.h | 11 +++++++++++
12
hw/char/stm32f2xx_usart.c | 3 ++-
24
include/qom/cpu.h | 7 ++++++-
13
1 file changed, 2 insertions(+), 1 deletion(-)
25
qom/cpu.c | 16 ++++++++++++++++
26
3 files changed, 33 insertions(+), 1 deletion(-)
27
14
28
diff --git a/include/hw/boards.h b/include/hw/boards.h
15
diff --git a/hw/char/stm32f2xx_usart.c b/hw/char/stm32f2xx_usart.c
29
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
30
--- a/include/hw/boards.h
17
--- a/hw/char/stm32f2xx_usart.c
31
+++ b/include/hw/boards.h
18
+++ b/hw/char/stm32f2xx_usart.c
32
@@ -XXX,XX +XXX,XX @@ typedef struct {
19
@@ -XXX,XX +XXX,XX @@ static uint64_t stm32f2xx_usart_read(void *opaque, hwaddr addr,
33
* size than the target architecture's minimum. (Attempting to create
20
return retvalue;
34
* such a CPU will fail.) Note that changing this is a migration
21
case USART_DR:
35
* compatibility break for the machine.
22
DB_PRINT("Value: 0x%" PRIx32 ", %c\n", s->usart_dr, (char) s->usart_dr);
36
+ * @ignore_memory_transaction_failures:
23
+ retvalue = s->usart_dr & 0x3FF;
37
+ * If this is flag is true then the CPU will ignore memory transaction
24
s->usart_sr &= ~USART_SR_RXNE;
38
+ * failures which should cause the CPU to take an exception due to an
25
qemu_chr_fe_accept_input(&s->chr);
39
+ * access to an unassigned physical address; the transaction will instead
26
qemu_set_irq(s->irq, 0);
40
+ * return zero (for a read) or be ignored (for a write). This should be
27
- return s->usart_dr & 0x3FF;
41
+ * set only by legacy board models which rely on the old RAZ/WI behaviour
28
+ return retvalue;
42
+ * for handling devices that QEMU does not yet model. New board models
29
case USART_BRR:
43
+ * should instead use "unimplemented-device" for all memory ranges where
30
return s->usart_brr;
44
+ * the guest will attempt to probe for a device that QEMU doesn't
31
case USART_CR1:
45
+ * implement and a stub device is required.
46
*/
47
struct MachineClass {
48
/*< private >*/
49
@@ -XXX,XX +XXX,XX @@ struct MachineClass {
50
bool rom_file_has_mr;
51
int minimum_page_bits;
52
bool has_hotpluggable_cpus;
53
+ bool ignore_memory_transaction_failures;
54
int numa_mem_align_shift;
55
void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
56
int nb_nodes, ram_addr_t size);
57
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
58
index XXXXXXX..XXXXXXX 100644
59
--- a/include/qom/cpu.h
60
+++ b/include/qom/cpu.h
61
@@ -XXX,XX +XXX,XX @@ struct qemu_work_item;
62
* @trace_dstate_delayed: Delayed changes to trace_dstate (includes all changes
63
* to @trace_dstate).
64
* @trace_dstate: Dynamic tracing state of events for this vCPU (bitmask).
65
+ * @ignore_memory_transaction_failures: Cached copy of the MachineState
66
+ * flag of the same name: allows the board to suppress calling of the
67
+ * CPU do_transaction_failed hook function.
68
*
69
* State of one CPU core or thread.
70
*/
71
@@ -XXX,XX +XXX,XX @@ struct CPUState {
72
*/
73
bool throttle_thread_scheduled;
74
75
+ bool ignore_memory_transaction_failures;
76
+
77
/* Note that this is accessed at the start of every TB via a negative
78
offset from AREG0. Leave this field at the end so as to make the
79
(absolute value) offset as small as possible. This reduces code
80
@@ -XXX,XX +XXX,XX @@ static inline void cpu_transaction_failed(CPUState *cpu, hwaddr physaddr,
81
{
82
CPUClass *cc = CPU_GET_CLASS(cpu);
83
84
- if (cc->do_transaction_failed) {
85
+ if (!cpu->ignore_memory_transaction_failures && cc->do_transaction_failed) {
86
cc->do_transaction_failed(cpu, physaddr, addr, size, access_type,
87
mmu_idx, attrs, response, retaddr);
88
}
89
diff --git a/qom/cpu.c b/qom/cpu.c
90
index XXXXXXX..XXXXXXX 100644
91
--- a/qom/cpu.c
92
+++ b/qom/cpu.c
93
@@ -XXX,XX +XXX,XX @@
94
#include "exec/cpu-common.h"
95
#include "qemu/error-report.h"
96
#include "sysemu/sysemu.h"
97
+#include "hw/boards.h"
98
#include "hw/qdev-properties.h"
99
#include "trace-root.h"
100
101
@@ -XXX,XX +XXX,XX @@ static void cpu_common_parse_features(const char *typename, char *features,
102
static void cpu_common_realizefn(DeviceState *dev, Error **errp)
103
{
104
CPUState *cpu = CPU(dev);
105
+ Object *machine = qdev_get_machine();
106
+
107
+ /* qdev_get_machine() can return something that's not TYPE_MACHINE
108
+ * if this is one of the user-only emulators; in that case there's
109
+ * no need to check the ignore_memory_transaction_failures board flag.
110
+ */
111
+ if (object_dynamic_cast(machine, TYPE_MACHINE)) {
112
+ ObjectClass *oc = object_get_class(machine);
113
+ MachineClass *mc = MACHINE_CLASS(oc);
114
+
115
+ if (mc) {
116
+ cpu->ignore_memory_transaction_failures =
117
+ mc->ignore_memory_transaction_failures;
118
+ }
119
+ }
120
121
if (dev->hotplugged) {
122
cpu_synchronize_post_init(cpu);
123
--
32
--
124
2.7.4
33
2.25.1
125
34
126
35
diff view generated by jsdifflib
1
Make the CFSR register banked if v8M security extensions are enabled.
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
Not all the bits in this register are banked: the BFSR
3
gicv3_set_gicv3state() is used by arm_gicv3_common.c in
4
bits [15:8] are shared between S and NS, and we store them
4
arm_gicv3_common_realize(). Since we want to restrict
5
in the NS copy of the register.
5
arm_gicv3_cpuif.c to TCG, extract gicv3_set_gicv3state()
6
to a new file. Add this file to the meson 'specific'
7
source set, since it needs access to "cpu.h".
6
8
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20211115223619.2599282-2-philmd@redhat.com
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 1503414539-28762-19-git-send-email-peter.maydell@linaro.org
10
---
13
---
11
target/arm/cpu.h | 7 ++++++-
14
hw/intc/arm_gicv3_cpuif.c | 10 +---------
12
hw/intc/armv7m_nvic.c | 15 +++++++++++++--
15
hw/intc/arm_gicv3_cpuif_common.c | 22 ++++++++++++++++++++++
13
target/arm/helper.c | 18 +++++++++---------
16
hw/intc/meson.build | 1 +
14
target/arm/machine.c | 3 ++-
17
3 files changed, 24 insertions(+), 9 deletions(-)
15
4 files changed, 30 insertions(+), 13 deletions(-)
18
create mode 100644 hw/intc/arm_gicv3_cpuif_common.c
16
19
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
20
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
18
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
22
--- a/hw/intc/arm_gicv3_cpuif.c
20
+++ b/target/arm/cpu.h
23
+++ b/hw/intc/arm_gicv3_cpuif.c
21
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
24
@@ -XXX,XX +XXX,XX @@
22
uint32_t basepri[2];
25
/*
23
uint32_t control[2];
26
- * ARM Generic Interrupt Controller v3
24
uint32_t ccr[2]; /* Configuration and Control */
27
+ * ARM Generic Interrupt Controller v3 (emulation)
25
- uint32_t cfsr; /* Configurable Fault Status */
28
*
26
+ uint32_t cfsr[2]; /* Configurable Fault Status */
29
* Copyright (c) 2016 Linaro Limited
27
uint32_t hfsr; /* HardFault Status */
30
* Written by Peter Maydell
28
uint32_t dfsr; /* Debug Fault Status Register */
31
@@ -XXX,XX +XXX,XX @@
29
uint32_t mmfar[2]; /* MemManage Fault Address */
32
#include "hw/irq.h"
30
@@ -XXX,XX +XXX,XX @@ FIELD(V7M_CFSR, NOCP, 16 + 3, 1)
33
#include "cpu.h"
31
FIELD(V7M_CFSR, UNALIGNED, 16 + 8, 1)
34
32
FIELD(V7M_CFSR, DIVBYZERO, 16 + 9, 1)
35
-void gicv3_set_gicv3state(CPUState *cpu, GICv3CPUState *s)
33
36
-{
34
+/* V7M CFSR bit masks covering all of the subregister bits */
37
- ARMCPU *arm_cpu = ARM_CPU(cpu);
35
+FIELD(V7M_CFSR, MMFSR, 0, 8)
38
- CPUARMState *env = &arm_cpu->env;
36
+FIELD(V7M_CFSR, BFSR, 8, 8)
39
-
37
+FIELD(V7M_CFSR, UFSR, 16, 16)
40
- env->gicv3state = (void *)s;
41
-};
42
-
43
static GICv3CPUState *icc_cs_from_env(CPUARMState *env)
44
{
45
return env->gicv3state;
46
diff --git a/hw/intc/arm_gicv3_cpuif_common.c b/hw/intc/arm_gicv3_cpuif_common.c
47
new file mode 100644
48
index XXXXXXX..XXXXXXX
49
--- /dev/null
50
+++ b/hw/intc/arm_gicv3_cpuif_common.c
51
@@ -XXX,XX +XXX,XX @@
52
+/* SPDX-License-Identifier: GPL-2.0-or-later */
53
+/*
54
+ * ARM Generic Interrupt Controller v3
55
+ *
56
+ * Copyright (c) 2016 Linaro Limited
57
+ * Written by Peter Maydell
58
+ *
59
+ * This code is licensed under the GPL, version 2 or (at your option)
60
+ * any later version.
61
+ */
38
+
62
+
39
/* V7M HFSR bits */
63
+#include "qemu/osdep.h"
40
FIELD(V7M_HFSR, VECTTBL, 1, 1)
64
+#include "gicv3_internal.h"
41
FIELD(V7M_HFSR, FORCED, 30, 1)
65
+#include "cpu.h"
42
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
66
+
67
+void gicv3_set_gicv3state(CPUState *cpu, GICv3CPUState *s)
68
+{
69
+ ARMCPU *arm_cpu = ARM_CPU(cpu);
70
+ CPUARMState *env = &arm_cpu->env;
71
+
72
+ env->gicv3state = (void *)s;
73
+};
74
diff --git a/hw/intc/meson.build b/hw/intc/meson.build
43
index XXXXXXX..XXXXXXX 100644
75
index XXXXXXX..XXXXXXX 100644
44
--- a/hw/intc/armv7m_nvic.c
76
--- a/hw/intc/meson.build
45
+++ b/hw/intc/armv7m_nvic.c
77
+++ b/hw/intc/meson.build
46
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
78
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_PMU', if_true: files('xlnx-pmu-iomod-in
47
}
79
48
return val;
80
specific_ss.add(when: 'CONFIG_ALLWINNER_A10_PIC', if_true: files('allwinner-a10-pic.c'))
49
case 0xd28: /* Configurable Fault Status. */
81
specific_ss.add(when: 'CONFIG_APIC', if_true: files('apic.c', 'apic_common.c'))
50
- return cpu->env.v7m.cfsr;
82
+specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif_common.c'))
51
+ /* The BFSR bits [15:8] are shared between security states
83
specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif.c'))
52
+ * and we store them in the NS copy
84
specific_ss.add(when: 'CONFIG_ARM_GIC_KVM', if_true: files('arm_gic_kvm.c'))
53
+ */
85
specific_ss.add(when: ['CONFIG_ARM_GIC_KVM', 'TARGET_AARCH64'], if_true: files('arm_gicv3_kvm.c', 'arm_gicv3_its_kvm.c'))
54
+ val = cpu->env.v7m.cfsr[attrs.secure];
55
+ val |= cpu->env.v7m.cfsr[M_REG_NS] & R_V7M_CFSR_BFSR_MASK;
56
+ return val;
57
case 0xd2c: /* Hard Fault Status. */
58
return cpu->env.v7m.hfsr;
59
case 0xd30: /* Debug Fault Status. */
60
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
61
nvic_irq_update(s);
62
break;
63
case 0xd28: /* Configurable Fault Status. */
64
- cpu->env.v7m.cfsr &= ~value; /* W1C */
65
+ cpu->env.v7m.cfsr[attrs.secure] &= ~value; /* W1C */
66
+ if (attrs.secure) {
67
+ /* The BFSR bits [15:8] are shared between security states
68
+ * and we store them in the NS copy.
69
+ */
70
+ cpu->env.v7m.cfsr[M_REG_NS] &= ~(value & R_V7M_CFSR_BFSR_MASK);
71
+ }
72
break;
73
case 0xd2c: /* Hard Fault Status. */
74
cpu->env.v7m.hfsr &= ~value; /* W1C */
75
diff --git a/target/arm/helper.c b/target/arm/helper.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/arm/helper.c
78
+++ b/target/arm/helper.c
79
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
80
/* Bad exception return: instead of popping the exception
81
* stack, directly take a usage fault on the current stack.
82
*/
83
- env->v7m.cfsr |= R_V7M_CFSR_INVPC_MASK;
84
+ env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
85
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
86
v7m_exception_taken(cpu, type | 0xf0000000);
87
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
88
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
89
if (return_to_handler != arm_v7m_is_handler_mode(env)) {
90
/* Take an INVPC UsageFault by pushing the stack again. */
91
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
92
- env->v7m.cfsr |= R_V7M_CFSR_INVPC_MASK;
93
+ env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
94
v7m_push_stack(cpu);
95
v7m_exception_taken(cpu, type | 0xf0000000);
96
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on new stackframe: "
97
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
98
switch (cs->exception_index) {
99
case EXCP_UDEF:
100
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
101
- env->v7m.cfsr |= R_V7M_CFSR_UNDEFINSTR_MASK;
102
+ env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_UNDEFINSTR_MASK;
103
break;
104
case EXCP_NOCP:
105
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
106
- env->v7m.cfsr |= R_V7M_CFSR_NOCP_MASK;
107
+ env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_NOCP_MASK;
108
break;
109
case EXCP_INVSTATE:
110
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
111
- env->v7m.cfsr |= R_V7M_CFSR_INVSTATE_MASK;
112
+ env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVSTATE_MASK;
113
break;
114
case EXCP_SWI:
115
/* The PC already points to the next instruction. */
116
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
117
case 0x8: /* External Abort */
118
switch (cs->exception_index) {
119
case EXCP_PREFETCH_ABORT:
120
- env->v7m.cfsr |= R_V7M_CFSR_PRECISERR_MASK;
121
+ env->v7m.cfsr[M_REG_NS] |= R_V7M_CFSR_PRECISERR_MASK;
122
qemu_log_mask(CPU_LOG_INT, "...with CFSR.PRECISERR\n");
123
break;
124
case EXCP_DATA_ABORT:
125
- env->v7m.cfsr |=
126
+ env->v7m.cfsr[M_REG_NS] |=
127
(R_V7M_CFSR_IBUSERR_MASK | R_V7M_CFSR_BFARVALID_MASK);
128
env->v7m.bfar = env->exception.vaddress;
129
qemu_log_mask(CPU_LOG_INT,
130
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
131
*/
132
switch (cs->exception_index) {
133
case EXCP_PREFETCH_ABORT:
134
- env->v7m.cfsr |= R_V7M_CFSR_IACCVIOL_MASK;
135
+ env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_IACCVIOL_MASK;
136
qemu_log_mask(CPU_LOG_INT, "...with CFSR.IACCVIOL\n");
137
break;
138
case EXCP_DATA_ABORT:
139
- env->v7m.cfsr |=
140
+ env->v7m.cfsr[env->v7m.secure] |=
141
(R_V7M_CFSR_DACCVIOL_MASK | R_V7M_CFSR_MMARVALID_MASK);
142
env->v7m.mmfar[env->v7m.secure] = env->exception.vaddress;
143
qemu_log_mask(CPU_LOG_INT,
144
diff --git a/target/arm/machine.c b/target/arm/machine.c
145
index XXXXXXX..XXXXXXX 100644
146
--- a/target/arm/machine.c
147
+++ b/target/arm/machine.c
148
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m = {
149
VMSTATE_UINT32(env.v7m.basepri[M_REG_NS], ARMCPU),
150
VMSTATE_UINT32(env.v7m.control[M_REG_NS], ARMCPU),
151
VMSTATE_UINT32(env.v7m.ccr[M_REG_NS], ARMCPU),
152
- VMSTATE_UINT32(env.v7m.cfsr, ARMCPU),
153
+ VMSTATE_UINT32(env.v7m.cfsr[M_REG_NS], ARMCPU),
154
VMSTATE_UINT32(env.v7m.hfsr, ARMCPU),
155
VMSTATE_UINT32(env.v7m.dfsr, ARMCPU),
156
VMSTATE_UINT32(env.v7m.mmfar[M_REG_NS], ARMCPU),
157
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
158
VMSTATE_UINT32(env.v7m.mpu_ctrl[M_REG_S], ARMCPU),
159
VMSTATE_UINT32(env.v7m.ccr[M_REG_S], ARMCPU),
160
VMSTATE_UINT32(env.v7m.mmfar[M_REG_S], ARMCPU),
161
+ VMSTATE_UINT32(env.v7m.cfsr[M_REG_S], ARMCPU),
162
VMSTATE_END_OF_LIST()
163
}
164
};
165
--
86
--
166
2.7.4
87
2.25.1
167
88
168
89
diff view generated by jsdifflib
1
Make the MMFAR register banked if v8M security extensions are
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
enabled.
3
2
3
The TYPE_ARM_GICV3 device is an emulated one. When using
4
KVM, it is recommended to use the TYPE_KVM_ARM_GICV3 device
5
(which uses in-kernel support).
6
7
When using --with-devices-FOO, it is possible to build a
8
binary with a specific set of devices. When this binary is
9
restricted to KVM accelerator, the TYPE_ARM_GICV3 device is
10
irrelevant, and it is desirable to remove it from the binary.
11
12
Therefore introduce the CONFIG_ARM_GIC_TCG Kconfig selector
13
which select the files required to have the TYPE_ARM_GICV3
14
device, but also allowing to de-select this device.
15
16
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Message-id: 20211115223619.2599282-3-philmd@redhat.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 1503414539-28762-18-git-send-email-peter.maydell@linaro.org
7
---
20
---
8
target/arm/cpu.h | 2 +-
21
hw/intc/arm_gicv3.c | 2 +-
9
hw/intc/armv7m_nvic.c | 4 ++--
22
hw/intc/Kconfig | 5 +++++
10
target/arm/helper.c | 4 ++--
23
hw/intc/meson.build | 10 ++++++----
11
target/arm/machine.c | 3 ++-
24
3 files changed, 12 insertions(+), 5 deletions(-)
12
4 files changed, 7 insertions(+), 6 deletions(-)
13
25
14
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
26
diff --git a/hw/intc/arm_gicv3.c b/hw/intc/arm_gicv3.c
15
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.h
28
--- a/hw/intc/arm_gicv3.c
17
+++ b/target/arm/cpu.h
29
+++ b/hw/intc/arm_gicv3.c
18
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
30
@@ -XXX,XX +XXX,XX @@
19
uint32_t cfsr; /* Configurable Fault Status */
31
/*
20
uint32_t hfsr; /* HardFault Status */
32
- * ARM Generic Interrupt Controller v3
21
uint32_t dfsr; /* Debug Fault Status Register */
33
+ * ARM Generic Interrupt Controller v3 (emulation)
22
- uint32_t mmfar; /* MemManage Fault Address */
34
*
23
+ uint32_t mmfar[2]; /* MemManage Fault Address */
35
* Copyright (c) 2015 Huawei.
24
uint32_t bfar; /* BusFault Address */
36
* Copyright (c) 2016 Linaro Limited
25
unsigned mpu_ctrl[2]; /* MPU_CTRL */
37
diff --git a/hw/intc/Kconfig b/hw/intc/Kconfig
26
int exception;
27
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
28
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/intc/armv7m_nvic.c
39
--- a/hw/intc/Kconfig
30
+++ b/hw/intc/armv7m_nvic.c
40
+++ b/hw/intc/Kconfig
31
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
41
@@ -XXX,XX +XXX,XX @@ config APIC
32
case 0xd30: /* Debug Fault Status. */
42
select MSI_NONBROKEN
33
return cpu->env.v7m.dfsr;
43
select I8259
34
case 0xd34: /* MMFAR MemManage Fault Address */
44
35
- return cpu->env.v7m.mmfar;
45
+config ARM_GIC_TCG
36
+ return cpu->env.v7m.mmfar[attrs.secure];
46
+ bool
37
case 0xd38: /* Bus Fault Address. */
47
+ default y
38
return cpu->env.v7m.bfar;
48
+ depends on ARM_GIC && TCG
39
case 0xd3c: /* Aux Fault Status. */
49
+
40
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
50
config ARM_GIC_KVM
41
cpu->env.v7m.dfsr &= ~value; /* W1C */
51
bool
42
break;
52
default y
43
case 0xd34: /* Mem Manage Address. */
53
diff --git a/hw/intc/meson.build b/hw/intc/meson.build
44
- cpu->env.v7m.mmfar = value;
45
+ cpu->env.v7m.mmfar[attrs.secure] = value;
46
return;
47
case 0xd38: /* Bus Fault Address. */
48
cpu->env.v7m.bfar = value;
49
diff --git a/target/arm/helper.c b/target/arm/helper.c
50
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
51
--- a/target/arm/helper.c
55
--- a/hw/intc/meson.build
52
+++ b/target/arm/helper.c
56
+++ b/hw/intc/meson.build
53
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
57
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_ARM_GIC', if_true: files(
54
case EXCP_DATA_ABORT:
58
'arm_gic.c',
55
env->v7m.cfsr |=
59
'arm_gic_common.c',
56
(R_V7M_CFSR_DACCVIOL_MASK | R_V7M_CFSR_MMARVALID_MASK);
60
'arm_gicv2m.c',
57
- env->v7m.mmfar = env->exception.vaddress;
61
- 'arm_gicv3.c',
58
+ env->v7m.mmfar[env->v7m.secure] = env->exception.vaddress;
62
'arm_gicv3_common.c',
59
qemu_log_mask(CPU_LOG_INT,
63
- 'arm_gicv3_dist.c',
60
"...with CFSR.DACCVIOL and MMFAR 0x%x\n",
64
'arm_gicv3_its_common.c',
61
- env->v7m.mmfar);
65
- 'arm_gicv3_redist.c',
62
+ env->v7m.mmfar[env->v7m.secure]);
66
+))
63
break;
67
+softmmu_ss.add(when: 'CONFIG_ARM_GIC_TCG', if_true: files(
64
}
68
+ 'arm_gicv3.c',
65
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_MEM);
69
+ 'arm_gicv3_dist.c',
66
diff --git a/target/arm/machine.c b/target/arm/machine.c
70
'arm_gicv3_its.c',
67
index XXXXXXX..XXXXXXX 100644
71
+ 'arm_gicv3_redist.c',
68
--- a/target/arm/machine.c
72
))
69
+++ b/target/arm/machine.c
73
softmmu_ss.add(when: 'CONFIG_ETRAXFS', if_true: files('etraxfs_pic.c'))
70
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m = {
74
softmmu_ss.add(when: 'CONFIG_HEATHROW_PIC', if_true: files('heathrow_pic.c'))
71
VMSTATE_UINT32(env.v7m.cfsr, ARMCPU),
75
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_PMU', if_true: files('xlnx-pmu-iomod-in
72
VMSTATE_UINT32(env.v7m.hfsr, ARMCPU),
76
specific_ss.add(when: 'CONFIG_ALLWINNER_A10_PIC', if_true: files('allwinner-a10-pic.c'))
73
VMSTATE_UINT32(env.v7m.dfsr, ARMCPU),
77
specific_ss.add(when: 'CONFIG_APIC', if_true: files('apic.c', 'apic_common.c'))
74
- VMSTATE_UINT32(env.v7m.mmfar, ARMCPU),
78
specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif_common.c'))
75
+ VMSTATE_UINT32(env.v7m.mmfar[M_REG_NS], ARMCPU),
79
-specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif.c'))
76
VMSTATE_UINT32(env.v7m.bfar, ARMCPU),
80
+specific_ss.add(when: 'CONFIG_ARM_GIC_TCG', if_true: files('arm_gicv3_cpuif.c'))
77
VMSTATE_UINT32(env.v7m.mpu_ctrl[M_REG_NS], ARMCPU),
81
specific_ss.add(when: 'CONFIG_ARM_GIC_KVM', if_true: files('arm_gic_kvm.c'))
78
VMSTATE_INT32(env.v7m.exception, ARMCPU),
82
specific_ss.add(when: ['CONFIG_ARM_GIC_KVM', 'TARGET_AARCH64'], if_true: files('arm_gicv3_kvm.c', 'arm_gicv3_its_kvm.c'))
79
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
83
specific_ss.add(when: 'CONFIG_ARM_V7M', if_true: files('armv7m_nvic.c'))
80
VMSTATE_VALIDATE("secure MPU_RNR is valid", s_rnr_vmstate_validate),
81
VMSTATE_UINT32(env.v7m.mpu_ctrl[M_REG_S], ARMCPU),
82
VMSTATE_UINT32(env.v7m.ccr[M_REG_S], ARMCPU),
83
+ VMSTATE_UINT32(env.v7m.mmfar[M_REG_S], ARMCPU),
84
VMSTATE_END_OF_LIST()
85
}
86
};
87
--
84
--
88
2.7.4
85
2.25.1
89
86
90
87
diff view generated by jsdifflib
1
From: Fam Zheng <famz@redhat.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Fam Zheng <famz@redhat.com>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Message-id: 20170905131149.10669-3-famz@redhat.com
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
6
---
9
hw/arm/armv7m.c | 8 ++------
7
target/arm/translate-a64.c | 7 ++++---
10
1 file changed, 2 insertions(+), 6 deletions(-)
8
1 file changed, 4 insertions(+), 3 deletions(-)
11
9
12
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
10
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
13
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/arm/armv7m.c
12
--- a/target/arm/translate-a64.c
15
+++ b/hw/arm/armv7m.c
13
+++ b/target/arm/translate-a64.c
16
@@ -XXX,XX +XXX,XX @@ static void armv7m_instance_init(Object *obj)
14
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
17
15
{
18
/* Can't init the cpu here, we don't yet know which model to use */
16
DisasContext *s = container_of(dcbase, DisasContext, base);
19
17
CPUARMState *env = cpu->env_ptr;
20
- object_property_add_link(obj, "memory",
18
+ uint64_t pc = s->base.pc_next;
21
- TYPE_MEMORY_REGION,
19
uint32_t insn;
22
- (Object **)&s->board_memory,
20
23
- qdev_prop_allow_set_link_before_realize,
21
if (s->ss_active && !s->pstate_ss) {
24
- OBJ_PROP_LINK_UNREF_ON_RELEASE,
22
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
25
- &error_abort);
23
return;
26
memory_region_init(&s->container, obj, "armv7m-container", UINT64_MAX);
24
}
27
25
28
object_initialize(&s->nvic, sizeof(s->nvic), TYPE_NVIC);
26
- s->pc_curr = s->base.pc_next;
29
@@ -XXX,XX +XXX,XX @@ static void armv7m_realize(DeviceState *dev, Error **errp)
27
- insn = arm_ldl_code(env, &s->base, s->base.pc_next, s->sctlr_b);
30
28
+ s->pc_curr = pc;
31
static Property armv7m_properties[] = {
29
+ insn = arm_ldl_code(env, &s->base, pc, s->sctlr_b);
32
DEFINE_PROP_STRING("cpu-model", ARMv7MState, cpu_model),
30
s->insn = insn;
33
+ DEFINE_PROP_LINK("memory", ARMv7MState, board_memory, TYPE_MEMORY_REGION,
31
- s->base.pc_next += 4;
34
+ MemoryRegion *),
32
+ s->base.pc_next = pc + 4;
35
DEFINE_PROP_END_OF_LIST(),
33
36
};
34
s->fp_access_checked = false;
37
35
s->sve_access_checked = false;
38
--
36
--
39
2.7.4
37
2.25.1
40
38
41
39
diff view generated by jsdifflib
1
From: Fam Zheng <famz@redhat.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Fam Zheng <famz@redhat.com>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Message-id: 20170905131149.10669-5-famz@redhat.com
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
6
---
9
hw/arm/xlnx-zynqmp.c | 7 ++-----
7
target/arm/translate.c | 9 +++++----
10
1 file changed, 2 insertions(+), 5 deletions(-)
8
1 file changed, 5 insertions(+), 4 deletions(-)
11
9
12
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
10
diff --git a/target/arm/translate.c b/target/arm/translate.c
13
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/arm/xlnx-zynqmp.c
12
--- a/target/arm/translate.c
15
+++ b/hw/arm/xlnx-zynqmp.c
13
+++ b/target/arm/translate.c
16
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_init(Object *obj)
14
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
17
&error_abort);
15
{
16
DisasContext *dc = container_of(dcbase, DisasContext, base);
17
CPUARMState *env = cpu->env_ptr;
18
+ uint32_t pc = dc->base.pc_next;
19
unsigned int insn;
20
21
if (arm_pre_translate_insn(dc)) {
22
- dc->base.pc_next += 4;
23
+ dc->base.pc_next = pc + 4;
24
return;
18
}
25
}
19
26
20
- object_property_add_link(obj, "ddr-ram", TYPE_MEMORY_REGION,
27
- dc->pc_curr = dc->base.pc_next;
21
- (Object **)&s->ddr_ram,
28
- insn = arm_ldl_code(env, &dc->base, dc->base.pc_next, dc->sctlr_b);
22
- qdev_prop_allow_set_link_before_realize,
29
+ dc->pc_curr = pc;
23
- OBJ_PROP_LINK_UNREF_ON_RELEASE, &error_abort);
30
+ insn = arm_ldl_code(env, &dc->base, pc, dc->sctlr_b);
24
-
31
dc->insn = insn;
25
object_initialize(&s->gic, sizeof(s->gic), gic_class_name());
32
- dc->base.pc_next += 4;
26
qdev_set_parent_bus(DEVICE(&s->gic), sysbus_get_default());
33
+ dc->base.pc_next = pc + 4;
27
34
disas_arm_insn(dc, insn);
28
@@ -XXX,XX +XXX,XX @@ static Property xlnx_zynqmp_props[] = {
35
29
DEFINE_PROP_STRING("boot-cpu", XlnxZynqMPState, boot_cpu),
36
arm_post_translate_insn(dc);
30
DEFINE_PROP_BOOL("secure", XlnxZynqMPState, secure, false),
31
DEFINE_PROP_BOOL("has_rpu", XlnxZynqMPState, has_rpu, false),
32
+ DEFINE_PROP_LINK("ddr-ram", XlnxZynqMPState, ddr_ram, TYPE_MEMORY_REGION,
33
+ MemoryRegion *),
34
DEFINE_PROP_END_OF_LIST()
35
};
36
37
--
37
--
38
2.7.4
38
2.25.1
39
39
40
40
diff view generated by jsdifflib
1
From: Portia Stephens <portia.stephens@xilinx.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This adds a feature bit indicating support of the (trivial) Jazelle
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
implementation if ARM_FEATURE_V6 is set or if the processor is arm926
5
or arm1026. This fixes the issue that any BXJ instruction will
6
result in an illegal_op. BXJ instructions will now check if the
7
architecture supports ARM_FEATURE_JAZELLE.
8
9
Signed-off-by: Portia Stephens <portia.stephens@xilinx.com>
10
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
11
Message-id: 20170905211232.11092-1-portia.stephens@xilinx.com
12
[PMM: edited commit message and comment text a bit]
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
6
---
16
target/arm/cpu.h | 1 +
7
target/arm/translate.c | 16 ++++++++--------
17
target/arm/cpu.c | 3 +++
8
1 file changed, 8 insertions(+), 8 deletions(-)
18
target/arm/translate.c | 2 +-
19
3 files changed, 5 insertions(+), 1 deletion(-)
20
9
21
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/cpu.h
24
+++ b/target/arm/cpu.h
25
@@ -XXX,XX +XXX,XX @@ enum arm_features {
26
ARM_FEATURE_PMU, /* has PMU support */
27
ARM_FEATURE_VBAR, /* has cp15 VBAR */
28
ARM_FEATURE_M_SECURITY, /* M profile Security Extension */
29
+ ARM_FEATURE_JAZELLE, /* has (trivial) Jazelle implementation */
30
};
31
32
static inline int arm_feature(CPUARMState *env, int feature)
33
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/cpu.c
36
+++ b/target/arm/cpu.c
37
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
38
}
39
if (arm_feature(env, ARM_FEATURE_V6)) {
40
set_feature(env, ARM_FEATURE_V5);
41
+ set_feature(env, ARM_FEATURE_JAZELLE);
42
if (!arm_feature(env, ARM_FEATURE_M)) {
43
set_feature(env, ARM_FEATURE_AUXCR);
44
}
45
@@ -XXX,XX +XXX,XX @@ static void arm926_initfn(Object *obj)
46
set_feature(&cpu->env, ARM_FEATURE_VFP);
47
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
48
set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN);
49
+ set_feature(&cpu->env, ARM_FEATURE_JAZELLE);
50
cpu->midr = 0x41069265;
51
cpu->reset_fpsid = 0x41011090;
52
cpu->ctr = 0x1dd20d2;
53
@@ -XXX,XX +XXX,XX @@ static void arm1026_initfn(Object *obj)
54
set_feature(&cpu->env, ARM_FEATURE_AUXCR);
55
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
56
set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN);
57
+ set_feature(&cpu->env, ARM_FEATURE_JAZELLE);
58
cpu->midr = 0x4106a262;
59
cpu->reset_fpsid = 0x410110a0;
60
cpu->ctr = 0x1dd20d2;
61
diff --git a/target/arm/translate.c b/target/arm/translate.c
10
diff --git a/target/arm/translate.c b/target/arm/translate.c
62
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
63
--- a/target/arm/translate.c
12
--- a/target/arm/translate.c
64
+++ b/target/arm/translate.c
13
+++ b/target/arm/translate.c
65
@@ -XXX,XX +XXX,XX @@
14
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
66
#define ENABLE_ARCH_5 arm_dc_feature(s, ARM_FEATURE_V5)
15
{
67
/* currently all emulated v5 cores are also v5TE, so don't bother */
16
DisasContext *dc = container_of(dcbase, DisasContext, base);
68
#define ENABLE_ARCH_5TE arm_dc_feature(s, ARM_FEATURE_V5)
17
CPUARMState *env = cpu->env_ptr;
69
-#define ENABLE_ARCH_5J 0
18
+ uint32_t pc = dc->base.pc_next;
70
+#define ENABLE_ARCH_5J arm_dc_feature(s, ARM_FEATURE_JAZELLE)
19
uint32_t insn;
71
#define ENABLE_ARCH_6 arm_dc_feature(s, ARM_FEATURE_V6)
20
bool is_16bit;
72
#define ENABLE_ARCH_6K arm_dc_feature(s, ARM_FEATURE_V6K)
21
73
#define ENABLE_ARCH_6T2 arm_dc_feature(s, ARM_FEATURE_THUMB2)
22
if (arm_pre_translate_insn(dc)) {
23
- dc->base.pc_next += 2;
24
+ dc->base.pc_next = pc + 2;
25
return;
26
}
27
28
- dc->pc_curr = dc->base.pc_next;
29
- insn = arm_lduw_code(env, &dc->base, dc->base.pc_next, dc->sctlr_b);
30
+ dc->pc_curr = pc;
31
+ insn = arm_lduw_code(env, &dc->base, pc, dc->sctlr_b);
32
is_16bit = thumb_insn_is_16bit(dc, dc->base.pc_next, insn);
33
- dc->base.pc_next += 2;
34
+ pc += 2;
35
if (!is_16bit) {
36
- uint32_t insn2 = arm_lduw_code(env, &dc->base, dc->base.pc_next,
37
- dc->sctlr_b);
38
-
39
+ uint32_t insn2 = arm_lduw_code(env, &dc->base, pc, dc->sctlr_b);
40
insn = insn << 16 | insn2;
41
- dc->base.pc_next += 2;
42
+ pc += 2;
43
}
44
+ dc->base.pc_next = pc;
45
dc->insn = insn;
46
47
if (dc->pstate_il) {
74
--
48
--
75
2.7.4
49
2.25.1
76
50
77
51
diff view generated by jsdifflib
1
Make the CONTROL register banked if v8M security extensions are enabled.
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Create arm_check_ss_active and arm_check_kernelpage.
4
5
Reverse the order of the tests. While it doesn't matter in practice,
6
because only user-only has a kernel page and user-only never sets
7
ss_active, ss_active has priority over execution exceptions and it
8
is best to keep them in the proper order.
9
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 1503414539-28762-10-git-send-email-peter.maydell@linaro.org
6
---
13
---
7
target/arm/cpu.h | 5 +++--
14
target/arm/translate.c | 10 +++++++---
8
target/arm/helper.c | 21 +++++++++++----------
15
1 file changed, 7 insertions(+), 3 deletions(-)
9
target/arm/machine.c | 3 ++-
10
target/arm/translate.c | 2 +-
11
4 files changed, 17 insertions(+), 14 deletions(-)
12
16
13
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/cpu.h
16
+++ b/target/arm/cpu.h
17
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
18
uint32_t other_sp;
19
uint32_t vecbase;
20
uint32_t basepri[2];
21
- uint32_t control;
22
+ uint32_t control[2];
23
uint32_t ccr; /* Configuration and Control */
24
uint32_t cfsr; /* Configurable Fault Status */
25
uint32_t hfsr; /* HardFault Status */
26
@@ -XXX,XX +XXX,XX @@ static inline bool arm_v7m_is_handler_mode(CPUARMState *env)
27
static inline int arm_current_el(CPUARMState *env)
28
{
29
if (arm_feature(env, ARM_FEATURE_M)) {
30
- return arm_v7m_is_handler_mode(env) || !(env->v7m.control & 1);
31
+ return arm_v7m_is_handler_mode(env) ||
32
+ !(env->v7m.control[env->v7m.secure] & 1);
33
}
34
35
if (is_a64(env)) {
36
diff --git a/target/arm/helper.c b/target/arm/helper.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/helper.c
39
+++ b/target/arm/helper.c
40
@@ -XXX,XX +XXX,XX @@ static uint32_t v7m_pop(CPUARMState *env)
41
static void switch_v7m_sp(CPUARMState *env, bool new_spsel)
42
{
43
uint32_t tmp;
44
- bool old_spsel = env->v7m.control & R_V7M_CONTROL_SPSEL_MASK;
45
+ uint32_t old_control = env->v7m.control[env->v7m.secure];
46
+ bool old_spsel = old_control & R_V7M_CONTROL_SPSEL_MASK;
47
48
if (old_spsel != new_spsel) {
49
tmp = env->v7m.other_sp;
50
env->v7m.other_sp = env->regs[13];
51
env->regs[13] = tmp;
52
53
- env->v7m.control = deposit32(env->v7m.control,
54
+ env->v7m.control[env->v7m.secure] = deposit32(old_control,
55
R_V7M_CONTROL_SPSEL_SHIFT,
56
R_V7M_CONTROL_SPSEL_LENGTH, new_spsel);
57
}
58
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
59
}
60
61
lr = 0xfffffff1;
62
- if (env->v7m.control & R_V7M_CONTROL_SPSEL_MASK) {
63
+ if (env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_SPSEL_MASK) {
64
lr |= 4;
65
}
66
if (!arm_v7m_is_handler_mode(env)) {
67
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
68
return xpsr_read(env) & mask;
69
break;
70
case 20: /* CONTROL */
71
- return env->v7m.control;
72
+ return env->v7m.control[env->v7m.secure];
73
}
74
75
if (el == 0) {
76
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
77
78
switch (reg) {
79
case 8: /* MSP */
80
- return (env->v7m.control & R_V7M_CONTROL_SPSEL_MASK) ?
81
+ return (env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_SPSEL_MASK) ?
82
env->v7m.other_sp : env->regs[13];
83
case 9: /* PSP */
84
- return (env->v7m.control & R_V7M_CONTROL_SPSEL_MASK) ?
85
+ return (env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_SPSEL_MASK) ?
86
env->regs[13] : env->v7m.other_sp;
87
case 16: /* PRIMASK */
88
return env->v7m.primask[env->v7m.secure];
89
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
90
}
91
break;
92
case 8: /* MSP */
93
- if (env->v7m.control & R_V7M_CONTROL_SPSEL_MASK) {
94
+ if (env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_SPSEL_MASK) {
95
env->v7m.other_sp = val;
96
} else {
97
env->regs[13] = val;
98
}
99
break;
100
case 9: /* PSP */
101
- if (env->v7m.control & R_V7M_CONTROL_SPSEL_MASK) {
102
+ if (env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_SPSEL_MASK) {
103
env->regs[13] = val;
104
} else {
105
env->v7m.other_sp = val;
106
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
107
if (!arm_v7m_is_handler_mode(env)) {
108
switch_v7m_sp(env, (val & R_V7M_CONTROL_SPSEL_MASK) != 0);
109
}
110
- env->v7m.control &= ~R_V7M_CONTROL_NPRIV_MASK;
111
- env->v7m.control |= val & R_V7M_CONTROL_NPRIV_MASK;
112
+ env->v7m.control[env->v7m.secure] &= ~R_V7M_CONTROL_NPRIV_MASK;
113
+ env->v7m.control[env->v7m.secure] |= val & R_V7M_CONTROL_NPRIV_MASK;
114
break;
115
default:
116
qemu_log_mask(LOG_GUEST_ERROR, "Attempt to write unknown special"
117
diff --git a/target/arm/machine.c b/target/arm/machine.c
118
index XXXXXXX..XXXXXXX 100644
119
--- a/target/arm/machine.c
120
+++ b/target/arm/machine.c
121
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m = {
122
.fields = (VMStateField[]) {
123
VMSTATE_UINT32(env.v7m.vecbase, ARMCPU),
124
VMSTATE_UINT32(env.v7m.basepri[M_REG_NS], ARMCPU),
125
- VMSTATE_UINT32(env.v7m.control, ARMCPU),
126
+ VMSTATE_UINT32(env.v7m.control[M_REG_NS], ARMCPU),
127
VMSTATE_UINT32(env.v7m.ccr, ARMCPU),
128
VMSTATE_UINT32(env.v7m.cfsr, ARMCPU),
129
VMSTATE_UINT32(env.v7m.hfsr, ARMCPU),
130
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
131
VMSTATE_UINT32(env.v7m.basepri[M_REG_S], ARMCPU),
132
VMSTATE_UINT32(env.v7m.primask[M_REG_S], ARMCPU),
133
VMSTATE_UINT32(env.v7m.faultmask[M_REG_S], ARMCPU),
134
+ VMSTATE_UINT32(env.v7m.control[M_REG_S], ARMCPU),
135
VMSTATE_END_OF_LIST()
136
}
137
};
138
diff --git a/target/arm/translate.c b/target/arm/translate.c
17
diff --git a/target/arm/translate.c b/target/arm/translate.c
139
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
140
--- a/target/arm/translate.c
19
--- a/target/arm/translate.c
141
+++ b/target/arm/translate.c
20
+++ b/target/arm/translate.c
142
@@ -XXX,XX +XXX,XX @@ void arm_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
21
@@ -XXX,XX +XXX,XX @@ static void arm_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
143
if (xpsr & XPSR_EXCP) {
22
dc->insn_start = tcg_last_op();
144
mode = "handler";
23
}
145
} else {
24
146
- if (env->v7m.control & R_V7M_CONTROL_NPRIV_MASK) {
25
-static bool arm_pre_translate_insn(DisasContext *dc)
147
+ if (env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_NPRIV_MASK) {
26
+static bool arm_check_kernelpage(DisasContext *dc)
148
mode = "unpriv-thread";
27
{
149
} else {
28
#ifdef CONFIG_USER_ONLY
150
mode = "priv-thread";
29
/* Intercept jump to the magic kernel page. */
30
@@ -XXX,XX +XXX,XX @@ static bool arm_pre_translate_insn(DisasContext *dc)
31
return true;
32
}
33
#endif
34
+ return false;
35
+}
36
37
+static bool arm_check_ss_active(DisasContext *dc)
38
+{
39
if (dc->ss_active && !dc->pstate_ss) {
40
/* Singlestep state is Active-pending.
41
* If we're in this state at the start of a TB then either
42
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
43
uint32_t pc = dc->base.pc_next;
44
unsigned int insn;
45
46
- if (arm_pre_translate_insn(dc)) {
47
+ if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
48
dc->base.pc_next = pc + 4;
49
return;
50
}
51
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
52
uint32_t insn;
53
bool is_16bit;
54
55
- if (arm_pre_translate_insn(dc)) {
56
+ if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
57
dc->base.pc_next = pc + 2;
58
return;
59
}
151
--
60
--
152
2.7.4
61
2.25.1
153
62
154
63
diff view generated by jsdifflib
1
From: Fam Zheng <famz@redhat.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Fam Zheng <famz@redhat.com>
3
The size of the code covered by a TranslationBlock cannot be 0;
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
this is checked via assert in tb_gen_code.
5
Message-id: 20170905131149.10669-2-famz@redhat.com
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
---
9
hw/arm/armv7m.c | 8 ++------
10
target/arm/translate-a64.c | 1 +
10
1 file changed, 2 insertions(+), 6 deletions(-)
11
1 file changed, 1 insertion(+)
11
12
12
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/arm/armv7m.c
15
--- a/target/arm/translate-a64.c
15
+++ b/hw/arm/armv7m.c
16
+++ b/target/arm/translate-a64.c
16
@@ -XXX,XX +XXX,XX @@ static void bitband_init(Object *obj)
17
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
17
BitBandState *s = BITBAND(obj);
18
assert(s->base.num_insns == 1);
18
SysBusDevice *dev = SYS_BUS_DEVICE(obj);
19
gen_swstep_exception(s, 0, 0);
19
20
s->base.is_jmp = DISAS_NORETURN;
20
- object_property_add_link(obj, "source-memory",
21
+ s->base.pc_next = pc + 4;
21
- TYPE_MEMORY_REGION,
22
return;
22
- (Object **)&s->source_memory,
23
}
23
- qdev_prop_allow_set_link_before_realize,
24
- OBJ_PROP_LINK_UNREF_ON_RELEASE,
25
- &error_abort);
26
memory_region_init_io(&s->iomem, obj, &bitband_ops, s,
27
"bitband", 0x02000000);
28
sysbus_init_mmio(dev, &s->iomem);
29
@@ -XXX,XX +XXX,XX @@ void armv7m_load_kernel(ARMCPU *cpu, const char *kernel_filename, int mem_size)
30
31
static Property bitband_properties[] = {
32
DEFINE_PROP_UINT32("base", BitBandState, base, 0),
33
+ DEFINE_PROP_LINK("source-memory", BitBandState, source_memory,
34
+ TYPE_MEMORY_REGION, MemoryRegion *),
35
DEFINE_PROP_END_OF_LIST(),
36
};
37
24
38
--
25
--
39
2.7.4
26
2.25.1
40
27
41
28
diff view generated by jsdifflib
1
From: Fam Zheng <famz@redhat.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Fam Zheng <famz@redhat.com>
3
We will reuse this section of arm_deliver_fault for
4
Message-id: 20170905131149.10669-4-famz@redhat.com
4
raising pc alignment faults.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
9
---
8
hw/intc/arm_gicv3_its_kvm.c | 19 +++++++------------
10
target/arm/tlb_helper.c | 45 +++++++++++++++++++++++++----------------
9
1 file changed, 7 insertions(+), 12 deletions(-)
11
1 file changed, 28 insertions(+), 17 deletions(-)
10
12
11
diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c
13
diff --git a/target/arm/tlb_helper.c b/target/arm/tlb_helper.c
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/intc/arm_gicv3_its_kvm.c
15
--- a/target/arm/tlb_helper.c
14
+++ b/hw/intc/arm_gicv3_its_kvm.c
16
+++ b/target/arm/tlb_helper.c
15
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_its_realize(DeviceState *dev, Error **errp)
17
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
16
qemu_add_vm_change_state_handler(vm_change_state_handler, s);
18
return syn;
17
}
19
}
18
20
19
-static void kvm_arm_its_init(Object *obj)
21
-static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
20
-{
22
- MMUAccessType access_type,
21
- GICv3ITSState *s = KVM_ARM_ITS(obj);
23
- int mmu_idx, ARMMMUFaultInfo *fi)
24
+static uint32_t compute_fsr_fsc(CPUARMState *env, ARMMMUFaultInfo *fi,
25
+ int target_el, int mmu_idx, uint32_t *ret_fsc)
26
{
27
- CPUARMState *env = &cpu->env;
28
- int target_el;
29
- bool same_el;
30
- uint32_t syn, exc, fsr, fsc;
31
ARMMMUIdx arm_mmu_idx = core_to_arm_mmu_idx(env, mmu_idx);
22
-
32
-
23
- object_property_add_link(obj, "parent-gicv3",
33
- target_el = exception_target_el(env);
24
- "kvm-arm-gicv3", (Object **)&s->gicv3,
34
- if (fi->stage2) {
25
- object_property_allow_set_link,
35
- target_el = 2;
26
- OBJ_PROP_LINK_UNREF_ON_RELEASE,
36
- env->cp15.hpfar_el2 = extract64(fi->s2addr, 12, 47) << 4;
27
- &error_abort);
37
- if (arm_is_secure_below_el3(env) && fi->s1ns) {
28
-}
38
- env->cp15.hpfar_el2 |= HPFAR_NS;
29
-
39
- }
30
/**
40
- }
31
* kvm_arm_its_pre_save - handles the saving of ITS registers.
41
- same_el = (arm_current_el(env) == target_el);
32
* ITS tables are flushed into guest RAM separately and earlier,
42
+ uint32_t fsr, fsc;
33
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_its_post_load(GICv3ITSState *s)
43
34
GITS_CTLR, &s->ctlr, true, &error_abort);
44
if (target_el == 2 || arm_el_is_aa64(env, target_el) ||
35
}
45
arm_s1_regime_using_lpae_format(env, arm_mmu_idx)) {
36
46
@@ -XXX,XX +XXX,XX @@ static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
37
+static Property kvm_arm_its_props[] = {
47
fsc = 0x3f;
38
+ DEFINE_PROP_LINK("parent-gicv3", GICv3ITSState, gicv3, "kvm-arm-gicv3",
48
}
39
+ GICv3State *),
49
40
+ DEFINE_PROP_END_OF_LIST(),
50
+ *ret_fsc = fsc;
41
+};
51
+ return fsr;
52
+}
42
+
53
+
43
static void kvm_arm_its_class_init(ObjectClass *klass, void *data)
54
+static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
44
{
55
+ MMUAccessType access_type,
45
DeviceClass *dc = DEVICE_CLASS(klass);
56
+ int mmu_idx, ARMMMUFaultInfo *fi)
46
GICv3ITSCommonClass *icc = ARM_GICV3_ITS_COMMON_CLASS(klass);
57
+{
47
58
+ CPUARMState *env = &cpu->env;
48
dc->realize = kvm_arm_its_realize;
59
+ int target_el;
49
+ dc->props = kvm_arm_its_props;
60
+ bool same_el;
50
icc->send_msi = kvm_its_send_msi;
61
+ uint32_t syn, exc, fsr, fsc;
51
icc->pre_save = kvm_arm_its_pre_save;
62
+
52
icc->post_load = kvm_arm_its_post_load;
63
+ target_el = exception_target_el(env);
53
@@ -XXX,XX +XXX,XX @@ static const TypeInfo kvm_arm_its_info = {
64
+ if (fi->stage2) {
54
.name = TYPE_KVM_ARM_ITS,
65
+ target_el = 2;
55
.parent = TYPE_ARM_GICV3_ITS_COMMON,
66
+ env->cp15.hpfar_el2 = extract64(fi->s2addr, 12, 47) << 4;
56
.instance_size = sizeof(GICv3ITSState),
67
+ if (arm_is_secure_below_el3(env) && fi->s1ns) {
57
- .instance_init = kvm_arm_its_init,
68
+ env->cp15.hpfar_el2 |= HPFAR_NS;
58
.class_init = kvm_arm_its_class_init,
69
+ }
59
};
70
+ }
60
71
+ same_el = (arm_current_el(env) == target_el);
72
+
73
+ fsr = compute_fsr_fsc(env, fi, target_el, mmu_idx, &fsc);
74
+
75
if (access_type == MMU_INST_FETCH) {
76
syn = syn_insn_abort(same_el, fi->ea, fi->s1ptw, fsc);
77
exc = EXCP_PREFETCH_ABORT;
61
--
78
--
62
2.7.4
79
2.25.1
63
80
64
81
diff view generated by jsdifflib
1
Implement the BXNS v8M instruction, which is like BX but will do a
1
From: Richard Henderson <richard.henderson@linaro.org>
2
jump-and-switch-to-NonSecure if the branch target address has bit 0
2
3
clear.
3
For A64, any input to an indirect branch can cause this.
4
4
5
This is the first piece of code which implements "switch to the
5
For A32, many indirect branch paths force the branch to be aligned,
6
other security state", so the commit also includes the code to
6
but BXWritePC does not. This includes the BX instruction but also
7
switch the stack pointers around, which is the only complicated
7
other interworking changes to PC. Prior to v8, this case is UNDEFINED.
8
part of switching security state.
8
With v8, this is CONSTRAINED UNPREDICTABLE and may either raise an
9
9
exception or force align the PC.
10
BLXNS is more complicated than just "BXNS but set the link register",
10
11
so we leave it for a separate commit.
11
We choose to raise an exception because we have the infrastructure,
12
12
it makes the generated code for gen_bx simpler, and it has the
13
possibility of catching more guest bugs.
14
15
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 1503414539-28762-21-git-send-email-peter.maydell@linaro.org
16
---
18
---
17
target/arm/cpu.h | 13 +++++++++
19
target/arm/helper.h | 1 +
18
target/arm/helper.h | 2 ++
20
target/arm/syndrome.h | 5 ++++
19
target/arm/translate.h | 1 +
21
linux-user/aarch64/cpu_loop.c | 46 ++++++++++++++++++++---------------
20
target/arm/helper.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++
22
target/arm/tlb_helper.c | 18 ++++++++++++++
21
target/arm/machine.c | 2 ++
23
target/arm/translate-a64.c | 15 ++++++++++++
22
target/arm/translate.c | 42 ++++++++++++++++++++++++++-
24
target/arm/translate.c | 22 ++++++++++++++++-
23
6 files changed, 138 insertions(+), 1 deletion(-)
25
6 files changed, 87 insertions(+), 20 deletions(-)
24
26
25
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
26
index XXXXXXX..XXXXXXX 100644
27
--- a/target/arm/cpu.h
28
+++ b/target/arm/cpu.h
29
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
30
} cp15;
31
32
struct {
33
+ /* M profile has up to 4 stack pointers:
34
+ * a Main Stack Pointer and a Process Stack Pointer for each
35
+ * of the Secure and Non-Secure states. (If the CPU doesn't support
36
+ * the security extension then it has only two SPs.)
37
+ * In QEMU we always store the currently active SP in regs[13],
38
+ * and the non-active SP for the current security state in
39
+ * v7m.other_sp. The stack pointers for the inactive security state
40
+ * are stored in other_ss_msp and other_ss_psp.
41
+ * switch_v7m_security_state() is responsible for rearranging them
42
+ * when we change security state.
43
+ */
44
uint32_t other_sp;
45
+ uint32_t other_ss_msp;
46
+ uint32_t other_ss_psp;
47
uint32_t vecbase[2];
48
uint32_t basepri[2];
49
uint32_t control[2];
50
diff --git a/target/arm/helper.h b/target/arm/helper.h
27
diff --git a/target/arm/helper.h b/target/arm/helper.h
51
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
52
--- a/target/arm/helper.h
29
--- a/target/arm/helper.h
53
+++ b/target/arm/helper.h
30
+++ b/target/arm/helper.h
54
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_1(cpsr_read, i32, env)
31
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RWG_SE,
55
DEF_HELPER_3(v7m_msr, void, env, i32, i32)
32
DEF_HELPER_2(exception_internal, void, env, i32)
56
DEF_HELPER_2(v7m_mrs, i32, env, i32)
33
DEF_HELPER_4(exception_with_syndrome, void, env, i32, i32, i32)
57
34
DEF_HELPER_2(exception_bkpt_insn, void, env, i32)
58
+DEF_HELPER_2(v7m_bxns, void, env, i32)
35
+DEF_HELPER_2(exception_pc_alignment, noreturn, env, tl)
59
+
36
DEF_HELPER_1(setend, void, env)
60
DEF_HELPER_4(access_check_cp_reg, void, env, ptr, i32, i32)
37
DEF_HELPER_2(wfi, void, env, i32)
61
DEF_HELPER_3(set_cp_reg, void, env, ptr, i32)
38
DEF_HELPER_1(wfe, void, env)
62
DEF_HELPER_2(get_cp_reg, i32, env, ptr)
39
diff --git a/target/arm/syndrome.h b/target/arm/syndrome.h
63
diff --git a/target/arm/translate.h b/target/arm/translate.h
40
index XXXXXXX..XXXXXXX 100644
64
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/syndrome.h
65
--- a/target/arm/translate.h
42
+++ b/target/arm/syndrome.h
66
+++ b/target/arm/translate.h
43
@@ -XXX,XX +XXX,XX @@ static inline uint32_t syn_illegalstate(void)
67
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
44
return (EC_ILLEGALSTATE << ARM_EL_EC_SHIFT) | ARM_EL_IL;
68
int vec_len;
69
int vec_stride;
70
bool v7m_handler_mode;
71
+ bool v8m_secure; /* true if v8M and we're in Secure mode */
72
/* Immediate value in AArch32 SVC insn; must be set if is_jmp == DISAS_SWI
73
* so that top level loop can generate correct syndrome information.
74
*/
75
diff --git a/target/arm/helper.c b/target/arm/helper.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/arm/helper.c
78
+++ b/target/arm/helper.c
79
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
80
return 0;
81
}
45
}
82
46
83
+void HELPER(v7m_bxns)(CPUARMState *env, uint32_t dest)
47
+static inline uint32_t syn_pcalignment(void)
84
+{
48
+{
85
+ /* translate.c should never generate calls here in user-only mode */
49
+ return (EC_PCALIGNMENT << ARM_EL_EC_SHIFT) | ARM_EL_IL;
86
+ g_assert_not_reached();
87
+}
50
+}
88
+
51
+
89
void switch_mode(CPUARMState *env, int mode)
52
#endif /* TARGET_ARM_SYNDROME_H */
90
{
53
diff --git a/linux-user/aarch64/cpu_loop.c b/linux-user/aarch64/cpu_loop.c
91
ARMCPU *cpu = arm_env_get_cpu(env);
54
index XXXXXXX..XXXXXXX 100644
92
@@ -XXX,XX +XXX,XX @@ static uint32_t v7m_pop(CPUARMState *env)
55
--- a/linux-user/aarch64/cpu_loop.c
93
return val;
56
+++ b/linux-user/aarch64/cpu_loop.c
57
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
58
break;
59
case EXCP_PREFETCH_ABORT:
60
case EXCP_DATA_ABORT:
61
- /* We should only arrive here with EC in {DATAABORT, INSNABORT}. */
62
ec = syn_get_ec(env->exception.syndrome);
63
- assert(ec == EC_DATAABORT || ec == EC_INSNABORT);
64
-
65
- /* Both EC have the same format for FSC, or close enough. */
66
- fsc = extract32(env->exception.syndrome, 0, 6);
67
- switch (fsc) {
68
- case 0x04 ... 0x07: /* Translation fault, level {0-3} */
69
- si_signo = TARGET_SIGSEGV;
70
- si_code = TARGET_SEGV_MAPERR;
71
+ switch (ec) {
72
+ case EC_DATAABORT:
73
+ case EC_INSNABORT:
74
+ /* Both EC have the same format for FSC, or close enough. */
75
+ fsc = extract32(env->exception.syndrome, 0, 6);
76
+ switch (fsc) {
77
+ case 0x04 ... 0x07: /* Translation fault, level {0-3} */
78
+ si_signo = TARGET_SIGSEGV;
79
+ si_code = TARGET_SEGV_MAPERR;
80
+ break;
81
+ case 0x09 ... 0x0b: /* Access flag fault, level {1-3} */
82
+ case 0x0d ... 0x0f: /* Permission fault, level {1-3} */
83
+ si_signo = TARGET_SIGSEGV;
84
+ si_code = TARGET_SEGV_ACCERR;
85
+ break;
86
+ case 0x11: /* Synchronous Tag Check Fault */
87
+ si_signo = TARGET_SIGSEGV;
88
+ si_code = TARGET_SEGV_MTESERR;
89
+ break;
90
+ case 0x21: /* Alignment fault */
91
+ si_signo = TARGET_SIGBUS;
92
+ si_code = TARGET_BUS_ADRALN;
93
+ break;
94
+ default:
95
+ g_assert_not_reached();
96
+ }
97
break;
98
- case 0x09 ... 0x0b: /* Access flag fault, level {1-3} */
99
- case 0x0d ... 0x0f: /* Permission fault, level {1-3} */
100
- si_signo = TARGET_SIGSEGV;
101
- si_code = TARGET_SEGV_ACCERR;
102
- break;
103
- case 0x11: /* Synchronous Tag Check Fault */
104
- si_signo = TARGET_SIGSEGV;
105
- si_code = TARGET_SEGV_MTESERR;
106
- break;
107
- case 0x21: /* Alignment fault */
108
+ case EC_PCALIGNMENT:
109
si_signo = TARGET_SIGBUS;
110
si_code = TARGET_BUS_ADRALN;
111
break;
112
diff --git a/target/arm/tlb_helper.c b/target/arm/tlb_helper.c
113
index XXXXXXX..XXXXXXX 100644
114
--- a/target/arm/tlb_helper.c
115
+++ b/target/arm/tlb_helper.c
116
@@ -XXX,XX +XXX,XX @@
117
#include "cpu.h"
118
#include "internals.h"
119
#include "exec/exec-all.h"
120
+#include "exec/helper-proto.h"
121
122
static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
123
unsigned int target_el,
124
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr,
125
arm_deliver_fault(cpu, vaddr, access_type, mmu_idx, &fi);
94
}
126
}
95
127
96
+/* Return true if we're using the process stack pointer (not the MSP) */
128
+void helper_exception_pc_alignment(CPUARMState *env, target_ulong pc)
97
+static bool v7m_using_psp(CPUARMState *env)
98
+{
129
+{
99
+ /* Handler mode always uses the main stack; for thread mode
130
+ ARMMMUFaultInfo fi = { .type = ARMFault_Alignment };
100
+ * the CONTROL.SPSEL bit determines the answer.
131
+ int target_el = exception_target_el(env);
101
+ * Note that in v7M it is not possible to be in Handler mode with
132
+ int mmu_idx = cpu_mmu_index(env, true);
102
+ * CONTROL.SPSEL non-zero, but in v8M it is, so we must check both.
133
+ uint32_t fsc;
134
+
135
+ env->exception.vaddress = pc;
136
+
137
+ /*
138
+ * Note that the fsc is not applicable to this exception,
139
+ * since any syndrome is pcalignment not insn_abort.
103
+ */
140
+ */
104
+ return !arm_v7m_is_handler_mode(env) &&
141
+ env->exception.fsr = compute_fsr_fsc(env, &fi, target_el, mmu_idx, &fsc);
105
+ env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_SPSEL_MASK;
142
+ raise_exception(env, EXCP_PREFETCH_ABORT, syn_pcalignment(), target_el);
106
+}
143
+}
107
+
144
+
108
/* Switch to V7M main or process stack pointer. */
145
#if !defined(CONFIG_USER_ONLY)
109
static void switch_v7m_sp(CPUARMState *env, bool new_spsel)
146
110
{
147
/*
111
@@ -XXX,XX +XXX,XX @@ static void switch_v7m_sp(CPUARMState *env, bool new_spsel)
148
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
149
index XXXXXXX..XXXXXXX 100644
150
--- a/target/arm/translate-a64.c
151
+++ b/target/arm/translate-a64.c
152
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
153
uint64_t pc = s->base.pc_next;
154
uint32_t insn;
155
156
+ /* Singlestep exceptions have the highest priority. */
157
if (s->ss_active && !s->pstate_ss) {
158
/* Singlestep state is Active-pending.
159
* If we're in this state at the start of a TB then either
160
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
161
return;
112
}
162
}
113
}
163
114
164
+ if (pc & 3) {
115
+/* Switch M profile security state between NS and S */
165
+ /*
116
+static void switch_v7m_security_state(CPUARMState *env, bool new_secstate)
166
+ * PC alignment fault. This has priority over the instruction abort
117
+{
167
+ * that we would receive from a translation fault via arm_ldl_code.
118
+ uint32_t new_ss_msp, new_ss_psp;
168
+ * This should only be possible after an indirect branch, at the
119
+
169
+ * start of the TB.
120
+ if (env->v7m.secure == new_secstate) {
170
+ */
171
+ assert(s->base.num_insns == 1);
172
+ gen_helper_exception_pc_alignment(cpu_env, tcg_constant_tl(pc));
173
+ s->base.is_jmp = DISAS_NORETURN;
174
+ s->base.pc_next = QEMU_ALIGN_UP(pc, 4);
121
+ return;
175
+ return;
122
+ }
176
+ }
123
+
177
+
124
+ /* All the banked state is accessed by looking at env->v7m.secure
178
s->pc_curr = pc;
125
+ * except for the stack pointer; rearrange the SP appropriately.
179
insn = arm_ldl_code(env, &s->base, pc, s->sctlr_b);
126
+ */
180
s->insn = insn;
127
+ new_ss_msp = env->v7m.other_ss_msp;
128
+ new_ss_psp = env->v7m.other_ss_psp;
129
+
130
+ if (v7m_using_psp(env)) {
131
+ env->v7m.other_ss_psp = env->regs[13];
132
+ env->v7m.other_ss_msp = env->v7m.other_sp;
133
+ } else {
134
+ env->v7m.other_ss_msp = env->regs[13];
135
+ env->v7m.other_ss_psp = env->v7m.other_sp;
136
+ }
137
+
138
+ env->v7m.secure = new_secstate;
139
+
140
+ if (v7m_using_psp(env)) {
141
+ env->regs[13] = new_ss_psp;
142
+ env->v7m.other_sp = new_ss_msp;
143
+ } else {
144
+ env->regs[13] = new_ss_msp;
145
+ env->v7m.other_sp = new_ss_psp;
146
+ }
147
+}
148
+
149
+void HELPER(v7m_bxns)(CPUARMState *env, uint32_t dest)
150
+{
151
+ /* Handle v7M BXNS:
152
+ * - if the return value is a magic value, do exception return (like BX)
153
+ * - otherwise bit 0 of the return value is the target security state
154
+ */
155
+ if (dest >= 0xff000000) {
156
+ /* This is an exception return magic value; put it where
157
+ * do_v7m_exception_exit() expects and raise EXCEPTION_EXIT.
158
+ * Note that if we ever add gen_ss_advance() singlestep support to
159
+ * M profile this should count as an "instruction execution complete"
160
+ * event (compare gen_bx_excret_final_code()).
161
+ */
162
+ env->regs[15] = dest & ~1;
163
+ env->thumb = dest & 1;
164
+ HELPER(exception_internal)(env, EXCP_EXCEPTION_EXIT);
165
+ /* notreached */
166
+ }
167
+
168
+ /* translate.c should have made BXNS UNDEF unless we're secure */
169
+ assert(env->v7m.secure);
170
+
171
+ switch_v7m_security_state(env, dest & 1);
172
+ env->thumb = 1;
173
+ env->regs[15] = dest & ~1;
174
+}
175
+
176
static uint32_t arm_v7m_load_vector(ARMCPU *cpu)
177
{
178
CPUState *cs = CPU(cpu);
179
diff --git a/target/arm/machine.c b/target/arm/machine.c
180
index XXXXXXX..XXXXXXX 100644
181
--- a/target/arm/machine.c
182
+++ b/target/arm/machine.c
183
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
184
.needed = m_security_needed,
185
.fields = (VMStateField[]) {
186
VMSTATE_UINT32(env.v7m.secure, ARMCPU),
187
+ VMSTATE_UINT32(env.v7m.other_ss_msp, ARMCPU),
188
+ VMSTATE_UINT32(env.v7m.other_ss_psp, ARMCPU),
189
VMSTATE_UINT32(env.v7m.basepri[M_REG_S], ARMCPU),
190
VMSTATE_UINT32(env.v7m.primask[M_REG_S], ARMCPU),
191
VMSTATE_UINT32(env.v7m.faultmask[M_REG_S], ARMCPU),
192
diff --git a/target/arm/translate.c b/target/arm/translate.c
181
diff --git a/target/arm/translate.c b/target/arm/translate.c
193
index XXXXXXX..XXXXXXX 100644
182
index XXXXXXX..XXXXXXX 100644
194
--- a/target/arm/translate.c
183
--- a/target/arm/translate.c
195
+++ b/target/arm/translate.c
184
+++ b/target/arm/translate.c
196
@@ -XXX,XX +XXX,XX @@ static inline void gen_bx_excret_final_code(DisasContext *s)
185
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
197
gen_exception_internal(EXCP_EXCEPTION_EXIT);
186
uint32_t pc = dc->base.pc_next;
198
}
187
unsigned int insn;
199
188
200
+static inline void gen_bxns(DisasContext *s, int rm)
189
- if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
201
+{
190
+ /* Singlestep exceptions have the highest priority. */
202
+ TCGv_i32 var = load_reg(s, rm);
191
+ if (arm_check_ss_active(dc)) {
203
+
192
+ dc->base.pc_next = pc + 4;
204
+ /* The bxns helper may raise an EXCEPTION_EXIT exception, so in theory
193
+ return;
205
+ * we need to sync state before calling it, but:
194
+ }
206
+ * - we don't need to do gen_set_pc_im() because the bxns helper will
195
+
207
+ * always set the PC itself
196
+ if (pc & 3) {
208
+ * - we don't need to do gen_set_condexec() because BXNS is UNPREDICTABLE
197
+ /*
209
+ * unless it's outside an IT block or the last insn in an IT block,
198
+ * PC alignment fault. This has priority over the instruction abort
210
+ * so we know that condexec == 0 (already set at the top of the TB)
199
+ * that we would receive from a translation fault via arm_ldl_code
211
+ * is correct in the non-UNPREDICTABLE cases, and we can choose
200
+ * (or the execution of the kernelpage entrypoint). This should only
212
+ * "zeroes the IT bits" as our UNPREDICTABLE behaviour otherwise.
201
+ * be possible after an indirect branch, at the start of the TB.
213
+ */
202
+ */
214
+ gen_helper_v7m_bxns(cpu_env, var);
203
+ assert(dc->base.num_insns == 1);
215
+ tcg_temp_free_i32(var);
204
+ gen_helper_exception_pc_alignment(cpu_env, tcg_constant_tl(pc));
216
+ s->is_jmp = DISAS_EXIT;
205
+ dc->base.is_jmp = DISAS_NORETURN;
217
+}
206
+ dc->base.pc_next = QEMU_ALIGN_UP(pc, 4);
218
+
207
+ return;
219
/* Variant of store_reg which uses branch&exchange logic when storing
208
+ }
220
to r15 in ARM architecture v7 and above. The source must be a temporary
209
+
221
and will be marked as dead. */
210
+ if (arm_check_kernelpage(dc)) {
222
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s)
211
dc->base.pc_next = pc + 4;
223
*/
212
return;
224
bool link = insn & (1 << 7);
213
}
225
226
- if (insn & 7) {
227
+ if (insn & 3) {
228
goto undef;
229
}
230
if (link) {
231
ARCH(5);
232
}
233
+ if ((insn & 4)) {
234
+ /* BXNS/BLXNS: only exists for v8M with the
235
+ * security extensions, and always UNDEF if NonSecure.
236
+ * We don't implement these in the user-only mode
237
+ * either (in theory you can use them from Secure User
238
+ * mode but they are too tied in to system emulation.)
239
+ */
240
+ if (!s->v8m_secure || IS_USER_ONLY) {
241
+ goto undef;
242
+ }
243
+ if (link) {
244
+ /* BLXNS: not yet implemented */
245
+ goto undef;
246
+ } else {
247
+ gen_bxns(s, rm);
248
+ }
249
+ break;
250
+ }
251
+ /* BLX/BX */
252
tmp = load_reg(s, rm);
253
if (link) {
254
val = (uint32_t)s->pc | 1;
255
@@ -XXX,XX +XXX,XX @@ void gen_intermediate_code(CPUState *cs, TranslationBlock *tb)
256
dc->vec_stride = ARM_TBFLAG_VECSTRIDE(tb->flags);
257
dc->c15_cpar = ARM_TBFLAG_XSCALE_CPAR(tb->flags);
258
dc->v7m_handler_mode = ARM_TBFLAG_HANDLER(tb->flags);
259
+ dc->v8m_secure = arm_feature(env, ARM_FEATURE_M_SECURITY) &&
260
+ regime_is_secure(env, dc->mmu_idx);
261
dc->cp_regs = cpu->cp_regs;
262
dc->features = env->features;
263
264
--
214
--
265
2.7.4
215
2.25.1
266
216
267
217
diff view generated by jsdifflib
1
As the first step in implementing ARM v8M's security extension:
1
From: Richard Henderson <richard.henderson@linaro.org>
2
* add a new feature bit ARM_FEATURE_M_SECURITY
3
* add the CPU state field that indicates whether the CPU is
4
currently in the secure state
5
* add a migration subsection for this new state
6
(we will add the Secure copies of banked register state
7
to this subsection in later patches)
8
* add a #define for the one new-in-v8M exception type
9
* make the CPU debug log print S/NS status
10
2
3
Misaligned thumb PC is architecturally impossible.
4
Assert is better than proceeding, in case we've missed
5
something somewhere.
6
7
Expand a comment about aligning the pc in gdbstub.
8
Fail an incoming migrate if a thumb pc is misaligned.
9
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 1503414539-28762-4-git-send-email-peter.maydell@linaro.org
14
---
13
---
15
target/arm/cpu.h | 3 +++
14
target/arm/gdbstub.c | 9 +++++++--
16
target/arm/cpu.c | 4 ++++
15
target/arm/machine.c | 10 ++++++++++
17
target/arm/machine.c | 20 ++++++++++++++++++++
16
target/arm/translate.c | 3 +++
18
target/arm/translate.c | 8 +++++++-
17
3 files changed, 20 insertions(+), 2 deletions(-)
19
4 files changed, 34 insertions(+), 1 deletion(-)
20
18
21
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
22
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/cpu.h
21
--- a/target/arm/gdbstub.c
24
+++ b/target/arm/cpu.h
22
+++ b/target/arm/gdbstub.c
25
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
26
#define ARMV7M_EXCP_MEM 4
24
27
#define ARMV7M_EXCP_BUS 5
25
tmp = ldl_p(mem_buf);
28
#define ARMV7M_EXCP_USAGE 6
26
29
+#define ARMV7M_EXCP_SECURE 7
27
- /* Mask out low bit of PC to workaround gdb bugs. This will probably
30
#define ARMV7M_EXCP_SVC 11
28
- cause problems if we ever implement the Jazelle DBX extensions. */
31
#define ARMV7M_EXCP_DEBUG 12
29
+ /*
32
#define ARMV7M_EXCP_PENDSV 14
30
+ * Mask out low bits of PC to workaround gdb bugs.
33
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
31
+ * This avoids an assert in thumb_tr_translate_insn, because it is
34
int exception;
32
+ * architecturally impossible to misalign the pc.
35
uint32_t primask;
33
+ * This will probably cause problems if we ever implement the
36
uint32_t faultmask;
34
+ * Jazelle DBX extensions.
37
+ uint32_t secure; /* Is CPU in Secure state? (not guest visible) */
35
+ */
38
} v7m;
36
if (n == 15) {
39
37
tmp &= ~1;
40
/* Information associated with an exception about to be taken:
38
}
41
@@ -XXX,XX +XXX,XX @@ enum arm_features {
42
ARM_FEATURE_THUMB_DSP, /* DSP insns supported in the Thumb encodings */
43
ARM_FEATURE_PMU, /* has PMU support */
44
ARM_FEATURE_VBAR, /* has cp15 VBAR */
45
+ ARM_FEATURE_M_SECURITY, /* M profile Security Extension */
46
};
47
48
static inline int arm_feature(CPUARMState *env, int feature)
49
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
50
index XXXXXXX..XXXXXXX 100644
51
--- a/target/arm/cpu.c
52
+++ b/target/arm/cpu.c
53
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
54
uint32_t initial_pc; /* Loaded from 0x4 */
55
uint8_t *rom;
56
57
+ if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
58
+ env->v7m.secure = true;
59
+ }
60
+
61
/* The reset value of this bit is IMPDEF, but ARM recommends
62
* that it resets to 1, so QEMU always does that rather than making
63
* it dependent on CPU model.
64
diff --git a/target/arm/machine.c b/target/arm/machine.c
39
diff --git a/target/arm/machine.c b/target/arm/machine.c
65
index XXXXXXX..XXXXXXX 100644
40
index XXXXXXX..XXXXXXX 100644
66
--- a/target/arm/machine.c
41
--- a/target/arm/machine.c
67
+++ b/target/arm/machine.c
42
+++ b/target/arm/machine.c
68
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pmsav8 = {
43
@@ -XXX,XX +XXX,XX @@ static int cpu_post_load(void *opaque, int version_id)
44
return -1;
45
}
69
}
46
}
70
};
71
72
+static bool m_security_needed(void *opaque)
73
+{
74
+ ARMCPU *cpu = opaque;
75
+ CPUARMState *env = &cpu->env;
76
+
47
+
77
+ return arm_feature(env, ARM_FEATURE_M_SECURITY);
48
+ /*
78
+}
49
+ * Misaligned thumb pc is architecturally impossible.
50
+ * We have an assert in thumb_tr_translate_insn to verify this.
51
+ * Fail an incoming migrate to avoid this assert.
52
+ */
53
+ if (!is_a64(env) && env->thumb && (env->regs[15] & 1)) {
54
+ return -1;
55
+ }
79
+
56
+
80
+static const VMStateDescription vmstate_m_security = {
57
if (!kvm_enabled()) {
81
+ .name = "cpu/m-security",
58
pmu_op_finish(&cpu->env);
82
+ .version_id = 1,
83
+ .minimum_version_id = 1,
84
+ .needed = m_security_needed,
85
+ .fields = (VMStateField[]) {
86
+ VMSTATE_UINT32(env.v7m.secure, ARMCPU),
87
+ VMSTATE_END_OF_LIST()
88
+ }
89
+};
90
+
91
static int get_cpsr(QEMUFile *f, void *opaque, size_t size,
92
VMStateField *field)
93
{
94
@@ -XXX,XX +XXX,XX @@ const VMStateDescription vmstate_arm_cpu = {
95
&vmstate_pmsav7_rnr,
96
&vmstate_pmsav7,
97
&vmstate_pmsav8,
98
+ &vmstate_m_security,
99
NULL
100
}
59
}
101
};
102
diff --git a/target/arm/translate.c b/target/arm/translate.c
60
diff --git a/target/arm/translate.c b/target/arm/translate.c
103
index XXXXXXX..XXXXXXX 100644
61
index XXXXXXX..XXXXXXX 100644
104
--- a/target/arm/translate.c
62
--- a/target/arm/translate.c
105
+++ b/target/arm/translate.c
63
+++ b/target/arm/translate.c
106
@@ -XXX,XX +XXX,XX @@ void arm_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
64
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
107
if (arm_feature(env, ARM_FEATURE_M)) {
65
uint32_t insn;
108
uint32_t xpsr = xpsr_read(env);
66
bool is_16bit;
109
const char *mode;
67
110
+ const char *ns_status = "";
68
+ /* Misaligned thumb PC is architecturally impossible. */
69
+ assert((dc->base.pc_next & 1) == 0);
111
+
70
+
112
+ if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
71
if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
113
+ ns_status = env->v7m.secure ? "S " : "NS ";
72
dc->base.pc_next = pc + 2;
114
+ }
73
return;
115
116
if (xpsr & XPSR_EXCP) {
117
mode = "handler";
118
@@ -XXX,XX +XXX,XX @@ void arm_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
119
}
120
}
121
122
- cpu_fprintf(f, "XPSR=%08x %c%c%c%c %c %s\n",
123
+ cpu_fprintf(f, "XPSR=%08x %c%c%c%c %c %s%s\n",
124
xpsr,
125
xpsr & XPSR_N ? 'N' : '-',
126
xpsr & XPSR_Z ? 'Z' : '-',
127
xpsr & XPSR_C ? 'C' : '-',
128
xpsr & XPSR_V ? 'V' : '-',
129
xpsr & XPSR_T ? 'T' : 'A',
130
+ ns_status,
131
mode);
132
} else {
133
uint32_t psr = cpsr_read(env);
134
--
74
--
135
2.7.4
75
2.25.1
136
76
137
77
diff view generated by jsdifflib
1
Make the MPU registers MPU_MAIR0 and MPU_MAIR1 banked if v8M security
1
From: Richard Henderson <richard.henderson@linaro.org>
2
extensions are enabled.
3
2
3
Both single-step and pc alignment faults have priority over
4
breakpoint exceptions.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 1503414539-28762-13-git-send-email-peter.maydell@linaro.org
7
---
9
---
8
target/arm/cpu.h | 4 ++--
10
target/arm/debug_helper.c | 23 +++++++++++++++++++++++
9
hw/intc/armv7m_nvic.c | 8 ++++----
11
1 file changed, 23 insertions(+)
10
target/arm/cpu.c | 6 ++++--
11
target/arm/machine.c | 6 ++++--
12
4 files changed, 14 insertions(+), 10 deletions(-)
13
12
14
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
13
diff --git a/target/arm/debug_helper.c b/target/arm/debug_helper.c
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.h
15
--- a/target/arm/debug_helper.c
17
+++ b/target/arm/cpu.h
16
+++ b/target/arm/debug_helper.c
18
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
17
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_breakpoint(CPUState *cs)
19
*/
18
{
20
uint32_t *rbar;
19
ARMCPU *cpu = ARM_CPU(cs);
21
uint32_t *rlar;
20
CPUARMState *env = &cpu->env;
22
- uint32_t mair0;
21
+ target_ulong pc;
23
- uint32_t mair1;
22
int n;
24
+ uint32_t mair0[2];
23
25
+ uint32_t mair1[2];
24
/*
26
} pmsav8;
25
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_breakpoint(CPUState *cs)
27
26
return false;
28
void *nvic;
29
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/intc/armv7m_nvic.c
32
+++ b/hw/intc/armv7m_nvic.c
33
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
34
if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
35
goto bad_offset;
36
}
37
- return cpu->env.pmsav8.mair0;
38
+ return cpu->env.pmsav8.mair0[attrs.secure];
39
case 0xdc4: /* MPU_MAIR1 */
40
if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
41
goto bad_offset;
42
}
43
- return cpu->env.pmsav8.mair1;
44
+ return cpu->env.pmsav8.mair1[attrs.secure];
45
default:
46
bad_offset:
47
qemu_log_mask(LOG_GUEST_ERROR, "NVIC: Bad read offset 0x%x\n", offset);
48
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
49
}
50
if (cpu->pmsav7_dregion) {
51
/* Register is RES0 if no MPU regions are implemented */
52
- cpu->env.pmsav8.mair0 = value;
53
+ cpu->env.pmsav8.mair0[attrs.secure] = value;
54
}
55
/* We don't need to do anything else because memory attributes
56
* only affect cacheability, and we don't implement caching.
57
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
58
}
59
if (cpu->pmsav7_dregion) {
60
/* Register is RES0 if no MPU regions are implemented */
61
- cpu->env.pmsav8.mair1 = value;
62
+ cpu->env.pmsav8.mair1[attrs.secure] = value;
63
}
64
/* We don't need to do anything else because memory attributes
65
* only affect cacheability, and we don't implement caching.
66
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/arm/cpu.c
69
+++ b/target/arm/cpu.c
70
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
71
}
72
}
73
env->pmsav7.rnr = 0;
74
- env->pmsav8.mair0 = 0;
75
- env->pmsav8.mair1 = 0;
76
+ env->pmsav8.mair0[M_REG_NS] = 0;
77
+ env->pmsav8.mair0[M_REG_S] = 0;
78
+ env->pmsav8.mair1[M_REG_NS] = 0;
79
+ env->pmsav8.mair1[M_REG_S] = 0;
80
}
27
}
81
28
82
set_flush_to_zero(1, &env->vfp.standard_fp_status);
29
+ /*
83
diff --git a/target/arm/machine.c b/target/arm/machine.c
30
+ * Single-step exceptions have priority over breakpoint exceptions.
84
index XXXXXXX..XXXXXXX 100644
31
+ * If single-step state is active-pending, suppress the bp.
85
--- a/target/arm/machine.c
32
+ */
86
+++ b/target/arm/machine.c
33
+ if (arm_singlestep_active(env) && !(env->pstate & PSTATE_SS)) {
87
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pmsav8 = {
34
+ return false;
88
vmstate_info_uint32, uint32_t),
35
+ }
89
VMSTATE_VARRAY_UINT32(env.pmsav8.rlar, ARMCPU, pmsav7_dregion, 0,
36
+
90
vmstate_info_uint32, uint32_t),
37
+ /*
91
- VMSTATE_UINT32(env.pmsav8.mair0, ARMCPU),
38
+ * PC alignment faults have priority over breakpoint exceptions.
92
- VMSTATE_UINT32(env.pmsav8.mair1, ARMCPU),
39
+ */
93
+ VMSTATE_UINT32(env.pmsav8.mair0[M_REG_NS], ARMCPU),
40
+ pc = is_a64(env) ? env->pc : env->regs[15];
94
+ VMSTATE_UINT32(env.pmsav8.mair1[M_REG_NS], ARMCPU),
41
+ if ((is_a64(env) || !env->thumb) && (pc & 3) != 0) {
95
VMSTATE_END_OF_LIST()
42
+ return false;
96
}
43
+ }
97
};
44
+
98
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
45
+ /*
99
VMSTATE_UINT32(env.v7m.faultmask[M_REG_S], ARMCPU),
46
+ * Instruction aborts have priority over breakpoint exceptions.
100
VMSTATE_UINT32(env.v7m.control[M_REG_S], ARMCPU),
47
+ * TODO: We would need to look up the page for PC and verify that
101
VMSTATE_UINT32(env.v7m.vecbase[M_REG_S], ARMCPU),
48
+ * it is present and executable.
102
+ VMSTATE_UINT32(env.pmsav8.mair0[M_REG_S], ARMCPU),
49
+ */
103
+ VMSTATE_UINT32(env.pmsav8.mair1[M_REG_S], ARMCPU),
50
+
104
VMSTATE_END_OF_LIST()
51
for (n = 0; n < ARRAY_SIZE(env->cpu_breakpoint); n++) {
105
}
52
if (bp_wp_matches(cpu, n, false)) {
106
};
53
return true;
107
--
54
--
108
2.7.4
55
2.25.1
109
56
110
57
diff view generated by jsdifflib
1
For v8M the range 0xe002e000..0xe002efff is an alias region which
1
From: Richard Henderson <richard.henderson@linaro.org>
2
for secure accesses behaves like a NonSecure access to the main
3
SCS region. (For nonsecure accesses including when the security
4
extension is not implemented, it is RAZ/WI.)
5
2
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 1503414539-28762-11-git-send-email-peter.maydell@linaro.org
8
---
6
---
9
include/hw/intc/armv7m_nvic.h | 1 +
7
tests/tcg/aarch64/pcalign-a64.c | 37 +++++++++++++++++++++++++
10
hw/intc/armv7m_nvic.c | 66 ++++++++++++++++++++++++++++++++++++++++++-
8
tests/tcg/arm/pcalign-a32.c | 46 +++++++++++++++++++++++++++++++
11
2 files changed, 66 insertions(+), 1 deletion(-)
9
tests/tcg/aarch64/Makefile.target | 4 +--
10
tests/tcg/arm/Makefile.target | 4 +++
11
4 files changed, 89 insertions(+), 2 deletions(-)
12
create mode 100644 tests/tcg/aarch64/pcalign-a64.c
13
create mode 100644 tests/tcg/arm/pcalign-a32.c
12
14
13
diff --git a/include/hw/intc/armv7m_nvic.h b/include/hw/intc/armv7m_nvic.h
15
diff --git a/tests/tcg/aarch64/pcalign-a64.c b/tests/tcg/aarch64/pcalign-a64.c
14
index XXXXXXX..XXXXXXX 100644
16
new file mode 100644
15
--- a/include/hw/intc/armv7m_nvic.h
17
index XXXXXXX..XXXXXXX
16
+++ b/include/hw/intc/armv7m_nvic.h
18
--- /dev/null
17
@@ -XXX,XX +XXX,XX @@ typedef struct NVICState {
19
+++ b/tests/tcg/aarch64/pcalign-a64.c
18
int exception_prio; /* group prio of the highest prio active exception */
20
@@ -XXX,XX +XXX,XX @@
19
21
+/* Test PC misalignment exception */
20
MemoryRegion sysregmem;
22
+
21
+ MemoryRegion sysreg_ns_mem;
23
+#include <assert.h>
22
MemoryRegion container;
24
+#include <signal.h>
23
25
+#include <stdlib.h>
24
uint32_t num_irq;
26
+#include <stdio.h>
25
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
27
+
26
index XXXXXXX..XXXXXXX 100644
28
+static void *expected;
27
--- a/hw/intc/armv7m_nvic.c
29
+
28
+++ b/hw/intc/armv7m_nvic.c
30
+static void sigbus(int sig, siginfo_t *info, void *vuc)
29
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps nvic_sysreg_ops = {
30
.endianness = DEVICE_NATIVE_ENDIAN,
31
};
32
33
+static MemTxResult nvic_sysreg_ns_write(void *opaque, hwaddr addr,
34
+ uint64_t value, unsigned size,
35
+ MemTxAttrs attrs)
36
+{
31
+{
37
+ if (attrs.secure) {
32
+ assert(info->si_code == BUS_ADRALN);
38
+ /* S accesses to the alias act like NS accesses to the real region */
33
+ assert(info->si_addr == expected);
39
+ attrs.secure = 0;
34
+ exit(EXIT_SUCCESS);
40
+ return nvic_sysreg_write(opaque, addr, value, size, attrs);
41
+ } else {
42
+ /* NS attrs are RAZ/WI for privileged, and BusFault for user */
43
+ if (attrs.user) {
44
+ return MEMTX_ERROR;
45
+ }
46
+ return MEMTX_OK;
47
+ }
48
+}
35
+}
49
+
36
+
50
+static MemTxResult nvic_sysreg_ns_read(void *opaque, hwaddr addr,
37
+int main()
51
+ uint64_t *data, unsigned size,
52
+ MemTxAttrs attrs)
53
+{
38
+{
54
+ if (attrs.secure) {
39
+ void *tmp;
55
+ /* S accesses to the alias act like NS accesses to the real region */
40
+
56
+ attrs.secure = 0;
41
+ struct sigaction sa = {
57
+ return nvic_sysreg_read(opaque, addr, data, size, attrs);
42
+ .sa_sigaction = sigbus,
58
+ } else {
43
+ .sa_flags = SA_SIGINFO
59
+ /* NS attrs are RAZ/WI for privileged, and BusFault for user */
44
+ };
60
+ if (attrs.user) {
45
+
61
+ return MEMTX_ERROR;
46
+ if (sigaction(SIGBUS, &sa, NULL) < 0) {
62
+ }
47
+ perror("sigaction");
63
+ *data = 0;
48
+ return EXIT_FAILURE;
64
+ return MEMTX_OK;
65
+ }
49
+ }
50
+
51
+ asm volatile("adr %0, 1f + 1\n\t"
52
+ "str %0, %1\n\t"
53
+ "br %0\n"
54
+ "1:"
55
+ : "=&r"(tmp), "=m"(expected));
56
+ abort();
57
+}
58
diff --git a/tests/tcg/arm/pcalign-a32.c b/tests/tcg/arm/pcalign-a32.c
59
new file mode 100644
60
index XXXXXXX..XXXXXXX
61
--- /dev/null
62
+++ b/tests/tcg/arm/pcalign-a32.c
63
@@ -XXX,XX +XXX,XX @@
64
+/* Test PC misalignment exception */
65
+
66
+#ifdef __thumb__
67
+#error "This test must be compiled for ARM"
68
+#endif
69
+
70
+#include <assert.h>
71
+#include <signal.h>
72
+#include <stdlib.h>
73
+#include <stdio.h>
74
+
75
+static void *expected;
76
+
77
+static void sigbus(int sig, siginfo_t *info, void *vuc)
78
+{
79
+ assert(info->si_code == BUS_ADRALN);
80
+ assert(info->si_addr == expected);
81
+ exit(EXIT_SUCCESS);
66
+}
82
+}
67
+
83
+
68
+static const MemoryRegionOps nvic_sysreg_ns_ops = {
84
+int main()
69
+ .read_with_attrs = nvic_sysreg_ns_read,
85
+{
70
+ .write_with_attrs = nvic_sysreg_ns_write,
86
+ void *tmp;
71
+ .endianness = DEVICE_NATIVE_ENDIAN,
72
+};
73
+
87
+
74
static int nvic_post_load(void *opaque, int version_id)
88
+ struct sigaction sa = {
75
{
89
+ .sa_sigaction = sigbus,
76
NVICState *s = opaque;
90
+ .sa_flags = SA_SIGINFO
77
@@ -XXX,XX +XXX,XX @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
91
+ };
78
NVICState *s = NVIC(dev);
92
+
79
SysBusDevice *systick_sbd;
93
+ if (sigaction(SIGBUS, &sa, NULL) < 0) {
80
Error *err = NULL;
94
+ perror("sigaction");
81
+ int regionlen;
95
+ return EXIT_FAILURE;
82
83
s->cpu = ARM_CPU(qemu_get_cpu(0));
84
assert(s->cpu);
85
@@ -XXX,XX +XXX,XX @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
86
* 0xd00..0xd3c - SCS registers
87
* 0xd40..0xeff - Reserved or Not implemented
88
* 0xf00 - STIR
89
+ *
90
+ * Some registers within this space are banked between security states.
91
+ * In v8M there is a second range 0xe002e000..0xe002efff which is the
92
+ * NonSecure alias SCS; secure accesses to this behave like NS accesses
93
+ * to the main SCS range, and non-secure accesses (including when
94
+ * the security extension is not implemented) are RAZ/WI.
95
+ * Note that both the main SCS range and the alias range are defined
96
+ * to be exempt from memory attribution (R_BLJT) and so the memory
97
+ * transaction attribute always matches the current CPU security
98
+ * state (attrs.secure == env->v7m.secure). In the nvic_sysreg_ns_ops
99
+ * wrappers we change attrs.secure to indicate the NS access; so
100
+ * generally code determining which banked register to use should
101
+ * use attrs.secure; code determining actual behaviour of the system
102
+ * should use env->v7m.secure.
103
*/
104
- memory_region_init(&s->container, OBJECT(s), "nvic", 0x1000);
105
+ regionlen = arm_feature(&s->cpu->env, ARM_FEATURE_V8) ? 0x21000 : 0x1000;
106
+ memory_region_init(&s->container, OBJECT(s), "nvic", regionlen);
107
/* The system register region goes at the bottom of the priority
108
* stack as it covers the whole page.
109
*/
110
@@ -XXX,XX +XXX,XX @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
111
sysbus_mmio_get_region(systick_sbd, 0),
112
1);
113
114
+ if (arm_feature(&s->cpu->env, ARM_FEATURE_V8)) {
115
+ memory_region_init_io(&s->sysreg_ns_mem, OBJECT(s),
116
+ &nvic_sysreg_ns_ops, s,
117
+ "nvic_sysregs_ns", 0x1000);
118
+ memory_region_add_subregion(&s->container, 0x20000, &s->sysreg_ns_mem);
119
+ }
96
+ }
120
+
97
+
121
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->container);
98
+ asm volatile("adr %0, 1f + 2\n\t"
122
}
99
+ "str %0, %1\n\t"
123
100
+ "bx %0\n"
101
+ "1:"
102
+ : "=&r"(tmp), "=m"(expected));
103
+
104
+ /*
105
+ * From v8, it is CONSTRAINED UNPREDICTABLE whether BXWritePC aligns
106
+ * the address or not. If so, we can legitimately fall through.
107
+ */
108
+ return EXIT_SUCCESS;
109
+}
110
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
111
index XXXXXXX..XXXXXXX 100644
112
--- a/tests/tcg/aarch64/Makefile.target
113
+++ b/tests/tcg/aarch64/Makefile.target
114
@@ -XXX,XX +XXX,XX @@ VPATH         += $(ARM_SRC)
115
AARCH64_SRC=$(SRC_PATH)/tests/tcg/aarch64
116
VPATH         += $(AARCH64_SRC)
117
118
-# Float-convert Tests
119
-AARCH64_TESTS=fcvt
120
+# Base architecture tests
121
+AARCH64_TESTS=fcvt pcalign-a64
122
123
fcvt: LDFLAGS+=-lm
124
125
diff --git a/tests/tcg/arm/Makefile.target b/tests/tcg/arm/Makefile.target
126
index XXXXXXX..XXXXXXX 100644
127
--- a/tests/tcg/arm/Makefile.target
128
+++ b/tests/tcg/arm/Makefile.target
129
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
130
    $(call run-test,fcvt,$(QEMU) $<,"$< on $(TARGET_NAME)")
131
    $(call diff-out,fcvt,$(ARM_SRC)/fcvt.ref)
132
133
+# PC alignment test
134
+ARM_TESTS += pcalign-a32
135
+pcalign-a32: CFLAGS+=-marm
136
+
137
ifeq ($(CONFIG_ARM_COMPATIBLE_SEMIHOSTING),y)
138
139
# Semihosting smoke test for linux-user
124
--
140
--
125
2.7.4
141
2.25.1
126
142
127
143
diff view generated by jsdifflib
1
Make the VTOR register banked if v8M security extensions are enabled.
1
In the SSE decode function gen_sse(), we combine a byte
2
'b' and a value 'b1' which can be [0..3], and switch on them:
3
b |= (b1 << 8);
4
switch (b) {
5
...
6
default:
7
unknown_op:
8
gen_unknown_opcode(env, s);
9
return;
10
}
2
11
12
In three cases inside this switch, we were then also checking for
13
"if (b1 >= 2) { goto unknown_op; }".
14
However, this can never happen, because the 'case' values in each place
15
are 0x0nn or 0x1nn and the switch will have directed the b1 == (2, 3)
16
cases to the default already.
17
18
This check was added in commit c045af25a52e9 in 2010; the added code
19
was unnecessary then as well, and was apparently intended only to
20
ensure that we never accidentally ended up indexing off the end
21
of an sse_op_table with only 2 entries as a result of future bugs
22
in the decode logic.
23
24
Change the checks to assert() instead, and make sure they're always
25
immediately before the array access they are protecting.
26
27
Fixes: Coverity CID 1460207
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 1503414539-28762-12-git-send-email-peter.maydell@linaro.org
6
---
30
---
7
target/arm/cpu.h | 2 +-
31
target/i386/tcg/translate.c | 12 +++---------
8
hw/intc/armv7m_nvic.c | 13 +++++++------
32
1 file changed, 3 insertions(+), 9 deletions(-)
9
target/arm/helper.c | 2 +-
10
target/arm/machine.c | 3 ++-
11
4 files changed, 11 insertions(+), 9 deletions(-)
12
33
13
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
34
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
14
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/cpu.h
36
--- a/target/i386/tcg/translate.c
16
+++ b/target/arm/cpu.h
37
+++ b/target/i386/tcg/translate.c
17
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
38
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
18
39
case 0x171: /* shift xmm, im */
19
struct {
40
case 0x172:
20
uint32_t other_sp;
41
case 0x173:
21
- uint32_t vecbase;
42
- if (b1 >= 2) {
22
+ uint32_t vecbase[2];
43
- goto unknown_op;
23
uint32_t basepri[2];
44
- }
24
uint32_t control[2];
45
val = x86_ldub_code(env, s);
25
uint32_t ccr; /* Configuration and Control */
46
if (is_xmm) {
26
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
47
tcg_gen_movi_tl(s->T0, val);
27
index XXXXXXX..XXXXXXX 100644
48
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
28
--- a/hw/intc/armv7m_nvic.c
49
offsetof(CPUX86State, mmx_t0.MMX_L(1)));
29
+++ b/hw/intc/armv7m_nvic.c
50
op1_offset = offsetof(CPUX86State,mmx_t0);
30
@@ -XXX,XX +XXX,XX @@ static void set_irq_level(void *opaque, int n, int level)
51
}
31
}
52
+ assert(b1 < 2);
32
}
53
sse_fn_epp = sse_op_table2[((b - 1) & 3) * 8 +
33
54
(((modrm >> 3)) & 7)][b1];
34
-static uint32_t nvic_readl(NVICState *s, uint32_t offset)
55
if (!sse_fn_epp) {
35
+static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
56
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
36
{
57
rm = modrm & 7;
37
ARMCPU *cpu = s->cpu;
58
reg = ((modrm >> 3) & 7) | REX_R(s);
38
uint32_t val;
59
mod = (modrm >> 6) & 3;
39
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset)
60
- if (b1 >= 2) {
40
/* ISRPREEMPT not implemented */
61
- goto unknown_op;
41
return val;
62
- }
42
case 0xd08: /* Vector Table Offset. */
63
43
- return cpu->env.v7m.vecbase;
64
+ assert(b1 < 2);
44
+ return cpu->env.v7m.vecbase[attrs.secure];
65
sse_fn_epp = sse_op_table6[b].op[b1];
45
case 0xd0c: /* Application Interrupt/Reset Control. */
66
if (!sse_fn_epp) {
46
return 0xfa050000 | (s->prigroup << 8);
67
goto unknown_op;
47
case 0xd10: /* System Control. */
68
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
48
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset)
69
rm = modrm & 7;
49
}
70
reg = ((modrm >> 3) & 7) | REX_R(s);
50
}
71
mod = (modrm >> 6) & 3;
51
72
- if (b1 >= 2) {
52
-static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value)
73
- goto unknown_op;
53
+static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
74
- }
54
+ MemTxAttrs attrs)
75
55
{
76
+ assert(b1 < 2);
56
ARMCPU *cpu = s->cpu;
77
sse_fn_eppi = sse_op_table7[b].op[b1];
57
78
if (!sse_fn_eppi) {
58
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value)
79
goto unknown_op;
59
}
60
break;
61
case 0xd08: /* Vector Table Offset. */
62
- cpu->env.v7m.vecbase = value & 0xffffff80;
63
+ cpu->env.v7m.vecbase[attrs.secure] = value & 0xffffff80;
64
break;
65
case 0xd0c: /* Application Interrupt/Reset Control. */
66
if ((value >> 16) == 0x05fa) {
67
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_read(void *opaque, hwaddr addr,
68
break;
69
default:
70
if (size == 4) {
71
- val = nvic_readl(s, offset);
72
+ val = nvic_readl(s, offset, attrs);
73
} else {
74
qemu_log_mask(LOG_GUEST_ERROR,
75
"NVIC: Bad read of size %d at offset 0x%x\n",
76
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
77
return MEMTX_OK;
78
}
79
if (size == 4) {
80
- nvic_writel(s, offset, value);
81
+ nvic_writel(s, offset, value, attrs);
82
return MEMTX_OK;
83
}
84
qemu_log_mask(LOG_GUEST_ERROR,
85
diff --git a/target/arm/helper.c b/target/arm/helper.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/target/arm/helper.c
88
+++ b/target/arm/helper.c
89
@@ -XXX,XX +XXX,XX @@ static uint32_t arm_v7m_load_vector(ARMCPU *cpu)
90
CPUState *cs = CPU(cpu);
91
CPUARMState *env = &cpu->env;
92
MemTxResult result;
93
- hwaddr vec = env->v7m.vecbase + env->v7m.exception * 4;
94
+ hwaddr vec = env->v7m.vecbase[env->v7m.secure] + env->v7m.exception * 4;
95
uint32_t addr;
96
97
addr = address_space_ldl(cs->as, vec,
98
diff --git a/target/arm/machine.c b/target/arm/machine.c
99
index XXXXXXX..XXXXXXX 100644
100
--- a/target/arm/machine.c
101
+++ b/target/arm/machine.c
102
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m = {
103
.minimum_version_id = 4,
104
.needed = m_needed,
105
.fields = (VMStateField[]) {
106
- VMSTATE_UINT32(env.v7m.vecbase, ARMCPU),
107
+ VMSTATE_UINT32(env.v7m.vecbase[M_REG_NS], ARMCPU),
108
VMSTATE_UINT32(env.v7m.basepri[M_REG_NS], ARMCPU),
109
VMSTATE_UINT32(env.v7m.control[M_REG_NS], ARMCPU),
110
VMSTATE_UINT32(env.v7m.ccr, ARMCPU),
111
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
112
VMSTATE_UINT32(env.v7m.primask[M_REG_S], ARMCPU),
113
VMSTATE_UINT32(env.v7m.faultmask[M_REG_S], ARMCPU),
114
VMSTATE_UINT32(env.v7m.control[M_REG_S], ARMCPU),
115
+ VMSTATE_UINT32(env.v7m.vecbase[M_REG_S], ARMCPU),
116
VMSTATE_END_OF_LIST()
117
}
118
};
119
--
80
--
120
2.7.4
81
2.25.1
121
82
122
83
diff view generated by jsdifflib
1
Make the MPU registers MPU_MAIR0 and MPU_MAIR1 banked if v8M security
1
The qemu-common.h header is not supposed to be included from any
2
extensions are enabled.
2
other header files, only from .c files (as documented in a comment at
3
the start of it).
3
4
4
We can freely add more items to vmstate_m_security without
5
include/hw/i386/x86.h and include/hw/i386/microvm.h break this rule.
5
breaking migration compatibility, because no CPU currently
6
In fact, the include is not required at all, so we can just drop it
6
has the ARM_FEATURE_M_SECURITY bit enabled and so this
7
from both files.
7
subsection is not yet used by anything.
8
8
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 1503414539-28762-14-git-send-email-peter.maydell@linaro.org
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20211129200510.1233037-2-peter.maydell@linaro.org
12
---
13
---
13
target/arm/cpu.h | 4 ++--
14
include/hw/i386/microvm.h | 1 -
14
hw/intc/armv7m_nvic.c | 8 ++++----
15
include/hw/i386/x86.h | 1 -
15
target/arm/cpu.c | 26 ++++++++++++++++++++------
16
2 files changed, 2 deletions(-)
16
target/arm/helper.c | 11 ++++++-----
17
target/arm/machine.c | 12 ++++++++----
18
5 files changed, 40 insertions(+), 21 deletions(-)
19
17
20
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
diff --git a/include/hw/i386/microvm.h b/include/hw/i386/microvm.h
21
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/cpu.h
20
--- a/include/hw/i386/microvm.h
23
+++ b/target/arm/cpu.h
21
+++ b/include/hw/i386/microvm.h
24
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
22
@@ -XXX,XX +XXX,XX @@
25
* pmsav7.rnr (region number register)
23
#ifndef HW_I386_MICROVM_H
26
* pmsav7_dregion (number of configured regions)
24
#define HW_I386_MICROVM_H
27
*/
25
28
- uint32_t *rbar;
26
-#include "qemu-common.h"
29
- uint32_t *rlar;
27
#include "exec/hwaddr.h"
30
+ uint32_t *rbar[2];
28
#include "qemu/notify.h"
31
+ uint32_t *rlar[2];
29
32
uint32_t mair0[2];
30
diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
33
uint32_t mair1[2];
34
} pmsav8;
35
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
36
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
37
--- a/hw/intc/armv7m_nvic.c
32
--- a/include/hw/i386/x86.h
38
+++ b/hw/intc/armv7m_nvic.c
33
+++ b/include/hw/i386/x86.h
39
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
34
@@ -XXX,XX +XXX,XX @@
40
if (region >= cpu->pmsav7_dregion) {
35
#ifndef HW_I386_X86_H
41
return 0;
36
#define HW_I386_X86_H
42
}
37
43
- return cpu->env.pmsav8.rbar[region];
38
-#include "qemu-common.h"
44
+ return cpu->env.pmsav8.rbar[attrs.secure][region];
39
#include "exec/hwaddr.h"
45
}
40
#include "qemu/notify.h"
46
41
47
if (region >= cpu->pmsav7_dregion) {
48
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
49
if (region >= cpu->pmsav7_dregion) {
50
return 0;
51
}
52
- return cpu->env.pmsav8.rlar[region];
53
+ return cpu->env.pmsav8.rlar[attrs.secure][region];
54
}
55
56
if (region >= cpu->pmsav7_dregion) {
57
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
58
if (region >= cpu->pmsav7_dregion) {
59
return;
60
}
61
- cpu->env.pmsav8.rbar[region] = value;
62
+ cpu->env.pmsav8.rbar[attrs.secure][region] = value;
63
tlb_flush(CPU(cpu));
64
return;
65
}
66
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
67
if (region >= cpu->pmsav7_dregion) {
68
return;
69
}
70
- cpu->env.pmsav8.rlar[region] = value;
71
+ cpu->env.pmsav8.rlar[attrs.secure][region] = value;
72
tlb_flush(CPU(cpu));
73
return;
74
}
75
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/arm/cpu.c
78
+++ b/target/arm/cpu.c
79
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
80
if (arm_feature(env, ARM_FEATURE_PMSA)) {
81
if (cpu->pmsav7_dregion > 0) {
82
if (arm_feature(env, ARM_FEATURE_V8)) {
83
- memset(env->pmsav8.rbar, 0,
84
- sizeof(*env->pmsav8.rbar) * cpu->pmsav7_dregion);
85
- memset(env->pmsav8.rlar, 0,
86
- sizeof(*env->pmsav8.rlar) * cpu->pmsav7_dregion);
87
+ memset(env->pmsav8.rbar[M_REG_NS], 0,
88
+ sizeof(*env->pmsav8.rbar[M_REG_NS])
89
+ * cpu->pmsav7_dregion);
90
+ memset(env->pmsav8.rlar[M_REG_NS], 0,
91
+ sizeof(*env->pmsav8.rlar[M_REG_NS])
92
+ * cpu->pmsav7_dregion);
93
+ if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
94
+ memset(env->pmsav8.rbar[M_REG_S], 0,
95
+ sizeof(*env->pmsav8.rbar[M_REG_S])
96
+ * cpu->pmsav7_dregion);
97
+ memset(env->pmsav8.rlar[M_REG_S], 0,
98
+ sizeof(*env->pmsav8.rlar[M_REG_S])
99
+ * cpu->pmsav7_dregion);
100
+ }
101
} else if (arm_feature(env, ARM_FEATURE_V7)) {
102
memset(env->pmsav7.drbar, 0,
103
sizeof(*env->pmsav7.drbar) * cpu->pmsav7_dregion);
104
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
105
if (nr) {
106
if (arm_feature(env, ARM_FEATURE_V8)) {
107
/* PMSAv8 */
108
- env->pmsav8.rbar = g_new0(uint32_t, nr);
109
- env->pmsav8.rlar = g_new0(uint32_t, nr);
110
+ env->pmsav8.rbar[M_REG_NS] = g_new0(uint32_t, nr);
111
+ env->pmsav8.rlar[M_REG_NS] = g_new0(uint32_t, nr);
112
+ if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
113
+ env->pmsav8.rbar[M_REG_S] = g_new0(uint32_t, nr);
114
+ env->pmsav8.rlar[M_REG_S] = g_new0(uint32_t, nr);
115
+ }
116
} else {
117
env->pmsav7.drbar = g_new0(uint32_t, nr);
118
env->pmsav7.drsr = g_new0(uint32_t, nr);
119
diff --git a/target/arm/helper.c b/target/arm/helper.c
120
index XXXXXXX..XXXXXXX 100644
121
--- a/target/arm/helper.c
122
+++ b/target/arm/helper.c
123
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
124
{
125
ARMCPU *cpu = arm_env_get_cpu(env);
126
bool is_user = regime_is_user(env, mmu_idx);
127
+ uint32_t secure = regime_is_secure(env, mmu_idx);
128
int n;
129
int matchregion = -1;
130
bool hit = false;
131
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
132
* with bits [4:0] all zeroes, but the limit address is bits
133
* [31:5] from the register with bits [4:0] all ones.
134
*/
135
- uint32_t base = env->pmsav8.rbar[n] & ~0x1f;
136
- uint32_t limit = env->pmsav8.rlar[n] | 0x1f;
137
+ uint32_t base = env->pmsav8.rbar[secure][n] & ~0x1f;
138
+ uint32_t limit = env->pmsav8.rlar[secure][n] | 0x1f;
139
140
- if (!(env->pmsav8.rlar[n] & 0x1)) {
141
+ if (!(env->pmsav8.rlar[secure][n] & 0x1)) {
142
/* Region disabled */
143
continue;
144
}
145
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
146
/* hit using the background region */
147
get_phys_addr_pmsav7_default(env, mmu_idx, address, prot);
148
} else {
149
- uint32_t ap = extract32(env->pmsav8.rbar[matchregion], 1, 2);
150
- uint32_t xn = extract32(env->pmsav8.rbar[matchregion], 0, 1);
151
+ uint32_t ap = extract32(env->pmsav8.rbar[secure][matchregion], 1, 2);
152
+ uint32_t xn = extract32(env->pmsav8.rbar[secure][matchregion], 0, 1);
153
154
if (m_is_system_region(env, address)) {
155
/* System space is always execute never */
156
diff --git a/target/arm/machine.c b/target/arm/machine.c
157
index XXXXXXX..XXXXXXX 100644
158
--- a/target/arm/machine.c
159
+++ b/target/arm/machine.c
160
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pmsav8 = {
161
.minimum_version_id = 1,
162
.needed = pmsav8_needed,
163
.fields = (VMStateField[]) {
164
- VMSTATE_VARRAY_UINT32(env.pmsav8.rbar, ARMCPU, pmsav7_dregion, 0,
165
- vmstate_info_uint32, uint32_t),
166
- VMSTATE_VARRAY_UINT32(env.pmsav8.rlar, ARMCPU, pmsav7_dregion, 0,
167
- vmstate_info_uint32, uint32_t),
168
+ VMSTATE_VARRAY_UINT32(env.pmsav8.rbar[M_REG_NS], ARMCPU, pmsav7_dregion,
169
+ 0, vmstate_info_uint32, uint32_t),
170
+ VMSTATE_VARRAY_UINT32(env.pmsav8.rlar[M_REG_NS], ARMCPU, pmsav7_dregion,
171
+ 0, vmstate_info_uint32, uint32_t),
172
VMSTATE_UINT32(env.pmsav8.mair0[M_REG_NS], ARMCPU),
173
VMSTATE_UINT32(env.pmsav8.mair1[M_REG_NS], ARMCPU),
174
VMSTATE_END_OF_LIST()
175
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
176
VMSTATE_UINT32(env.v7m.vecbase[M_REG_S], ARMCPU),
177
VMSTATE_UINT32(env.pmsav8.mair0[M_REG_S], ARMCPU),
178
VMSTATE_UINT32(env.pmsav8.mair1[M_REG_S], ARMCPU),
179
+ VMSTATE_VARRAY_UINT32(env.pmsav8.rbar[M_REG_S], ARMCPU, pmsav7_dregion,
180
+ 0, vmstate_info_uint32, uint32_t),
181
+ VMSTATE_VARRAY_UINT32(env.pmsav8.rlar[M_REG_S], ARMCPU, pmsav7_dregion,
182
+ 0, vmstate_info_uint32, uint32_t),
183
VMSTATE_END_OF_LIST()
184
}
185
};
186
--
42
--
187
2.7.4
43
2.25.1
188
44
189
45
diff view generated by jsdifflib
1
Make the PRIMASK register banked if v8M security extensions are enabled.
1
The qemu-common.h header is not supposed to be included from any
2
other header files, only from .c files (as documented in a comment at
3
the start of it).
2
4
3
Note that we do not yet implement the functionality of the new
5
Move the include to linux-user/hexagon/cpu_loop.c, which needs it for
4
AIRCR.PRIS bit (which allows the effect of the NS copy of PRIMASK to
6
the declaration of cpu_exec_step_atomic().
5
be restricted).
6
7
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 1503414539-28762-8-git-send-email-peter.maydell@linaro.org
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
12
Message-id: 20211129200510.1233037-3-peter.maydell@linaro.org
10
---
13
---
11
target/arm/cpu.h | 2 +-
14
target/hexagon/cpu.h | 1 -
12
hw/intc/armv7m_nvic.c | 2 +-
15
linux-user/hexagon/cpu_loop.c | 1 +
13
target/arm/helper.c | 4 ++--
16
2 files changed, 1 insertion(+), 1 deletion(-)
14
target/arm/machine.c | 9 +++++++--
15
4 files changed, 11 insertions(+), 6 deletions(-)
16
17
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h
18
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
20
--- a/target/hexagon/cpu.h
20
+++ b/target/arm/cpu.h
21
+++ b/target/hexagon/cpu.h
21
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
22
@@ -XXX,XX +XXX,XX @@ typedef struct CPUHexagonState CPUHexagonState;
22
uint32_t bfar; /* BusFault Address */
23
23
unsigned mpu_ctrl; /* MPU_CTRL */
24
#include "fpu/softfloat-types.h"
24
int exception;
25
25
- uint32_t primask;
26
-#include "qemu-common.h"
26
+ uint32_t primask[2];
27
#include "exec/cpu-defs.h"
27
uint32_t faultmask;
28
#include "hex_regs.h"
28
uint32_t secure; /* Is CPU in Secure state? (not guest visible) */
29
#include "mmvec/mmvec.h"
29
} v7m;
30
diff --git a/linux-user/hexagon/cpu_loop.c b/linux-user/hexagon/cpu_loop.c
30
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
31
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
32
--- a/hw/intc/armv7m_nvic.c
32
--- a/linux-user/hexagon/cpu_loop.c
33
+++ b/hw/intc/armv7m_nvic.c
33
+++ b/linux-user/hexagon/cpu_loop.c
34
@@ -XXX,XX +XXX,XX @@ static inline int nvic_exec_prio(NVICState *s)
34
@@ -XXX,XX +XXX,XX @@
35
35
*/
36
if (env->v7m.faultmask) {
36
37
running = -1;
37
#include "qemu/osdep.h"
38
- } else if (env->v7m.primask) {
38
+#include "qemu-common.h"
39
+ } else if (env->v7m.primask[env->v7m.secure]) {
39
#include "qemu.h"
40
running = 0;
40
#include "user-internals.h"
41
} else if (env->v7m.basepri[env->v7m.secure] > 0) {
41
#include "cpu_loop-common.h"
42
running = env->v7m.basepri[env->v7m.secure] & nvic_gprio_mask(s);
43
diff --git a/target/arm/helper.c b/target/arm/helper.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/target/arm/helper.c
46
+++ b/target/arm/helper.c
47
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
48
return (env->v7m.control & R_V7M_CONTROL_SPSEL_MASK) ?
49
env->regs[13] : env->v7m.other_sp;
50
case 16: /* PRIMASK */
51
- return env->v7m.primask;
52
+ return env->v7m.primask[env->v7m.secure];
53
case 17: /* BASEPRI */
54
case 18: /* BASEPRI_MAX */
55
return env->v7m.basepri[env->v7m.secure];
56
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
57
}
58
break;
59
case 16: /* PRIMASK */
60
- env->v7m.primask = val & 1;
61
+ env->v7m.primask[env->v7m.secure] = val & 1;
62
break;
63
case 17: /* BASEPRI */
64
env->v7m.basepri[env->v7m.secure] = val & 0xff;
65
diff --git a/target/arm/machine.c b/target/arm/machine.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/target/arm/machine.c
68
+++ b/target/arm/machine.c
69
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_faultmask_primask = {
70
.minimum_version_id = 1,
71
.fields = (VMStateField[]) {
72
VMSTATE_UINT32(env.v7m.faultmask, ARMCPU),
73
- VMSTATE_UINT32(env.v7m.primask, ARMCPU),
74
+ VMSTATE_UINT32(env.v7m.primask[M_REG_NS], ARMCPU),
75
VMSTATE_END_OF_LIST()
76
}
77
};
78
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
79
.fields = (VMStateField[]) {
80
VMSTATE_UINT32(env.v7m.secure, ARMCPU),
81
VMSTATE_UINT32(env.v7m.basepri[M_REG_S], ARMCPU),
82
+ VMSTATE_UINT32(env.v7m.primask[M_REG_S], ARMCPU),
83
VMSTATE_END_OF_LIST()
84
}
85
};
86
@@ -XXX,XX +XXX,XX @@ static int get_cpsr(QEMUFile *f, void *opaque, size_t size,
87
* differences are that the T bit is not in the same place, the
88
* primask/faultmask info may be in the CPSR I and F bits, and
89
* we do not want the mode bits.
90
+ * We know that this cleanup happened before v8M, so there
91
+ * is no complication with banked primask/faultmask.
92
*/
93
uint32_t newval = val;
94
95
+ assert(!arm_feature(env, ARM_FEATURE_M_SECURITY));
96
+
97
newval &= (CPSR_NZCV | CPSR_Q | CPSR_IT | CPSR_GE);
98
if (val & CPSR_T) {
99
newval |= XPSR_T;
100
@@ -XXX,XX +XXX,XX @@ static int get_cpsr(QEMUFile *f, void *opaque, size_t size,
101
env->v7m.faultmask = 1;
102
}
103
if (val & CPSR_I) {
104
- env->v7m.primask = 1;
105
+ env->v7m.primask[M_REG_NS] = 1;
106
}
107
val = newval;
108
}
109
--
42
--
110
2.7.4
43
2.25.1
111
44
112
45
diff view generated by jsdifflib
1
Make the BASEPRI register banked if v8M security extensions are enabled.
1
The qemu-common.h header is not supposed to be included from any
2
other header files, only from .c files (as documented in a comment at
3
the start of it).
2
4
3
Note that we do not yet implement the functionality of the new
5
Nothing actually relies on target/rx/cpu.h including it, so we can
4
AIRCR.PRIS bit (which allows the effect of the NS copy of BASEPRI to
6
just drop the include.
5
be restricted).
6
7
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 1503414539-28762-7-git-send-email-peter.maydell@linaro.org
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
12
Reviewed-by: Yoshinori Sato <ysato@users.sourceforge.jp>
13
Message-id: 20211129200510.1233037-4-peter.maydell@linaro.org
10
---
14
---
11
target/arm/cpu.h | 14 +++++++++++++-
15
target/rx/cpu.h | 1 -
12
hw/intc/armv7m_nvic.c | 4 ++--
16
1 file changed, 1 deletion(-)
13
target/arm/helper.c | 10 ++++++----
14
target/arm/machine.c | 3 ++-
15
4 files changed, 23 insertions(+), 8 deletions(-)
16
17
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
diff --git a/target/rx/cpu.h b/target/rx/cpu.h
18
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
20
--- a/target/rx/cpu.h
20
+++ b/target/arm/cpu.h
21
+++ b/target/rx/cpu.h
21
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
22
#define ARMV7M_EXCP_PENDSV 14
23
#define RX_CPU_H
23
#define ARMV7M_EXCP_SYSTICK 15
24
24
25
#include "qemu/bitops.h"
25
+/* For M profile, some registers are banked secure vs non-secure;
26
-#include "qemu-common.h"
26
+ * these are represented as a 2-element array where the first element
27
#include "hw/registerfields.h"
27
+ * is the non-secure copy and the second is the secure copy.
28
#include "cpu-qom.h"
28
+ * When the CPU does not have implement the security extension then
29
29
+ * only the first element is used.
30
+ * This means that the copy for the current security state can be
31
+ * accessed via env->registerfield[env->v7m.secure] (whether the security
32
+ * extension is implemented or not).
33
+ */
34
+#define M_REG_NS 0
35
+#define M_REG_S 1
36
+
37
/* ARM-specific interrupt pending bits. */
38
#define CPU_INTERRUPT_FIQ CPU_INTERRUPT_TGT_EXT_1
39
#define CPU_INTERRUPT_VIRQ CPU_INTERRUPT_TGT_EXT_2
40
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
41
struct {
42
uint32_t other_sp;
43
uint32_t vecbase;
44
- uint32_t basepri;
45
+ uint32_t basepri[2];
46
uint32_t control;
47
uint32_t ccr; /* Configuration and Control */
48
uint32_t cfsr; /* Configurable Fault Status */
49
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
50
index XXXXXXX..XXXXXXX 100644
51
--- a/hw/intc/armv7m_nvic.c
52
+++ b/hw/intc/armv7m_nvic.c
53
@@ -XXX,XX +XXX,XX @@ static inline int nvic_exec_prio(NVICState *s)
54
running = -1;
55
} else if (env->v7m.primask) {
56
running = 0;
57
- } else if (env->v7m.basepri > 0) {
58
- running = env->v7m.basepri & nvic_gprio_mask(s);
59
+ } else if (env->v7m.basepri[env->v7m.secure] > 0) {
60
+ running = env->v7m.basepri[env->v7m.secure] & nvic_gprio_mask(s);
61
} else {
62
running = NVIC_NOEXC_PRIO; /* lower than any possible priority */
63
}
64
diff --git a/target/arm/helper.c b/target/arm/helper.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/target/arm/helper.c
67
+++ b/target/arm/helper.c
68
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
69
return env->v7m.primask;
70
case 17: /* BASEPRI */
71
case 18: /* BASEPRI_MAX */
72
- return env->v7m.basepri;
73
+ return env->v7m.basepri[env->v7m.secure];
74
case 19: /* FAULTMASK */
75
return env->v7m.faultmask;
76
default:
77
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
78
env->v7m.primask = val & 1;
79
break;
80
case 17: /* BASEPRI */
81
- env->v7m.basepri = val & 0xff;
82
+ env->v7m.basepri[env->v7m.secure] = val & 0xff;
83
break;
84
case 18: /* BASEPRI_MAX */
85
val &= 0xff;
86
- if (val != 0 && (val < env->v7m.basepri || env->v7m.basepri == 0))
87
- env->v7m.basepri = val;
88
+ if (val != 0 && (val < env->v7m.basepri[env->v7m.secure]
89
+ || env->v7m.basepri[env->v7m.secure] == 0)) {
90
+ env->v7m.basepri[env->v7m.secure] = val;
91
+ }
92
break;
93
case 19: /* FAULTMASK */
94
env->v7m.faultmask = val & 1;
95
diff --git a/target/arm/machine.c b/target/arm/machine.c
96
index XXXXXXX..XXXXXXX 100644
97
--- a/target/arm/machine.c
98
+++ b/target/arm/machine.c
99
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m = {
100
.needed = m_needed,
101
.fields = (VMStateField[]) {
102
VMSTATE_UINT32(env.v7m.vecbase, ARMCPU),
103
- VMSTATE_UINT32(env.v7m.basepri, ARMCPU),
104
+ VMSTATE_UINT32(env.v7m.basepri[M_REG_NS], ARMCPU),
105
VMSTATE_UINT32(env.v7m.control, ARMCPU),
106
VMSTATE_UINT32(env.v7m.ccr, ARMCPU),
107
VMSTATE_UINT32(env.v7m.cfsr, ARMCPU),
108
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
109
.needed = m_security_needed,
110
.fields = (VMStateField[]) {
111
VMSTATE_UINT32(env.v7m.secure, ARMCPU),
112
+ VMSTATE_UINT32(env.v7m.basepri[M_REG_S], ARMCPU),
113
VMSTATE_END_OF_LIST()
114
}
115
};
116
--
30
--
117
2.7.4
31
2.25.1
118
32
119
33
diff view generated by jsdifflib
1
Set the MachineClass flag ignore_memory_transaction_failures
1
A lot of C files in hw/arm include qemu-common.h when they don't
2
for almost all ARM boards. This means they retain the legacy
2
need anything from it. Drop the include lines.
3
behaviour that accesses to unimplemented addresses will RAZ/WI
4
rather than aborting, when a subsequent commit adds support
5
for external aborts.
6
3
7
The exceptions are:
4
omap1.c, pxa2xx.c and strongarm.c retain the include because they
8
* virt -- we know that guests won't try to prod devices
5
use it for the prototype of qemu_get_timedate().
9
that we don't describe in the device tree or ACPI tables
10
* mps2 -- this board was written to use unimplemented-device
11
for all the ranges with devices we don't yet handle
12
13
New boards should not set the flag, but instead be written
14
like the mps2.
15
6
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Message-id: 1504626814-23124-3-git-send-email-peter.maydell@linaro.org
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
For the Xilinx boards:
10
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
20
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
11
Reviewed-by: Yoshinori Sato <ysato@users.sourceforge.jp>
12
Message-id: 20211129200510.1233037-5-peter.maydell@linaro.org
21
---
13
---
22
hw/arm/aspeed.c | 3 +++
14
hw/arm/boot.c | 1 -
23
hw/arm/collie.c | 1 +
15
hw/arm/digic_boards.c | 1 -
24
hw/arm/cubieboard.c | 1 +
16
hw/arm/highbank.c | 1 -
25
hw/arm/digic_boards.c | 1 +
17
hw/arm/npcm7xx_boards.c | 1 -
26
hw/arm/exynos4_boards.c | 2 ++
18
hw/arm/sbsa-ref.c | 1 -
27
hw/arm/gumstix.c | 2 ++
19
hw/arm/stm32f405_soc.c | 1 -
28
hw/arm/highbank.c | 2 ++
20
hw/arm/vexpress.c | 1 -
29
hw/arm/imx25_pdk.c | 1 +
21
hw/arm/virt.c | 1 -
30
hw/arm/integratorcp.c | 1 +
22
8 files changed, 8 deletions(-)
31
hw/arm/kzm.c | 1 +
32
hw/arm/mainstone.c | 1 +
33
hw/arm/musicpal.c | 1 +
34
hw/arm/netduino2.c | 1 +
35
hw/arm/nseries.c | 2 ++
36
hw/arm/omap_sx1.c | 2 ++
37
hw/arm/palm.c | 1 +
38
hw/arm/raspi.c | 1 +
39
hw/arm/realview.c | 4 ++++
40
hw/arm/sabrelite.c | 1 +
41
hw/arm/spitz.c | 4 ++++
42
hw/arm/stellaris.c | 2 ++
43
hw/arm/tosa.c | 1 +
44
hw/arm/versatilepb.c | 2 ++
45
hw/arm/vexpress.c | 1 +
46
hw/arm/xilinx_zynq.c | 1 +
47
hw/arm/xlnx-ep108.c | 2 ++
48
hw/arm/z2.c | 1 +
49
27 files changed, 43 insertions(+)
50
23
51
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
24
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
52
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
53
--- a/hw/arm/aspeed.c
26
--- a/hw/arm/boot.c
54
+++ b/hw/arm/aspeed.c
27
+++ b/hw/arm/boot.c
55
@@ -XXX,XX +XXX,XX @@ static void palmetto_bmc_class_init(ObjectClass *oc, void *data)
28
@@ -XXX,XX +XXX,XX @@
56
mc->no_floppy = 1;
29
*/
57
mc->no_cdrom = 1;
30
58
mc->no_parallel = 1;
31
#include "qemu/osdep.h"
59
+ mc->ignore_memory_transaction_failures = true;
32
-#include "qemu-common.h"
60
}
33
#include "qemu/datadir.h"
61
34
#include "qemu/error-report.h"
62
static const TypeInfo palmetto_bmc_type = {
35
#include "qapi/error.h"
63
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_class_init(ObjectClass *oc, void *data)
64
mc->no_floppy = 1;
65
mc->no_cdrom = 1;
66
mc->no_parallel = 1;
67
+ mc->ignore_memory_transaction_failures = true;
68
}
69
70
static const TypeInfo ast2500_evb_type = {
71
@@ -XXX,XX +XXX,XX @@ static void romulus_bmc_class_init(ObjectClass *oc, void *data)
72
mc->no_floppy = 1;
73
mc->no_cdrom = 1;
74
mc->no_parallel = 1;
75
+ mc->ignore_memory_transaction_failures = true;
76
}
77
78
static const TypeInfo romulus_bmc_type = {
79
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
80
index XXXXXXX..XXXXXXX 100644
81
--- a/hw/arm/collie.c
82
+++ b/hw/arm/collie.c
83
@@ -XXX,XX +XXX,XX @@ static void collie_machine_init(MachineClass *mc)
84
{
85
mc->desc = "Sharp SL-5500 (Collie) PDA (SA-1110)";
86
mc->init = collie_init;
87
+ mc->ignore_memory_transaction_failures = true;
88
}
89
90
DEFINE_MACHINE("collie", collie_machine_init)
91
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
92
index XXXXXXX..XXXXXXX 100644
93
--- a/hw/arm/cubieboard.c
94
+++ b/hw/arm/cubieboard.c
95
@@ -XXX,XX +XXX,XX @@ static void cubieboard_machine_init(MachineClass *mc)
96
mc->init = cubieboard_init;
97
mc->block_default_type = IF_IDE;
98
mc->units_per_default_bus = 1;
99
+ mc->ignore_memory_transaction_failures = true;
100
}
101
102
DEFINE_MACHINE("cubieboard", cubieboard_machine_init)
103
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
36
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
104
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
105
--- a/hw/arm/digic_boards.c
38
--- a/hw/arm/digic_boards.c
106
+++ b/hw/arm/digic_boards.c
39
+++ b/hw/arm/digic_boards.c
107
@@ -XXX,XX +XXX,XX @@ static void canon_a1100_machine_init(MachineClass *mc)
40
@@ -XXX,XX +XXX,XX @@
108
{
41
109
mc->desc = "Canon PowerShot A1100 IS";
42
#include "qemu/osdep.h"
110
mc->init = &canon_a1100_init;
43
#include "qapi/error.h"
111
+ mc->ignore_memory_transaction_failures = true;
44
-#include "qemu-common.h"
112
}
45
#include "qemu/datadir.h"
113
46
#include "hw/boards.h"
114
DEFINE_MACHINE("canon-a1100", canon_a1100_machine_init)
47
#include "qemu/error-report.h"
115
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
116
index XXXXXXX..XXXXXXX 100644
117
--- a/hw/arm/exynos4_boards.c
118
+++ b/hw/arm/exynos4_boards.c
119
@@ -XXX,XX +XXX,XX @@ static void nuri_class_init(ObjectClass *oc, void *data)
120
mc->desc = "Samsung NURI board (Exynos4210)";
121
mc->init = nuri_init;
122
mc->max_cpus = EXYNOS4210_NCPUS;
123
+ mc->ignore_memory_transaction_failures = true;
124
}
125
126
static const TypeInfo nuri_type = {
127
@@ -XXX,XX +XXX,XX @@ static void smdkc210_class_init(ObjectClass *oc, void *data)
128
mc->desc = "Samsung SMDKC210 board (Exynos4210)";
129
mc->init = smdkc210_init;
130
mc->max_cpus = EXYNOS4210_NCPUS;
131
+ mc->ignore_memory_transaction_failures = true;
132
}
133
134
static const TypeInfo smdkc210_type = {
135
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
136
index XXXXXXX..XXXXXXX 100644
137
--- a/hw/arm/gumstix.c
138
+++ b/hw/arm/gumstix.c
139
@@ -XXX,XX +XXX,XX @@ static void connex_class_init(ObjectClass *oc, void *data)
140
141
mc->desc = "Gumstix Connex (PXA255)";
142
mc->init = connex_init;
143
+ mc->ignore_memory_transaction_failures = true;
144
}
145
146
static const TypeInfo connex_type = {
147
@@ -XXX,XX +XXX,XX @@ static void verdex_class_init(ObjectClass *oc, void *data)
148
149
mc->desc = "Gumstix Verdex (PXA270)";
150
mc->init = verdex_init;
151
+ mc->ignore_memory_transaction_failures = true;
152
}
153
154
static const TypeInfo verdex_type = {
155
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
48
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
156
index XXXXXXX..XXXXXXX 100644
49
index XXXXXXX..XXXXXXX 100644
157
--- a/hw/arm/highbank.c
50
--- a/hw/arm/highbank.c
158
+++ b/hw/arm/highbank.c
51
+++ b/hw/arm/highbank.c
159
@@ -XXX,XX +XXX,XX @@ static void highbank_class_init(ObjectClass *oc, void *data)
52
@@ -XXX,XX +XXX,XX @@
160
mc->block_default_type = IF_IDE;
53
*/
161
mc->units_per_default_bus = 1;
54
162
mc->max_cpus = 4;
55
#include "qemu/osdep.h"
163
+ mc->ignore_memory_transaction_failures = true;
56
-#include "qemu-common.h"
164
}
57
#include "qemu/datadir.h"
165
58
#include "qapi/error.h"
166
static const TypeInfo highbank_type = {
59
#include "hw/sysbus.h"
167
@@ -XXX,XX +XXX,XX @@ static void midway_class_init(ObjectClass *oc, void *data)
60
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
168
mc->block_default_type = IF_IDE;
169
mc->units_per_default_bus = 1;
170
mc->max_cpus = 4;
171
+ mc->ignore_memory_transaction_failures = true;
172
}
173
174
static const TypeInfo midway_type = {
175
diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
176
index XXXXXXX..XXXXXXX 100644
61
index XXXXXXX..XXXXXXX 100644
177
--- a/hw/arm/imx25_pdk.c
62
--- a/hw/arm/npcm7xx_boards.c
178
+++ b/hw/arm/imx25_pdk.c
63
+++ b/hw/arm/npcm7xx_boards.c
179
@@ -XXX,XX +XXX,XX @@ static void imx25_pdk_machine_init(MachineClass *mc)
64
@@ -XXX,XX +XXX,XX @@
180
{
65
#include "hw/qdev-core.h"
181
mc->desc = "ARM i.MX25 PDK board (ARM926)";
66
#include "hw/qdev-properties.h"
182
mc->init = imx25_pdk_init;
67
#include "qapi/error.h"
183
+ mc->ignore_memory_transaction_failures = true;
68
-#include "qemu-common.h"
184
}
69
#include "qemu/datadir.h"
185
70
#include "qemu/units.h"
186
DEFINE_MACHINE("imx25-pdk", imx25_pdk_machine_init)
71
#include "sysemu/blockdev.h"
187
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
72
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
188
index XXXXXXX..XXXXXXX 100644
73
index XXXXXXX..XXXXXXX 100644
189
--- a/hw/arm/integratorcp.c
74
--- a/hw/arm/sbsa-ref.c
190
+++ b/hw/arm/integratorcp.c
75
+++ b/hw/arm/sbsa-ref.c
191
@@ -XXX,XX +XXX,XX @@ static void integratorcp_machine_init(MachineClass *mc)
76
@@ -XXX,XX +XXX,XX @@
192
{
77
*/
193
mc->desc = "ARM Integrator/CP (ARM926EJ-S)";
78
194
mc->init = integratorcp_init;
79
#include "qemu/osdep.h"
195
+ mc->ignore_memory_transaction_failures = true;
80
-#include "qemu-common.h"
196
}
81
#include "qemu/datadir.h"
197
82
#include "qapi/error.h"
198
DEFINE_MACHINE("integratorcp", integratorcp_machine_init)
83
#include "qemu/error-report.h"
199
diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
84
diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
200
index XXXXXXX..XXXXXXX 100644
85
index XXXXXXX..XXXXXXX 100644
201
--- a/hw/arm/kzm.c
86
--- a/hw/arm/stm32f405_soc.c
202
+++ b/hw/arm/kzm.c
87
+++ b/hw/arm/stm32f405_soc.c
203
@@ -XXX,XX +XXX,XX @@ static void kzm_machine_init(MachineClass *mc)
88
@@ -XXX,XX +XXX,XX @@
204
{
89
205
mc->desc = "ARM KZM Emulation Baseboard (ARM1136)";
90
#include "qemu/osdep.h"
206
mc->init = kzm_init;
91
#include "qapi/error.h"
207
+ mc->ignore_memory_transaction_failures = true;
92
-#include "qemu-common.h"
208
}
93
#include "exec/address-spaces.h"
209
94
#include "sysemu/sysemu.h"
210
DEFINE_MACHINE("kzm", kzm_machine_init)
95
#include "hw/arm/stm32f405_soc.h"
211
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
212
index XXXXXXX..XXXXXXX 100644
213
--- a/hw/arm/mainstone.c
214
+++ b/hw/arm/mainstone.c
215
@@ -XXX,XX +XXX,XX @@ static void mainstone2_machine_init(MachineClass *mc)
216
{
217
mc->desc = "Mainstone II (PXA27x)";
218
mc->init = mainstone_init;
219
+ mc->ignore_memory_transaction_failures = true;
220
}
221
222
DEFINE_MACHINE("mainstone", mainstone2_machine_init)
223
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
224
index XXXXXXX..XXXXXXX 100644
225
--- a/hw/arm/musicpal.c
226
+++ b/hw/arm/musicpal.c
227
@@ -XXX,XX +XXX,XX @@ static void musicpal_machine_init(MachineClass *mc)
228
{
229
mc->desc = "Marvell 88w8618 / MusicPal (ARM926EJ-S)";
230
mc->init = musicpal_init;
231
+ mc->ignore_memory_transaction_failures = true;
232
}
233
234
DEFINE_MACHINE("musicpal", musicpal_machine_init)
235
diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
236
index XXXXXXX..XXXXXXX 100644
237
--- a/hw/arm/netduino2.c
238
+++ b/hw/arm/netduino2.c
239
@@ -XXX,XX +XXX,XX @@ static void netduino2_machine_init(MachineClass *mc)
240
{
241
mc->desc = "Netduino 2 Machine";
242
mc->init = netduino2_init;
243
+ mc->ignore_memory_transaction_failures = true;
244
}
245
246
DEFINE_MACHINE("netduino2", netduino2_machine_init)
247
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
248
index XXXXXXX..XXXXXXX 100644
249
--- a/hw/arm/nseries.c
250
+++ b/hw/arm/nseries.c
251
@@ -XXX,XX +XXX,XX @@ static void n800_class_init(ObjectClass *oc, void *data)
252
mc->desc = "Nokia N800 tablet aka. RX-34 (OMAP2420)";
253
mc->init = n800_init;
254
mc->default_boot_order = "";
255
+ mc->ignore_memory_transaction_failures = true;
256
}
257
258
static const TypeInfo n800_type = {
259
@@ -XXX,XX +XXX,XX @@ static void n810_class_init(ObjectClass *oc, void *data)
260
mc->desc = "Nokia N810 tablet aka. RX-44 (OMAP2420)";
261
mc->init = n810_init;
262
mc->default_boot_order = "";
263
+ mc->ignore_memory_transaction_failures = true;
264
}
265
266
static const TypeInfo n810_type = {
267
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
268
index XXXXXXX..XXXXXXX 100644
269
--- a/hw/arm/omap_sx1.c
270
+++ b/hw/arm/omap_sx1.c
271
@@ -XXX,XX +XXX,XX @@ static void sx1_machine_v2_class_init(ObjectClass *oc, void *data)
272
273
mc->desc = "Siemens SX1 (OMAP310) V2";
274
mc->init = sx1_init_v2;
275
+ mc->ignore_memory_transaction_failures = true;
276
}
277
278
static const TypeInfo sx1_machine_v2_type = {
279
@@ -XXX,XX +XXX,XX @@ static void sx1_machine_v1_class_init(ObjectClass *oc, void *data)
280
281
mc->desc = "Siemens SX1 (OMAP310) V1";
282
mc->init = sx1_init_v1;
283
+ mc->ignore_memory_transaction_failures = true;
284
}
285
286
static const TypeInfo sx1_machine_v1_type = {
287
diff --git a/hw/arm/palm.c b/hw/arm/palm.c
288
index XXXXXXX..XXXXXXX 100644
289
--- a/hw/arm/palm.c
290
+++ b/hw/arm/palm.c
291
@@ -XXX,XX +XXX,XX @@ static void palmte_machine_init(MachineClass *mc)
292
{
293
mc->desc = "Palm Tungsten|E aka. Cheetah PDA (OMAP310)";
294
mc->init = palmte_init;
295
+ mc->ignore_memory_transaction_failures = true;
296
}
297
298
DEFINE_MACHINE("cheetah", palmte_machine_init)
299
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
300
index XXXXXXX..XXXXXXX 100644
301
--- a/hw/arm/raspi.c
302
+++ b/hw/arm/raspi.c
303
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_init(MachineClass *mc)
304
mc->no_cdrom = 1;
305
mc->max_cpus = BCM2836_NCPUS;
306
mc->default_ram_size = 1024 * 1024 * 1024;
307
+ mc->ignore_memory_transaction_failures = true;
308
};
309
DEFINE_MACHINE("raspi2", raspi2_machine_init)
310
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
311
index XXXXXXX..XXXXXXX 100644
312
--- a/hw/arm/realview.c
313
+++ b/hw/arm/realview.c
314
@@ -XXX,XX +XXX,XX @@ static void realview_eb_class_init(ObjectClass *oc, void *data)
315
mc->desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)";
316
mc->init = realview_eb_init;
317
mc->block_default_type = IF_SCSI;
318
+ mc->ignore_memory_transaction_failures = true;
319
}
320
321
static const TypeInfo realview_eb_type = {
322
@@ -XXX,XX +XXX,XX @@ static void realview_eb_mpcore_class_init(ObjectClass *oc, void *data)
323
mc->init = realview_eb_mpcore_init;
324
mc->block_default_type = IF_SCSI;
325
mc->max_cpus = 4;
326
+ mc->ignore_memory_transaction_failures = true;
327
}
328
329
static const TypeInfo realview_eb_mpcore_type = {
330
@@ -XXX,XX +XXX,XX @@ static void realview_pb_a8_class_init(ObjectClass *oc, void *data)
331
332
mc->desc = "ARM RealView Platform Baseboard for Cortex-A8";
333
mc->init = realview_pb_a8_init;
334
+ mc->ignore_memory_transaction_failures = true;
335
}
336
337
static const TypeInfo realview_pb_a8_type = {
338
@@ -XXX,XX +XXX,XX @@ static void realview_pbx_a9_class_init(ObjectClass *oc, void *data)
339
mc->desc = "ARM RealView Platform Baseboard Explore for Cortex-A9";
340
mc->init = realview_pbx_a9_init;
341
mc->max_cpus = 4;
342
+ mc->ignore_memory_transaction_failures = true;
343
}
344
345
static const TypeInfo realview_pbx_a9_type = {
346
diff --git a/hw/arm/sabrelite.c b/hw/arm/sabrelite.c
347
index XXXXXXX..XXXXXXX 100644
348
--- a/hw/arm/sabrelite.c
349
+++ b/hw/arm/sabrelite.c
350
@@ -XXX,XX +XXX,XX @@ static void sabrelite_machine_init(MachineClass *mc)
351
mc->desc = "Freescale i.MX6 Quad SABRE Lite Board (Cortex A9)";
352
mc->init = sabrelite_init;
353
mc->max_cpus = FSL_IMX6_NUM_CPUS;
354
+ mc->ignore_memory_transaction_failures = true;
355
}
356
357
DEFINE_MACHINE("sabrelite", sabrelite_machine_init)
358
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
359
index XXXXXXX..XXXXXXX 100644
360
--- a/hw/arm/spitz.c
361
+++ b/hw/arm/spitz.c
362
@@ -XXX,XX +XXX,XX @@ static void akitapda_class_init(ObjectClass *oc, void *data)
363
364
mc->desc = "Sharp SL-C1000 (Akita) PDA (PXA270)";
365
mc->init = akita_init;
366
+ mc->ignore_memory_transaction_failures = true;
367
}
368
369
static const TypeInfo akitapda_type = {
370
@@ -XXX,XX +XXX,XX @@ static void spitzpda_class_init(ObjectClass *oc, void *data)
371
mc->desc = "Sharp SL-C3000 (Spitz) PDA (PXA270)";
372
mc->init = spitz_init;
373
mc->block_default_type = IF_IDE;
374
+ mc->ignore_memory_transaction_failures = true;
375
}
376
377
static const TypeInfo spitzpda_type = {
378
@@ -XXX,XX +XXX,XX @@ static void borzoipda_class_init(ObjectClass *oc, void *data)
379
mc->desc = "Sharp SL-C3100 (Borzoi) PDA (PXA270)";
380
mc->init = borzoi_init;
381
mc->block_default_type = IF_IDE;
382
+ mc->ignore_memory_transaction_failures = true;
383
}
384
385
static const TypeInfo borzoipda_type = {
386
@@ -XXX,XX +XXX,XX @@ static void terrierpda_class_init(ObjectClass *oc, void *data)
387
mc->desc = "Sharp SL-C3200 (Terrier) PDA (PXA270)";
388
mc->init = terrier_init;
389
mc->block_default_type = IF_IDE;
390
+ mc->ignore_memory_transaction_failures = true;
391
}
392
393
static const TypeInfo terrierpda_type = {
394
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
395
index XXXXXXX..XXXXXXX 100644
396
--- a/hw/arm/stellaris.c
397
+++ b/hw/arm/stellaris.c
398
@@ -XXX,XX +XXX,XX @@ static void lm3s811evb_class_init(ObjectClass *oc, void *data)
399
400
mc->desc = "Stellaris LM3S811EVB";
401
mc->init = lm3s811evb_init;
402
+ mc->ignore_memory_transaction_failures = true;
403
}
404
405
static const TypeInfo lm3s811evb_type = {
406
@@ -XXX,XX +XXX,XX @@ static void lm3s6965evb_class_init(ObjectClass *oc, void *data)
407
408
mc->desc = "Stellaris LM3S6965EVB";
409
mc->init = lm3s6965evb_init;
410
+ mc->ignore_memory_transaction_failures = true;
411
}
412
413
static const TypeInfo lm3s6965evb_type = {
414
diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
415
index XXXXXXX..XXXXXXX 100644
416
--- a/hw/arm/tosa.c
417
+++ b/hw/arm/tosa.c
418
@@ -XXX,XX +XXX,XX @@ static void tosapda_machine_init(MachineClass *mc)
419
mc->desc = "Sharp SL-6000 (Tosa) PDA (PXA255)";
420
mc->init = tosa_init;
421
mc->block_default_type = IF_IDE;
422
+ mc->ignore_memory_transaction_failures = true;
423
}
424
425
DEFINE_MACHINE("tosa", tosapda_machine_init)
426
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
427
index XXXXXXX..XXXXXXX 100644
428
--- a/hw/arm/versatilepb.c
429
+++ b/hw/arm/versatilepb.c
430
@@ -XXX,XX +XXX,XX @@ static void versatilepb_class_init(ObjectClass *oc, void *data)
431
mc->desc = "ARM Versatile/PB (ARM926EJ-S)";
432
mc->init = vpb_init;
433
mc->block_default_type = IF_SCSI;
434
+ mc->ignore_memory_transaction_failures = true;
435
}
436
437
static const TypeInfo versatilepb_type = {
438
@@ -XXX,XX +XXX,XX @@ static void versatileab_class_init(ObjectClass *oc, void *data)
439
mc->desc = "ARM Versatile/AB (ARM926EJ-S)";
440
mc->init = vab_init;
441
mc->block_default_type = IF_SCSI;
442
+ mc->ignore_memory_transaction_failures = true;
443
}
444
445
static const TypeInfo versatileab_type = {
446
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
96
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
447
index XXXXXXX..XXXXXXX 100644
97
index XXXXXXX..XXXXXXX 100644
448
--- a/hw/arm/vexpress.c
98
--- a/hw/arm/vexpress.c
449
+++ b/hw/arm/vexpress.c
99
+++ b/hw/arm/vexpress.c
450
@@ -XXX,XX +XXX,XX @@ static void vexpress_class_init(ObjectClass *oc, void *data)
100
@@ -XXX,XX +XXX,XX @@
451
mc->desc = "ARM Versatile Express";
101
452
mc->init = vexpress_common_init;
102
#include "qemu/osdep.h"
453
mc->max_cpus = 4;
103
#include "qapi/error.h"
454
+ mc->ignore_memory_transaction_failures = true;
104
-#include "qemu-common.h"
455
}
105
#include "qemu/datadir.h"
456
106
#include "cpu.h"
457
static void vexpress_a9_class_init(ObjectClass *oc, void *data)
107
#include "hw/sysbus.h"
458
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
108
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
459
index XXXXXXX..XXXXXXX 100644
109
index XXXXXXX..XXXXXXX 100644
460
--- a/hw/arm/xilinx_zynq.c
110
--- a/hw/arm/virt.c
461
+++ b/hw/arm/xilinx_zynq.c
111
+++ b/hw/arm/virt.c
462
@@ -XXX,XX +XXX,XX @@ static void zynq_machine_init(MachineClass *mc)
112
@@ -XXX,XX +XXX,XX @@
463
mc->init = zynq_init;
113
*/
464
mc->max_cpus = 1;
114
465
mc->no_sdcard = 1;
115
#include "qemu/osdep.h"
466
+ mc->ignore_memory_transaction_failures = true;
116
-#include "qemu-common.h"
467
}
117
#include "qemu/datadir.h"
468
118
#include "qemu/units.h"
469
DEFINE_MACHINE("xilinx-zynq-a9", zynq_machine_init)
119
#include "qemu/option.h"
470
diff --git a/hw/arm/xlnx-ep108.c b/hw/arm/xlnx-ep108.c
471
index XXXXXXX..XXXXXXX 100644
472
--- a/hw/arm/xlnx-ep108.c
473
+++ b/hw/arm/xlnx-ep108.c
474
@@ -XXX,XX +XXX,XX @@ static void xlnx_ep108_machine_init(MachineClass *mc)
475
mc->init = xlnx_ep108_init;
476
mc->block_default_type = IF_IDE;
477
mc->units_per_default_bus = 1;
478
+ mc->ignore_memory_transaction_failures = true;
479
}
480
481
DEFINE_MACHINE("xlnx-ep108", xlnx_ep108_machine_init)
482
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_init(MachineClass *mc)
483
mc->init = xlnx_ep108_init;
484
mc->block_default_type = IF_IDE;
485
mc->units_per_default_bus = 1;
486
+ mc->ignore_memory_transaction_failures = true;
487
}
488
489
DEFINE_MACHINE("xlnx-zcu102", xlnx_zcu102_machine_init)
490
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
491
index XXXXXXX..XXXXXXX 100644
492
--- a/hw/arm/z2.c
493
+++ b/hw/arm/z2.c
494
@@ -XXX,XX +XXX,XX @@ static void z2_machine_init(MachineClass *mc)
495
{
496
mc->desc = "Zipit Z2 (PXA27x)";
497
mc->init = z2_init;
498
+ mc->ignore_memory_transaction_failures = true;
499
}
500
501
DEFINE_MACHINE("z2", z2_machine_init)
502
--
120
--
503
2.7.4
121
2.25.1
504
122
505
123
diff view generated by jsdifflib
1
Make the MPU_RNR register banked if v8M security extensions are
1
The calculation of the length of TLB range invalidate operations
2
enabled.
2
in tlbi_aa64_range_get_length() is incorrect in two ways:
3
* the NUM field is 5 bits, but we read only 4 bits
4
* we miscalculate the page_shift value, because of an
5
off-by-one error:
6
TG 0b00 is invalid
7
TG 0b01 is 4K granule size == 4096 == 2^12
8
TG 0b10 is 16K granule size == 16384 == 2^14
9
TG 0b11 is 64K granule size == 65536 == 2^16
10
so page_shift should be (TG - 1) * 2 + 12
3
11
12
Thanks to the bug report submitter Cha HyunSoo for identifying
13
both these errors.
14
15
Fixes: 84940ed82552d3c ("target/arm: Add support for FEAT_TLBIRANGE")
16
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/734
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 1503414539-28762-15-git-send-email-peter.maydell@linaro.org
19
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
20
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Message-id: 20211130173257.1274194-1-peter.maydell@linaro.org
7
---
22
---
8
target/arm/cpu.h | 2 +-
23
target/arm/helper.c | 6 +++---
9
hw/intc/armv7m_nvic.c | 18 +++++++++---------
24
1 file changed, 3 insertions(+), 3 deletions(-)
10
target/arm/cpu.c | 3 ++-
11
target/arm/helper.c | 6 +++---
12
target/arm/machine.c | 13 +++++++++++--
13
5 files changed, 26 insertions(+), 16 deletions(-)
14
25
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/cpu.h
18
+++ b/target/arm/cpu.h
19
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
20
uint32_t *drbar;
21
uint32_t *drsr;
22
uint32_t *dracr;
23
- uint32_t rnr;
24
+ uint32_t rnr[2];
25
} pmsav7;
26
27
/* PMSAv8 MPU */
28
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/intc/armv7m_nvic.c
31
+++ b/hw/intc/armv7m_nvic.c
32
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
33
case 0xd94: /* MPU_CTRL */
34
return cpu->env.v7m.mpu_ctrl;
35
case 0xd98: /* MPU_RNR */
36
- return cpu->env.pmsav7.rnr;
37
+ return cpu->env.pmsav7.rnr[attrs.secure];
38
case 0xd9c: /* MPU_RBAR */
39
case 0xda4: /* MPU_RBAR_A1 */
40
case 0xdac: /* MPU_RBAR_A2 */
41
case 0xdb4: /* MPU_RBAR_A3 */
42
{
43
- int region = cpu->env.pmsav7.rnr;
44
+ int region = cpu->env.pmsav7.rnr[attrs.secure];
45
46
if (arm_feature(&cpu->env, ARM_FEATURE_V8)) {
47
/* PMSAv8M handling of the aliases is different from v7M:
48
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
49
case 0xdb0: /* MPU_RASR_A2 (v7M), MPU_RLAR_A2 (v8M) */
50
case 0xdb8: /* MPU_RASR_A3 (v7M), MPU_RLAR_A3 (v8M) */
51
{
52
- int region = cpu->env.pmsav7.rnr;
53
+ int region = cpu->env.pmsav7.rnr[attrs.secure];
54
55
if (arm_feature(&cpu->env, ARM_FEATURE_V8)) {
56
/* PMSAv8M handling of the aliases is different from v7M:
57
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
58
PRIu32 "/%" PRIu32 "\n",
59
value, cpu->pmsav7_dregion);
60
} else {
61
- cpu->env.pmsav7.rnr = value;
62
+ cpu->env.pmsav7.rnr[attrs.secure] = value;
63
}
64
break;
65
case 0xd9c: /* MPU_RBAR */
66
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
67
*/
68
int aliasno = (offset - 0xd9c) / 8; /* 0..3 */
69
70
- region = cpu->env.pmsav7.rnr;
71
+ region = cpu->env.pmsav7.rnr[attrs.secure];
72
if (aliasno) {
73
region = deposit32(region, 0, 2, aliasno);
74
}
75
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
76
region, cpu->pmsav7_dregion);
77
return;
78
}
79
- cpu->env.pmsav7.rnr = region;
80
+ cpu->env.pmsav7.rnr[attrs.secure] = region;
81
} else {
82
- region = cpu->env.pmsav7.rnr;
83
+ region = cpu->env.pmsav7.rnr[attrs.secure];
84
}
85
86
if (region >= cpu->pmsav7_dregion) {
87
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
88
case 0xdb0: /* MPU_RASR_A2 (v7M), MPU_RLAR_A2 (v8M) */
89
case 0xdb8: /* MPU_RASR_A3 (v7M), MPU_RLAR_A3 (v8M) */
90
{
91
- int region = cpu->env.pmsav7.rnr;
92
+ int region = cpu->env.pmsav7.rnr[attrs.secure];
93
94
if (arm_feature(&cpu->env, ARM_FEATURE_V8)) {
95
/* PMSAv8M handling of the aliases is different from v7M:
96
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
97
*/
98
int aliasno = (offset - 0xd9c) / 8; /* 0..3 */
99
100
- region = cpu->env.pmsav7.rnr;
101
+ region = cpu->env.pmsav7.rnr[attrs.secure];
102
if (aliasno) {
103
region = deposit32(region, 0, 2, aliasno);
104
}
105
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
106
index XXXXXXX..XXXXXXX 100644
107
--- a/target/arm/cpu.c
108
+++ b/target/arm/cpu.c
109
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
110
sizeof(*env->pmsav7.dracr) * cpu->pmsav7_dregion);
111
}
112
}
113
- env->pmsav7.rnr = 0;
114
+ env->pmsav7.rnr[M_REG_NS] = 0;
115
+ env->pmsav7.rnr[M_REG_S] = 0;
116
env->pmsav8.mair0[M_REG_NS] = 0;
117
env->pmsav8.mair0[M_REG_S] = 0;
118
env->pmsav8.mair1[M_REG_NS] = 0;
119
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
diff --git a/target/arm/helper.c b/target/arm/helper.c
120
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
121
--- a/target/arm/helper.c
28
--- a/target/arm/helper.c
122
+++ b/target/arm/helper.c
29
+++ b/target/arm/helper.c
123
@@ -XXX,XX +XXX,XX @@ static uint64_t pmsav7_read(CPUARMState *env, const ARMCPRegInfo *ri)
30
@@ -XXX,XX +XXX,XX @@ static uint64_t tlbi_aa64_range_get_length(CPUARMState *env,
31
uint64_t exponent;
32
uint64_t length;
33
34
- num = extract64(value, 39, 4);
35
+ num = extract64(value, 39, 5);
36
scale = extract64(value, 44, 2);
37
page_size_granule = extract64(value, 46, 2);
38
39
- page_shift = page_size_granule * 2 + 12;
40
-
41
if (page_size_granule == 0) {
42
qemu_log_mask(LOG_GUEST_ERROR, "Invalid page size granule %d\n",
43
page_size_granule);
124
return 0;
44
return 0;
125
}
45
}
126
46
127
- u32p += env->pmsav7.rnr;
47
+ page_shift = (page_size_granule - 1) * 2 + 12;
128
+ u32p += env->pmsav7.rnr[M_REG_NS];
129
return *u32p;
130
}
131
132
@@ -XXX,XX +XXX,XX @@ static void pmsav7_write(CPUARMState *env, const ARMCPRegInfo *ri,
133
return;
134
}
135
136
- u32p += env->pmsav7.rnr;
137
+ u32p += env->pmsav7.rnr[M_REG_NS];
138
tlb_flush(CPU(cpu)); /* Mappings may have changed - purge! */
139
*u32p = value;
140
}
141
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo pmsav7_cp_reginfo[] = {
142
.resetfn = arm_cp_reset_ignore },
143
{ .name = "RGNR", .cp = 15, .crn = 6, .opc1 = 0, .crm = 2, .opc2 = 0,
144
.access = PL1_RW,
145
- .fieldoffset = offsetof(CPUARMState, pmsav7.rnr),
146
+ .fieldoffset = offsetof(CPUARMState, pmsav7.rnr[M_REG_NS]),
147
.writefn = pmsav7_rgnr_write,
148
.resetfn = arm_cp_reset_ignore },
149
REGINFO_SENTINEL
150
diff --git a/target/arm/machine.c b/target/arm/machine.c
151
index XXXXXXX..XXXXXXX 100644
152
--- a/target/arm/machine.c
153
+++ b/target/arm/machine.c
154
@@ -XXX,XX +XXX,XX @@ static bool pmsav7_rgnr_vmstate_validate(void *opaque, int version_id)
155
{
156
ARMCPU *cpu = opaque;
157
158
- return cpu->env.pmsav7.rnr < cpu->pmsav7_dregion;
159
+ return cpu->env.pmsav7.rnr[M_REG_NS] < cpu->pmsav7_dregion;
160
}
161
162
static const VMStateDescription vmstate_pmsav7 = {
163
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pmsav7_rnr = {
164
.minimum_version_id = 1,
165
.needed = pmsav7_rnr_needed,
166
.fields = (VMStateField[]) {
167
- VMSTATE_UINT32(env.pmsav7.rnr, ARMCPU),
168
+ VMSTATE_UINT32(env.pmsav7.rnr[M_REG_NS], ARMCPU),
169
VMSTATE_END_OF_LIST()
170
}
171
};
172
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pmsav8 = {
173
}
174
};
175
176
+static bool s_rnr_vmstate_validate(void *opaque, int version_id)
177
+{
178
+ ARMCPU *cpu = opaque;
179
+
48
+
180
+ return cpu->env.pmsav7.rnr[M_REG_S] < cpu->pmsav7_dregion;
49
exponent = (5 * scale) + 1;
181
+}
50
length = (num + 1) << (exponent + page_shift);
182
+
51
183
static bool m_security_needed(void *opaque)
184
{
185
ARMCPU *cpu = opaque;
186
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
187
0, vmstate_info_uint32, uint32_t),
188
VMSTATE_VARRAY_UINT32(env.pmsav8.rlar[M_REG_S], ARMCPU, pmsav7_dregion,
189
0, vmstate_info_uint32, uint32_t),
190
+ VMSTATE_UINT32(env.pmsav7.rnr[M_REG_S], ARMCPU),
191
+ VMSTATE_VALIDATE("secure MPU_RNR is valid", s_rnr_vmstate_validate),
192
VMSTATE_END_OF_LIST()
193
}
194
};
195
--
52
--
196
2.7.4
53
2.25.1
197
54
198
55
diff view generated by jsdifflib
1
Move the regime_is_secure() utility function to internals.h;
1
From: Patrick Venture <venture@google.com>
2
we are going to want to call it from translate.c.
3
2
3
The rx_active boolean change to true should always trigger a try_read
4
call that flushes the queue.
5
6
Signed-off-by: Patrick Venture <venture@google.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20211203221002.1719306-1-venture@google.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 1503414539-28762-20-git-send-email-peter.maydell@linaro.org
7
---
10
---
8
target/arm/internals.h | 26 ++++++++++++++++++++++++++
11
hw/net/npcm7xx_emc.c | 18 ++++++++----------
9
target/arm/helper.c | 26 --------------------------
12
1 file changed, 8 insertions(+), 10 deletions(-)
10
2 files changed, 26 insertions(+), 26 deletions(-)
11
13
12
diff --git a/target/arm/internals.h b/target/arm/internals.h
14
diff --git a/hw/net/npcm7xx_emc.c b/hw/net/npcm7xx_emc.c
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/internals.h
16
--- a/hw/net/npcm7xx_emc.c
15
+++ b/target/arm/internals.h
17
+++ b/hw/net/npcm7xx_emc.c
16
@@ -XXX,XX +XXX,XX @@ static inline void arm_call_el_change_hook(ARMCPU *cpu)
18
@@ -XXX,XX +XXX,XX @@ static void emc_halt_rx(NPCM7xxEMCState *emc, uint32_t mista_flag)
17
}
19
emc_set_mista(emc, mista_flag);
18
}
20
}
19
21
20
+/* Return true if this address translation regime is secure */
22
+static void emc_enable_rx_and_flush(NPCM7xxEMCState *emc)
21
+static inline bool regime_is_secure(CPUARMState *env, ARMMMUIdx mmu_idx)
22
+{
23
+{
23
+ switch (mmu_idx) {
24
+ emc->rx_active = true;
24
+ case ARMMMUIdx_S12NSE0:
25
+ qemu_flush_queued_packets(qemu_get_queue(emc->nic));
25
+ case ARMMMUIdx_S12NSE1:
26
+ case ARMMMUIdx_S1NSE0:
27
+ case ARMMMUIdx_S1NSE1:
28
+ case ARMMMUIdx_S1E2:
29
+ case ARMMMUIdx_S2NS:
30
+ case ARMMMUIdx_MPriv:
31
+ case ARMMMUIdx_MNegPri:
32
+ case ARMMMUIdx_MUser:
33
+ return false;
34
+ case ARMMMUIdx_S1E3:
35
+ case ARMMMUIdx_S1SE0:
36
+ case ARMMMUIdx_S1SE1:
37
+ case ARMMMUIdx_MSPriv:
38
+ case ARMMMUIdx_MSNegPri:
39
+ case ARMMMUIdx_MSUser:
40
+ return true;
41
+ default:
42
+ g_assert_not_reached();
43
+ }
44
+}
26
+}
45
+
27
+
46
#endif
28
static void emc_set_next_tx_descriptor(NPCM7xxEMCState *emc,
47
diff --git a/target/arm/helper.c b/target/arm/helper.c
29
const NPCM7xxEMCTxDesc *tx_desc,
48
index XXXXXXX..XXXXXXX 100644
30
uint32_t desc_addr)
49
--- a/target/arm/helper.c
31
@@ -XXX,XX +XXX,XX @@ static ssize_t emc_receive(NetClientState *nc, const uint8_t *buf, size_t len1)
50
+++ b/target/arm/helper.c
32
return len;
51
@@ -XXX,XX +XXX,XX @@ static inline uint32_t regime_el(CPUARMState *env, ARMMMUIdx mmu_idx)
52
}
53
}
33
}
54
34
55
-/* Return true if this address translation regime is secure */
35
-static void emc_try_receive_next_packet(NPCM7xxEMCState *emc)
56
-static inline bool regime_is_secure(CPUARMState *env, ARMMMUIdx mmu_idx)
57
-{
36
-{
58
- switch (mmu_idx) {
37
- if (emc_can_receive(qemu_get_queue(emc->nic))) {
59
- case ARMMMUIdx_S12NSE0:
38
- qemu_flush_queued_packets(qemu_get_queue(emc->nic));
60
- case ARMMMUIdx_S12NSE1:
61
- case ARMMMUIdx_S1NSE0:
62
- case ARMMMUIdx_S1NSE1:
63
- case ARMMMUIdx_S1E2:
64
- case ARMMMUIdx_S2NS:
65
- case ARMMMUIdx_MPriv:
66
- case ARMMMUIdx_MNegPri:
67
- case ARMMMUIdx_MUser:
68
- return false;
69
- case ARMMMUIdx_S1E3:
70
- case ARMMMUIdx_S1SE0:
71
- case ARMMMUIdx_S1SE1:
72
- case ARMMMUIdx_MSPriv:
73
- case ARMMMUIdx_MSNegPri:
74
- case ARMMMUIdx_MSUser:
75
- return true;
76
- default:
77
- g_assert_not_reached();
78
- }
39
- }
79
-}
40
-}
80
-
41
-
81
/* Return the SCTLR value which controls this address translation regime */
42
static uint64_t npcm7xx_emc_read(void *opaque, hwaddr offset, unsigned size)
82
static inline uint32_t regime_sctlr(CPUARMState *env, ARMMMUIdx mmu_idx)
83
{
43
{
44
NPCM7xxEMCState *emc = opaque;
45
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_emc_write(void *opaque, hwaddr offset,
46
emc->regs[REG_MGSTA] |= REG_MGSTA_RXHA;
47
}
48
if (value & REG_MCMDR_RXON) {
49
- emc->rx_active = true;
50
+ emc_enable_rx_and_flush(emc);
51
} else {
52
emc_halt_rx(emc, 0);
53
}
54
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_emc_write(void *opaque, hwaddr offset,
55
break;
56
case REG_RSDR:
57
if (emc->regs[REG_MCMDR] & REG_MCMDR_RXON) {
58
- emc->rx_active = true;
59
- emc_try_receive_next_packet(emc);
60
+ emc_enable_rx_and_flush(emc);
61
}
62
break;
63
case REG_MIIDA:
84
--
64
--
85
2.7.4
65
2.25.1
86
66
87
67
diff view generated by jsdifflib
1
Implement the new do_transaction_failed hook for ARM, which should
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
cause the CPU to take a prefetch abort or data abort.
3
2
3
When a virtio-iommu is instantiated, describe it using the ACPI VIOT
4
table.
5
6
Acked-by: Igor Mammedov <imammedo@redhat.com>
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
9
Message-id: 20211210170415.583179-2-jean-philippe@linaro.org
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
Message-id: 1504626814-23124-4-git-send-email-peter.maydell@linaro.org
8
---
11
---
9
target/arm/internals.h | 10 ++++++++++
12
hw/arm/virt-acpi-build.c | 7 +++++++
10
target/arm/cpu.c | 1 +
13
hw/arm/Kconfig | 1 +
11
target/arm/op_helper.c | 43 +++++++++++++++++++++++++++++++++++++++++++
14
2 files changed, 8 insertions(+)
12
3 files changed, 54 insertions(+)
13
15
14
diff --git a/target/arm/internals.h b/target/arm/internals.h
16
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/internals.h
18
--- a/hw/arm/virt-acpi-build.c
17
+++ b/target/arm/internals.h
19
+++ b/hw/arm/virt-acpi-build.c
18
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr,
20
@@ -XXX,XX +XXX,XX @@
19
MMUAccessType access_type,
21
#include "kvm_arm.h"
20
int mmu_idx, uintptr_t retaddr);
22
#include "migration/vmstate.h"
21
23
#include "hw/acpi/ghes.h"
22
+/* arm_cpu_do_transaction_failed: handle a memory system error response
24
+#include "hw/acpi/viot.h"
23
+ * (eg "no device/memory present at address") by raising an external abort
25
24
+ * exception
26
#define ARM_SPI_BASE 32
25
+ */
27
26
+void arm_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
28
@@ -XXX,XX +XXX,XX @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
27
+ vaddr addr, unsigned size,
29
}
28
+ MMUAccessType access_type,
30
#endif
29
+ int mmu_idx, MemTxAttrs attrs,
31
30
+ MemTxResult response, uintptr_t retaddr);
32
+ if (vms->iommu == VIRT_IOMMU_VIRTIO) {
31
+
33
+ acpi_add_table(table_offsets, tables_blob);
32
/* Call the EL change hook if one has been registered */
34
+ build_viot(ms, tables_blob, tables->linker, vms->virtio_iommu_bdf,
33
static inline void arm_call_el_change_hook(ARMCPU *cpu)
35
+ vms->oem_id, vms->oem_table_id);
34
{
35
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/arm/cpu.c
38
+++ b/target/arm/cpu.c
39
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
40
#else
41
cc->do_interrupt = arm_cpu_do_interrupt;
42
cc->do_unaligned_access = arm_cpu_do_unaligned_access;
43
+ cc->do_transaction_failed = arm_cpu_do_transaction_failed;
44
cc->get_phys_page_attrs_debug = arm_cpu_get_phys_page_attrs_debug;
45
cc->asidx_from_attrs = arm_asidx_from_attrs;
46
cc->vmsd = &vmstate_arm_cpu;
47
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/target/arm/op_helper.c
50
+++ b/target/arm/op_helper.c
51
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr,
52
deliver_fault(cpu, vaddr, access_type, fsr, fsc, &fi);
53
}
54
55
+/* arm_cpu_do_transaction_failed: handle a memory system error response
56
+ * (eg "no device/memory present at address") by raising an external abort
57
+ * exception
58
+ */
59
+void arm_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
60
+ vaddr addr, unsigned size,
61
+ MMUAccessType access_type,
62
+ int mmu_idx, MemTxAttrs attrs,
63
+ MemTxResult response, uintptr_t retaddr)
64
+{
65
+ ARMCPU *cpu = ARM_CPU(cs);
66
+ CPUARMState *env = &cpu->env;
67
+ uint32_t fsr, fsc;
68
+ ARMMMUFaultInfo fi = {};
69
+ ARMMMUIdx arm_mmu_idx = core_to_arm_mmu_idx(env, mmu_idx);
70
+
71
+ if (retaddr) {
72
+ /* now we have a real cpu fault */
73
+ cpu_restore_state(cs, retaddr);
74
+ }
36
+ }
75
+
37
+
76
+ /* The EA bit in syndromes and fault status registers is an
38
/* XSDT is pointed to by RSDP */
77
+ * IMPDEF classification of external aborts. ARM implementations
39
xsdt = tables_blob->len;
78
+ * usually use this to indicate AXI bus Decode error (0) or
40
build_xsdt(tables_blob, tables->linker, table_offsets, vms->oem_id,
79
+ * Slave error (1); in QEMU we follow that.
41
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
80
+ */
42
index XXXXXXX..XXXXXXX 100644
81
+ fi.ea = (response != MEMTX_DECODE_ERROR);
43
--- a/hw/arm/Kconfig
82
+
44
+++ b/hw/arm/Kconfig
83
+ /* The fault status register format depends on whether we're using
45
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
84
+ * the LPAE long descriptor format, or the short descriptor format.
46
select DIMM
85
+ */
47
select ACPI_HW_REDUCED
86
+ if (arm_s1_regime_using_lpae_format(env, arm_mmu_idx)) {
48
select ACPI_APEI
87
+ /* long descriptor form, STATUS 0b010000: synchronous ext abort */
49
+ select ACPI_VIOT
88
+ fsr = (fi.ea << 12) | (1 << 9) | 0x10;
50
89
+ } else {
51
config CHEETAH
90
+ /* short descriptor form, FSR 0b01000 : synchronous ext abort */
52
bool
91
+ fsr = (fi.ea << 12) | 0x8;
92
+ }
93
+ fsc = 0x10;
94
+
95
+ deliver_fault(cpu, addr, access_type, fsr, fsc, &fi);
96
+}
97
+
98
#endif /* !defined(CONFIG_USER_ONLY) */
99
100
uint32_t HELPER(add_setq)(CPUARMState *env, uint32_t a, uint32_t b)
101
--
53
--
102
2.7.4
54
2.25.1
103
55
104
56
diff view generated by jsdifflib
1
From: Thomas Huth <thuth@redhat.com>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
QEMU currently exits unexpectedly when the user accidentially
3
virtio-iommu is now supported with ACPI VIOT as well as device tree.
4
tries to do something like this:
4
Remove the restriction that prevents from instantiating a virtio-iommu
5
device under ACPI.
5
6
6
$ aarch64-softmmu/qemu-system-aarch64 -S -M integratorcp -nographic
7
Acked-by: Igor Mammedov <imammedo@redhat.com>
7
QEMU 2.9.93 monitor - type 'help' for more information
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
(qemu) device_add allwinner-a10
9
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
9
Unsupported NIC model: smc91c111
10
Message-id: 20211210170415.583179-3-jean-philippe@linaro.org
10
11
Exiting just due to a "device_add" should not happen. Looking closer
12
at the the realize and instance_init function of this device also
13
reveals that it is using serial_hds and nd_table directly there, so
14
this device is clearly not creatable by the user and should be marked
15
accordingly.
16
17
Signed-off-by: Thomas Huth <thuth@redhat.com>
18
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
19
Message-id: 1503416789-32080-1-git-send-email-thuth@redhat.com
20
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
12
---
23
hw/arm/allwinner-a10.c | 2 ++
13
hw/arm/virt.c | 10 ++--------
24
scripts/device-crash-test | 1 -
14
hw/virtio/virtio-iommu-pci.c | 12 ++----------
25
2 files changed, 2 insertions(+), 1 deletion(-)
15
2 files changed, 4 insertions(+), 18 deletions(-)
26
16
27
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
28
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/allwinner-a10.c
19
--- a/hw/arm/virt.c
30
+++ b/hw/arm/allwinner-a10.c
20
+++ b/hw/arm/virt.c
31
@@ -XXX,XX +XXX,XX @@ static void aw_a10_class_init(ObjectClass *oc, void *data)
21
@@ -XXX,XX +XXX,XX @@ static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
32
DeviceClass *dc = DEVICE_CLASS(oc);
22
MachineClass *mc = MACHINE_GET_CLASS(machine);
33
23
34
dc->realize = aw_a10_realize;
24
if (device_is_dynamic_sysbus(mc, dev) ||
35
+ /* Reason: Uses serial_hds in realize and nd_table in instance_init */
25
- (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM))) {
36
+ dc->user_creatable = false;
26
+ object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) ||
27
+ object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
28
return HOTPLUG_HANDLER(machine);
29
}
30
- if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
31
- VirtMachineState *vms = VIRT_MACHINE(machine);
32
-
33
- if (!vms->bootinfo.firmware_loaded || !virt_is_acpi_enabled(vms)) {
34
- return HOTPLUG_HANDLER(machine);
35
- }
36
- }
37
return NULL;
37
}
38
}
38
39
39
static const TypeInfo aw_a10_type_info = {
40
diff --git a/hw/virtio/virtio-iommu-pci.c b/hw/virtio/virtio-iommu-pci.c
40
diff --git a/scripts/device-crash-test b/scripts/device-crash-test
41
index XXXXXXX..XXXXXXX 100644
41
index XXXXXXX..XXXXXXX 100755
42
--- a/hw/virtio/virtio-iommu-pci.c
42
--- a/scripts/device-crash-test
43
+++ b/hw/virtio/virtio-iommu-pci.c
43
+++ b/scripts/device-crash-test
44
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
44
@@ -XXX,XX +XXX,XX @@ ERROR_WHITELIST = [
45
VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
45
{'log':r"Device [\w.,-]+ can not be dynamically instantiated"},
46
46
{'log':r"Platform Bus: Can not fit MMIO region of size "},
47
if (!qdev_get_machine_hotplug_handler(DEVICE(vpci_dev))) {
47
# other more specific errors we will ignore:
48
- MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
48
- {'device':'allwinner-a10', 'log':"Unsupported NIC model:"},
49
-
49
{'device':'.*-spapr-cpu-core', 'log':r"CPU core type should be"},
50
- error_setg(errp,
50
{'log':r"MSI(-X)? is not supported by interrupt controller"},
51
- "%s machine fails to create iommu-map device tree bindings",
51
{'log':r"pxb-pcie? devices cannot reside on a PCIe? bus"},
52
- mc->name);
53
- error_append_hint(errp,
54
- "Check your machine implements a hotplug handler "
55
- "for the virtio-iommu-pci device\n");
56
- error_append_hint(errp, "Check the guest is booted without FW or with "
57
- "-no-acpi\n");
58
+ error_setg(errp, "Check your machine implements a hotplug handler "
59
+ "for the virtio-iommu-pci device");
60
return;
61
}
62
for (int i = 0; i < s->nb_reserved_regions; i++) {
52
--
63
--
53
2.7.4
64
2.25.1
54
65
55
66
diff view generated by jsdifflib
1
As part of ARMv8M, we need to add support for the PMSAv8 MPU
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
architecture.
3
2
4
PMSAv8 differs from PMSAv7 both in register/data layout (for instance
3
We do not support instantiating multiple IOMMUs. Before adding a
5
using base and limit registers rather than base and size) and also in
4
virtio-iommu, check that no other IOMMU is present. This will detect
6
behaviour (for example it does not have subregions); rather than
5
both "iommu=smmuv3" machine parameter and another virtio-iommu instance.
7
trying to wedge it into the existing PMSAv7 code and data structures,
8
we define separate ones.
9
6
10
This commit adds the data structures which hold the state for a
7
Fixes: 70e89132c9 ("hw/arm/virt: Add the virtio-iommu device tree mappings")
11
PMSAv8 MPU and the register interface to it. The implementation of
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
12
the MPU behaviour will be added in a subsequent commit.
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
11
Message-id: 20211210170415.583179-4-jean-philippe@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/virt.c | 5 +++++
15
1 file changed, 5 insertions(+)
13
16
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Message-id: 1503414539-28762-2-git-send-email-peter.maydell@linaro.org
17
---
18
target/arm/cpu.h | 13 ++++++
19
hw/intc/armv7m_nvic.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++----
20
target/arm/cpu.c | 36 ++++++++++-----
21
target/arm/machine.c | 29 +++++++++++-
22
4 files changed, 180 insertions(+), 20 deletions(-)
23
24
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
25
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
26
--- a/target/arm/cpu.h
19
--- a/hw/arm/virt.c
27
+++ b/target/arm/cpu.h
20
+++ b/hw/arm/virt.c
28
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
21
@@ -XXX,XX +XXX,XX @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
29
uint32_t rnr;
22
hwaddr db_start = 0, db_end = 0;
30
} pmsav7;
23
char *resv_prop_str;
31
24
32
+ /* PMSAv8 MPU */
25
+ if (vms->iommu != VIRT_IOMMU_NONE) {
33
+ struct {
26
+ error_setg(errp, "virt machine does not support multiple IOMMUs");
34
+ /* The PMSAv8 implementation also shares some PMSAv7 config
35
+ * and state:
36
+ * pmsav7.rnr (region number register)
37
+ * pmsav7_dregion (number of configured regions)
38
+ */
39
+ uint32_t *rbar;
40
+ uint32_t *rlar;
41
+ uint32_t mair0;
42
+ uint32_t mair1;
43
+ } pmsav8;
44
+
45
void *nvic;
46
const struct arm_boot_info *boot_info;
47
/* Store GICv3CPUState to access from this struct */
48
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/hw/intc/armv7m_nvic.c
51
+++ b/hw/intc/armv7m_nvic.c
52
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset)
53
{
54
int region = cpu->env.pmsav7.rnr;
55
56
+ if (arm_feature(&cpu->env, ARM_FEATURE_V8)) {
57
+ /* PMSAv8M handling of the aliases is different from v7M:
58
+ * aliases A1, A2, A3 override the low two bits of the region
59
+ * number in MPU_RNR, and there is no 'region' field in the
60
+ * RBAR register.
61
+ */
62
+ int aliasno = (offset - 0xd9c) / 8; /* 0..3 */
63
+ if (aliasno) {
64
+ region = deposit32(region, 0, 2, aliasno);
65
+ }
66
+ if (region >= cpu->pmsav7_dregion) {
67
+ return 0;
68
+ }
69
+ return cpu->env.pmsav8.rbar[region];
70
+ }
71
+
72
if (region >= cpu->pmsav7_dregion) {
73
return 0;
74
}
75
return (cpu->env.pmsav7.drbar[region] & 0x1f) | (region & 0xf);
76
}
77
- case 0xda0: /* MPU_RASR */
78
- case 0xda8: /* MPU_RASR_A1 */
79
- case 0xdb0: /* MPU_RASR_A2 */
80
- case 0xdb8: /* MPU_RASR_A3 */
81
+ case 0xda0: /* MPU_RASR (v7M), MPU_RLAR (v8M) */
82
+ case 0xda8: /* MPU_RASR_A1 (v7M), MPU_RLAR_A1 (v8M) */
83
+ case 0xdb0: /* MPU_RASR_A2 (v7M), MPU_RLAR_A2 (v8M) */
84
+ case 0xdb8: /* MPU_RASR_A3 (v7M), MPU_RLAR_A3 (v8M) */
85
{
86
int region = cpu->env.pmsav7.rnr;
87
88
+ if (arm_feature(&cpu->env, ARM_FEATURE_V8)) {
89
+ /* PMSAv8M handling of the aliases is different from v7M:
90
+ * aliases A1, A2, A3 override the low two bits of the region
91
+ * number in MPU_RNR.
92
+ */
93
+ int aliasno = (offset - 0xda0) / 8; /* 0..3 */
94
+ if (aliasno) {
95
+ region = deposit32(region, 0, 2, aliasno);
96
+ }
97
+ if (region >= cpu->pmsav7_dregion) {
98
+ return 0;
99
+ }
100
+ return cpu->env.pmsav8.rlar[region];
101
+ }
102
+
103
if (region >= cpu->pmsav7_dregion) {
104
return 0;
105
}
106
return ((cpu->env.pmsav7.dracr[region] & 0xffff) << 16) |
107
(cpu->env.pmsav7.drsr[region] & 0xffff);
108
}
109
+ case 0xdc0: /* MPU_MAIR0 */
110
+ if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
111
+ goto bad_offset;
112
+ }
113
+ return cpu->env.pmsav8.mair0;
114
+ case 0xdc4: /* MPU_MAIR1 */
115
+ if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
116
+ goto bad_offset;
117
+ }
118
+ return cpu->env.pmsav8.mair1;
119
default:
120
+ bad_offset:
121
qemu_log_mask(LOG_GUEST_ERROR, "NVIC: Bad read offset 0x%x\n", offset);
122
return 0;
123
}
124
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value)
125
{
126
int region;
127
128
+ if (arm_feature(&cpu->env, ARM_FEATURE_V8)) {
129
+ /* PMSAv8M handling of the aliases is different from v7M:
130
+ * aliases A1, A2, A3 override the low two bits of the region
131
+ * number in MPU_RNR, and there is no 'region' field in the
132
+ * RBAR register.
133
+ */
134
+ int aliasno = (offset - 0xd9c) / 8; /* 0..3 */
135
+
136
+ region = cpu->env.pmsav7.rnr;
137
+ if (aliasno) {
138
+ region = deposit32(region, 0, 2, aliasno);
139
+ }
140
+ if (region >= cpu->pmsav7_dregion) {
141
+ return;
142
+ }
143
+ cpu->env.pmsav8.rbar[region] = value;
144
+ tlb_flush(CPU(cpu));
145
+ return;
27
+ return;
146
+ }
28
+ }
147
+
29
+
148
if (value & (1 << 4)) {
30
switch (vms->msi_controller) {
149
/* VALID bit means use the region number specified in this
31
case VIRT_MSI_CTRL_NONE:
150
* value and also update MPU_RNR.REGION with that value.
151
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value)
152
tlb_flush(CPU(cpu));
153
break;
154
}
155
- case 0xda0: /* MPU_RASR */
156
- case 0xda8: /* MPU_RASR_A1 */
157
- case 0xdb0: /* MPU_RASR_A2 */
158
- case 0xdb8: /* MPU_RASR_A3 */
159
+ case 0xda0: /* MPU_RASR (v7M), MPU_RLAR (v8M) */
160
+ case 0xda8: /* MPU_RASR_A1 (v7M), MPU_RLAR_A1 (v8M) */
161
+ case 0xdb0: /* MPU_RASR_A2 (v7M), MPU_RLAR_A2 (v8M) */
162
+ case 0xdb8: /* MPU_RASR_A3 (v7M), MPU_RLAR_A3 (v8M) */
163
{
164
int region = cpu->env.pmsav7.rnr;
165
166
+ if (arm_feature(&cpu->env, ARM_FEATURE_V8)) {
167
+ /* PMSAv8M handling of the aliases is different from v7M:
168
+ * aliases A1, A2, A3 override the low two bits of the region
169
+ * number in MPU_RNR.
170
+ */
171
+ int aliasno = (offset - 0xd9c) / 8; /* 0..3 */
172
+
173
+ region = cpu->env.pmsav7.rnr;
174
+ if (aliasno) {
175
+ region = deposit32(region, 0, 2, aliasno);
176
+ }
177
+ if (region >= cpu->pmsav7_dregion) {
178
+ return;
179
+ }
180
+ cpu->env.pmsav8.rlar[region] = value;
181
+ tlb_flush(CPU(cpu));
182
+ return;
183
+ }
184
+
185
if (region >= cpu->pmsav7_dregion) {
186
return;
32
return;
187
}
188
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value)
189
tlb_flush(CPU(cpu));
190
break;
191
}
192
+ case 0xdc0: /* MPU_MAIR0 */
193
+ if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
194
+ goto bad_offset;
195
+ }
196
+ if (cpu->pmsav7_dregion) {
197
+ /* Register is RES0 if no MPU regions are implemented */
198
+ cpu->env.pmsav8.mair0 = value;
199
+ }
200
+ /* We don't need to do anything else because memory attributes
201
+ * only affect cacheability, and we don't implement caching.
202
+ */
203
+ break;
204
+ case 0xdc4: /* MPU_MAIR1 */
205
+ if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
206
+ goto bad_offset;
207
+ }
208
+ if (cpu->pmsav7_dregion) {
209
+ /* Register is RES0 if no MPU regions are implemented */
210
+ cpu->env.pmsav8.mair1 = value;
211
+ }
212
+ /* We don't need to do anything else because memory attributes
213
+ * only affect cacheability, and we don't implement caching.
214
+ */
215
+ break;
216
case 0xf00: /* Software Triggered Interrupt Register */
217
{
218
int excnum = (value & 0x1ff) + NVIC_FIRST_IRQ;
219
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value)
220
break;
221
}
222
default:
223
+ bad_offset:
224
qemu_log_mask(LOG_GUEST_ERROR,
225
"NVIC: Bad write offset 0x%x\n", offset);
226
}
227
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
228
index XXXXXXX..XXXXXXX 100644
229
--- a/target/arm/cpu.c
230
+++ b/target/arm/cpu.c
231
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
232
env->vfp.xregs[ARM_VFP_FPEXC] = 0;
233
#endif
234
235
- if (arm_feature(env, ARM_FEATURE_PMSA) &&
236
- arm_feature(env, ARM_FEATURE_V7)) {
237
+ if (arm_feature(env, ARM_FEATURE_PMSA)) {
238
if (cpu->pmsav7_dregion > 0) {
239
- memset(env->pmsav7.drbar, 0,
240
- sizeof(*env->pmsav7.drbar) * cpu->pmsav7_dregion);
241
- memset(env->pmsav7.drsr, 0,
242
- sizeof(*env->pmsav7.drsr) * cpu->pmsav7_dregion);
243
- memset(env->pmsav7.dracr, 0,
244
- sizeof(*env->pmsav7.dracr) * cpu->pmsav7_dregion);
245
+ if (arm_feature(env, ARM_FEATURE_V8)) {
246
+ memset(env->pmsav8.rbar, 0,
247
+ sizeof(*env->pmsav8.rbar) * cpu->pmsav7_dregion);
248
+ memset(env->pmsav8.rlar, 0,
249
+ sizeof(*env->pmsav8.rlar) * cpu->pmsav7_dregion);
250
+ } else if (arm_feature(env, ARM_FEATURE_V7)) {
251
+ memset(env->pmsav7.drbar, 0,
252
+ sizeof(*env->pmsav7.drbar) * cpu->pmsav7_dregion);
253
+ memset(env->pmsav7.drsr, 0,
254
+ sizeof(*env->pmsav7.drsr) * cpu->pmsav7_dregion);
255
+ memset(env->pmsav7.dracr, 0,
256
+ sizeof(*env->pmsav7.dracr) * cpu->pmsav7_dregion);
257
+ }
258
}
259
env->pmsav7.rnr = 0;
260
+ env->pmsav8.mair0 = 0;
261
+ env->pmsav8.mair1 = 0;
262
}
263
264
set_flush_to_zero(1, &env->vfp.standard_fp_status);
265
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
266
}
267
268
if (nr) {
269
- env->pmsav7.drbar = g_new0(uint32_t, nr);
270
- env->pmsav7.drsr = g_new0(uint32_t, nr);
271
- env->pmsav7.dracr = g_new0(uint32_t, nr);
272
+ if (arm_feature(env, ARM_FEATURE_V8)) {
273
+ /* PMSAv8 */
274
+ env->pmsav8.rbar = g_new0(uint32_t, nr);
275
+ env->pmsav8.rlar = g_new0(uint32_t, nr);
276
+ } else {
277
+ env->pmsav7.drbar = g_new0(uint32_t, nr);
278
+ env->pmsav7.drsr = g_new0(uint32_t, nr);
279
+ env->pmsav7.dracr = g_new0(uint32_t, nr);
280
+ }
281
}
282
}
283
284
diff --git a/target/arm/machine.c b/target/arm/machine.c
285
index XXXXXXX..XXXXXXX 100644
286
--- a/target/arm/machine.c
287
+++ b/target/arm/machine.c
288
@@ -XXX,XX +XXX,XX @@ static bool pmsav7_needed(void *opaque)
289
CPUARMState *env = &cpu->env;
290
291
return arm_feature(env, ARM_FEATURE_PMSA) &&
292
- arm_feature(env, ARM_FEATURE_V7);
293
+ arm_feature(env, ARM_FEATURE_V7) &&
294
+ !arm_feature(env, ARM_FEATURE_V8);
295
}
296
297
static bool pmsav7_rgnr_vmstate_validate(void *opaque, int version_id)
298
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pmsav7_rnr = {
299
}
300
};
301
302
+static bool pmsav8_needed(void *opaque)
303
+{
304
+ ARMCPU *cpu = opaque;
305
+ CPUARMState *env = &cpu->env;
306
+
307
+ return arm_feature(env, ARM_FEATURE_PMSA) &&
308
+ arm_feature(env, ARM_FEATURE_V8);
309
+}
310
+
311
+static const VMStateDescription vmstate_pmsav8 = {
312
+ .name = "cpu/pmsav8",
313
+ .version_id = 1,
314
+ .minimum_version_id = 1,
315
+ .needed = pmsav8_needed,
316
+ .fields = (VMStateField[]) {
317
+ VMSTATE_VARRAY_UINT32(env.pmsav8.rbar, ARMCPU, pmsav7_dregion, 0,
318
+ vmstate_info_uint32, uint32_t),
319
+ VMSTATE_VARRAY_UINT32(env.pmsav8.rlar, ARMCPU, pmsav7_dregion, 0,
320
+ vmstate_info_uint32, uint32_t),
321
+ VMSTATE_UINT32(env.pmsav8.mair0, ARMCPU),
322
+ VMSTATE_UINT32(env.pmsav8.mair1, ARMCPU),
323
+ VMSTATE_END_OF_LIST()
324
+ }
325
+};
326
+
327
static int get_cpsr(QEMUFile *f, void *opaque, size_t size,
328
VMStateField *field)
329
{
330
@@ -XXX,XX +XXX,XX @@ const VMStateDescription vmstate_arm_cpu = {
331
*/
332
&vmstate_pmsav7_rnr,
333
&vmstate_pmsav7,
334
+ &vmstate_pmsav8,
335
NULL
336
}
337
};
338
--
33
--
339
2.7.4
34
2.25.1
340
35
341
36
diff view generated by jsdifflib
1
Make the CCR register banked if v8M security extensions are enabled.
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
This is slightly more complicated than the other "add banking"
3
To propagate errors to the caller of the pre_plug callback, use the
4
patches because there is one bit in the register which is not
4
object_poperty_set*() functions directly instead of the qdev_prop_set*()
5
banked. We keep the live data in the NS copy of the register,
5
helpers.
6
and adjust it on register reads and writes. (Since we don't
7
currently implement the behaviour that the bit controls, there
8
is nowhere else that needs to care.)
9
6
10
This patch includes the enforcement of the bits which are newly
7
Suggested-by: Igor Mammedov <imammedo@redhat.com>
11
RES1 in ARMv8M.
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
11
Message-id: 20211210170415.583179-5-jean-philippe@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/virt.c | 5 +++--
15
1 file changed, 3 insertions(+), 2 deletions(-)
12
16
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
14
Message-id: 1503414539-28762-17-git-send-email-peter.maydell@linaro.org
15
---
16
target/arm/cpu.h | 2 +-
17
hw/intc/armv7m_nvic.c | 33 +++++++++++++++++++++++++++------
18
target/arm/cpu.c | 12 +++++++++---
19
target/arm/helper.c | 5 +++--
20
target/arm/machine.c | 3 ++-
21
5 files changed, 42 insertions(+), 13 deletions(-)
22
23
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
24
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
25
--- a/target/arm/cpu.h
19
--- a/hw/arm/virt.c
26
+++ b/target/arm/cpu.h
20
+++ b/hw/arm/virt.c
27
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
21
@@ -XXX,XX +XXX,XX @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
28
uint32_t vecbase[2];
22
db_start, db_end,
29
uint32_t basepri[2];
23
VIRTIO_IOMMU_RESV_MEM_T_MSI);
30
uint32_t control[2];
24
31
- uint32_t ccr; /* Configuration and Control */
25
- qdev_prop_set_uint32(dev, "len-reserved-regions", 1);
32
+ uint32_t ccr[2]; /* Configuration and Control */
26
- qdev_prop_set_string(dev, "reserved-regions[0]", resv_prop_str);
33
uint32_t cfsr; /* Configurable Fault Status */
27
+ object_property_set_uint(OBJECT(dev), "len-reserved-regions", 1, errp);
34
uint32_t hfsr; /* HardFault Status */
28
+ object_property_set_str(OBJECT(dev), "reserved-regions[0]",
35
uint32_t dfsr; /* Debug Fault Status Register */
29
+ resv_prop_str, errp);
36
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
30
g_free(resv_prop_str);
37
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/intc/armv7m_nvic.c
39
+++ b/hw/intc/armv7m_nvic.c
40
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
41
/* TODO: Implement SLEEPONEXIT. */
42
return 0;
43
case 0xd14: /* Configuration Control. */
44
- return cpu->env.v7m.ccr;
45
+ /* The BFHFNMIGN bit is the only non-banked bit; we
46
+ * keep it in the non-secure copy of the register.
47
+ */
48
+ val = cpu->env.v7m.ccr[attrs.secure];
49
+ val |= cpu->env.v7m.ccr[M_REG_NS] & R_V7M_CCR_BFHFNMIGN_MASK;
50
+ return val;
51
case 0xd24: /* System Handler Status. */
52
val = 0;
53
if (s->vectors[ARMV7M_EXCP_MEM].active) {
54
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
55
R_V7M_CCR_USERSETMPEND_MASK |
56
R_V7M_CCR_NONBASETHRDENA_MASK);
57
58
- cpu->env.v7m.ccr = value;
59
+ if (arm_feature(&cpu->env, ARM_FEATURE_V8)) {
60
+ /* v8M makes NONBASETHRDENA and STKALIGN be RES1 */
61
+ value |= R_V7M_CCR_NONBASETHRDENA_MASK
62
+ | R_V7M_CCR_STKALIGN_MASK;
63
+ }
64
+ if (attrs.secure) {
65
+ /* the BFHFNMIGN bit is not banked; keep that in the NS copy */
66
+ cpu->env.v7m.ccr[M_REG_NS] =
67
+ (cpu->env.v7m.ccr[M_REG_NS] & ~R_V7M_CCR_BFHFNMIGN_MASK)
68
+ | (value & R_V7M_CCR_BFHFNMIGN_MASK);
69
+ value &= ~R_V7M_CCR_BFHFNMIGN_MASK;
70
+ }
71
+
72
+ cpu->env.v7m.ccr[attrs.secure] = value;
73
break;
74
case 0xd24: /* System Handler Control. */
75
s->vectors[ARMV7M_EXCP_MEM].active = (value & (1 << 0)) != 0;
76
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
77
}
31
}
78
}
32
}
79
80
-static bool nvic_user_access_ok(NVICState *s, hwaddr offset)
81
+static bool nvic_user_access_ok(NVICState *s, hwaddr offset, MemTxAttrs attrs)
82
{
83
/* Return true if unprivileged access to this register is permitted. */
84
switch (offset) {
85
case 0xf00: /* STIR: accessible only if CCR.USERSETMPEND permits */
86
- return s->cpu->env.v7m.ccr & R_V7M_CCR_USERSETMPEND_MASK;
87
+ /* For access via STIR_NS it is the NS CCR.USERSETMPEND that
88
+ * controls access even though the CPU is in Secure state (I_QDKX).
89
+ */
90
+ return s->cpu->env.v7m.ccr[attrs.secure] & R_V7M_CCR_USERSETMPEND_MASK;
91
default:
92
/* All other user accesses cause a BusFault unconditionally */
93
return false;
94
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_read(void *opaque, hwaddr addr,
95
unsigned i, startvec, end;
96
uint32_t val;
97
98
- if (attrs.user && !nvic_user_access_ok(s, addr)) {
99
+ if (attrs.user && !nvic_user_access_ok(s, addr, attrs)) {
100
/* Generate BusFault for unprivileged accesses */
101
return MEMTX_ERROR;
102
}
103
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
104
105
trace_nvic_sysreg_write(addr, value, size);
106
107
- if (attrs.user && !nvic_user_access_ok(s, addr)) {
108
+ if (attrs.user && !nvic_user_access_ok(s, addr, attrs)) {
109
/* Generate BusFault for unprivileged accesses */
110
return MEMTX_ERROR;
111
}
112
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
113
index XXXXXXX..XXXXXXX 100644
114
--- a/target/arm/cpu.c
115
+++ b/target/arm/cpu.c
116
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
117
env->v7m.secure = true;
118
}
119
120
- /* The reset value of this bit is IMPDEF, but ARM recommends
121
+ /* In v7M the reset value of this bit is IMPDEF, but ARM recommends
122
* that it resets to 1, so QEMU always does that rather than making
123
- * it dependent on CPU model.
124
+ * it dependent on CPU model. In v8M it is RES1.
125
*/
126
- env->v7m.ccr = R_V7M_CCR_STKALIGN_MASK;
127
+ env->v7m.ccr[M_REG_NS] = R_V7M_CCR_STKALIGN_MASK;
128
+ env->v7m.ccr[M_REG_S] = R_V7M_CCR_STKALIGN_MASK;
129
+ if (arm_feature(env, ARM_FEATURE_V8)) {
130
+ /* in v8M the NONBASETHRDENA bit [0] is RES1 */
131
+ env->v7m.ccr[M_REG_NS] |= R_V7M_CCR_NONBASETHRDENA_MASK;
132
+ env->v7m.ccr[M_REG_S] |= R_V7M_CCR_NONBASETHRDENA_MASK;
133
+ }
134
135
/* Unlike A/R profile, M profile defines the reset LR value */
136
env->regs[14] = 0xffffffff;
137
diff --git a/target/arm/helper.c b/target/arm/helper.c
138
index XXXXXXX..XXXXXXX 100644
139
--- a/target/arm/helper.c
140
+++ b/target/arm/helper.c
141
@@ -XXX,XX +XXX,XX @@ static void v7m_push_stack(ARMCPU *cpu)
142
uint32_t xpsr = xpsr_read(env);
143
144
/* Align stack pointer if the guest wants that */
145
- if ((env->regs[13] & 4) && (env->v7m.ccr & R_V7M_CCR_STKALIGN_MASK)) {
146
+ if ((env->regs[13] & 4) &&
147
+ (env->v7m.ccr[env->v7m.secure] & R_V7M_CCR_STKALIGN_MASK)) {
148
env->regs[13] -= 4;
149
xpsr |= XPSR_SPREALIGN;
150
}
151
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
152
/* fall through */
153
case 9: /* Return to Thread using Main stack */
154
if (!rettobase &&
155
- !(env->v7m.ccr & R_V7M_CCR_NONBASETHRDENA_MASK)) {
156
+ !(env->v7m.ccr[env->v7m.secure] & R_V7M_CCR_NONBASETHRDENA_MASK)) {
157
ufault = true;
158
}
159
break;
160
diff --git a/target/arm/machine.c b/target/arm/machine.c
161
index XXXXXXX..XXXXXXX 100644
162
--- a/target/arm/machine.c
163
+++ b/target/arm/machine.c
164
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m = {
165
VMSTATE_UINT32(env.v7m.vecbase[M_REG_NS], ARMCPU),
166
VMSTATE_UINT32(env.v7m.basepri[M_REG_NS], ARMCPU),
167
VMSTATE_UINT32(env.v7m.control[M_REG_NS], ARMCPU),
168
- VMSTATE_UINT32(env.v7m.ccr, ARMCPU),
169
+ VMSTATE_UINT32(env.v7m.ccr[M_REG_NS], ARMCPU),
170
VMSTATE_UINT32(env.v7m.cfsr, ARMCPU),
171
VMSTATE_UINT32(env.v7m.hfsr, ARMCPU),
172
VMSTATE_UINT32(env.v7m.dfsr, ARMCPU),
173
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
174
VMSTATE_UINT32(env.pmsav7.rnr[M_REG_S], ARMCPU),
175
VMSTATE_VALIDATE("secure MPU_RNR is valid", s_rnr_vmstate_validate),
176
VMSTATE_UINT32(env.v7m.mpu_ctrl[M_REG_S], ARMCPU),
177
+ VMSTATE_UINT32(env.v7m.ccr[M_REG_S], ARMCPU),
178
VMSTATE_END_OF_LIST()
179
}
180
};
181
--
33
--
182
2.7.4
34
2.25.1
183
35
184
36
diff view generated by jsdifflib
1
Now that MPU lookups can return different results for v8M
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
when the CPU is in secure vs non-secure state, we need to
3
have separate MMU indexes; add the secure counterparts
4
to the existing three M profile MMU indexes.
5
2
3
Create empty data files and allow updates for the upcoming VIOT tests.
4
5
Acked-by: Igor Mammedov <imammedo@redhat.com>
6
Reviewed-by: Eric Auger <eric.auger@redhat.com>
7
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
8
Message-id: 20211210170415.583179-6-jean-philippe@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 1503414539-28762-6-git-send-email-peter.maydell@linaro.org
9
---
10
---
10
target/arm/cpu.h | 19 +++++++++++++++++--
11
tests/qtest/bios-tables-test-allowed-diff.h | 3 +++
11
target/arm/helper.c | 9 ++++++++-
12
tests/data/acpi/q35/DSDT.viot | 0
12
2 files changed, 25 insertions(+), 3 deletions(-)
13
tests/data/acpi/q35/VIOT.viot | 0
14
tests/data/acpi/virt/VIOT | 0
15
4 files changed, 3 insertions(+)
16
create mode 100644 tests/data/acpi/q35/DSDT.viot
17
create mode 100644 tests/data/acpi/q35/VIOT.viot
18
create mode 100644 tests/data/acpi/virt/VIOT
13
19
14
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
20
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
15
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.h
22
--- a/tests/qtest/bios-tables-test-allowed-diff.h
17
+++ b/target/arm/cpu.h
23
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
18
@@ -XXX,XX +XXX,XX @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
24
@@ -1 +1,4 @@
19
* Execution priority negative (this is like privileged, but the
25
/* List of comma-separated changed AML files to ignore */
20
* MPU HFNMIENA bit means that it may have different access permission
26
+"tests/data/acpi/virt/VIOT",
21
* check results to normal privileged code, so can't share a TLB).
27
+"tests/data/acpi/q35/DSDT.viot",
22
+ * If the CPU supports the v8M Security Extension then there are also:
28
+"tests/data/acpi/q35/VIOT.viot",
23
+ * Secure User
29
diff --git a/tests/data/acpi/q35/DSDT.viot b/tests/data/acpi/q35/DSDT.viot
24
+ * Secure Privileged
30
new file mode 100644
25
+ * Secure, execution priority negative
31
index XXXXXXX..XXXXXXX
26
*
32
diff --git a/tests/data/acpi/q35/VIOT.viot b/tests/data/acpi/q35/VIOT.viot
27
* The ARMMMUIdx and the mmu index value used by the core QEMU TLB code
33
new file mode 100644
28
* are not quite the same -- different CPU types (most notably M profile
34
index XXXXXXX..XXXXXXX
29
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdx {
35
diff --git a/tests/data/acpi/virt/VIOT b/tests/data/acpi/virt/VIOT
30
ARMMMUIdx_MUser = 0 | ARM_MMU_IDX_M,
36
new file mode 100644
31
ARMMMUIdx_MPriv = 1 | ARM_MMU_IDX_M,
37
index XXXXXXX..XXXXXXX
32
ARMMMUIdx_MNegPri = 2 | ARM_MMU_IDX_M,
33
+ ARMMMUIdx_MSUser = 3 | ARM_MMU_IDX_M,
34
+ ARMMMUIdx_MSPriv = 4 | ARM_MMU_IDX_M,
35
+ ARMMMUIdx_MSNegPri = 5 | ARM_MMU_IDX_M,
36
/* Indexes below here don't have TLBs and are used only for AT system
37
* instructions or for the first stage of an S12 page table walk.
38
*/
39
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdxBit {
40
ARMMMUIdxBit_MUser = 1 << 0,
41
ARMMMUIdxBit_MPriv = 1 << 1,
42
ARMMMUIdxBit_MNegPri = 1 << 2,
43
+ ARMMMUIdxBit_MSUser = 1 << 3,
44
+ ARMMMUIdxBit_MSPriv = 1 << 4,
45
+ ARMMMUIdxBit_MSNegPri = 1 << 5,
46
} ARMMMUIdxBit;
47
48
#define MMU_USER_IDX 0
49
@@ -XXX,XX +XXX,XX @@ static inline int arm_mmu_idx_to_el(ARMMMUIdx mmu_idx)
50
case ARM_MMU_IDX_A:
51
return mmu_idx & 3;
52
case ARM_MMU_IDX_M:
53
- return mmu_idx == ARMMMUIdx_MUser ? 0 : 1;
54
+ return (mmu_idx == ARMMMUIdx_MUser || mmu_idx == ARMMMUIdx_MSUser)
55
+ ? 0 : 1;
56
default:
57
g_assert_not_reached();
58
}
59
@@ -XXX,XX +XXX,XX @@ static inline int cpu_mmu_index(CPUARMState *env, bool ifetch)
60
*/
61
if ((env->v7m.exception > 0 && env->v7m.exception <= 3)
62
|| env->v7m.faultmask) {
63
- return arm_to_core_mmu_idx(ARMMMUIdx_MNegPri);
64
+ mmu_idx = ARMMMUIdx_MNegPri;
65
+ }
66
+
67
+ if (env->v7m.secure) {
68
+ mmu_idx += ARMMMUIdx_MSUser;
69
}
70
71
return arm_to_core_mmu_idx(mmu_idx);
72
diff --git a/target/arm/helper.c b/target/arm/helper.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/target/arm/helper.c
75
+++ b/target/arm/helper.c
76
@@ -XXX,XX +XXX,XX @@ static inline uint32_t regime_el(CPUARMState *env, ARMMMUIdx mmu_idx)
77
case ARMMMUIdx_MPriv:
78
case ARMMMUIdx_MNegPri:
79
case ARMMMUIdx_MUser:
80
+ case ARMMMUIdx_MSPriv:
81
+ case ARMMMUIdx_MSNegPri:
82
+ case ARMMMUIdx_MSUser:
83
return 1;
84
default:
85
g_assert_not_reached();
86
@@ -XXX,XX +XXX,XX @@ static inline bool regime_is_secure(CPUARMState *env, ARMMMUIdx mmu_idx)
87
case ARMMMUIdx_S1E3:
88
case ARMMMUIdx_S1SE0:
89
case ARMMMUIdx_S1SE1:
90
+ case ARMMMUIdx_MSPriv:
91
+ case ARMMMUIdx_MSNegPri:
92
+ case ARMMMUIdx_MSUser:
93
return true;
94
default:
95
g_assert_not_reached();
96
@@ -XXX,XX +XXX,XX @@ static inline bool regime_translation_disabled(CPUARMState *env,
97
(R_V7M_MPU_CTRL_ENABLE_MASK | R_V7M_MPU_CTRL_HFNMIENA_MASK)) {
98
case R_V7M_MPU_CTRL_ENABLE_MASK:
99
/* Enabled, but not for HardFault and NMI */
100
- return mmu_idx == ARMMMUIdx_MNegPri;
101
+ return mmu_idx == ARMMMUIdx_MNegPri ||
102
+ mmu_idx == ARMMMUIdx_MSNegPri;
103
case R_V7M_MPU_CTRL_ENABLE_MASK | R_V7M_MPU_CTRL_HFNMIENA_MASK:
104
/* Enabled for all cases */
105
return false;
106
--
38
--
107
2.7.4
39
2.25.1
108
40
109
41
diff view generated by jsdifflib
1
Make the FAULTMASK register banked if v8M security extensions are enabled.
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
Note that we do not yet implement the functionality of the new
3
Add two test cases for VIOT, one on the q35 machine and the other on
4
AIRCR.PRIS bit (which allows the effect of the NS copy of FAULTMASK to
4
virt. To test complex topologies the q35 test has two PCIe buses that
5
be restricted).
5
bypass the IOMMU (and are therefore not described by VIOT), and two
6
buses that are translated by virtio-iommu.
6
7
7
This patch includes the code to determine for v8M which copy
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
of FAULTMASK should be updated on exception exit; further
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
9
changes will be required to the exception exit code in general
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
10
to support v8M, so this is just a small piece of that.
11
Message-id: 20211210170415.583179-7-jean-philippe@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
tests/qtest/bios-tables-test.c | 38 ++++++++++++++++++++++++++++++++++
15
1 file changed, 38 insertions(+)
11
16
12
The v8M ARM ARM introduces a notation where individual paragraphs
17
diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
13
are labelled with R (for rule) or I (for information) followed
14
by a random group of subscript letters. In comments where we want
15
to refer to a particular part of the manual we use this convention,
16
which should be more stable across document revisions than using
17
section or page numbers.
18
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
Message-id: 1503414539-28762-9-git-send-email-peter.maydell@linaro.org
22
---
23
target/arm/cpu.h | 14 ++++++++++++--
24
hw/intc/armv7m_nvic.c | 9 ++++++++-
25
target/arm/helper.c | 20 ++++++++++++++++----
26
target/arm/machine.c | 5 +++--
27
4 files changed, 39 insertions(+), 9 deletions(-)
28
29
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
30
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/cpu.h
19
--- a/tests/qtest/bios-tables-test.c
32
+++ b/target/arm/cpu.h
20
+++ b/tests/qtest/bios-tables-test.c
33
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
21
@@ -XXX,XX +XXX,XX @@ static void test_acpi_virt_tcg(void)
34
unsigned mpu_ctrl; /* MPU_CTRL */
22
free_test_data(&data);
35
int exception;
36
uint32_t primask[2];
37
- uint32_t faultmask;
38
+ uint32_t faultmask[2];
39
uint32_t secure; /* Is CPU in Secure state? (not guest visible) */
40
} v7m;
41
42
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_acknowledge_irq(void *opaque);
43
* (Ignoring -1, this is the same as the RETTOBASE value before completion.)
44
*/
45
int armv7m_nvic_complete_irq(void *opaque, int irq);
46
+/**
47
+ * armv7m_nvic_raw_execution_priority: return the raw execution priority
48
+ * @opaque: the NVIC
49
+ *
50
+ * Returns: the raw execution priority as defined by the v8M architecture.
51
+ * This is the execution priority minus the effects of AIRCR.PRIS,
52
+ * and minus any PRIMASK/FAULTMASK/BASEPRI priority boosting.
53
+ * (v8M ARM ARM I_PKLD.)
54
+ */
55
+int armv7m_nvic_raw_execution_priority(void *opaque);
56
57
/* Interface for defining coprocessor registers.
58
* Registers are defined in tables of arm_cp_reginfo structs
59
@@ -XXX,XX +XXX,XX @@ static inline int cpu_mmu_index(CPUARMState *env, bool ifetch)
60
* we're in a HardFault or NMI handler.
61
*/
62
if ((env->v7m.exception > 0 && env->v7m.exception <= 3)
63
- || env->v7m.faultmask) {
64
+ || env->v7m.faultmask[env->v7m.secure]) {
65
mmu_idx = ARMMMUIdx_MNegPri;
66
}
67
68
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/hw/intc/armv7m_nvic.c
71
+++ b/hw/intc/armv7m_nvic.c
72
@@ -XXX,XX +XXX,XX @@ static inline int nvic_exec_prio(NVICState *s)
73
CPUARMState *env = &s->cpu->env;
74
int running;
75
76
- if (env->v7m.faultmask) {
77
+ if (env->v7m.faultmask[env->v7m.secure]) {
78
running = -1;
79
} else if (env->v7m.primask[env->v7m.secure]) {
80
running = 0;
81
@@ -XXX,XX +XXX,XX @@ bool armv7m_nvic_can_take_pending_exception(void *opaque)
82
return nvic_exec_prio(s) > nvic_pending_prio(s);
83
}
23
}
84
24
85
+int armv7m_nvic_raw_execution_priority(void *opaque)
25
+static void test_acpi_q35_viot(void)
86
+{
26
+{
87
+ NVICState *s = opaque;
27
+ test_data data = {
28
+ .machine = MACHINE_Q35,
29
+ .variant = ".viot",
30
+ };
88
+
31
+
89
+ return s->exception_prio;
32
+ /*
33
+ * To keep things interesting, two buses bypass the IOMMU.
34
+ * VIOT should only describes the other two buses.
35
+ */
36
+ test_acpi_one("-machine default_bus_bypass_iommu=on "
37
+ "-device virtio-iommu-pci "
38
+ "-device pxb-pcie,bus_nr=0x10,id=pcie.100,bus=pcie.0 "
39
+ "-device pxb-pcie,bus_nr=0x20,id=pcie.200,bus=pcie.0,bypass_iommu=on "
40
+ "-device pxb-pcie,bus_nr=0x30,id=pcie.300,bus=pcie.0",
41
+ &data);
42
+ free_test_data(&data);
90
+}
43
+}
91
+
44
+
92
/* caller must call nvic_irq_update() after this */
45
+static void test_acpi_virt_viot(void)
93
static void set_prio(NVICState *s, unsigned irq, uint8_t prio)
46
+{
47
+ test_data data = {
48
+ .machine = "virt",
49
+ .uefi_fl1 = "pc-bios/edk2-aarch64-code.fd",
50
+ .uefi_fl2 = "pc-bios/edk2-arm-vars.fd",
51
+ .cd = "tests/data/uefi-boot-images/bios-tables-test.aarch64.iso.qcow2",
52
+ .ram_start = 0x40000000ULL,
53
+ .scan_len = 128ULL * 1024 * 1024,
54
+ };
55
+
56
+ test_acpi_one("-cpu cortex-a57 "
57
+ "-device virtio-iommu-pci", &data);
58
+ free_test_data(&data);
59
+}
60
+
61
static void test_oem_fields(test_data *data)
94
{
62
{
95
diff --git a/target/arm/helper.c b/target/arm/helper.c
63
int i;
96
index XXXXXXX..XXXXXXX 100644
64
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
97
--- a/target/arm/helper.c
65
qtest_add_func("acpi/q35/kvm/xapic", test_acpi_q35_kvm_xapic);
98
+++ b/target/arm/helper.c
66
qtest_add_func("acpi/q35/kvm/dmar", test_acpi_q35_kvm_dmar);
99
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
67
}
68
+ qtest_add_func("acpi/q35/viot", test_acpi_q35_viot);
69
} else if (strcmp(arch, "aarch64") == 0) {
70
if (has_tcg) {
71
qtest_add_func("acpi/virt", test_acpi_virt_tcg);
72
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
73
qtest_add_func("acpi/virt/memhp", test_acpi_virt_tcg_memhp);
74
qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb);
75
qtest_add_func("acpi/virt/oem-fields", test_acpi_oem_fields_virt);
76
+ qtest_add_func("acpi/virt/viot", test_acpi_virt_viot);
77
}
100
}
78
}
101
79
ret = g_test_run();
102
if (env->v7m.exception != ARMV7M_EXCP_NMI) {
103
- /* Auto-clear FAULTMASK on return from other than NMI */
104
- env->v7m.faultmask = 0;
105
+ /* Auto-clear FAULTMASK on return from other than NMI.
106
+ * If the security extension is implemented then this only
107
+ * happens if the raw execution priority is >= 0; the
108
+ * value of the ES bit in the exception return value indicates
109
+ * which security state's faultmask to clear. (v8M ARM ARM R_KBNF.)
110
+ */
111
+ if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
112
+ int es = type & 1;
113
+ if (armv7m_nvic_raw_execution_priority(env->nvic) >= 0) {
114
+ env->v7m.faultmask[es] = 0;
115
+ }
116
+ } else {
117
+ env->v7m.faultmask[M_REG_NS] = 0;
118
+ }
119
}
120
121
switch (armv7m_nvic_complete_irq(env->nvic, env->v7m.exception)) {
122
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
123
case 18: /* BASEPRI_MAX */
124
return env->v7m.basepri[env->v7m.secure];
125
case 19: /* FAULTMASK */
126
- return env->v7m.faultmask;
127
+ return env->v7m.faultmask[env->v7m.secure];
128
default:
129
qemu_log_mask(LOG_GUEST_ERROR, "Attempt to read unknown special"
130
" register %d\n", reg);
131
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
132
}
133
break;
134
case 19: /* FAULTMASK */
135
- env->v7m.faultmask = val & 1;
136
+ env->v7m.faultmask[env->v7m.secure] = val & 1;
137
break;
138
case 20: /* CONTROL */
139
/* Writing to the SPSEL bit only has an effect if we are in
140
diff --git a/target/arm/machine.c b/target/arm/machine.c
141
index XXXXXXX..XXXXXXX 100644
142
--- a/target/arm/machine.c
143
+++ b/target/arm/machine.c
144
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_faultmask_primask = {
145
.version_id = 1,
146
.minimum_version_id = 1,
147
.fields = (VMStateField[]) {
148
- VMSTATE_UINT32(env.v7m.faultmask, ARMCPU),
149
+ VMSTATE_UINT32(env.v7m.faultmask[M_REG_NS], ARMCPU),
150
VMSTATE_UINT32(env.v7m.primask[M_REG_NS], ARMCPU),
151
VMSTATE_END_OF_LIST()
152
}
153
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_m_security = {
154
VMSTATE_UINT32(env.v7m.secure, ARMCPU),
155
VMSTATE_UINT32(env.v7m.basepri[M_REG_S], ARMCPU),
156
VMSTATE_UINT32(env.v7m.primask[M_REG_S], ARMCPU),
157
+ VMSTATE_UINT32(env.v7m.faultmask[M_REG_S], ARMCPU),
158
VMSTATE_END_OF_LIST()
159
}
160
};
161
@@ -XXX,XX +XXX,XX @@ static int get_cpsr(QEMUFile *f, void *opaque, size_t size,
162
* transferred using the vmstate_m_faultmask_primask subsection.
163
*/
164
if (val & CPSR_F) {
165
- env->v7m.faultmask = 1;
166
+ env->v7m.faultmask[M_REG_NS] = 1;
167
}
168
if (val & CPSR_I) {
169
env->v7m.primask[M_REG_NS] = 1;
170
--
80
--
171
2.7.4
81
2.25.1
172
82
173
83
diff view generated by jsdifflib
1
Implement the behavioural side of the new PMSAv8 specification.
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
Add expected blobs of the VIOT and DSDT table for the VIOT test on the
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
q35 machine.
5
Message-id: 1503414539-28762-3-git-send-email-peter.maydell@linaro.org
5
6
---
6
Since the test instantiates a virtio device and two PCIe expander
7
target/arm/helper.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++-
7
bridges, DSDT.viot has more blocks than the base DSDT.
8
1 file changed, 110 insertions(+), 1 deletion(-)
8
9
9
The VIOT table generated for the q35 test is:
10
diff --git a/target/arm/helper.c b/target/arm/helper.c
10
11
index XXXXXXX..XXXXXXX 100644
11
[000h 0000 4] Signature : "VIOT" [Virtual I/O Translation Table]
12
--- a/target/arm/helper.c
12
[004h 0004 4] Table Length : 00000070
13
+++ b/target/arm/helper.c
13
[008h 0008 1] Revision : 00
14
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_pmsav7(CPUARMState *env, uint32_t address,
14
[009h 0009 1] Checksum : 3D
15
return !(*prot & (1 << access_type));
15
[00Ah 0010 6] Oem ID : "BOCHS "
16
}
16
[010h 0016 8] Oem Table ID : "BXPC "
17
17
[018h 0024 4] Oem Revision : 00000001
18
+static bool get_phys_addr_pmsav8(CPUARMState *env, uint32_t address,
18
[01Ch 0028 4] Asl Compiler ID : "BXPC"
19
+ MMUAccessType access_type, ARMMMUIdx mmu_idx,
19
[020h 0032 4] Asl Compiler Revision : 00000001
20
+ hwaddr *phys_ptr, int *prot, uint32_t *fsr)
20
21
+{
21
[024h 0036 2] Node count : 0003
22
+ ARMCPU *cpu = arm_env_get_cpu(env);
22
[026h 0038 2] Node offset : 0030
23
+ bool is_user = regime_is_user(env, mmu_idx);
23
[028h 0040 8] Reserved : 0000000000000000
24
+ int n;
24
25
+ int matchregion = -1;
25
[030h 0048 1] Type : 03 [VirtIO-PCI IOMMU]
26
+ bool hit = false;
26
[031h 0049 1] Reserved : 00
27
+
27
[032h 0050 2] Length : 0010
28
+ *phys_ptr = address;
28
29
+ *prot = 0;
29
[034h 0052 2] PCI Segment : 0000
30
+
30
[036h 0054 2] PCI BDF number : 0010
31
+ /* Unlike the ARM ARM pseudocode, we don't need to check whether this
31
[038h 0056 8] Reserved : 0000000000000000
32
+ * was an exception vector read from the vector table (which is always
32
33
+ * done using the default system address map), because those accesses
33
[040h 0064 1] Type : 01 [PCI Range]
34
+ * are done in arm_v7m_load_vector(), which always does a direct
34
[041h 0065 1] Reserved : 00
35
+ * read using address_space_ldl(), rather than going via this function.
35
[042h 0066 2] Length : 0018
36
+ */
36
37
+ if (regime_translation_disabled(env, mmu_idx)) { /* MPU disabled */
37
[044h 0068 4] Endpoint start : 00003000
38
+ hit = true;
38
[048h 0072 2] PCI Segment start : 0000
39
+ } else if (m_is_ppb_region(env, address)) {
39
[04Ah 0074 2] PCI Segment end : 0000
40
+ hit = true;
40
[04Ch 0076 2] PCI BDF start : 3000
41
+ } else if (pmsav7_use_background_region(cpu, mmu_idx, is_user)) {
41
[04Eh 0078 2] PCI BDF end : 30FF
42
+ hit = true;
42
[050h 0080 2] Output node : 0030
43
+ } else {
43
[052h 0082 6] Reserved : 000000000000
44
+ for (n = (int)cpu->pmsav7_dregion - 1; n >= 0; n--) {
44
45
+ /* region search */
45
[058h 0088 1] Type : 01 [PCI Range]
46
+ /* Note that the base address is bits [31:5] from the register
46
[059h 0089 1] Reserved : 00
47
+ * with bits [4:0] all zeroes, but the limit address is bits
47
[05Ah 0090 2] Length : 0018
48
+ * [31:5] from the register with bits [4:0] all ones.
48
49
+ */
49
[05Ch 0092 4] Endpoint start : 00001000
50
+ uint32_t base = env->pmsav8.rbar[n] & ~0x1f;
50
[060h 0096 2] PCI Segment start : 0000
51
+ uint32_t limit = env->pmsav8.rlar[n] | 0x1f;
51
[062h 0098 2] PCI Segment end : 0000
52
+
52
[064h 0100 2] PCI BDF start : 1000
53
+ if (!(env->pmsav8.rlar[n] & 0x1)) {
53
[066h 0102 2] PCI BDF end : 10FF
54
+ /* Region disabled */
54
[068h 0104 2] Output node : 0030
55
+ continue;
55
[06Ah 0106 6] Reserved : 000000000000
56
+ }
56
57
+
57
And the DSDT diff is:
58
+ if (address < base || address > limit) {
58
59
+ continue;
59
@@ -XXX,XX +XXX,XX @@
60
+ }
60
*
61
+
61
* Disassembling to symbolic ASL+ operators
62
+ if (hit) {
62
*
63
+ /* Multiple regions match -- always a failure (unlike
63
- * Disassembly of tests/data/acpi/q35/DSDT, Fri Dec 10 15:03:08 2021
64
+ * PMSAv7 where highest-numbered-region wins)
64
+ * Disassembly of /tmp/aml-H9Y5D1, Fri Dec 10 15:02:27 2021
65
+ */
65
*
66
+ *fsr = 0x00d; /* permission fault */
66
* Original Table Header:
67
+ return true;
67
* Signature "DSDT"
68
+ }
68
- * Length 0x00002061 (8289)
69
+
69
+ * Length 0x000024B6 (9398)
70
+ matchregion = n;
70
* Revision 0x01 **** 32-bit table (V1), no 64-bit math support
71
+ hit = true;
71
- * Checksum 0xFA
72
+
72
+ * Checksum 0xA7
73
+ if (base & ~TARGET_PAGE_MASK) {
73
* OEM ID "BOCHS "
74
+ qemu_log_mask(LOG_UNIMP,
74
* OEM Table ID "BXPC "
75
+ "MPU_RBAR[%d]: No support for MPU region base"
75
* OEM Revision 0x00000001 (1)
76
+ "address of 0x%" PRIx32 ". Minimum alignment is "
76
@@ -XXX,XX +XXX,XX @@
77
+ "%d\n",
77
}
78
+ n, base, TARGET_PAGE_BITS);
78
}
79
+ continue;
79
80
+ }
80
+ Scope (\_SB)
81
+ if ((limit + 1) & ~TARGET_PAGE_MASK) {
81
+ {
82
+ qemu_log_mask(LOG_UNIMP,
82
+ Device (PC30)
83
+ "MPU_RBAR[%d]: No support for MPU region limit"
83
+ {
84
+ "address of 0x%" PRIx32 ". Minimum alignment is "
84
+ Name (_UID, 0x30) // _UID: Unique ID
85
+ "%d\n",
85
+ Name (_BBN, 0x30) // _BBN: BIOS Bus Number
86
+ n, limit, TARGET_PAGE_BITS);
86
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
87
+ continue;
87
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
88
+ }
88
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
89
+ {
90
+ CreateDWordField (Arg3, Zero, CDW1)
91
+ If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
92
+ {
93
+ CreateDWordField (Arg3, 0x04, CDW2)
94
+ CreateDWordField (Arg3, 0x08, CDW3)
95
+ Local0 = CDW3 /* \_SB_.PC30._OSC.CDW3 */
96
+ Local0 &= 0x1F
97
+ If ((Arg1 != One))
98
+ {
99
+ CDW1 |= 0x08
100
+ }
101
+
102
+ If ((CDW3 != Local0))
103
+ {
104
+ CDW1 |= 0x10
105
+ }
106
+
107
+ CDW3 = Local0
108
+ }
109
+ Else
110
+ {
111
+ CDW1 |= 0x04
112
+ }
113
+
114
+ Return (Arg3)
115
+ }
116
+
117
+ Method (_PRT, 0, NotSerialized) // _PRT: PCI Routing Table
118
+ {
119
+ Local0 = Package (0x80){}
120
+ Local1 = Zero
121
+ While ((Local1 < 0x80))
122
+ {
123
+ Local2 = (Local1 >> 0x02)
124
+ Local3 = ((Local1 + Local2) & 0x03)
125
+ If ((Local3 == Zero))
126
+ {
127
+ Local4 = Package (0x04)
128
+ {
129
+ Zero,
130
+ Zero,
131
+ LNKD,
132
+ Zero
133
+ }
134
+ }
135
+
136
+ If ((Local3 == One))
137
+ {
138
+ Local4 = Package (0x04)
139
+ {
140
+ Zero,
141
+ Zero,
142
+ LNKA,
143
+ Zero
144
+ }
145
+ }
146
+
147
+ If ((Local3 == 0x02))
148
+ {
149
+ Local4 = Package (0x04)
150
+ {
151
+ Zero,
152
+ Zero,
153
+ LNKB,
154
+ Zero
155
+ }
156
+ }
157
+
158
+ If ((Local3 == 0x03))
159
+ {
160
+ Local4 = Package (0x04)
161
+ {
162
+ Zero,
163
+ Zero,
164
+ LNKC,
165
+ Zero
166
+ }
167
+ }
168
+
169
+ Local4 [Zero] = ((Local2 << 0x10) | 0xFFFF)
170
+ Local4 [One] = (Local1 & 0x03)
171
+ Local0 [Local1] = Local4
172
+ Local1++
173
+ }
174
+
175
+ Return (Local0)
176
+ }
177
+
178
+ Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
179
+ {
180
+ WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
181
+ 0x0000, // Granularity
182
+ 0x0030, // Range Minimum
183
+ 0x0030, // Range Maximum
184
+ 0x0000, // Translation Offset
185
+ 0x0001, // Length
186
+ ,, )
187
+ })
89
+ }
188
+ }
90
+ }
189
+ }
91
+
190
+
92
+ if (!hit) {
191
+ Scope (\_SB)
93
+ /* background fault */
192
+ {
94
+ *fsr = 0;
193
+ Device (PC20)
95
+ return true;
194
+ {
195
+ Name (_UID, 0x20) // _UID: Unique ID
196
+ Name (_BBN, 0x20) // _BBN: BIOS Bus Number
197
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
198
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
199
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
200
+ {
201
+ CreateDWordField (Arg3, Zero, CDW1)
202
+ If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
203
+ {
204
+ CreateDWordField (Arg3, 0x04, CDW2)
205
+ CreateDWordField (Arg3, 0x08, CDW3)
206
+ Local0 = CDW3 /* \_SB_.PC20._OSC.CDW3 */
207
+ Local0 &= 0x1F
208
+ If ((Arg1 != One))
209
+ {
210
+ CDW1 |= 0x08
211
+ }
212
+
213
+ If ((CDW3 != Local0))
214
+ {
215
+ CDW1 |= 0x10
216
+ }
217
+
218
+ CDW3 = Local0
219
+ }
220
+ Else
221
+ {
222
+ CDW1 |= 0x04
223
+ }
224
+
225
+ Return (Arg3)
226
+ }
227
+
228
+ Method (_PRT, 0, NotSerialized) // _PRT: PCI Routing Table
229
+ {
230
+ Local0 = Package (0x80){}
231
+ Local1 = Zero
232
+ While ((Local1 < 0x80))
233
+ {
234
+ Local2 = (Local1 >> 0x02)
235
+ Local3 = ((Local1 + Local2) & 0x03)
236
+ If ((Local3 == Zero))
237
+ {
238
+ Local4 = Package (0x04)
239
+ {
240
+ Zero,
241
+ Zero,
242
+ LNKD,
243
+ Zero
244
+ }
245
+ }
246
+
247
+ If ((Local3 == One))
248
+ {
249
+ Local4 = Package (0x04)
250
+ {
251
+ Zero,
252
+ Zero,
253
+ LNKA,
254
+ Zero
255
+ }
256
+ }
257
+
258
+ If ((Local3 == 0x02))
259
+ {
260
+ Local4 = Package (0x04)
261
+ {
262
+ Zero,
263
+ Zero,
264
+ LNKB,
265
+ Zero
266
+ }
267
+ }
268
+
269
+ If ((Local3 == 0x03))
270
+ {
271
+ Local4 = Package (0x04)
272
+ {
273
+ Zero,
274
+ Zero,
275
+ LNKC,
276
+ Zero
277
+ }
278
+ }
279
+
280
+ Local4 [Zero] = ((Local2 << 0x10) | 0xFFFF)
281
+ Local4 [One] = (Local1 & 0x03)
282
+ Local0 [Local1] = Local4
283
+ Local1++
284
+ }
285
+
286
+ Return (Local0)
287
+ }
288
+
289
+ Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
290
+ {
291
+ WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
292
+ 0x0000, // Granularity
293
+ 0x0020, // Range Minimum
294
+ 0x0020, // Range Maximum
295
+ 0x0000, // Translation Offset
296
+ 0x0001, // Length
297
+ ,, )
298
+ })
299
+ }
96
+ }
300
+ }
97
+
301
+
98
+ if (matchregion == -1) {
302
+ Scope (\_SB)
99
+ /* hit using the background region */
303
+ {
100
+ get_phys_addr_pmsav7_default(env, mmu_idx, address, prot);
304
+ Device (PC10)
101
+ } else {
305
+ {
102
+ uint32_t ap = extract32(env->pmsav8.rbar[matchregion], 1, 2);
306
+ Name (_UID, 0x10) // _UID: Unique ID
103
+ uint32_t xn = extract32(env->pmsav8.rbar[matchregion], 0, 1);
307
+ Name (_BBN, 0x10) // _BBN: BIOS Bus Number
104
+
308
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
105
+ if (m_is_system_region(env, address)) {
309
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
106
+ /* System space is always execute never */
310
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
107
+ xn = 1;
311
+ {
312
+ CreateDWordField (Arg3, Zero, CDW1)
313
+ If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
314
+ {
315
+ CreateDWordField (Arg3, 0x04, CDW2)
316
+ CreateDWordField (Arg3, 0x08, CDW3)
317
+ Local0 = CDW3 /* \_SB_.PC10._OSC.CDW3 */
318
+ Local0 &= 0x1F
319
+ If ((Arg1 != One))
320
+ {
321
+ CDW1 |= 0x08
322
+ }
323
+
324
+ If ((CDW3 != Local0))
325
+ {
326
+ CDW1 |= 0x10
327
+ }
328
+
329
+ CDW3 = Local0
330
+ }
331
+ Else
332
+ {
333
+ CDW1 |= 0x04
334
+ }
335
+
336
+ Return (Arg3)
337
+ }
338
+
339
+ Method (_PRT, 0, NotSerialized) // _PRT: PCI Routing Table
340
+ {
341
+ Local0 = Package (0x80){}
342
+ Local1 = Zero
343
+ While ((Local1 < 0x80))
344
+ {
345
+ Local2 = (Local1 >> 0x02)
346
+ Local3 = ((Local1 + Local2) & 0x03)
347
+ If ((Local3 == Zero))
348
+ {
349
+ Local4 = Package (0x04)
350
+ {
351
+ Zero,
352
+ Zero,
353
+ LNKD,
354
+ Zero
355
+ }
356
+ }
357
+
358
+ If ((Local3 == One))
359
+ {
360
+ Local4 = Package (0x04)
361
+ {
362
+ Zero,
363
+ Zero,
364
+ LNKA,
365
+ Zero
366
+ }
367
+ }
368
+
369
+ If ((Local3 == 0x02))
370
+ {
371
+ Local4 = Package (0x04)
372
+ {
373
+ Zero,
374
+ Zero,
375
+ LNKB,
376
+ Zero
377
+ }
378
+ }
379
+
380
+ If ((Local3 == 0x03))
381
+ {
382
+ Local4 = Package (0x04)
383
+ {
384
+ Zero,
385
+ Zero,
386
+ LNKC,
387
+ Zero
388
+ }
389
+ }
390
+
391
+ Local4 [Zero] = ((Local2 << 0x10) | 0xFFFF)
392
+ Local4 [One] = (Local1 & 0x03)
393
+ Local0 [Local1] = Local4
394
+ Local1++
395
+ }
396
+
397
+ Return (Local0)
398
+ }
399
+
400
+ Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
401
+ {
402
+ WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
403
+ 0x0000, // Granularity
404
+ 0x0010, // Range Minimum
405
+ 0x0010, // Range Maximum
406
+ 0x0000, // Translation Offset
407
+ 0x0001, // Length
408
+ ,, )
409
+ })
108
+ }
410
+ }
109
+
110
+ *prot = simple_ap_to_rw_prot(env, mmu_idx, ap);
111
+ if (*prot && !xn) {
112
+ *prot |= PAGE_EXEC;
113
+ }
114
+ /* We don't need to look the attribute up in the MAIR0/MAIR1
115
+ * registers because that only tells us about cacheability.
116
+ */
117
+ }
411
+ }
118
+
412
+
119
+ *fsr = 0x00d; /* Permission fault */
413
Scope (\_SB.PCI0)
120
+ return !(*prot & (1 << access_type));
414
{
121
+}
415
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
122
+
416
@@ -XXX,XX +XXX,XX @@
123
static bool get_phys_addr_pmsav5(CPUARMState *env, uint32_t address,
417
WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
124
MMUAccessType access_type, ARMMMUIdx mmu_idx,
418
0x0000, // Granularity
125
hwaddr *phys_ptr, int *prot, uint32_t *fsr)
419
0x0000, // Range Minimum
126
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr(CPUARMState *env, target_ulong address,
420
- 0x00FF, // Range Maximum
127
bool ret;
421
+ 0x000F, // Range Maximum
128
*page_size = TARGET_PAGE_SIZE;
422
0x0000, // Translation Offset
129
423
- 0x0100, // Length
130
- if (arm_feature(env, ARM_FEATURE_V7)) {
424
+ 0x0010, // Length
131
+ if (arm_feature(env, ARM_FEATURE_V8)) {
425
,, )
132
+ /* PMSAv8 */
426
IO (Decode16,
133
+ ret = get_phys_addr_pmsav8(env, address, access_type, mmu_idx,
427
0x0CF8, // Range Minimum
134
+ phys_ptr, prot, fsr);
428
@@ -XXX,XX +XXX,XX @@
135
+ } else if (arm_feature(env, ARM_FEATURE_V7)) {
429
}
136
/* PMSAv7 */
430
}
137
ret = get_phys_addr_pmsav7(env, address, access_type, mmu_idx,
431
138
phys_ptr, prot, fsr);
432
+ Device (S10)
433
+ {
434
+ Name (_ADR, 0x00020000) // _ADR: Address
435
+ }
436
+
437
+ Device (S18)
438
+ {
439
+ Name (_ADR, 0x00030000) // _ADR: Address
440
+ }
441
+
442
+ Device (S20)
443
+ {
444
+ Name (_ADR, 0x00040000) // _ADR: Address
445
+ }
446
+
447
+ Device (S28)
448
+ {
449
+ Name (_ADR, 0x00050000) // _ADR: Address
450
+ }
451
+
452
Method (PCNT, 0, NotSerialized)
453
{
454
}
455
456
Reviewed-by: Eric Auger <eric.auger@redhat.com>
457
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
458
Message-id: 20211210170415.583179-8-jean-philippe@linaro.org
459
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
460
---
461
tests/qtest/bios-tables-test-allowed-diff.h | 2 --
462
tests/data/acpi/q35/DSDT.viot | Bin 0 -> 9398 bytes
463
tests/data/acpi/q35/VIOT.viot | Bin 0 -> 112 bytes
464
3 files changed, 2 deletions(-)
465
466
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
467
index XXXXXXX..XXXXXXX 100644
468
--- a/tests/qtest/bios-tables-test-allowed-diff.h
469
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
470
@@ -XXX,XX +XXX,XX @@
471
/* List of comma-separated changed AML files to ignore */
472
"tests/data/acpi/virt/VIOT",
473
-"tests/data/acpi/q35/DSDT.viot",
474
-"tests/data/acpi/q35/VIOT.viot",
475
diff --git a/tests/data/acpi/q35/DSDT.viot b/tests/data/acpi/q35/DSDT.viot
476
index XXXXXXX..XXXXXXX 100644
477
GIT binary patch
478
literal 9398
479
zcmeHNO>7&-8J*>iv|O&FB}G~Oi$yp||57BBoWHhc5OS9yDTx$CQgH$r;8Idr*-4Q_
480
z5(9Az1F`}niVsB-)<KW7p`g9Br(A2Gm-gmc1N78GFS!;)e2V(MnH_0{q<{#yMgn&C
481
zn|*J-d9yqFhO_H6z19~`FlPL*u<DkZ*}|)JH;X@mF-FI<cPg<fti9tEN*yB^i5czN
482
zNq&q?!OZ;BE3B7{KWzJ-`Tn~f`9?Qj8~2^N8{Oc8J%57{==w%rS#;nOCp*nTr@iZ1
483
zb+?i;JLQUJ=O0?8*>S~D)a>NF1~WVB6^~_B#yhJ`H+JU@=6aXs`?Yv)J2h=N?drcS
484
zeLZ*n<<Bm^n}6`jfBx#u8&(W}1?)}iF9o#mZ~E2+zwdn7yK3AbIzKnxpZ>JRPm3~#
485
z&ICS{+_OayRW-l=Mtk=~uaS3o8z<_udd|(wqg`&JnVPfCe>BUOO`Su3e>pff_^UW%
486
z&JE^NO`)=Amg~iqRB1pPscP?(>#ZuY8GHCmlEvD$9g3%4Db~Dfz2SATnddvrR-Oe^
487
z;s;dJec!hnzi)ri^I6YN9vtkm{^TdUF8h7gX8-<Qe4p)GQ=)AtYx2VcwdLVAEXEjG
488
z^Mj|UHPqkj-LsWuzQem1>F3atdZn=zv3$#RmZzSHN+6-yyU#8cJb=YDilX&sl}vNm
489
znkgAR^O<3kj4if>{ly5fwRfMWuC5=lrlvKPX~i#654Cp}R_d*JS$9laZ$ra6)<ns8
490
zFZy28G%xP(nit&F>LDi%G<tIc=TY=gl$jSD&Uv!Yat~XR46h%rI$!}a%!|xG7u8Zn
491
zeY8_|n=K>xz_v_W8VX$W-Fg-qFWcT}7MCyz{%%{ia7hZ>Law-k6NOr}VI&_48U=2l
492
zwqDKFE8eTwwozDdms#e?x?5a|v>&JF;2_v0L~z5n%BYU^52<*cWuD4|GYUm@1+?))
493
zte^45>Rz)t*<T5V#={r>@t@{%?^i#W{i=HAZ*Dc9y59Va-+#P!jrGs;u38a{fLr`N
494
zvT@rUu>DljxJ?^&Z?-?vyJn3C>3D=qux{Y*bs5|5n)Qmi$TD^Zdn4GU$ocJS2Hh-<
495
z`xPI^^+v0nUVdjMos8k`WGl7hA`{03ju%<lrgAHSpd^DRf-*}_#Ly0mB!LSfVgWcQ
496
z&T$@~G9)JI=hz5m0vkrel+Xy{Oh7pkAu-V!j*W7rY(bO}Q$nMH2`FbGB&N)QaV4<4
497
zo)~9JXiP9=;}NPl<C@MmXG&;XFlFNrsyfFsonxFSp<}vEgsRSQP3O3#b6nSnP}ON_
498
zI!#Tdsp~|j>ckUB>FI=~GokB5sOq#dotCE4(sd$KbtW~PNlj-`*NIToiD#j5J#9^=
499
zt?NXn>YUJYPG~wObe#xQos*i*NloXZt`niEb4t@WrRki~bs|)CI+{*L)9L6s5vn><
500
zn$DD_Go|Z9sOn5>I@6lYw5}7Os&iV?Ij!lO)^#FOb!If38BJ$K*NIToIiu;E(R9w}
501
zIuWWmPiZ<&X*y5oIuWWmF_XaEC!a&Jn$B5WCqh-{X-(&8P3LJ{Cqh-{8P3dyPr@^t
502
zSqL9?X9Uwd3W@23*s~h*tj0X6GZCuHa~kuU#yqDp5vt7d8uPryJg+kms?5hU=3^T3
503
zF`bD}WnSP+=`t5MQ$FJ_2&Q~+BP6E0f^%BVIW6a$o)e+SX~IDBih-7z6{O~7YTy`&
504
zLjy&Cv?7QikV#>n0>>@MV8oK`Gmun34-FKdlm-J8SZSaNlnhir4-FI{S|bfqV8e)V
505
zss<{chX#reE#g=hsKAC%sF6d-Km}BWs!kZFsFpKfpbC@>6rprQGEjt4Ck#|zITHq|
506
zK*>M_l;<P^MJRQ`Kn0dFVW0|>3{*fllMEE0)CmI>Sk8ojDo`>|0p(0GP=xY&!axO<
507
zGhv_#lnhirIg<<&q0|Wj6<E%MfhtfkPyyvkGEjt4Ck#|zITHq|K*>M_lrzad5lWpf
508
zP=V!47^ngz0~JutBm+e#b;3XemNQ|X3X}{~Ksl2P6rt1!0~J`#gn=qhGEf2KOfpb}
509
zQYQ>lU^x>8szAv=1(Y+%KoLrvFi?TzOc<yFB?A>u&LjgxD0RX>1(q{mpbC@>R6seC
510
z3>2Z%2?G^a&V+#~P%=;f<xDbAgi<FARA4z12C6{GKn0XD$v_cGoiI>=<xCi;0wn_#
511
zP|hR+MJRQ`Kn0dFVW0|>3{*fllMEE0)CmI>Sk8ojDo`>|0p(0GP=rz^3{+q_69%e4
512
z$v_2^Gs!>^N}VuJf#pmXr~)Me6;RG314Srx!axxz28u{EP=u<1B2)}iVZuNaCK;&0
513
zBm-5LFi?dF167!0pbC==RAItE6($T+VUmF=Ofpb~2?JG_Fi?d_2C6X0Kouqo6p_5T
514
zFi=FeV!SiSKoR0H$dH(_Z(*Q_WZ%L-5y`$K14StNmJAdjmWs}HV4<vU_xO+1efmLq
515
zZ;W>N_U)fP6Qy6Nw5mbt9Y(#emWSi66=>tq#xoh#Ue=0qyhxi8ZOUe5y0V7VfPUhp
516
zwX=;ymc+i5%sg9Ja~lZ&8oAV@mHc>&CHP9v4R(jhtT?un;O4e9#pno)Xkh7OWgK&a
517
zyj=3Iv0OuoK_;5rOr5f(Kb~ZXDBO+V`OWYo#_C08imwChQxnjdd?wZLDou8aj;$SD
518
zGDYiA3<$Tu<JnHL(KPOChi#zrR32t83}naR$+ym4P_h?z_5#|cW-nw$XD_sOtE62l
519
zrD3@*)NVyiklt0&yF9%+klsBey&I<Y2E<!f(E8TuJte)z(|ZHyy<^gQVfx}=`q&B5
520
z7nSryp1wGczIaUfVwiq$Fn#<4=@*ssi#+|}K>EdF(l3VTOM~ghPLRH&q%ZOGrGfON
521
zW73zx^yR_y<0nX8R??Sw`tm^f@-gYlNFSp|*<gA{q?Zp5Oe-+l#rmyYmKozi9y=P>
522
zVReJU*h=ZuVXiS$ohTbw-O#v9>(yZbGE|)?8(H1ZIKvV!jWa0>vy!3eMA^vdhQ>`s
523
zuMSg{q3T50$m)j1!HixV<}X9liL#N^4c*tL^y)CF8LCc{jjV3yKAqL8!%SzWI#H%q
524
z=bSrQ&)%JCRttF5g4Zf`6l?y@>PzD7MA^D>wBlcH6r1ucwJ<p0O%rZ?JzIY3-QdmZ
525
zzs|n>`a5r3e|z)wcUaqS>nqFQ-8x}eCF4u`OWUxqst-@1rSmUs%WmKP5e0dcb?e2N
526
z;Z|x*!);VwF|Yuhqs^khqOM!@u*jY!WYldISF(V6`BoNd&6Qfk3>X#SuD^7J>p_D=
527
zBPa51y^_n#=cpOt#Zf$ya$Ae9Mfz56n|<i!a=ELS@)%a{^NIH3SDuN<R~sah1km#P
528
zU@?*f%<rG=4W1wgfi;C?_n|W@%lm$&8YfvNOJodIg&IcIpIJQRHr<+ej11GQ6)&eF
529
z2Lam*jIH}#y0>KnY%4JQfOYS$*uU%f#@$U6`N8I3N-lV?5ErFCdv~xDmu2(wexld4
530
z4v^;aVAT2k6GJ^m*FD(Wqc(Qg^)6a<?}h$zLoj}4;PP!+(O{@!a1y-hoAhF_7!z+6
531
zslpAmNtYbjHrw-~#SPVk_FUf>-Obg6yV`8o$8_`PyJe_;bY5_EMBfBfWU!Q=*9HsG
532
z%_Cda{@_Krr!oHVhv9+y+T5qR8zZ2aZ>5r!$*|f$^U%yBUYfR&B!+EYy_PwL!BeUi
533
zJH^}r3r9Q+B)X@Z)fk=P13w&7x#wBtXTZ)g>WITPg5r&pQc!nmyrmk#S(>>b9xnNr
534
zx_b#v9Xv-Y><Wb%?S^0Xe&<)bbKl_=Z|3C$tf|F<bYzE*mfHB;uC)`q-?buaBe?l?
535
zcLTpK*k<49Z32`K?|nSBMFqxTK^_IE-li2fEGdK~(ZdoKBl6ab4a;Hler#`xvEXJG
536
zb?<E%EZExfX>jcOVhS*0rS~RS1dA#xhkv@Nct@#q?LyeKS<$uFec!bw>{@uu$gZ6a
537
zyVen1i{1BKd%~`D7|m$;U0a<I*3I7%^N%N%lGYdU_GS!gaR8T$NA@GzFi~z`l7hdl
538
zarZy6590|88pi(1zq;V(>38zM0sT&<zX;R5$1w3;`_JMG`;&I&0Y23DMx1%@(w(R9
539
z4M$j;D5J+Gy%fijRQsctzFKf&cv|BAz#YLq3CZJWDdtL4u1u1|mkdcUp7|sxJC+?Y
540
z_@@s`v3j}Q7*z>6X~cwUxUL8G1KT)_XTp!KAbs;vCp{K3&~_X@+ew=-D}v`2MbFV0
541
zQsVsL=rXi-pI*G|iiz;VTCutgUs)hDzV1+4?8KcoP3xROf<M%qC6lgVdpFt4<-|uM
542
z=#rl_b1#YjSIl6Toj2z_hOZcKupkdE(LozC(fN=FY(x|sk)ym|;Rq2E1xJWD%Z!ol
543
Gu>S+TT-130
544
545
literal 0
546
HcmV?d00001
547
548
diff --git a/tests/data/acpi/q35/VIOT.viot b/tests/data/acpi/q35/VIOT.viot
549
index XXXXXXX..XXXXXXX 100644
550
GIT binary patch
551
literal 112
552
zcmWIZ^baXu00LVle`k+i1*eDrX9XZ&1PX!JAex!M0Hgv8m>C3sGzdcgBZCA3T-xBj
553
Q0Zb)W9Hva*zW_`e0M!8s0RR91
554
555
literal 0
556
HcmV?d00001
557
139
--
558
--
140
2.7.4
559
2.25.1
141
560
142
561
diff view generated by jsdifflib
1
If a v8M CPU supports the security extension then we need to
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
give it two AddressSpaces, the same way we do already for
3
an A profile core with EL3.
4
2
3
The VIOT blob contains the following:
4
5
[000h 0000 4] Signature : "VIOT" [Virtual I/O Translation Table]
6
[004h 0004 4] Table Length : 00000058
7
[008h 0008 1] Revision : 00
8
[009h 0009 1] Checksum : 66
9
[00Ah 0010 6] Oem ID : "BOCHS "
10
[010h 0016 8] Oem Table ID : "BXPC "
11
[018h 0024 4] Oem Revision : 00000001
12
[01Ch 0028 4] Asl Compiler ID : "BXPC"
13
[020h 0032 4] Asl Compiler Revision : 00000001
14
15
[024h 0036 2] Node count : 0002
16
[026h 0038 2] Node offset : 0030
17
[028h 0040 8] Reserved : 0000000000000000
18
19
[030h 0048 1] Type : 03 [VirtIO-PCI IOMMU]
20
[031h 0049 1] Reserved : 00
21
[032h 0050 2] Length : 0010
22
23
[034h 0052 2] PCI Segment : 0000
24
[036h 0054 2] PCI BDF number : 0008
25
[038h 0056 8] Reserved : 0000000000000000
26
27
[040h 0064 1] Type : 01 [PCI Range]
28
[041h 0065 1] Reserved : 00
29
[042h 0066 2] Length : 0018
30
31
[044h 0068 4] Endpoint start : 00000000
32
[048h 0072 2] PCI Segment start : 0000
33
[04Ah 0074 2] PCI Segment end : 0000
34
[04Ch 0076 2] PCI BDF start : 0000
35
[04Eh 0078 2] PCI BDF end : 00FF
36
[050h 0080 2] Output node : 0030
37
[052h 0082 6] Reserved : 000000000000
38
39
Acked-by: Ani Sinha <ani@anisinha.ca>
40
Reviewed-by: Eric Auger <eric.auger@redhat.com>
41
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
42
Message-id: 20211210170415.583179-9-jean-philippe@linaro.org
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 1503414539-28762-5-git-send-email-peter.maydell@linaro.org
8
---
44
---
9
target/arm/cpu.c | 13 ++++++-------
45
tests/qtest/bios-tables-test-allowed-diff.h | 1 -
10
1 file changed, 6 insertions(+), 7 deletions(-)
46
tests/data/acpi/virt/VIOT | Bin 0 -> 88 bytes
47
2 files changed, 1 deletion(-)
11
48
12
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
49
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
13
index XXXXXXX..XXXXXXX 100644
50
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/cpu.c
51
--- a/tests/qtest/bios-tables-test-allowed-diff.h
15
+++ b/target/arm/cpu.c
52
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
16
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
53
@@ -1,2 +1 @@
17
init_cpreg_list(cpu);
54
/* List of comma-separated changed AML files to ignore */
18
55
-"tests/data/acpi/virt/VIOT",
19
#ifndef CONFIG_USER_ONLY
56
diff --git a/tests/data/acpi/virt/VIOT b/tests/data/acpi/virt/VIOT
20
- if (cpu->has_el3) {
57
index XXXXXXX..XXXXXXX 100644
21
- cs->num_ases = 2;
58
GIT binary patch
22
- } else {
59
literal 88
23
- cs->num_ases = 1;
60
zcmWIZ^bd((0D?3pe`k+i1*eDrX9XZ&1PX!JAexE60Hgv8m>C3sGzXN&z`)2L0cSHX
24
- }
61
I{D-Rq0Q5fy0RR91
25
-
62
26
- if (cpu->has_el3) {
63
literal 0
27
+ if (cpu->has_el3 || arm_feature(env, ARM_FEATURE_M_SECURITY)) {
64
HcmV?d00001
28
AddressSpace *as;
65
29
30
+ cs->num_ases = 2;
31
+
32
if (!cpu->secure_memory) {
33
cpu->secure_memory = cs->memory;
34
}
35
as = address_space_init_shareable(cpu->secure_memory,
36
"cpu-secure-memory");
37
cpu_address_space_init(cs, as, ARMASIdx_S);
38
+ } else {
39
+ cs->num_ases = 1;
40
}
41
+
42
cpu_address_space_init(cs,
43
address_space_init_shareable(cs->memory,
44
"cpu-memory"),
45
--
66
--
46
2.7.4
67
2.25.1
47
68
48
69
diff view generated by jsdifflib