1
Hi; here's the first target-arm pullreq for the 7.0 cycle.
1
Hi; here's a queue of arm patches (plus a few elf2dmp changes);
2
mostly these are minor cleanups and bugfixes.
2
3
3
thanks
4
thanks
4
-- PMM
5
-- PMM
5
6
6
The following changes since commit 76b56fdfc9fa43ec6e5986aee33f108c6c6a511e:
7
The following changes since commit deaca3fd30d3a8829160f8d3705d65ad83176800:
7
8
8
Merge tag 'block-pull-request' of https://gitlab.com/stefanha/qemu into staging (2021-12-14 12:46:18 -0800)
9
Merge tag 'pull-vfio-20231018' of https://github.com/legoater/qemu into staging (2023-10-18 06:21:15 -0400)
9
10
10
are available in the Git repository at:
11
are available in the Git repository at:
11
12
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20211215
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20231019
13
14
14
for you to fetch changes up to aed176558806674d030a8305d989d4e6a5073359:
15
for you to fetch changes up to 2a052b4ee01b3c413cef2ef49cb780cde17d4ba1:
15
16
16
tests/acpi: add expected blob for VIOT test on virt machine (2021-12-15 10:35:26 +0000)
17
contrib/elf2dmp: Use g_malloc(), g_new() and g_free() (2023-10-19 14:32:13 +0100)
17
18
18
----------------------------------------------------------------
19
----------------------------------------------------------------
19
target-arm queue:
20
target-arm queue:
20
* ITS: error reporting cleanup
21
* hw/arm: Move raspberrypi-fw-defs.h to the include/hw/arm/ folder
21
* aspeed: improve documentation
22
* hw/arm/exynos4210: Get arm_boot_info declaration from 'hw/arm/boot'
22
* Fix STM32F2XX USART data register readout
23
* xlnx devices: remove deprecated device reset
23
* allow emulated GICv3 to be disabled in non-TCG builds
24
* xlnx-bbram: hw/nvram: Use dot in device type name
24
* fix exception priority for singlestep, misaligned PC, bp, etc
25
* elf2dmp: fix coverity issues
25
* Correct calculation of tlb range invalidate length
26
* elf2dmp: convert to g_malloc, g_new and g_free
26
* npcm7xx_emc: fix missing queue_flush
27
* target/arm: Fix CNTPCT_EL0 trapping from EL0 when HCR_EL2.E2H is 0
27
* virt: Add VIOT ACPI table for virtio-iommu
28
* hw/arm: refactor virt PPI logic
28
* target/i386: Use assert() to sanity-check b1 in SSE decode
29
* arm/kvm: convert to kvm_set_one_reg, kvm_get_one_reg
29
* Don't include qemu-common unnecessarily
30
* target/arm: Permit T32 LDM with single register
31
* smmuv3: Advertise SMMUv3.1-XNX
32
* target/arm: Implement FEAT_HPMN0
33
* Remove some unnecessary include lines
34
* target/arm/arm-powerctl: Correctly init CPUs when powered on to lower EL
35
* hw/timer/npcm7xx_timer: Prevent timer from counting down past zero
30
36
31
----------------------------------------------------------------
37
----------------------------------------------------------------
32
Alex Bennée (1):
38
Chris Rauer (1):
33
hw/intc: clean-up error reporting for failed ITS cmd
39
hw/timer/npcm7xx_timer: Prevent timer from counting down past zero
34
40
35
Jean-Philippe Brucker (8):
41
Cornelia Huck (2):
36
hw/arm/virt-acpi-build: Add VIOT table for virtio-iommu
42
arm/kvm: convert to kvm_set_one_reg
37
hw/arm/virt: Remove device tree restriction for virtio-iommu
43
arm/kvm: convert to kvm_get_one_reg
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
44
44
45
Joel Stanley (4):
45
Leif Lindholm (3):
46
docs: aspeed: Add new boards
46
{include/}hw/arm: refactor virt PPI logic
47
docs: aspeed: Update OpenBMC image URL
47
include/hw/arm: move BSA definitions to bsa.h
48
docs: aspeed: Give an example of booting a kernel
48
hw/arm/sbsa-ref: use bsa.h for PPI definitions
49
docs: aspeed: ADC is now modelled
50
49
51
Olivier Hériveaux (1):
50
Michal Orzel (1):
52
Fix STM32F2XX USART data register readout
51
target/arm: Fix CNTPCT_EL0 trapping from EL0 when HCR_EL2.E2H is 0
53
52
54
Patrick Venture (1):
53
Peter Maydell (8):
55
hw/net: npcm7xx_emc fix missing queue_flush
54
target/arm: Permit T32 LDM with single register
55
hw/arm/smmuv3: Update ID register bit field definitions
56
hw/arm/smmuv3: Sort ID register setting into field order
57
hw/arm/smmuv3: Advertise SMMUv3.1-XNX feature
58
target/arm: Implement FEAT_HPMN0
59
target/arm/kvm64.c: Remove unused include
60
target/arm/common-semi-target.h: Remove unnecessary boot.h include
61
target/arm/arm-powerctl: Correctly init CPUs when powered on to lower EL
56
62
57
Peter Maydell (6):
63
Philippe Mathieu-Daudé (1):
58
target/i386: Use assert() to sanity-check b1 in SSE decode
64
hw/arm/exynos4210: Get arm_boot_info declaration from 'hw/arm/boot.h'
59
include/hw/i386: Don't include qemu-common.h in .h files
60
target/hexagon/cpu.h: don't include qemu-common.h
61
target/rx/cpu.h: Don't include qemu-common.h
62
hw/arm: Don't include qemu-common.h unnecessarily
63
target/arm: Correct calculation of tlb range invalidate length
64
65
65
Philippe Mathieu-Daudé (2):
66
Suraj Shirvankar (1):
66
hw/intc/arm_gicv3: Extract gicv3_set_gicv3state from arm_gicv3_cpuif.c
67
contrib/elf2dmp: Use g_malloc(), g_new() and g_free()
67
hw/intc/arm_gicv3: Introduce CONFIG_ARM_GIC_TCG Kconfig selector
68
68
69
Richard Henderson (10):
69
Thomas Huth (1):
70
target/arm: Hoist pc_next to a local variable in aarch64_tr_translate_insn
70
hw/arm: Move raspberrypi-fw-defs.h to the include/hw/arm/ folder
71
target/arm: Hoist pc_next to a local variable in arm_tr_translate_insn
72
target/arm: Hoist pc_next to a local variable in thumb_tr_translate_insn
73
target/arm: Split arm_pre_translate_insn
74
target/arm: Advance pc for arch single-step exception
75
target/arm: Split compute_fsr_fsc out of arm_deliver_fault
76
target/arm: Take an exception if PC is misaligned
77
target/arm: Assert thumb pc is aligned
78
target/arm: Suppress bp for exceptions with more priority
79
tests/tcg: Add arm and aarch64 pc alignment tests
80
71
81
docs/system/arm/aspeed.rst | 26 ++++++++++++----
72
Tong Ho (4):
82
include/hw/i386/microvm.h | 1 -
73
xlnx-bbram: hw/nvram: Remove deprecated device reset
83
include/hw/i386/x86.h | 1 -
74
xlnx-zynqmp-efuse: hw/nvram: Remove deprecated device reset
84
target/arm/helper.h | 1 +
75
xlnx-versal-efuse: hw/nvram: Remove deprecated device reset
85
target/arm/syndrome.h | 5 +++
76
xlnx-bbram: hw/nvram: Use dot in device type name
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
77
78
Viktor Prutyanov (2):
79
elf2dmp: limit print length for sign_rsds
80
elf2dmp: check array bounds in pdb_get_file_size
81
82
MAINTAINERS | 2 +-
83
docs/system/arm/emulation.rst | 1 +
84
hw/arm/smmuv3-internal.h | 38 ++++++++
85
include/hw/arm/bsa.h | 35 +++++++
86
include/hw/arm/exynos4210.h | 2 +-
87
include/hw/{misc => arm}/raspberrypi-fw-defs.h | 0
88
include/hw/arm/virt.h | 12 +--
89
include/hw/nvram/xlnx-bbram.h | 2 +-
90
target/arm/common-semi-target.h | 4 +-
91
target/arm/cpu-qom.h | 2 -
92
target/arm/cpu.h | 22 +++++
93
contrib/elf2dmp/addrspace.c | 7 +-
94
contrib/elf2dmp/main.c | 11 +--
95
contrib/elf2dmp/pdb.c | 32 ++++---
96
contrib/elf2dmp/qemu_elf.c | 7 +-
97
hw/arm/boot.c | 95 +++++--------------
98
hw/arm/sbsa-ref.c | 21 ++---
99
hw/arm/smmuv3.c | 8 +-
100
hw/arm/virt-acpi-build.c | 12 +--
101
hw/arm/virt.c | 24 +++--
102
hw/misc/bcm2835_property.c | 2 +-
103
hw/nvram/xlnx-bbram.c | 8 +-
104
hw/nvram/xlnx-versal-efuse-ctrl.c | 8 +-
105
hw/nvram/xlnx-zynqmp-efuse.c | 8 +-
106
hw/timer/npcm7xx_timer.c | 3 +
107
target/arm/arm-powerctl.c | 53 +----------
108
target/arm/cpu.c | 95 +++++++++++++++++++
109
target/arm/helper.c | 19 +---
110
target/arm/kvm.c | 28 ++----
111
target/arm/kvm64.c | 124 +++++++------------------
112
target/arm/tcg/cpu32.c | 4 +
113
target/arm/tcg/cpu64.c | 1 +
114
target/arm/tcg/translate.c | 37 +++++---
115
33 files changed, 368 insertions(+), 359 deletions(-)
116
create mode 100644 include/hw/arm/bsa.h
117
rename include/hw/{misc => arm}/raspberrypi-fw-defs.h (100%)
118
diff view generated by jsdifflib
Deleted patch
1
From: Alex Bennée <alex.bennee@linaro.org>
2
1
3
While trying to debug a GIC ITS failure I saw some guest errors that
4
had poor formatting as well as leaving me confused as to what failed.
5
As most of the checks aren't possible without a valid dte split that
6
check apart and then check the other conditions in steps. This avoids
7
us relying on undefined data.
8
9
I still get a failure with the current kvm-unit-tests but at least I
10
know (partially) why now:
11
12
Exception return from AArch64 EL1 to AArch64 EL1 PC 0x40080588
13
PASS: gicv3: its-trigger: inv/invall: dev2/eventid=20 now triggers an LPI
14
ITS: MAPD devid=2 size = 0x8 itt=0x40430000 valid=0
15
INT dev_id=2 event_id=20
16
process_its_cmd: invalid command attributes: invalid dte: 0 for 2 (MEM_TX: 0)
17
PASS: gicv3: its-trigger: mapd valid=false: no LPI after device unmap
18
SUMMARY: 6 tests, 1 unexpected failures
19
20
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
22
Message-id: 20211112170454.3158925-1-alex.bennee@linaro.org
23
Cc: Shashi Mallela <shashi.mallela@linaro.org>
24
Cc: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
---
27
hw/intc/arm_gicv3_its.c | 39 +++++++++++++++++++++++++++------------
28
1 file changed, 27 insertions(+), 12 deletions(-)
29
30
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/hw/intc/arm_gicv3_its.c
33
+++ b/hw/intc/arm_gicv3_its.c
34
@@ -XXX,XX +XXX,XX @@ static bool process_its_cmd(GICv3ITSState *s, uint64_t value, uint32_t offset,
35
if (res != MEMTX_OK) {
36
return result;
37
}
38
+ } else {
39
+ qemu_log_mask(LOG_GUEST_ERROR,
40
+ "%s: invalid command attributes: "
41
+ "invalid dte: %"PRIx64" for %d (MEM_TX: %d)\n",
42
+ __func__, dte, devid, res);
43
+ return result;
44
}
45
46
- if ((devid > s->dt.maxids.max_devids) || !dte_valid || !ite_valid ||
47
- !cte_valid || (eventid > max_eventid)) {
48
+
49
+ /*
50
+ * In this implementation, in case of guest errors we ignore the
51
+ * command and move onto the next command in the queue.
52
+ */
53
+ if (devid > s->dt.maxids.max_devids) {
54
qemu_log_mask(LOG_GUEST_ERROR,
55
- "%s: invalid command attributes "
56
- "devid %d or eventid %d or invalid dte %d or"
57
- "invalid cte %d or invalid ite %d\n",
58
- __func__, devid, eventid, dte_valid, cte_valid,
59
- ite_valid);
60
- /*
61
- * in this implementation, in case of error
62
- * we ignore this command and move onto the next
63
- * command in the queue
64
- */
65
+ "%s: invalid command attributes: devid %d>%d",
66
+ __func__, devid, s->dt.maxids.max_devids);
67
+
68
+ } else if (!dte_valid || !ite_valid || !cte_valid) {
69
+ qemu_log_mask(LOG_GUEST_ERROR,
70
+ "%s: invalid command attributes: "
71
+ "dte: %s, ite: %s, cte: %s\n",
72
+ __func__,
73
+ dte_valid ? "valid" : "invalid",
74
+ ite_valid ? "valid" : "invalid",
75
+ cte_valid ? "valid" : "invalid");
76
+ } else if (eventid > max_eventid) {
77
+ qemu_log_mask(LOG_GUEST_ERROR,
78
+ "%s: invalid command attributes: eventid %d > %d\n",
79
+ __func__, eventid, max_eventid);
80
} else {
81
/*
82
* Current implementation only supports rdbase == procnum
83
--
84
2.25.1
85
86
diff view generated by jsdifflib
Deleted patch
1
From: Joel Stanley <joel@jms.id.au>
2
1
3
Add X11, FP5280G2, G220A, Rainier and Fuji. Mention that Swift will be
4
removed in v7.0.
5
6
Signed-off-by: Joel Stanley <joel@jms.id.au>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Message-id: 20211117065752.330632-2-joel@jms.id.au
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
docs/system/arm/aspeed.rst | 7 ++++++-
12
1 file changed, 6 insertions(+), 1 deletion(-)
13
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
15
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/system/arm/aspeed.rst
17
+++ b/docs/system/arm/aspeed.rst
18
@@ -XXX,XX +XXX,XX @@ AST2400 SoC based machines :
19
20
- ``palmetto-bmc`` OpenPOWER Palmetto POWER8 BMC
21
- ``quanta-q71l-bmc`` OpenBMC Quanta BMC
22
+- ``supermicrox11-bmc`` Supermicro X11 BMC
23
24
AST2500 SoC based machines :
25
26
@@ -XXX,XX +XXX,XX @@ AST2500 SoC based machines :
27
- ``romulus-bmc`` OpenPOWER Romulus POWER9 BMC
28
- ``witherspoon-bmc`` OpenPOWER Witherspoon POWER9 BMC
29
- ``sonorapass-bmc`` OCP SonoraPass BMC
30
-- ``swift-bmc`` OpenPOWER Swift BMC POWER9
31
+- ``swift-bmc`` OpenPOWER Swift BMC POWER9 (to be removed in v7.0)
32
+- ``fp5280g2-bmc`` Inspur FP5280G2 BMC
33
+- ``g220a-bmc`` Bytedance G220A BMC
34
35
AST2600 SoC based machines :
36
37
- ``ast2600-evb`` Aspeed AST2600 Evaluation board (Cortex-A7)
38
- ``tacoma-bmc`` OpenPOWER Witherspoon POWER9 AST2600 BMC
39
+- ``rainier-bmc`` IBM Rainier POWER10 BMC
40
+- ``fuji-bmc`` Facebook Fuji BMC
41
42
Supported devices
43
-----------------
44
--
45
2.25.1
46
47
diff view generated by jsdifflib
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
1
From: Thomas Huth <thuth@redhat.com>
2
2
3
The VIOT blob contains the following:
3
The file is obviously related to the raspberrypi machine, so
4
it should reside in hw/arm/ instead of hw/misc/. And while we're
5
at it, also adjust the wildcard in MAINTAINERS so that it covers
6
this file, too.
4
7
5
[000h 0000 4] Signature : "VIOT" [Virtual I/O Translation Table]
8
Signed-off-by: Thomas Huth <thuth@redhat.com>
6
[004h 0004 4] Table Length : 00000058
9
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
[008h 0008 1] Revision : 00
10
Acked-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
[009h 0009 1] Checksum : 66
11
Message-id: 20231012073458.860187-1-thuth@redhat.com
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
43
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
44
---
13
---
45
tests/qtest/bios-tables-test-allowed-diff.h | 1 -
14
MAINTAINERS | 2 +-
46
tests/data/acpi/virt/VIOT | Bin 0 -> 88 bytes
15
include/hw/{misc => arm}/raspberrypi-fw-defs.h | 0
47
2 files changed, 1 deletion(-)
16
hw/misc/bcm2835_property.c | 2 +-
17
3 files changed, 2 insertions(+), 2 deletions(-)
18
rename include/hw/{misc => arm}/raspberrypi-fw-defs.h (100%)
48
19
49
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
20
diff --git a/MAINTAINERS b/MAINTAINERS
50
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
51
--- a/tests/qtest/bios-tables-test-allowed-diff.h
22
--- a/MAINTAINERS
52
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
23
+++ b/MAINTAINERS
53
@@ -1,2 +1 @@
24
@@ -XXX,XX +XXX,XX @@ S: Odd Fixes
54
/* List of comma-separated changed AML files to ignore */
25
F: hw/arm/raspi.c
55
-"tests/data/acpi/virt/VIOT",
26
F: hw/arm/raspi_platform.h
56
diff --git a/tests/data/acpi/virt/VIOT b/tests/data/acpi/virt/VIOT
27
F: hw/*/bcm283*
28
-F: include/hw/arm/raspi*
29
+F: include/hw/arm/rasp*
30
F: include/hw/*/bcm283*
31
F: docs/system/arm/raspi.rst
32
33
diff --git a/include/hw/misc/raspberrypi-fw-defs.h b/include/hw/arm/raspberrypi-fw-defs.h
34
similarity index 100%
35
rename from include/hw/misc/raspberrypi-fw-defs.h
36
rename to include/hw/arm/raspberrypi-fw-defs.h
37
diff --git a/hw/misc/bcm2835_property.c b/hw/misc/bcm2835_property.c
57
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
58
GIT binary patch
39
--- a/hw/misc/bcm2835_property.c
59
literal 88
40
+++ b/hw/misc/bcm2835_property.c
60
zcmWIZ^bd((0D?3pe`k+i1*eDrX9XZ&1PX!JAexE60Hgv8m>C3sGzXN&z`)2L0cSHX
41
@@ -XXX,XX +XXX,XX @@
61
I{D-Rq0Q5fy0RR91
42
#include "migration/vmstate.h"
62
43
#include "hw/irq.h"
63
literal 0
44
#include "hw/misc/bcm2835_mbox_defs.h"
64
HcmV?d00001
45
-#include "hw/misc/raspberrypi-fw-defs.h"
65
46
+#include "hw/arm/raspberrypi-fw-defs.h"
47
#include "sysemu/dma.h"
48
#include "qemu/log.h"
49
#include "qemu/module.h"
66
--
50
--
67
2.25.1
51
2.34.1
68
52
69
53
diff view generated by jsdifflib
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Create empty data files and allow updates for the upcoming VIOT tests.
3
struct arm_boot_info is declared in "hw/arm/boot.h".
4
By including the correct header we don't need to declare
5
it again in "target/arm/cpu-qom.h".
4
6
5
Acked-by: Igor Mammedov <imammedo@redhat.com>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
9
Message-id: 20231013130214.95742-1-philmd@linaro.org
8
Message-id: 20211210170415.583179-6-jean-philippe@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
tests/qtest/bios-tables-test-allowed-diff.h | 3 +++
12
include/hw/arm/exynos4210.h | 2 +-
12
tests/data/acpi/q35/DSDT.viot | 0
13
target/arm/cpu-qom.h | 2 --
13
tests/data/acpi/q35/VIOT.viot | 0
14
2 files changed, 1 insertion(+), 3 deletions(-)
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
19
15
20
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
16
diff --git a/include/hw/arm/exynos4210.h b/include/hw/arm/exynos4210.h
21
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
22
--- a/tests/qtest/bios-tables-test-allowed-diff.h
18
--- a/include/hw/arm/exynos4210.h
23
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
19
+++ b/include/hw/arm/exynos4210.h
24
@@ -1 +1,4 @@
20
@@ -XXX,XX +XXX,XX @@
25
/* List of comma-separated changed AML files to ignore */
21
#include "hw/intc/exynos4210_gic.h"
26
+"tests/data/acpi/virt/VIOT",
22
#include "hw/intc/exynos4210_combiner.h"
27
+"tests/data/acpi/q35/DSDT.viot",
23
#include "hw/core/split-irq.h"
28
+"tests/data/acpi/q35/VIOT.viot",
24
-#include "target/arm/cpu-qom.h"
29
diff --git a/tests/data/acpi/q35/DSDT.viot b/tests/data/acpi/q35/DSDT.viot
25
+#include "hw/arm/boot.h"
30
new file mode 100644
26
#include "qom/object.h"
31
index XXXXXXX..XXXXXXX
27
32
diff --git a/tests/data/acpi/q35/VIOT.viot b/tests/data/acpi/q35/VIOT.viot
28
#define EXYNOS4210_NCPUS 2
33
new file mode 100644
29
diff --git a/target/arm/cpu-qom.h b/target/arm/cpu-qom.h
34
index XXXXXXX..XXXXXXX
30
index XXXXXXX..XXXXXXX 100644
35
diff --git a/tests/data/acpi/virt/VIOT b/tests/data/acpi/virt/VIOT
31
--- a/target/arm/cpu-qom.h
36
new file mode 100644
32
+++ b/target/arm/cpu-qom.h
37
index XXXXXXX..XXXXXXX
33
@@ -XXX,XX +XXX,XX @@
34
#include "hw/core/cpu.h"
35
#include "qom/object.h"
36
37
-struct arm_boot_info;
38
-
39
#define TYPE_ARM_CPU "arm-cpu"
40
41
OBJECT_DECLARE_CPU_TYPE(ARMCPU, ARMCPUClass, ARM_CPU)
38
--
42
--
39
2.25.1
43
2.34.1
40
44
41
45
diff view generated by jsdifflib
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
1
From: Tong Ho <tong.ho@amd.com>
2
2
3
To propagate errors to the caller of the pre_plug callback, use the
3
This change implements the ResettableClass interface for the device.
4
object_poperty_set*() functions directly instead of the qdev_prop_set*()
5
helpers.
6
4
7
Suggested-by: Igor Mammedov <imammedo@redhat.com>
5
Signed-off-by: Tong Ho <tong.ho@amd.com>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
7
Message-id: 20231003052345.199725-1-tong.ho@amd.com
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
11
Message-id: 20211210170415.583179-5-jean-philippe@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
9
---
14
hw/arm/virt.c | 5 +++--
10
hw/nvram/xlnx-bbram.c | 8 +++++---
15
1 file changed, 3 insertions(+), 2 deletions(-)
11
1 file changed, 5 insertions(+), 3 deletions(-)
16
12
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
13
diff --git a/hw/nvram/xlnx-bbram.c b/hw/nvram/xlnx-bbram.c
18
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/virt.c
15
--- a/hw/nvram/xlnx-bbram.c
20
+++ b/hw/arm/virt.c
16
+++ b/hw/nvram/xlnx-bbram.c
21
@@ -XXX,XX +XXX,XX @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
17
@@ -XXX,XX +XXX,XX @@
22
db_start, db_end,
18
* QEMU model of the Xilinx BBRAM Battery Backed RAM
23
VIRTIO_IOMMU_RESV_MEM_T_MSI);
19
*
24
20
* Copyright (c) 2014-2021 Xilinx Inc.
25
- qdev_prop_set_uint32(dev, "len-reserved-regions", 1);
21
+ * Copyright (c) 2023 Advanced Micro Devices, Inc.
26
- qdev_prop_set_string(dev, "reserved-regions[0]", resv_prop_str);
22
*
27
+ object_property_set_uint(OBJECT(dev), "len-reserved-regions", 1, errp);
23
* Permission is hereby granted, free of charge, to any person obtaining a copy
28
+ object_property_set_str(OBJECT(dev), "reserved-regions[0]",
24
* of this software and associated documentation files (the "Software"), to deal
29
+ resv_prop_str, errp);
25
@@ -XXX,XX +XXX,XX @@ static RegisterAccessInfo bbram_ctrl_regs_info[] = {
30
g_free(resv_prop_str);
31
}
26
}
32
}
27
};
28
29
-static void bbram_ctrl_reset(DeviceState *dev)
30
+static void bbram_ctrl_reset_hold(Object *obj)
31
{
32
- XlnxBBRam *s = XLNX_BBRAM(dev);
33
+ XlnxBBRam *s = XLNX_BBRAM(obj);
34
unsigned int i;
35
36
for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
37
@@ -XXX,XX +XXX,XX @@ static Property bbram_ctrl_props[] = {
38
static void bbram_ctrl_class_init(ObjectClass *klass, void *data)
39
{
40
DeviceClass *dc = DEVICE_CLASS(klass);
41
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
42
43
- dc->reset = bbram_ctrl_reset;
44
+ rc->phases.hold = bbram_ctrl_reset_hold;
45
dc->realize = bbram_ctrl_realize;
46
dc->vmsd = &vmstate_bbram_ctrl;
47
device_class_set_props(dc, bbram_ctrl_props);
33
--
48
--
34
2.25.1
49
2.34.1
35
50
36
51
diff view generated by jsdifflib
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
1
From: Tong Ho <tong.ho@amd.com>
2
2
3
Add two test cases for VIOT, one on the q35 machine and the other on
3
This change implements the ResettableClass interface for the device.
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.
7
4
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
5
Signed-off-by: Tong Ho <tong.ho@amd.com>
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
6
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
7
Message-id: 20231004055713.324009-1-tong.ho@amd.com
11
Message-id: 20211210170415.583179-7-jean-philippe@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
9
---
14
tests/qtest/bios-tables-test.c | 38 ++++++++++++++++++++++++++++++++++
10
hw/nvram/xlnx-zynqmp-efuse.c | 8 +++++---
15
1 file changed, 38 insertions(+)
11
1 file changed, 5 insertions(+), 3 deletions(-)
16
12
17
diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
13
diff --git a/hw/nvram/xlnx-zynqmp-efuse.c b/hw/nvram/xlnx-zynqmp-efuse.c
18
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
19
--- a/tests/qtest/bios-tables-test.c
15
--- a/hw/nvram/xlnx-zynqmp-efuse.c
20
+++ b/tests/qtest/bios-tables-test.c
16
+++ b/hw/nvram/xlnx-zynqmp-efuse.c
21
@@ -XXX,XX +XXX,XX @@ static void test_acpi_virt_tcg(void)
17
@@ -XXX,XX +XXX,XX @@
22
free_test_data(&data);
18
* QEMU model of the ZynqMP eFuse
19
*
20
* Copyright (c) 2015 Xilinx Inc.
21
+ * Copyright (c) 2023 Advanced Micro Devices, Inc.
22
*
23
* Written by Edgar E. Iglesias <edgari@xilinx.com>
24
*
25
@@ -XXX,XX +XXX,XX @@ static void zynqmp_efuse_register_reset(RegisterInfo *reg)
26
register_reset(reg);
23
}
27
}
24
28
25
+static void test_acpi_q35_viot(void)
29
-static void zynqmp_efuse_reset(DeviceState *dev)
26
+{
30
+static void zynqmp_efuse_reset_hold(Object *obj)
27
+ test_data data = {
28
+ .machine = MACHINE_Q35,
29
+ .variant = ".viot",
30
+ };
31
+
32
+ /*
33
+ * To keep things interesting, two buses bypass the IOMMU.
34
+ * VIOT should only describes the other two buses.
35
+ */
36
+ test_acpi_one("-machine default_bus_bypass_iommu=on "
37
+ "-device virtio-iommu-pci "
38
+ "-device pxb-pcie,bus_nr=0x10,id=pcie.100,bus=pcie.0 "
39
+ "-device pxb-pcie,bus_nr=0x20,id=pcie.200,bus=pcie.0,bypass_iommu=on "
40
+ "-device pxb-pcie,bus_nr=0x30,id=pcie.300,bus=pcie.0",
41
+ &data);
42
+ free_test_data(&data);
43
+}
44
+
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)
62
{
31
{
63
int i;
32
- XlnxZynqMPEFuse *s = XLNX_ZYNQMP_EFUSE(dev);
64
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
33
+ XlnxZynqMPEFuse *s = XLNX_ZYNQMP_EFUSE(obj);
65
qtest_add_func("acpi/q35/kvm/xapic", test_acpi_q35_kvm_xapic);
34
unsigned int i;
66
qtest_add_func("acpi/q35/kvm/dmar", test_acpi_q35_kvm_dmar);
35
67
}
36
for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
68
+ qtest_add_func("acpi/q35/viot", test_acpi_q35_viot);
37
@@ -XXX,XX +XXX,XX @@ static Property zynqmp_efuse_props[] = {
69
} else if (strcmp(arch, "aarch64") == 0) {
38
static void zynqmp_efuse_class_init(ObjectClass *klass, void *data)
70
if (has_tcg) {
39
{
71
qtest_add_func("acpi/virt", test_acpi_virt_tcg);
40
DeviceClass *dc = DEVICE_CLASS(klass);
72
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
41
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
73
qtest_add_func("acpi/virt/memhp", test_acpi_virt_tcg_memhp);
42
74
qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb);
43
- dc->reset = zynqmp_efuse_reset;
75
qtest_add_func("acpi/virt/oem-fields", test_acpi_oem_fields_virt);
44
+ rc->phases.hold = zynqmp_efuse_reset_hold;
76
+ qtest_add_func("acpi/virt/viot", test_acpi_virt_viot);
45
dc->realize = zynqmp_efuse_realize;
77
}
46
dc->vmsd = &vmstate_efuse;
78
}
47
device_class_set_props(dc, zynqmp_efuse_props);
79
ret = g_test_run();
80
--
48
--
81
2.25.1
49
2.34.1
82
83
diff view generated by jsdifflib
1
From: Patrick Venture <venture@google.com>
1
From: Tong Ho <tong.ho@amd.com>
2
2
3
The rx_active boolean change to true should always trigger a try_read
3
This change implements the ResettableClass interface for the device.
4
call that flushes the queue.
5
4
6
Signed-off-by: Patrick Venture <venture@google.com>
5
Signed-off-by: Tong Ho <tong.ho@amd.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
8
Message-id: 20211203221002.1719306-1-venture@google.com
7
Message-id: 20231004055339.323833-1-tong.ho@amd.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
9
---
11
hw/net/npcm7xx_emc.c | 18 ++++++++----------
10
hw/nvram/xlnx-versal-efuse-ctrl.c | 8 +++++---
12
1 file changed, 8 insertions(+), 10 deletions(-)
11
1 file changed, 5 insertions(+), 3 deletions(-)
13
12
14
diff --git a/hw/net/npcm7xx_emc.c b/hw/net/npcm7xx_emc.c
13
diff --git a/hw/nvram/xlnx-versal-efuse-ctrl.c b/hw/nvram/xlnx-versal-efuse-ctrl.c
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/net/npcm7xx_emc.c
15
--- a/hw/nvram/xlnx-versal-efuse-ctrl.c
17
+++ b/hw/net/npcm7xx_emc.c
16
+++ b/hw/nvram/xlnx-versal-efuse-ctrl.c
18
@@ -XXX,XX +XXX,XX @@ static void emc_halt_rx(NPCM7xxEMCState *emc, uint32_t mista_flag)
17
@@ -XXX,XX +XXX,XX @@
19
emc_set_mista(emc, mista_flag);
18
* QEMU model of the Versal eFuse controller
19
*
20
* Copyright (c) 2020 Xilinx Inc.
21
+ * Copyright (c) 2023 Advanced Micro Devices, Inc.
22
*
23
* Permission is hereby granted, free of charge, to any person obtaining a copy
24
* of this software and associated documentation files (the "Software"), to deal
25
@@ -XXX,XX +XXX,XX @@ static void efuse_ctrl_register_reset(RegisterInfo *reg)
26
register_reset(reg);
20
}
27
}
21
28
22
+static void emc_enable_rx_and_flush(NPCM7xxEMCState *emc)
29
-static void efuse_ctrl_reset(DeviceState *dev)
23
+{
30
+static void efuse_ctrl_reset_hold(Object *obj)
24
+ emc->rx_active = true;
25
+ qemu_flush_queued_packets(qemu_get_queue(emc->nic));
26
+}
27
+
28
static void emc_set_next_tx_descriptor(NPCM7xxEMCState *emc,
29
const NPCM7xxEMCTxDesc *tx_desc,
30
uint32_t desc_addr)
31
@@ -XXX,XX +XXX,XX @@ static ssize_t emc_receive(NetClientState *nc, const uint8_t *buf, size_t len1)
32
return len;
33
}
34
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
{
31
{
44
NPCM7xxEMCState *emc = opaque;
32
- XlnxVersalEFuseCtrl *s = XLNX_VERSAL_EFUSE_CTRL(dev);
45
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_emc_write(void *opaque, hwaddr offset,
33
+ XlnxVersalEFuseCtrl *s = XLNX_VERSAL_EFUSE_CTRL(obj);
46
emc->regs[REG_MGSTA] |= REG_MGSTA_RXHA;
34
unsigned int i;
47
}
35
48
if (value & REG_MCMDR_RXON) {
36
for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
49
- emc->rx_active = true;
37
@@ -XXX,XX +XXX,XX @@ static Property efuse_ctrl_props[] = {
50
+ emc_enable_rx_and_flush(emc);
38
static void efuse_ctrl_class_init(ObjectClass *klass, void *data)
51
} else {
39
{
52
emc_halt_rx(emc, 0);
40
DeviceClass *dc = DEVICE_CLASS(klass);
53
}
41
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
54
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_emc_write(void *opaque, hwaddr offset,
42
55
break;
43
- dc->reset = efuse_ctrl_reset;
56
case REG_RSDR:
44
+ rc->phases.hold = efuse_ctrl_reset_hold;
57
if (emc->regs[REG_MCMDR] & REG_MCMDR_RXON) {
45
dc->realize = efuse_ctrl_realize;
58
- emc->rx_active = true;
46
dc->vmsd = &vmstate_efuse_ctrl;
59
- emc_try_receive_next_packet(emc);
47
device_class_set_props(dc, efuse_ctrl_props);
60
+ emc_enable_rx_and_flush(emc);
61
}
62
break;
63
case REG_MIIDA:
64
--
48
--
65
2.25.1
49
2.34.1
66
67
diff view generated by jsdifflib
1
From: Joel Stanley <joel@jms.id.au>
1
From: Tong Ho <tong.ho@amd.com>
2
2
3
Move it to the supported list.
3
This replaces the comma (,) to dot (.) in the device type name
4
so the name can be used with the 'driver=' command line option.
4
5
5
Signed-off-by: Joel Stanley <joel@jms.id.au>
6
Signed-off-by: Tong Ho <tong.ho@amd.com>
6
Message-id: 20211117065752.330632-5-joel@jms.id.au
7
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
8
Message-id: 20231003052139.199665-1-tong.ho@amd.com
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
10
---
9
docs/system/arm/aspeed.rst | 2 +-
11
include/hw/nvram/xlnx-bbram.h | 2 +-
10
1 file changed, 1 insertion(+), 1 deletion(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
11
13
12
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
14
diff --git a/include/hw/nvram/xlnx-bbram.h b/include/hw/nvram/xlnx-bbram.h
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/docs/system/arm/aspeed.rst
16
--- a/include/hw/nvram/xlnx-bbram.h
15
+++ b/docs/system/arm/aspeed.rst
17
+++ b/include/hw/nvram/xlnx-bbram.h
16
@@ -XXX,XX +XXX,XX @@ Supported devices
18
@@ -XXX,XX +XXX,XX @@
17
* Front LEDs (PCA9552 on I2C bus)
19
18
* LPC Peripheral Controller (a subset of subdevices are supported)
20
#define RMAX_XLNX_BBRAM ((0x4c / 4) + 1)
19
* Hash/Crypto Engine (HACE) - Hash support only. TODO: HMAC and RSA
21
20
+ * ADC
22
-#define TYPE_XLNX_BBRAM "xlnx,bbram-ctrl"
21
23
+#define TYPE_XLNX_BBRAM "xlnx.bbram-ctrl"
22
24
OBJECT_DECLARE_SIMPLE_TYPE(XlnxBBRam, XLNX_BBRAM);
23
Missing devices
25
24
---------------
26
struct XlnxBBRam {
25
26
* Coprocessor support
27
- * ADC (out of tree implementation)
28
* PWM and Fan Controller
29
* Slave GPIO Controller
30
* Super I/O Controller
31
--
27
--
32
2.25.1
28
2.34.1
33
34
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Viktor Prutyanov <viktor@daynix.com>
2
2
3
Both single-step and pc alignment faults have priority over
3
String sign_rsds isn't terminated, so the print length must be limited.
4
breakpoint exceptions.
5
4
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Fixes: Coverity CID 1521598
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Viktor Prutyanov <viktor@daynix.com>
7
Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com>
8
Message-id: 20230930235317.11469-2-viktor@daynix.com
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/debug_helper.c | 23 +++++++++++++++++++++++
11
contrib/elf2dmp/main.c | 2 +-
11
1 file changed, 23 insertions(+)
12
1 file changed, 1 insertion(+), 1 deletion(-)
12
13
13
diff --git a/target/arm/debug_helper.c b/target/arm/debug_helper.c
14
diff --git a/contrib/elf2dmp/main.c b/contrib/elf2dmp/main.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/debug_helper.c
16
--- a/contrib/elf2dmp/main.c
16
+++ b/target/arm/debug_helper.c
17
+++ b/contrib/elf2dmp/main.c
17
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_breakpoint(CPUState *cs)
18
@@ -XXX,XX +XXX,XX @@ static bool pe_check_pdb_name(uint64_t base, void *start_addr,
18
{
19
}
19
ARMCPU *cpu = ARM_CPU(cs);
20
20
CPUARMState *env = &cpu->env;
21
if (memcmp(&rsds->Signature, sign_rsds, sizeof(sign_rsds))) {
21
+ target_ulong pc;
22
- eprintf("CodeView signature is \'%.4s\', \'%s\' expected\n",
22
int n;
23
+ eprintf("CodeView signature is \'%.4s\', \'%.4s\' expected\n",
23
24
rsds->Signature, sign_rsds);
24
/*
25
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_breakpoint(CPUState *cs)
26
return false;
25
return false;
27
}
26
}
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;
35
+ }
36
+
37
+ /*
38
+ * PC alignment faults have priority over breakpoint exceptions.
39
+ */
40
+ pc = is_a64(env) ? env->pc : env->regs[15];
41
+ if ((is_a64(env) || !env->thumb) && (pc & 3) != 0) {
42
+ return false;
43
+ }
44
+
45
+ /*
46
+ * Instruction aborts have priority over breakpoint exceptions.
47
+ * TODO: We would need to look up the page for PC and verify that
48
+ * it is present and executable.
49
+ */
50
+
51
for (n = 0; n < ARRAY_SIZE(env->cpu_breakpoint); n++) {
52
if (bp_wp_matches(cpu, n, false)) {
53
return true;
54
--
27
--
55
2.25.1
28
2.34.1
56
57
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Viktor Prutyanov <viktor@daynix.com>
2
2
3
We will reuse this section of arm_deliver_fault for
3
Index in file_size array must be checked against num_files, because the
4
raising pc alignment faults.
4
entries we are looking for may be absent in the PDB.
5
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Fixes: Coverity CID 1521597
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Viktor Prutyanov <viktor@daynix.com>
8
Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Message-id: 20230930235317.11469-3-viktor@daynix.com
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/tlb_helper.c | 45 +++++++++++++++++++++++++----------------
13
contrib/elf2dmp/pdb.c | 13 +++++++++----
11
1 file changed, 28 insertions(+), 17 deletions(-)
14
1 file changed, 9 insertions(+), 4 deletions(-)
12
15
13
diff --git a/target/arm/tlb_helper.c b/target/arm/tlb_helper.c
16
diff --git a/contrib/elf2dmp/pdb.c b/contrib/elf2dmp/pdb.c
14
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/tlb_helper.c
18
--- a/contrib/elf2dmp/pdb.c
16
+++ b/target/arm/tlb_helper.c
19
+++ b/contrib/elf2dmp/pdb.c
17
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
20
@@ -XXX,XX +XXX,XX @@
18
return syn;
21
22
static uint32_t pdb_get_file_size(const struct pdb_reader *r, unsigned idx)
23
{
24
+ if (idx >= r->ds.toc->num_files) {
25
+ return 0;
26
+ }
27
+
28
return r->ds.toc->file_size[idx];
19
}
29
}
20
30
21
-static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
31
@@ -XXX,XX +XXX,XX @@ static void *pdb_ds_read_file(struct pdb_reader* r, uint32_t file_number)
22
- MMUAccessType access_type,
32
23
- int mmu_idx, ARMMMUFaultInfo *fi)
33
static int pdb_init_segments(struct pdb_reader *r)
24
+static uint32_t compute_fsr_fsc(CPUARMState *env, ARMMMUFaultInfo *fi,
25
+ int target_el, int mmu_idx, uint32_t *ret_fsc)
26
{
34
{
27
- CPUARMState *env = &cpu->env;
35
- char *segs;
28
- int target_el;
36
unsigned stream_idx = r->segments;
29
- bool same_el;
37
30
- uint32_t syn, exc, fsr, fsc;
38
- segs = pdb_ds_read_file(r, stream_idx);
31
ARMMMUIdx arm_mmu_idx = core_to_arm_mmu_idx(env, mmu_idx);
39
- if (!segs) {
32
-
40
+ r->segs = pdb_ds_read_file(r, stream_idx);
33
- target_el = exception_target_el(env);
41
+ if (!r->segs) {
34
- if (fi->stage2) {
42
return 1;
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
}
43
}
49
44
50
+ *ret_fsc = fsc;
45
- r->segs = segs;
51
+ return fsr;
46
r->segs_size = pdb_get_file_size(r, stream_idx);
52
+}
47
+ if (!r->segs_size) {
53
+
48
+ return 1;
54
+static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
55
+ MMUAccessType access_type,
56
+ int mmu_idx, ARMMMUFaultInfo *fi)
57
+{
58
+ CPUARMState *env = &cpu->env;
59
+ int target_el;
60
+ bool same_el;
61
+ uint32_t syn, exc, fsr, fsc;
62
+
63
+ target_el = exception_target_el(env);
64
+ if (fi->stage2) {
65
+ target_el = 2;
66
+ env->cp15.hpfar_el2 = extract64(fi->s2addr, 12, 47) << 4;
67
+ if (arm_is_secure_below_el3(env) && fi->s1ns) {
68
+ env->cp15.hpfar_el2 |= HPFAR_NS;
69
+ }
70
+ }
49
+ }
71
+ same_el = (arm_current_el(env) == target_el);
50
72
+
51
return 0;
73
+ fsr = compute_fsr_fsc(env, fi, target_el, mmu_idx, &fsc);
52
}
74
+
75
if (access_type == MMU_INST_FETCH) {
76
syn = syn_insn_abort(same_el, fi->ea, fi->s1ptw, fsc);
77
exc = EXCP_PREFETCH_ABORT;
78
--
53
--
79
2.25.1
54
2.34.1
80
55
81
56
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Michal Orzel <michal.orzel@amd.com>
2
2
3
The size of the code covered by a TranslationBlock cannot be 0;
3
On an attempt to access CNTPCT_EL0 from EL0 using a guest running on top
4
this is checked via assert in tb_gen_code.
4
of Xen, a trap from EL2 was observed which is something not reproducible
5
on HW (also, Xen does not trap accesses to physical counter).
5
6
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
This is because gt_counter_access() checks for an incorrect bit (1
8
instead of 0) of CNTHCTL_EL2 if HCR_EL2.E2H is 0 and access is made to
9
physical counter. Refer ARM ARM DDI 0487J.a, D19.12.2:
10
When HCR_EL2.E2H is 0:
11
- EL1PCTEN, bit [0]: refers to physical counter
12
- EL1PCEN, bit [1]: refers to physical timer registers
13
14
Drop entire block "if (hcr & HCR_E2H) {...} else {...}" from EL0 case
15
and fall through to EL1 case, given that after fixing checking for the
16
correct bit, the handling is the same.
17
18
Fixes: 5bc8437136fb ("target/arm: Update timer access for VHE")
19
Signed-off-by: Michal Orzel <michal.orzel@amd.com>
20
Tested-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
21
Message-id: 20230928094404.20802-1-michal.orzel@amd.com
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
22
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
24
---
10
target/arm/translate-a64.c | 1 +
25
target/arm/helper.c | 17 +----------------
11
1 file changed, 1 insertion(+)
26
1 file changed, 1 insertion(+), 16 deletions(-)
12
27
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-a64.c
30
--- a/target/arm/helper.c
16
+++ b/target/arm/translate-a64.c
31
+++ b/target/arm/helper.c
17
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
32
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gt_counter_access(CPUARMState *env, int timeridx,
18
assert(s->base.num_insns == 1);
33
if (!extract32(env->cp15.c14_cntkctl, timeridx, 1)) {
19
gen_swstep_exception(s, 0, 0);
34
return CP_ACCESS_TRAP;
20
s->base.is_jmp = DISAS_NORETURN;
35
}
21
+ s->base.pc_next = pc + 4;
36
-
22
return;
37
- /* If HCR_EL2.<E2H,TGE> == '10': check CNTHCTL_EL2.EL1PCTEN. */
23
}
38
- if (hcr & HCR_E2H) {
24
39
- if (timeridx == GTIMER_PHYS &&
40
- !extract32(env->cp15.cnthctl_el2, 10, 1)) {
41
- return CP_ACCESS_TRAP_EL2;
42
- }
43
- } else {
44
- /* If HCR_EL2.<E2H> == 0: check CNTHCTL_EL2.EL1PCEN. */
45
- if (has_el2 && timeridx == GTIMER_PHYS &&
46
- !extract32(env->cp15.cnthctl_el2, 1, 1)) {
47
- return CP_ACCESS_TRAP_EL2;
48
- }
49
- }
50
- break;
51
-
52
+ /* fall through */
53
case 1:
54
/* Check CNTHCTL_EL2.EL1PCTEN, which changes location based on E2H. */
55
if (has_el2 && timeridx == GTIMER_PHYS &&
25
--
56
--
26
2.25.1
57
2.34.1
27
28
diff view generated by jsdifflib
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
1
From: Leif Lindholm <quic_llindhol@quicinc.com>
2
2
3
virtio-iommu is now supported with ACPI VIOT as well as device tree.
3
GIC Private Peripheral Interrupts (PPI) are defined as GIC INTID 16-31.
4
Remove the restriction that prevents from instantiating a virtio-iommu
4
As in, PPI0 is INTID16 .. PPI15 is INTID31.
5
device under ACPI.
5
Arm's Base System Architecture specification (BSA) lists the mandated and
6
recommended private interrupt IDs by INTID, not by PPI index. But current
7
definitions in virt define them by PPI index, complicating cross
8
referencing.
6
9
7
Acked-by: Igor Mammedov <imammedo@redhat.com>
10
Meanwhile, the PPI(x) macro counterintuitively adds 16 to the input value,
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
11
converting a PPI index to an INTID.
9
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
12
10
Message-id: 20211210170415.583179-3-jean-philippe@linaro.org
13
Resolve this by redefining the BSA-allocated PPIs by their INTIDs,
14
and replacing the PPI(x) macro with an INTID_TO_PPI(x) one where required.
15
16
Signed-off-by: Leif Lindholm <quic_llindhol@quicinc.com>
17
Message-id: 20230919090229.188092-2-quic_llindhol@quicinc.com
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
20
---
13
hw/arm/virt.c | 10 ++--------
21
include/hw/arm/virt.h | 14 +++++++-------
14
hw/virtio/virtio-iommu-pci.c | 12 ++----------
22
hw/arm/virt-acpi-build.c | 12 ++++++------
15
2 files changed, 4 insertions(+), 18 deletions(-)
23
hw/arm/virt.c | 24 ++++++++++++++----------
24
3 files changed, 27 insertions(+), 23 deletions(-)
16
25
26
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
27
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/arm/virt.h
29
+++ b/include/hw/arm/virt.h
30
@@ -XXX,XX +XXX,XX @@
31
#define NUM_VIRTIO_TRANSPORTS 32
32
#define NUM_SMMU_IRQS 4
33
34
-#define ARCH_GIC_MAINT_IRQ 9
35
+#define ARCH_GIC_MAINT_IRQ 25
36
37
-#define ARCH_TIMER_VIRT_IRQ 11
38
-#define ARCH_TIMER_S_EL1_IRQ 13
39
-#define ARCH_TIMER_NS_EL1_IRQ 14
40
-#define ARCH_TIMER_NS_EL2_IRQ 10
41
+#define ARCH_TIMER_VIRT_IRQ 27
42
+#define ARCH_TIMER_S_EL1_IRQ 29
43
+#define ARCH_TIMER_NS_EL1_IRQ 30
44
+#define ARCH_TIMER_NS_EL2_IRQ 26
45
46
-#define VIRTUAL_PMU_IRQ 7
47
+#define VIRTUAL_PMU_IRQ 23
48
49
-#define PPI(irq) ((irq) + 16)
50
+#define INTID_TO_PPI(irq) ((irq) - 16)
51
52
/* See Linux kernel arch/arm64/include/asm/pvclock-abi.h */
53
#define PVTIME_SIZE_PER_CPU 64
54
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/hw/arm/virt-acpi-build.c
57
+++ b/hw/arm/virt-acpi-build.c
58
@@ -XXX,XX +XXX,XX @@ build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
59
* The interrupt values are the same with the device tree when adding 16
60
*/
61
/* Secure EL1 timer GSIV */
62
- build_append_int_noprefix(table_data, ARCH_TIMER_S_EL1_IRQ + 16, 4);
63
+ build_append_int_noprefix(table_data, ARCH_TIMER_S_EL1_IRQ, 4);
64
/* Secure EL1 timer Flags */
65
build_append_int_noprefix(table_data, irqflags, 4);
66
/* Non-Secure EL1 timer GSIV */
67
- build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL1_IRQ + 16, 4);
68
+ build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL1_IRQ, 4);
69
/* Non-Secure EL1 timer Flags */
70
build_append_int_noprefix(table_data, irqflags |
71
1UL << 2, /* Always-on Capability */
72
4);
73
/* Virtual timer GSIV */
74
- build_append_int_noprefix(table_data, ARCH_TIMER_VIRT_IRQ + 16, 4);
75
+ build_append_int_noprefix(table_data, ARCH_TIMER_VIRT_IRQ, 4);
76
/* Virtual Timer Flags */
77
build_append_int_noprefix(table_data, irqflags, 4);
78
/* Non-Secure EL2 timer GSIV */
79
- build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL2_IRQ + 16, 4);
80
+ build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL2_IRQ, 4);
81
/* Non-Secure EL2 timer Flags */
82
build_append_int_noprefix(table_data, irqflags, 4);
83
/* CntReadBase Physical address */
84
@@ -XXX,XX +XXX,XX @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
85
for (i = 0; i < MACHINE(vms)->smp.cpus; i++) {
86
ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(i));
87
uint64_t physical_base_address = 0, gich = 0, gicv = 0;
88
- uint32_t vgic_interrupt = vms->virt ? PPI(ARCH_GIC_MAINT_IRQ) : 0;
89
+ uint32_t vgic_interrupt = vms->virt ? ARCH_GIC_MAINT_IRQ : 0;
90
uint32_t pmu_interrupt = arm_feature(&armcpu->env, ARM_FEATURE_PMU) ?
91
- PPI(VIRTUAL_PMU_IRQ) : 0;
92
+ VIRTUAL_PMU_IRQ : 0;
93
94
if (vms->gic_version == VIRT_GIC_VERSION_2) {
95
physical_base_address = memmap[VIRT_GIC_CPU].base;
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
96
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
18
index XXXXXXX..XXXXXXX 100644
97
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/virt.c
98
--- a/hw/arm/virt.c
20
+++ b/hw/arm/virt.c
99
+++ b/hw/arm/virt.c
21
@@ -XXX,XX +XXX,XX @@ static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
100
@@ -XXX,XX +XXX,XX @@ static void fdt_add_timer_nodes(const VirtMachineState *vms)
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
}
101
}
30
- if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
102
qemu_fdt_setprop(ms->fdt, "/timer", "always-on", NULL, 0);
31
- VirtMachineState *vms = VIRT_MACHINE(machine);
103
qemu_fdt_setprop_cells(ms->fdt, "/timer", "interrupts",
32
-
104
- GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_S_EL1_IRQ, irqflags,
33
- if (!vms->bootinfo.firmware_loaded || !virt_is_acpi_enabled(vms)) {
105
- GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_NS_EL1_IRQ, irqflags,
34
- return HOTPLUG_HANDLER(machine);
106
- GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_VIRT_IRQ, irqflags,
35
- }
107
- GIC_FDT_IRQ_TYPE_PPI, ARCH_TIMER_NS_EL2_IRQ, irqflags);
36
- }
108
+ GIC_FDT_IRQ_TYPE_PPI,
37
return NULL;
109
+ INTID_TO_PPI(ARCH_TIMER_S_EL1_IRQ), irqflags,
110
+ GIC_FDT_IRQ_TYPE_PPI,
111
+ INTID_TO_PPI(ARCH_TIMER_NS_EL1_IRQ), irqflags,
112
+ GIC_FDT_IRQ_TYPE_PPI,
113
+ INTID_TO_PPI(ARCH_TIMER_VIRT_IRQ), irqflags,
114
+ GIC_FDT_IRQ_TYPE_PPI,
115
+ INTID_TO_PPI(ARCH_TIMER_NS_EL2_IRQ), irqflags);
38
}
116
}
39
117
40
diff --git a/hw/virtio/virtio-iommu-pci.c b/hw/virtio/virtio-iommu-pci.c
118
static void fdt_add_cpu_nodes(const VirtMachineState *vms)
41
index XXXXXXX..XXXXXXX 100644
119
@@ -XXX,XX +XXX,XX @@ static void create_gic(VirtMachineState *vms, MemoryRegion *mem)
42
--- a/hw/virtio/virtio-iommu-pci.c
120
*/
43
+++ b/hw/virtio/virtio-iommu-pci.c
121
for (i = 0; i < smp_cpus; i++) {
44
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
122
DeviceState *cpudev = DEVICE(qemu_get_cpu(i));
45
VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
123
- int ppibase = NUM_IRQS + i * GIC_INTERNAL + GIC_NR_SGIS;
46
124
+ int intidbase = NUM_IRQS + i * GIC_INTERNAL;
47
if (!qdev_get_machine_hotplug_handler(DEVICE(vpci_dev))) {
125
/* Mapping from the output timer irq lines from the CPU to the
48
- MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
126
* GIC PPI inputs we use for the virt board.
49
-
127
*/
50
- error_setg(errp,
128
@@ -XXX,XX +XXX,XX @@ static void create_gic(VirtMachineState *vms, MemoryRegion *mem)
51
- "%s machine fails to create iommu-map device tree bindings",
129
for (unsigned irq = 0; irq < ARRAY_SIZE(timer_irq); irq++) {
52
- mc->name);
130
qdev_connect_gpio_out(cpudev, irq,
53
- error_append_hint(errp,
131
qdev_get_gpio_in(vms->gic,
54
- "Check your machine implements a hotplug handler "
132
- ppibase + timer_irq[irq]));
55
- "for the virtio-iommu-pci device\n");
133
+ intidbase + timer_irq[irq]));
56
- error_append_hint(errp, "Check the guest is booted without FW or with "
134
}
57
- "-no-acpi\n");
135
58
+ error_setg(errp, "Check your machine implements a hotplug handler "
136
if (vms->gic_version != VIRT_GIC_VERSION_2) {
59
+ "for the virtio-iommu-pci device");
137
qemu_irq irq = qdev_get_gpio_in(vms->gic,
60
return;
138
- ppibase + ARCH_GIC_MAINT_IRQ);
61
}
139
+ intidbase + ARCH_GIC_MAINT_IRQ);
62
for (int i = 0; i < s->nb_reserved_regions; i++) {
140
qdev_connect_gpio_out_named(cpudev, "gicv3-maintenance-interrupt",
141
0, irq);
142
} else if (vms->virt) {
143
qemu_irq irq = qdev_get_gpio_in(vms->gic,
144
- ppibase + ARCH_GIC_MAINT_IRQ);
145
+ intidbase + ARCH_GIC_MAINT_IRQ);
146
sysbus_connect_irq(gicbusdev, i + 4 * smp_cpus, irq);
147
}
148
149
qdev_connect_gpio_out_named(cpudev, "pmu-interrupt", 0,
150
- qdev_get_gpio_in(vms->gic, ppibase
151
+ qdev_get_gpio_in(vms->gic, intidbase
152
+ VIRTUAL_PMU_IRQ));
153
154
sysbus_connect_irq(gicbusdev, i, qdev_get_gpio_in(cpudev, ARM_CPU_IRQ));
155
@@ -XXX,XX +XXX,XX @@ static void virt_cpu_post_init(VirtMachineState *vms, MemoryRegion *sysmem)
156
if (pmu) {
157
assert(arm_feature(&ARM_CPU(cpu)->env, ARM_FEATURE_PMU));
158
if (kvm_irqchip_in_kernel()) {
159
- kvm_arm_pmu_set_irq(cpu, PPI(VIRTUAL_PMU_IRQ));
160
+ kvm_arm_pmu_set_irq(cpu, VIRTUAL_PMU_IRQ);
161
}
162
kvm_arm_pmu_init(cpu);
163
}
63
--
164
--
64
2.25.1
165
2.34.1
65
66
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Leif Lindholm <quic_llindhol@quicinc.com>
2
2
3
gicv3_set_gicv3state() is used by arm_gicv3_common.c in
3
virt.h defines a number of IRQs that are ultimately described by Arm's
4
arm_gicv3_common_realize(). Since we want to restrict
4
Base System Architecture specification. Move these to a dedicated header
5
arm_gicv3_cpuif.c to TCG, extract gicv3_set_gicv3state()
5
so that they can be reused by other platforms that do the same.
6
to a new file. Add this file to the meson 'specific'
6
Include that header from virt.h to minimise churn.
7
source set, since it needs access to "cpu.h".
8
7
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
While we're moving the definitions, sort them into numerical order,
9
and add the ARCH_TIMER_NS_EL2_VIRT_IRQ definition used by sbsa-ref
10
and which will eventually be needed by virt also.
11
12
Signed-off-by: Leif Lindholm <quic_llindhol@quicinc.com>
13
Message-id: 20230919090229.188092-3-quic_llindhol@quicinc.com
14
[PMM: Remove unused PPI_TO_INTID macro; sort numerically;
15
add ARCH_TIMER_NS_EL2_VIRT_IRQ]
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20211115223619.2599282-2-philmd@redhat.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
18
---
14
hw/intc/arm_gicv3_cpuif.c | 10 +---------
19
include/hw/arm/bsa.h | 35 +++++++++++++++++++++++++++++++++++
15
hw/intc/arm_gicv3_cpuif_common.c | 22 ++++++++++++++++++++++
20
include/hw/arm/virt.h | 12 +-----------
16
hw/intc/meson.build | 1 +
21
2 files changed, 36 insertions(+), 11 deletions(-)
17
3 files changed, 24 insertions(+), 9 deletions(-)
22
create mode 100644 include/hw/arm/bsa.h
18
create mode 100644 hw/intc/arm_gicv3_cpuif_common.c
19
23
20
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
24
diff --git a/include/hw/arm/bsa.h b/include/hw/arm/bsa.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/intc/arm_gicv3_cpuif.c
23
+++ b/hw/intc/arm_gicv3_cpuif.c
24
@@ -XXX,XX +XXX,XX @@
25
/*
26
- * ARM Generic Interrupt Controller v3
27
+ * ARM Generic Interrupt Controller v3 (emulation)
28
*
29
* Copyright (c) 2016 Linaro Limited
30
* Written by Peter Maydell
31
@@ -XXX,XX +XXX,XX @@
32
#include "hw/irq.h"
33
#include "cpu.h"
34
35
-void gicv3_set_gicv3state(CPUState *cpu, GICv3CPUState *s)
36
-{
37
- ARMCPU *arm_cpu = ARM_CPU(cpu);
38
- CPUARMState *env = &arm_cpu->env;
39
-
40
- env->gicv3state = (void *)s;
41
-};
42
-
43
static GICv3CPUState *icc_cs_from_env(CPUARMState *env)
44
{
45
return env->gicv3state;
46
diff --git a/hw/intc/arm_gicv3_cpuif_common.c b/hw/intc/arm_gicv3_cpuif_common.c
47
new file mode 100644
25
new file mode 100644
48
index XXXXXXX..XXXXXXX
26
index XXXXXXX..XXXXXXX
49
--- /dev/null
27
--- /dev/null
50
+++ b/hw/intc/arm_gicv3_cpuif_common.c
28
+++ b/include/hw/arm/bsa.h
51
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@
52
+/* SPDX-License-Identifier: GPL-2.0-or-later */
53
+/*
30
+/*
54
+ * ARM Generic Interrupt Controller v3
31
+ * Common definitions for Arm Base System Architecture (BSA) platforms.
55
+ *
32
+ *
56
+ * Copyright (c) 2016 Linaro Limited
33
+ * Copyright (c) 2015 Linaro Limited
57
+ * Written by Peter Maydell
34
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
58
+ *
35
+ *
59
+ * This code is licensed under the GPL, version 2 or (at your option)
36
+ * This program is free software; you can redistribute it and/or modify it
60
+ * any later version.
37
+ * under the terms and conditions of the GNU General Public License,
38
+ * version 2 or later, as published by the Free Software Foundation.
39
+ *
40
+ * This program is distributed in the hope it will be useful, but WITHOUT
41
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
42
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
43
+ * more details.
44
+ *
45
+ * You should have received a copy of the GNU General Public License along with
46
+ * this program. If not, see <http://www.gnu.org/licenses/>.
47
+ *
61
+ */
48
+ */
62
+
49
+
63
+#include "qemu/osdep.h"
50
+#ifndef QEMU_ARM_BSA_H
64
+#include "gicv3_internal.h"
51
+#define QEMU_ARM_BSA_H
65
+#include "cpu.h"
66
+
52
+
67
+void gicv3_set_gicv3state(CPUState *cpu, GICv3CPUState *s)
53
+/* These are architectural INTID values */
68
+{
54
+#define VIRTUAL_PMU_IRQ 23
69
+ ARMCPU *arm_cpu = ARM_CPU(cpu);
55
+#define ARCH_GIC_MAINT_IRQ 25
70
+ CPUARMState *env = &arm_cpu->env;
56
+#define ARCH_TIMER_NS_EL2_IRQ 26
57
+#define ARCH_TIMER_VIRT_IRQ 27
58
+#define ARCH_TIMER_NS_EL2_VIRT_IRQ 28
59
+#define ARCH_TIMER_S_EL1_IRQ 29
60
+#define ARCH_TIMER_NS_EL1_IRQ 30
71
+
61
+
72
+ env->gicv3state = (void *)s;
62
+#define INTID_TO_PPI(irq) ((irq) - 16)
73
+};
63
+
74
diff --git a/hw/intc/meson.build b/hw/intc/meson.build
64
+#endif /* QEMU_ARM_BSA_H */
65
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
75
index XXXXXXX..XXXXXXX 100644
66
index XXXXXXX..XXXXXXX 100644
76
--- a/hw/intc/meson.build
67
--- a/include/hw/arm/virt.h
77
+++ b/hw/intc/meson.build
68
+++ b/include/hw/arm/virt.h
78
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_PMU', if_true: files('xlnx-pmu-iomod-in
69
@@ -XXX,XX +XXX,XX @@
79
70
#include "qemu/notify.h"
80
specific_ss.add(when: 'CONFIG_ALLWINNER_A10_PIC', if_true: files('allwinner-a10-pic.c'))
71
#include "hw/boards.h"
81
specific_ss.add(when: 'CONFIG_APIC', if_true: files('apic.c', 'apic_common.c'))
72
#include "hw/arm/boot.h"
82
+specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif_common.c'))
73
+#include "hw/arm/bsa.h"
83
specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif.c'))
74
#include "hw/block/flash.h"
84
specific_ss.add(when: 'CONFIG_ARM_GIC_KVM', if_true: files('arm_gic_kvm.c'))
75
#include "sysemu/kvm.h"
85
specific_ss.add(when: ['CONFIG_ARM_GIC_KVM', 'TARGET_AARCH64'], if_true: files('arm_gicv3_kvm.c', 'arm_gicv3_its_kvm.c'))
76
#include "hw/intc/arm_gicv3_common.h"
77
@@ -XXX,XX +XXX,XX @@
78
#define NUM_VIRTIO_TRANSPORTS 32
79
#define NUM_SMMU_IRQS 4
80
81
-#define ARCH_GIC_MAINT_IRQ 25
82
-
83
-#define ARCH_TIMER_VIRT_IRQ 27
84
-#define ARCH_TIMER_S_EL1_IRQ 29
85
-#define ARCH_TIMER_NS_EL1_IRQ 30
86
-#define ARCH_TIMER_NS_EL2_IRQ 26
87
-
88
-#define VIRTUAL_PMU_IRQ 23
89
-
90
-#define INTID_TO_PPI(irq) ((irq) - 16)
91
-
92
/* See Linux kernel arch/arm64/include/asm/pvclock-abi.h */
93
#define PVTIME_SIZE_PER_CPU 64
94
86
--
95
--
87
2.25.1
96
2.34.1
88
89
diff view generated by jsdifflib
1
A lot of C files in hw/arm include qemu-common.h when they don't
1
From: Leif Lindholm <quic_llindhol@quicinc.com>
2
need anything from it. Drop the include lines.
3
2
4
omap1.c, pxa2xx.c and strongarm.c retain the include because they
3
Use the private peripheral interrupt definitions from bsa.h instead of
5
use it for the prototype of qemu_get_timedate().
4
defining them locally. Refactor to use the INTIDs defined there instead
5
of the PPI# used previously.
6
6
7
Signed-off-by: Leif Lindholm <quic_llindhol@quicinc.com>
8
Message-id: 20230919090229.188092-4-quic_llindhol@quicinc.com
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
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
13
---
11
---
14
hw/arm/boot.c | 1 -
12
hw/arm/sbsa-ref.c | 21 +++++++++------------
15
hw/arm/digic_boards.c | 1 -
13
1 file changed, 9 insertions(+), 12 deletions(-)
16
hw/arm/highbank.c | 1 -
17
hw/arm/npcm7xx_boards.c | 1 -
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(-)
23
14
24
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/boot.c
27
+++ b/hw/arm/boot.c
28
@@ -XXX,XX +XXX,XX @@
29
*/
30
31
#include "qemu/osdep.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
15
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
73
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/arm/sbsa-ref.c
17
--- a/hw/arm/sbsa-ref.c
75
+++ b/hw/arm/sbsa-ref.c
18
+++ b/hw/arm/sbsa-ref.c
76
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
77
*/
20
* ARM SBSA Reference Platform emulation
78
21
*
79
#include "qemu/osdep.h"
22
* Copyright (c) 2018 Linaro Limited
80
-#include "qemu-common.h"
23
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
81
#include "qemu/datadir.h"
24
* Written by Hongbo Zhang <hongbo.zhang@linaro.org>
82
#include "qapi/error.h"
25
*
83
#include "qemu/error-report.h"
26
* This program is free software; you can redistribute it and/or modify it
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 @@
27
@@ -XXX,XX +XXX,XX @@
89
28
#include "exec/hwaddr.h"
90
#include "qemu/osdep.h"
29
#include "kvm_arm.h"
91
#include "qapi/error.h"
30
#include "hw/arm/boot.h"
92
-#include "qemu-common.h"
31
+#include "hw/arm/bsa.h"
93
#include "exec/address-spaces.h"
32
#include "hw/arm/fdt.h"
94
#include "sysemu/sysemu.h"
33
#include "hw/arm/smmuv3.h"
95
#include "hw/arm/stm32f405_soc.h"
34
#include "hw/block/flash.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 @@
35
@@ -XXX,XX +XXX,XX @@
101
36
#define NUM_SMMU_IRQS 4
102
#include "qemu/osdep.h"
37
#define NUM_SATA_PORTS 6
103
#include "qapi/error.h"
38
104
-#include "qemu-common.h"
39
-#define VIRTUAL_PMU_IRQ 7
105
#include "qemu/datadir.h"
40
-#define ARCH_GIC_MAINT_IRQ 9
106
#include "cpu.h"
41
-#define ARCH_TIMER_VIRT_IRQ 11
107
#include "hw/sysbus.h"
42
-#define ARCH_TIMER_S_EL1_IRQ 13
108
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
43
-#define ARCH_TIMER_NS_EL1_IRQ 14
109
index XXXXXXX..XXXXXXX 100644
44
-#define ARCH_TIMER_NS_EL2_IRQ 10
110
--- a/hw/arm/virt.c
45
-#define ARCH_TIMER_NS_EL2_VIRT_IRQ 12
111
+++ b/hw/arm/virt.c
46
-
112
@@ -XXX,XX +XXX,XX @@
47
enum {
113
*/
48
SBSA_FLASH,
114
49
SBSA_MEM,
115
#include "qemu/osdep.h"
50
@@ -XXX,XX +XXX,XX @@ static void create_gic(SBSAMachineState *sms, MemoryRegion *mem)
116
-#include "qemu-common.h"
51
*/
117
#include "qemu/datadir.h"
52
for (i = 0; i < smp_cpus; i++) {
118
#include "qemu/units.h"
53
DeviceState *cpudev = DEVICE(qemu_get_cpu(i));
119
#include "qemu/option.h"
54
- int ppibase = NUM_IRQS + i * GIC_INTERNAL + GIC_NR_SGIS;
55
+ int intidbase = NUM_IRQS + i * GIC_INTERNAL;
56
int irq;
57
/*
58
* Mapping from the output timer irq lines from the CPU to the
59
@@ -XXX,XX +XXX,XX @@ static void create_gic(SBSAMachineState *sms, MemoryRegion *mem)
60
for (irq = 0; irq < ARRAY_SIZE(timer_irq); irq++) {
61
qdev_connect_gpio_out(cpudev, irq,
62
qdev_get_gpio_in(sms->gic,
63
- ppibase + timer_irq[irq]));
64
+ intidbase + timer_irq[irq]));
65
}
66
67
qdev_connect_gpio_out_named(cpudev, "gicv3-maintenance-interrupt", 0,
68
- qdev_get_gpio_in(sms->gic, ppibase
69
+ qdev_get_gpio_in(sms->gic,
70
+ intidbase
71
+ ARCH_GIC_MAINT_IRQ));
72
+
73
qdev_connect_gpio_out_named(cpudev, "pmu-interrupt", 0,
74
- qdev_get_gpio_in(sms->gic, ppibase
75
+ qdev_get_gpio_in(sms->gic,
76
+ intidbase
77
+ VIRTUAL_PMU_IRQ));
78
79
sysbus_connect_irq(gicbusdev, i, qdev_get_gpio_in(cpudev, ARM_CPU_IRQ));
120
--
80
--
121
2.25.1
81
2.34.1
122
123
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Cornelia Huck <cohuck@redhat.com>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
We can neaten the code by switching to the kvm_set_one_reg function.
4
5
Reviewed-by: Gavin Shan <gshan@redhat.com>
6
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Message-id: 20231010142453.224369-2-cohuck@redhat.com
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
---
11
---
7
target/arm/translate-a64.c | 7 ++++---
12
target/arm/kvm.c | 13 +++------
8
1 file changed, 4 insertions(+), 3 deletions(-)
13
target/arm/kvm64.c | 66 +++++++++++++---------------------------------
9
14
2 files changed, 21 insertions(+), 58 deletions(-)
10
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
15
16
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
11
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
12
--- a/target/arm/translate-a64.c
18
--- a/target/arm/kvm.c
13
+++ b/target/arm/translate-a64.c
19
+++ b/target/arm/kvm.c
14
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
20
@@ -XXX,XX +XXX,XX @@ bool write_list_to_kvmstate(ARMCPU *cpu, int level)
15
{
21
bool ok = true;
16
DisasContext *s = container_of(dcbase, DisasContext, base);
22
17
CPUARMState *env = cpu->env_ptr;
23
for (i = 0; i < cpu->cpreg_array_len; i++) {
18
+ uint64_t pc = s->base.pc_next;
24
- struct kvm_one_reg r;
19
uint32_t insn;
25
uint64_t regidx = cpu->cpreg_indexes[i];
20
26
uint32_t v32;
21
if (s->ss_active && !s->pstate_ss) {
27
int ret;
22
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
28
@@ -XXX,XX +XXX,XX @@ bool write_list_to_kvmstate(ARMCPU *cpu, int level)
29
continue;
30
}
31
32
- r.id = regidx;
33
switch (regidx & KVM_REG_SIZE_MASK) {
34
case KVM_REG_SIZE_U32:
35
v32 = cpu->cpreg_values[i];
36
- r.addr = (uintptr_t)&v32;
37
+ ret = kvm_set_one_reg(cs, regidx, &v32);
38
break;
39
case KVM_REG_SIZE_U64:
40
- r.addr = (uintptr_t)(cpu->cpreg_values + i);
41
+ ret = kvm_set_one_reg(cs, regidx, cpu->cpreg_values + i);
42
break;
43
default:
44
g_assert_not_reached();
45
}
46
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &r);
47
if (ret) {
48
/* We might fail for "unknown register" and also for
49
* "you tried to set a register which is constant with
50
@@ -XXX,XX +XXX,XX @@ void kvm_arm_get_virtual_time(CPUState *cs)
51
void kvm_arm_put_virtual_time(CPUState *cs)
52
{
53
ARMCPU *cpu = ARM_CPU(cs);
54
- struct kvm_one_reg reg = {
55
- .id = KVM_REG_ARM_TIMER_CNT,
56
- .addr = (uintptr_t)&cpu->kvm_vtime,
57
- };
58
int ret;
59
60
if (!cpu->kvm_vtime_dirty) {
23
return;
61
return;
24
}
62
}
25
63
26
- s->pc_curr = s->base.pc_next;
64
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
27
- insn = arm_ldl_code(env, &s->base, s->base.pc_next, s->sctlr_b);
65
+ ret = kvm_set_one_reg(cs, KVM_REG_ARM_TIMER_CNT, &cpu->kvm_vtime);
28
+ s->pc_curr = pc;
66
if (ret) {
29
+ insn = arm_ldl_code(env, &s->base, pc, s->sctlr_b);
67
error_report("Failed to set KVM_REG_ARM_TIMER_CNT");
30
s->insn = insn;
68
abort();
31
- s->base.pc_next += 4;
69
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
32
+ s->base.pc_next = pc + 4;
70
index XXXXXXX..XXXXXXX 100644
33
71
--- a/target/arm/kvm64.c
34
s->fp_access_checked = false;
72
+++ b/target/arm/kvm64.c
35
s->sve_access_checked = false;
73
@@ -XXX,XX +XXX,XX @@ static int kvm_arm_sve_set_vls(CPUState *cs)
74
{
75
ARMCPU *cpu = ARM_CPU(cs);
76
uint64_t vls[KVM_ARM64_SVE_VLS_WORDS] = { cpu->sve_vq.map };
77
- struct kvm_one_reg reg = {
78
- .id = KVM_REG_ARM64_SVE_VLS,
79
- .addr = (uint64_t)&vls[0],
80
- };
81
82
assert(cpu->sve_max_vq <= KVM_ARM64_SVE_VQ_MAX);
83
84
- return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
85
+ return kvm_set_one_reg(cs, KVM_REG_ARM64_SVE_VLS, &vls[0]);
86
}
87
88
#define ARM_CPU_ID_MPIDR 3, 0, 0, 0, 5
89
@@ -XXX,XX +XXX,XX @@ static void kvm_inject_arm_sea(CPUState *c)
90
static int kvm_arch_put_fpsimd(CPUState *cs)
91
{
92
CPUARMState *env = &ARM_CPU(cs)->env;
93
- struct kvm_one_reg reg;
94
int i, ret;
95
96
for (i = 0; i < 32; i++) {
97
uint64_t *q = aa64_vfp_qreg(env, i);
98
#if HOST_BIG_ENDIAN
99
uint64_t fp_val[2] = { q[1], q[0] };
100
- reg.addr = (uintptr_t)fp_val;
101
+ ret = kvm_set_one_reg(cs, AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]),
102
+ fp_val);
103
#else
104
- reg.addr = (uintptr_t)q;
105
+ ret = kvm_set_one_reg(cs, AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]), q);
106
#endif
107
- reg.id = AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]);
108
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
109
if (ret) {
110
return ret;
111
}
112
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_put_sve(CPUState *cs)
113
CPUARMState *env = &cpu->env;
114
uint64_t tmp[ARM_MAX_VQ * 2];
115
uint64_t *r;
116
- struct kvm_one_reg reg;
117
int n, ret;
118
119
for (n = 0; n < KVM_ARM64_SVE_NUM_ZREGS; ++n) {
120
r = sve_bswap64(tmp, &env->vfp.zregs[n].d[0], cpu->sve_max_vq * 2);
121
- reg.addr = (uintptr_t)r;
122
- reg.id = KVM_REG_ARM64_SVE_ZREG(n, 0);
123
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
124
+ ret = kvm_set_one_reg(cs, KVM_REG_ARM64_SVE_ZREG(n, 0), r);
125
if (ret) {
126
return ret;
127
}
128
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_put_sve(CPUState *cs)
129
for (n = 0; n < KVM_ARM64_SVE_NUM_PREGS; ++n) {
130
r = sve_bswap64(tmp, r = &env->vfp.pregs[n].p[0],
131
DIV_ROUND_UP(cpu->sve_max_vq * 2, 8));
132
- reg.addr = (uintptr_t)r;
133
- reg.id = KVM_REG_ARM64_SVE_PREG(n, 0);
134
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
135
+ ret = kvm_set_one_reg(cs, KVM_REG_ARM64_SVE_PREG(n, 0), r);
136
if (ret) {
137
return ret;
138
}
139
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_put_sve(CPUState *cs)
140
141
r = sve_bswap64(tmp, &env->vfp.pregs[FFR_PRED_NUM].p[0],
142
DIV_ROUND_UP(cpu->sve_max_vq * 2, 8));
143
- reg.addr = (uintptr_t)r;
144
- reg.id = KVM_REG_ARM64_SVE_FFR(0);
145
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
146
+ ret = kvm_set_one_reg(cs, KVM_REG_ARM64_SVE_FFR(0), r);
147
if (ret) {
148
return ret;
149
}
150
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_put_sve(CPUState *cs)
151
152
int kvm_arch_put_registers(CPUState *cs, int level)
153
{
154
- struct kvm_one_reg reg;
155
uint64_t val;
156
uint32_t fpr;
157
int i, ret;
158
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
159
}
160
161
for (i = 0; i < 31; i++) {
162
- reg.id = AARCH64_CORE_REG(regs.regs[i]);
163
- reg.addr = (uintptr_t) &env->xregs[i];
164
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
165
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(regs.regs[i]),
166
+ &env->xregs[i]);
167
if (ret) {
168
return ret;
169
}
170
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
171
*/
172
aarch64_save_sp(env, 1);
173
174
- reg.id = AARCH64_CORE_REG(regs.sp);
175
- reg.addr = (uintptr_t) &env->sp_el[0];
176
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
177
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(regs.sp), &env->sp_el[0]);
178
if (ret) {
179
return ret;
180
}
181
182
- reg.id = AARCH64_CORE_REG(sp_el1);
183
- reg.addr = (uintptr_t) &env->sp_el[1];
184
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
185
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(sp_el1), &env->sp_el[1]);
186
if (ret) {
187
return ret;
188
}
189
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
190
} else {
191
val = cpsr_read(env);
192
}
193
- reg.id = AARCH64_CORE_REG(regs.pstate);
194
- reg.addr = (uintptr_t) &val;
195
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
196
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(regs.pstate), &val);
197
if (ret) {
198
return ret;
199
}
200
201
- reg.id = AARCH64_CORE_REG(regs.pc);
202
- reg.addr = (uintptr_t) &env->pc;
203
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
204
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(regs.pc), &env->pc);
205
if (ret) {
206
return ret;
207
}
208
209
- reg.id = AARCH64_CORE_REG(elr_el1);
210
- reg.addr = (uintptr_t) &env->elr_el[1];
211
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
212
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(elr_el1), &env->elr_el[1]);
213
if (ret) {
214
return ret;
215
}
216
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
217
218
/* KVM 0-4 map to QEMU banks 1-5 */
219
for (i = 0; i < KVM_NR_SPSR; i++) {
220
- reg.id = AARCH64_CORE_REG(spsr[i]);
221
- reg.addr = (uintptr_t) &env->banked_spsr[i + 1];
222
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
223
+ ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(spsr[i]),
224
+ &env->banked_spsr[i + 1]);
225
if (ret) {
226
return ret;
227
}
228
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
229
return ret;
230
}
231
232
- reg.addr = (uintptr_t)(&fpr);
233
fpr = vfp_get_fpsr(env);
234
- reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpsr);
235
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
236
+ ret = kvm_set_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpsr), &fpr);
237
if (ret) {
238
return ret;
239
}
240
241
- reg.addr = (uintptr_t)(&fpr);
242
fpr = vfp_get_fpcr(env);
243
- reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpcr);
244
- ret = kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &reg);
245
+ ret = kvm_set_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpcr), &fpr);
246
if (ret) {
247
return ret;
248
}
36
--
249
--
37
2.25.1
250
2.34.1
38
251
39
252
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Cornelia Huck <cohuck@redhat.com>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
We can neaten the code by switching the callers that work on a
4
CPUstate to the kvm_get_one_reg function.
5
6
Reviewed-by: Gavin Shan <gshan@redhat.com>
7
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Message-id: 20231010142453.224369-3-cohuck@redhat.com
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
---
12
---
7
target/arm/translate.c | 9 +++++----
13
target/arm/kvm.c | 15 +++---------
8
1 file changed, 5 insertions(+), 4 deletions(-)
14
target/arm/kvm64.c | 57 ++++++++++++----------------------------------
9
15
2 files changed, 18 insertions(+), 54 deletions(-)
10
diff --git a/target/arm/translate.c b/target/arm/translate.c
16
17
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
11
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
12
--- a/target/arm/translate.c
19
--- a/target/arm/kvm.c
13
+++ b/target/arm/translate.c
20
+++ b/target/arm/kvm.c
14
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
21
@@ -XXX,XX +XXX,XX @@ bool write_kvmstate_to_list(ARMCPU *cpu)
15
{
22
bool ok = true;
16
DisasContext *dc = container_of(dcbase, DisasContext, base);
23
17
CPUARMState *env = cpu->env_ptr;
24
for (i = 0; i < cpu->cpreg_array_len; i++) {
18
+ uint32_t pc = dc->base.pc_next;
25
- struct kvm_one_reg r;
19
unsigned int insn;
26
uint64_t regidx = cpu->cpreg_indexes[i];
20
27
uint32_t v32;
21
if (arm_pre_translate_insn(dc)) {
28
int ret;
22
- dc->base.pc_next += 4;
29
23
+ dc->base.pc_next = pc + 4;
30
- r.id = regidx;
31
-
32
switch (regidx & KVM_REG_SIZE_MASK) {
33
case KVM_REG_SIZE_U32:
34
- r.addr = (uintptr_t)&v32;
35
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &r);
36
+ ret = kvm_get_one_reg(cs, regidx, &v32);
37
if (!ret) {
38
cpu->cpreg_values[i] = v32;
39
}
40
break;
41
case KVM_REG_SIZE_U64:
42
- r.addr = (uintptr_t)(cpu->cpreg_values + i);
43
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &r);
44
+ ret = kvm_get_one_reg(cs, regidx, cpu->cpreg_values + i);
45
break;
46
default:
47
g_assert_not_reached();
48
@@ -XXX,XX +XXX,XX @@ int kvm_arm_sync_mpstate_to_qemu(ARMCPU *cpu)
49
void kvm_arm_get_virtual_time(CPUState *cs)
50
{
51
ARMCPU *cpu = ARM_CPU(cs);
52
- struct kvm_one_reg reg = {
53
- .id = KVM_REG_ARM_TIMER_CNT,
54
- .addr = (uintptr_t)&cpu->kvm_vtime,
55
- };
56
int ret;
57
58
if (cpu->kvm_vtime_dirty) {
24
return;
59
return;
25
}
60
}
26
61
27
- dc->pc_curr = dc->base.pc_next;
62
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
28
- insn = arm_ldl_code(env, &dc->base, dc->base.pc_next, dc->sctlr_b);
63
+ ret = kvm_get_one_reg(cs, KVM_REG_ARM_TIMER_CNT, &cpu->kvm_vtime);
29
+ dc->pc_curr = pc;
64
if (ret) {
30
+ insn = arm_ldl_code(env, &dc->base, pc, dc->sctlr_b);
65
error_report("Failed to get KVM_REG_ARM_TIMER_CNT");
31
dc->insn = insn;
66
abort();
32
- dc->base.pc_next += 4;
67
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
33
+ dc->base.pc_next = pc + 4;
68
index XXXXXXX..XXXXXXX 100644
34
disas_arm_insn(dc, insn);
69
--- a/target/arm/kvm64.c
35
70
+++ b/target/arm/kvm64.c
36
arm_post_translate_insn(dc);
71
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
72
static int kvm_arch_get_fpsimd(CPUState *cs)
73
{
74
CPUARMState *env = &ARM_CPU(cs)->env;
75
- struct kvm_one_reg reg;
76
int i, ret;
77
78
for (i = 0; i < 32; i++) {
79
uint64_t *q = aa64_vfp_qreg(env, i);
80
- reg.id = AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]);
81
- reg.addr = (uintptr_t)q;
82
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
83
+ ret = kvm_get_one_reg(cs, AARCH64_SIMD_CORE_REG(fp_regs.vregs[i]), q);
84
if (ret) {
85
return ret;
86
} else {
87
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_get_sve(CPUState *cs)
88
{
89
ARMCPU *cpu = ARM_CPU(cs);
90
CPUARMState *env = &cpu->env;
91
- struct kvm_one_reg reg;
92
uint64_t *r;
93
int n, ret;
94
95
for (n = 0; n < KVM_ARM64_SVE_NUM_ZREGS; ++n) {
96
r = &env->vfp.zregs[n].d[0];
97
- reg.addr = (uintptr_t)r;
98
- reg.id = KVM_REG_ARM64_SVE_ZREG(n, 0);
99
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
100
+ ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_ZREG(n, 0), r);
101
if (ret) {
102
return ret;
103
}
104
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_get_sve(CPUState *cs)
105
106
for (n = 0; n < KVM_ARM64_SVE_NUM_PREGS; ++n) {
107
r = &env->vfp.pregs[n].p[0];
108
- reg.addr = (uintptr_t)r;
109
- reg.id = KVM_REG_ARM64_SVE_PREG(n, 0);
110
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
111
+ ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_PREG(n, 0), r);
112
if (ret) {
113
return ret;
114
}
115
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_get_sve(CPUState *cs)
116
}
117
118
r = &env->vfp.pregs[FFR_PRED_NUM].p[0];
119
- reg.addr = (uintptr_t)r;
120
- reg.id = KVM_REG_ARM64_SVE_FFR(0);
121
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
122
+ ret = kvm_get_one_reg(cs, KVM_REG_ARM64_SVE_FFR(0), r);
123
if (ret) {
124
return ret;
125
}
126
@@ -XXX,XX +XXX,XX @@ static int kvm_arch_get_sve(CPUState *cs)
127
128
int kvm_arch_get_registers(CPUState *cs)
129
{
130
- struct kvm_one_reg reg;
131
uint64_t val;
132
unsigned int el;
133
uint32_t fpr;
134
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs)
135
CPUARMState *env = &cpu->env;
136
137
for (i = 0; i < 31; i++) {
138
- reg.id = AARCH64_CORE_REG(regs.regs[i]);
139
- reg.addr = (uintptr_t) &env->xregs[i];
140
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
141
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.regs[i]),
142
+ &env->xregs[i]);
143
if (ret) {
144
return ret;
145
}
146
}
147
148
- reg.id = AARCH64_CORE_REG(regs.sp);
149
- reg.addr = (uintptr_t) &env->sp_el[0];
150
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
151
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.sp), &env->sp_el[0]);
152
if (ret) {
153
return ret;
154
}
155
156
- reg.id = AARCH64_CORE_REG(sp_el1);
157
- reg.addr = (uintptr_t) &env->sp_el[1];
158
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
159
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(sp_el1), &env->sp_el[1]);
160
if (ret) {
161
return ret;
162
}
163
164
- reg.id = AARCH64_CORE_REG(regs.pstate);
165
- reg.addr = (uintptr_t) &val;
166
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
167
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.pstate), &val);
168
if (ret) {
169
return ret;
170
}
171
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs)
172
*/
173
aarch64_restore_sp(env, 1);
174
175
- reg.id = AARCH64_CORE_REG(regs.pc);
176
- reg.addr = (uintptr_t) &env->pc;
177
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
178
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.pc), &env->pc);
179
if (ret) {
180
return ret;
181
}
182
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs)
183
aarch64_sync_64_to_32(env);
184
}
185
186
- reg.id = AARCH64_CORE_REG(elr_el1);
187
- reg.addr = (uintptr_t) &env->elr_el[1];
188
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
189
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(elr_el1), &env->elr_el[1]);
190
if (ret) {
191
return ret;
192
}
193
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs)
194
* KVM SPSRs 0-4 map to QEMU banks 1-5
195
*/
196
for (i = 0; i < KVM_NR_SPSR; i++) {
197
- reg.id = AARCH64_CORE_REG(spsr[i]);
198
- reg.addr = (uintptr_t) &env->banked_spsr[i + 1];
199
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
200
+ ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(spsr[i]),
201
+ &env->banked_spsr[i + 1]);
202
if (ret) {
203
return ret;
204
}
205
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs)
206
return ret;
207
}
208
209
- reg.addr = (uintptr_t)(&fpr);
210
- reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpsr);
211
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
212
+ ret = kvm_get_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpsr), &fpr);
213
if (ret) {
214
return ret;
215
}
216
vfp_set_fpsr(env, fpr);
217
218
- reg.addr = (uintptr_t)(&fpr);
219
- reg.id = AARCH64_SIMD_CTRL_REG(fp_regs.fpcr);
220
- ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &reg);
221
+ ret = kvm_get_one_reg(cs, AARCH64_SIMD_CTRL_REG(fp_regs.fpcr), &fpr);
222
if (ret) {
223
return ret;
224
}
37
--
225
--
38
2.25.1
226
2.34.1
39
227
40
228
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
For the Thumb T32 encoding of LDM, if only a single register is
2
specified in the register list this instruction is UNPREDICTABLE,
3
with the following choices:
4
* instruction UNDEFs
5
* instruction is a NOP
6
* instruction loads a single register
7
* instruction loads an unspecified set of registers
2
8
3
Create arm_check_ss_active and arm_check_kernelpage.
9
Currently we choose to UNDEF (a behaviour chosen in commit
10
4b222545dbf30 in 2019; previously we treated it as "load the
11
specified single register").
4
12
5
Reverse the order of the tests. While it doesn't matter in practice,
13
Unfortunately there is real world code out there (which shipped in at
6
because only user-only has a kernel page and user-only never sets
14
least Android 11, 12 and 13) which incorrectly uses this
7
ss_active, ss_active has priority over execution exceptions and it
15
UNPREDICTABLE insn on the assumption that it does a single register
8
is best to keep them in the proper order.
16
load, which is (presumably) what it happens to do on real hardware,
17
and is also what it does on the equivalent A32 encoding.
9
18
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
19
Revert to the pre-4b222545dbf30 behaviour of not UNDEFing
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
20
for this T32 encoding.
21
22
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1799
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
25
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
26
Message-id: 20230927101853.39288-1-peter.maydell@linaro.org
13
---
27
---
14
target/arm/translate.c | 10 +++++++---
28
target/arm/tcg/translate.c | 37 +++++++++++++++++++++++--------------
15
1 file changed, 7 insertions(+), 3 deletions(-)
29
1 file changed, 23 insertions(+), 14 deletions(-)
16
30
17
diff --git a/target/arm/translate.c b/target/arm/translate.c
31
diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c
18
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/translate.c
33
--- a/target/arm/tcg/translate.c
20
+++ b/target/arm/translate.c
34
+++ b/target/arm/tcg/translate.c
21
@@ -XXX,XX +XXX,XX @@ static void arm_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
35
@@ -XXX,XX +XXX,XX @@ static void op_addr_block_post(DisasContext *s, arg_ldst_block *a,
22
dc->insn_start = tcg_last_op();
36
}
23
}
37
}
24
38
25
-static bool arm_pre_translate_insn(DisasContext *dc)
39
-static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n)
26
+static bool arm_check_kernelpage(DisasContext *dc)
40
+static bool op_stm(DisasContext *s, arg_ldst_block *a)
27
{
41
{
28
#ifdef CONFIG_USER_ONLY
42
int i, j, n, list, mem_idx;
29
/* Intercept jump to the magic kernel page. */
43
bool user = a->u;
30
@@ -XXX,XX +XXX,XX @@ static bool arm_pre_translate_insn(DisasContext *dc)
44
@@ -XXX,XX +XXX,XX @@ static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n)
45
46
list = a->list;
47
n = ctpop16(list);
48
- if (n < min_n || a->rn == 15) {
49
+ /*
50
+ * This is UNPREDICTABLE for n < 1 in all encodings, and we choose
51
+ * to UNDEF. In the T32 STM encoding n == 1 is also UNPREDICTABLE,
52
+ * but hardware treats it like the A32 version and implements the
53
+ * single-register-store, and some in-the-wild (buggy) software
54
+ * assumes that, so we don't UNDEF on that case.
55
+ */
56
+ if (n < 1 || a->rn == 15) {
57
unallocated_encoding(s);
31
return true;
58
return true;
32
}
59
}
33
#endif
60
@@ -XXX,XX +XXX,XX @@ static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n)
34
+ return false;
61
35
+}
62
static bool trans_STM(DisasContext *s, arg_ldst_block *a)
36
63
{
37
+static bool arm_check_ss_active(DisasContext *dc)
64
- /* BitCount(list) < 1 is UNPREDICTABLE */
38
+{
65
- return op_stm(s, a, 1);
39
if (dc->ss_active && !dc->pstate_ss) {
66
+ return op_stm(s, a);
40
/* Singlestep state is Active-pending.
67
}
41
* If we're in this state at the start of a TB then either
68
42
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
69
static bool trans_STM_t32(DisasContext *s, arg_ldst_block *a)
43
uint32_t pc = dc->base.pc_next;
70
@@ -XXX,XX +XXX,XX @@ static bool trans_STM_t32(DisasContext *s, arg_ldst_block *a)
44
unsigned int insn;
71
unallocated_encoding(s);
45
72
return true;
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
}
73
}
51
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
74
- /* BitCount(list) < 2 is UNPREDICTABLE */
52
uint32_t insn;
75
- return op_stm(s, a, 2);
53
bool is_16bit;
76
+ return op_stm(s, a);
54
77
}
55
- if (arm_pre_translate_insn(dc)) {
78
56
+ if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
79
-static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
57
dc->base.pc_next = pc + 2;
80
+static bool do_ldm(DisasContext *s, arg_ldst_block *a)
58
return;
81
{
82
int i, j, n, list, mem_idx;
83
bool loaded_base;
84
@@ -XXX,XX +XXX,XX @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
85
86
list = a->list;
87
n = ctpop16(list);
88
- if (n < min_n || a->rn == 15) {
89
+ /*
90
+ * This is UNPREDICTABLE for n < 1 in all encodings, and we choose
91
+ * to UNDEF. In the T32 LDM encoding n == 1 is also UNPREDICTABLE,
92
+ * but hardware treats it like the A32 version and implements the
93
+ * single-register-load, and some in-the-wild (buggy) software
94
+ * assumes that, so we don't UNDEF on that case.
95
+ */
96
+ if (n < 1 || a->rn == 15) {
97
unallocated_encoding(s);
98
return true;
59
}
99
}
100
@@ -XXX,XX +XXX,XX @@ static bool trans_LDM_a32(DisasContext *s, arg_ldst_block *a)
101
unallocated_encoding(s);
102
return true;
103
}
104
- /* BitCount(list) < 1 is UNPREDICTABLE */
105
- return do_ldm(s, a, 1);
106
+ return do_ldm(s, a);
107
}
108
109
static bool trans_LDM_t32(DisasContext *s, arg_ldst_block *a)
110
@@ -XXX,XX +XXX,XX @@ static bool trans_LDM_t32(DisasContext *s, arg_ldst_block *a)
111
unallocated_encoding(s);
112
return true;
113
}
114
- /* BitCount(list) < 2 is UNPREDICTABLE */
115
- return do_ldm(s, a, 2);
116
+ return do_ldm(s, a);
117
}
118
119
static bool trans_LDM_t16(DisasContext *s, arg_ldst_block *a)
120
{
121
/* Writeback is conditional on the base register not being loaded. */
122
a->w = !(a->list & (1 << a->rn));
123
- /* BitCount(list) < 1 is UNPREDICTABLE */
124
- return do_ldm(s, a, 1);
125
+ return do_ldm(s, a);
126
}
127
128
static bool trans_CLRM(DisasContext *s, arg_CLRM *a)
60
--
129
--
61
2.25.1
130
2.34.1
62
131
63
132
diff view generated by jsdifflib
1
From: Joel Stanley <joel@jms.id.au>
1
Update the SMMUv3 ID register bit field definitions to the
2
set in the most recent specification (IHI0700 F.a).
2
3
3
This is the latest URL for the OpenBMC CI. The old URL still works, but
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
redirects.
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Mostafa Saleh <smostafa@google.com>
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Message-id: 20230914145705.1648377-2-peter.maydell@linaro.org
9
---
10
hw/arm/smmuv3-internal.h | 38 ++++++++++++++++++++++++++++++++++++++
11
1 file changed, 38 insertions(+)
5
12
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
13
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
7
Signed-off-by: Joel Stanley <joel@jms.id.au>
8
Message-id: 20211117065752.330632-3-joel@jms.id.au
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
docs/system/arm/aspeed.rst | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/system/arm/aspeed.rst
15
--- a/hw/arm/smmuv3-internal.h
17
+++ b/docs/system/arm/aspeed.rst
16
+++ b/hw/arm/smmuv3-internal.h
18
@@ -XXX,XX +XXX,XX @@ The Aspeed machines can be started using the ``-kernel`` option to
17
@@ -XXX,XX +XXX,XX @@ REG32(IDR0, 0x0)
19
load a Linux kernel or from a firmware. Images can be downloaded from
18
FIELD(IDR0, S1P, 1 , 1)
20
the OpenBMC jenkins :
19
FIELD(IDR0, TTF, 2 , 2)
21
20
FIELD(IDR0, COHACC, 4 , 1)
22
- https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/distro=ubuntu,label=docker-builder
21
+ FIELD(IDR0, BTM, 5 , 1)
23
+ https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/
22
+ FIELD(IDR0, HTTU, 6 , 2)
24
23
+ FIELD(IDR0, DORMHINT, 8 , 1)
25
or directly from the OpenBMC GitHub release repository :
24
+ FIELD(IDR0, HYP, 9 , 1)
25
+ FIELD(IDR0, ATS, 10, 1)
26
+ FIELD(IDR0, NS1ATS, 11, 1)
27
FIELD(IDR0, ASID16, 12, 1)
28
+ FIELD(IDR0, MSI, 13, 1)
29
+ FIELD(IDR0, SEV, 14, 1)
30
+ FIELD(IDR0, ATOS, 15, 1)
31
+ FIELD(IDR0, PRI, 16, 1)
32
+ FIELD(IDR0, VMW, 17, 1)
33
FIELD(IDR0, VMID16, 18, 1)
34
+ FIELD(IDR0, CD2L, 19, 1)
35
+ FIELD(IDR0, VATOS, 20, 1)
36
FIELD(IDR0, TTENDIAN, 21, 2)
37
+ FIELD(IDR0, ATSRECERR, 23, 1)
38
FIELD(IDR0, STALL_MODEL, 24, 2)
39
FIELD(IDR0, TERM_MODEL, 26, 1)
40
FIELD(IDR0, STLEVEL, 27, 2)
41
+ FIELD(IDR0, RME_IMPL, 30, 1)
42
43
REG32(IDR1, 0x4)
44
FIELD(IDR1, SIDSIZE, 0 , 6)
45
+ FIELD(IDR1, SSIDSIZE, 6 , 5)
46
+ FIELD(IDR1, PRIQS, 11, 5)
47
FIELD(IDR1, EVENTQS, 16, 5)
48
FIELD(IDR1, CMDQS, 21, 5)
49
+ FIELD(IDR1, ATTR_PERMS_OVR, 26, 1)
50
+ FIELD(IDR1, ATTR_TYPES_OVR, 27, 1)
51
+ FIELD(IDR1, REL, 28, 1)
52
+ FIELD(IDR1, QUEUES_PRESET, 29, 1)
53
+ FIELD(IDR1, TABLES_PRESET, 30, 1)
54
+ FIELD(IDR1, ECMDQ, 31, 1)
55
56
#define SMMU_IDR1_SIDSIZE 16
57
#define SMMU_CMDQS 19
58
#define SMMU_EVENTQS 19
59
60
REG32(IDR2, 0x8)
61
+ FIELD(IDR2, BA_VATOS, 0, 10)
62
+
63
REG32(IDR3, 0xc)
64
FIELD(IDR3, HAD, 2, 1);
65
+ FIELD(IDR3, PBHA, 3, 1);
66
+ FIELD(IDR3, XNX, 4, 1);
67
+ FIELD(IDR3, PPS, 5, 1);
68
+ FIELD(IDR3, MPAM, 7, 1);
69
+ FIELD(IDR3, FWB, 8, 1);
70
+ FIELD(IDR3, STT, 9, 1);
71
FIELD(IDR3, RIL, 10, 1);
72
FIELD(IDR3, BBML, 11, 2);
73
+ FIELD(IDR3, E0PD, 13, 1);
74
+ FIELD(IDR3, PTWNNC, 14, 1);
75
+ FIELD(IDR3, DPT, 15, 1);
76
+
77
REG32(IDR4, 0x10)
78
+
79
REG32(IDR5, 0x14)
80
FIELD(IDR5, OAS, 0, 3);
81
FIELD(IDR5, GRAN4K, 4, 1);
82
FIELD(IDR5, GRAN16K, 5, 1);
83
FIELD(IDR5, GRAN64K, 6, 1);
84
+ FIELD(IDR5, VAX, 10, 2);
85
+ FIELD(IDR5, STALL_MAX, 16, 16);
86
87
#define SMMU_IDR5_OAS 4
26
88
27
--
89
--
28
2.25.1
90
2.34.1
29
30
diff view generated by jsdifflib
Deleted patch
1
From: Joel Stanley <joel@jms.id.au>
2
1
3
A common use case for the ASPEED machine is to boot a Linux kernel.
4
Provide a full example command line.
5
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Signed-off-by: Joel Stanley <joel@jms.id.au>
8
Message-id: 20211117065752.330632-4-joel@jms.id.au
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
docs/system/arm/aspeed.rst | 15 ++++++++++++---
12
1 file changed, 12 insertions(+), 3 deletions(-)
13
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
15
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/system/arm/aspeed.rst
17
+++ b/docs/system/arm/aspeed.rst
18
@@ -XXX,XX +XXX,XX @@ Missing devices
19
Boot options
20
------------
21
22
-The Aspeed machines can be started using the ``-kernel`` option to
23
-load a Linux kernel or from a firmware. Images can be downloaded from
24
-the OpenBMC jenkins :
25
+The Aspeed machines can be started using the ``-kernel`` and ``-dtb`` options
26
+to load a Linux kernel or from a firmware. Images can be downloaded from the
27
+OpenBMC jenkins :
28
29
https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/
30
31
@@ -XXX,XX +XXX,XX @@ or directly from the OpenBMC GitHub release repository :
32
33
https://github.com/openbmc/openbmc/releases
34
35
+To boot a kernel directly from a Linux build tree:
36
+
37
+.. code-block:: bash
38
+
39
+ $ qemu-system-arm -M ast2600-evb -nographic \
40
+ -kernel arch/arm/boot/zImage \
41
+ -dtb arch/arm/boot/dts/aspeed-ast2600-evb.dtb \
42
+ -initrd rootfs.cpio
43
+
44
The image should be attached as an MTD drive. Run :
45
46
.. code-block:: bash
47
--
48
2.25.1
49
50
diff view generated by jsdifflib
Deleted patch
1
From: Olivier Hériveaux <olivier.heriveaux@ledger.fr>
2
1
3
Fix issue where the data register may be overwritten by next character
4
reception before being read and returned.
5
6
Signed-off-by: Olivier Hériveaux <olivier.heriveaux@ledger.fr>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20211128120723.4053-1-olivier.heriveaux@ledger.fr
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/char/stm32f2xx_usart.c | 3 ++-
13
1 file changed, 2 insertions(+), 1 deletion(-)
14
15
diff --git a/hw/char/stm32f2xx_usart.c b/hw/char/stm32f2xx_usart.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/char/stm32f2xx_usart.c
18
+++ b/hw/char/stm32f2xx_usart.c
19
@@ -XXX,XX +XXX,XX @@ static uint64_t stm32f2xx_usart_read(void *opaque, hwaddr addr,
20
return retvalue;
21
case USART_DR:
22
DB_PRINT("Value: 0x%" PRIx32 ", %c\n", s->usart_dr, (char) s->usart_dr);
23
+ retvalue = s->usart_dr & 0x3FF;
24
s->usart_sr &= ~USART_SR_RXNE;
25
qemu_chr_fe_accept_input(&s->chr);
26
qemu_set_irq(s->irq, 0);
27
- return s->usart_dr & 0x3FF;
28
+ return retvalue;
29
case USART_BRR:
30
return s->usart_brr;
31
case USART_CR1:
32
--
33
2.25.1
34
35
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
1
3
The TYPE_ARM_GICV3 device is an emulated one. When using
4
KVM, it is recommended to use the TYPE_KVM_ARM_GICV3 device
5
(which uses in-kernel support).
6
7
When using --with-devices-FOO, it is possible to build a
8
binary with a specific set of devices. When this binary is
9
restricted to KVM accelerator, the TYPE_ARM_GICV3 device is
10
irrelevant, and it is desirable to remove it from the binary.
11
12
Therefore introduce the CONFIG_ARM_GIC_TCG Kconfig selector
13
which select the files required to have the TYPE_ARM_GICV3
14
device, but also allowing to de-select this device.
15
16
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Message-id: 20211115223619.2599282-3-philmd@redhat.com
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
21
hw/intc/arm_gicv3.c | 2 +-
22
hw/intc/Kconfig | 5 +++++
23
hw/intc/meson.build | 10 ++++++----
24
3 files changed, 12 insertions(+), 5 deletions(-)
25
26
diff --git a/hw/intc/arm_gicv3.c b/hw/intc/arm_gicv3.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/intc/arm_gicv3.c
29
+++ b/hw/intc/arm_gicv3.c
30
@@ -XXX,XX +XXX,XX @@
31
/*
32
- * ARM Generic Interrupt Controller v3
33
+ * ARM Generic Interrupt Controller v3 (emulation)
34
*
35
* Copyright (c) 2015 Huawei.
36
* Copyright (c) 2016 Linaro Limited
37
diff --git a/hw/intc/Kconfig b/hw/intc/Kconfig
38
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/intc/Kconfig
40
+++ b/hw/intc/Kconfig
41
@@ -XXX,XX +XXX,XX @@ config APIC
42
select MSI_NONBROKEN
43
select I8259
44
45
+config ARM_GIC_TCG
46
+ bool
47
+ default y
48
+ depends on ARM_GIC && TCG
49
+
50
config ARM_GIC_KVM
51
bool
52
default y
53
diff --git a/hw/intc/meson.build b/hw/intc/meson.build
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/intc/meson.build
56
+++ b/hw/intc/meson.build
57
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_ARM_GIC', if_true: files(
58
'arm_gic.c',
59
'arm_gic_common.c',
60
'arm_gicv2m.c',
61
- 'arm_gicv3.c',
62
'arm_gicv3_common.c',
63
- 'arm_gicv3_dist.c',
64
'arm_gicv3_its_common.c',
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'))
84
--
85
2.25.1
86
87
diff view generated by jsdifflib
1
In the SSE decode function gen_sse(), we combine a byte
1
In smmuv3_init_regs() when we set the various bits in the ID
2
'b' and a value 'b1' which can be [0..3], and switch on them:
2
registers, we do this almost in order of the fields in the
3
b |= (b1 << 8);
3
registers, but not quite. Move the initialization of
4
switch (b) {
4
SMMU_IDR3.RIL and SMMU_IDR5.OAS into their correct places.
5
...
6
default:
7
unknown_op:
8
gen_unknown_opcode(env, s);
9
return;
10
}
11
5
12
In three cases inside this switch, we were then also checking for
13
"if (b1 >= 2) { goto unknown_op; }".
14
However, this can never happen, because the 'case' values in each place
15
are 0x0nn or 0x1nn and the switch will have directed the b1 == (2, 3)
16
cases to the default already.
17
18
This check was added in commit c045af25a52e9 in 2010; the added code
19
was unnecessary then as well, and was apparently intended only to
20
ensure that we never accidentally ended up indexing off the end
21
of an sse_op_table with only 2 entries as a result of future bugs
22
in the decode logic.
23
24
Change the checks to assert() instead, and make sure they're always
25
immediately before the array access they are protecting.
26
27
Fixes: Coverity CID 1460207
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Mostafa Saleh <smostafa@google.com>
9
Reviewed-by: Eric Auger <eric.auger@redhat.com>
10
Message-id: 20230914145705.1648377-3-peter.maydell@linaro.org
30
---
11
---
31
target/i386/tcg/translate.c | 12 +++---------
12
hw/arm/smmuv3.c | 4 ++--
32
1 file changed, 3 insertions(+), 9 deletions(-)
13
1 file changed, 2 insertions(+), 2 deletions(-)
33
14
34
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
15
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
35
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
36
--- a/target/i386/tcg/translate.c
17
--- a/hw/arm/smmuv3.c
37
+++ b/target/i386/tcg/translate.c
18
+++ b/hw/arm/smmuv3.c
38
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
19
@@ -XXX,XX +XXX,XX @@ static void smmuv3_init_regs(SMMUv3State *s)
39
case 0x171: /* shift xmm, im */
20
s->idr[1] = FIELD_DP32(s->idr[1], IDR1, EVENTQS, SMMU_EVENTQS);
40
case 0x172:
21
s->idr[1] = FIELD_DP32(s->idr[1], IDR1, CMDQS, SMMU_CMDQS);
41
case 0x173:
22
42
- if (b1 >= 2) {
23
- s->idr[3] = FIELD_DP32(s->idr[3], IDR3, RIL, 1);
43
- goto unknown_op;
24
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, HAD, 1);
44
- }
25
+ s->idr[3] = FIELD_DP32(s->idr[3], IDR3, RIL, 1);
45
val = x86_ldub_code(env, s);
26
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, BBML, 2);
46
if (is_xmm) {
27
47
tcg_gen_movi_tl(s->T0, val);
28
+ s->idr[5] = FIELD_DP32(s->idr[5], IDR5, OAS, SMMU_IDR5_OAS); /* 44 bits */
48
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
29
/* 4K, 16K and 64K granule support */
49
offsetof(CPUX86State, mmx_t0.MMX_L(1)));
30
s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN4K, 1);
50
op1_offset = offsetof(CPUX86State,mmx_t0);
31
s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN16K, 1);
51
}
32
s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN64K, 1);
52
+ assert(b1 < 2);
33
- s->idr[5] = FIELD_DP32(s->idr[5], IDR5, OAS, SMMU_IDR5_OAS); /* 44 bits */
53
sse_fn_epp = sse_op_table2[((b - 1) & 3) * 8 +
34
54
(((modrm >> 3)) & 7)][b1];
35
s->cmdq.base = deposit64(s->cmdq.base, 0, 5, SMMU_CMDQS);
55
if (!sse_fn_epp) {
36
s->cmdq.prod = 0;
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;
80
--
37
--
81
2.25.1
38
2.34.1
82
83
diff view generated by jsdifflib
1
The qemu-common.h header is not supposed to be included from any
1
The SMMUv3.1-XNX feature is mandatory for an SMMUv3.1 if S2P is
2
other header files, only from .c files (as documented in a comment at
2
supported, so we should theoretically have implemented it as part of
3
the start of it).
3
the recent S2P work. Fortunately, for us the implementation is a
4
no-op.
4
5
5
include/hw/i386/x86.h and include/hw/i386/microvm.h break this rule.
6
This feature is about interpretation of the stage 2 page table
6
In fact, the include is not required at all, so we can just drop it
7
descriptor XN bits, which control execute permissions.
7
from both files.
8
9
For QEMU, the permission bits passed to an IOMMU (via MemTxAttrs and
10
IOMMUAccessFlags) only indicate read and write; we do not distinguish
11
data reads from instruction reads outside the CPU proper. In the
12
SMMU architecture's terms, our interconnect between the client device
13
and the SMMU doesn't have the ability to convey the INST attribute,
14
and we therefore use the default value of "data" for this attribute.
15
16
We also do not support the bits in the Stream Table Entry that can
17
override the on-the-bus transaction attribute permissions (we do not
18
set SMMU_IDR1.ATTR_PERMS_OVR=1).
19
20
These two things together mean that for our implementation, it never
21
has to deal with transactions with the INST attribute, and so it can
22
correctly ignore the XN bits entirely. So we already implement
23
FEAT_XNX's "XN field is now 2 bits, not 1" behaviour to the extent
24
that we need to.
25
26
Advertise the presence of the feature in SMMU_IDR3.XNX.
8
27
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
30
Reviewed-by: Mostafa Saleh <smostafa@google.com>
12
Message-id: 20211129200510.1233037-2-peter.maydell@linaro.org
31
Reviewed-by: Eric Auger <eric.auger@redhat.com>
32
Message-id: 20230914145705.1648377-4-peter.maydell@linaro.org
13
---
33
---
14
include/hw/i386/microvm.h | 1 -
34
hw/arm/smmuv3.c | 4 ++++
15
include/hw/i386/x86.h | 1 -
35
1 file changed, 4 insertions(+)
16
2 files changed, 2 deletions(-)
17
36
18
diff --git a/include/hw/i386/microvm.h b/include/hw/i386/microvm.h
37
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
19
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/i386/microvm.h
39
--- a/hw/arm/smmuv3.c
21
+++ b/include/hw/i386/microvm.h
40
+++ b/hw/arm/smmuv3.c
22
@@ -XXX,XX +XXX,XX @@
41
@@ -XXX,XX +XXX,XX @@ static void smmuv3_init_regs(SMMUv3State *s)
23
#ifndef HW_I386_MICROVM_H
42
s->idr[1] = FIELD_DP32(s->idr[1], IDR1, CMDQS, SMMU_CMDQS);
24
#define HW_I386_MICROVM_H
43
25
44
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, HAD, 1);
26
-#include "qemu-common.h"
45
+ if (FIELD_EX32(s->idr[0], IDR0, S2P)) {
27
#include "exec/hwaddr.h"
46
+ /* XNX is a stage-2-specific feature */
28
#include "qemu/notify.h"
47
+ s->idr[3] = FIELD_DP32(s->idr[3], IDR3, XNX, 1);
29
48
+ }
30
diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
49
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, RIL, 1);
31
index XXXXXXX..XXXXXXX 100644
50
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, BBML, 2);
32
--- a/include/hw/i386/x86.h
33
+++ b/include/hw/i386/x86.h
34
@@ -XXX,XX +XXX,XX @@
35
#ifndef HW_I386_X86_H
36
#define HW_I386_X86_H
37
38
-#include "qemu-common.h"
39
#include "exec/hwaddr.h"
40
#include "qemu/notify.h"
41
51
42
--
52
--
43
2.25.1
53
2.34.1
44
45
diff view generated by jsdifflib
1
The calculation of the length of TLB range invalidate operations
1
FEAT_HPMN0 is a small feature which defines that it is valid for
2
in tlbi_aa64_range_get_length() is incorrect in two ways:
2
MDCR_EL2.HPMN to be set to 0, meaning "no PMU event counters provided
3
* the NUM field is 5 bits, but we read only 4 bits
3
to an EL1 guest" (previously this setting was reserved). QEMU's
4
* we miscalculate the page_shift value, because of an
4
implementation almost gets HPMN == 0 right, but we need to fix
5
off-by-one error:
5
one check in pmevcntr_is_64_bit(). That is enough for us to
6
TG 0b00 is invalid
6
advertise the feature in the 'max' CPU.
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
11
7
12
Thanks to the bug report submitter Cha HyunSoo for identifying
8
(We don't need to make the behaviour conditional on feature
13
both these errors.
9
presence, because the FEAT_HPMN0 behaviour is within the range
10
of permitted UNPREDICTABLE behaviour for a non-FEAT_HPMN0
11
implementation.)
14
12
15
Fixes: 84940ed82552d3c ("target/arm: Add support for FEAT_TLBIRANGE")
16
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/734
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
15
Message-id: 20230921185445.3339214-1-peter.maydell@linaro.org
20
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Message-id: 20211130173257.1274194-1-peter.maydell@linaro.org
22
---
16
---
23
target/arm/helper.c | 6 +++---
17
docs/system/arm/emulation.rst | 1 +
24
1 file changed, 3 insertions(+), 3 deletions(-)
18
target/arm/helper.c | 2 +-
19
target/arm/tcg/cpu32.c | 4 ++++
20
target/arm/tcg/cpu64.c | 1 +
21
4 files changed, 7 insertions(+), 1 deletion(-)
25
22
23
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
24
index XXXXXXX..XXXXXXX 100644
25
--- a/docs/system/arm/emulation.rst
26
+++ b/docs/system/arm/emulation.rst
27
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
28
- FEAT_HCX (Support for the HCRX_EL2 register)
29
- FEAT_HPDS (Hierarchical permission disables)
30
- FEAT_HPDS2 (Translation table page-based hardware attributes)
31
+- FEAT_HPMN0 (Setting of MDCR_EL2.HPMN to zero)
32
- FEAT_I8MM (AArch64 Int8 matrix multiplication instructions)
33
- FEAT_IDST (ID space trap handling)
34
- FEAT_IESB (Implicit error synchronization event)
26
diff --git a/target/arm/helper.c b/target/arm/helper.c
35
diff --git a/target/arm/helper.c b/target/arm/helper.c
27
index XXXXXXX..XXXXXXX 100644
36
index XXXXXXX..XXXXXXX 100644
28
--- a/target/arm/helper.c
37
--- a/target/arm/helper.c
29
+++ b/target/arm/helper.c
38
+++ b/target/arm/helper.c
30
@@ -XXX,XX +XXX,XX @@ static uint64_t tlbi_aa64_range_get_length(CPUARMState *env,
39
@@ -XXX,XX +XXX,XX @@ static bool pmevcntr_is_64_bit(CPUARMState *env, int counter)
31
uint64_t exponent;
40
bool hlp = env->cp15.mdcr_el2 & MDCR_HLP;
32
uint64_t length;
41
int hpmn = env->cp15.mdcr_el2 & MDCR_HPMN;
33
42
34
- num = extract64(value, 39, 4);
43
- if (hpmn != 0 && counter >= hpmn) {
35
+ num = extract64(value, 39, 5);
44
+ if (counter >= hpmn) {
36
scale = extract64(value, 44, 2);
45
return hlp;
37
page_size_granule = extract64(value, 46, 2);
46
}
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;
45
}
47
}
46
48
diff --git a/target/arm/tcg/cpu32.c b/target/arm/tcg/cpu32.c
47
+ page_shift = (page_size_granule - 1) * 2 + 12;
49
index XXXXXXX..XXXXXXX 100644
50
--- a/target/arm/tcg/cpu32.c
51
+++ b/target/arm/tcg/cpu32.c
52
@@ -XXX,XX +XXX,XX @@ void aa32_max_features(ARMCPU *cpu)
53
t = FIELD_DP32(t, ID_DFR0, COPSDBG, 9); /* FEAT_Debugv8p4 */
54
t = FIELD_DP32(t, ID_DFR0, PERFMON, 6); /* FEAT_PMUv3p5 */
55
cpu->isar.id_dfr0 = t;
48
+
56
+
49
exponent = (5 * scale) + 1;
57
+ t = cpu->isar.id_dfr1;
50
length = (num + 1) << (exponent + page_shift);
58
+ t = FIELD_DP32(t, ID_DFR1, HPMN0, 1); /* FEAT_HPMN0 */
51
59
+ cpu->isar.id_dfr1 = t;
60
}
61
62
/* CPU models. These are not needed for the AArch64 linux-user build. */
63
diff --git a/target/arm/tcg/cpu64.c b/target/arm/tcg/cpu64.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/target/arm/tcg/cpu64.c
66
+++ b/target/arm/tcg/cpu64.c
67
@@ -XXX,XX +XXX,XX @@ void aarch64_max_tcg_initfn(Object *obj)
68
t = cpu->isar.id_aa64dfr0;
69
t = FIELD_DP64(t, ID_AA64DFR0, DEBUGVER, 9); /* FEAT_Debugv8p4 */
70
t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 6); /* FEAT_PMUv3p5 */
71
+ t = FIELD_DP64(t, ID_AA64DFR0, HPMN0, 1); /* FEAT_HPMN0 */
72
cpu->isar.id_aa64dfr0 = t;
73
74
t = cpu->isar.id_aa64smfr0;
52
--
75
--
53
2.25.1
76
2.34.1
54
55
diff view generated by jsdifflib
1
The qemu-common.h header is not supposed to be included from any
1
The include of hw/arm/virt.h in kvm64.c is unnecessary and also a
2
other header files, only from .c files (as documented in a comment at
2
layering violation since the generic KVM code shouldn't need to know
3
the start of it).
3
anything about board-specifics. The include line is an accidental
4
4
leftover from commit 15613357ba53a4763, where we cleaned up the code
5
Nothing actually relies on target/rx/cpu.h including it, so we can
5
to not depend on virt board internals but forgot to also remove the
6
just drop the include.
6
now-redundant include line.
7
7
8
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>
9
Reviewed-by: Gavin Shan <gshan@redhat.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
11
Message-id: 20230925110429.3917202-1-peter.maydell@linaro.org
12
Reviewed-by: Yoshinori Sato <ysato@users.sourceforge.jp>
13
Message-id: 20211129200510.1233037-4-peter.maydell@linaro.org
14
---
12
---
15
target/rx/cpu.h | 1 -
13
target/arm/kvm64.c | 1 -
16
1 file changed, 1 deletion(-)
14
1 file changed, 1 deletion(-)
17
15
18
diff --git a/target/rx/cpu.h b/target/rx/cpu.h
16
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
19
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
20
--- a/target/rx/cpu.h
18
--- a/target/arm/kvm64.c
21
+++ b/target/rx/cpu.h
19
+++ b/target/arm/kvm64.c
22
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@
23
#define RX_CPU_H
21
#include "internals.h"
24
22
#include "hw/acpi/acpi.h"
25
#include "qemu/bitops.h"
23
#include "hw/acpi/ghes.h"
26
-#include "qemu-common.h"
24
-#include "hw/arm/virt.h"
27
#include "hw/registerfields.h"
25
28
#include "cpu-qom.h"
26
static bool have_guest_debug;
29
27
30
--
28
--
31
2.25.1
29
2.34.1
32
30
33
31
diff view generated by jsdifflib
1
The qemu-common.h header is not supposed to be included from any
1
The hw/arm/boot.h include in common-semi-target.h is not actually
2
other header files, only from .c files (as documented in a comment at
2
needed, and it's a bit odd because it pulls a hw/arm header into a
3
the start of it).
3
target/arm file.
4
4
5
Move the include to linux-user/hexagon/cpu_loop.c, which needs it for
5
This include was originally needed because the semihosting code used
6
the declaration of cpu_exec_step_atomic().
6
the arm_boot_info struct to get the base address of the RAM in system
7
emulation, to use in a (bad) heuristic for the return values for the
8
SYS_HEAPINFO semihosting call. We've since overhauled how we
9
calculate the HEAPINFO values in system emulation, and the code no
10
longer uses the arm_boot_info struct.
11
12
Remove the now-redundant include line, and instead directly include
13
the cpu-qom.h header that we were previously getting via boot.h.
7
14
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20230925112219.3919261-1-peter.maydell@linaro.org
11
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
12
Message-id: 20211129200510.1233037-3-peter.maydell@linaro.org
13
---
18
---
14
target/hexagon/cpu.h | 1 -
19
target/arm/common-semi-target.h | 4 +---
15
linux-user/hexagon/cpu_loop.c | 1 +
20
1 file changed, 1 insertion(+), 3 deletions(-)
16
2 files changed, 1 insertion(+), 1 deletion(-)
17
21
18
diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h
22
diff --git a/target/arm/common-semi-target.h b/target/arm/common-semi-target.h
19
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
20
--- a/target/hexagon/cpu.h
24
--- a/target/arm/common-semi-target.h
21
+++ b/target/hexagon/cpu.h
25
+++ b/target/arm/common-semi-target.h
22
@@ -XXX,XX +XXX,XX @@ typedef struct CPUHexagonState CPUHexagonState;
23
24
#include "fpu/softfloat-types.h"
25
26
-#include "qemu-common.h"
27
#include "exec/cpu-defs.h"
28
#include "hex_regs.h"
29
#include "mmvec/mmvec.h"
30
diff --git a/linux-user/hexagon/cpu_loop.c b/linux-user/hexagon/cpu_loop.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/linux-user/hexagon/cpu_loop.c
33
+++ b/linux-user/hexagon/cpu_loop.c
34
@@ -XXX,XX +XXX,XX @@
26
@@ -XXX,XX +XXX,XX @@
35
*/
27
#ifndef TARGET_ARM_COMMON_SEMI_TARGET_H
36
28
#define TARGET_ARM_COMMON_SEMI_TARGET_H
37
#include "qemu/osdep.h"
29
38
+#include "qemu-common.h"
30
-#ifndef CONFIG_USER_ONLY
39
#include "qemu.h"
31
-#include "hw/arm/boot.h"
40
#include "user-internals.h"
32
-#endif
41
#include "cpu_loop-common.h"
33
+#include "target/arm/cpu-qom.h"
34
35
static inline target_ulong common_semi_arg(CPUState *cs, int argno)
36
{
42
--
37
--
43
2.25.1
38
2.34.1
44
45
diff view generated by jsdifflib
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
1
The code for powering on a CPU in arm-powerctl.c has two separate
2
2
use cases:
3
Add expected blobs of the VIOT and DSDT table for the VIOT test on the
3
* emulation of a real hardware power controller
4
q35 machine.
4
* emulation of firmware interfaces (primarily PSCI) with
5
5
CPU on/off APIs
6
Since the test instantiates a virtio device and two PCIe expander
6
7
bridges, DSDT.viot has more blocks than the base DSDT.
7
For the first case, we only need to reset the CPU and set its
8
8
starting PC and X0. For the second case, because we're emulating the
9
The VIOT table generated for the q35 test is:
9
firmware we need to ensure that it's in the state that the firmware
10
10
provides. In particular, when we reset to a lower EL than the
11
[000h 0000 4] Signature : "VIOT" [Virtual I/O Translation Table]
11
highest one we are emulating, we need to put the CPU into a state
12
[004h 0004 4] Table Length : 00000070
12
that permits correct running at that lower EL. We already do a
13
[008h 0008 1] Revision : 00
13
little of this in arm-powerctl.c (for instance we set SCR_HCE to
14
[009h 0009 1] Checksum : 3D
14
enable the HVC insn) but we don't do enough of it. This means that
15
[00Ah 0010 6] Oem ID : "BOCHS "
15
in the case where we are emulating EL3 but also providing emulated
16
[010h 0016 8] Oem Table ID : "BXPC "
16
PSCI the guest will crash when a secondary core tries to use a
17
[018h 0024 4] Oem Revision : 00000001
17
feature that needs an SCR_EL3 bit to be set, such as MTE or PAuth.
18
[01Ch 0028 4] Asl Compiler ID : "BXPC"
18
19
[020h 0032 4] Asl Compiler Revision : 00000001
19
The hw/arm/boot.c code also has to support this "start guest code in
20
20
an EL that's lower than the highest emulated EL" case in order to do
21
[024h 0036 2] Node count : 0003
21
direct guest kernel booting; it has all the necessary initialization
22
[026h 0038 2] Node offset : 0030
22
code to set the SCR_EL3 bits. Pull the relevant boot.c code out into
23
[028h 0040 8] Reserved : 0000000000000000
23
a separate function so we can share it between there and
24
24
arm-powerctl.c.
25
[030h 0048 1] Type : 03 [VirtIO-PCI IOMMU]
25
26
[031h 0049 1] Reserved : 00
26
This refactoring has a few code changes that look like they
27
[032h 0050 2] Length : 0010
27
might be behaviour changes but aren't:
28
28
* if info->secure_boot is false and info->secure_board_setup is
29
[034h 0052 2] PCI Segment : 0000
29
true, then the old code would start the first CPU in Hyp
30
[036h 0054 2] PCI BDF number : 0010
30
mode but without changing SCR.NS and NSACR.{CP11,CP10}.
31
[038h 0056 8] Reserved : 0000000000000000
31
This was wrong behaviour because there's no such thing
32
32
as Secure Hyp mode. The new code will leave the CPU in SVC.
33
[040h 0064 1] Type : 01 [PCI Range]
33
(There is no board which sets secure_boot to false and
34
[041h 0065 1] Reserved : 00
34
secure_board_setup to true, so this isn't a behaviour
35
[042h 0066 2] Length : 0018
35
change for any of our boards.)
36
36
* we don't explicitly clear SCR.NS when arm-powerctl.c
37
[044h 0068 4] Endpoint start : 00003000
37
does a CPU-on to EL3. This was a no-op because CPU reset
38
[048h 0072 2] PCI Segment start : 0000
38
will reset to NS == 0.
39
[04Ah 0074 2] PCI Segment end : 0000
39
40
[04Ch 0076 2] PCI BDF start : 3000
40
And some real behaviour changes:
41
[04Eh 0078 2] PCI BDF end : 30FF
41
* we no longer set HCR_EL2.RW when booting into EL2: the guest
42
[050h 0080 2] Output node : 0030
42
can and should do that themselves before dropping into their
43
[052h 0082 6] Reserved : 000000000000
43
EL1 code. (arm-powerctl and boot did this differently; I
44
44
opted to use the logic from arm-powerctl, which only sets
45
[058h 0088 1] Type : 01 [PCI Range]
45
HCR_EL2.RW when it's directly starting the guest in EL1,
46
[059h 0089 1] Reserved : 00
46
because it's more correct, and I don't expect guests to be
47
[05Ah 0090 2] Length : 0018
47
accidentally depending on our having set the RW bit for them.)
48
48
* if we are booting a CPU into AArch32 Secure SVC then we won't
49
[05Ch 0092 4] Endpoint start : 00001000
49
set SCR.HCE any more. This affects only the vexpress-a15 and
50
[060h 0096 2] PCI Segment start : 0000
50
raspi2b machine types. Guests booting in this case will either:
51
[062h 0098 2] PCI Segment end : 0000
51
- be able to set SCR.HCE themselves as part of moving from
52
[064h 0100 2] PCI BDF start : 1000
52
Secure SVC into NS Hyp mode
53
[066h 0102 2] PCI BDF end : 10FF
53
- will move from Secure SVC to NS SVC, and won't care about
54
[068h 0104 2] Output node : 0030
54
behaviour of the HVC insn
55
[06Ah 0106 6] Reserved : 000000000000
55
- will stay in Secure SVC, and won't care about HVC
56
56
* on an arm-powerctl CPU-on we will now set the SCR bits for
57
And the DSDT diff is:
57
pauth/mte/sve/sme/hcx/fgt features
58
58
59
@@ -XXX,XX +XXX,XX @@
59
The first two of these are very minor and I don't expect guest
60
*
60
code to trip over them, so I didn't judge it worth convoluting
61
* Disassembling to symbolic ASL+ operators
61
the code in an attempt to keep exactly the same boot.c behaviour.
62
*
62
The third change fixes issue 1899.
63
- * Disassembly of tests/data/acpi/q35/DSDT, Fri Dec 10 15:03:08 2021
63
64
+ * Disassembly of /tmp/aml-H9Y5D1, Fri Dec 10 15:02:27 2021
64
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1899
65
*
65
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
66
* Original Table Header:
66
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
67
* Signature "DSDT"
67
Message-id: 20230926155619.4028618-1-peter.maydell@linaro.org
68
- * Length 0x00002061 (8289)
68
---
69
+ * Length 0x000024B6 (9398)
69
target/arm/cpu.h | 22 +++++++++
70
* Revision 0x01 **** 32-bit table (V1), no 64-bit math support
70
hw/arm/boot.c | 95 ++++++++++-----------------------------
71
- * Checksum 0xFA
71
target/arm/arm-powerctl.c | 53 +---------------------
72
+ * Checksum 0xA7
72
target/arm/cpu.c | 95 +++++++++++++++++++++++++++++++++++++++
73
* OEM ID "BOCHS "
73
4 files changed, 141 insertions(+), 124 deletions(-)
74
* OEM Table ID "BXPC "
74
75
* OEM Revision 0x00000001 (1)
75
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
76
@@ -XXX,XX +XXX,XX @@
76
index XXXXXXX..XXXXXXX 100644
77
}
77
--- a/target/arm/cpu.h
78
+++ b/target/arm/cpu.h
79
@@ -XXX,XX +XXX,XX @@ int arm_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
80
int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
81
int cpuid, DumpState *s);
82
83
+/**
84
+ * arm_emulate_firmware_reset: Emulate firmware CPU reset handling
85
+ * @cpu: CPU (which must have been freshly reset)
86
+ * @target_el: exception level to put the CPU into
87
+ * @secure: whether to put the CPU in secure state
88
+ *
89
+ * When QEMU is directly running a guest kernel at a lower level than
90
+ * EL3 it implicitly emulates some aspects of the guest firmware.
91
+ * This includes that on reset we need to configure the parts of the
92
+ * CPU corresponding to EL3 so that the real guest code can run at its
93
+ * lower exception level. This function does that post-reset CPU setup,
94
+ * for when we do direct boot of a guest kernel, and for when we
95
+ * emulate PSCI and similar firmware interfaces starting a CPU at a
96
+ * lower exception level.
97
+ *
98
+ * @target_el must be an EL implemented by the CPU between 1 and 3.
99
+ * We do not support dropping into a Secure EL other than 3.
100
+ *
101
+ * It is the responsibility of the caller to call arm_rebuild_hflags().
102
+ */
103
+void arm_emulate_firmware_reset(CPUState *cpustate, int target_el);
104
+
105
#ifdef TARGET_AARCH64
106
int aarch64_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
107
int aarch64_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
108
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
109
index XXXXXXX..XXXXXXX 100644
110
--- a/hw/arm/boot.c
111
+++ b/hw/arm/boot.c
112
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
113
114
cpu_set_pc(cs, entry);
115
} else {
116
- /* If we are booting Linux then we need to check whether we are
117
- * booting into secure or non-secure state and adjust the state
118
- * accordingly. Out of reset, ARM is defined to be in secure state
119
- * (SCR.NS = 0), we change that here if non-secure boot has been
120
- * requested.
121
+ /*
122
+ * If we are booting Linux then we might need to do so at:
123
+ * - AArch64 NS EL2 or NS EL1
124
+ * - AArch32 Secure SVC (EL3)
125
+ * - AArch32 NS Hyp (EL2)
126
+ * - AArch32 NS SVC (EL1)
127
+ * Configure the CPU in the way boot firmware would do to
128
+ * drop us down to the appropriate level.
129
*/
130
- if (arm_feature(env, ARM_FEATURE_EL3)) {
131
- /* AArch64 is defined to come out of reset into EL3 if enabled.
132
- * If we are booting Linux then we need to adjust our EL as
133
- * Linux expects us to be in EL2 or EL1. AArch32 resets into
134
- * SVC, which Linux expects, so no privilege/exception level to
135
- * adjust.
136
- */
137
- if (env->aarch64) {
138
- env->cp15.scr_el3 |= SCR_RW;
139
- if (arm_feature(env, ARM_FEATURE_EL2)) {
140
- env->cp15.hcr_el2 |= HCR_RW;
141
- env->pstate = PSTATE_MODE_EL2h;
142
- } else {
143
- env->pstate = PSTATE_MODE_EL1h;
144
- }
145
- if (cpu_isar_feature(aa64_pauth, cpu)) {
146
- env->cp15.scr_el3 |= SCR_API | SCR_APK;
147
- }
148
- if (cpu_isar_feature(aa64_mte, cpu)) {
149
- env->cp15.scr_el3 |= SCR_ATA;
150
- }
151
- if (cpu_isar_feature(aa64_sve, cpu)) {
152
- env->cp15.cptr_el[3] |= R_CPTR_EL3_EZ_MASK;
153
- env->vfp.zcr_el[3] = 0xf;
154
- }
155
- if (cpu_isar_feature(aa64_sme, cpu)) {
156
- env->cp15.cptr_el[3] |= R_CPTR_EL3_ESM_MASK;
157
- env->cp15.scr_el3 |= SCR_ENTP2;
158
- env->vfp.smcr_el[3] = 0xf;
159
- }
160
- if (cpu_isar_feature(aa64_hcx, cpu)) {
161
- env->cp15.scr_el3 |= SCR_HXEN;
162
- }
163
- if (cpu_isar_feature(aa64_fgt, cpu)) {
164
- env->cp15.scr_el3 |= SCR_FGTEN;
165
- }
166
+ int target_el = arm_feature(env, ARM_FEATURE_EL2) ? 2 : 1;
167
168
- /* AArch64 kernels never boot in secure mode */
169
- assert(!info->secure_boot);
170
- /* This hook is only supported for AArch32 currently:
171
- * bootloader_aarch64[] will not call the hook, and
172
- * the code above has already dropped us into EL2 or EL1.
173
- */
174
- assert(!info->secure_board_setup);
175
- }
176
-
177
- if (arm_feature(env, ARM_FEATURE_EL2)) {
178
- /* If we have EL2 then Linux expects the HVC insn to work */
179
- env->cp15.scr_el3 |= SCR_HCE;
180
- }
181
-
182
- /* Set to non-secure if not a secure boot */
183
- if (!info->secure_boot &&
184
- (cs != first_cpu || !info->secure_board_setup)) {
185
- /* Linux expects non-secure state */
186
- env->cp15.scr_el3 |= SCR_NS;
187
- /* Set NSACR.{CP11,CP10} so NS can access the FPU */
188
- env->cp15.nsacr |= 3 << 10;
189
- }
190
- }
191
-
192
- if (!env->aarch64 && !info->secure_boot &&
193
- arm_feature(env, ARM_FEATURE_EL2)) {
194
+ if (env->aarch64) {
195
/*
196
- * This is an AArch32 boot not to Secure state, and
197
- * we have Hyp mode available, so boot the kernel into
198
- * Hyp mode. This is not how the CPU comes out of reset,
199
- * so we need to manually put it there.
200
+ * AArch64 kernels never boot in secure mode, and we don't
201
+ * support the secure_board_setup hook for AArch64.
202
*/
203
- cpsr_write(env, ARM_CPU_MODE_HYP, CPSR_M, CPSRWriteRaw);
204
+ assert(!info->secure_boot);
205
+ assert(!info->secure_board_setup);
206
+ } else {
207
+ if (arm_feature(env, ARM_FEATURE_EL3) &&
208
+ (info->secure_boot ||
209
+ (info->secure_board_setup && cs == first_cpu))) {
210
+ /* Start this CPU in Secure SVC */
211
+ target_el = 3;
212
+ }
213
}
214
215
+ arm_emulate_firmware_reset(cs, target_el);
216
+
217
if (cs == first_cpu) {
218
AddressSpace *as = arm_boot_address_space(cpu, info);
219
220
diff --git a/target/arm/arm-powerctl.c b/target/arm/arm-powerctl.c
221
index XXXXXXX..XXXXXXX 100644
222
--- a/target/arm/arm-powerctl.c
223
+++ b/target/arm/arm-powerctl.c
224
@@ -XXX,XX +XXX,XX @@ static void arm_set_cpu_on_async_work(CPUState *target_cpu_state,
225
226
/* Initialize the cpu we are turning on */
227
cpu_reset(target_cpu_state);
228
+ arm_emulate_firmware_reset(target_cpu_state, info->target_el);
229
target_cpu_state->halted = 0;
230
231
- if (info->target_aa64) {
232
- if ((info->target_el < 3) && arm_feature(&target_cpu->env,
233
- ARM_FEATURE_EL3)) {
234
- /*
235
- * As target mode is AArch64, we need to set lower
236
- * exception level (the requested level 2) to AArch64
237
- */
238
- target_cpu->env.cp15.scr_el3 |= SCR_RW;
239
- }
240
-
241
- if ((info->target_el < 2) && arm_feature(&target_cpu->env,
242
- ARM_FEATURE_EL2)) {
243
- /*
244
- * As target mode is AArch64, we need to set lower
245
- * exception level (the requested level 1) to AArch64
246
- */
247
- target_cpu->env.cp15.hcr_el2 |= HCR_RW;
248
- }
249
-
250
- target_cpu->env.pstate = aarch64_pstate_mode(info->target_el, true);
251
- } else {
252
- /* We are requested to boot in AArch32 mode */
253
- static const uint32_t mode_for_el[] = { 0,
254
- ARM_CPU_MODE_SVC,
255
- ARM_CPU_MODE_HYP,
256
- ARM_CPU_MODE_SVC };
257
-
258
- cpsr_write(&target_cpu->env, mode_for_el[info->target_el], CPSR_M,
259
- CPSRWriteRaw);
260
- }
261
-
262
- if (info->target_el == 3) {
263
- /* Processor is in secure mode */
264
- target_cpu->env.cp15.scr_el3 &= ~SCR_NS;
265
- } else {
266
- /* Processor is not in secure mode */
267
- target_cpu->env.cp15.scr_el3 |= SCR_NS;
268
-
269
- /* Set NSACR.{CP11,CP10} so NS can access the FPU */
270
- target_cpu->env.cp15.nsacr |= 3 << 10;
271
-
272
- /*
273
- * If QEMU is providing the equivalent of EL3 firmware, then we need
274
- * to make sure a CPU targeting EL2 comes out of reset with a
275
- * functional HVC insn.
276
- */
277
- if (arm_feature(&target_cpu->env, ARM_FEATURE_EL3)
278
- && info->target_el == 2) {
279
- target_cpu->env.cp15.scr_el3 |= SCR_HCE;
280
- }
281
- }
282
-
283
/* We check if the started CPU is now at the correct level */
284
assert(info->target_el == arm_current_el(&target_cpu->env));
285
286
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
287
index XXXXXXX..XXXXXXX 100644
288
--- a/target/arm/cpu.c
289
+++ b/target/arm/cpu.c
290
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset_hold(Object *obj)
78
}
291
}
79
292
}
80
+ Scope (\_SB)
293
81
+ {
294
+void arm_emulate_firmware_reset(CPUState *cpustate, int target_el)
82
+ Device (PC30)
295
+{
83
+ {
296
+ ARMCPU *cpu = ARM_CPU(cpustate);
84
+ Name (_UID, 0x30) // _UID: Unique ID
297
+ CPUARMState *env = &cpu->env;
85
+ Name (_BBN, 0x30) // _BBN: BIOS Bus Number
298
+ bool have_el3 = arm_feature(env, ARM_FEATURE_EL3);
86
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
299
+ bool have_el2 = arm_feature(env, ARM_FEATURE_EL2);
87
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
300
+
88
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
301
+ /*
89
+ {
302
+ * Check we have the EL we're aiming for. If that is the
90
+ CreateDWordField (Arg3, Zero, CDW1)
303
+ * highest implemented EL, then cpu_reset has already done
91
+ If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
304
+ * all the work.
92
+ {
305
+ */
93
+ CreateDWordField (Arg3, 0x04, CDW2)
306
+ switch (target_el) {
94
+ CreateDWordField (Arg3, 0x08, CDW3)
307
+ case 3:
95
+ Local0 = CDW3 /* \_SB_.PC30._OSC.CDW3 */
308
+ assert(have_el3);
96
+ Local0 &= 0x1F
309
+ return;
97
+ If ((Arg1 != One))
310
+ case 2:
98
+ {
311
+ assert(have_el2);
99
+ CDW1 |= 0x08
312
+ if (!have_el3) {
100
+ }
313
+ return;
101
+
314
+ }
102
+ If ((CDW3 != Local0))
315
+ break;
103
+ {
316
+ case 1:
104
+ CDW1 |= 0x10
317
+ if (!have_el3 && !have_el2) {
105
+ }
318
+ return;
106
+
319
+ }
107
+ CDW3 = Local0
320
+ break;
108
+ }
321
+ default:
109
+ Else
322
+ g_assert_not_reached();
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
+ }
323
+ }
190
+
324
+
191
+ Scope (\_SB)
325
+ if (have_el3) {
192
+ {
326
+ /*
193
+ Device (PC20)
327
+ * Set the EL3 state so code can run at EL2. This should match
194
+ {
328
+ * the requirements set by Linux in its booting spec.
195
+ Name (_UID, 0x20) // _UID: Unique ID
329
+ */
196
+ Name (_BBN, 0x20) // _BBN: BIOS Bus Number
330
+ if (env->aarch64) {
197
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
331
+ env->cp15.scr_el3 |= SCR_RW;
198
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
332
+ if (cpu_isar_feature(aa64_pauth, cpu)) {
199
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
333
+ env->cp15.scr_el3 |= SCR_API | SCR_APK;
200
+ {
334
+ }
201
+ CreateDWordField (Arg3, Zero, CDW1)
335
+ if (cpu_isar_feature(aa64_mte, cpu)) {
202
+ If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
336
+ env->cp15.scr_el3 |= SCR_ATA;
203
+ {
337
+ }
204
+ CreateDWordField (Arg3, 0x04, CDW2)
338
+ if (cpu_isar_feature(aa64_sve, cpu)) {
205
+ CreateDWordField (Arg3, 0x08, CDW3)
339
+ env->cp15.cptr_el[3] |= R_CPTR_EL3_EZ_MASK;
206
+ Local0 = CDW3 /* \_SB_.PC20._OSC.CDW3 */
340
+ env->vfp.zcr_el[3] = 0xf;
207
+ Local0 &= 0x1F
341
+ }
208
+ If ((Arg1 != One))
342
+ if (cpu_isar_feature(aa64_sme, cpu)) {
209
+ {
343
+ env->cp15.cptr_el[3] |= R_CPTR_EL3_ESM_MASK;
210
+ CDW1 |= 0x08
344
+ env->cp15.scr_el3 |= SCR_ENTP2;
211
+ }
345
+ env->vfp.smcr_el[3] = 0xf;
212
+
346
+ }
213
+ If ((CDW3 != Local0))
347
+ if (cpu_isar_feature(aa64_hcx, cpu)) {
214
+ {
348
+ env->cp15.scr_el3 |= SCR_HXEN;
215
+ CDW1 |= 0x10
349
+ }
216
+ }
350
+ if (cpu_isar_feature(aa64_fgt, cpu)) {
217
+
351
+ env->cp15.scr_el3 |= SCR_FGTEN;
218
+ CDW3 = Local0
352
+ }
219
+ }
353
+ }
220
+ Else
354
+
221
+ {
355
+ if (target_el == 2) {
222
+ CDW1 |= 0x04
356
+ /* If the guest is at EL2 then Linux expects the HVC insn to work */
223
+ }
357
+ env->cp15.scr_el3 |= SCR_HCE;
224
+
358
+ }
225
+ Return (Arg3)
359
+
226
+ }
360
+ /* Put CPU into non-secure state */
227
+
361
+ env->cp15.scr_el3 |= SCR_NS;
228
+ Method (_PRT, 0, NotSerialized) // _PRT: PCI Routing Table
362
+ /* Set NSACR.{CP11,CP10} so NS can access the FPU */
229
+ {
363
+ env->cp15.nsacr |= 3 << 10;
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
+ }
364
+ }
301
+
365
+
302
+ Scope (\_SB)
366
+ if (have_el2 && target_el < 2) {
303
+ {
367
+ /* Set EL2 state so code can run at EL1. */
304
+ Device (PC10)
368
+ if (env->aarch64) {
305
+ {
369
+ env->cp15.hcr_el2 |= HCR_RW;
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
+ }
370
+ }
411
+ }
371
+ }
412
+
372
+
413
Scope (\_SB.PCI0)
373
+ /* Set the CPU to the desired state */
414
{
374
+ if (env->aarch64) {
415
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
375
+ env->pstate = aarch64_pstate_mode(target_el, true);
416
@@ -XXX,XX +XXX,XX @@
376
+ } else {
417
WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
377
+ static const uint32_t mode_for_el[] = {
418
0x0000, // Granularity
378
+ 0,
419
0x0000, // Range Minimum
379
+ ARM_CPU_MODE_SVC,
420
- 0x00FF, // Range Maximum
380
+ ARM_CPU_MODE_HYP,
421
+ 0x000F, // Range Maximum
381
+ ARM_CPU_MODE_SVC,
422
0x0000, // Translation Offset
382
+ };
423
- 0x0100, // Length
383
+
424
+ 0x0010, // Length
384
+ cpsr_write(env, mode_for_el[target_el], CPSR_M, CPSRWriteRaw);
425
,, )
385
+ }
426
IO (Decode16,
386
+}
427
0x0CF8, // Range Minimum
387
+
428
@@ -XXX,XX +XXX,XX @@
388
+
429
}
389
#if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
430
}
390
431
391
static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
432
+ Device (S10)
433
+ {
434
+ Name (_ADR, 0x00020000) // _ADR: Address
435
+ }
436
+
437
+ Device (S18)
438
+ {
439
+ Name (_ADR, 0x00030000) // _ADR: Address
440
+ }
441
+
442
+ Device (S20)
443
+ {
444
+ Name (_ADR, 0x00040000) // _ADR: Address
445
+ }
446
+
447
+ Device (S28)
448
+ {
449
+ Name (_ADR, 0x00050000) // _ADR: Address
450
+ }
451
+
452
Method (PCNT, 0, NotSerialized)
453
{
454
}
455
456
Reviewed-by: Eric Auger <eric.auger@redhat.com>
457
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
458
Message-id: 20211210170415.583179-8-jean-philippe@linaro.org
459
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
460
---
461
tests/qtest/bios-tables-test-allowed-diff.h | 2 --
462
tests/data/acpi/q35/DSDT.viot | Bin 0 -> 9398 bytes
463
tests/data/acpi/q35/VIOT.viot | Bin 0 -> 112 bytes
464
3 files changed, 2 deletions(-)
465
466
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
467
index XXXXXXX..XXXXXXX 100644
468
--- a/tests/qtest/bios-tables-test-allowed-diff.h
469
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
470
@@ -XXX,XX +XXX,XX @@
471
/* List of comma-separated changed AML files to ignore */
472
"tests/data/acpi/virt/VIOT",
473
-"tests/data/acpi/q35/DSDT.viot",
474
-"tests/data/acpi/q35/VIOT.viot",
475
diff --git a/tests/data/acpi/q35/DSDT.viot b/tests/data/acpi/q35/DSDT.viot
476
index XXXXXXX..XXXXXXX 100644
477
GIT binary patch
478
literal 9398
479
zcmeHNO>7&-8J*>iv|O&FB}G~Oi$yp||57BBoWHhc5OS9yDTx$CQgH$r;8Idr*-4Q_
480
z5(9Az1F`}niVsB-)<KW7p`g9Br(A2Gm-gmc1N78GFS!;)e2V(MnH_0{q<{#yMgn&C
481
zn|*J-d9yqFhO_H6z19~`FlPL*u<DkZ*}|)JH;X@mF-FI<cPg<fti9tEN*yB^i5czN
482
zNq&q?!OZ;BE3B7{KWzJ-`Tn~f`9?Qj8~2^N8{Oc8J%57{==w%rS#;nOCp*nTr@iZ1
483
zb+?i;JLQUJ=O0?8*>S~D)a>NF1~WVB6^~_B#yhJ`H+JU@=6aXs`?Yv)J2h=N?drcS
484
zeLZ*n<<Bm^n}6`jfBx#u8&(W}1?)}iF9o#mZ~E2+zwdn7yK3AbIzKnxpZ>JRPm3~#
485
z&ICS{+_OayRW-l=Mtk=~uaS3o8z<_udd|(wqg`&JnVPfCe>BUOO`Su3e>pff_^UW%
486
z&JE^NO`)=Amg~iqRB1pPscP?(>#ZuY8GHCmlEvD$9g3%4Db~Dfz2SATnddvrR-Oe^
487
z;s;dJec!hnzi)ri^I6YN9vtkm{^TdUF8h7gX8-<Qe4p)GQ=)AtYx2VcwdLVAEXEjG
488
z^Mj|UHPqkj-LsWuzQem1>F3atdZn=zv3$#RmZzSHN+6-yyU#8cJb=YDilX&sl}vNm
489
znkgAR^O<3kj4if>{ly5fwRfMWuC5=lrlvKPX~i#654Cp}R_d*JS$9laZ$ra6)<ns8
490
zFZy28G%xP(nit&F>LDi%G<tIc=TY=gl$jSD&Uv!Yat~XR46h%rI$!}a%!|xG7u8Zn
491
zeY8_|n=K>xz_v_W8VX$W-Fg-qFWcT}7MCyz{%%{ia7hZ>Law-k6NOr}VI&_48U=2l
492
zwqDKFE8eTwwozDdms#e?x?5a|v>&JF;2_v0L~z5n%BYU^52<*cWuD4|GYUm@1+?))
493
zte^45>Rz)t*<T5V#={r>@t@{%?^i#W{i=HAZ*Dc9y59Va-+#P!jrGs;u38a{fLr`N
494
zvT@rUu>DljxJ?^&Z?-?vyJn3C>3D=qux{Y*bs5|5n)Qmi$TD^Zdn4GU$ocJS2Hh-<
495
z`xPI^^+v0nUVdjMos8k`WGl7hA`{03ju%<lrgAHSpd^DRf-*}_#Ly0mB!LSfVgWcQ
496
z&T$@~G9)JI=hz5m0vkrel+Xy{Oh7pkAu-V!j*W7rY(bO}Q$nMH2`FbGB&N)QaV4<4
497
zo)~9JXiP9=;}NPl<C@MmXG&;XFlFNrsyfFsonxFSp<}vEgsRSQP3O3#b6nSnP}ON_
498
zI!#Tdsp~|j>ckUB>FI=~GokB5sOq#dotCE4(sd$KbtW~PNlj-`*NIToiD#j5J#9^=
499
zt?NXn>YUJYPG~wObe#xQos*i*NloXZt`niEb4t@WrRki~bs|)CI+{*L)9L6s5vn><
500
zn$DD_Go|Z9sOn5>I@6lYw5}7Os&iV?Ij!lO)^#FOb!If38BJ$K*NIToIiu;E(R9w}
501
zIuWWmPiZ<&X*y5oIuWWmF_XaEC!a&Jn$B5WCqh-{X-(&8P3LJ{Cqh-{8P3dyPr@^t
502
zSqL9?X9Uwd3W@23*s~h*tj0X6GZCuHa~kuU#yqDp5vt7d8uPryJg+kms?5hU=3^T3
503
zF`bD}WnSP+=`t5MQ$FJ_2&Q~+BP6E0f^%BVIW6a$o)e+SX~IDBih-7z6{O~7YTy`&
504
zLjy&Cv?7QikV#>n0>>@MV8oK`Gmun34-FKdlm-J8SZSaNlnhir4-FI{S|bfqV8e)V
505
zss<{chX#reE#g=hsKAC%sF6d-Km}BWs!kZFsFpKfpbC@>6rprQGEjt4Ck#|zITHq|
506
zK*>M_l;<P^MJRQ`Kn0dFVW0|>3{*fllMEE0)CmI>Sk8ojDo`>|0p(0GP=xY&!axO<
507
zGhv_#lnhirIg<<&q0|Wj6<E%MfhtfkPyyvkGEjt4Ck#|zITHq|K*>M_lrzad5lWpf
508
zP=V!47^ngz0~JutBm+e#b;3XemNQ|X3X}{~Ksl2P6rt1!0~J`#gn=qhGEf2KOfpb}
509
zQYQ>lU^x>8szAv=1(Y+%KoLrvFi?TzOc<yFB?A>u&LjgxD0RX>1(q{mpbC@>R6seC
510
z3>2Z%2?G^a&V+#~P%=;f<xDbAgi<FARA4z12C6{GKn0XD$v_cGoiI>=<xCi;0wn_#
511
zP|hR+MJRQ`Kn0dFVW0|>3{*fllMEE0)CmI>Sk8ojDo`>|0p(0GP=rz^3{+q_69%e4
512
z$v_2^Gs!>^N}VuJf#pmXr~)Me6;RG314Srx!axxz28u{EP=u<1B2)}iVZuNaCK;&0
513
zBm-5LFi?dF167!0pbC==RAItE6($T+VUmF=Ofpb~2?JG_Fi?d_2C6X0Kouqo6p_5T
514
zFi=FeV!SiSKoR0H$dH(_Z(*Q_WZ%L-5y`$K14StNmJAdjmWs}HV4<vU_xO+1efmLq
515
zZ;W>N_U)fP6Qy6Nw5mbt9Y(#emWSi66=>tq#xoh#Ue=0qyhxi8ZOUe5y0V7VfPUhp
516
zwX=;ymc+i5%sg9Ja~lZ&8oAV@mHc>&CHP9v4R(jhtT?un;O4e9#pno)Xkh7OWgK&a
517
zyj=3Iv0OuoK_;5rOr5f(Kb~ZXDBO+V`OWYo#_C08imwChQxnjdd?wZLDou8aj;$SD
518
zGDYiA3<$Tu<JnHL(KPOChi#zrR32t83}naR$+ym4P_h?z_5#|cW-nw$XD_sOtE62l
519
zrD3@*)NVyiklt0&yF9%+klsBey&I<Y2E<!f(E8TuJte)z(|ZHyy<^gQVfx}=`q&B5
520
z7nSryp1wGczIaUfVwiq$Fn#<4=@*ssi#+|}K>EdF(l3VTOM~ghPLRH&q%ZOGrGfON
521
zW73zx^yR_y<0nX8R??Sw`tm^f@-gYlNFSp|*<gA{q?Zp5Oe-+l#rmyYmKozi9y=P>
522
zVReJU*h=ZuVXiS$ohTbw-O#v9>(yZbGE|)?8(H1ZIKvV!jWa0>vy!3eMA^vdhQ>`s
523
zuMSg{q3T50$m)j1!HixV<}X9liL#N^4c*tL^y)CF8LCc{jjV3yKAqL8!%SzWI#H%q
524
z=bSrQ&)%JCRttF5g4Zf`6l?y@>PzD7MA^D>wBlcH6r1ucwJ<p0O%rZ?JzIY3-QdmZ
525
zzs|n>`a5r3e|z)wcUaqS>nqFQ-8x}eCF4u`OWUxqst-@1rSmUs%WmKP5e0dcb?e2N
526
z;Z|x*!);VwF|Yuhqs^khqOM!@u*jY!WYldISF(V6`BoNd&6Qfk3>X#SuD^7J>p_D=
527
zBPa51y^_n#=cpOt#Zf$ya$Ae9Mfz56n|<i!a=ELS@)%a{^NIH3SDuN<R~sah1km#P
528
zU@?*f%<rG=4W1wgfi;C?_n|W@%lm$&8YfvNOJodIg&IcIpIJQRHr<+ej11GQ6)&eF
529
z2Lam*jIH}#y0>KnY%4JQfOYS$*uU%f#@$U6`N8I3N-lV?5ErFCdv~xDmu2(wexld4
530
z4v^;aVAT2k6GJ^m*FD(Wqc(Qg^)6a<?}h$zLoj}4;PP!+(O{@!a1y-hoAhF_7!z+6
531
zslpAmNtYbjHrw-~#SPVk_FUf>-Obg6yV`8o$8_`PyJe_;bY5_EMBfBfWU!Q=*9HsG
532
z%_Cda{@_Krr!oHVhv9+y+T5qR8zZ2aZ>5r!$*|f$^U%yBUYfR&B!+EYy_PwL!BeUi
533
zJH^}r3r9Q+B)X@Z)fk=P13w&7x#wBtXTZ)g>WITPg5r&pQc!nmyrmk#S(>>b9xnNr
534
zx_b#v9Xv-Y><Wb%?S^0Xe&<)bbKl_=Z|3C$tf|F<bYzE*mfHB;uC)`q-?buaBe?l?
535
zcLTpK*k<49Z32`K?|nSBMFqxTK^_IE-li2fEGdK~(ZdoKBl6ab4a;Hler#`xvEXJG
536
zb?<E%EZExfX>jcOVhS*0rS~RS1dA#xhkv@Nct@#q?LyeKS<$uFec!bw>{@uu$gZ6a
537
zyVen1i{1BKd%~`D7|m$;U0a<I*3I7%^N%N%lGYdU_GS!gaR8T$NA@GzFi~z`l7hdl
538
zarZy6590|88pi(1zq;V(>38zM0sT&<zX;R5$1w3;`_JMG`;&I&0Y23DMx1%@(w(R9
539
z4M$j;D5J+Gy%fijRQsctzFKf&cv|BAz#YLq3CZJWDdtL4u1u1|mkdcUp7|sxJC+?Y
540
z_@@s`v3j}Q7*z>6X~cwUxUL8G1KT)_XTp!KAbs;vCp{K3&~_X@+ew=-D}v`2MbFV0
541
zQsVsL=rXi-pI*G|iiz;VTCutgUs)hDzV1+4?8KcoP3xROf<M%qC6lgVdpFt4<-|uM
542
z=#rl_b1#YjSIl6Toj2z_hOZcKupkdE(LozC(fN=FY(x|sk)ym|;Rq2E1xJWD%Z!ol
543
Gu>S+TT-130
544
545
literal 0
546
HcmV?d00001
547
548
diff --git a/tests/data/acpi/q35/VIOT.viot b/tests/data/acpi/q35/VIOT.viot
549
index XXXXXXX..XXXXXXX 100644
550
GIT binary patch
551
literal 112
552
zcmWIZ^baXu00LVle`k+i1*eDrX9XZ&1PX!JAex!M0Hgv8m>C3sGzdcgBZCA3T-xBj
553
Q0Zb)W9Hva*zW_`e0M!8s0RR91
554
555
literal 0
556
HcmV?d00001
557
558
--
392
--
559
2.25.1
393
2.34.1
560
561
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Chris Rauer <crauer@google.com>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
The counter register is only 24-bits and counts down. If the timer is
4
running but the qtimer to reset it hasn't fired off yet, there is a chance
5
the regster read can return an invalid result.
6
7
Signed-off-by: Chris Rauer <crauer@google.com>
8
Message-id: 20230922181411.2697135-1-crauer@google.com
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
---
11
---
7
target/arm/translate.c | 16 ++++++++--------
12
hw/timer/npcm7xx_timer.c | 3 +++
8
1 file changed, 8 insertions(+), 8 deletions(-)
13
1 file changed, 3 insertions(+)
9
14
10
diff --git a/target/arm/translate.c b/target/arm/translate.c
15
diff --git a/hw/timer/npcm7xx_timer.c b/hw/timer/npcm7xx_timer.c
11
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
12
--- a/target/arm/translate.c
17
--- a/hw/timer/npcm7xx_timer.c
13
+++ b/target/arm/translate.c
18
+++ b/hw/timer/npcm7xx_timer.c
14
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
19
@@ -XXX,XX +XXX,XX @@ static int64_t npcm7xx_timer_count_to_ns(NPCM7xxTimer *t, uint32_t count)
20
/* Convert a time interval in nanoseconds to a timer cycle count. */
21
static uint32_t npcm7xx_timer_ns_to_count(NPCM7xxTimer *t, int64_t ns)
15
{
22
{
16
DisasContext *dc = container_of(dcbase, DisasContext, base);
23
+ if (ns < 0) {
17
CPUARMState *env = cpu->env_ptr;
24
+ return 0;
18
+ uint32_t pc = dc->base.pc_next;
25
+ }
19
uint32_t insn;
26
return clock_ns_to_ticks(t->ctrl->clock, ns) /
20
bool is_16bit;
27
npcm7xx_tcsr_prescaler(t->tcsr);
21
28
}
22
if (arm_pre_translate_insn(dc)) {
23
- dc->base.pc_next += 2;
24
+ dc->base.pc_next = pc + 2;
25
return;
26
}
27
28
- dc->pc_curr = dc->base.pc_next;
29
- insn = arm_lduw_code(env, &dc->base, dc->base.pc_next, dc->sctlr_b);
30
+ dc->pc_curr = pc;
31
+ insn = arm_lduw_code(env, &dc->base, pc, dc->sctlr_b);
32
is_16bit = thumb_insn_is_16bit(dc, dc->base.pc_next, insn);
33
- dc->base.pc_next += 2;
34
+ pc += 2;
35
if (!is_16bit) {
36
- uint32_t insn2 = arm_lduw_code(env, &dc->base, dc->base.pc_next,
37
- dc->sctlr_b);
38
-
39
+ uint32_t insn2 = arm_lduw_code(env, &dc->base, pc, dc->sctlr_b);
40
insn = insn << 16 | insn2;
41
- dc->base.pc_next += 2;
42
+ pc += 2;
43
}
44
+ dc->base.pc_next = pc;
45
dc->insn = insn;
46
47
if (dc->pstate_il) {
48
--
29
--
49
2.25.1
30
2.34.1
50
51
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Suraj Shirvankar <surajshirvankar@gmail.com>
2
2
3
For A64, any input to an indirect branch can cause this.
3
QEMU coding style uses the glib memory allocation APIs, not
4
the raw libc malloc/free. Switch the allocation and free
5
calls in elf2dmp to use these functions (dropping the now-unneeded
6
checks for failure).
4
7
5
For A32, many indirect branch paths force the branch to be aligned,
8
Signed-off-by: Suraj Shirvankar <surajshirvankar@gmail.com>
6
but BXWritePC does not. This includes the BX instruction but also
9
Message-id: 169753938460.23804.11418813007617535750-1@git.sr.ht
7
other interworking changes to PC. Prior to v8, this case is UNDEFINED.
10
[PMM: also remove NULL checks from g_malloc() calls;
8
With v8, this is CONSTRAINED UNPREDICTABLE and may either raise an
11
beef up commit message]
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.
14
15
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
14
---
19
target/arm/helper.h | 1 +
15
contrib/elf2dmp/addrspace.c | 7 ++-----
20
target/arm/syndrome.h | 5 ++++
16
contrib/elf2dmp/main.c | 9 +++------
21
linux-user/aarch64/cpu_loop.c | 46 ++++++++++++++++++++---------------
17
contrib/elf2dmp/pdb.c | 19 ++++++++-----------
22
target/arm/tlb_helper.c | 18 ++++++++++++++
18
contrib/elf2dmp/qemu_elf.c | 7 ++-----
23
target/arm/translate-a64.c | 15 ++++++++++++
19
4 files changed, 15 insertions(+), 27 deletions(-)
24
target/arm/translate.c | 22 ++++++++++++++++-
25
6 files changed, 87 insertions(+), 20 deletions(-)
26
20
27
diff --git a/target/arm/helper.h b/target/arm/helper.h
21
diff --git a/contrib/elf2dmp/addrspace.c b/contrib/elf2dmp/addrspace.c
28
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/helper.h
23
--- a/contrib/elf2dmp/addrspace.c
30
+++ b/target/arm/helper.h
24
+++ b/contrib/elf2dmp/addrspace.c
31
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RWG_SE,
25
@@ -XXX,XX +XXX,XX @@ int pa_space_create(struct pa_space *ps, QEMU_Elf *qemu_elf)
32
DEF_HELPER_2(exception_internal, void, env, i32)
26
}
33
DEF_HELPER_4(exception_with_syndrome, void, env, i32, i32, i32)
27
}
34
DEF_HELPER_2(exception_bkpt_insn, void, env, i32)
28
35
+DEF_HELPER_2(exception_pc_alignment, noreturn, env, tl)
29
- ps->block = malloc(sizeof(*ps->block) * ps->block_nr);
36
DEF_HELPER_1(setend, void, env)
30
- if (!ps->block) {
37
DEF_HELPER_2(wfi, void, env, i32)
31
- return 1;
38
DEF_HELPER_1(wfe, void, env)
32
- }
39
diff --git a/target/arm/syndrome.h b/target/arm/syndrome.h
33
+ ps->block = g_new(struct pa_block, ps->block_nr);
34
35
for (i = 0; i < phdr_nr; i++) {
36
if (phdr[i].p_type == PT_LOAD) {
37
@@ -XXX,XX +XXX,XX @@ int pa_space_create(struct pa_space *ps, QEMU_Elf *qemu_elf)
38
void pa_space_destroy(struct pa_space *ps)
39
{
40
ps->block_nr = 0;
41
- free(ps->block);
42
+ g_free(ps->block);
43
}
44
45
void va_space_set_dtb(struct va_space *vs, uint64_t dtb)
46
diff --git a/contrib/elf2dmp/main.c b/contrib/elf2dmp/main.c
40
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/syndrome.h
48
--- a/contrib/elf2dmp/main.c
42
+++ b/target/arm/syndrome.h
49
+++ b/contrib/elf2dmp/main.c
43
@@ -XXX,XX +XXX,XX @@ static inline uint32_t syn_illegalstate(void)
50
@@ -XXX,XX +XXX,XX @@ static KDDEBUGGER_DATA64 *get_kdbg(uint64_t KernBase, struct pdb_reader *pdb,
44
return (EC_ILLEGALSTATE << ARM_EL_EC_SHIFT) | ARM_EL_IL;
51
}
52
}
53
54
- kdbg = malloc(kdbg_hdr.Size);
55
- if (!kdbg) {
56
- return NULL;
57
- }
58
+ kdbg = g_malloc(kdbg_hdr.Size);
59
60
if (va_space_rw(vs, KdDebuggerDataBlock, kdbg, kdbg_hdr.Size, 0)) {
61
eprintf("Failed to extract entire KDBG\n");
62
- free(kdbg);
63
+ g_free(kdbg);
64
return NULL;
65
}
66
67
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
68
}
69
70
out_kdbg:
71
- free(kdbg);
72
+ g_free(kdbg);
73
out_pdb:
74
pdb_exit(&pdb);
75
out_pdb_file:
76
diff --git a/contrib/elf2dmp/pdb.c b/contrib/elf2dmp/pdb.c
77
index XXXXXXX..XXXXXXX 100644
78
--- a/contrib/elf2dmp/pdb.c
79
+++ b/contrib/elf2dmp/pdb.c
80
@@ -XXX,XX +XXX,XX @@ uint64_t pdb_resolve(uint64_t img_base, struct pdb_reader *r, const char *name)
81
82
static void pdb_reader_ds_exit(struct pdb_reader *r)
83
{
84
- free(r->ds.toc);
85
+ g_free(r->ds.toc);
45
}
86
}
46
87
47
+static inline uint32_t syn_pcalignment(void)
88
static void pdb_exit_symbols(struct pdb_reader *r)
48
+{
89
{
49
+ return (EC_PCALIGNMENT << ARM_EL_EC_SHIFT) | ARM_EL_IL;
90
- free(r->modimage);
50
+}
91
- free(r->symbols);
51
+
92
+ g_free(r->modimage);
52
#endif /* TARGET_ARM_SYNDROME_H */
93
+ g_free(r->symbols);
53
diff --git a/linux-user/aarch64/cpu_loop.c b/linux-user/aarch64/cpu_loop.c
94
}
95
96
static void pdb_exit_segments(struct pdb_reader *r)
97
{
98
- free(r->segs);
99
+ g_free(r->segs);
100
}
101
102
static void *pdb_ds_read(const PDB_DS_HEADER *header,
103
@@ -XXX,XX +XXX,XX @@ static void *pdb_ds_read(const PDB_DS_HEADER *header,
104
105
nBlocks = (size + header->block_size - 1) / header->block_size;
106
107
- buffer = malloc(nBlocks * header->block_size);
108
- if (!buffer) {
109
- return NULL;
110
- }
111
+ buffer = g_malloc(nBlocks * header->block_size);
112
113
for (i = 0; i < nBlocks; i++) {
114
memcpy(buffer + i * header->block_size, (const char *)header +
115
@@ -XXX,XX +XXX,XX @@ static int pdb_init_symbols(struct pdb_reader *r)
116
return 0;
117
118
out_symbols:
119
- free(symbols);
120
+ g_free(symbols);
121
122
return err;
123
}
124
@@ -XXX,XX +XXX,XX @@ static int pdb_reader_init(struct pdb_reader *r, void *data)
125
out_sym:
126
pdb_exit_symbols(r);
127
out_root:
128
- free(r->ds.root);
129
+ g_free(r->ds.root);
130
out_ds:
131
pdb_reader_ds_exit(r);
132
133
@@ -XXX,XX +XXX,XX @@ static void pdb_reader_exit(struct pdb_reader *r)
134
{
135
pdb_exit_segments(r);
136
pdb_exit_symbols(r);
137
- free(r->ds.root);
138
+ g_free(r->ds.root);
139
pdb_reader_ds_exit(r);
140
}
141
142
diff --git a/contrib/elf2dmp/qemu_elf.c b/contrib/elf2dmp/qemu_elf.c
54
index XXXXXXX..XXXXXXX 100644
143
index XXXXXXX..XXXXXXX 100644
55
--- a/linux-user/aarch64/cpu_loop.c
144
--- a/contrib/elf2dmp/qemu_elf.c
56
+++ b/linux-user/aarch64/cpu_loop.c
145
+++ b/contrib/elf2dmp/qemu_elf.c
57
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
146
@@ -XXX,XX +XXX,XX @@ static int init_states(QEMU_Elf *qe)
58
break;
147
59
case EXCP_PREFETCH_ABORT:
148
printf("%zu CPU states has been found\n", cpu_nr);
60
case EXCP_DATA_ABORT:
149
61
- /* We should only arrive here with EC in {DATAABORT, INSNABORT}. */
150
- qe->state = malloc(sizeof(*qe->state) * cpu_nr);
62
ec = syn_get_ec(env->exception.syndrome);
151
- if (!qe->state) {
63
- assert(ec == EC_DATAABORT || ec == EC_INSNABORT);
152
- return 1;
64
-
153
- }
65
- /* Both EC have the same format for FSC, or close enough. */
154
+ qe->state = g_new(QEMUCPUState*, cpu_nr);
66
- fsc = extract32(env->exception.syndrome, 0, 6);
155
67
- switch (fsc) {
156
cpu_nr = 0;
68
- case 0x04 ... 0x07: /* Translation fault, level {0-3} */
157
69
- si_signo = TARGET_SIGSEGV;
158
@@ -XXX,XX +XXX,XX @@ static int init_states(QEMU_Elf *qe)
70
- si_code = TARGET_SEGV_MAPERR;
159
71
+ switch (ec) {
160
static void exit_states(QEMU_Elf *qe)
72
+ case EC_DATAABORT:
161
{
73
+ case EC_INSNABORT:
162
- free(qe->state);
74
+ /* Both EC have the same format for FSC, or close enough. */
163
+ g_free(qe->state);
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
}
164
}
127
165
128
+void helper_exception_pc_alignment(CPUARMState *env, target_ulong pc)
166
static bool check_ehdr(QEMU_Elf *qe)
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)
146
147
/*
148
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
149
index XXXXXXX..XXXXXXX 100644
150
--- a/target/arm/translate-a64.c
151
+++ b/target/arm/translate-a64.c
152
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
153
uint64_t pc = s->base.pc_next;
154
uint32_t insn;
155
156
+ /* Singlestep exceptions have the highest priority. */
157
if (s->ss_active && !s->pstate_ss) {
158
/* Singlestep state is Active-pending.
159
* If we're in this state at the start of a TB then either
160
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
161
return;
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
}
214
--
167
--
215
2.25.1
168
2.34.1
216
217
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Misaligned thumb PC is architecturally impossible.
4
Assert is better than proceeding, in case we've missed
5
something somewhere.
6
7
Expand a comment about aligning the pc in gdbstub.
8
Fail an incoming migrate if a thumb pc is misaligned.
9
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
target/arm/gdbstub.c | 9 +++++++--
15
target/arm/machine.c | 10 ++++++++++
16
target/arm/translate.c | 3 +++
17
3 files changed, 20 insertions(+), 2 deletions(-)
18
19
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/gdbstub.c
22
+++ b/target/arm/gdbstub.c
23
@@ -XXX,XX +XXX,XX @@ int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
24
25
tmp = ldl_p(mem_buf);
26
27
- /* Mask out low bit of PC to workaround gdb bugs. This will probably
28
- cause problems if we ever implement the Jazelle DBX extensions. */
29
+ /*
30
+ * Mask out low bits of PC to workaround gdb bugs.
31
+ * This avoids an assert in thumb_tr_translate_insn, because it is
32
+ * architecturally impossible to misalign the pc.
33
+ * This will probably cause problems if we ever implement the
34
+ * Jazelle DBX extensions.
35
+ */
36
if (n == 15) {
37
tmp &= ~1;
38
}
39
diff --git a/target/arm/machine.c b/target/arm/machine.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/machine.c
42
+++ b/target/arm/machine.c
43
@@ -XXX,XX +XXX,XX @@ static int cpu_post_load(void *opaque, int version_id)
44
return -1;
45
}
46
}
47
+
48
+ /*
49
+ * Misaligned thumb pc is architecturally impossible.
50
+ * We have an assert in thumb_tr_translate_insn to verify this.
51
+ * Fail an incoming migrate to avoid this assert.
52
+ */
53
+ if (!is_a64(env) && env->thumb && (env->regs[15] & 1)) {
54
+ return -1;
55
+ }
56
+
57
if (!kvm_enabled()) {
58
pmu_op_finish(&cpu->env);
59
}
60
diff --git a/target/arm/translate.c b/target/arm/translate.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/target/arm/translate.c
63
+++ b/target/arm/translate.c
64
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
65
uint32_t insn;
66
bool is_16bit;
67
68
+ /* Misaligned thumb PC is architecturally impossible. */
69
+ assert((dc->base.pc_next & 1) == 0);
70
+
71
if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
72
dc->base.pc_next = pc + 2;
73
return;
74
--
75
2.25.1
76
77
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
---
7
tests/tcg/aarch64/pcalign-a64.c | 37 +++++++++++++++++++++++++
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
14
15
diff --git a/tests/tcg/aarch64/pcalign-a64.c b/tests/tcg/aarch64/pcalign-a64.c
16
new file mode 100644
17
index XXXXXXX..XXXXXXX
18
--- /dev/null
19
+++ b/tests/tcg/aarch64/pcalign-a64.c
20
@@ -XXX,XX +XXX,XX @@
21
+/* Test PC misalignment exception */
22
+
23
+#include <assert.h>
24
+#include <signal.h>
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)
31
+{
32
+ assert(info->si_code == BUS_ADRALN);
33
+ assert(info->si_addr == expected);
34
+ exit(EXIT_SUCCESS);
35
+}
36
+
37
+int main()
38
+{
39
+ void *tmp;
40
+
41
+ struct sigaction sa = {
42
+ .sa_sigaction = sigbus,
43
+ .sa_flags = SA_SIGINFO
44
+ };
45
+
46
+ if (sigaction(SIGBUS, &sa, NULL) < 0) {
47
+ perror("sigaction");
48
+ return EXIT_FAILURE;
49
+ }
50
+
51
+ asm volatile("adr %0, 1f + 1\n\t"
52
+ "str %0, %1\n\t"
53
+ "br %0\n"
54
+ "1:"
55
+ : "=&r"(tmp), "=m"(expected));
56
+ abort();
57
+}
58
diff --git a/tests/tcg/arm/pcalign-a32.c b/tests/tcg/arm/pcalign-a32.c
59
new file mode 100644
60
index XXXXXXX..XXXXXXX
61
--- /dev/null
62
+++ b/tests/tcg/arm/pcalign-a32.c
63
@@ -XXX,XX +XXX,XX @@
64
+/* Test PC misalignment exception */
65
+
66
+#ifdef __thumb__
67
+#error "This test must be compiled for ARM"
68
+#endif
69
+
70
+#include <assert.h>
71
+#include <signal.h>
72
+#include <stdlib.h>
73
+#include <stdio.h>
74
+
75
+static void *expected;
76
+
77
+static void sigbus(int sig, siginfo_t *info, void *vuc)
78
+{
79
+ assert(info->si_code == BUS_ADRALN);
80
+ assert(info->si_addr == expected);
81
+ exit(EXIT_SUCCESS);
82
+}
83
+
84
+int main()
85
+{
86
+ void *tmp;
87
+
88
+ struct sigaction sa = {
89
+ .sa_sigaction = sigbus,
90
+ .sa_flags = SA_SIGINFO
91
+ };
92
+
93
+ if (sigaction(SIGBUS, &sa, NULL) < 0) {
94
+ perror("sigaction");
95
+ return EXIT_FAILURE;
96
+ }
97
+
98
+ asm volatile("adr %0, 1f + 2\n\t"
99
+ "str %0, %1\n\t"
100
+ "bx %0\n"
101
+ "1:"
102
+ : "=&r"(tmp), "=m"(expected));
103
+
104
+ /*
105
+ * From v8, it is CONSTRAINED UNPREDICTABLE whether BXWritePC aligns
106
+ * the address or not. If so, we can legitimately fall through.
107
+ */
108
+ return EXIT_SUCCESS;
109
+}
110
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
111
index XXXXXXX..XXXXXXX 100644
112
--- a/tests/tcg/aarch64/Makefile.target
113
+++ b/tests/tcg/aarch64/Makefile.target
114
@@ -XXX,XX +XXX,XX @@ VPATH         += $(ARM_SRC)
115
AARCH64_SRC=$(SRC_PATH)/tests/tcg/aarch64
116
VPATH         += $(AARCH64_SRC)
117
118
-# Float-convert Tests
119
-AARCH64_TESTS=fcvt
120
+# Base architecture tests
121
+AARCH64_TESTS=fcvt pcalign-a64
122
123
fcvt: LDFLAGS+=-lm
124
125
diff --git a/tests/tcg/arm/Makefile.target b/tests/tcg/arm/Makefile.target
126
index XXXXXXX..XXXXXXX 100644
127
--- a/tests/tcg/arm/Makefile.target
128
+++ b/tests/tcg/arm/Makefile.target
129
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
130
    $(call run-test,fcvt,$(QEMU) $<,"$< on $(TARGET_NAME)")
131
    $(call diff-out,fcvt,$(ARM_SRC)/fcvt.ref)
132
133
+# PC alignment test
134
+ARM_TESTS += pcalign-a32
135
+pcalign-a32: CFLAGS+=-marm
136
+
137
ifeq ($(CONFIG_ARM_COMPATIBLE_SEMIHOSTING),y)
138
139
# Semihosting smoke test for linux-user
140
--
141
2.25.1
142
143
diff view generated by jsdifflib
Deleted patch
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
1
3
When a virtio-iommu is instantiated, describe it using the ACPI VIOT
4
table.
5
6
Acked-by: Igor Mammedov <imammedo@redhat.com>
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
9
Message-id: 20211210170415.583179-2-jean-philippe@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/virt-acpi-build.c | 7 +++++++
13
hw/arm/Kconfig | 1 +
14
2 files changed, 8 insertions(+)
15
16
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/virt-acpi-build.c
19
+++ b/hw/arm/virt-acpi-build.c
20
@@ -XXX,XX +XXX,XX @@
21
#include "kvm_arm.h"
22
#include "migration/vmstate.h"
23
#include "hw/acpi/ghes.h"
24
+#include "hw/acpi/viot.h"
25
26
#define ARM_SPI_BASE 32
27
28
@@ -XXX,XX +XXX,XX @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
29
}
30
#endif
31
32
+ if (vms->iommu == VIRT_IOMMU_VIRTIO) {
33
+ acpi_add_table(table_offsets, tables_blob);
34
+ build_viot(ms, tables_blob, tables->linker, vms->virtio_iommu_bdf,
35
+ vms->oem_id, vms->oem_table_id);
36
+ }
37
+
38
/* XSDT is pointed to by RSDP */
39
xsdt = tables_blob->len;
40
build_xsdt(tables_blob, tables->linker, table_offsets, vms->oem_id,
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
53
--
54
2.25.1
55
56
diff view generated by jsdifflib
Deleted patch
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
1
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.
6
7
Fixes: 70e89132c9 ("hw/arm/virt: Add the virtio-iommu device tree mappings")
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
11
Message-id: 20211210170415.583179-4-jean-philippe@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/virt.c | 5 +++++
15
1 file changed, 5 insertions(+)
16
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/virt.c
20
+++ b/hw/arm/virt.c
21
@@ -XXX,XX +XXX,XX @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
22
hwaddr db_start = 0, db_end = 0;
23
char *resv_prop_str;
24
25
+ if (vms->iommu != VIRT_IOMMU_NONE) {
26
+ error_setg(errp, "virt machine does not support multiple IOMMUs");
27
+ return;
28
+ }
29
+
30
switch (vms->msi_controller) {
31
case VIRT_MSI_CTRL_NONE:
32
return;
33
--
34
2.25.1
35
36
diff view generated by jsdifflib