1
Nothing much exciting here, but it's 37 patches worth...
1
Hi; here's the first target-arm pullreq for the 7.0 cycle.
2
2
3
thanks
3
thanks
4
-- PMM
4
-- PMM
5
5
6
The following changes since commit e64a62df378a746c0b257105959613c9f8122e59:
6
The following changes since commit 76b56fdfc9fa43ec6e5986aee33f108c6c6a511e:
7
7
8
Merge remote-tracking branch 'remotes/stsquad/tags/pull-testing-040320-1' into staging (2020-03-05 12:13:51 +0000)
8
Merge tag 'block-pull-request' of https://gitlab.com/stefanha/qemu into staging (2021-12-14 12:46:18 -0800)
9
9
10
are available in the Git repository at:
10
are available in the Git repository at:
11
11
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200305
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20211215
13
13
14
for you to fetch changes up to 597d61a3b1f94c53a3aaa77671697c0c5f797dbf:
14
for you to fetch changes up to aed176558806674d030a8305d989d4e6a5073359:
15
15
16
target/arm: Clean address for DC ZVA (2020-03-05 16:09:21 +0000)
16
tests/acpi: add expected blob for VIOT test on virt machine (2021-12-15 10:35:26 +0000)
17
17
18
----------------------------------------------------------------
18
----------------------------------------------------------------
19
* versal: Implement ADMA
19
target-arm queue:
20
* Implement (trivially) ARMv8.2-TTCNP
20
* ITS: error reporting cleanup
21
* hw/arm/smmu-common: a fix to smmu_find_smmu_pcibus
21
* aspeed: improve documentation
22
* Remove unnecessary endianness-handling on some boards
22
* Fix STM32F2XX USART data register readout
23
* Avoid minor memory leaks from timer_new in some devices
23
* allow emulated GICv3 to be disabled in non-TCG builds
24
* Honour more of the HCR_EL2 trap bits
24
* fix exception priority for singlestep, misaligned PC, bp, etc
25
* Complain rather than ignoring bad command line options for cubieboard
25
* Correct calculation of tlb range invalidate length
26
* Honour TBI for DC ZVA and exception return
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
Edgar E. Iglesias (2):
32
Alex Bennée (1):
30
hw/arm: versal: Add support for the LPD ADMAs
33
hw/intc: clean-up error reporting for failed ITS cmd
31
hw/arm: versal: Generate xlnx-versal-virt zdma FDT nodes
32
34
33
Eric Auger (1):
35
Jean-Philippe Brucker (8):
34
hw/arm/smmu-common: a fix to smmu_find_smmu_pcibus
36
hw/arm/virt-acpi-build: Add VIOT table for virtio-iommu
37
hw/arm/virt: Remove device tree restriction for virtio-iommu
38
hw/arm/virt: Reject instantiation of multiple IOMMUs
39
hw/arm/virt: Use object_property_set instead of qdev_prop_set
40
tests/acpi: allow updates of VIOT expected data files
41
tests/acpi: add test case for VIOT
42
tests/acpi: add expected blobs for VIOT test on q35 machine
43
tests/acpi: add expected blob for VIOT test on virt machine
35
44
36
Niek Linnenbank (4):
45
Joel Stanley (4):
37
hw/arm/cubieboard: use ARM Cortex-A8 as the default CPU in machine definition
46
docs: aspeed: Add new boards
38
hw/arm/cubieboard: restrict allowed CPU type to ARM Cortex-A8
47
docs: aspeed: Update OpenBMC image URL
39
hw/arm/cubieboard: restrict allowed RAM size to 512MiB and 1GiB
48
docs: aspeed: Give an example of booting a kernel
40
hw/arm/cubieboard: report error when using unsupported -bios argument
49
docs: aspeed: ADC is now modelled
41
50
42
Pan Nengyuan (4):
51
Olivier Hériveaux (1):
43
hw/arm/pxa2xx: move timer_new from init() into realize() to avoid memleaks
52
Fix STM32F2XX USART data register readout
44
hw/arm/spitz: move timer_new from init() into realize() to avoid memleaks
45
hw/arm/strongarm: move timer_new from init() into realize() to avoid memleaks
46
hw/timer/cadence_ttc: move timer_new from init() into realize() to avoid memleaks
47
53
48
Peter Maydell (1):
54
Patrick Venture (1):
49
target/arm: Implement (trivially) ARMv8.2-TTCNP
55
hw/net: npcm7xx_emc fix missing queue_flush
50
56
51
Philippe Mathieu-Daudé (6):
57
Peter Maydell (6):
52
hw/arm/smmu-common: Simplify smmu_find_smmu_pcibus() logic
58
target/i386: Use assert() to sanity-check b1 in SSE decode
53
hw/arm/gumstix: Simplify since the machines are little-endian only
59
include/hw/i386: Don't include qemu-common.h in .h files
54
hw/arm/mainstone: Simplify since the machines are little-endian only
60
target/hexagon/cpu.h: don't include qemu-common.h
55
hw/arm/omap_sx1: Simplify since the machines are little-endian only
61
target/rx/cpu.h: Don't include qemu-common.h
56
hw/arm/z2: Simplify since the machines are little-endian only
62
hw/arm: Don't include qemu-common.h unnecessarily
57
hw/arm/musicpal: Simplify since the machines are little-endian only
63
target/arm: Correct calculation of tlb range invalidate length
58
64
59
Richard Henderson (19):
65
Philippe Mathieu-Daudé (2):
60
target/arm: Improve masking of HCR/HCR2 RES0 bits
66
hw/intc/arm_gicv3: Extract gicv3_set_gicv3state from arm_gicv3_cpuif.c
61
target/arm: Add HCR_EL2 bit definitions from ARMv8.6
67
hw/intc/arm_gicv3: Introduce CONFIG_ARM_GIC_TCG Kconfig selector
62
target/arm: Disable has_el2 and has_el3 for user-only
63
target/arm: Remove EL2 and EL3 setup from user-only
64
target/arm: Improve masking in arm_hcr_el2_eff
65
target/arm: Honor the HCR_EL2.{TVM,TRVM} bits
66
target/arm: Honor the HCR_EL2.TSW bit
67
target/arm: Honor the HCR_EL2.TACR bit
68
target/arm: Honor the HCR_EL2.TPCP bit
69
target/arm: Honor the HCR_EL2.TPU bit
70
target/arm: Honor the HCR_EL2.TTLB bit
71
tests/tcg/aarch64: Add newline in pauth-1 printf
72
target/arm: Replicate TBI/TBID bits for single range regimes
73
target/arm: Optimize cpu_mmu_index
74
target/arm: Introduce core_to_aa64_mmu_idx
75
target/arm: Apply TBI to ESR_ELx in helper_exception_return
76
target/arm: Move helper_dc_zva to helper-a64.c
77
target/arm: Use DEF_HELPER_FLAGS for helper_dc_zva
78
target/arm: Clean address for DC ZVA
79
68
80
include/hw/arm/xlnx-versal.h | 6 +
69
Richard Henderson (10):
81
target/arm/cpu.h | 30 ++--
70
target/arm: Hoist pc_next to a local variable in aarch64_tr_translate_insn
82
target/arm/helper-a64.h | 1 +
71
target/arm: Hoist pc_next to a local variable in arm_tr_translate_insn
83
target/arm/helper.h | 1 -
72
target/arm: Hoist pc_next to a local variable in thumb_tr_translate_insn
84
target/arm/internals.h | 6 +
73
target/arm: Split arm_pre_translate_insn
85
hw/arm/cubieboard.c | 29 +++-
74
target/arm: Advance pc for arch single-step exception
86
hw/arm/gumstix.c | 16 +-
75
target/arm: Split compute_fsr_fsc out of arm_deliver_fault
87
hw/arm/mainstone.c | 8 +-
76
target/arm: Take an exception if PC is misaligned
88
hw/arm/musicpal.c | 10 --
77
target/arm: Assert thumb pc is aligned
89
hw/arm/omap_sx1.c | 11 +-
78
target/arm: Suppress bp for exceptions with more priority
90
hw/arm/pxa2xx.c | 17 +-
79
tests/tcg: Add arm and aarch64 pc alignment tests
91
hw/arm/smmu-common.c | 20 +--
92
hw/arm/spitz.c | 8 +-
93
hw/arm/strongarm.c | 18 ++-
94
hw/arm/xlnx-versal-virt.c | 28 ++++
95
hw/arm/xlnx-versal.c | 24 +++
96
hw/arm/z2.c | 8 +-
97
hw/timer/cadence_ttc.c | 18 ++-
98
target/arm/cpu.c | 13 +-
99
target/arm/cpu64.c | 2 +
100
target/arm/helper-a64.c | 114 ++++++++++++-
101
target/arm/helper.c | 373 ++++++++++++++++++++++++++++++-------------
102
target/arm/op_helper.c | 93 -----------
103
target/arm/translate-a64.c | 4 +-
104
tests/tcg/aarch64/pauth-1.c | 2 +-
105
25 files changed, 551 insertions(+), 309 deletions(-)
106
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
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
As the Connex and Verdex machines only boot in little-endian,
3
While trying to debug a GIC ITS failure I saw some guest errors that
4
we can simplify the code.
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.
5
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>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
22
Message-id: 20211112170454.3158925-1-alex.bennee@linaro.org
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
23
Cc: Shashi Mallela <shashi.mallela@linaro.org>
24
Cc: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
26
---
11
hw/arm/gumstix.c | 16 ++--------------
27
hw/intc/arm_gicv3_its.c | 39 +++++++++++++++++++++++++++------------
12
1 file changed, 2 insertions(+), 14 deletions(-)
28
1 file changed, 27 insertions(+), 12 deletions(-)
13
29
14
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
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/hw/arm/gumstix.c
32
--- a/hw/intc/arm_gicv3_its.c
17
+++ b/hw/arm/gumstix.c
33
+++ b/hw/intc/arm_gicv3_its.c
18
@@ -XXX,XX +XXX,XX @@ static void connex_init(MachineState *machine)
34
@@ -XXX,XX +XXX,XX @@ static bool process_its_cmd(GICv3ITSState *s, uint64_t value, uint32_t offset,
19
{
35
if (res != MEMTX_OK) {
20
PXA2xxState *cpu;
36
return result;
21
DriveInfo *dinfo;
37
}
22
- int be;
38
+ } else {
23
MemoryRegion *address_space_mem = get_system_memory();
39
+ qemu_log_mask(LOG_GUEST_ERROR,
24
40
+ "%s: invalid command attributes: "
25
uint32_t connex_rom = 0x01000000;
41
+ "invalid dte: %"PRIx64" for %d (MEM_TX: %d)\n",
26
@@ -XXX,XX +XXX,XX @@ static void connex_init(MachineState *machine)
42
+ __func__, dte, devid, res);
27
exit(1);
43
+ return result;
28
}
44
}
29
45
30
-#ifdef TARGET_WORDS_BIGENDIAN
46
- if ((devid > s->dt.maxids.max_devids) || !dte_valid || !ite_valid ||
31
- be = 1;
47
- !cte_valid || (eventid > max_eventid)) {
32
-#else
48
+
33
- be = 0;
49
+ /*
34
-#endif
50
+ * In this implementation, in case of guest errors we ignore the
35
if (!pflash_cfi01_register(0x00000000, "connext.rom", connex_rom,
51
+ * command and move onto the next command in the queue.
36
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
52
+ */
37
- sector_len, 2, 0, 0, 0, 0, be)) {
53
+ if (devid > s->dt.maxids.max_devids) {
38
+ sector_len, 2, 0, 0, 0, 0, 0)) {
54
qemu_log_mask(LOG_GUEST_ERROR,
39
error_report("Error registering flash memory");
55
- "%s: invalid command attributes "
40
exit(1);
56
- "devid %d or eventid %d or invalid dte %d or"
41
}
57
- "invalid cte %d or invalid ite %d\n",
42
@@ -XXX,XX +XXX,XX @@ static void verdex_init(MachineState *machine)
58
- __func__, devid, eventid, dte_valid, cte_valid,
43
{
59
- ite_valid);
44
PXA2xxState *cpu;
60
- /*
45
DriveInfo *dinfo;
61
- * in this implementation, in case of error
46
- int be;
62
- * we ignore this command and move onto the next
47
MemoryRegion *address_space_mem = get_system_memory();
63
- * command in the queue
48
64
- */
49
uint32_t verdex_rom = 0x02000000;
65
+ "%s: invalid command attributes: devid %d>%d",
50
@@ -XXX,XX +XXX,XX @@ static void verdex_init(MachineState *machine)
66
+ __func__, devid, s->dt.maxids.max_devids);
51
exit(1);
67
+
52
}
68
+ } else if (!dte_valid || !ite_valid || !cte_valid) {
53
69
+ qemu_log_mask(LOG_GUEST_ERROR,
54
-#ifdef TARGET_WORDS_BIGENDIAN
70
+ "%s: invalid command attributes: "
55
- be = 1;
71
+ "dte: %s, ite: %s, cte: %s\n",
56
-#else
72
+ __func__,
57
- be = 0;
73
+ dte_valid ? "valid" : "invalid",
58
-#endif
74
+ ite_valid ? "valid" : "invalid",
59
if (!pflash_cfi01_register(0x00000000, "verdex.rom", verdex_rom,
75
+ cte_valid ? "valid" : "invalid");
60
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
76
+ } else if (eventid > max_eventid) {
61
- sector_len, 2, 0, 0, 0, 0, be)) {
77
+ qemu_log_mask(LOG_GUEST_ERROR,
62
+ sector_len, 2, 0, 0, 0, 0, 0)) {
78
+ "%s: invalid command attributes: eventid %d > %d\n",
63
error_report("Error registering flash memory");
79
+ __func__, eventid, max_eventid);
64
exit(1);
80
} else {
65
}
81
/*
82
* Current implementation only supports rdbase == procnum
66
--
83
--
67
2.20.1
84
2.25.1
68
85
69
86
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
We missed this case within AArch64.ExceptionReturn.
3
Add X11, FP5280G2, G220A, Rainier and Fuji. Mention that Swift will be
4
removed in v7.0.
4
5
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Joel Stanley <joel@jms.id.au>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Message-id: 20200302175829.2183-5-richard.henderson@linaro.org
8
Message-id: 20211117065752.330632-2-joel@jms.id.au
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
---
10
target/arm/helper-a64.c | 23 ++++++++++++++++++++++-
11
docs/system/arm/aspeed.rst | 7 ++++++-
11
1 file changed, 22 insertions(+), 1 deletion(-)
12
1 file changed, 6 insertions(+), 1 deletion(-)
12
13
13
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper-a64.c
16
--- a/docs/system/arm/aspeed.rst
16
+++ b/target/arm/helper-a64.c
17
+++ b/docs/system/arm/aspeed.rst
17
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
18
@@ -XXX,XX +XXX,XX @@ AST2400 SoC based machines :
18
"AArch32 EL%d PC 0x%" PRIx32 "\n",
19
19
cur_el, new_el, env->regs[15]);
20
- ``palmetto-bmc`` OpenPOWER Palmetto POWER8 BMC
20
} else {
21
- ``quanta-q71l-bmc`` OpenBMC Quanta BMC
21
+ int tbii;
22
+- ``supermicrox11-bmc`` Supermicro X11 BMC
22
+
23
23
env->aarch64 = 1;
24
AST2500 SoC based machines :
24
spsr &= aarch64_pstate_valid_mask(&env_archcpu(env)->isar);
25
25
pstate_write(env, spsr);
26
@@ -XXX,XX +XXX,XX @@ AST2500 SoC based machines :
26
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
27
- ``romulus-bmc`` OpenPOWER Romulus POWER9 BMC
27
env->pstate &= ~PSTATE_SS;
28
- ``witherspoon-bmc`` OpenPOWER Witherspoon POWER9 BMC
28
}
29
- ``sonorapass-bmc`` OCP SonoraPass BMC
29
aarch64_restore_sp(env, new_el);
30
-- ``swift-bmc`` OpenPOWER Swift BMC POWER9
30
- env->pc = new_pc;
31
+- ``swift-bmc`` OpenPOWER Swift BMC POWER9 (to be removed in v7.0)
31
helper_rebuild_hflags_a64(env, new_el);
32
+- ``fp5280g2-bmc`` Inspur FP5280G2 BMC
32
+
33
+- ``g220a-bmc`` Bytedance G220A BMC
33
+ /*
34
34
+ * Apply TBI to the exception return address. We had to delay this
35
AST2600 SoC based machines :
35
+ * until after we selected the new EL, so that we could select the
36
36
+ * correct TBI+TBID bits. This is made easier by waiting until after
37
- ``ast2600-evb`` Aspeed AST2600 Evaluation board (Cortex-A7)
37
+ * the hflags rebuild, since we can pull the composite TBII field
38
- ``tacoma-bmc`` OpenPOWER Witherspoon POWER9 AST2600 BMC
38
+ * from there.
39
+- ``rainier-bmc`` IBM Rainier POWER10 BMC
39
+ */
40
+- ``fuji-bmc`` Facebook Fuji BMC
40
+ tbii = FIELD_EX32(env->hflags, TBFLAG_A64, TBII);
41
41
+ if ((tbii >> extract64(new_pc, 55, 1)) & 1) {
42
Supported devices
42
+ /* TBI is enabled. */
43
-----------------
43
+ int core_mmu_idx = cpu_mmu_index(env, false);
44
+ if (regime_has_2_ranges(core_to_aa64_mmu_idx(core_mmu_idx))) {
45
+ new_pc = sextract64(new_pc, 0, 56);
46
+ } else {
47
+ new_pc = extract64(new_pc, 0, 56);
48
+ }
49
+ }
50
+ env->pc = new_pc;
51
+
52
qemu_log_mask(CPU_LOG_INT, "Exception return from AArch64 EL%d to "
53
"AArch64 EL%d PC 0x%" PRIx64 "\n",
54
cur_el, new_el, env->pc);
55
--
44
--
56
2.20.1
45
2.25.1
57
46
58
47
diff view generated by jsdifflib
1
From: Niek Linnenbank <nieklinnenbank@gmail.com>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
The Cubieboard machine does not support the -bios argument.
3
This is the latest URL for the OpenBMC CI. The old URL still works, but
4
Report an error when -bios is used and exit immediately.
4
redirects.
5
5
6
Signed-off-by: Niek Linnenbank <nieklinnenbank@gmail.com>
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Message-id: 20200227220149.6845-5-nieklinnenbank@gmail.com
7
Signed-off-by: Joel Stanley <joel@jms.id.au>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Message-id: 20211117065752.330632-3-joel@jms.id.au
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
hw/arm/cubieboard.c | 7 +++++++
11
docs/system/arm/aspeed.rst | 2 +-
13
1 file changed, 7 insertions(+)
12
1 file changed, 1 insertion(+), 1 deletion(-)
14
13
15
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/cubieboard.c
16
--- a/docs/system/arm/aspeed.rst
18
+++ b/hw/arm/cubieboard.c
17
+++ b/docs/system/arm/aspeed.rst
19
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ The Aspeed machines can be started using the ``-kernel`` option to
20
#include "exec/address-spaces.h"
19
load a Linux kernel or from a firmware. Images can be downloaded from
21
#include "qapi/error.h"
20
the OpenBMC jenkins :
22
#include "cpu.h"
21
23
+#include "sysemu/sysemu.h"
22
- https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/distro=ubuntu,label=docker-builder
24
#include "hw/sysbus.h"
23
+ https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/
25
#include "hw/boards.h"
24
26
#include "hw/arm/allwinner-a10.h"
25
or directly from the OpenBMC GitHub release repository :
27
@@ -XXX,XX +XXX,XX @@ static void cubieboard_init(MachineState *machine)
26
28
AwA10State *a10;
29
Error *err = NULL;
30
31
+ /* BIOS is not supported by this board */
32
+ if (bios_name) {
33
+ error_report("BIOS not supported for this machine");
34
+ exit(1);
35
+ }
36
+
37
/* This board has fixed size RAM (512MiB or 1GiB) */
38
if (machine->ram_size != 512 * MiB &&
39
machine->ram_size != 1 * GiB) {
40
--
27
--
41
2.20.1
28
2.25.1
42
29
43
30
diff view generated by jsdifflib
1
From: Niek Linnenbank <nieklinnenbank@gmail.com>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
The Cubieboard contains either 512MiB or 1GiB of onboard RAM [1].
3
A common use case for the ASPEED machine is to boot a Linux kernel.
4
Prevent changing RAM to a different size which could break user programs.
4
Provide a full example command line.
5
5
6
[1] http://linux-sunxi.org/Cubieboard
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
7
Signed-off-by: Joel Stanley <joel@jms.id.au>
8
Signed-off-by: Niek Linnenbank <nieklinnenbank@gmail.com>
8
Message-id: 20211117065752.330632-4-joel@jms.id.au
9
Message-id: 20200227220149.6845-4-nieklinnenbank@gmail.com
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
10
---
14
hw/arm/cubieboard.c | 8 ++++++++
11
docs/system/arm/aspeed.rst | 15 ++++++++++++---
15
1 file changed, 8 insertions(+)
12
1 file changed, 12 insertions(+), 3 deletions(-)
16
13
17
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/cubieboard.c
16
--- a/docs/system/arm/aspeed.rst
20
+++ b/hw/arm/cubieboard.c
17
+++ b/docs/system/arm/aspeed.rst
21
@@ -XXX,XX +XXX,XX @@ static void cubieboard_init(MachineState *machine)
18
@@ -XXX,XX +XXX,XX @@ Missing devices
22
AwA10State *a10;
19
Boot options
23
Error *err = NULL;
20
------------
24
21
25
+ /* This board has fixed size RAM (512MiB or 1GiB) */
22
-The Aspeed machines can be started using the ``-kernel`` option to
26
+ if (machine->ram_size != 512 * MiB &&
23
-load a Linux kernel or from a firmware. Images can be downloaded from
27
+ machine->ram_size != 1 * GiB) {
24
-the OpenBMC jenkins :
28
+ error_report("This machine can only be used with 512MiB or 1GiB RAM");
25
+The Aspeed machines can be started using the ``-kernel`` and ``-dtb`` options
29
+ exit(1);
26
+to load a Linux kernel or from a firmware. Images can be downloaded from the
30
+ }
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:
31
+
36
+
32
/* Only allow Cortex-A8 for this board */
37
+.. code-block:: bash
33
if (strcmp(machine->cpu_type, ARM_CPU_TYPE_NAME("cortex-a8")) != 0) {
38
+
34
error_report("This board can only be used with cortex-a8 CPU");
39
+ $ qemu-system-arm -M ast2600-evb -nographic \
35
@@ -XXX,XX +XXX,XX @@ static void cubieboard_machine_init(MachineClass *mc)
40
+ -kernel arch/arm/boot/zImage \
36
{
41
+ -dtb arch/arm/boot/dts/aspeed-ast2600-evb.dtb \
37
mc->desc = "cubietech cubieboard (Cortex-A8)";
42
+ -initrd rootfs.cpio
38
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a8");
43
+
39
+ mc->default_ram_size = 1 * GiB;
44
The image should be attached as an MTD drive. Run :
40
mc->init = cubieboard_init;
45
41
mc->block_default_type = IF_IDE;
46
.. code-block:: bash
42
mc->units_per_default_bus = 1;
43
--
47
--
44
2.20.1
48
2.25.1
45
49
46
50
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
The function does not write registers, and only reads them by
3
Move it to the supported list.
4
implication via the exception path.
5
4
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Joel Stanley <joel@jms.id.au>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20211117065752.330632-5-joel@jms.id.au
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20200302175829.2183-7-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
8
---
12
target/arm/helper-a64.h | 2 +-
9
docs/system/arm/aspeed.rst | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
10
1 file changed, 1 insertion(+), 1 deletion(-)
14
11
15
diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h
12
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
16
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper-a64.h
14
--- a/docs/system/arm/aspeed.rst
18
+++ b/target/arm/helper-a64.h
15
+++ b/docs/system/arm/aspeed.rst
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_2(advsimd_f16touinth, i32, f16, ptr)
16
@@ -XXX,XX +XXX,XX @@ Supported devices
20
DEF_HELPER_2(sqrt_f16, f16, f16, ptr)
17
* Front LEDs (PCA9552 on I2C bus)
21
18
* LPC Peripheral Controller (a subset of subdevices are supported)
22
DEF_HELPER_2(exception_return, void, env, i64)
19
* Hash/Crypto Engine (HACE) - Hash support only. TODO: HMAC and RSA
23
-DEF_HELPER_2(dc_zva, void, env, i64)
20
+ * ADC
24
+DEF_HELPER_FLAGS_2(dc_zva, TCG_CALL_NO_WG, void, env, i64)
21
25
22
26
DEF_HELPER_FLAGS_3(pacia, TCG_CALL_NO_WG, i64, env, i64, i64)
23
Missing devices
27
DEF_HELPER_FLAGS_3(pacib, TCG_CALL_NO_WG, i64, env, i64, i64)
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
28
--
31
--
29
2.20.1
32
2.25.1
30
33
31
34
diff view generated by jsdifflib
1
From: Niek Linnenbank <nieklinnenbank@gmail.com>
1
From: Olivier Hériveaux <olivier.heriveaux@ledger.fr>
2
2
3
The Cubieboard has an ARM Cortex-A8. Instead of simply ignoring a
3
Fix issue where the data register may be overwritten by next character
4
bogus -cpu option provided by the user, give them an error message so
4
reception before being read and returned.
5
they know their command line is wrong.
6
5
7
Signed-off-by: Niek Linnenbank <nieklinnenbank@gmail.com>
6
Signed-off-by: Olivier Hériveaux <olivier.heriveaux@ledger.fr>
8
Message-id: 20200227220149.6845-3-nieklinnenbank@gmail.com
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
[PMM: tweaked commit message]
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20211128120723.4053-1-olivier.heriveaux@ledger.fr
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
11
---
14
hw/arm/cubieboard.c | 10 +++++++++-
12
hw/char/stm32f2xx_usart.c | 3 ++-
15
1 file changed, 9 insertions(+), 1 deletion(-)
13
1 file changed, 2 insertions(+), 1 deletion(-)
16
14
17
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
15
diff --git a/hw/char/stm32f2xx_usart.c b/hw/char/stm32f2xx_usart.c
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/cubieboard.c
17
--- a/hw/char/stm32f2xx_usart.c
20
+++ b/hw/arm/cubieboard.c
18
+++ b/hw/char/stm32f2xx_usart.c
21
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info cubieboard_binfo = {
19
@@ -XXX,XX +XXX,XX @@ static uint64_t stm32f2xx_usart_read(void *opaque, hwaddr addr,
22
20
return retvalue;
23
static void cubieboard_init(MachineState *machine)
21
case USART_DR:
24
{
22
DB_PRINT("Value: 0x%" PRIx32 ", %c\n", s->usart_dr, (char) s->usart_dr);
25
- AwA10State *a10 = AW_A10(object_new(TYPE_AW_A10));
23
+ retvalue = s->usart_dr & 0x3FF;
26
+ AwA10State *a10;
24
s->usart_sr &= ~USART_SR_RXNE;
27
Error *err = NULL;
25
qemu_chr_fe_accept_input(&s->chr);
28
26
qemu_set_irq(s->irq, 0);
29
+ /* Only allow Cortex-A8 for this board */
27
- return s->usart_dr & 0x3FF;
30
+ if (strcmp(machine->cpu_type, ARM_CPU_TYPE_NAME("cortex-a8")) != 0) {
28
+ return retvalue;
31
+ error_report("This board can only be used with cortex-a8 CPU");
29
case USART_BRR:
32
+ exit(1);
30
return s->usart_brr;
33
+ }
31
case USART_CR1:
34
+
35
+ a10 = AW_A10(object_new(TYPE_AW_A10));
36
+
37
object_property_set_int(OBJECT(&a10->emac), 1, "phy-addr", &err);
38
if (err != NULL) {
39
error_reportf_err(err, "Couldn't set phy address: ");
40
--
32
--
41
2.20.1
33
2.25.1
42
34
43
35
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
We only build the little-endian softmmu configurations. Checking
3
gicv3_set_gicv3state() is used by arm_gicv3_common.c in
4
for big endian is pointless, remove the unused code.
4
arm_gicv3_common_realize(). Since we want to restrict
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".
5
8
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20211115223619.2599282-2-philmd@redhat.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
13
---
10
hw/arm/z2.c | 8 +-------
14
hw/intc/arm_gicv3_cpuif.c | 10 +---------
11
1 file changed, 1 insertion(+), 7 deletions(-)
15
hw/intc/arm_gicv3_cpuif_common.c | 22 ++++++++++++++++++++++
16
hw/intc/meson.build | 1 +
17
3 files changed, 24 insertions(+), 9 deletions(-)
18
create mode 100644 hw/intc/arm_gicv3_cpuif_common.c
12
19
13
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
20
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
14
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/z2.c
22
--- a/hw/intc/arm_gicv3_cpuif.c
16
+++ b/hw/arm/z2.c
23
+++ b/hw/intc/arm_gicv3_cpuif.c
17
@@ -XXX,XX +XXX,XX @@ static void z2_init(MachineState *machine)
24
@@ -XXX,XX +XXX,XX @@
18
uint32_t sector_len = 0x10000;
25
/*
19
PXA2xxState *mpu;
26
- * ARM Generic Interrupt Controller v3
20
DriveInfo *dinfo;
27
+ * ARM Generic Interrupt Controller v3 (emulation)
21
- int be;
28
*
22
void *z2_lcd;
29
* Copyright (c) 2016 Linaro Limited
23
I2CBus *bus;
30
* Written by Peter Maydell
24
DeviceState *wm;
31
@@ -XXX,XX +XXX,XX @@
25
@@ -XXX,XX +XXX,XX @@ static void z2_init(MachineState *machine)
32
#include "hw/irq.h"
26
/* Setup CPU & memory */
33
#include "cpu.h"
27
mpu = pxa270_init(address_space_mem, z2_binfo.ram_size, machine->cpu_type);
34
28
35
-void gicv3_set_gicv3state(CPUState *cpu, GICv3CPUState *s)
29
-#ifdef TARGET_WORDS_BIGENDIAN
36
-{
30
- be = 1;
37
- ARMCPU *arm_cpu = ARM_CPU(cpu);
31
-#else
38
- CPUARMState *env = &arm_cpu->env;
32
- be = 0;
39
-
33
-#endif
40
- env->gicv3state = (void *)s;
34
dinfo = drive_get(IF_PFLASH, 0, 0);
41
-};
35
if (!pflash_cfi01_register(Z2_FLASH_BASE, "z2.flash0", Z2_FLASH_SIZE,
42
-
36
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
43
static GICv3CPUState *icc_cs_from_env(CPUARMState *env)
37
- sector_len, 4, 0, 0, 0, 0, be)) {
44
{
38
+ sector_len, 4, 0, 0, 0, 0, 0)) {
45
return env->gicv3state;
39
error_report("Error registering flash memory");
46
diff --git a/hw/intc/arm_gicv3_cpuif_common.c b/hw/intc/arm_gicv3_cpuif_common.c
40
exit(1);
47
new file mode 100644
41
}
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
+ */
62
+
63
+#include "qemu/osdep.h"
64
+#include "gicv3_internal.h"
65
+#include "cpu.h"
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
75
index XXXXXXX..XXXXXXX 100644
76
--- a/hw/intc/meson.build
77
+++ b/hw/intc/meson.build
78
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_PMU', if_true: files('xlnx-pmu-iomod-in
79
80
specific_ss.add(when: 'CONFIG_ALLWINNER_A10_PIC', if_true: files('allwinner-a10-pic.c'))
81
specific_ss.add(when: 'CONFIG_APIC', if_true: files('apic.c', 'apic_common.c'))
82
+specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif_common.c'))
83
specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif.c'))
84
specific_ss.add(when: 'CONFIG_ARM_GIC_KVM', if_true: files('arm_gic_kvm.c'))
85
specific_ss.add(when: ['CONFIG_ARM_GIC_KVM', 'TARGET_AARCH64'], if_true: files('arm_gicv3_kvm.c', 'arm_gicv3_its_kvm.c'))
42
--
86
--
43
2.20.1
87
2.25.1
44
88
45
89
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
We only build the little-endian softmmu configurations. Checking
3
The TYPE_ARM_GICV3 device is an emulated one. When using
4
for big endian is pointless, remove the unused code.
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.
5
15
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
16
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Message-id: 20211115223619.2599282-3-philmd@redhat.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
20
---
10
hw/arm/omap_sx1.c | 11 ++---------
21
hw/intc/arm_gicv3.c | 2 +-
11
1 file changed, 2 insertions(+), 9 deletions(-)
22
hw/intc/Kconfig | 5 +++++
23
hw/intc/meson.build | 10 ++++++----
24
3 files changed, 12 insertions(+), 5 deletions(-)
12
25
13
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
26
diff --git a/hw/intc/arm_gicv3.c b/hw/intc/arm_gicv3.c
14
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/omap_sx1.c
28
--- a/hw/intc/arm_gicv3.c
16
+++ b/hw/arm/omap_sx1.c
29
+++ b/hw/intc/arm_gicv3.c
17
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
30
@@ -XXX,XX +XXX,XX @@
18
DriveInfo *dinfo;
31
/*
19
int fl_idx;
32
- * ARM Generic Interrupt Controller v3
20
uint32_t flash_size = flash0_size;
33
+ * ARM Generic Interrupt Controller v3 (emulation)
21
- int be;
34
*
22
35
* Copyright (c) 2015 Huawei.
23
if (machine->ram_size != mc->default_ram_size) {
36
* Copyright (c) 2016 Linaro Limited
24
char *sz = size_to_str(mc->default_ram_size);
37
diff --git a/hw/intc/Kconfig b/hw/intc/Kconfig
25
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
38
index XXXXXXX..XXXXXXX 100644
26
OMAP_CS2_BASE, &cs[3]);
39
--- a/hw/intc/Kconfig
27
40
+++ b/hw/intc/Kconfig
28
fl_idx = 0;
41
@@ -XXX,XX +XXX,XX @@ config APIC
29
-#ifdef TARGET_WORDS_BIGENDIAN
42
select MSI_NONBROKEN
30
- be = 1;
43
select I8259
31
-#else
44
32
- be = 0;
45
+config ARM_GIC_TCG
33
-#endif
46
+ bool
34
-
47
+ default y
35
if ((dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
48
+ depends on ARM_GIC && TCG
36
if (!pflash_cfi01_register(OMAP_CS0_BASE,
49
+
37
"omap_sx1.flash0-1", flash_size,
50
config ARM_GIC_KVM
38
blk_by_legacy_dinfo(dinfo),
51
bool
39
- sector_size, 4, 0, 0, 0, 0, be)) {
52
default y
40
+ sector_size, 4, 0, 0, 0, 0, 0)) {
53
diff --git a/hw/intc/meson.build b/hw/intc/meson.build
41
fprintf(stderr, "qemu: Error registering flash memory %d.\n",
54
index XXXXXXX..XXXXXXX 100644
42
fl_idx);
55
--- a/hw/intc/meson.build
43
}
56
+++ b/hw/intc/meson.build
44
@@ -XXX,XX +XXX,XX @@ static void sx1_init(MachineState *machine, const int version)
57
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_ARM_GIC', if_true: files(
45
if (!pflash_cfi01_register(OMAP_CS1_BASE,
58
'arm_gic.c',
46
"omap_sx1.flash1-1", flash1_size,
59
'arm_gic_common.c',
47
blk_by_legacy_dinfo(dinfo),
60
'arm_gicv2m.c',
48
- sector_size, 4, 0, 0, 0, 0, be)) {
61
- 'arm_gicv3.c',
49
+ sector_size, 4, 0, 0, 0, 0, 0)) {
62
'arm_gicv3_common.c',
50
fprintf(stderr, "qemu: Error registering flash memory %d.\n",
63
- 'arm_gicv3_dist.c',
51
fl_idx);
64
'arm_gicv3_its_common.c',
52
}
65
- 'arm_gicv3_redist.c',
66
+))
67
+softmmu_ss.add(when: 'CONFIG_ARM_GIC_TCG', if_true: files(
68
+ 'arm_gicv3.c',
69
+ 'arm_gicv3_dist.c',
70
'arm_gicv3_its.c',
71
+ 'arm_gicv3_redist.c',
72
))
73
softmmu_ss.add(when: 'CONFIG_ETRAXFS', if_true: files('etraxfs_pic.c'))
74
softmmu_ss.add(when: 'CONFIG_HEATHROW_PIC', if_true: files('heathrow_pic.c'))
75
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_PMU', if_true: files('xlnx-pmu-iomod-in
76
specific_ss.add(when: 'CONFIG_ALLWINNER_A10_PIC', if_true: files('allwinner-a10-pic.c'))
77
specific_ss.add(when: 'CONFIG_APIC', if_true: files('apic.c', 'apic_common.c'))
78
specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif_common.c'))
79
-specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif.c'))
80
+specific_ss.add(when: 'CONFIG_ARM_GIC_TCG', if_true: files('arm_gicv3_cpuif.c'))
81
specific_ss.add(when: 'CONFIG_ARM_GIC_KVM', if_true: files('arm_gic_kvm.c'))
82
specific_ss.add(when: ['CONFIG_ARM_GIC_KVM', 'TARGET_AARCH64'], if_true: files('arm_gicv3_kvm.c', 'arm_gicv3_its_kvm.c'))
83
specific_ss.add(when: 'CONFIG_ARM_V7M', if_true: files('armv7m_nvic.c'))
53
--
84
--
54
2.20.1
85
2.25.1
55
86
56
87
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This data access was forgotten when we added support for cleaning
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
addresses of TBI information.
5
6
Fixes: 3a471103ac1823ba
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200302175829.2183-8-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
6
---
12
target/arm/translate-a64.c | 2 +-
7
target/arm/translate-a64.c | 7 ++++---
13
1 file changed, 1 insertion(+), 1 deletion(-)
8
1 file changed, 4 insertions(+), 3 deletions(-)
14
9
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
10
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
12
--- a/target/arm/translate-a64.c
18
+++ b/target/arm/translate-a64.c
13
+++ b/target/arm/translate-a64.c
19
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
14
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
15
{
16
DisasContext *s = container_of(dcbase, DisasContext, base);
17
CPUARMState *env = cpu->env_ptr;
18
+ uint64_t pc = s->base.pc_next;
19
uint32_t insn;
20
21
if (s->ss_active && !s->pstate_ss) {
22
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
20
return;
23
return;
21
case ARM_CP_DC_ZVA:
24
}
22
/* Writes clear the aligned block of memory which rt points into. */
25
23
- tcg_rt = cpu_reg(s, rt);
26
- s->pc_curr = s->base.pc_next;
24
+ tcg_rt = clean_data_tbi(s, cpu_reg(s, rt));
27
- insn = arm_ldl_code(env, &s->base, s->base.pc_next, s->sctlr_b);
25
gen_helper_dc_zva(cpu_env, tcg_rt);
28
+ s->pc_curr = pc;
26
return;
29
+ insn = arm_ldl_code(env, &s->base, pc, s->sctlr_b);
27
default:
30
s->insn = insn;
31
- s->base.pc_next += 4;
32
+ s->base.pc_next = pc + 4;
33
34
s->fp_access_checked = false;
35
s->sve_access_checked = false;
28
--
36
--
29
2.20.1
37
2.25.1
30
38
31
39
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Make the output just a bit prettier when running by hand.
4
5
Cc: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20200229012811.24129-13-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
6
---
11
tests/tcg/aarch64/pauth-1.c | 2 +-
7
target/arm/translate.c | 9 +++++----
12
1 file changed, 1 insertion(+), 1 deletion(-)
8
1 file changed, 5 insertions(+), 4 deletions(-)
13
9
14
diff --git a/tests/tcg/aarch64/pauth-1.c b/tests/tcg/aarch64/pauth-1.c
10
diff --git a/target/arm/translate.c b/target/arm/translate.c
15
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
16
--- a/tests/tcg/aarch64/pauth-1.c
12
--- a/target/arm/translate.c
17
+++ b/tests/tcg/aarch64/pauth-1.c
13
+++ b/target/arm/translate.c
18
@@ -XXX,XX +XXX,XX @@ int main()
14
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
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;
19
}
25
}
20
26
21
perc = (float) count / (float) (TESTS * 2);
27
- dc->pc_curr = dc->base.pc_next;
22
- printf("Ptr Check: %0.2f%%", perc * 100.0);
28
- insn = arm_ldl_code(env, &dc->base, dc->base.pc_next, dc->sctlr_b);
23
+ printf("Ptr Check: %0.2f%%\n", perc * 100.0);
29
+ dc->pc_curr = pc;
24
assert(perc > 0.95);
30
+ insn = arm_ldl_code(env, &dc->base, pc, dc->sctlr_b);
25
return 0;
31
dc->insn = insn;
26
}
32
- dc->base.pc_next += 4;
33
+ dc->base.pc_next = pc + 4;
34
disas_arm_insn(dc, insn);
35
36
arm_post_translate_insn(dc);
27
--
37
--
28
2.20.1
38
2.25.1
29
39
30
40
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20200229012811.24129-3-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
6
---
8
target/arm/cpu.h | 7 +++++++
7
target/arm/translate.c | 16 ++++++++--------
9
1 file changed, 7 insertions(+)
8
1 file changed, 8 insertions(+), 8 deletions(-)
10
9
11
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
10
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/cpu.h
12
--- a/target/arm/translate.c
14
+++ b/target/arm/cpu.h
13
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
14
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
16
#define HCR_TERR (1ULL << 36)
15
{
17
#define HCR_TEA (1ULL << 37)
16
DisasContext *dc = container_of(dcbase, DisasContext, base);
18
#define HCR_MIOCNCE (1ULL << 38)
17
CPUARMState *env = cpu->env_ptr;
19
+/* RES0 bit 39 */
18
+ uint32_t pc = dc->base.pc_next;
20
#define HCR_APK (1ULL << 40)
19
uint32_t insn;
21
#define HCR_API (1ULL << 41)
20
bool is_16bit;
22
#define HCR_NV (1ULL << 42)
21
23
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
22
if (arm_pre_translate_insn(dc)) {
24
#define HCR_NV2 (1ULL << 45)
23
- dc->base.pc_next += 2;
25
#define HCR_FWB (1ULL << 46)
24
+ dc->base.pc_next = pc + 2;
26
#define HCR_FIEN (1ULL << 47)
25
return;
27
+/* RES0 bit 48 */
26
}
28
#define HCR_TID4 (1ULL << 49)
27
29
#define HCR_TICAB (1ULL << 50)
28
- dc->pc_curr = dc->base.pc_next;
30
+#define HCR_AMVOFFEN (1ULL << 51)
29
- insn = arm_lduw_code(env, &dc->base, dc->base.pc_next, dc->sctlr_b);
31
#define HCR_TOCU (1ULL << 52)
30
+ dc->pc_curr = pc;
32
+#define HCR_ENSCXT (1ULL << 53)
31
+ insn = arm_lduw_code(env, &dc->base, pc, dc->sctlr_b);
33
#define HCR_TTLBIS (1ULL << 54)
32
is_16bit = thumb_insn_is_16bit(dc, dc->base.pc_next, insn);
34
#define HCR_TTLBOS (1ULL << 55)
33
- dc->base.pc_next += 2;
35
#define HCR_ATA (1ULL << 56)
34
+ pc += 2;
36
#define HCR_DCT (1ULL << 57)
35
if (!is_16bit) {
37
+#define HCR_TID5 (1ULL << 58)
36
- uint32_t insn2 = arm_lduw_code(env, &dc->base, dc->base.pc_next,
38
+#define HCR_TWEDEN (1ULL << 59)
37
- dc->sctlr_b);
39
+#define HCR_TWEDEL MAKE_64BIT_MASK(60, 4)
38
-
40
39
+ uint32_t insn2 = arm_lduw_code(env, &dc->base, pc, dc->sctlr_b);
41
#define SCR_NS (1U << 0)
40
insn = insn << 16 | insn2;
42
#define SCR_IRQ (1U << 1)
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) {
43
--
48
--
44
2.20.1
49
2.25.1
45
50
46
51
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
We now cache the core mmu_idx in env->hflags. Rather than recompute
3
Create arm_check_ss_active and arm_check_kernelpage.
4
from scratch, extract the field. All of the uses of cpu_mmu_index
4
5
within target/arm are within helpers, and env->hflags is always stable
5
Reverse the order of the tests. While it doesn't matter in practice,
6
within a translation block from whence helpers are called.
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.
7
9
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Message-id: 20200302175829.2183-3-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
---
13
---
13
target/arm/cpu.h | 23 +++++++++++++----------
14
target/arm/translate.c | 10 +++++++---
14
target/arm/helper.c | 5 -----
15
1 file changed, 7 insertions(+), 3 deletions(-)
15
2 files changed, 13 insertions(+), 15 deletions(-)
16
16
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
diff --git a/target/arm/translate.c b/target/arm/translate.c
18
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
19
--- a/target/arm/translate.c
20
+++ b/target/arm/cpu.h
20
+++ b/target/arm/translate.c
21
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdxBit {
21
@@ -XXX,XX +XXX,XX @@ static void arm_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
22
22
dc->insn_start = tcg_last_op();
23
#define MMU_USER_IDX 0
23
}
24
24
25
-/**
25
-static bool arm_pre_translate_insn(DisasContext *dc)
26
- * cpu_mmu_index:
26
+static bool arm_check_kernelpage(DisasContext *dc)
27
- * @env: The cpu environment
28
- * @ifetch: True for code access, false for data access.
29
- *
30
- * Return the core mmu index for the current translation regime.
31
- * This function is used by generic TCG code paths.
32
- */
33
-int cpu_mmu_index(CPUARMState *env, bool ifetch);
34
-
35
/* Indexes used when registering address spaces with cpu_address_space_init */
36
typedef enum ARMASIdx {
37
ARMASIdx_NS = 0,
38
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAG_A64, BTYPE, 10, 2) /* Not cached. */
39
FIELD(TBFLAG_A64, TBID, 12, 2)
40
FIELD(TBFLAG_A64, UNPRIV, 14, 1)
41
42
+/**
43
+ * cpu_mmu_index:
44
+ * @env: The cpu environment
45
+ * @ifetch: True for code access, false for data access.
46
+ *
47
+ * Return the core mmu index for the current translation regime.
48
+ * This function is used by generic TCG code paths.
49
+ */
50
+static inline int cpu_mmu_index(CPUARMState *env, bool ifetch)
51
+{
52
+ return FIELD_EX32(env->hflags, TBFLAG_ANY, MMUIDX);
53
+}
54
+
55
static inline bool bswap_code(bool sctlr_b)
56
{
27
{
57
#ifdef CONFIG_USER_ONLY
28
#ifdef CONFIG_USER_ONLY
58
diff --git a/target/arm/helper.c b/target/arm/helper.c
29
/* Intercept jump to the magic kernel page. */
59
index XXXXXXX..XXXXXXX 100644
30
@@ -XXX,XX +XXX,XX @@ static bool arm_pre_translate_insn(DisasContext *dc)
60
--- a/target/arm/helper.c
31
return true;
61
+++ b/target/arm/helper.c
32
}
62
@@ -XXX,XX +XXX,XX @@ ARMMMUIdx arm_mmu_idx(CPUARMState *env)
33
#endif
63
return arm_mmu_idx_el(env, arm_current_el(env));
34
+ return false;
64
}
35
+}
65
36
66
-int cpu_mmu_index(CPUARMState *env, bool ifetch)
37
+static bool arm_check_ss_active(DisasContext *dc)
67
-{
38
+{
68
- return arm_to_core_mmu_idx(arm_mmu_idx(env));
39
if (dc->ss_active && !dc->pstate_ss) {
69
-}
40
/* Singlestep state is Active-pending.
70
-
41
* If we're in this state at the start of a TB then either
71
#ifndef CONFIG_USER_ONLY
42
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
72
ARMMMUIdx arm_stage1_mmu_idx(CPUARMState *env)
43
uint32_t pc = dc->base.pc_next;
73
{
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
}
74
--
60
--
75
2.20.1
61
2.25.1
76
62
77
63
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
In arm_cpu_reset, we configure many system registers so that user-only
3
The size of the code covered by a TranslationBlock cannot be 0;
4
behaves as it should with a minimum of ifdefs. However, we do not set
4
this is checked via assert in tb_gen_code.
5
all of the system registers as required for a cpu with EL2 and EL3.
6
7
Disabling EL2 and EL3 mean that we will not look at those registers,
8
which means that we don't have to worry about configuring them.
9
5
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20200229012811.24129-4-richard.henderson@linaro.org
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
9
---
15
target/arm/cpu.c | 6 ++++--
10
target/arm/translate-a64.c | 1 +
16
1 file changed, 4 insertions(+), 2 deletions(-)
11
1 file changed, 1 insertion(+)
17
12
18
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
19
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.c
15
--- a/target/arm/translate-a64.c
21
+++ b/target/arm/cpu.c
16
+++ b/target/arm/translate-a64.c
22
@@ -XXX,XX +XXX,XX @@ static Property arm_cpu_reset_hivecs_property =
17
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
23
static Property arm_cpu_rvbar_property =
18
assert(s->base.num_insns == 1);
24
DEFINE_PROP_UINT64("rvbar", ARMCPU, rvbar, 0);
19
gen_swstep_exception(s, 0, 0);
25
20
s->base.is_jmp = DISAS_NORETURN;
26
+#ifndef CONFIG_USER_ONLY
21
+ s->base.pc_next = pc + 4;
27
static Property arm_cpu_has_el2_property =
22
return;
28
DEFINE_PROP_BOOL("has_el2", ARMCPU, has_el2, true);
29
30
static Property arm_cpu_has_el3_property =
31
DEFINE_PROP_BOOL("has_el3", ARMCPU, has_el3, true);
32
+#endif
33
34
static Property arm_cpu_cfgend_property =
35
DEFINE_PROP_BOOL("cfgend", ARMCPU, cfgend, false);
36
@@ -XXX,XX +XXX,XX @@ void arm_cpu_post_init(Object *obj)
37
qdev_property_add_static(DEVICE(obj), &arm_cpu_rvbar_property);
38
}
23
}
39
24
40
+#ifndef CONFIG_USER_ONLY
41
if (arm_feature(&cpu->env, ARM_FEATURE_EL3)) {
42
/* Add the has_el3 state CPU property only if EL3 is allowed. This will
43
* prevent "has_el3" from existing on CPUs which cannot support EL3.
44
*/
45
qdev_property_add_static(DEVICE(obj), &arm_cpu_has_el3_property);
46
47
-#ifndef CONFIG_USER_ONLY
48
object_property_add_link(obj, "secure-memory",
49
TYPE_MEMORY_REGION,
50
(Object **)&cpu->secure_memory,
51
qdev_prop_allow_set_link_before_realize,
52
OBJ_PROP_LINK_STRONG,
53
&error_abort);
54
-#endif
55
}
56
57
if (arm_feature(&cpu->env, ARM_FEATURE_EL2)) {
58
qdev_property_add_static(DEVICE(obj), &arm_cpu_has_el2_property);
59
}
60
+#endif
61
62
if (arm_feature(&cpu->env, ARM_FEATURE_PMU)) {
63
cpu->has_pmu = true;
64
--
25
--
65
2.20.1
26
2.25.1
66
27
67
28
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This bit traps EL1 access to tlb maintenance insns.
3
We will reuse this section of arm_deliver_fault for
4
raising pc alignment faults.
4
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: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20200229012811.24129-12-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
9
---
10
target/arm/helper.c | 85 +++++++++++++++++++++++++++++----------------
10
target/arm/tlb_helper.c | 45 +++++++++++++++++++++++++----------------
11
1 file changed, 55 insertions(+), 30 deletions(-)
11
1 file changed, 28 insertions(+), 17 deletions(-)
12
12
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
13
diff --git a/target/arm/tlb_helper.c b/target/arm/tlb_helper.c
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
15
--- a/target/arm/tlb_helper.c
16
+++ b/target/arm/helper.c
16
+++ b/target/arm/tlb_helper.c
17
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tacr(CPUARMState *env, const ARMCPRegInfo *ri,
17
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
18
return CP_ACCESS_OK;
18
return syn;
19
}
19
}
20
20
21
+/* Check for traps from EL1 due to HCR_EL2.TTLB. */
21
-static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
22
+static CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
22
- MMUAccessType access_type,
23
+ bool isread)
23
- int mmu_idx, ARMMMUFaultInfo *fi)
24
+{
24
+static uint32_t compute_fsr_fsc(CPUARMState *env, ARMMMUFaultInfo *fi,
25
+ if (arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_TTLB)) {
25
+ int target_el, int mmu_idx, uint32_t *ret_fsc)
26
+ return CP_ACCESS_TRAP_EL2;
26
{
27
+ }
27
- CPUARMState *env = &cpu->env;
28
+ return CP_ACCESS_OK;
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);
32
-
33
- target_el = exception_target_el(env);
34
- if (fi->stage2) {
35
- target_el = 2;
36
- env->cp15.hpfar_el2 = extract64(fi->s2addr, 12, 47) << 4;
37
- if (arm_is_secure_below_el3(env) && fi->s1ns) {
38
- env->cp15.hpfar_el2 |= HPFAR_NS;
39
- }
40
- }
41
- same_el = (arm_current_el(env) == target_el);
42
+ uint32_t fsr, fsc;
43
44
if (target_el == 2 || arm_el_is_aa64(env, target_el) ||
45
arm_s1_regime_using_lpae_format(env, arm_mmu_idx)) {
46
@@ -XXX,XX +XXX,XX @@ static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
47
fsc = 0x3f;
48
}
49
50
+ *ret_fsc = fsc;
51
+ return fsr;
29
+}
52
+}
30
+
53
+
31
static void dacr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
54
+static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
32
{
55
+ MMUAccessType access_type,
33
ARMCPU *cpu = env_archcpu(env);
56
+ int mmu_idx, ARMMMUFaultInfo *fi)
34
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
57
+{
35
.type = ARM_CP_NO_RAW, .access = PL1_R, .readfn = isr_read },
58
+ CPUARMState *env = &cpu->env;
36
/* 32 bit ITLB invalidates */
59
+ int target_el;
37
{ .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0,
60
+ bool same_el;
38
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbiall_write },
61
+ uint32_t syn, exc, fsr, fsc;
39
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
62
+
40
+ .writefn = tlbiall_write },
63
+ target_el = exception_target_el(env);
41
{ .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
64
+ if (fi->stage2) {
42
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbimva_write },
65
+ target_el = 2;
43
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
66
+ env->cp15.hpfar_el2 = extract64(fi->s2addr, 12, 47) << 4;
44
+ .writefn = tlbimva_write },
67
+ if (arm_is_secure_below_el3(env) && fi->s1ns) {
45
{ .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2,
68
+ env->cp15.hpfar_el2 |= HPFAR_NS;
46
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbiasid_write },
69
+ }
47
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
70
+ }
48
+ .writefn = tlbiasid_write },
71
+ same_el = (arm_current_el(env) == target_el);
49
/* 32 bit DTLB invalidates */
72
+
50
{ .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0,
73
+ fsr = compute_fsr_fsc(env, fi, target_el, mmu_idx, &fsc);
51
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbiall_write },
74
+
52
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
75
if (access_type == MMU_INST_FETCH) {
53
+ .writefn = tlbiall_write },
76
syn = syn_insn_abort(same_el, fi->ea, fi->s1ptw, fsc);
54
{ .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
77
exc = EXCP_PREFETCH_ABORT;
55
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbimva_write },
56
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
57
+ .writefn = tlbimva_write },
58
{ .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2,
59
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbiasid_write },
60
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
61
+ .writefn = tlbiasid_write },
62
/* 32 bit TLB invalidates */
63
{ .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
64
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbiall_write },
65
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
66
+ .writefn = tlbiall_write },
67
{ .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
68
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbimva_write },
69
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
70
+ .writefn = tlbimva_write },
71
{ .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
72
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbiasid_write },
73
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
74
+ .writefn = tlbiasid_write },
75
{ .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
76
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbimvaa_write },
77
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
78
+ .writefn = tlbimvaa_write },
79
REGINFO_SENTINEL
80
};
81
82
static const ARMCPRegInfo v7mp_cp_reginfo[] = {
83
/* 32 bit TLB invalidates, Inner Shareable */
84
{ .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
85
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbiall_is_write },
86
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
87
+ .writefn = tlbiall_is_write },
88
{ .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
89
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbimva_is_write },
90
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
91
+ .writefn = tlbimva_is_write },
92
{ .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
93
- .type = ARM_CP_NO_RAW, .access = PL1_W,
94
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
95
.writefn = tlbiasid_is_write },
96
{ .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
97
- .type = ARM_CP_NO_RAW, .access = PL1_W,
98
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
99
.writefn = tlbimvaa_is_write },
100
REGINFO_SENTINEL
101
};
102
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
103
/* TLBI operations */
104
{ .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64,
105
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
106
- .access = PL1_W, .type = ARM_CP_NO_RAW,
107
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
108
.writefn = tlbi_aa64_vmalle1is_write },
109
{ .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64,
110
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
111
- .access = PL1_W, .type = ARM_CP_NO_RAW,
112
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
113
.writefn = tlbi_aa64_vae1is_write },
114
{ .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64,
115
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
116
- .access = PL1_W, .type = ARM_CP_NO_RAW,
117
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
118
.writefn = tlbi_aa64_vmalle1is_write },
119
{ .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64,
120
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
121
- .access = PL1_W, .type = ARM_CP_NO_RAW,
122
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
123
.writefn = tlbi_aa64_vae1is_write },
124
{ .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64,
125
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
126
- .access = PL1_W, .type = ARM_CP_NO_RAW,
127
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
128
.writefn = tlbi_aa64_vae1is_write },
129
{ .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64,
130
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
131
- .access = PL1_W, .type = ARM_CP_NO_RAW,
132
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
133
.writefn = tlbi_aa64_vae1is_write },
134
{ .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64,
135
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
136
- .access = PL1_W, .type = ARM_CP_NO_RAW,
137
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
138
.writefn = tlbi_aa64_vmalle1_write },
139
{ .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64,
140
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
141
- .access = PL1_W, .type = ARM_CP_NO_RAW,
142
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
143
.writefn = tlbi_aa64_vae1_write },
144
{ .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64,
145
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
146
- .access = PL1_W, .type = ARM_CP_NO_RAW,
147
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
148
.writefn = tlbi_aa64_vmalle1_write },
149
{ .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64,
150
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
151
- .access = PL1_W, .type = ARM_CP_NO_RAW,
152
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
153
.writefn = tlbi_aa64_vae1_write },
154
{ .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64,
155
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
156
- .access = PL1_W, .type = ARM_CP_NO_RAW,
157
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
158
.writefn = tlbi_aa64_vae1_write },
159
{ .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64,
160
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
161
- .access = PL1_W, .type = ARM_CP_NO_RAW,
162
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
163
.writefn = tlbi_aa64_vae1_write },
164
{ .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
165
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
166
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
167
#endif
168
/* TLB invalidate last level of translation table walk */
169
{ .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
170
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbimva_is_write },
171
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
172
+ .writefn = tlbimva_is_write },
173
{ .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
174
- .type = ARM_CP_NO_RAW, .access = PL1_W,
175
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
176
.writefn = tlbimvaa_is_write },
177
{ .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
178
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbimva_write },
179
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
180
+ .writefn = tlbimva_write },
181
{ .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
182
- .type = ARM_CP_NO_RAW, .access = PL1_W, .writefn = tlbimvaa_write },
183
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
184
+ .writefn = tlbimvaa_write },
185
{ .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
186
.type = ARM_CP_NO_RAW, .access = PL2_W,
187
.writefn = tlbimva_hyp_write },
188
--
78
--
189
2.20.1
79
2.25.1
190
80
191
81
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
If by context we know that we're in AArch64 mode, we need not
3
For A64, any input to an indirect branch can cause this.
4
test for M-profile when reconstructing the full ARMMMUIdx.
4
5
For A32, many indirect branch paths force the branch to be aligned,
6
but BXWritePC does not. This includes the BX instruction but also
7
other interworking changes to PC. Prior to v8, this case is UNDEFINED.
8
With v8, this is CONSTRAINED UNPREDICTABLE and may either raise an
9
exception or force align the PC.
10
11
We choose to raise an exception because we have the infrastructure,
12
it makes the generated code for gen_bx simpler, and it has the
13
possibility of catching more guest bugs.
5
14
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
15
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20200302175829.2183-4-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
18
---
12
target/arm/internals.h | 6 ++++++
19
target/arm/helper.h | 1 +
13
target/arm/translate-a64.c | 2 +-
20
target/arm/syndrome.h | 5 ++++
14
2 files changed, 7 insertions(+), 1 deletion(-)
21
linux-user/aarch64/cpu_loop.c | 46 ++++++++++++++++++++---------------
15
22
target/arm/tlb_helper.c | 18 ++++++++++++++
16
diff --git a/target/arm/internals.h b/target/arm/internals.h
23
target/arm/translate-a64.c | 15 ++++++++++++
17
index XXXXXXX..XXXXXXX 100644
24
target/arm/translate.c | 22 ++++++++++++++++-
18
--- a/target/arm/internals.h
25
6 files changed, 87 insertions(+), 20 deletions(-)
19
+++ b/target/arm/internals.h
26
20
@@ -XXX,XX +XXX,XX @@ static inline ARMMMUIdx core_to_arm_mmu_idx(CPUARMState *env, int mmu_idx)
27
diff --git a/target/arm/helper.h b/target/arm/helper.h
21
}
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/helper.h
30
+++ b/target/arm/helper.h
31
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RWG_SE,
32
DEF_HELPER_2(exception_internal, void, env, i32)
33
DEF_HELPER_4(exception_with_syndrome, void, env, i32, i32, i32)
34
DEF_HELPER_2(exception_bkpt_insn, void, env, i32)
35
+DEF_HELPER_2(exception_pc_alignment, noreturn, env, tl)
36
DEF_HELPER_1(setend, void, env)
37
DEF_HELPER_2(wfi, void, env, i32)
38
DEF_HELPER_1(wfe, void, env)
39
diff --git a/target/arm/syndrome.h b/target/arm/syndrome.h
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/syndrome.h
42
+++ b/target/arm/syndrome.h
43
@@ -XXX,XX +XXX,XX @@ static inline uint32_t syn_illegalstate(void)
44
return (EC_ILLEGALSTATE << ARM_EL_EC_SHIFT) | ARM_EL_IL;
22
}
45
}
23
46
24
+static inline ARMMMUIdx core_to_aa64_mmu_idx(int mmu_idx)
47
+static inline uint32_t syn_pcalignment(void)
25
+{
48
+{
26
+ /* AArch64 is always a-profile. */
49
+ return (EC_PCALIGNMENT << ARM_EL_EC_SHIFT) | ARM_EL_IL;
27
+ return mmu_idx | ARM_MMU_IDX_A;
28
+}
50
+}
29
+
51
+
30
int arm_mmu_idx_to_el(ARMMMUIdx mmu_idx);
52
#endif /* TARGET_ARM_SYNDROME_H */
53
diff --git a/linux-user/aarch64/cpu_loop.c b/linux-user/aarch64/cpu_loop.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/linux-user/aarch64/cpu_loop.c
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);
126
}
127
128
+void helper_exception_pc_alignment(CPUARMState *env, target_ulong pc)
129
+{
130
+ ARMMMUFaultInfo fi = { .type = ARMFault_Alignment };
131
+ int target_el = exception_target_el(env);
132
+ int mmu_idx = cpu_mmu_index(env, true);
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.
140
+ */
141
+ env->exception.fsr = compute_fsr_fsc(env, &fi, target_el, mmu_idx, &fsc);
142
+ raise_exception(env, EXCP_PREFETCH_ABORT, syn_pcalignment(), target_el);
143
+}
144
+
145
#if !defined(CONFIG_USER_ONLY)
31
146
32
/*
147
/*
33
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
148
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
34
index XXXXXXX..XXXXXXX 100644
149
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/translate-a64.c
150
--- a/target/arm/translate-a64.c
36
+++ b/target/arm/translate-a64.c
151
+++ b/target/arm/translate-a64.c
37
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_init_disas_context(DisasContextBase *dcbase,
152
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
38
dc->condexec_mask = 0;
153
uint64_t pc = s->base.pc_next;
39
dc->condexec_cond = 0;
154
uint32_t insn;
40
core_mmu_idx = FIELD_EX32(tb_flags, TBFLAG_ANY, MMUIDX);
155
41
- dc->mmu_idx = core_to_arm_mmu_idx(env, core_mmu_idx);
156
+ /* Singlestep exceptions have the highest priority. */
42
+ dc->mmu_idx = core_to_aa64_mmu_idx(core_mmu_idx);
157
if (s->ss_active && !s->pstate_ss) {
43
dc->tbii = FIELD_EX32(tb_flags, TBFLAG_A64, TBII);
158
/* Singlestep state is Active-pending.
44
dc->tbid = FIELD_EX32(tb_flags, TBFLAG_A64, TBID);
159
* If we're in this state at the start of a TB then either
45
dc->current_el = arm_mmu_idx_to_el(dc->mmu_idx);
160
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
161
return;
162
}
163
164
+ if (pc & 3) {
165
+ /*
166
+ * PC alignment fault. This has priority over the instruction abort
167
+ * that we would receive from a translation fault via arm_ldl_code.
168
+ * This should only be possible after an indirect branch, at the
169
+ * start of the TB.
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);
175
+ return;
176
+ }
177
+
178
s->pc_curr = pc;
179
insn = arm_ldl_code(env, &s->base, pc, s->sctlr_b);
180
s->insn = insn;
181
diff --git a/target/arm/translate.c b/target/arm/translate.c
182
index XXXXXXX..XXXXXXX 100644
183
--- a/target/arm/translate.c
184
+++ b/target/arm/translate.c
185
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
186
uint32_t pc = dc->base.pc_next;
187
unsigned int insn;
188
189
- if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
190
+ /* Singlestep exceptions have the highest priority. */
191
+ if (arm_check_ss_active(dc)) {
192
+ dc->base.pc_next = pc + 4;
193
+ return;
194
+ }
195
+
196
+ if (pc & 3) {
197
+ /*
198
+ * PC alignment fault. This has priority over the instruction abort
199
+ * that we would receive from a translation fault via arm_ldl_code
200
+ * (or the execution of the kernelpage entrypoint). This should only
201
+ * be possible after an indirect branch, at the start of the TB.
202
+ */
203
+ assert(dc->base.num_insns == 1);
204
+ gen_helper_exception_pc_alignment(cpu_env, tcg_constant_tl(pc));
205
+ dc->base.is_jmp = DISAS_NORETURN;
206
+ dc->base.pc_next = QEMU_ALIGN_UP(pc, 4);
207
+ return;
208
+ }
209
+
210
+ if (arm_check_kernelpage(dc)) {
211
dc->base.pc_next = pc + 4;
212
return;
213
}
46
--
214
--
47
2.20.1
215
2.25.1
48
216
49
217
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This bit traps EL1 access to cache maintenance insns that operate
3
Misaligned thumb PC is architecturally impossible.
4
to the point of unification. There are no longer any references to
4
Assert is better than proceeding, in case we've missed
5
plain aa64_cacheop_access, so remove it.
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.
6
9
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200229012811.24129-11-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
13
---
12
target/arm/helper.c | 53 +++++++++++++++++++++++++++------------------
14
target/arm/gdbstub.c | 9 +++++++--
13
1 file changed, 32 insertions(+), 21 deletions(-)
15
target/arm/machine.c | 10 ++++++++++
16
target/arm/translate.c | 3 +++
17
3 files changed, 20 insertions(+), 2 deletions(-)
14
18
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
19
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
16
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.c
21
--- a/target/arm/gdbstub.c
18
+++ b/target/arm/helper.c
22
+++ b/target/arm/gdbstub.c
19
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo uao_reginfo = {
23
@@ -XXX,XX +XXX,XX @@ int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
20
.readfn = aa64_uao_read, .writefn = aa64_uao_write
24
21
};
25
tmp = ldl_p(mem_buf);
22
26
23
-static CPAccessResult aa64_cacheop_access(CPUARMState *env,
27
- /* Mask out low bit of PC to workaround gdb bugs. This will probably
24
- const ARMCPRegInfo *ri,
28
- cause problems if we ever implement the Jazelle DBX extensions. */
25
- bool isread)
29
+ /*
26
-{
30
+ * Mask out low bits of PC to workaround gdb bugs.
27
- /* Cache invalidate/clean: NOP, but EL0 must UNDEF unless
31
+ * This avoids an assert in thumb_tr_translate_insn, because it is
28
- * SCTLR_EL1.UCI is set.
32
+ * architecturally impossible to misalign the pc.
29
- */
33
+ * This will probably cause problems if we ever implement the
30
- if (arm_current_el(env) == 0 && !(arm_sctlr(env, 0) & SCTLR_UCI)) {
34
+ * Jazelle DBX extensions.
31
- return CP_ACCESS_TRAP;
35
+ */
32
- }
36
if (n == 15) {
33
- return CP_ACCESS_OK;
37
tmp &= ~1;
34
-}
38
}
35
-
39
diff --git a/target/arm/machine.c b/target/arm/machine.c
36
static CPAccessResult aa64_cacheop_poc_access(CPUARMState *env,
40
index XXXXXXX..XXXXXXX 100644
37
const ARMCPRegInfo *ri,
41
--- a/target/arm/machine.c
38
bool isread)
42
+++ b/target/arm/machine.c
39
@@ -XXX,XX +XXX,XX @@ static CPAccessResult aa64_cacheop_poc_access(CPUARMState *env,
43
@@ -XXX,XX +XXX,XX @@ static int cpu_post_load(void *opaque, int version_id)
40
return CP_ACCESS_OK;
44
return -1;
41
}
45
}
42
46
}
43
+static CPAccessResult aa64_cacheop_pou_access(CPUARMState *env,
47
+
44
+ const ARMCPRegInfo *ri,
48
+ /*
45
+ bool isread)
49
+ * Misaligned thumb pc is architecturally impossible.
46
+{
50
+ * We have an assert in thumb_tr_translate_insn to verify this.
47
+ /* Cache invalidate/clean to Point of Unification... */
51
+ * Fail an incoming migrate to avoid this assert.
48
+ switch (arm_current_el(env)) {
52
+ */
49
+ case 0:
53
+ if (!is_a64(env) && env->thumb && (env->regs[15] & 1)) {
50
+ /* ... EL0 must UNDEF unless SCTLR_EL1.UCI is set. */
54
+ return -1;
51
+ if (!(arm_sctlr(env, 0) & SCTLR_UCI)) {
52
+ return CP_ACCESS_TRAP;
53
+ }
54
+ /* fall through */
55
+ case 1:
56
+ /* ... EL1 must trap to EL2 if HCR_EL2.TPU is set. */
57
+ if (arm_hcr_el2_eff(env) & HCR_TPU) {
58
+ return CP_ACCESS_TRAP_EL2;
59
+ }
60
+ break;
61
+ }
55
+ }
62
+ return CP_ACCESS_OK;
63
+}
64
+
56
+
65
/* See: D4.7.2 TLB maintenance requirements and the TLB maintenance instructions
57
if (!kvm_enabled()) {
66
* Page D4-1736 (DDI0487A.b)
58
pmu_op_finish(&cpu->env);
67
*/
59
}
68
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
60
diff --git a/target/arm/translate.c b/target/arm/translate.c
69
/* Cache ops: all NOPs since we don't emulate caches */
61
index XXXXXXX..XXXXXXX 100644
70
{ .name = "IC_IALLUIS", .state = ARM_CP_STATE_AA64,
62
--- a/target/arm/translate.c
71
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 1, .opc2 = 0,
63
+++ b/target/arm/translate.c
72
- .access = PL1_W, .type = ARM_CP_NOP },
64
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
73
+ .access = PL1_W, .type = ARM_CP_NOP,
65
uint32_t insn;
74
+ .accessfn = aa64_cacheop_pou_access },
66
bool is_16bit;
75
{ .name = "IC_IALLU", .state = ARM_CP_STATE_AA64,
67
76
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 5, .opc2 = 0,
68
+ /* Misaligned thumb PC is architecturally impossible. */
77
- .access = PL1_W, .type = ARM_CP_NOP },
69
+ assert((dc->base.pc_next & 1) == 0);
78
+ .access = PL1_W, .type = ARM_CP_NOP,
70
+
79
+ .accessfn = aa64_cacheop_pou_access },
71
if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
80
{ .name = "IC_IVAU", .state = ARM_CP_STATE_AA64,
72
dc->base.pc_next = pc + 2;
81
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 5, .opc2 = 1,
73
return;
82
.access = PL0_W, .type = ARM_CP_NOP,
83
- .accessfn = aa64_cacheop_access },
84
+ .accessfn = aa64_cacheop_pou_access },
85
{ .name = "DC_IVAC", .state = ARM_CP_STATE_AA64,
86
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 1,
87
.access = PL1_W, .accessfn = aa64_cacheop_poc_access,
88
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
89
{ .name = "DC_CVAU", .state = ARM_CP_STATE_AA64,
90
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 11, .opc2 = 1,
91
.access = PL0_W, .type = ARM_CP_NOP,
92
- .accessfn = aa64_cacheop_access },
93
+ .accessfn = aa64_cacheop_pou_access },
94
{ .name = "DC_CIVAC", .state = ARM_CP_STATE_AA64,
95
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 14, .opc2 = 1,
96
.access = PL0_W, .type = ARM_CP_NOP,
97
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
98
.writefn = tlbiipas2_is_write },
99
/* 32 bit cache operations */
100
{ .name = "ICIALLUIS", .cp = 15, .opc1 = 0, .crn = 7, .crm = 1, .opc2 = 0,
101
- .type = ARM_CP_NOP, .access = PL1_W },
102
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_pou_access },
103
{ .name = "BPIALLUIS", .cp = 15, .opc1 = 0, .crn = 7, .crm = 1, .opc2 = 6,
104
.type = ARM_CP_NOP, .access = PL1_W },
105
{ .name = "ICIALLU", .cp = 15, .opc1 = 0, .crn = 7, .crm = 5, .opc2 = 0,
106
- .type = ARM_CP_NOP, .access = PL1_W },
107
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_pou_access },
108
{ .name = "ICIMVAU", .cp = 15, .opc1 = 0, .crn = 7, .crm = 5, .opc2 = 1,
109
- .type = ARM_CP_NOP, .access = PL1_W },
110
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_pou_access },
111
{ .name = "BPIALL", .cp = 15, .opc1 = 0, .crn = 7, .crm = 5, .opc2 = 6,
112
.type = ARM_CP_NOP, .access = PL1_W },
113
{ .name = "BPIMVA", .cp = 15, .opc1 = 0, .crn = 7, .crm = 5, .opc2 = 7,
114
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
115
{ .name = "DCCSW", .cp = 15, .opc1 = 0, .crn = 7, .crm = 10, .opc2 = 2,
116
.type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_tsw },
117
{ .name = "DCCMVAU", .cp = 15, .opc1 = 0, .crn = 7, .crm = 11, .opc2 = 1,
118
- .type = ARM_CP_NOP, .access = PL1_W },
119
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_pou_access },
120
{ .name = "DCCIMVAC", .cp = 15, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 1,
121
.type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_poc_access },
122
{ .name = "DCCISW", .cp = 15, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 2,
123
--
74
--
124
2.20.1
75
2.25.1
125
76
126
77
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Update the {TGE,E2H} == '11' masking to ARMv8.6.
3
Both single-step and pc alignment faults have priority over
4
If EL2 is configured for aarch32, disable all of
4
breakpoint exceptions.
5
the bits that are RES0 in aarch32 mode.
6
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200229012811.24129-6-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
9
---
12
target/arm/helper.c | 31 +++++++++++++++++++++++++++----
10
target/arm/debug_helper.c | 23 +++++++++++++++++++++++
13
1 file changed, 27 insertions(+), 4 deletions(-)
11
1 file changed, 23 insertions(+)
14
12
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
13
diff --git a/target/arm/debug_helper.c b/target/arm/debug_helper.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.c
15
--- a/target/arm/debug_helper.c
18
+++ b/target/arm/helper.c
16
+++ b/target/arm/debug_helper.c
19
@@ -XXX,XX +XXX,XX @@ uint64_t arm_hcr_el2_eff(CPUARMState *env)
17
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_breakpoint(CPUState *cs)
20
* Since the v8.4 language applies to the entire register, and
18
{
21
* appears to be backward compatible, use that.
19
ARMCPU *cpu = ARM_CPU(cs);
22
*/
20
CPUARMState *env = &cpu->env;
23
- ret = 0;
21
+ target_ulong pc;
24
- } else if (ret & HCR_TGE) {
22
int n;
25
- /* These bits are up-to-date as of ARMv8.4. */
23
26
+ return 0;
24
/*
25
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_breakpoint(CPUState *cs)
26
return false;
27
}
28
29
+ /*
30
+ * Single-step exceptions have priority over breakpoint exceptions.
31
+ * If single-step state is active-pending, suppress the bp.
32
+ */
33
+ if (arm_singlestep_active(env) && !(env->pstate & PSTATE_SS)) {
34
+ return false;
27
+ }
35
+ }
28
+
36
+
29
+ /*
37
+ /*
30
+ * For a cpu that supports both aarch64 and aarch32, we can set bits
38
+ * PC alignment faults have priority over breakpoint exceptions.
31
+ * in HCR_EL2 (e.g. via EL3) that are RES0 when we enter EL2 as aa32.
32
+ * Ignore all of the bits in HCR+HCR2 that are not valid for aarch32.
33
+ */
39
+ */
34
+ if (!arm_el_is_aa64(env, 2)) {
40
+ pc = is_a64(env) ? env->pc : env->regs[15];
35
+ uint64_t aa32_valid;
41
+ if ((is_a64(env) || !env->thumb) && (pc & 3) != 0) {
36
+
42
+ return false;
37
+ /*
38
+ * These bits are up-to-date as of ARMv8.6.
39
+ * For HCR, it's easiest to list just the 2 bits that are invalid.
40
+ * For HCR2, list those that are valid.
41
+ */
42
+ aa32_valid = MAKE_64BIT_MASK(0, 32) & ~(HCR_RW | HCR_TDZ);
43
+ aa32_valid |= (HCR_CD | HCR_ID | HCR_TERR | HCR_TEA | HCR_MIOCNCE |
44
+ HCR_TID4 | HCR_TICAB | HCR_TOCU | HCR_TTLBIS);
45
+ ret &= aa32_valid;
46
+ }
43
+ }
47
+
44
+
48
+ if (ret & HCR_TGE) {
45
+ /*
49
+ /* These bits are up-to-date as of ARMv8.6. */
46
+ * Instruction aborts have priority over breakpoint exceptions.
50
if (ret & HCR_E2H) {
47
+ * TODO: We would need to look up the page for PC and verify that
51
ret &= ~(HCR_VM | HCR_FMO | HCR_IMO | HCR_AMO |
48
+ * it is present and executable.
52
HCR_BSU_MASK | HCR_DC | HCR_TWI | HCR_TWE |
49
+ */
53
HCR_TID0 | HCR_TID2 | HCR_TPCP | HCR_TPU |
50
+
54
- HCR_TDZ | HCR_CD | HCR_ID | HCR_MIOCNCE);
51
for (n = 0; n < ARRAY_SIZE(env->cpu_breakpoint); n++) {
55
+ HCR_TDZ | HCR_CD | HCR_ID | HCR_MIOCNCE |
52
if (bp_wp_matches(cpu, n, false)) {
56
+ HCR_TID4 | HCR_TICAB | HCR_TOCU | HCR_ENSCXT |
53
return true;
57
+ HCR_TTLBIS | HCR_TTLBOS | HCR_TID5);
58
} else {
59
ret |= HCR_FMO | HCR_IMO | HCR_AMO;
60
}
61
--
54
--
62
2.20.1
55
2.25.1
63
56
64
57
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
3
This bit traps EL1 access to cache maintenance insns that operate
4
to the point of coherency or persistence.
5
2
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200229012811.24129-10-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
6
---
11
target/arm/helper.c | 39 +++++++++++++++++++++++++++++++--------
7
tests/tcg/aarch64/pcalign-a64.c | 37 +++++++++++++++++++++++++
12
1 file changed, 31 insertions(+), 8 deletions(-)
8
tests/tcg/arm/pcalign-a32.c | 46 +++++++++++++++++++++++++++++++
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
13
14
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
diff --git a/tests/tcg/aarch64/pcalign-a64.c b/tests/tcg/aarch64/pcalign-a64.c
15
index XXXXXXX..XXXXXXX 100644
16
new file mode 100644
16
--- a/target/arm/helper.c
17
index XXXXXXX..XXXXXXX
17
+++ b/target/arm/helper.c
18
--- /dev/null
18
@@ -XXX,XX +XXX,XX @@ static CPAccessResult aa64_cacheop_access(CPUARMState *env,
19
+++ b/tests/tcg/aarch64/pcalign-a64.c
19
return CP_ACCESS_OK;
20
@@ -XXX,XX +XXX,XX @@
20
}
21
+/* Test PC misalignment exception */
21
22
+
22
+static CPAccessResult aa64_cacheop_poc_access(CPUARMState *env,
23
+#include <assert.h>
23
+ const ARMCPRegInfo *ri,
24
+#include <signal.h>
24
+ bool isread)
25
+#include <stdlib.h>
26
+#include <stdio.h>
27
+
28
+static void *expected;
29
+
30
+static void sigbus(int sig, siginfo_t *info, void *vuc)
25
+{
31
+{
26
+ /* Cache invalidate/clean to Point of Coherency or Persistence... */
32
+ assert(info->si_code == BUS_ADRALN);
27
+ switch (arm_current_el(env)) {
33
+ assert(info->si_addr == expected);
28
+ case 0:
34
+ exit(EXIT_SUCCESS);
29
+ /* ... EL0 must UNDEF unless SCTLR_EL1.UCI is set. */
30
+ if (!(arm_sctlr(env, 0) & SCTLR_UCI)) {
31
+ return CP_ACCESS_TRAP;
32
+ }
33
+ /* fall through */
34
+ case 1:
35
+ /* ... EL1 must trap to EL2 if HCR_EL2.TPCP is set. */
36
+ if (arm_hcr_el2_eff(env) & HCR_TPCP) {
37
+ return CP_ACCESS_TRAP_EL2;
38
+ }
39
+ break;
40
+ }
41
+ return CP_ACCESS_OK;
42
+}
35
+}
43
+
36
+
44
/* See: D4.7.2 TLB maintenance requirements and the TLB maintenance instructions
37
+int main()
45
* Page D4-1736 (DDI0487A.b)
38
+{
46
*/
39
+ void *tmp;
47
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
40
+
48
.accessfn = aa64_cacheop_access },
41
+ struct sigaction sa = {
49
{ .name = "DC_IVAC", .state = ARM_CP_STATE_AA64,
42
+ .sa_sigaction = sigbus,
50
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 1,
43
+ .sa_flags = SA_SIGINFO
51
- .access = PL1_W, .type = ARM_CP_NOP },
44
+ };
52
+ .access = PL1_W, .accessfn = aa64_cacheop_poc_access,
45
+
53
+ .type = ARM_CP_NOP },
46
+ if (sigaction(SIGBUS, &sa, NULL) < 0) {
54
{ .name = "DC_ISW", .state = ARM_CP_STATE_AA64,
47
+ perror("sigaction");
55
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 2,
48
+ return EXIT_FAILURE;
56
.access = PL1_W, .accessfn = access_tsw, .type = ARM_CP_NOP },
49
+ }
57
{ .name = "DC_CVAC", .state = ARM_CP_STATE_AA64,
50
+
58
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 10, .opc2 = 1,
51
+ asm volatile("adr %0, 1f + 1\n\t"
59
.access = PL0_W, .type = ARM_CP_NOP,
52
+ "str %0, %1\n\t"
60
- .accessfn = aa64_cacheop_access },
53
+ "br %0\n"
61
+ .accessfn = aa64_cacheop_poc_access },
54
+ "1:"
62
{ .name = "DC_CSW", .state = ARM_CP_STATE_AA64,
55
+ : "=&r"(tmp), "=m"(expected));
63
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 10, .opc2 = 2,
56
+ abort();
64
.access = PL1_W, .accessfn = access_tsw, .type = ARM_CP_NOP },
57
+}
65
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
58
diff --git a/tests/tcg/arm/pcalign-a32.c b/tests/tcg/arm/pcalign-a32.c
66
{ .name = "DC_CIVAC", .state = ARM_CP_STATE_AA64,
59
new file mode 100644
67
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 14, .opc2 = 1,
60
index XXXXXXX..XXXXXXX
68
.access = PL0_W, .type = ARM_CP_NOP,
61
--- /dev/null
69
- .accessfn = aa64_cacheop_access },
62
+++ b/tests/tcg/arm/pcalign-a32.c
70
+ .accessfn = aa64_cacheop_poc_access },
63
@@ -XXX,XX +XXX,XX @@
71
{ .name = "DC_CISW", .state = ARM_CP_STATE_AA64,
64
+/* Test PC misalignment exception */
72
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 2,
65
+
73
.access = PL1_W, .accessfn = access_tsw, .type = ARM_CP_NOP },
66
+#ifdef __thumb__
74
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
67
+#error "This test must be compiled for ARM"
75
{ .name = "BPIMVA", .cp = 15, .opc1 = 0, .crn = 7, .crm = 5, .opc2 = 7,
68
+#endif
76
.type = ARM_CP_NOP, .access = PL1_W },
69
+
77
{ .name = "DCIMVAC", .cp = 15, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 1,
70
+#include <assert.h>
78
- .type = ARM_CP_NOP, .access = PL1_W },
71
+#include <signal.h>
79
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_poc_access },
72
+#include <stdlib.h>
80
{ .name = "DCISW", .cp = 15, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 2,
73
+#include <stdio.h>
81
.type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_tsw },
74
+
82
{ .name = "DCCMVAC", .cp = 15, .opc1 = 0, .crn = 7, .crm = 10, .opc2 = 1,
75
+static void *expected;
83
- .type = ARM_CP_NOP, .access = PL1_W },
76
+
84
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_poc_access },
77
+static void sigbus(int sig, siginfo_t *info, void *vuc)
85
{ .name = "DCCSW", .cp = 15, .opc1 = 0, .crn = 7, .crm = 10, .opc2 = 2,
78
+{
86
.type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_tsw },
79
+ assert(info->si_code == BUS_ADRALN);
87
{ .name = "DCCMVAU", .cp = 15, .opc1 = 0, .crn = 7, .crm = 11, .opc2 = 1,
80
+ assert(info->si_addr == expected);
88
.type = ARM_CP_NOP, .access = PL1_W },
81
+ exit(EXIT_SUCCESS);
89
{ .name = "DCCIMVAC", .cp = 15, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 1,
82
+}
90
- .type = ARM_CP_NOP, .access = PL1_W },
83
+
91
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_poc_access },
84
+int main()
92
{ .name = "DCCISW", .cp = 15, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 2,
85
+{
93
.type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_tsw },
86
+ void *tmp;
94
/* MMU Domain access control / MPU write buffer control */
87
+
95
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo dcpop_reg[] = {
88
+ struct sigaction sa = {
96
{ .name = "DC_CVAP", .state = ARM_CP_STATE_AA64,
89
+ .sa_sigaction = sigbus,
97
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 12, .opc2 = 1,
90
+ .sa_flags = SA_SIGINFO
98
.access = PL0_W, .type = ARM_CP_NO_RAW | ARM_CP_SUPPRESS_TB_END,
91
+ };
99
- .accessfn = aa64_cacheop_access, .writefn = dccvap_writefn },
92
+
100
+ .accessfn = aa64_cacheop_poc_access, .writefn = dccvap_writefn },
93
+ if (sigaction(SIGBUS, &sa, NULL) < 0) {
101
REGINFO_SENTINEL
94
+ perror("sigaction");
102
};
95
+ return EXIT_FAILURE;
103
96
+ }
104
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo dcpodp_reg[] = {
97
+
105
{ .name = "DC_CVADP", .state = ARM_CP_STATE_AA64,
98
+ asm volatile("adr %0, 1f + 2\n\t"
106
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 13, .opc2 = 1,
99
+ "str %0, %1\n\t"
107
.access = PL0_W, .type = ARM_CP_NO_RAW | ARM_CP_SUPPRESS_TB_END,
100
+ "bx %0\n"
108
- .accessfn = aa64_cacheop_access, .writefn = dccvap_writefn },
101
+ "1:"
109
+ .accessfn = aa64_cacheop_poc_access, .writefn = dccvap_writefn },
102
+ : "=&r"(tmp), "=m"(expected));
110
REGINFO_SENTINEL
103
+
111
};
104
+ /*
112
#endif /*CONFIG_USER_ONLY*/
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
113
--
140
--
114
2.20.1
141
2.25.1
115
142
116
143
diff view generated by jsdifflib
1
From: Niek Linnenbank <nieklinnenbank@gmail.com>
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
3
The Cubieboard is a singleboard computer with an Allwinner A10 System-on-Chip [1].
12
In three cases inside this switch, we were then also checking for
4
As documented in the Allwinner A10 User Manual V1.5 [2], the SoC has an ARM
13
"if (b1 >= 2) { goto unknown_op; }".
5
Cortex-A8 processor. Currently the Cubieboard machine definition specifies the
14
However, this can never happen, because the 'case' values in each place
6
ARM Cortex-A9 in its description and as the default CPU.
15
are 0x0nn or 0x1nn and the switch will have directed the b1 == (2, 3)
16
cases to the default already.
7
17
8
This patch corrects the Cubieboard machine definition to use the ARM Cortex-A8.
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.
9
23
10
The only user-visible effect is that our textual description of the
24
Change the checks to assert() instead, and make sure they're always
11
machine was wrong, because hw/arm/allwinner-a10.c always creates a
25
immediately before the array access they are protecting.
12
Cortex-A8 CPU regardless of the default value in the MachineClass struct.
13
26
14
[1] http://docs.cubieboard.org/products/start#cubieboard1
27
Fixes: Coverity CID 1460207
15
[2] https://linux-sunxi.org/File:Allwinner_A10_User_manual_V1.5.pdf
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
30
---
31
target/i386/tcg/translate.c | 12 +++---------
32
1 file changed, 3 insertions(+), 9 deletions(-)
16
33
17
Fixes: 8a863c8120994981a099
34
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
18
Signed-off-by: Niek Linnenbank <nieklinnenbank@gmail.com>
19
Message-id: 20200227220149.6845-2-nieklinnenbank@gmail.com
20
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
22
[note in commit message that the bug didn't have much visible effect]
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
25
hw/arm/cubieboard.c | 4 ++--
26
1 file changed, 2 insertions(+), 2 deletions(-)
27
28
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
29
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/arm/cubieboard.c
36
--- a/target/i386/tcg/translate.c
31
+++ b/hw/arm/cubieboard.c
37
+++ b/target/i386/tcg/translate.c
32
@@ -XXX,XX +XXX,XX @@ static void cubieboard_init(MachineState *machine)
38
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
33
39
case 0x171: /* shift xmm, im */
34
static void cubieboard_machine_init(MachineClass *mc)
40
case 0x172:
35
{
41
case 0x173:
36
- mc->desc = "cubietech cubieboard (Cortex-A9)";
42
- if (b1 >= 2) {
37
- mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
43
- goto unknown_op;
38
+ mc->desc = "cubietech cubieboard (Cortex-A8)";
44
- }
39
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a8");
45
val = x86_ldub_code(env, s);
40
mc->init = cubieboard_init;
46
if (is_xmm) {
41
mc->block_default_type = IF_IDE;
47
tcg_gen_movi_tl(s->T0, val);
42
mc->units_per_default_bus = 1;
48
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
49
offsetof(CPUX86State, mmx_t0.MMX_L(1)));
50
op1_offset = offsetof(CPUX86State,mmx_t0);
51
}
52
+ assert(b1 < 2);
53
sse_fn_epp = sse_op_table2[((b - 1) & 3) * 8 +
54
(((modrm >> 3)) & 7)][b1];
55
if (!sse_fn_epp) {
56
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
57
rm = modrm & 7;
58
reg = ((modrm >> 3) & 7) | REX_R(s);
59
mod = (modrm >> 6) & 3;
60
- if (b1 >= 2) {
61
- goto unknown_op;
62
- }
63
64
+ assert(b1 < 2);
65
sse_fn_epp = sse_op_table6[b].op[b1];
66
if (!sse_fn_epp) {
67
goto unknown_op;
68
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
69
rm = modrm & 7;
70
reg = ((modrm >> 3) & 7) | REX_R(s);
71
mod = (modrm >> 6) & 3;
72
- if (b1 >= 2) {
73
- goto unknown_op;
74
- }
75
76
+ assert(b1 < 2);
77
sse_fn_eppi = sse_op_table7[b].op[b1];
78
if (!sse_fn_eppi) {
79
goto unknown_op;
43
--
80
--
44
2.20.1
81
2.25.1
45
82
46
83
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
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
We only build the little-endian softmmu configurations. Checking
5
include/hw/i386/x86.h and include/hw/i386/microvm.h break this rule.
4
for big endian is pointless, remove the unused code.
6
In fact, the include is not required at all, so we can just drop it
7
from both files.
5
8
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20211129200510.1233037-2-peter.maydell@linaro.org
9
---
13
---
10
hw/arm/musicpal.c | 10 ----------
14
include/hw/i386/microvm.h | 1 -
11
1 file changed, 10 deletions(-)
15
include/hw/i386/x86.h | 1 -
16
2 files changed, 2 deletions(-)
12
17
13
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
18
diff --git a/include/hw/i386/microvm.h b/include/hw/i386/microvm.h
14
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/musicpal.c
20
--- a/include/hw/i386/microvm.h
16
+++ b/hw/arm/musicpal.c
21
+++ b/include/hw/i386/microvm.h
17
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
22
@@ -XXX,XX +XXX,XX @@
18
* 0xFF800000 (if there is 8 MB flash). So remap flash access if the
23
#ifndef HW_I386_MICROVM_H
19
* image is smaller than 32 MB.
24
#define HW_I386_MICROVM_H
20
*/
25
21
-#ifdef TARGET_WORDS_BIGENDIAN
26
-#include "qemu-common.h"
22
- pflash_cfi02_register(0x100000000ULL - MP_FLASH_SIZE_MAX,
27
#include "exec/hwaddr.h"
23
- "musicpal.flash", flash_size,
28
#include "qemu/notify.h"
24
- blk, 0x10000,
29
25
- MP_FLASH_SIZE_MAX / flash_size,
30
diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
26
- 2, 0x00BF, 0x236D, 0x0000, 0x0000,
31
index XXXXXXX..XXXXXXX 100644
27
- 0x5555, 0x2AAA, 1);
32
--- a/include/hw/i386/x86.h
28
-#else
33
+++ b/include/hw/i386/x86.h
29
pflash_cfi02_register(0x100000000ULL - MP_FLASH_SIZE_MAX,
34
@@ -XXX,XX +XXX,XX @@
30
"musicpal.flash", flash_size,
35
#ifndef HW_I386_X86_H
31
blk, 0x10000,
36
#define HW_I386_X86_H
32
MP_FLASH_SIZE_MAX / flash_size,
37
33
2, 0x00BF, 0x236D, 0x0000, 0x0000,
38
-#include "qemu-common.h"
34
0x5555, 0x2AAA, 0);
39
#include "exec/hwaddr.h"
35
-#endif
40
#include "qemu/notify.h"
36
-
37
}
38
sysbus_create_simple(TYPE_MV88W8618_FLASHCFG, MP_FLASHCFG_BASE, NULL);
39
41
40
--
42
--
41
2.20.1
43
2.25.1
42
44
43
45
diff view generated by jsdifflib
1
The ARMv8.2-TTCNP extension allows an implementation to optimize by
1
The qemu-common.h header is not supposed to be included from any
2
sharing TLB entries between multiple cores, provided that software
2
other header files, only from .c files (as documented in a comment at
3
declares that it's ready to deal with this by setting a CnP bit in
3
the start of it).
4
the TTBRn_ELx. It is mandatory from ARMv8.2 onward.
5
4
6
For QEMU's TLB implementation, sharing TLB entries between different
5
Move the include to linux-user/hexagon/cpu_loop.c, which needs it for
7
cores would not really benefit us and would be a lot of work to
6
the declaration of cpu_exec_step_atomic().
8
implement. So we implement this extension in the "trivial" manner:
9
we allow the guest to set and read back the CnP bit, but don't change
10
our behaviour (this is an architecturally valid implementation
11
choice).
12
13
The only code path which looks at the TTBRn_ELx values for the
14
long-descriptor format where the CnP bit is defined is already doing
15
enough masking to not get confused when the CnP bit at the bottom of
16
the register is set, so we can simply add a comment noting why we're
17
relying on that mask.
18
7
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
Message-id: 20200225193822.18874-1-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
22
---
13
---
23
target/arm/cpu.c | 1 +
14
target/hexagon/cpu.h | 1 -
24
target/arm/cpu64.c | 2 ++
15
linux-user/hexagon/cpu_loop.c | 1 +
25
target/arm/helper.c | 4 ++++
16
2 files changed, 1 insertion(+), 1 deletion(-)
26
3 files changed, 7 insertions(+)
27
17
28
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
18
diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h
29
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/cpu.c
20
--- a/target/hexagon/cpu.h
31
+++ b/target/arm/cpu.c
21
+++ b/target/hexagon/cpu.h
32
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
22
@@ -XXX,XX +XXX,XX @@ typedef struct CPUHexagonState CPUHexagonState;
33
t = cpu->isar.id_mmfr4;
23
34
t = FIELD_DP32(t, ID_MMFR4, HPDS, 1); /* AA32HPD */
24
#include "fpu/softfloat-types.h"
35
t = FIELD_DP32(t, ID_MMFR4, AC2, 1); /* ACTLR2, HACTLR2 */
25
36
+ t = FIELD_DP32(t, ID_MMFR4, CNP, 1); /* TTCNP */
26
-#include "qemu-common.h"
37
cpu->isar.id_mmfr4 = t;
27
#include "exec/cpu-defs.h"
38
}
28
#include "hex_regs.h"
39
#endif
29
#include "mmvec/mmvec.h"
40
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
30
diff --git a/linux-user/hexagon/cpu_loop.c b/linux-user/hexagon/cpu_loop.c
41
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/cpu64.c
32
--- a/linux-user/hexagon/cpu_loop.c
43
+++ b/target/arm/cpu64.c
33
+++ b/linux-user/hexagon/cpu_loop.c
44
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
34
@@ -XXX,XX +XXX,XX @@
45
35
*/
46
t = cpu->isar.id_aa64mmfr2;
36
47
t = FIELD_DP64(t, ID_AA64MMFR2, UAO, 1);
37
#include "qemu/osdep.h"
48
+ t = FIELD_DP64(t, ID_AA64MMFR2, CNP, 1); /* TTCNP */
38
+#include "qemu-common.h"
49
cpu->isar.id_aa64mmfr2 = t;
39
#include "qemu.h"
50
40
#include "user-internals.h"
51
/* Replicate the same data to the 32-bit id registers. */
41
#include "cpu_loop-common.h"
52
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
53
u = cpu->isar.id_mmfr4;
54
u = FIELD_DP32(u, ID_MMFR4, HPDS, 1); /* AA32HPD */
55
u = FIELD_DP32(u, ID_MMFR4, AC2, 1); /* ACTLR2, HACTLR2 */
56
+ u = FIELD_DP32(t, ID_MMFR4, CNP, 1); /* TTCNP */
57
cpu->isar.id_mmfr4 = u;
58
59
u = cpu->isar.id_aa64dfr0;
60
diff --git a/target/arm/helper.c b/target/arm/helper.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/target/arm/helper.c
63
+++ b/target/arm/helper.c
64
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
65
66
/* Now we can extract the actual base address from the TTBR */
67
descaddr = extract64(ttbr, 0, 48);
68
+ /*
69
+ * We rely on this masking to clear the RES0 bits at the bottom of the TTBR
70
+ * and also to mask out CnP (bit 0) which could validly be non-zero.
71
+ */
72
descaddr &= ~indexmask;
73
74
/* The address field in the descriptor goes up to bit 39 for ARMv7
75
--
42
--
76
2.20.1
43
2.25.1
77
44
78
45
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
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
Add support for the Versal LPD ADMAs.
5
Nothing actually relies on target/rx/cpu.h including it, so we can
6
just drop the include.
4
7
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
7
Reviewed-by: KONRAD Frederic <frederic.konrad@adacore.com>
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@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
include/hw/arm/xlnx-versal.h | 6 ++++++
15
target/rx/cpu.h | 1 -
12
hw/arm/xlnx-versal.c | 24 ++++++++++++++++++++++++
16
1 file changed, 1 deletion(-)
13
2 files changed, 30 insertions(+)
14
17
15
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
18
diff --git a/target/rx/cpu.h b/target/rx/cpu.h
16
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/xlnx-versal.h
20
--- a/target/rx/cpu.h
18
+++ b/include/hw/arm/xlnx-versal.h
21
+++ b/target/rx/cpu.h
19
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
20
#define XLNX_VERSAL_NR_ACPUS 2
23
#define RX_CPU_H
21
#define XLNX_VERSAL_NR_UARTS 2
24
22
#define XLNX_VERSAL_NR_GEMS 2
25
#include "qemu/bitops.h"
23
+#define XLNX_VERSAL_NR_ADMAS 8
26
-#include "qemu-common.h"
24
#define XLNX_VERSAL_NR_IRQS 192
27
#include "hw/registerfields.h"
25
28
#include "cpu-qom.h"
26
typedef struct Versal {
27
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
28
struct {
29
SysBusDevice *uart[XLNX_VERSAL_NR_UARTS];
30
SysBusDevice *gem[XLNX_VERSAL_NR_GEMS];
31
+ SysBusDevice *adma[XLNX_VERSAL_NR_ADMAS];
32
} iou;
33
} lpd;
34
35
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
36
#define VERSAL_GEM0_WAKE_IRQ_0 57
37
#define VERSAL_GEM1_IRQ_0 58
38
#define VERSAL_GEM1_WAKE_IRQ_0 59
39
+#define VERSAL_ADMA_IRQ_0 60
40
41
/* Architecturally reserved IRQs suitable for virtualization. */
42
#define VERSAL_RSVD_IRQ_FIRST 111
43
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
44
#define MM_GEM1 0xff0d0000U
45
#define MM_GEM1_SIZE 0x10000
46
47
+#define MM_ADMA_CH0 0xffa80000U
48
+#define MM_ADMA_CH0_SIZE 0x10000
49
+
50
#define MM_OCM 0xfffc0000U
51
#define MM_OCM_SIZE 0x40000
52
53
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/arm/xlnx-versal.c
56
+++ b/hw/arm/xlnx-versal.c
57
@@ -XXX,XX +XXX,XX @@ static void versal_create_gems(Versal *s, qemu_irq *pic)
58
}
59
}
60
61
+static void versal_create_admas(Versal *s, qemu_irq *pic)
62
+{
63
+ int i;
64
+
65
+ for (i = 0; i < ARRAY_SIZE(s->lpd.iou.adma); i++) {
66
+ char *name = g_strdup_printf("adma%d", i);
67
+ DeviceState *dev;
68
+ MemoryRegion *mr;
69
+
70
+ dev = qdev_create(NULL, "xlnx.zdma");
71
+ s->lpd.iou.adma[i] = SYS_BUS_DEVICE(dev);
72
+ object_property_add_child(OBJECT(s), name, OBJECT(dev), &error_fatal);
73
+ qdev_init_nofail(dev);
74
+
75
+ mr = sysbus_mmio_get_region(s->lpd.iou.adma[i], 0);
76
+ memory_region_add_subregion(&s->mr_ps,
77
+ MM_ADMA_CH0 + i * MM_ADMA_CH0_SIZE, mr);
78
+
79
+ sysbus_connect_irq(s->lpd.iou.adma[i], 0, pic[VERSAL_ADMA_IRQ_0 + i]);
80
+ g_free(name);
81
+ }
82
+}
83
+
84
/* This takes the board allocated linear DDR memory and creates aliases
85
* for each split DDR range/aperture on the Versal address map.
86
*/
87
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
88
versal_create_apu_gic(s, pic);
89
versal_create_uarts(s, pic);
90
versal_create_gems(s, pic);
91
+ versal_create_admas(s, pic);
92
versal_map_ddr(s);
93
versal_unimp(s);
94
29
95
--
30
--
96
2.20.1
31
2.25.1
97
32
98
33
diff view generated by jsdifflib
Deleted patch
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
1
3
Generate xlnx-versal-virt zdma FDT nodes.
4
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
7
Reviewed-by: KONRAD Frederic <frederic.konrad@adacore.com>
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/xlnx-versal-virt.c | 28 ++++++++++++++++++++++++++++
12
1 file changed, 28 insertions(+)
13
14
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/xlnx-versal-virt.c
17
+++ b/hw/arm/xlnx-versal-virt.c
18
@@ -XXX,XX +XXX,XX @@ static void fdt_add_gem_nodes(VersalVirt *s)
19
}
20
}
21
22
+static void fdt_add_zdma_nodes(VersalVirt *s)
23
+{
24
+ const char clocknames[] = "clk_main\0clk_apb";
25
+ const char compat[] = "xlnx,zynqmp-dma-1.0";
26
+ int i;
27
+
28
+ for (i = XLNX_VERSAL_NR_ADMAS - 1; i >= 0; i--) {
29
+ uint64_t addr = MM_ADMA_CH0 + MM_ADMA_CH0_SIZE * i;
30
+ char *name = g_strdup_printf("/dma@%" PRIx64, addr);
31
+
32
+ qemu_fdt_add_subnode(s->fdt, name);
33
+
34
+ qemu_fdt_setprop_cell(s->fdt, name, "xlnx,bus-width", 64);
35
+ qemu_fdt_setprop_cells(s->fdt, name, "clocks",
36
+ s->phandle.clk_25Mhz, s->phandle.clk_25Mhz);
37
+ qemu_fdt_setprop(s->fdt, name, "clock-names",
38
+ clocknames, sizeof(clocknames));
39
+ qemu_fdt_setprop_cells(s->fdt, name, "interrupts",
40
+ GIC_FDT_IRQ_TYPE_SPI, VERSAL_ADMA_IRQ_0 + i,
41
+ GIC_FDT_IRQ_FLAGS_LEVEL_HI);
42
+ qemu_fdt_setprop_sized_cells(s->fdt, name, "reg",
43
+ 2, addr, 2, 0x1000);
44
+ qemu_fdt_setprop(s->fdt, name, "compatible", compat, sizeof(compat));
45
+ g_free(name);
46
+ }
47
+}
48
+
49
static void fdt_nop_memory_nodes(void *fdt, Error **errp)
50
{
51
Error *err = NULL;
52
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
53
fdt_add_uart_nodes(s);
54
fdt_add_gic_nodes(s);
55
fdt_add_timer_nodes(s);
56
+ fdt_add_zdma_nodes(s);
57
fdt_add_cpu_nodes(s, psci_conduit);
58
fdt_add_clk_node(s, "/clk125", 125000000, s->phandle.clk_125Mhz);
59
fdt_add_clk_node(s, "/clk25", 25000000, s->phandle.clk_25Mhz);
60
--
61
2.20.1
62
63
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
A lot of C files in hw/arm include qemu-common.h when they don't
2
need anything from it. Drop the include lines.
2
3
3
This is an aarch64-only function. Move it out of the shared file.
4
omap1.c, pxa2xx.c and strongarm.c retain the include because they
4
This patch is code movement only.
5
use it for the prototype of qemu_get_timedate().
5
6
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20200302175829.2183-6-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
11
Reviewed-by: Yoshinori Sato <ysato@users.sourceforge.jp>
12
Message-id: 20211129200510.1233037-5-peter.maydell@linaro.org
11
---
13
---
12
target/arm/helper-a64.h | 1 +
14
hw/arm/boot.c | 1 -
13
target/arm/helper.h | 1 -
15
hw/arm/digic_boards.c | 1 -
14
target/arm/helper-a64.c | 91 ++++++++++++++++++++++++++++++++++++++++
16
hw/arm/highbank.c | 1 -
15
target/arm/op_helper.c | 93 -----------------------------------------
17
hw/arm/npcm7xx_boards.c | 1 -
16
4 files changed, 92 insertions(+), 94 deletions(-)
18
hw/arm/sbsa-ref.c | 1 -
19
hw/arm/stm32f405_soc.c | 1 -
20
hw/arm/vexpress.c | 1 -
21
hw/arm/virt.c | 1 -
22
8 files changed, 8 deletions(-)
17
23
18
diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h
24
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
19
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/helper-a64.h
26
--- a/hw/arm/boot.c
21
+++ b/target/arm/helper-a64.h
27
+++ b/hw/arm/boot.c
22
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_2(advsimd_f16touinth, i32, f16, ptr)
23
DEF_HELPER_2(sqrt_f16, f16, f16, ptr)
24
25
DEF_HELPER_2(exception_return, void, env, i64)
26
+DEF_HELPER_2(dc_zva, void, env, i64)
27
28
DEF_HELPER_FLAGS_3(pacia, TCG_CALL_NO_WG, i64, env, i64, i64)
29
DEF_HELPER_FLAGS_3(pacib, TCG_CALL_NO_WG, i64, env, i64, i64)
30
diff --git a/target/arm/helper.h b/target/arm/helper.h
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/helper.h
33
+++ b/target/arm/helper.h
34
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(crypto_sm4ekey, TCG_CALL_NO_RWG, void, ptr, ptr, ptr)
35
36
DEF_HELPER_FLAGS_3(crc32, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32)
37
DEF_HELPER_FLAGS_3(crc32c, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32)
38
-DEF_HELPER_2(dc_zva, void, env, i64)
39
40
DEF_HELPER_FLAGS_5(gvec_qrdmlah_s16, TCG_CALL_NO_RWG,
41
void, ptr, ptr, ptr, ptr, i32)
42
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/arm/helper-a64.c
45
+++ b/target/arm/helper-a64.c
46
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@
47
*/
29
*/
48
30
49
#include "qemu/osdep.h"
31
#include "qemu/osdep.h"
50
+#include "qemu/units.h"
32
-#include "qemu-common.h"
33
#include "qemu/datadir.h"
34
#include "qemu/error-report.h"
35
#include "qapi/error.h"
36
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/arm/digic_boards.c
39
+++ b/hw/arm/digic_boards.c
40
@@ -XXX,XX +XXX,XX @@
41
42
#include "qemu/osdep.h"
43
#include "qapi/error.h"
44
-#include "qemu-common.h"
45
#include "qemu/datadir.h"
46
#include "hw/boards.h"
47
#include "qemu/error-report.h"
48
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/hw/arm/highbank.c
51
+++ b/hw/arm/highbank.c
52
@@ -XXX,XX +XXX,XX @@
53
*/
54
55
#include "qemu/osdep.h"
56
-#include "qemu-common.h"
57
#include "qemu/datadir.h"
58
#include "qapi/error.h"
59
#include "hw/sysbus.h"
60
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/hw/arm/npcm7xx_boards.c
63
+++ b/hw/arm/npcm7xx_boards.c
64
@@ -XXX,XX +XXX,XX @@
65
#include "hw/qdev-core.h"
66
#include "hw/qdev-properties.h"
67
#include "qapi/error.h"
68
-#include "qemu-common.h"
69
#include "qemu/datadir.h"
70
#include "qemu/units.h"
71
#include "sysemu/blockdev.h"
72
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/arm/sbsa-ref.c
75
+++ b/hw/arm/sbsa-ref.c
76
@@ -XXX,XX +XXX,XX @@
77
*/
78
79
#include "qemu/osdep.h"
80
-#include "qemu-common.h"
81
#include "qemu/datadir.h"
82
#include "qapi/error.h"
83
#include "qemu/error-report.h"
84
diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/hw/arm/stm32f405_soc.c
87
+++ b/hw/arm/stm32f405_soc.c
88
@@ -XXX,XX +XXX,XX @@
89
90
#include "qemu/osdep.h"
91
#include "qapi/error.h"
92
-#include "qemu-common.h"
93
#include "exec/address-spaces.h"
94
#include "sysemu/sysemu.h"
95
#include "hw/arm/stm32f405_soc.h"
96
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
97
index XXXXXXX..XXXXXXX 100644
98
--- a/hw/arm/vexpress.c
99
+++ b/hw/arm/vexpress.c
100
@@ -XXX,XX +XXX,XX @@
101
102
#include "qemu/osdep.h"
103
#include "qapi/error.h"
104
-#include "qemu-common.h"
105
#include "qemu/datadir.h"
51
#include "cpu.h"
106
#include "cpu.h"
52
#include "exec/gdbstub.h"
107
#include "hw/sysbus.h"
53
#include "exec/helper-proto.h"
108
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
54
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(sqrt_f16)(uint32_t a, void *fpstp)
55
return float16_sqrt(a, s);
56
}
57
58
+void HELPER(dc_zva)(CPUARMState *env, uint64_t vaddr_in)
59
+{
60
+ /*
61
+ * Implement DC ZVA, which zeroes a fixed-length block of memory.
62
+ * Note that we do not implement the (architecturally mandated)
63
+ * alignment fault for attempts to use this on Device memory
64
+ * (which matches the usual QEMU behaviour of not implementing either
65
+ * alignment faults or any memory attribute handling).
66
+ */
67
68
+ ARMCPU *cpu = env_archcpu(env);
69
+ uint64_t blocklen = 4 << cpu->dcz_blocksize;
70
+ uint64_t vaddr = vaddr_in & ~(blocklen - 1);
71
+
72
+#ifndef CONFIG_USER_ONLY
73
+ {
74
+ /*
75
+ * Slightly awkwardly, QEMU's TARGET_PAGE_SIZE may be less than
76
+ * the block size so we might have to do more than one TLB lookup.
77
+ * We know that in fact for any v8 CPU the page size is at least 4K
78
+ * and the block size must be 2K or less, but TARGET_PAGE_SIZE is only
79
+ * 1K as an artefact of legacy v5 subpage support being present in the
80
+ * same QEMU executable. So in practice the hostaddr[] array has
81
+ * two entries, given the current setting of TARGET_PAGE_BITS_MIN.
82
+ */
83
+ int maxidx = DIV_ROUND_UP(blocklen, TARGET_PAGE_SIZE);
84
+ void *hostaddr[DIV_ROUND_UP(2 * KiB, 1 << TARGET_PAGE_BITS_MIN)];
85
+ int try, i;
86
+ unsigned mmu_idx = cpu_mmu_index(env, false);
87
+ TCGMemOpIdx oi = make_memop_idx(MO_UB, mmu_idx);
88
+
89
+ assert(maxidx <= ARRAY_SIZE(hostaddr));
90
+
91
+ for (try = 0; try < 2; try++) {
92
+
93
+ for (i = 0; i < maxidx; i++) {
94
+ hostaddr[i] = tlb_vaddr_to_host(env,
95
+ vaddr + TARGET_PAGE_SIZE * i,
96
+ 1, mmu_idx);
97
+ if (!hostaddr[i]) {
98
+ break;
99
+ }
100
+ }
101
+ if (i == maxidx) {
102
+ /*
103
+ * If it's all in the TLB it's fair game for just writing to;
104
+ * we know we don't need to update dirty status, etc.
105
+ */
106
+ for (i = 0; i < maxidx - 1; i++) {
107
+ memset(hostaddr[i], 0, TARGET_PAGE_SIZE);
108
+ }
109
+ memset(hostaddr[i], 0, blocklen - (i * TARGET_PAGE_SIZE));
110
+ return;
111
+ }
112
+ /*
113
+ * OK, try a store and see if we can populate the tlb. This
114
+ * might cause an exception if the memory isn't writable,
115
+ * in which case we will longjmp out of here. We must for
116
+ * this purpose use the actual register value passed to us
117
+ * so that we get the fault address right.
118
+ */
119
+ helper_ret_stb_mmu(env, vaddr_in, 0, oi, GETPC());
120
+ /* Now we can populate the other TLB entries, if any */
121
+ for (i = 0; i < maxidx; i++) {
122
+ uint64_t va = vaddr + TARGET_PAGE_SIZE * i;
123
+ if (va != (vaddr_in & TARGET_PAGE_MASK)) {
124
+ helper_ret_stb_mmu(env, va, 0, oi, GETPC());
125
+ }
126
+ }
127
+ }
128
+
129
+ /*
130
+ * Slow path (probably attempt to do this to an I/O device or
131
+ * similar, or clearing of a block of code we have translations
132
+ * cached for). Just do a series of byte writes as the architecture
133
+ * demands. It's not worth trying to use a cpu_physical_memory_map(),
134
+ * memset(), unmap() sequence here because:
135
+ * + we'd need to account for the blocksize being larger than a page
136
+ * + the direct-RAM access case is almost always going to be dealt
137
+ * with in the fastpath code above, so there's no speed benefit
138
+ * + we would have to deal with the map returning NULL because the
139
+ * bounce buffer was in use
140
+ */
141
+ for (i = 0; i < blocklen; i++) {
142
+ helper_ret_stb_mmu(env, vaddr + i, 0, oi, GETPC());
143
+ }
144
+ }
145
+#else
146
+ memset(g2h(vaddr), 0, blocklen);
147
+#endif
148
+}
149
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
150
index XXXXXXX..XXXXXXX 100644
109
index XXXXXXX..XXXXXXX 100644
151
--- a/target/arm/op_helper.c
110
--- a/hw/arm/virt.c
152
+++ b/target/arm/op_helper.c
111
+++ b/hw/arm/virt.c
153
@@ -XXX,XX +XXX,XX @@
112
@@ -XXX,XX +XXX,XX @@
154
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
155
*/
113
*/
114
156
#include "qemu/osdep.h"
115
#include "qemu/osdep.h"
157
-#include "qemu/units.h"
116
-#include "qemu-common.h"
158
#include "qemu/log.h"
117
#include "qemu/datadir.h"
159
#include "qemu/main-loop.h"
118
#include "qemu/units.h"
160
#include "cpu.h"
119
#include "qemu/option.h"
161
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(ror_cc)(CPUARMState *env, uint32_t x, uint32_t i)
162
return ((uint32_t)x >> shift) | (x << (32 - shift));
163
}
164
}
165
-
166
-void HELPER(dc_zva)(CPUARMState *env, uint64_t vaddr_in)
167
-{
168
- /*
169
- * Implement DC ZVA, which zeroes a fixed-length block of memory.
170
- * Note that we do not implement the (architecturally mandated)
171
- * alignment fault for attempts to use this on Device memory
172
- * (which matches the usual QEMU behaviour of not implementing either
173
- * alignment faults or any memory attribute handling).
174
- */
175
-
176
- ARMCPU *cpu = env_archcpu(env);
177
- uint64_t blocklen = 4 << cpu->dcz_blocksize;
178
- uint64_t vaddr = vaddr_in & ~(blocklen - 1);
179
-
180
-#ifndef CONFIG_USER_ONLY
181
- {
182
- /*
183
- * Slightly awkwardly, QEMU's TARGET_PAGE_SIZE may be less than
184
- * the block size so we might have to do more than one TLB lookup.
185
- * We know that in fact for any v8 CPU the page size is at least 4K
186
- * and the block size must be 2K or less, but TARGET_PAGE_SIZE is only
187
- * 1K as an artefact of legacy v5 subpage support being present in the
188
- * same QEMU executable. So in practice the hostaddr[] array has
189
- * two entries, given the current setting of TARGET_PAGE_BITS_MIN.
190
- */
191
- int maxidx = DIV_ROUND_UP(blocklen, TARGET_PAGE_SIZE);
192
- void *hostaddr[DIV_ROUND_UP(2 * KiB, 1 << TARGET_PAGE_BITS_MIN)];
193
- int try, i;
194
- unsigned mmu_idx = cpu_mmu_index(env, false);
195
- TCGMemOpIdx oi = make_memop_idx(MO_UB, mmu_idx);
196
-
197
- assert(maxidx <= ARRAY_SIZE(hostaddr));
198
-
199
- for (try = 0; try < 2; try++) {
200
-
201
- for (i = 0; i < maxidx; i++) {
202
- hostaddr[i] = tlb_vaddr_to_host(env,
203
- vaddr + TARGET_PAGE_SIZE * i,
204
- 1, mmu_idx);
205
- if (!hostaddr[i]) {
206
- break;
207
- }
208
- }
209
- if (i == maxidx) {
210
- /*
211
- * If it's all in the TLB it's fair game for just writing to;
212
- * we know we don't need to update dirty status, etc.
213
- */
214
- for (i = 0; i < maxidx - 1; i++) {
215
- memset(hostaddr[i], 0, TARGET_PAGE_SIZE);
216
- }
217
- memset(hostaddr[i], 0, blocklen - (i * TARGET_PAGE_SIZE));
218
- return;
219
- }
220
- /*
221
- * OK, try a store and see if we can populate the tlb. This
222
- * might cause an exception if the memory isn't writable,
223
- * in which case we will longjmp out of here. We must for
224
- * this purpose use the actual register value passed to us
225
- * so that we get the fault address right.
226
- */
227
- helper_ret_stb_mmu(env, vaddr_in, 0, oi, GETPC());
228
- /* Now we can populate the other TLB entries, if any */
229
- for (i = 0; i < maxidx; i++) {
230
- uint64_t va = vaddr + TARGET_PAGE_SIZE * i;
231
- if (va != (vaddr_in & TARGET_PAGE_MASK)) {
232
- helper_ret_stb_mmu(env, va, 0, oi, GETPC());
233
- }
234
- }
235
- }
236
-
237
- /*
238
- * Slow path (probably attempt to do this to an I/O device or
239
- * similar, or clearing of a block of code we have translations
240
- * cached for). Just do a series of byte writes as the architecture
241
- * demands. It's not worth trying to use a cpu_physical_memory_map(),
242
- * memset(), unmap() sequence here because:
243
- * + we'd need to account for the blocksize being larger than a page
244
- * + the direct-RAM access case is almost always going to be dealt
245
- * with in the fastpath code above, so there's no speed benefit
246
- * + we would have to deal with the map returning NULL because the
247
- * bounce buffer was in use
248
- */
249
- for (i = 0; i < blocklen; i++) {
250
- helper_ret_stb_mmu(env, vaddr + i, 0, oi, GETPC());
251
- }
252
- }
253
-#else
254
- memset(g2h(vaddr), 0, blocklen);
255
-#endif
256
-}
257
--
120
--
258
2.20.1
121
2.25.1
259
122
260
123
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
The calculation of the length of TLB range invalidate operations
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
2
11
3
Replicate the single TBI bit from TCR_EL2 and TCR_EL3 so that
12
Thanks to the bug report submitter Cha HyunSoo for identifying
4
we can unconditionally use pointer bit 55 to index into our
13
both these errors.
5
composite TBI1:TBI0 field.
6
14
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Fixes: 84940ed82552d3c ("target/arm: Add support for FEAT_TLBIRANGE")
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
16
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/734
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Message-id: 20200302175829.2183-2-richard.henderson@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@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
12
---
22
---
13
target/arm/helper.c | 6 ++++--
23
target/arm/helper.c | 6 +++---
14
1 file changed, 4 insertions(+), 2 deletions(-)
24
1 file changed, 3 insertions(+), 3 deletions(-)
15
25
16
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
17
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/helper.c
28
--- a/target/arm/helper.c
19
+++ b/target/arm/helper.c
29
+++ b/target/arm/helper.c
20
@@ -XXX,XX +XXX,XX @@ static int aa64_va_parameter_tbi(uint64_t tcr, ARMMMUIdx mmu_idx)
30
@@ -XXX,XX +XXX,XX @@ static uint64_t tlbi_aa64_range_get_length(CPUARMState *env,
21
} else if (mmu_idx == ARMMMUIdx_Stage2) {
31
uint64_t exponent;
22
return 0; /* VTCR_EL2 */
32
uint64_t length;
23
} else {
33
24
- return extract32(tcr, 20, 1);
34
- num = extract64(value, 39, 4);
25
+ /* Replicate the single TBI bit so we always have 2 bits. */
35
+ num = extract64(value, 39, 5);
26
+ return extract32(tcr, 20, 1) * 3;
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);
44
return 0;
27
}
45
}
28
}
46
29
47
+ page_shift = (page_size_granule - 1) * 2 + 12;
30
@@ -XXX,XX +XXX,XX @@ static int aa64_va_parameter_tbid(uint64_t tcr, ARMMMUIdx mmu_idx)
48
+
31
} else if (mmu_idx == ARMMMUIdx_Stage2) {
49
exponent = (5 * scale) + 1;
32
return 0; /* VTCR_EL2 */
50
length = (num + 1) << (exponent + page_shift);
33
} else {
34
- return extract32(tcr, 29, 1);
35
+ /* Replicate the single TBID bit so we always have 2 bits. */
36
+ return extract32(tcr, 29, 1) * 3;
37
}
38
}
39
51
40
--
52
--
41
2.20.1
53
2.25.1
42
54
43
55
diff view generated by jsdifflib
1
From: Pan Nengyuan <pannengyuan@huawei.com>
1
From: Patrick Venture <venture@google.com>
2
2
3
There are some memleaks when we call 'device_list_properties'. This patch move timer_new from init into realize to fix it.
3
The rx_active boolean change to true should always trigger a try_read
4
call that flushes the queue.
4
5
5
Reported-by: Euler Robot <euler.robot@huawei.com>
6
Signed-off-by: Patrick Venture <venture@google.com>
6
Signed-off-by: Pan Nengyuan <pannengyuan@huawei.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20200227025055.14341-4-pannengyuan@huawei.com
8
Message-id: 20211203221002.1719306-1-venture@google.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
hw/arm/spitz.c | 8 +++++++-
11
hw/net/npcm7xx_emc.c | 18 ++++++++----------
12
1 file changed, 7 insertions(+), 1 deletion(-)
12
1 file changed, 8 insertions(+), 10 deletions(-)
13
13
14
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
14
diff --git a/hw/net/npcm7xx_emc.c b/hw/net/npcm7xx_emc.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/spitz.c
16
--- a/hw/net/npcm7xx_emc.c
17
+++ b/hw/arm/spitz.c
17
+++ b/hw/net/npcm7xx_emc.c
18
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_init(Object *obj)
18
@@ -XXX,XX +XXX,XX @@ static void emc_halt_rx(NPCM7xxEMCState *emc, uint32_t mista_flag)
19
19
emc_set_mista(emc, mista_flag);
20
spitz_keyboard_pre_map(s);
21
22
- s->kbdtimer = timer_new_ns(QEMU_CLOCK_VIRTUAL, spitz_keyboard_tick, s);
23
qdev_init_gpio_in(dev, spitz_keyboard_strobe, SPITZ_KEY_STROBE_NUM);
24
qdev_init_gpio_out(dev, s->sense, SPITZ_KEY_SENSE_NUM);
25
}
20
}
26
21
27
+static void spitz_keyboard_realize(DeviceState *dev, Error **errp)
22
+static void emc_enable_rx_and_flush(NPCM7xxEMCState *emc)
28
+{
23
+{
29
+ SpitzKeyboardState *s = SPITZ_KEYBOARD(dev);
24
+ emc->rx_active = true;
30
+ s->kbdtimer = timer_new_ns(QEMU_CLOCK_VIRTUAL, spitz_keyboard_tick, s);
25
+ qemu_flush_queued_packets(qemu_get_queue(emc->nic));
31
+}
26
+}
32
+
27
+
33
/* LCD backlight controller */
28
static void emc_set_next_tx_descriptor(NPCM7xxEMCState *emc,
34
29
const NPCM7xxEMCTxDesc *tx_desc,
35
#define LCDTG_RESCTL    0x00
30
uint32_t desc_addr)
36
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_class_init(ObjectClass *klass, void *data)
31
@@ -XXX,XX +XXX,XX @@ static ssize_t emc_receive(NetClientState *nc, const uint8_t *buf, size_t len1)
37
DeviceClass *dc = DEVICE_CLASS(klass);
32
return len;
38
39
dc->vmsd = &vmstate_spitz_kbd;
40
+ dc->realize = spitz_keyboard_realize;
41
}
33
}
42
34
43
static const TypeInfo spitz_keyboard_info = {
35
-static void emc_try_receive_next_packet(NPCM7xxEMCState *emc)
36
-{
37
- if (emc_can_receive(qemu_get_queue(emc->nic))) {
38
- qemu_flush_queued_packets(qemu_get_queue(emc->nic));
39
- }
40
-}
41
-
42
static uint64_t npcm7xx_emc_read(void *opaque, hwaddr offset, unsigned size)
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:
44
--
64
--
45
2.20.1
65
2.25.1
46
66
47
67
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
The smmu_find_smmu_pcibus() function was introduced (in commit
3
When a virtio-iommu is instantiated, describe it using the ACPI VIOT
4
cac994ef43b) in a code format that could return an incorrect
4
table.
5
pointer, which was then fixed by the previous commit.
6
We could have avoided this by writing the if() statement
7
differently. Do it now, in case this function is re-used.
8
The code is easier to review (harder to miss bugs).
9
5
10
Acked-by: Eric Auger <eric.auger@redhat.com>
6
Acked-by: Igor Mammedov <imammedo@redhat.com>
11
Reviewed-by: Peter Xu <peterx@redhat.com>
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
12
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
9
Message-id: 20211210170415.583179-2-jean-philippe@linaro.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
11
---
15
hw/arm/smmu-common.c | 25 +++++++++++++------------
12
hw/arm/virt-acpi-build.c | 7 +++++++
16
1 file changed, 13 insertions(+), 12 deletions(-)
13
hw/arm/Kconfig | 1 +
14
2 files changed, 8 insertions(+)
17
15
18
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
16
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
19
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/smmu-common.c
18
--- a/hw/arm/virt-acpi-build.c
21
+++ b/hw/arm/smmu-common.c
19
+++ b/hw/arm/virt-acpi-build.c
22
@@ -XXX,XX +XXX,XX @@ inline int smmu_ptw(SMMUTransCfg *cfg, dma_addr_t iova, IOMMUAccessFlags perm,
20
@@ -XXX,XX +XXX,XX @@
23
SMMUPciBus *smmu_find_smmu_pcibus(SMMUState *s, uint8_t bus_num)
21
#include "kvm_arm.h"
24
{
22
#include "migration/vmstate.h"
25
SMMUPciBus *smmu_pci_bus = s->smmu_pcibus_by_bus_num[bus_num];
23
#include "hw/acpi/ghes.h"
26
+ GHashTableIter iter;
24
+#include "hw/acpi/viot.h"
27
25
28
- if (!smmu_pci_bus) {
26
#define ARM_SPI_BASE 32
29
- GHashTableIter iter;
27
30
-
28
@@ -XXX,XX +XXX,XX @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
31
- g_hash_table_iter_init(&iter, s->smmu_pcibus_by_busptr);
32
- while (g_hash_table_iter_next(&iter, NULL, (void **)&smmu_pci_bus)) {
33
- if (pci_bus_num(smmu_pci_bus->bus) == bus_num) {
34
- s->smmu_pcibus_by_bus_num[bus_num] = smmu_pci_bus;
35
- return smmu_pci_bus;
36
- }
37
- }
38
- smmu_pci_bus = NULL;
39
+ if (smmu_pci_bus) {
40
+ return smmu_pci_bus;
41
}
29
}
42
- return smmu_pci_bus;
30
#endif
43
+
31
44
+ g_hash_table_iter_init(&iter, s->smmu_pcibus_by_busptr);
32
+ if (vms->iommu == VIRT_IOMMU_VIRTIO) {
45
+ while (g_hash_table_iter_next(&iter, NULL, (void **)&smmu_pci_bus)) {
33
+ acpi_add_table(table_offsets, tables_blob);
46
+ if (pci_bus_num(smmu_pci_bus->bus) == bus_num) {
34
+ build_viot(ms, tables_blob, tables->linker, vms->virtio_iommu_bdf,
47
+ s->smmu_pcibus_by_bus_num[bus_num] = smmu_pci_bus;
35
+ vms->oem_id, vms->oem_table_id);
48
+ return smmu_pci_bus;
49
+ }
50
+ }
36
+ }
51
+
37
+
52
+ return NULL;
38
/* XSDT is pointed to by RSDP */
53
}
39
xsdt = tables_blob->len;
54
40
build_xsdt(tables_blob, tables->linker, table_offsets, vms->oem_id,
55
static AddressSpace *smmu_find_add_as(PCIBus *bus, void *opaque, int devfn)
41
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
42
index XXXXXXX..XXXXXXX 100644
43
--- a/hw/arm/Kconfig
44
+++ b/hw/arm/Kconfig
45
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
46
select DIMM
47
select ACPI_HW_REDUCED
48
select ACPI_APEI
49
+ select ACPI_VIOT
50
51
config CHEETAH
52
bool
56
--
53
--
57
2.20.1
54
2.25.1
58
55
59
56
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
This bit traps EL1 access to the auxiliary control registers.
3
virtio-iommu is now supported with ACPI VIOT as well as device tree.
4
Remove the restriction that prevents from instantiating a virtio-iommu
5
device under ACPI.
4
6
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Acked-by: Igor Mammedov <imammedo@redhat.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
7
Message-id: 20200229012811.24129-9-richard.henderson@linaro.org
9
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
10
Message-id: 20211210170415.583179-3-jean-philippe@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
12
---
10
target/arm/helper.c | 18 ++++++++++++++----
13
hw/arm/virt.c | 10 ++--------
11
1 file changed, 14 insertions(+), 4 deletions(-)
14
hw/virtio/virtio-iommu-pci.c | 12 ++----------
15
2 files changed, 4 insertions(+), 18 deletions(-)
12
16
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
19
--- a/hw/arm/virt.c
16
+++ b/target/arm/helper.c
20
+++ b/hw/arm/virt.c
17
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tsw(CPUARMState *env, const ARMCPRegInfo *ri,
21
@@ -XXX,XX +XXX,XX @@ static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
18
return CP_ACCESS_OK;
22
MachineClass *mc = MACHINE_GET_CLASS(machine);
23
24
if (device_is_dynamic_sysbus(mc, dev) ||
25
- (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM))) {
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;
19
}
38
}
20
39
21
+/* Check for traps from EL1 due to HCR_EL2.TACR. */
40
diff --git a/hw/virtio/virtio-iommu-pci.c b/hw/virtio/virtio-iommu-pci.c
22
+static CPAccessResult access_tacr(CPUARMState *env, const ARMCPRegInfo *ri,
41
index XXXXXXX..XXXXXXX 100644
23
+ bool isread)
42
--- a/hw/virtio/virtio-iommu-pci.c
24
+{
43
+++ b/hw/virtio/virtio-iommu-pci.c
25
+ if (arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_TACR)) {
44
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
26
+ return CP_ACCESS_TRAP_EL2;
45
VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
27
+ }
46
28
+ return CP_ACCESS_OK;
47
if (!qdev_get_machine_hotplug_handler(DEVICE(vpci_dev))) {
29
+}
48
- MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
30
+
49
-
31
static void dacr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
50
- error_setg(errp,
32
{
51
- "%s machine fails to create iommu-map device tree bindings",
33
ARMCPU *cpu = env_archcpu(env);
52
- mc->name);
34
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo ats1cp_reginfo[] = {
53
- error_append_hint(errp,
35
static const ARMCPRegInfo actlr2_hactlr2_reginfo[] = {
54
- "Check your machine implements a hotplug handler "
36
{ .name = "ACTLR2", .state = ARM_CP_STATE_AA32,
55
- "for the virtio-iommu-pci device\n");
37
.cp = 15, .opc1 = 0, .crn = 1, .crm = 0, .opc2 = 3,
56
- error_append_hint(errp, "Check the guest is booted without FW or with "
38
- .access = PL1_RW, .type = ARM_CP_CONST,
57
- "-no-acpi\n");
39
- .resetvalue = 0 },
58
+ error_setg(errp, "Check your machine implements a hotplug handler "
40
+ .access = PL1_RW, .accessfn = access_tacr,
59
+ "for the virtio-iommu-pci device");
41
+ .type = ARM_CP_CONST, .resetvalue = 0 },
60
return;
42
{ .name = "HACTLR2", .state = ARM_CP_STATE_AA32,
61
}
43
.cp = 15, .opc1 = 4, .crn = 1, .crm = 0, .opc2 = 3,
62
for (int i = 0; i < s->nb_reserved_regions; i++) {
44
.access = PL2_RW, .type = ARM_CP_CONST,
45
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
46
ARMCPRegInfo auxcr_reginfo[] = {
47
{ .name = "ACTLR_EL1", .state = ARM_CP_STATE_BOTH,
48
.opc0 = 3, .opc1 = 0, .crn = 1, .crm = 0, .opc2 = 1,
49
- .access = PL1_RW, .type = ARM_CP_CONST,
50
- .resetvalue = cpu->reset_auxcr },
51
+ .access = PL1_RW, .accessfn = access_tacr,
52
+ .type = ARM_CP_CONST, .resetvalue = cpu->reset_auxcr },
53
{ .name = "ACTLR_EL2", .state = ARM_CP_STATE_BOTH,
54
.opc0 = 3, .opc1 = 4, .crn = 1, .crm = 0, .opc2 = 1,
55
.access = PL2_RW, .type = ARM_CP_CONST,
56
--
63
--
57
2.20.1
64
2.25.1
58
65
59
66
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
These bits trap EL1 access to set/way cache maintenance insns.
3
We do not support instantiating multiple IOMMUs. Before adding a
4
virtio-iommu, check that no other IOMMU is present. This will detect
5
both "iommu=smmuv3" machine parameter and another virtio-iommu instance.
4
6
5
Buglink: https://bugs.launchpad.net/bugs/1863685
7
Fixes: 70e89132c9 ("hw/arm/virt: Add the virtio-iommu device tree mappings")
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
8
Message-id: 20200229012811.24129-8-richard.henderson@linaro.org
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
11
Message-id: 20211210170415.583179-4-jean-philippe@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
13
---
11
target/arm/helper.c | 22 ++++++++++++++++------
14
hw/arm/virt.c | 5 +++++
12
1 file changed, 16 insertions(+), 6 deletions(-)
15
1 file changed, 5 insertions(+)
13
16
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
19
--- a/hw/arm/virt.c
17
+++ b/target/arm/helper.c
20
+++ b/hw/arm/virt.c
18
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tvm_trvm(CPUARMState *env, const ARMCPRegInfo *ri,
21
@@ -XXX,XX +XXX,XX @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
19
return CP_ACCESS_OK;
22
hwaddr db_start = 0, db_end = 0;
20
}
23
char *resv_prop_str;
21
24
22
+/* Check for traps from EL1 due to HCR_EL2.TSW. */
25
+ if (vms->iommu != VIRT_IOMMU_NONE) {
23
+static CPAccessResult access_tsw(CPUARMState *env, const ARMCPRegInfo *ri,
26
+ error_setg(errp, "virt machine does not support multiple IOMMUs");
24
+ bool isread)
27
+ return;
25
+{
28
+ }
26
+ if (arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_TSW)) {
27
+ return CP_ACCESS_TRAP_EL2;
28
+ }
29
+ return CP_ACCESS_OK;
30
+}
31
+
29
+
32
static void dacr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
30
switch (vms->msi_controller) {
33
{
31
case VIRT_MSI_CTRL_NONE:
34
ARMCPU *cpu = env_archcpu(env);
32
return;
35
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
36
.access = PL1_W, .type = ARM_CP_NOP },
37
{ .name = "DC_ISW", .state = ARM_CP_STATE_AA64,
38
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 2,
39
- .access = PL1_W, .type = ARM_CP_NOP },
40
+ .access = PL1_W, .accessfn = access_tsw, .type = ARM_CP_NOP },
41
{ .name = "DC_CVAC", .state = ARM_CP_STATE_AA64,
42
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 10, .opc2 = 1,
43
.access = PL0_W, .type = ARM_CP_NOP,
44
.accessfn = aa64_cacheop_access },
45
{ .name = "DC_CSW", .state = ARM_CP_STATE_AA64,
46
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 10, .opc2 = 2,
47
- .access = PL1_W, .type = ARM_CP_NOP },
48
+ .access = PL1_W, .accessfn = access_tsw, .type = ARM_CP_NOP },
49
{ .name = "DC_CVAU", .state = ARM_CP_STATE_AA64,
50
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 11, .opc2 = 1,
51
.access = PL0_W, .type = ARM_CP_NOP,
52
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
53
.accessfn = aa64_cacheop_access },
54
{ .name = "DC_CISW", .state = ARM_CP_STATE_AA64,
55
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 2,
56
- .access = PL1_W, .type = ARM_CP_NOP },
57
+ .access = PL1_W, .accessfn = access_tsw, .type = ARM_CP_NOP },
58
/* TLBI operations */
59
{ .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64,
60
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
61
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
62
{ .name = "DCIMVAC", .cp = 15, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 1,
63
.type = ARM_CP_NOP, .access = PL1_W },
64
{ .name = "DCISW", .cp = 15, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 2,
65
- .type = ARM_CP_NOP, .access = PL1_W },
66
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_tsw },
67
{ .name = "DCCMVAC", .cp = 15, .opc1 = 0, .crn = 7, .crm = 10, .opc2 = 1,
68
.type = ARM_CP_NOP, .access = PL1_W },
69
{ .name = "DCCSW", .cp = 15, .opc1 = 0, .crn = 7, .crm = 10, .opc2 = 2,
70
- .type = ARM_CP_NOP, .access = PL1_W },
71
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_tsw },
72
{ .name = "DCCMVAU", .cp = 15, .opc1 = 0, .crn = 7, .crm = 11, .opc2 = 1,
73
.type = ARM_CP_NOP, .access = PL1_W },
74
{ .name = "DCCIMVAC", .cp = 15, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 1,
75
.type = ARM_CP_NOP, .access = PL1_W },
76
{ .name = "DCCISW", .cp = 15, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 2,
77
- .type = ARM_CP_NOP, .access = PL1_W },
78
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_tsw },
79
/* MMU Domain access control / MPU write buffer control */
80
{ .name = "DACR", .cp = 15, .opc1 = 0, .crn = 3, .crm = 0, .opc2 = 0,
81
.access = PL1_RW, .accessfn = access_tvm_trvm, .resetvalue = 0,
82
--
33
--
83
2.20.1
34
2.25.1
84
35
85
36
diff view generated by jsdifflib
1
From: Eric Auger <eric.auger@redhat.com>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
Make sure a null SMMUPciBus is returned in case we were
3
To propagate errors to the caller of the pre_plug callback, use the
4
not able to identify a pci bus matching the @bus_num.
4
object_poperty_set*() functions directly instead of the qdev_prop_set*()
5
helpers.
5
6
6
This matches the fix done on intel iommu in commit:
7
Suggested-by: Igor Mammedov <imammedo@redhat.com>
7
a2e1cd41ccfe796529abfd1b6aeb1dd4393762a2
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
9
Signed-off-by: Eric Auger <eric.auger@redhat.com>
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
10
Reviewed-by: Peter Xu <peterx@redhat.com>
11
Message-id: 20211210170415.583179-5-jean-philippe@linaro.org
11
Message-Id: <20200226172628.17449-1-eric.auger@redhat.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
13
---
16
hw/arm/smmu-common.c | 1 +
14
hw/arm/virt.c | 5 +++--
17
1 file changed, 1 insertion(+)
15
1 file changed, 3 insertions(+), 2 deletions(-)
18
16
19
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
20
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/smmu-common.c
19
--- a/hw/arm/virt.c
22
+++ b/hw/arm/smmu-common.c
20
+++ b/hw/arm/virt.c
23
@@ -XXX,XX +XXX,XX @@ SMMUPciBus *smmu_find_smmu_pcibus(SMMUState *s, uint8_t bus_num)
21
@@ -XXX,XX +XXX,XX @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
24
return smmu_pci_bus;
22
db_start, db_end,
25
}
23
VIRTIO_IOMMU_RESV_MEM_T_MSI);
26
}
24
27
+ smmu_pci_bus = NULL;
25
- qdev_prop_set_uint32(dev, "len-reserved-regions", 1);
26
- qdev_prop_set_string(dev, "reserved-regions[0]", resv_prop_str);
27
+ object_property_set_uint(OBJECT(dev), "len-reserved-regions", 1, errp);
28
+ object_property_set_str(OBJECT(dev), "reserved-regions[0]",
29
+ resv_prop_str, errp);
30
g_free(resv_prop_str);
28
}
31
}
29
return smmu_pci_bus;
30
}
32
}
31
--
33
--
32
2.20.1
34
2.25.1
33
35
34
36
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
1
3
We only build the little-endian softmmu configurations. Checking
4
for big endian is pointless, remove the unused code.
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
hw/arm/mainstone.c | 8 +-------
11
1 file changed, 1 insertion(+), 7 deletions(-)
12
13
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/mainstone.c
16
+++ b/hw/arm/mainstone.c
17
@@ -XXX,XX +XXX,XX @@ static void mainstone_common_init(MemoryRegion *address_space_mem,
18
DeviceState *mst_irq;
19
DriveInfo *dinfo;
20
int i;
21
- int be;
22
MemoryRegion *rom = g_new(MemoryRegion, 1);
23
24
/* Setup CPU & memory */
25
@@ -XXX,XX +XXX,XX @@ static void mainstone_common_init(MemoryRegion *address_space_mem,
26
memory_region_set_readonly(rom, true);
27
memory_region_add_subregion(address_space_mem, 0, rom);
28
29
-#ifdef TARGET_WORDS_BIGENDIAN
30
- be = 1;
31
-#else
32
- be = 0;
33
-#endif
34
/* There are two 32MiB flash devices on the board */
35
for (i = 0; i < 2; i ++) {
36
dinfo = drive_get(IF_PFLASH, 0, i);
37
@@ -XXX,XX +XXX,XX @@ static void mainstone_common_init(MemoryRegion *address_space_mem,
38
i ? "mainstone.flash1" : "mainstone.flash0",
39
MAINSTONE_FLASH,
40
dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
41
- sector_len, 4, 0, 0, 0, 0, be)) {
42
+ sector_len, 4, 0, 0, 0, 0, 0)) {
43
error_report("Error registering flash memory");
44
exit(1);
45
}
46
--
47
2.20.1
48
49
diff view generated by jsdifflib
Deleted patch
1
From: Pan Nengyuan <pannengyuan@huawei.com>
2
1
3
There are some memleaks when we call 'device_list_properties'. This patch move timer_new from init into realize to fix it.
4
5
Reported-by: Euler Robot <euler.robot@huawei.com>
6
Signed-off-by: Pan Nengyuan <pannengyuan@huawei.com>
7
Message-id: 20200227025055.14341-3-pannengyuan@huawei.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/pxa2xx.c | 17 +++++++++++------
12
1 file changed, 11 insertions(+), 6 deletions(-)
13
14
diff --git a/hw/arm/pxa2xx.c b/hw/arm/pxa2xx.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/pxa2xx.c
17
+++ b/hw/arm/pxa2xx.c
18
@@ -XXX,XX +XXX,XX @@ static void pxa2xx_rtc_init(Object *obj)
19
s->last_rtcpicr = 0;
20
s->last_hz = s->last_sw = s->last_pi = qemu_clock_get_ms(rtc_clock);
21
22
+ sysbus_init_irq(dev, &s->rtc_irq);
23
+
24
+ memory_region_init_io(&s->iomem, obj, &pxa2xx_rtc_ops, s,
25
+ "pxa2xx-rtc", 0x10000);
26
+ sysbus_init_mmio(dev, &s->iomem);
27
+}
28
+
29
+static void pxa2xx_rtc_realize(DeviceState *dev, Error **errp)
30
+{
31
+ PXA2xxRTCState *s = PXA2XX_RTC(dev);
32
s->rtc_hz = timer_new_ms(rtc_clock, pxa2xx_rtc_hz_tick, s);
33
s->rtc_rdal1 = timer_new_ms(rtc_clock, pxa2xx_rtc_rdal1_tick, s);
34
s->rtc_rdal2 = timer_new_ms(rtc_clock, pxa2xx_rtc_rdal2_tick, s);
35
s->rtc_swal1 = timer_new_ms(rtc_clock, pxa2xx_rtc_swal1_tick, s);
36
s->rtc_swal2 = timer_new_ms(rtc_clock, pxa2xx_rtc_swal2_tick, s);
37
s->rtc_pi = timer_new_ms(rtc_clock, pxa2xx_rtc_pi_tick, s);
38
-
39
- sysbus_init_irq(dev, &s->rtc_irq);
40
-
41
- memory_region_init_io(&s->iomem, obj, &pxa2xx_rtc_ops, s,
42
- "pxa2xx-rtc", 0x10000);
43
- sysbus_init_mmio(dev, &s->iomem);
44
}
45
46
static int pxa2xx_rtc_pre_save(void *opaque)
47
@@ -XXX,XX +XXX,XX @@ static void pxa2xx_rtc_sysbus_class_init(ObjectClass *klass, void *data)
48
49
dc->desc = "PXA2xx RTC Controller";
50
dc->vmsd = &vmstate_pxa2xx_rtc_regs;
51
+ dc->realize = pxa2xx_rtc_realize;
52
}
53
54
static const TypeInfo pxa2xx_rtc_sysbus_info = {
55
--
56
2.20.1
57
58
diff view generated by jsdifflib
Deleted patch
1
From: Pan Nengyuan <pannengyuan@huawei.com>
2
1
3
There are some memleaks when we call 'device_list_properties'. This patch move timer_new from init into realize to fix it.
4
5
Reported-by: Euler Robot <euler.robot@huawei.com>
6
Signed-off-by: Pan Nengyuan <pannengyuan@huawei.com>
7
Message-id: 20200227025055.14341-5-pannengyuan@huawei.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/strongarm.c | 18 ++++++++++++------
12
1 file changed, 12 insertions(+), 6 deletions(-)
13
14
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/strongarm.c
17
+++ b/hw/arm/strongarm.c
18
@@ -XXX,XX +XXX,XX @@ static void strongarm_rtc_init(Object *obj)
19
s->last_rcnr = (uint32_t) mktimegm(&tm);
20
s->last_hz = qemu_clock_get_ms(rtc_clock);
21
22
- s->rtc_alarm = timer_new_ms(rtc_clock, strongarm_rtc_alarm_tick, s);
23
- s->rtc_hz = timer_new_ms(rtc_clock, strongarm_rtc_hz_tick, s);
24
-
25
sysbus_init_irq(dev, &s->rtc_irq);
26
sysbus_init_irq(dev, &s->rtc_hz_irq);
27
28
@@ -XXX,XX +XXX,XX @@ static void strongarm_rtc_init(Object *obj)
29
sysbus_init_mmio(dev, &s->iomem);
30
}
31
32
+static void strongarm_rtc_realize(DeviceState *dev, Error **errp)
33
+{
34
+ StrongARMRTCState *s = STRONGARM_RTC(dev);
35
+ s->rtc_alarm = timer_new_ms(rtc_clock, strongarm_rtc_alarm_tick, s);
36
+ s->rtc_hz = timer_new_ms(rtc_clock, strongarm_rtc_hz_tick, s);
37
+}
38
+
39
static int strongarm_rtc_pre_save(void *opaque)
40
{
41
StrongARMRTCState *s = opaque;
42
@@ -XXX,XX +XXX,XX @@ static void strongarm_rtc_sysbus_class_init(ObjectClass *klass, void *data)
43
44
dc->desc = "StrongARM RTC Controller";
45
dc->vmsd = &vmstate_strongarm_rtc_regs;
46
+ dc->realize = strongarm_rtc_realize;
47
}
48
49
static const TypeInfo strongarm_rtc_sysbus_info = {
50
@@ -XXX,XX +XXX,XX @@ static void strongarm_uart_init(Object *obj)
51
"uart", 0x10000);
52
sysbus_init_mmio(dev, &s->iomem);
53
sysbus_init_irq(dev, &s->irq);
54
-
55
- s->rx_timeout_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, strongarm_uart_rx_to, s);
56
- s->tx_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, strongarm_uart_tx, s);
57
}
58
59
static void strongarm_uart_realize(DeviceState *dev, Error **errp)
60
{
61
StrongARMUARTState *s = STRONGARM_UART(dev);
62
63
+ s->rx_timeout_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
64
+ strongarm_uart_rx_to,
65
+ s);
66
+ s->tx_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, strongarm_uart_tx, s);
67
qemu_chr_fe_set_handlers(&s->chr,
68
strongarm_uart_can_receive,
69
strongarm_uart_receive,
70
--
71
2.20.1
72
73
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
These bits trap EL1 access to various virtual memory controls.
3
Create empty data files and allow updates for the upcoming VIOT tests.
4
4
5
Buglink: https://bugs.launchpad.net/bugs/1855072
5
Acked-by: Igor Mammedov <imammedo@redhat.com>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Eric Auger <eric.auger@redhat.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
8
Message-id: 20200229012811.24129-7-richard.henderson@linaro.org
8
Message-id: 20211210170415.583179-6-jean-philippe@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/helper.c | 82 ++++++++++++++++++++++++++++++---------------
11
tests/qtest/bios-tables-test-allowed-diff.h | 3 +++
12
1 file changed, 55 insertions(+), 27 deletions(-)
12
tests/data/acpi/q35/DSDT.viot | 0
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/helper.c b/target/arm/helper.c
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/helper.c
22
--- a/tests/qtest/bios-tables-test-allowed-diff.h
17
+++ b/target/arm/helper.c
23
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
18
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tpm(CPUARMState *env, const ARMCPRegInfo *ri,
24
@@ -1 +1,4 @@
19
return CP_ACCESS_OK;
25
/* List of comma-separated changed AML files to ignore */
20
}
26
+"tests/data/acpi/virt/VIOT",
21
27
+"tests/data/acpi/q35/DSDT.viot",
22
+/* Check for traps from EL1 due to HCR_EL2.TVM and HCR_EL2.TRVM. */
28
+"tests/data/acpi/q35/VIOT.viot",
23
+static CPAccessResult access_tvm_trvm(CPUARMState *env, const ARMCPRegInfo *ri,
29
diff --git a/tests/data/acpi/q35/DSDT.viot b/tests/data/acpi/q35/DSDT.viot
24
+ bool isread)
30
new file mode 100644
25
+{
31
index XXXXXXX..XXXXXXX
26
+ if (arm_current_el(env) == 1) {
32
diff --git a/tests/data/acpi/q35/VIOT.viot b/tests/data/acpi/q35/VIOT.viot
27
+ uint64_t trap = isread ? HCR_TRVM : HCR_TVM;
33
new file mode 100644
28
+ if (arm_hcr_el2_eff(env) & trap) {
34
index XXXXXXX..XXXXXXX
29
+ return CP_ACCESS_TRAP_EL2;
35
diff --git a/tests/data/acpi/virt/VIOT b/tests/data/acpi/virt/VIOT
30
+ }
36
new file mode 100644
31
+ }
37
index XXXXXXX..XXXXXXX
32
+ return CP_ACCESS_OK;
33
+}
34
+
35
static void dacr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
36
{
37
ARMCPU *cpu = env_archcpu(env);
38
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo cp_reginfo[] = {
39
*/
40
{ .name = "CONTEXTIDR_EL1", .state = ARM_CP_STATE_BOTH,
41
.opc0 = 3, .opc1 = 0, .crn = 13, .crm = 0, .opc2 = 1,
42
- .access = PL1_RW, .secure = ARM_CP_SECSTATE_NS,
43
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
44
+ .secure = ARM_CP_SECSTATE_NS,
45
.fieldoffset = offsetof(CPUARMState, cp15.contextidr_el[1]),
46
.resetvalue = 0, .writefn = contextidr_write, .raw_writefn = raw_write, },
47
{ .name = "CONTEXTIDR_S", .state = ARM_CP_STATE_AA32,
48
.cp = 15, .opc1 = 0, .crn = 13, .crm = 0, .opc2 = 1,
49
- .access = PL1_RW, .secure = ARM_CP_SECSTATE_S,
50
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
51
+ .secure = ARM_CP_SECSTATE_S,
52
.fieldoffset = offsetof(CPUARMState, cp15.contextidr_s),
53
.resetvalue = 0, .writefn = contextidr_write, .raw_writefn = raw_write, },
54
REGINFO_SENTINEL
55
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo not_v8_cp_reginfo[] = {
56
/* MMU Domain access control / MPU write buffer control */
57
{ .name = "DACR",
58
.cp = 15, .opc1 = CP_ANY, .crn = 3, .crm = CP_ANY, .opc2 = CP_ANY,
59
- .access = PL1_RW, .resetvalue = 0,
60
+ .access = PL1_RW, .accessfn = access_tvm_trvm, .resetvalue = 0,
61
.writefn = dacr_write, .raw_writefn = raw_write,
62
.bank_fieldoffsets = { offsetoflow32(CPUARMState, cp15.dacr_s),
63
offsetoflow32(CPUARMState, cp15.dacr_ns) } },
64
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
65
{ .name = "DMB", .cp = 15, .crn = 7, .crm = 10, .opc1 = 0, .opc2 = 5,
66
.access = PL0_W, .type = ARM_CP_NOP },
67
{ .name = "IFAR", .cp = 15, .crn = 6, .crm = 0, .opc1 = 0, .opc2 = 2,
68
- .access = PL1_RW,
69
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
70
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.ifar_s),
71
offsetof(CPUARMState, cp15.ifar_ns) },
72
.resetvalue = 0, },
73
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
74
*/
75
{ .name = "AFSR0_EL1", .state = ARM_CP_STATE_BOTH,
76
.opc0 = 3, .opc1 = 0, .crn = 5, .crm = 1, .opc2 = 0,
77
- .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
78
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
79
+ .type = ARM_CP_CONST, .resetvalue = 0 },
80
{ .name = "AFSR1_EL1", .state = ARM_CP_STATE_BOTH,
81
.opc0 = 3, .opc1 = 0, .crn = 5, .crm = 1, .opc2 = 1,
82
- .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
83
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
84
+ .type = ARM_CP_CONST, .resetvalue = 0 },
85
/* MAIR can just read-as-written because we don't implement caches
86
* and so don't need to care about memory attributes.
87
*/
88
{ .name = "MAIR_EL1", .state = ARM_CP_STATE_AA64,
89
.opc0 = 3, .opc1 = 0, .crn = 10, .crm = 2, .opc2 = 0,
90
- .access = PL1_RW, .fieldoffset = offsetof(CPUARMState, cp15.mair_el[1]),
91
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
92
+ .fieldoffset = offsetof(CPUARMState, cp15.mair_el[1]),
93
.resetvalue = 0 },
94
{ .name = "MAIR_EL3", .state = ARM_CP_STATE_AA64,
95
.opc0 = 3, .opc1 = 6, .crn = 10, .crm = 2, .opc2 = 0,
96
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
97
* handled in the field definitions.
98
*/
99
{ .name = "MAIR0", .state = ARM_CP_STATE_AA32,
100
- .cp = 15, .opc1 = 0, .crn = 10, .crm = 2, .opc2 = 0, .access = PL1_RW,
101
+ .cp = 15, .opc1 = 0, .crn = 10, .crm = 2, .opc2 = 0,
102
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
103
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.mair0_s),
104
offsetof(CPUARMState, cp15.mair0_ns) },
105
.resetfn = arm_cp_reset_ignore },
106
{ .name = "MAIR1", .state = ARM_CP_STATE_AA32,
107
- .cp = 15, .opc1 = 0, .crn = 10, .crm = 2, .opc2 = 1, .access = PL1_RW,
108
+ .cp = 15, .opc1 = 0, .crn = 10, .crm = 2, .opc2 = 1,
109
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
110
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.mair1_s),
111
offsetof(CPUARMState, cp15.mair1_ns) },
112
.resetfn = arm_cp_reset_ignore },
113
@@ -XXX,XX +XXX,XX @@ static void vttbr_write(CPUARMState *env, const ARMCPRegInfo *ri,
114
115
static const ARMCPRegInfo vmsa_pmsa_cp_reginfo[] = {
116
{ .name = "DFSR", .cp = 15, .crn = 5, .crm = 0, .opc1 = 0, .opc2 = 0,
117
- .access = PL1_RW, .type = ARM_CP_ALIAS,
118
+ .access = PL1_RW, .accessfn = access_tvm_trvm, .type = ARM_CP_ALIAS,
119
.bank_fieldoffsets = { offsetoflow32(CPUARMState, cp15.dfsr_s),
120
offsetoflow32(CPUARMState, cp15.dfsr_ns) }, },
121
{ .name = "IFSR", .cp = 15, .crn = 5, .crm = 0, .opc1 = 0, .opc2 = 1,
122
- .access = PL1_RW, .resetvalue = 0,
123
+ .access = PL1_RW, .accessfn = access_tvm_trvm, .resetvalue = 0,
124
.bank_fieldoffsets = { offsetoflow32(CPUARMState, cp15.ifsr_s),
125
offsetoflow32(CPUARMState, cp15.ifsr_ns) } },
126
{ .name = "DFAR", .cp = 15, .opc1 = 0, .crn = 6, .crm = 0, .opc2 = 0,
127
- .access = PL1_RW, .resetvalue = 0,
128
+ .access = PL1_RW, .accessfn = access_tvm_trvm, .resetvalue = 0,
129
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.dfar_s),
130
offsetof(CPUARMState, cp15.dfar_ns) } },
131
{ .name = "FAR_EL1", .state = ARM_CP_STATE_AA64,
132
.opc0 = 3, .crn = 6, .crm = 0, .opc1 = 0, .opc2 = 0,
133
- .access = PL1_RW, .fieldoffset = offsetof(CPUARMState, cp15.far_el[1]),
134
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
135
+ .fieldoffset = offsetof(CPUARMState, cp15.far_el[1]),
136
.resetvalue = 0, },
137
REGINFO_SENTINEL
138
};
139
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo vmsa_pmsa_cp_reginfo[] = {
140
static const ARMCPRegInfo vmsa_cp_reginfo[] = {
141
{ .name = "ESR_EL1", .state = ARM_CP_STATE_AA64,
142
.opc0 = 3, .crn = 5, .crm = 2, .opc1 = 0, .opc2 = 0,
143
- .access = PL1_RW,
144
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
145
.fieldoffset = offsetof(CPUARMState, cp15.esr_el[1]), .resetvalue = 0, },
146
{ .name = "TTBR0_EL1", .state = ARM_CP_STATE_BOTH,
147
.opc0 = 3, .opc1 = 0, .crn = 2, .crm = 0, .opc2 = 0,
148
- .access = PL1_RW, .writefn = vmsa_ttbr_write, .resetvalue = 0,
149
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
150
+ .writefn = vmsa_ttbr_write, .resetvalue = 0,
151
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.ttbr0_s),
152
offsetof(CPUARMState, cp15.ttbr0_ns) } },
153
{ .name = "TTBR1_EL1", .state = ARM_CP_STATE_BOTH,
154
.opc0 = 3, .opc1 = 0, .crn = 2, .crm = 0, .opc2 = 1,
155
- .access = PL1_RW, .writefn = vmsa_ttbr_write, .resetvalue = 0,
156
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
157
+ .writefn = vmsa_ttbr_write, .resetvalue = 0,
158
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.ttbr1_s),
159
offsetof(CPUARMState, cp15.ttbr1_ns) } },
160
{ .name = "TCR_EL1", .state = ARM_CP_STATE_AA64,
161
.opc0 = 3, .crn = 2, .crm = 0, .opc1 = 0, .opc2 = 2,
162
- .access = PL1_RW, .writefn = vmsa_tcr_el12_write,
163
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
164
+ .writefn = vmsa_tcr_el12_write,
165
.resetfn = vmsa_ttbcr_reset, .raw_writefn = raw_write,
166
.fieldoffset = offsetof(CPUARMState, cp15.tcr_el[1]) },
167
{ .name = "TTBCR", .cp = 15, .crn = 2, .crm = 0, .opc1 = 0, .opc2 = 2,
168
- .access = PL1_RW, .type = ARM_CP_ALIAS, .writefn = vmsa_ttbcr_write,
169
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
170
+ .type = ARM_CP_ALIAS, .writefn = vmsa_ttbcr_write,
171
.raw_writefn = vmsa_ttbcr_raw_write,
172
.bank_fieldoffsets = { offsetoflow32(CPUARMState, cp15.tcr_el[3]),
173
offsetoflow32(CPUARMState, cp15.tcr_el[1])} },
174
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo vmsa_cp_reginfo[] = {
175
*/
176
static const ARMCPRegInfo ttbcr2_reginfo = {
177
.name = "TTBCR2", .cp = 15, .opc1 = 0, .crn = 2, .crm = 0, .opc2 = 3,
178
- .access = PL1_RW, .type = ARM_CP_ALIAS,
179
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
180
+ .type = ARM_CP_ALIAS,
181
.bank_fieldoffsets = { offsetofhigh32(CPUARMState, cp15.tcr_el[3]),
182
offsetofhigh32(CPUARMState, cp15.tcr_el[1]) },
183
};
184
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo lpae_cp_reginfo[] = {
185
/* NOP AMAIR0/1 */
186
{ .name = "AMAIR0", .state = ARM_CP_STATE_BOTH,
187
.opc0 = 3, .crn = 10, .crm = 3, .opc1 = 0, .opc2 = 0,
188
- .access = PL1_RW, .type = ARM_CP_CONST,
189
- .resetvalue = 0 },
190
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
191
+ .type = ARM_CP_CONST, .resetvalue = 0 },
192
/* AMAIR1 is mapped to AMAIR_EL1[63:32] */
193
{ .name = "AMAIR1", .cp = 15, .crn = 10, .crm = 3, .opc1 = 0, .opc2 = 1,
194
- .access = PL1_RW, .type = ARM_CP_CONST,
195
- .resetvalue = 0 },
196
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
197
+ .type = ARM_CP_CONST, .resetvalue = 0 },
198
{ .name = "PAR", .cp = 15, .crm = 7, .opc1 = 0,
199
.access = PL1_RW, .type = ARM_CP_64BIT, .resetvalue = 0,
200
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.par_s),
201
offsetof(CPUARMState, cp15.par_ns)} },
202
{ .name = "TTBR0", .cp = 15, .crm = 2, .opc1 = 0,
203
- .access = PL1_RW, .type = ARM_CP_64BIT | ARM_CP_ALIAS,
204
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
205
+ .type = ARM_CP_64BIT | ARM_CP_ALIAS,
206
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.ttbr0_s),
207
offsetof(CPUARMState, cp15.ttbr0_ns) },
208
.writefn = vmsa_ttbr_write, },
209
{ .name = "TTBR1", .cp = 15, .crm = 2, .opc1 = 1,
210
- .access = PL1_RW, .type = ARM_CP_64BIT | ARM_CP_ALIAS,
211
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
212
+ .type = ARM_CP_64BIT | ARM_CP_ALIAS,
213
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.ttbr1_s),
214
offsetof(CPUARMState, cp15.ttbr1_ns) },
215
.writefn = vmsa_ttbr_write, },
216
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
217
.type = ARM_CP_NOP, .access = PL1_W },
218
/* MMU Domain access control / MPU write buffer control */
219
{ .name = "DACR", .cp = 15, .opc1 = 0, .crn = 3, .crm = 0, .opc2 = 0,
220
- .access = PL1_RW, .resetvalue = 0,
221
+ .access = PL1_RW, .accessfn = access_tvm_trvm, .resetvalue = 0,
222
.writefn = dacr_write, .raw_writefn = raw_write,
223
.bank_fieldoffsets = { offsetoflow32(CPUARMState, cp15.dacr_s),
224
offsetoflow32(CPUARMState, cp15.dacr_ns) } },
225
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
226
ARMCPRegInfo sctlr = {
227
.name = "SCTLR", .state = ARM_CP_STATE_BOTH,
228
.opc0 = 3, .opc1 = 0, .crn = 1, .crm = 0, .opc2 = 0,
229
- .access = PL1_RW,
230
+ .access = PL1_RW, .accessfn = access_tvm_trvm,
231
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.sctlr_s),
232
offsetof(CPUARMState, cp15.sctlr_ns) },
233
.writefn = sctlr_write, .resetvalue = cpu->reset_sctlr,
234
--
38
--
235
2.20.1
39
2.25.1
236
40
237
41
diff view generated by jsdifflib
1
From: Pan Nengyuan <pannengyuan@huawei.com>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
There are some memleaks when we call 'device_list_properties'. This patch move timer_new from init into realize to fix it.
3
Add two test cases for VIOT, one on the q35 machine and the other on
4
virt. To test complex topologies the q35 test has two PCIe buses that
5
bypass the IOMMU (and are therefore not described by VIOT), and two
6
buses that are translated by virtio-iommu.
4
7
5
Reported-by: Euler Robot <euler.robot@huawei.com>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
6
Signed-off-by: Pan Nengyuan <pannengyuan@huawei.com>
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
8
Message-id: 20200227025055.14341-7-pannengyuan@huawei.com
11
Message-id: 20211210170415.583179-7-jean-philippe@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
13
---
12
hw/timer/cadence_ttc.c | 18 ++++++++++++------
14
tests/qtest/bios-tables-test.c | 38 ++++++++++++++++++++++++++++++++++
13
1 file changed, 12 insertions(+), 6 deletions(-)
15
1 file changed, 38 insertions(+)
14
16
15
diff --git a/hw/timer/cadence_ttc.c b/hw/timer/cadence_ttc.c
17
diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/timer/cadence_ttc.c
19
--- a/tests/qtest/bios-tables-test.c
18
+++ b/hw/timer/cadence_ttc.c
20
+++ b/tests/qtest/bios-tables-test.c
19
@@ -XXX,XX +XXX,XX @@ static void cadence_timer_init(uint32_t freq, CadenceTimerState *s)
21
@@ -XXX,XX +XXX,XX @@ static void test_acpi_virt_tcg(void)
20
static void cadence_ttc_init(Object *obj)
22
free_test_data(&data);
21
{
22
CadenceTTCState *s = CADENCE_TTC(obj);
23
- int i;
24
-
25
- for (i = 0; i < 3; ++i) {
26
- cadence_timer_init(133000000, &s->timer[i]);
27
- sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->timer[i].irq);
28
- }
29
30
memory_region_init_io(&s->iomem, obj, &cadence_ttc_ops, s,
31
"timer", 0x1000);
32
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);
33
}
23
}
34
24
35
+static void cadence_ttc_realize(DeviceState *dev, Error **errp)
25
+static void test_acpi_q35_viot(void)
36
+{
26
+{
37
+ CadenceTTCState *s = CADENCE_TTC(dev);
27
+ test_data data = {
38
+ int i;
28
+ .machine = MACHINE_Q35,
29
+ .variant = ".viot",
30
+ };
39
+
31
+
40
+ for (i = 0; i < 3; ++i) {
32
+ /*
41
+ cadence_timer_init(133000000, &s->timer[i]);
33
+ * To keep things interesting, two buses bypass the IOMMU.
42
+ sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->timer[i].irq);
34
+ * VIOT should only describes the other two buses.
43
+ }
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);
44
+}
43
+}
45
+
44
+
46
static int cadence_timer_pre_save(void *opaque)
45
+static void test_acpi_virt_viot(void)
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)
47
{
62
{
48
cadence_timer_sync((CadenceTimerState *)opaque);
63
int i;
49
@@ -XXX,XX +XXX,XX @@ static void cadence_ttc_class_init(ObjectClass *klass, void *data)
64
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
50
DeviceClass *dc = DEVICE_CLASS(klass);
65
qtest_add_func("acpi/q35/kvm/xapic", test_acpi_q35_kvm_xapic);
51
66
qtest_add_func("acpi/q35/kvm/dmar", test_acpi_q35_kvm_dmar);
52
dc->vmsd = &vmstate_cadence_ttc;
67
}
53
+ dc->realize = cadence_ttc_realize;
68
+ qtest_add_func("acpi/q35/viot", test_acpi_q35_viot);
54
}
69
} else if (strcmp(arch, "aarch64") == 0) {
55
70
if (has_tcg) {
56
static const TypeInfo cadence_ttc_info = {
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
}
78
}
79
ret = g_test_run();
57
--
80
--
58
2.20.1
81
2.25.1
59
82
60
83
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
We have disabled EL2 and EL3 for user-only, which means that these
3
Add expected blobs of the VIOT and DSDT table for the VIOT test on the
4
registers "don't exist" and should not be set.
4
q35 machine.
5
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Since the test instantiates a virtio device and two PCIe expander
7
Message-id: 20200229012811.24129-5-richard.henderson@linaro.org
7
bridges, DSDT.viot has more blocks than the base DSDT.
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
9
The VIOT table generated for the q35 test is:
10
11
[000h 0000 4] Signature : "VIOT" [Virtual I/O Translation Table]
12
[004h 0004 4] Table Length : 00000070
13
[008h 0008 1] Revision : 00
14
[009h 0009 1] Checksum : 3D
15
[00Ah 0010 6] Oem ID : "BOCHS "
16
[010h 0016 8] Oem Table ID : "BXPC "
17
[018h 0024 4] Oem Revision : 00000001
18
[01Ch 0028 4] Asl Compiler ID : "BXPC"
19
[020h 0032 4] Asl Compiler Revision : 00000001
20
21
[024h 0036 2] Node count : 0003
22
[026h 0038 2] Node offset : 0030
23
[028h 0040 8] Reserved : 0000000000000000
24
25
[030h 0048 1] Type : 03 [VirtIO-PCI IOMMU]
26
[031h 0049 1] Reserved : 00
27
[032h 0050 2] Length : 0010
28
29
[034h 0052 2] PCI Segment : 0000
30
[036h 0054 2] PCI BDF number : 0010
31
[038h 0056 8] Reserved : 0000000000000000
32
33
[040h 0064 1] Type : 01 [PCI Range]
34
[041h 0065 1] Reserved : 00
35
[042h 0066 2] Length : 0018
36
37
[044h 0068 4] Endpoint start : 00003000
38
[048h 0072 2] PCI Segment start : 0000
39
[04Ah 0074 2] PCI Segment end : 0000
40
[04Ch 0076 2] PCI BDF start : 3000
41
[04Eh 0078 2] PCI BDF end : 30FF
42
[050h 0080 2] Output node : 0030
43
[052h 0082 6] Reserved : 000000000000
44
45
[058h 0088 1] Type : 01 [PCI Range]
46
[059h 0089 1] Reserved : 00
47
[05Ah 0090 2] Length : 0018
48
49
[05Ch 0092 4] Endpoint start : 00001000
50
[060h 0096 2] PCI Segment start : 0000
51
[062h 0098 2] PCI Segment end : 0000
52
[064h 0100 2] PCI BDF start : 1000
53
[066h 0102 2] PCI BDF end : 10FF
54
[068h 0104 2] Output node : 0030
55
[06Ah 0106 6] Reserved : 000000000000
56
57
And the DSDT diff is:
58
59
@@ -XXX,XX +XXX,XX @@
60
*
61
* Disassembling to symbolic ASL+ operators
62
*
63
- * Disassembly of tests/data/acpi/q35/DSDT, Fri Dec 10 15:03:08 2021
64
+ * Disassembly of /tmp/aml-H9Y5D1, Fri Dec 10 15:02:27 2021
65
*
66
* Original Table Header:
67
* Signature "DSDT"
68
- * Length 0x00002061 (8289)
69
+ * Length 0x000024B6 (9398)
70
* Revision 0x01 **** 32-bit table (V1), no 64-bit math support
71
- * Checksum 0xFA
72
+ * Checksum 0xA7
73
* OEM ID "BOCHS "
74
* OEM Table ID "BXPC "
75
* OEM Revision 0x00000001 (1)
76
@@ -XXX,XX +XXX,XX @@
77
}
78
}
79
80
+ Scope (\_SB)
81
+ {
82
+ Device (PC30)
83
+ {
84
+ Name (_UID, 0x30) // _UID: Unique ID
85
+ Name (_BBN, 0x30) // _BBN: BIOS Bus Number
86
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
87
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
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
+ })
188
+ }
189
+ }
190
+
191
+ Scope (\_SB)
192
+ {
193
+ Device (PC20)
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
+ }
300
+ }
301
+
302
+ Scope (\_SB)
303
+ {
304
+ Device (PC10)
305
+ {
306
+ Name (_UID, 0x10) // _UID: Unique ID
307
+ Name (_BBN, 0x10) // _BBN: BIOS Bus Number
308
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
309
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
310
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
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
+ })
410
+ }
411
+ }
412
+
413
Scope (\_SB.PCI0)
414
{
415
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
416
@@ -XXX,XX +XXX,XX @@
417
WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
418
0x0000, // Granularity
419
0x0000, // Range Minimum
420
- 0x00FF, // Range Maximum
421
+ 0x000F, // Range Maximum
422
0x0000, // Translation Offset
423
- 0x0100, // Length
424
+ 0x0010, // Length
425
,, )
426
IO (Decode16,
427
0x0CF8, // Range Minimum
428
@@ -XXX,XX +XXX,XX @@
429
}
430
}
431
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
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
459
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
460
---
11
target/arm/cpu.c | 6 ------
461
tests/qtest/bios-tables-test-allowed-diff.h | 2 --
12
1 file changed, 6 deletions(-)
462
tests/data/acpi/q35/DSDT.viot | Bin 0 -> 9398 bytes
13
463
tests/data/acpi/q35/VIOT.viot | Bin 0 -> 112 bytes
14
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
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
15
index XXXXXXX..XXXXXXX 100644
467
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.c
468
--- a/tests/qtest/bios-tables-test-allowed-diff.h
17
+++ b/target/arm/cpu.c
469
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
18
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
470
@@ -XXX,XX +XXX,XX @@
19
/* Enable all PAC keys. */
471
/* List of comma-separated changed AML files to ignore */
20
env->cp15.sctlr_el[1] |= (SCTLR_EnIA | SCTLR_EnIB |
472
"tests/data/acpi/virt/VIOT",
21
SCTLR_EnDA | SCTLR_EnDB);
473
-"tests/data/acpi/q35/DSDT.viot",
22
- /* Enable all PAC instructions */
474
-"tests/data/acpi/q35/VIOT.viot",
23
- env->cp15.hcr_el2 |= HCR_API;
475
diff --git a/tests/data/acpi/q35/DSDT.viot b/tests/data/acpi/q35/DSDT.viot
24
- env->cp15.scr_el3 |= SCR_API;
476
index XXXXXXX..XXXXXXX 100644
25
/* and to the FP/Neon instructions */
477
GIT binary patch
26
env->cp15.cpacr_el1 = deposit64(env->cp15.cpacr_el1, 20, 2, 3);
478
literal 9398
27
/* and to the SVE instructions */
479
zcmeHNO>7&-8J*>iv|O&FB}G~Oi$yp||57BBoWHhc5OS9yDTx$CQgH$r;8Idr*-4Q_
28
env->cp15.cpacr_el1 = deposit64(env->cp15.cpacr_el1, 16, 2, 3);
480
z5(9Az1F`}niVsB-)<KW7p`g9Br(A2Gm-gmc1N78GFS!;)e2V(MnH_0{q<{#yMgn&C
29
- env->cp15.cptr_el[3] |= CPTR_EZ;
481
zn|*J-d9yqFhO_H6z19~`FlPL*u<DkZ*}|)JH;X@mF-FI<cPg<fti9tEN*yB^i5czN
30
/* with maximum vector length */
482
zNq&q?!OZ;BE3B7{KWzJ-`Tn~f`9?Qj8~2^N8{Oc8J%57{==w%rS#;nOCp*nTr@iZ1
31
env->vfp.zcr_el[1] = cpu_isar_feature(aa64_sve, cpu) ?
483
zb+?i;JLQUJ=O0?8*>S~D)a>NF1~WVB6^~_B#yhJ`H+JU@=6aXs`?Yv)J2h=N?drcS
32
cpu->sve_max_vq - 1 : 0;
484
zeLZ*n<<Bm^n}6`jfBx#u8&(W}1?)}iF9o#mZ~E2+zwdn7yK3AbIzKnxpZ>JRPm3~#
33
- env->vfp.zcr_el[2] = env->vfp.zcr_el[1];
485
z&ICS{+_OayRW-l=Mtk=~uaS3o8z<_udd|(wqg`&JnVPfCe>BUOO`Su3e>pff_^UW%
34
- env->vfp.zcr_el[3] = env->vfp.zcr_el[1];
486
z&JE^NO`)=Amg~iqRB1pPscP?(>#ZuY8GHCmlEvD$9g3%4Db~Dfz2SATnddvrR-Oe^
35
/*
487
z;s;dJec!hnzi)ri^I6YN9vtkm{^TdUF8h7gX8-<Qe4p)GQ=)AtYx2VcwdLVAEXEjG
36
* Enable TBI0 and TBI1. While the real kernel only enables TBI0,
488
z^Mj|UHPqkj-LsWuzQem1>F3atdZn=zv3$#RmZzSHN+6-yyU#8cJb=YDilX&sl}vNm
37
* turning on both here will produce smaller code and otherwise
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
38
--
558
--
39
2.20.1
559
2.25.1
40
560
41
561
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
Don't merely start with v8.0, handle v7VE as well. Ensure that writes
3
The VIOT blob contains the following:
4
from aarch32 mode do not change bits in the other half of the register.
5
Protect reads of aa64 id registers with ARM_FEATURE_AARCH64.
6
4
7
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
5
[000h 0000 4] Signature : "VIOT" [Virtual I/O Translation Table]
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
[004h 0004 4] Table Length : 00000058
9
Message-id: 20200229012811.24129-2-richard.henderson@linaro.org
7
[008h 0008 1] Revision : 00
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
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
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
44
---
13
target/arm/helper.c | 38 +++++++++++++++++++++++++-------------
45
tests/qtest/bios-tables-test-allowed-diff.h | 1 -
14
1 file changed, 25 insertions(+), 13 deletions(-)
46
tests/data/acpi/virt/VIOT | Bin 0 -> 88 bytes
47
2 files changed, 1 deletion(-)
15
48
16
diff --git a/target/arm/helper.c b/target/arm/helper.c
49
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
17
index XXXXXXX..XXXXXXX 100644
50
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/helper.c
51
--- a/tests/qtest/bios-tables-test-allowed-diff.h
19
+++ b/target/arm/helper.c
52
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
20
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el3_no_el2_v8_cp_reginfo[] = {
53
@@ -1,2 +1 @@
21
REGINFO_SENTINEL
54
/* List of comma-separated changed AML files to ignore */
22
};
55
-"tests/data/acpi/virt/VIOT",
23
56
diff --git a/tests/data/acpi/virt/VIOT b/tests/data/acpi/virt/VIOT
24
-static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
57
index XXXXXXX..XXXXXXX 100644
25
+static void do_hcr_write(CPUARMState *env, uint64_t value, uint64_t valid_mask)
58
GIT binary patch
26
{
59
literal 88
27
ARMCPU *cpu = env_archcpu(env);
60
zcmWIZ^bd((0D?3pe`k+i1*eDrX9XZ&1PX!JAexE60Hgv8m>C3sGzXN&z`)2L0cSHX
28
- /* Begin with bits defined in base ARMv8.0. */
61
I{D-Rq0Q5fy0RR91
29
- uint64_t valid_mask = MAKE_64BIT_MASK(0, 34);
62
30
+
63
literal 0
31
+ if (arm_feature(env, ARM_FEATURE_V8)) {
64
HcmV?d00001
32
+ valid_mask |= MAKE_64BIT_MASK(0, 34); /* ARMv8.0 */
65
33
+ } else {
34
+ valid_mask |= MAKE_64BIT_MASK(0, 28); /* ARMv7VE */
35
+ }
36
37
if (arm_feature(env, ARM_FEATURE_EL3)) {
38
valid_mask &= ~HCR_HCD;
39
@@ -XXX,XX +XXX,XX @@ static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
40
*/
41
valid_mask &= ~HCR_TSC;
42
}
43
- if (cpu_isar_feature(aa64_vh, cpu)) {
44
- valid_mask |= HCR_E2H;
45
- }
46
- if (cpu_isar_feature(aa64_lor, cpu)) {
47
- valid_mask |= HCR_TLOR;
48
- }
49
- if (cpu_isar_feature(aa64_pauth, cpu)) {
50
- valid_mask |= HCR_API | HCR_APK;
51
+
52
+ if (arm_feature(env, ARM_FEATURE_AARCH64)) {
53
+ if (cpu_isar_feature(aa64_vh, cpu)) {
54
+ valid_mask |= HCR_E2H;
55
+ }
56
+ if (cpu_isar_feature(aa64_lor, cpu)) {
57
+ valid_mask |= HCR_TLOR;
58
+ }
59
+ if (cpu_isar_feature(aa64_pauth, cpu)) {
60
+ valid_mask |= HCR_API | HCR_APK;
61
+ }
62
}
63
64
/* Clear RES0 bits. */
65
@@ -XXX,XX +XXX,XX @@ static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
66
arm_cpu_update_vfiq(cpu);
67
}
68
69
+static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
70
+{
71
+ do_hcr_write(env, value, 0);
72
+}
73
+
74
static void hcr_writehigh(CPUARMState *env, const ARMCPRegInfo *ri,
75
uint64_t value)
76
{
77
/* Handle HCR2 write, i.e. write to high half of HCR_EL2 */
78
value = deposit64(env->cp15.hcr_el2, 32, 32, value);
79
- hcr_write(env, NULL, value);
80
+ do_hcr_write(env, value, MAKE_64BIT_MASK(0, 32));
81
}
82
83
static void hcr_writelow(CPUARMState *env, const ARMCPRegInfo *ri,
84
@@ -XXX,XX +XXX,XX @@ static void hcr_writelow(CPUARMState *env, const ARMCPRegInfo *ri,
85
{
86
/* Handle HCR write, i.e. write to low half of HCR_EL2 */
87
value = deposit64(env->cp15.hcr_el2, 0, 32, value);
88
- hcr_write(env, NULL, value);
89
+ do_hcr_write(env, value, MAKE_64BIT_MASK(32, 32));
90
}
91
92
/*
93
--
66
--
94
2.20.1
67
2.25.1
95
68
96
69
diff view generated by jsdifflib