1
Latest arm queue, half minor code cleanups and half minor
1
Hi; here's the first target-arm pullreq for the 7.0 cycle.
2
bug fixes.
3
2
3
thanks
4
-- PMM
4
-- PMM
5
5
6
The following changes since commit 5d0e5694470d2952b4f257bc985cac8c89b4fd92:
6
The following changes since commit 76b56fdfc9fa43ec6e5986aee33f108c6c6a511e:
7
7
8
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2019-06-17 11:55:14 +0100)
8
Merge tag 'block-pull-request' of https://gitlab.com/stefanha/qemu into staging (2021-12-14 12:46:18 -0800)
9
9
10
are available in the Git repository at:
10
are available in the Git repository at:
11
11
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190617
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20211215
13
13
14
for you to fetch changes up to 1120827fa182f0e76226df7ffe7a86598d1df54f:
14
for you to fetch changes up to aed176558806674d030a8305d989d4e6a5073359:
15
15
16
target/arm: Only implement doubles if the FPU supports them (2019-06-17 15:15:06 +0100)
16
tests/acpi: add expected blob for VIOT test on virt machine (2021-12-15 10:35:26 +0000)
17
17
18
----------------------------------------------------------------
18
----------------------------------------------------------------
19
target-arm queue:
19
target-arm queue:
20
* support large kernel images in bootloader (by avoiding
20
* ITS: error reporting cleanup
21
putting the initrd over the top of them)
21
* aspeed: improve documentation
22
* correctly disable FPU/DSP in the CPU for the mps2-an521, musca-a boards
22
* Fix STM32F2XX USART data register readout
23
* arm_gicv3: Fix decoding of ID register range
23
* allow emulated GICv3 to be disabled in non-TCG builds
24
* arm_gicv3: GICD_TYPER.SecurityExtn is RAZ if GICD_CTLR.DS == 1
24
* fix exception priority for singlestep, misaligned PC, bp, etc
25
* some code cleanups following on from the VFP decodetree conversion
25
* Correct calculation of tlb range invalidate length
26
* Only implement doubles if the FPU supports them
26
* npcm7xx_emc: fix missing queue_flush
27
(so we now correctly model Cortex-M4, -M33 as single precision only)
27
* virt: Add VIOT ACPI table for virtio-iommu
28
* target/i386: Use assert() to sanity-check b1 in SSE decode
29
* Don't include qemu-common unnecessarily
28
30
29
----------------------------------------------------------------
31
----------------------------------------------------------------
30
Peter Maydell (24):
32
Alex Bennée (1):
31
hw/arm/boot: Don't assume RAM starts at address zero
33
hw/intc: clean-up error reporting for failed ITS cmd
32
hw/arm/boot: Diagnose layouts that put initrd or DTB off the end of RAM
33
hw/arm/boot: Avoid placing the initrd on top of the kernel
34
hw/arm/boot: Honour image size field in AArch64 Image format kernels
35
target/arm: Allow VFP and Neon to be disabled via a CPU property
36
target/arm: Allow M-profile CPUs to disable the DSP extension via CPU property
37
hw/arm/armv7m: Forward "vfp" and "dsp" properties to CPU
38
hw/arm: Correctly disable FPU/DSP for some ARMSSE-based boards
39
hw/intc/arm_gicv3: Fix decoding of ID register range
40
hw/intc/arm_gicv3: GICD_TYPER.SecurityExtn is RAZ if GICD_CTLR.DS == 1
41
target/arm: Move vfp_expand_imm() to translate.[ch]
42
target/arm: Use vfp_expand_imm() for AArch32 VFP VMOV_imm
43
target/arm: Stop using cpu_F0s for NEON_2RM_VABS_F
44
target/arm: Stop using cpu_F0s for NEON_2RM_VNEG_F
45
target/arm: Stop using cpu_F0s for NEON_2RM_VRINT*
46
target/arm: Stop using cpu_F0s for NEON_2RM_VCVT[ANPM][US]
47
target/arm: Stop using cpu_F0s for NEON_2RM_VRECPE_F and NEON_2RM_VRSQRTE_F
48
target/arm: Stop using cpu_F0s for Neon f32/s32 VCVT
49
target/arm: Stop using cpu_F0s in Neon VCVT fixed-point ops
50
target/arm: stop using deprecated functions in NEON_2RM_VCVT_F16_F32
51
target/arm: Stop using deprecated functions in NEON_2RM_VCVT_F32_F16
52
target/arm: Remove unused cpu_F0s, cpu_F0d, cpu_F1s, cpu_F1d
53
target/arm: Fix typos in trans function prototypes
54
target/arm: Only implement doubles if the FPU supports them
55
34
56
include/hw/arm/armsse.h | 7 ++
35
Jean-Philippe Brucker (8):
57
include/hw/arm/armv7m.h | 4 +
36
hw/arm/virt-acpi-build: Add VIOT table for virtio-iommu
58
target/arm/cpu.h | 12 +++
37
hw/arm/virt: Remove device tree restriction for virtio-iommu
59
target/arm/translate-a64.h | 1 -
38
hw/arm/virt: Reject instantiation of multiple IOMMUs
60
target/arm/translate.h | 7 ++
39
hw/arm/virt: Use object_property_set instead of qdev_prop_set
61
hw/arm/armsse.c | 58 +++++++---
40
tests/acpi: allow updates of VIOT expected data files
62
hw/arm/armv7m.c | 18 ++++
41
tests/acpi: add test case for VIOT
63
hw/arm/boot.c | 83 ++++++++++----
42
tests/acpi: add expected blobs for VIOT test on q35 machine
64
hw/arm/musca.c | 8 ++
43
tests/acpi: add expected blob for VIOT test on virt machine
65
hw/intc/arm_gicv3_dist.c | 12 ++-
66
hw/intc/arm_gicv3_redist.c | 4 +-
67
target/arm/cpu.c | 179 ++++++++++++++++++++++++++++--
68
target/arm/translate-a64.c | 32 ------
69
target/arm/translate-vfp.inc.c | 173 ++++++++++++++++++++++-------
70
target/arm/translate.c | 240 ++++++++++++++---------------------------
71
target/arm/vfp.decode | 10 +-
72
16 files changed, 572 insertions(+), 276 deletions(-)
73
44
45
Joel Stanley (4):
46
docs: aspeed: Add new boards
47
docs: aspeed: Update OpenBMC image URL
48
docs: aspeed: Give an example of booting a kernel
49
docs: aspeed: ADC is now modelled
50
51
Olivier Hériveaux (1):
52
Fix STM32F2XX USART data register readout
53
54
Patrick Venture (1):
55
hw/net: npcm7xx_emc fix missing queue_flush
56
57
Peter Maydell (6):
58
target/i386: Use assert() to sanity-check b1 in SSE decode
59
include/hw/i386: Don't include qemu-common.h in .h files
60
target/hexagon/cpu.h: don't include qemu-common.h
61
target/rx/cpu.h: Don't include qemu-common.h
62
hw/arm: Don't include qemu-common.h unnecessarily
63
target/arm: Correct calculation of tlb range invalidate length
64
65
Philippe Mathieu-Daudé (2):
66
hw/intc/arm_gicv3: Extract gicv3_set_gicv3state from arm_gicv3_cpuif.c
67
hw/intc/arm_gicv3: Introduce CONFIG_ARM_GIC_TCG Kconfig selector
68
69
Richard Henderson (10):
70
target/arm: Hoist pc_next to a local variable in aarch64_tr_translate_insn
71
target/arm: Hoist pc_next to a local variable in arm_tr_translate_insn
72
target/arm: Hoist pc_next to a local variable in thumb_tr_translate_insn
73
target/arm: Split arm_pre_translate_insn
74
target/arm: Advance pc for arch single-step exception
75
target/arm: Split compute_fsr_fsc out of arm_deliver_fault
76
target/arm: Take an exception if PC is misaligned
77
target/arm: Assert thumb pc is aligned
78
target/arm: Suppress bp for exceptions with more priority
79
tests/tcg: Add arm and aarch64 pc alignment tests
80
81
docs/system/arm/aspeed.rst | 26 ++++++++++++----
82
include/hw/i386/microvm.h | 1 -
83
include/hw/i386/x86.h | 1 -
84
target/arm/helper.h | 1 +
85
target/arm/syndrome.h | 5 +++
86
target/hexagon/cpu.h | 1 -
87
target/rx/cpu.h | 1 -
88
hw/arm/boot.c | 1 -
89
hw/arm/digic_boards.c | 1 -
90
hw/arm/highbank.c | 1 -
91
hw/arm/npcm7xx_boards.c | 1 -
92
hw/arm/sbsa-ref.c | 1 -
93
hw/arm/stm32f405_soc.c | 1 -
94
hw/arm/vexpress.c | 1 -
95
hw/arm/virt-acpi-build.c | 7 +++++
96
hw/arm/virt.c | 21 ++++++-------
97
hw/char/stm32f2xx_usart.c | 3 +-
98
hw/intc/arm_gicv3.c | 2 +-
99
hw/intc/arm_gicv3_cpuif.c | 10 +-----
100
hw/intc/arm_gicv3_cpuif_common.c | 22 +++++++++++++
101
hw/intc/arm_gicv3_its.c | 39 +++++++++++++++--------
102
hw/net/npcm7xx_emc.c | 18 +++++------
103
hw/virtio/virtio-iommu-pci.c | 12 ++------
104
linux-user/aarch64/cpu_loop.c | 46 ++++++++++++++++------------
105
linux-user/hexagon/cpu_loop.c | 1 +
106
target/arm/debug_helper.c | 23 ++++++++++++++
107
target/arm/gdbstub.c | 9 ++++--
108
target/arm/helper.c | 6 ++--
109
target/arm/machine.c | 10 ++++++
110
target/arm/tlb_helper.c | 63 ++++++++++++++++++++++++++++----------
111
target/arm/translate-a64.c | 23 ++++++++++++--
112
target/arm/translate.c | 58 ++++++++++++++++++++++++++---------
113
target/i386/tcg/translate.c | 12 ++------
114
tests/qtest/bios-tables-test.c | 38 +++++++++++++++++++++++
115
tests/tcg/aarch64/pcalign-a64.c | 37 ++++++++++++++++++++++
116
tests/tcg/arm/pcalign-a32.c | 46 ++++++++++++++++++++++++++++
117
hw/arm/Kconfig | 1 +
118
hw/intc/Kconfig | 5 +++
119
hw/intc/meson.build | 11 ++++---
120
tests/data/acpi/q35/DSDT.viot | Bin 0 -> 9398 bytes
121
tests/data/acpi/q35/VIOT.viot | Bin 0 -> 112 bytes
122
tests/data/acpi/virt/VIOT | Bin 0 -> 88 bytes
123
tests/tcg/aarch64/Makefile.target | 4 +--
124
tests/tcg/arm/Makefile.target | 4 +++
125
44 files changed, 429 insertions(+), 145 deletions(-)
126
create mode 100644 hw/intc/arm_gicv3_cpuif_common.c
127
create mode 100644 tests/tcg/aarch64/pcalign-a64.c
128
create mode 100644 tests/tcg/arm/pcalign-a32.c
129
create mode 100644 tests/data/acpi/q35/DSDT.viot
130
create mode 100644 tests/data/acpi/q35/VIOT.viot
131
create mode 100644 tests/data/acpi/virt/VIOT
132
diff view generated by jsdifflib
1
We currently put the initrd at the smaller of:
1
From: Alex Bennée <alex.bennee@linaro.org>
2
* 128MB into RAM
3
* halfway into the RAM
4
(with the dtb following it).
5
2
6
However for large kernels this might mean that the kernel
3
While trying to debug a GIC ITS failure I saw some guest errors that
7
overlaps the initrd. For some kinds of kernel (self-decompressing
4
had poor formatting as well as leaving me confused as to what failed.
8
32-bit kernels, and ELF images with a BSS section at the end)
5
As most of the checks aren't possible without a valid dte split that
9
we don't know the exact size, but even there we have a
6
check apart and then check the other conditions in steps. This avoids
10
minimum size. Put the initrd at least further into RAM than
7
us relying on undefined data.
11
that. For image formats that can give us an exact kernel size, this
12
will mean that we definitely avoid overlaying kernel and initrd.
13
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>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
16
Tested-by: Mark Rutland <mark.rutland@arm.com>
17
Message-id: 20190516144733.32399-4-peter.maydell@linaro.org
18
---
26
---
19
hw/arm/boot.c | 34 ++++++++++++++++++++--------------
27
hw/intc/arm_gicv3_its.c | 39 +++++++++++++++++++++++++++------------
20
1 file changed, 20 insertions(+), 14 deletions(-)
28
1 file changed, 27 insertions(+), 12 deletions(-)
21
29
22
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
30
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
23
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
24
--- a/hw/arm/boot.c
32
--- a/hw/intc/arm_gicv3_its.c
25
+++ b/hw/arm/boot.c
33
+++ b/hw/intc/arm_gicv3_its.c
26
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
34
@@ -XXX,XX +XXX,XX @@ static bool process_its_cmd(GICv3ITSState *s, uint64_t value, uint32_t offset,
27
if (info->nb_cpus == 0)
35
if (res != MEMTX_OK) {
28
info->nb_cpus = 1;
36
return result;
29
37
}
30
- /*
38
+ } else {
31
- * We want to put the initrd far enough into RAM that when the
39
+ qemu_log_mask(LOG_GUEST_ERROR,
32
- * kernel is uncompressed it will not clobber the initrd. However
40
+ "%s: invalid command attributes: "
33
- * on boards without much RAM we must ensure that we still leave
41
+ "invalid dte: %"PRIx64" for %d (MEM_TX: %d)\n",
34
- * enough room for a decent sized initrd, and on boards with large
42
+ __func__, dte, devid, res);
35
- * amounts of RAM we must avoid the initrd being so far up in RAM
43
+ return result;
36
- * that it is outside lowmem and inaccessible to the kernel.
37
- * So for boards with less than 256MB of RAM we put the initrd
38
- * halfway into RAM, and for boards with 256MB of RAM or more we put
39
- * the initrd at 128MB.
40
- */
41
- info->initrd_start = info->loader_start +
42
- MIN(info->ram_size / 2, 128 * 1024 * 1024);
43
-
44
/* Assume that raw images are linux kernels, and ELF images are not. */
45
kernel_size = arm_load_elf(info, &elf_entry, &elf_low_addr,
46
&elf_high_addr, elf_machine, as);
47
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
48
}
44
}
49
45
50
info->entry = entry;
46
- if ((devid > s->dt.maxids.max_devids) || !dte_valid || !ite_valid ||
47
- !cte_valid || (eventid > max_eventid)) {
51
+
48
+
52
+ /*
49
+ /*
53
+ * We want to put the initrd far enough into RAM that when the
50
+ * In this implementation, in case of guest errors we ignore the
54
+ * kernel is uncompressed it will not clobber the initrd. However
51
+ * command and move onto the next command in the queue.
55
+ * on boards without much RAM we must ensure that we still leave
56
+ * enough room for a decent sized initrd, and on boards with large
57
+ * amounts of RAM we must avoid the initrd being so far up in RAM
58
+ * that it is outside lowmem and inaccessible to the kernel.
59
+ * So for boards with less than 256MB of RAM we put the initrd
60
+ * halfway into RAM, and for boards with 256MB of RAM or more we put
61
+ * the initrd at 128MB.
62
+ * We also refuse to put the initrd somewhere that will definitely
63
+ * overlay the kernel we just loaded, though for kernel formats which
64
+ * don't tell us their exact size (eg self-decompressing 32-bit kernels)
65
+ * we might still make a bad choice here.
66
+ */
52
+ */
67
+ info->initrd_start = info->loader_start +
53
+ if (devid > s->dt.maxids.max_devids) {
68
+ MAX(MIN(info->ram_size / 2, 128 * 1024 * 1024), kernel_size);
54
qemu_log_mask(LOG_GUEST_ERROR,
69
+ info->initrd_start = TARGET_PAGE_ALIGN(info->initrd_start);
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);
70
+
67
+
71
if (is_linux) {
68
+ } else if (!dte_valid || !ite_valid || !cte_valid) {
72
uint32_t fixupcontext[FIXUP_MAX];
69
+ qemu_log_mask(LOG_GUEST_ERROR,
73
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
74
--
83
--
75
2.20.1
84
2.25.1
76
85
77
86
diff view generated by jsdifflib
New patch
1
From: Joel Stanley <joel@jms.id.au>
1
2
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
New patch
1
From: Joel Stanley <joel@jms.id.au>
1
2
3
This is the latest URL for the OpenBMC CI. The old URL still works, but
4
redirects.
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-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
16
--- a/docs/system/arm/aspeed.rst
17
+++ b/docs/system/arm/aspeed.rst
18
@@ -XXX,XX +XXX,XX @@ The Aspeed machines can be started using the ``-kernel`` option to
19
load a Linux kernel or from a firmware. Images can be downloaded from
20
the OpenBMC jenkins :
21
22
- https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/distro=ubuntu,label=docker-builder
23
+ https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/
24
25
or directly from the OpenBMC GitHub release repository :
26
27
--
28
2.25.1
29
30
diff view generated by jsdifflib
New patch
1
From: Joel Stanley <joel@jms.id.au>
1
2
3
A common use case for the ASPEED machine is to boot a Linux kernel.
4
Provide a full example command line.
5
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Signed-off-by: Joel Stanley <joel@jms.id.au>
8
Message-id: 20211117065752.330632-4-joel@jms.id.au
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
docs/system/arm/aspeed.rst | 15 ++++++++++++---
12
1 file changed, 12 insertions(+), 3 deletions(-)
13
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
15
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/system/arm/aspeed.rst
17
+++ b/docs/system/arm/aspeed.rst
18
@@ -XXX,XX +XXX,XX @@ Missing devices
19
Boot options
20
------------
21
22
-The Aspeed machines can be started using the ``-kernel`` option to
23
-load a Linux kernel or from a firmware. Images can be downloaded from
24
-the OpenBMC jenkins :
25
+The Aspeed machines can be started using the ``-kernel`` and ``-dtb`` options
26
+to load a Linux kernel or from a firmware. Images can be downloaded from the
27
+OpenBMC jenkins :
28
29
https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/
30
31
@@ -XXX,XX +XXX,XX @@ or directly from the OpenBMC GitHub release repository :
32
33
https://github.com/openbmc/openbmc/releases
34
35
+To boot a kernel directly from a Linux build tree:
36
+
37
+.. code-block:: bash
38
+
39
+ $ qemu-system-arm -M ast2600-evb -nographic \
40
+ -kernel arch/arm/boot/zImage \
41
+ -dtb arch/arm/boot/dts/aspeed-ast2600-evb.dtb \
42
+ -initrd rootfs.cpio
43
+
44
The image should be attached as an MTD drive. Run :
45
46
.. code-block:: bash
47
--
48
2.25.1
49
50
diff view generated by jsdifflib
New patch
1
From: Joel Stanley <joel@jms.id.au>
1
2
3
Move it to the supported list.
4
5
Signed-off-by: Joel Stanley <joel@jms.id.au>
6
Message-id: 20211117065752.330632-5-joel@jms.id.au
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
docs/system/arm/aspeed.rst | 2 +-
10
1 file changed, 1 insertion(+), 1 deletion(-)
11
12
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
13
index XXXXXXX..XXXXXXX 100644
14
--- a/docs/system/arm/aspeed.rst
15
+++ b/docs/system/arm/aspeed.rst
16
@@ -XXX,XX +XXX,XX @@ Supported devices
17
* Front LEDs (PCA9552 on I2C bus)
18
* LPC Peripheral Controller (a subset of subdevices are supported)
19
* Hash/Crypto Engine (HACE) - Hash support only. TODO: HMAC and RSA
20
+ * ADC
21
22
23
Missing devices
24
---------------
25
26
* Coprocessor support
27
- * ADC (out of tree implementation)
28
* PWM and Fan Controller
29
* Slave GPIO Controller
30
* Super I/O Controller
31
--
32
2.25.1
33
34
diff view generated by jsdifflib
New patch
1
From: Olivier Hériveaux <olivier.heriveaux@ledger.fr>
1
2
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
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
gicv3_set_gicv3state() is used by arm_gicv3_common.c in
4
arm_gicv3_common_realize(). Since we want to restrict
5
arm_gicv3_cpuif.c to TCG, extract gicv3_set_gicv3state()
6
to a new file. Add this file to the meson 'specific'
7
source set, since it needs access to "cpu.h".
8
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20211115223619.2599282-2-philmd@redhat.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/intc/arm_gicv3_cpuif.c | 10 +---------
15
hw/intc/arm_gicv3_cpuif_common.c | 22 ++++++++++++++++++++++
16
hw/intc/meson.build | 1 +
17
3 files changed, 24 insertions(+), 9 deletions(-)
18
create mode 100644 hw/intc/arm_gicv3_cpuif_common.c
19
20
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
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
48
index XXXXXXX..XXXXXXX
49
--- /dev/null
50
+++ b/hw/intc/arm_gicv3_cpuif_common.c
51
@@ -XXX,XX +XXX,XX @@
52
+/* SPDX-License-Identifier: GPL-2.0-or-later */
53
+/*
54
+ * ARM Generic Interrupt Controller v3
55
+ *
56
+ * Copyright (c) 2016 Linaro Limited
57
+ * Written by Peter Maydell
58
+ *
59
+ * This code is licensed under the GPL, version 2 or (at your option)
60
+ * any later version.
61
+ */
62
+
63
+#include "qemu/osdep.h"
64
+#include "gicv3_internal.h"
65
+#include "cpu.h"
66
+
67
+void gicv3_set_gicv3state(CPUState *cpu, GICv3CPUState *s)
68
+{
69
+ ARMCPU *arm_cpu = ARM_CPU(cpu);
70
+ CPUARMState *env = &arm_cpu->env;
71
+
72
+ env->gicv3state = (void *)s;
73
+};
74
diff --git a/hw/intc/meson.build b/hw/intc/meson.build
75
index XXXXXXX..XXXXXXX 100644
76
--- a/hw/intc/meson.build
77
+++ b/hw/intc/meson.build
78
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_PMU', if_true: files('xlnx-pmu-iomod-in
79
80
specific_ss.add(when: 'CONFIG_ALLWINNER_A10_PIC', if_true: files('allwinner-a10-pic.c'))
81
specific_ss.add(when: 'CONFIG_APIC', if_true: files('apic.c', 'apic_common.c'))
82
+specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif_common.c'))
83
specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif.c'))
84
specific_ss.add(when: 'CONFIG_ARM_GIC_KVM', if_true: files('arm_gic_kvm.c'))
85
specific_ss.add(when: ['CONFIG_ARM_GIC_KVM', 'TARGET_AARCH64'], if_true: files('arm_gicv3_kvm.c', 'arm_gicv3_its_kvm.c'))
86
--
87
2.25.1
88
89
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
The TYPE_ARM_GICV3 device is an emulated one. When using
4
KVM, it is recommended to use the TYPE_KVM_ARM_GICV3 device
5
(which uses in-kernel support).
6
7
When using --with-devices-FOO, it is possible to build a
8
binary with a specific set of devices. When this binary is
9
restricted to KVM accelerator, the TYPE_ARM_GICV3 device is
10
irrelevant, and it is desirable to remove it from the binary.
11
12
Therefore introduce the CONFIG_ARM_GIC_TCG Kconfig selector
13
which select the files required to have the TYPE_ARM_GICV3
14
device, but also allowing to de-select this device.
15
16
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Message-id: 20211115223619.2599282-3-philmd@redhat.com
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
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
---
7
target/arm/translate-a64.c | 7 ++++---
8
1 file changed, 4 insertions(+), 3 deletions(-)
9
10
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/target/arm/translate-a64.c
13
+++ b/target/arm/translate-a64.c
14
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
15
{
16
DisasContext *s = container_of(dcbase, DisasContext, base);
17
CPUARMState *env = cpu->env_ptr;
18
+ uint64_t pc = s->base.pc_next;
19
uint32_t insn;
20
21
if (s->ss_active && !s->pstate_ss) {
22
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
23
return;
24
}
25
26
- s->pc_curr = s->base.pc_next;
27
- insn = arm_ldl_code(env, &s->base, s->base.pc_next, s->sctlr_b);
28
+ s->pc_curr = pc;
29
+ insn = arm_ldl_code(env, &s->base, pc, s->sctlr_b);
30
s->insn = insn;
31
- s->base.pc_next += 4;
32
+ s->base.pc_next = pc + 4;
33
34
s->fp_access_checked = false;
35
s->sve_access_checked = false;
36
--
37
2.25.1
38
39
diff view generated by jsdifflib
1
Remove the now unused TCG globals cpu_F0s, cpu_F0d, cpu_F1s, cpu_F1d.
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
cpu_M0 is still used by the iwmmxt code, and cpu_V0 and
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
cpu_V1 are used by both iwmmxt and Neon.
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20190613163917.28589-13-peter.maydell@linaro.org
10
---
6
---
11
target/arm/translate.c | 12 ++----------
7
target/arm/translate.c | 9 +++++----
12
1 file changed, 2 insertions(+), 10 deletions(-)
8
1 file changed, 5 insertions(+), 4 deletions(-)
13
9
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
10
diff --git a/target/arm/translate.c b/target/arm/translate.c
15
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate.c
12
--- a/target/arm/translate.c
17
+++ b/target/arm/translate.c
13
+++ b/target/arm/translate.c
18
@@ -XXX,XX +XXX,XX @@ TCGv_i32 cpu_CF, cpu_NF, cpu_VF, cpu_ZF;
14
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
19
TCGv_i64 cpu_exclusive_addr;
15
{
20
TCGv_i64 cpu_exclusive_val;
16
DisasContext *dc = container_of(dcbase, DisasContext, base);
21
17
CPUARMState *env = cpu->env_ptr;
22
-/* FIXME: These should be removed. */
18
+ uint32_t pc = dc->base.pc_next;
23
-static TCGv_i32 cpu_F0s, cpu_F1s;
19
unsigned int insn;
24
-static TCGv_i64 cpu_F0d, cpu_F1d;
20
25
-
21
if (arm_pre_translate_insn(dc)) {
26
#include "exec/gen-icount.h"
22
- dc->base.pc_next += 4;
27
23
+ dc->base.pc_next = pc + 4;
28
static const char * const regnames[] =
24
return;
29
@@ -XXX,XX +XXX,XX @@ static void arm_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
30
dc->base.max_insns = MIN(dc->base.max_insns, bound);
31
}
25
}
32
26
33
- cpu_F0s = tcg_temp_new_i32();
27
- dc->pc_curr = dc->base.pc_next;
34
- cpu_F1s = tcg_temp_new_i32();
28
- insn = arm_ldl_code(env, &dc->base, dc->base.pc_next, dc->sctlr_b);
35
- cpu_F0d = tcg_temp_new_i64();
29
+ dc->pc_curr = pc;
36
- cpu_F1d = tcg_temp_new_i64();
30
+ insn = arm_ldl_code(env, &dc->base, pc, dc->sctlr_b);
37
- cpu_V0 = cpu_F0d;
31
dc->insn = insn;
38
- cpu_V1 = cpu_F1d;
32
- dc->base.pc_next += 4;
39
+ cpu_V0 = tcg_temp_new_i64();
33
+ dc->base.pc_next = pc + 4;
40
+ cpu_V1 = tcg_temp_new_i64();
34
disas_arm_insn(dc, insn);
41
/* FIXME: cpu_M0 can probably be the same as cpu_V0. */
35
42
cpu_M0 = tcg_temp_new_i64();
36
arm_post_translate_insn(dc);
43
}
44
--
37
--
45
2.20.1
38
2.25.1
46
39
47
40
diff view generated by jsdifflib
1
Remove some old constructns from NEON_2RM_VCVT_F16_F32 code:
1
From: Richard Henderson <richard.henderson@linaro.org>
2
* don't use CPU_F0s
3
* don't use tcg_gen_st_f32
4
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Message-id: 20190613163917.28589-12-peter.maydell@linaro.org
9
---
6
---
10
target/arm/translate.c | 26 +++++++++++---------------
7
target/arm/translate.c | 16 ++++++++--------
11
1 file changed, 11 insertions(+), 15 deletions(-)
8
1 file changed, 8 insertions(+), 8 deletions(-)
12
9
13
diff --git a/target/arm/translate.c b/target/arm/translate.c
10
diff --git a/target/arm/translate.c b/target/arm/translate.c
14
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate.c
12
--- a/target/arm/translate.c
16
+++ b/target/arm/translate.c
13
+++ b/target/arm/translate.c
17
@@ -XXX,XX +XXX,XX @@ static TCGv_ptr vfp_reg_ptr(bool dp, int reg)
14
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
18
return ret;
15
{
19
}
16
DisasContext *dc = container_of(dcbase, DisasContext, base);
20
17
CPUARMState *env = cpu->env_ptr;
21
-#define tcg_gen_st_f32 tcg_gen_st_i32
18
+ uint32_t pc = dc->base.pc_next;
19
uint32_t insn;
20
bool is_16bit;
21
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);
22
-
38
-
23
#define ARM_CP_RW_BIT (1 << 20)
39
+ uint32_t insn2 = arm_lduw_code(env, &dc->base, pc, dc->sctlr_b);
24
40
insn = insn << 16 | insn2;
25
/* Include the VFP decoder */
41
- dc->base.pc_next += 2;
26
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
42
+ pc += 2;
27
tmp = neon_load_reg(rm, 0);
43
}
28
tmp2 = neon_load_reg(rm, 1);
44
+ dc->base.pc_next = pc;
29
tcg_gen_ext16u_i32(tmp3, tmp);
45
dc->insn = insn;
30
- gen_helper_vfp_fcvt_f16_to_f32(cpu_F0s, tmp3, fpst, ahp);
46
31
- tcg_gen_st_f32(cpu_F0s, cpu_env, neon_reg_offset(rd, 0));
47
if (dc->pstate_il) {
32
- tcg_gen_shri_i32(tmp3, tmp, 16);
33
- gen_helper_vfp_fcvt_f16_to_f32(cpu_F0s, tmp3, fpst, ahp);
34
- tcg_gen_st_f32(cpu_F0s, cpu_env, neon_reg_offset(rd, 1));
35
- tcg_temp_free_i32(tmp);
36
+ gen_helper_vfp_fcvt_f16_to_f32(tmp3, tmp3, fpst, ahp);
37
+ neon_store_reg(rd, 0, tmp3);
38
+ tcg_gen_shri_i32(tmp, tmp, 16);
39
+ gen_helper_vfp_fcvt_f16_to_f32(tmp, tmp, fpst, ahp);
40
+ neon_store_reg(rd, 1, tmp);
41
+ tmp3 = tcg_temp_new_i32();
42
tcg_gen_ext16u_i32(tmp3, tmp2);
43
- gen_helper_vfp_fcvt_f16_to_f32(cpu_F0s, tmp3, fpst, ahp);
44
- tcg_gen_st_f32(cpu_F0s, cpu_env, neon_reg_offset(rd, 2));
45
- tcg_gen_shri_i32(tmp3, tmp2, 16);
46
- gen_helper_vfp_fcvt_f16_to_f32(cpu_F0s, tmp3, fpst, ahp);
47
- tcg_gen_st_f32(cpu_F0s, cpu_env, neon_reg_offset(rd, 3));
48
- tcg_temp_free_i32(tmp2);
49
- tcg_temp_free_i32(tmp3);
50
+ gen_helper_vfp_fcvt_f16_to_f32(tmp3, tmp3, fpst, ahp);
51
+ neon_store_reg(rd, 2, tmp3);
52
+ tcg_gen_shri_i32(tmp2, tmp2, 16);
53
+ gen_helper_vfp_fcvt_f16_to_f32(tmp2, tmp2, fpst, ahp);
54
+ neon_store_reg(rd, 3, tmp2);
55
tcg_temp_free_i32(ahp);
56
tcg_temp_free_ptr(fpst);
57
break;
58
--
48
--
59
2.20.1
49
2.25.1
60
50
61
51
diff view generated by jsdifflib
1
Remove some old constructs from NEON_2RM_VCVT_F16_F32 code:
1
From: Richard Henderson <richard.henderson@linaro.org>
2
* don't use cpu_F0s
3
* don't use tcg_gen_ld_f32
4
2
3
Create arm_check_ss_active and arm_check_kernelpage.
4
5
Reverse the order of the tests. While it doesn't matter in practice,
6
because only user-only has a kernel page and user-only never sets
7
ss_active, ss_active has priority over execution exceptions and it
8
is best to keep them in the proper order.
9
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Message-id: 20190613163917.28589-11-peter.maydell@linaro.org
9
---
13
---
10
target/arm/translate.c | 27 ++++++++++++---------------
14
target/arm/translate.c | 10 +++++++---
11
1 file changed, 12 insertions(+), 15 deletions(-)
15
1 file changed, 7 insertions(+), 3 deletions(-)
12
16
13
diff --git a/target/arm/translate.c b/target/arm/translate.c
17
diff --git a/target/arm/translate.c b/target/arm/translate.c
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate.c
19
--- a/target/arm/translate.c
16
+++ b/target/arm/translate.c
20
+++ b/target/arm/translate.c
17
@@ -XXX,XX +XXX,XX @@ static TCGv_ptr vfp_reg_ptr(bool dp, int reg)
21
@@ -XXX,XX +XXX,XX @@ static void arm_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
18
return ret;
22
dc->insn_start = tcg_last_op();
19
}
23
}
20
24
21
-#define tcg_gen_ld_f32 tcg_gen_ld_i32
25
-static bool arm_pre_translate_insn(DisasContext *dc)
22
#define tcg_gen_st_f32 tcg_gen_st_i32
26
+static bool arm_check_kernelpage(DisasContext *dc)
23
27
{
24
#define ARM_CP_RW_BIT (1 << 20)
28
#ifdef CONFIG_USER_ONLY
25
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
29
/* Intercept jump to the magic kernel page. */
26
q || (rm & 1)) {
30
@@ -XXX,XX +XXX,XX @@ static bool arm_pre_translate_insn(DisasContext *dc)
27
return 1;
31
return true;
28
}
32
}
29
- tmp = tcg_temp_new_i32();
33
#endif
30
- tmp2 = tcg_temp_new_i32();
34
+ return false;
31
fpst = get_fpstatus_ptr(true);
35
+}
32
ahp = get_ahp_flag();
36
33
- tcg_gen_ld_f32(cpu_F0s, cpu_env, neon_reg_offset(rm, 0));
37
+static bool arm_check_ss_active(DisasContext *dc)
34
- gen_helper_vfp_fcvt_f32_to_f16(tmp, cpu_F0s, fpst, ahp);
38
+{
35
- tcg_gen_ld_f32(cpu_F0s, cpu_env, neon_reg_offset(rm, 1));
39
if (dc->ss_active && !dc->pstate_ss) {
36
- gen_helper_vfp_fcvt_f32_to_f16(tmp2, cpu_F0s, fpst, ahp);
40
/* Singlestep state is Active-pending.
37
+ tmp = neon_load_reg(rm, 0);
41
* If we're in this state at the start of a TB then either
38
+ gen_helper_vfp_fcvt_f32_to_f16(tmp, tmp, fpst, ahp);
42
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
39
+ tmp2 = neon_load_reg(rm, 1);
43
uint32_t pc = dc->base.pc_next;
40
+ gen_helper_vfp_fcvt_f32_to_f16(tmp2, tmp2, fpst, ahp);
44
unsigned int insn;
41
tcg_gen_shli_i32(tmp2, tmp2, 16);
45
42
tcg_gen_or_i32(tmp2, tmp2, tmp);
46
- if (arm_pre_translate_insn(dc)) {
43
- tcg_gen_ld_f32(cpu_F0s, cpu_env, neon_reg_offset(rm, 2));
47
+ if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
44
- gen_helper_vfp_fcvt_f32_to_f16(tmp, cpu_F0s, fpst, ahp);
48
dc->base.pc_next = pc + 4;
45
- tcg_gen_ld_f32(cpu_F0s, cpu_env, neon_reg_offset(rm, 3));
49
return;
46
+ tcg_temp_free_i32(tmp);
50
}
47
+ tmp = neon_load_reg(rm, 2);
51
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
48
+ gen_helper_vfp_fcvt_f32_to_f16(tmp, tmp, fpst, ahp);
52
uint32_t insn;
49
+ tmp3 = neon_load_reg(rm, 3);
53
bool is_16bit;
50
neon_store_reg(rd, 0, tmp2);
54
51
- tmp2 = tcg_temp_new_i32();
55
- if (arm_pre_translate_insn(dc)) {
52
- gen_helper_vfp_fcvt_f32_to_f16(tmp2, cpu_F0s, fpst, ahp);
56
+ if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
53
- tcg_gen_shli_i32(tmp2, tmp2, 16);
57
dc->base.pc_next = pc + 2;
54
- tcg_gen_or_i32(tmp2, tmp2, tmp);
58
return;
55
- neon_store_reg(rd, 1, tmp2);
59
}
56
+ gen_helper_vfp_fcvt_f32_to_f16(tmp3, tmp3, fpst, ahp);
57
+ tcg_gen_shli_i32(tmp3, tmp3, 16);
58
+ tcg_gen_or_i32(tmp3, tmp3, tmp);
59
+ neon_store_reg(rd, 1, tmp3);
60
tcg_temp_free_i32(tmp);
61
tcg_temp_free_i32(ahp);
62
tcg_temp_free_ptr(fpst);
63
--
60
--
64
2.20.1
61
2.25.1
65
62
66
63
diff view generated by jsdifflib
1
We want to use vfp_expand_imm() in the AArch32 VFP decode;
1
From: Richard Henderson <richard.henderson@linaro.org>
2
move it from the a64-only header/source file to the
3
AArch32 one (which is always compiled even for AArch64).
4
2
3
The size of the code covered by a TranslationBlock cannot be 0;
4
this is checked via assert in tb_gen_code.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Message-id: 20190613163917.28589-2-peter.maydell@linaro.org
9
---
9
---
10
target/arm/translate-a64.h | 1 -
10
target/arm/translate-a64.c | 1 +
11
target/arm/translate.h | 7 +++++++
11
1 file changed, 1 insertion(+)
12
target/arm/translate-a64.c | 32 --------------------------------
13
target/arm/translate-vfp.inc.c | 33 +++++++++++++++++++++++++++++++++
14
4 files changed, 40 insertions(+), 33 deletions(-)
15
12
16
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate-a64.h
19
+++ b/target/arm/translate-a64.h
20
@@ -XXX,XX +XXX,XX @@ void write_fp_dreg(DisasContext *s, int reg, TCGv_i64 v);
21
TCGv_ptr get_fpstatus_ptr(bool);
22
bool logic_imm_decode_wmask(uint64_t *result, unsigned int immn,
23
unsigned int imms, unsigned int immr);
24
-uint64_t vfp_expand_imm(int size, uint8_t imm8);
25
bool sve_access_check(DisasContext *s);
26
27
/* We should have at some point before trying to access an FP register
28
diff --git a/target/arm/translate.h b/target/arm/translate.h
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/translate.h
31
+++ b/target/arm/translate.h
32
@@ -XXX,XX +XXX,XX @@ static inline void gen_ss_advance(DisasContext *s)
33
}
34
}
35
36
+/*
37
+ * Given a VFP floating point constant encoded into an 8 bit immediate in an
38
+ * instruction, expand it to the actual constant value of the specified
39
+ * size, as per the VFPExpandImm() pseudocode in the Arm ARM.
40
+ */
41
+uint64_t vfp_expand_imm(int size, uint8_t imm8);
42
+
43
/* Vector operations shared between ARM and AArch64. */
44
extern const GVecGen3 mla_op[4];
45
extern const GVecGen3 mls_op[4];
46
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
47
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/translate-a64.c
15
--- a/target/arm/translate-a64.c
49
+++ b/target/arm/translate-a64.c
16
+++ b/target/arm/translate-a64.c
50
@@ -XXX,XX +XXX,XX @@ static void disas_fp_3src(DisasContext *s, uint32_t insn)
17
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
18
assert(s->base.num_insns == 1);
19
gen_swstep_exception(s, 0, 0);
20
s->base.is_jmp = DISAS_NORETURN;
21
+ s->base.pc_next = pc + 4;
22
return;
51
}
23
}
52
}
24
53
54
-/* The imm8 encodes the sign bit, enough bits to represent an exponent in
55
- * the range 01....1xx to 10....0xx, and the most significant 4 bits of
56
- * the mantissa; see VFPExpandImm() in the v8 ARM ARM.
57
- */
58
-uint64_t vfp_expand_imm(int size, uint8_t imm8)
59
-{
60
- uint64_t imm;
61
-
62
- switch (size) {
63
- case MO_64:
64
- imm = (extract32(imm8, 7, 1) ? 0x8000 : 0) |
65
- (extract32(imm8, 6, 1) ? 0x3fc0 : 0x4000) |
66
- extract32(imm8, 0, 6);
67
- imm <<= 48;
68
- break;
69
- case MO_32:
70
- imm = (extract32(imm8, 7, 1) ? 0x8000 : 0) |
71
- (extract32(imm8, 6, 1) ? 0x3e00 : 0x4000) |
72
- (extract32(imm8, 0, 6) << 3);
73
- imm <<= 16;
74
- break;
75
- case MO_16:
76
- imm = (extract32(imm8, 7, 1) ? 0x8000 : 0) |
77
- (extract32(imm8, 6, 1) ? 0x3000 : 0x4000) |
78
- (extract32(imm8, 0, 6) << 6);
79
- break;
80
- default:
81
- g_assert_not_reached();
82
- }
83
- return imm;
84
-}
85
-
86
/* Floating point immediate
87
* 31 30 29 28 24 23 22 21 20 13 12 10 9 5 4 0
88
* +---+---+---+-----------+------+---+------------+-------+------+------+
89
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
90
index XXXXXXX..XXXXXXX 100644
91
--- a/target/arm/translate-vfp.inc.c
92
+++ b/target/arm/translate-vfp.inc.c
93
@@ -XXX,XX +XXX,XX @@
94
#include "decode-vfp.inc.c"
95
#include "decode-vfp-uncond.inc.c"
96
97
+/*
98
+ * The imm8 encodes the sign bit, enough bits to represent an exponent in
99
+ * the range 01....1xx to 10....0xx, and the most significant 4 bits of
100
+ * the mantissa; see VFPExpandImm() in the v8 ARM ARM.
101
+ */
102
+uint64_t vfp_expand_imm(int size, uint8_t imm8)
103
+{
104
+ uint64_t imm;
105
+
106
+ switch (size) {
107
+ case MO_64:
108
+ imm = (extract32(imm8, 7, 1) ? 0x8000 : 0) |
109
+ (extract32(imm8, 6, 1) ? 0x3fc0 : 0x4000) |
110
+ extract32(imm8, 0, 6);
111
+ imm <<= 48;
112
+ break;
113
+ case MO_32:
114
+ imm = (extract32(imm8, 7, 1) ? 0x8000 : 0) |
115
+ (extract32(imm8, 6, 1) ? 0x3e00 : 0x4000) |
116
+ (extract32(imm8, 0, 6) << 3);
117
+ imm <<= 16;
118
+ break;
119
+ case MO_16:
120
+ imm = (extract32(imm8, 7, 1) ? 0x8000 : 0) |
121
+ (extract32(imm8, 6, 1) ? 0x3000 : 0x4000) |
122
+ (extract32(imm8, 0, 6) << 6);
123
+ break;
124
+ default:
125
+ g_assert_not_reached();
126
+ }
127
+ return imm;
128
+}
129
+
130
/*
131
* Return the offset of a 16-bit half of the specified VFP single-precision
132
* register. If top is true, returns the top 16 bits; otherwise the bottom
133
--
25
--
134
2.20.1
26
2.25.1
135
27
136
28
diff view generated by jsdifflib
1
In several places cut and paste errors meant we were using the wrong
1
From: Richard Henderson <richard.henderson@linaro.org>
2
type for the 'arg' struct in trans_ functions called by the
3
decodetree decoder, because we were using the _sp version of the
4
struct in the _dp function. These were harmless, because the two
5
structs were identical and so decodetree made them typedefs of the
6
same underlying structure (and we'd have had a compile error if they
7
were not harmless), but we should clean them up anyway.
8
2
3
We will reuse this section of arm_deliver_fault for
4
raising pc alignment faults.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20190614104457.24703-2-peter.maydell@linaro.org
12
---
9
---
13
target/arm/translate-vfp.inc.c | 28 ++++++++++++++--------------
10
target/arm/tlb_helper.c | 45 +++++++++++++++++++++++++----------------
14
1 file changed, 14 insertions(+), 14 deletions(-)
11
1 file changed, 28 insertions(+), 17 deletions(-)
15
12
16
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
13
diff --git a/target/arm/tlb_helper.c b/target/arm/tlb_helper.c
17
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate-vfp.inc.c
15
--- a/target/arm/tlb_helper.c
19
+++ b/target/arm/translate-vfp.inc.c
16
+++ b/target/arm/tlb_helper.c
20
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_64_sp(DisasContext *s, arg_VMOV_64_sp *a)
17
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
21
return true;
18
return syn;
22
}
19
}
23
20
24
-static bool trans_VMOV_64_dp(DisasContext *s, arg_VMOV_64_sp *a)
21
-static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
25
+static bool trans_VMOV_64_dp(DisasContext *s, arg_VMOV_64_dp *a)
22
- MMUAccessType access_type,
23
- int mmu_idx, ARMMMUFaultInfo *fi)
24
+static uint32_t compute_fsr_fsc(CPUARMState *env, ARMMMUFaultInfo *fi,
25
+ int target_el, int mmu_idx, uint32_t *ret_fsc)
26
{
26
{
27
TCGv_i32 tmp;
27
- CPUARMState *env = &cpu->env;
28
28
- int target_el;
29
@@ -XXX,XX +XXX,XX @@ static bool trans_VLDR_VSTR_sp(DisasContext *s, arg_VLDR_VSTR_sp *a)
29
- bool same_el;
30
return true;
30
- uint32_t syn, exc, fsr, fsc;
31
}
31
ARMMMUIdx arm_mmu_idx = core_to_arm_mmu_idx(env, mmu_idx);
32
32
-
33
-static bool trans_VLDR_VSTR_dp(DisasContext *s, arg_VLDR_VSTR_sp *a)
33
- target_el = exception_target_el(env);
34
+static bool trans_VLDR_VSTR_dp(DisasContext *s, arg_VLDR_VSTR_dp *a)
34
- if (fi->stage2) {
35
{
35
- target_el = 2;
36
uint32_t offset;
36
- env->cp15.hpfar_el2 = extract64(fi->s2addr, 12, 47) << 4;
37
TCGv_i32 addr;
37
- if (arm_is_secure_below_el3(env) && fi->s1ns) {
38
@@ -XXX,XX +XXX,XX @@ static void gen_VMLA_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst)
38
- env->cp15.hpfar_el2 |= HPFAR_NS;
39
tcg_temp_free_i64(tmp);
39
- }
40
}
40
- }
41
41
- same_el = (arm_current_el(env) == target_el);
42
-static bool trans_VMLA_dp(DisasContext *s, arg_VMLA_sp *a)
42
+ uint32_t fsr, fsc;
43
+static bool trans_VMLA_dp(DisasContext *s, arg_VMLA_dp *a)
43
44
{
44
if (target_el == 2 || arm_el_is_aa64(env, target_el) ||
45
return do_vfp_3op_dp(s, gen_VMLA_dp, a->vd, a->vn, a->vm, true);
45
arm_s1_regime_using_lpae_format(env, arm_mmu_idx)) {
46
}
46
@@ -XXX,XX +XXX,XX @@ static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
47
@@ -XXX,XX +XXX,XX @@ static void gen_VMLS_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst)
47
fsc = 0x3f;
48
tcg_temp_free_i64(tmp);
48
}
49
}
49
50
50
+ *ret_fsc = fsc;
51
-static bool trans_VMLS_dp(DisasContext *s, arg_VMLS_sp *a)
51
+ return fsr;
52
+static bool trans_VMLS_dp(DisasContext *s, arg_VMLS_dp *a)
52
+}
53
{
53
+
54
return do_vfp_3op_dp(s, gen_VMLS_dp, a->vd, a->vn, a->vm, true);
54
+static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
55
}
55
+ MMUAccessType access_type,
56
@@ -XXX,XX +XXX,XX @@ static void gen_VNMLS_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst)
56
+ int mmu_idx, ARMMMUFaultInfo *fi)
57
tcg_temp_free_i64(tmp);
57
+{
58
}
58
+ CPUARMState *env = &cpu->env;
59
59
+ int target_el;
60
-static bool trans_VNMLS_dp(DisasContext *s, arg_VNMLS_sp *a)
60
+ bool same_el;
61
+static bool trans_VNMLS_dp(DisasContext *s, arg_VNMLS_dp *a)
61
+ uint32_t syn, exc, fsr, fsc;
62
{
62
+
63
return do_vfp_3op_dp(s, gen_VNMLS_dp, a->vd, a->vn, a->vm, true);
63
+ target_el = exception_target_el(env);
64
}
64
+ if (fi->stage2) {
65
@@ -XXX,XX +XXX,XX @@ static void gen_VNMLA_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst)
65
+ target_el = 2;
66
tcg_temp_free_i64(tmp);
66
+ env->cp15.hpfar_el2 = extract64(fi->s2addr, 12, 47) << 4;
67
}
67
+ if (arm_is_secure_below_el3(env) && fi->s1ns) {
68
68
+ env->cp15.hpfar_el2 |= HPFAR_NS;
69
-static bool trans_VNMLA_dp(DisasContext *s, arg_VNMLA_sp *a)
69
+ }
70
+static bool trans_VNMLA_dp(DisasContext *s, arg_VNMLA_dp *a)
70
+ }
71
{
71
+ same_el = (arm_current_el(env) == target_el);
72
return do_vfp_3op_dp(s, gen_VNMLA_dp, a->vd, a->vn, a->vm, true);
72
+
73
}
73
+ fsr = compute_fsr_fsc(env, fi, target_el, mmu_idx, &fsc);
74
@@ -XXX,XX +XXX,XX @@ static bool trans_VMUL_sp(DisasContext *s, arg_VMUL_sp *a)
74
+
75
return do_vfp_3op_sp(s, gen_helper_vfp_muls, a->vd, a->vn, a->vm, false);
75
if (access_type == MMU_INST_FETCH) {
76
}
76
syn = syn_insn_abort(same_el, fi->ea, fi->s1ptw, fsc);
77
77
exc = EXCP_PREFETCH_ABORT;
78
-static bool trans_VMUL_dp(DisasContext *s, arg_VMUL_sp *a)
79
+static bool trans_VMUL_dp(DisasContext *s, arg_VMUL_dp *a)
80
{
81
return do_vfp_3op_dp(s, gen_helper_vfp_muld, a->vd, a->vn, a->vm, false);
82
}
83
@@ -XXX,XX +XXX,XX @@ static void gen_VNMUL_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst)
84
gen_helper_vfp_negd(vd, vd);
85
}
86
87
-static bool trans_VNMUL_dp(DisasContext *s, arg_VNMUL_sp *a)
88
+static bool trans_VNMUL_dp(DisasContext *s, arg_VNMUL_dp *a)
89
{
90
return do_vfp_3op_dp(s, gen_VNMUL_dp, a->vd, a->vn, a->vm, false);
91
}
92
@@ -XXX,XX +XXX,XX @@ static bool trans_VADD_sp(DisasContext *s, arg_VADD_sp *a)
93
return do_vfp_3op_sp(s, gen_helper_vfp_adds, a->vd, a->vn, a->vm, false);
94
}
95
96
-static bool trans_VADD_dp(DisasContext *s, arg_VADD_sp *a)
97
+static bool trans_VADD_dp(DisasContext *s, arg_VADD_dp *a)
98
{
99
return do_vfp_3op_dp(s, gen_helper_vfp_addd, a->vd, a->vn, a->vm, false);
100
}
101
@@ -XXX,XX +XXX,XX @@ static bool trans_VSUB_sp(DisasContext *s, arg_VSUB_sp *a)
102
return do_vfp_3op_sp(s, gen_helper_vfp_subs, a->vd, a->vn, a->vm, false);
103
}
104
105
-static bool trans_VSUB_dp(DisasContext *s, arg_VSUB_sp *a)
106
+static bool trans_VSUB_dp(DisasContext *s, arg_VSUB_dp *a)
107
{
108
return do_vfp_3op_dp(s, gen_helper_vfp_subd, a->vd, a->vn, a->vm, false);
109
}
110
@@ -XXX,XX +XXX,XX @@ static bool trans_VDIV_sp(DisasContext *s, arg_VDIV_sp *a)
111
return do_vfp_3op_sp(s, gen_helper_vfp_divs, a->vd, a->vn, a->vm, false);
112
}
113
114
-static bool trans_VDIV_dp(DisasContext *s, arg_VDIV_sp *a)
115
+static bool trans_VDIV_dp(DisasContext *s, arg_VDIV_dp *a)
116
{
117
return do_vfp_3op_dp(s, gen_helper_vfp_divd, a->vd, a->vn, a->vm, false);
118
}
119
@@ -XXX,XX +XXX,XX @@ static bool trans_VFM_sp(DisasContext *s, arg_VFM_sp *a)
120
return true;
121
}
122
123
-static bool trans_VFM_dp(DisasContext *s, arg_VFM_sp *a)
124
+static bool trans_VFM_dp(DisasContext *s, arg_VFM_dp *a)
125
{
126
/*
127
* VFNMA : fd = muladd(-fd, fn, fm)
128
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTR_sp(DisasContext *s, arg_VRINTR_sp *a)
129
return true;
130
}
131
132
-static bool trans_VRINTR_dp(DisasContext *s, arg_VRINTR_sp *a)
133
+static bool trans_VRINTR_dp(DisasContext *s, arg_VRINTR_dp *a)
134
{
135
TCGv_ptr fpst;
136
TCGv_i64 tmp;
137
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTZ_sp(DisasContext *s, arg_VRINTZ_sp *a)
138
return true;
139
}
140
141
-static bool trans_VRINTZ_dp(DisasContext *s, arg_VRINTZ_sp *a)
142
+static bool trans_VRINTZ_dp(DisasContext *s, arg_VRINTZ_dp *a)
143
{
144
TCGv_ptr fpst;
145
TCGv_i64 tmp;
146
--
78
--
147
2.20.1
79
2.25.1
148
80
149
81
diff view generated by jsdifflib
1
The architecture permits FPUs which have only single-precision
1
From: Richard Henderson <richard.henderson@linaro.org>
2
support, not double-precision; Cortex-M4 and Cortex-M33 are
2
3
both like that. Add the necessary checks on the MVFR0 FPDP
3
For A64, any input to an indirect branch can cause this.
4
field so that we UNDEF any double-precision instructions on
4
5
CPUs like this.
5
For A32, many indirect branch paths force the branch to be aligned,
6
6
but BXWritePC does not. This includes the BX instruction but also
7
Note that even if FPDP==0 the insns like VMOV-to/from-gpreg,
7
other interworking changes to PC. Prior to v8, this case is UNDEFINED.
8
VLDM/VSTM, VLDR/VSTR which take double precision registers
8
With v8, this is CONSTRAINED UNPREDICTABLE and may either raise an
9
still exist.
9
exception or force align the PC.
10
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>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20190614104457.24703-3-peter.maydell@linaro.org
14
---
18
---
15
target/arm/cpu.h | 6 +++
19
target/arm/helper.h | 1 +
16
target/arm/translate-vfp.inc.c | 84 ++++++++++++++++++++++++++++++++++
20
target/arm/syndrome.h | 5 ++++
17
2 files changed, 90 insertions(+)
21
linux-user/aarch64/cpu_loop.c | 46 ++++++++++++++++++++---------------
18
22
target/arm/tlb_helper.c | 18 ++++++++++++++
19
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
23
target/arm/translate-a64.c | 15 ++++++++++++
20
index XXXXXXX..XXXXXXX 100644
24
target/arm/translate.c | 22 ++++++++++++++++-
21
--- a/target/arm/cpu.h
25
6 files changed, 87 insertions(+), 20 deletions(-)
22
+++ b/target/arm/cpu.h
26
23
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_fpshvec(const ARMISARegisters *id)
27
diff --git a/target/arm/helper.h b/target/arm/helper.h
24
return FIELD_EX64(id->mvfr0, MVFR0, FPSHVEC) > 0;
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/helper.h
30
+++ b/target/arm/helper.h
31
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RWG_SE,
32
DEF_HELPER_2(exception_internal, void, env, i32)
33
DEF_HELPER_4(exception_with_syndrome, void, env, i32, i32, i32)
34
DEF_HELPER_2(exception_bkpt_insn, void, env, i32)
35
+DEF_HELPER_2(exception_pc_alignment, noreturn, env, tl)
36
DEF_HELPER_1(setend, void, env)
37
DEF_HELPER_2(wfi, void, env, i32)
38
DEF_HELPER_1(wfe, void, env)
39
diff --git a/target/arm/syndrome.h b/target/arm/syndrome.h
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/syndrome.h
42
+++ b/target/arm/syndrome.h
43
@@ -XXX,XX +XXX,XX @@ static inline uint32_t syn_illegalstate(void)
44
return (EC_ILLEGALSTATE << ARM_EL_EC_SHIFT) | ARM_EL_IL;
25
}
45
}
26
46
27
+static inline bool isar_feature_aa32_fpdp(const ARMISARegisters *id)
47
+static inline uint32_t syn_pcalignment(void)
28
+{
48
+{
29
+ /* Return true if CPU supports double precision floating point */
49
+ return (EC_PCALIGNMENT << ARM_EL_EC_SHIFT) | ARM_EL_IL;
30
+ return FIELD_EX64(id->mvfr0, MVFR0, FPDP) > 0;
31
+}
50
+}
32
+
51
+
52
#endif /* TARGET_ARM_SYNDROME_H */
53
diff --git a/linux-user/aarch64/cpu_loop.c b/linux-user/aarch64/cpu_loop.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/linux-user/aarch64/cpu_loop.c
56
+++ b/linux-user/aarch64/cpu_loop.c
57
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
58
break;
59
case EXCP_PREFETCH_ABORT:
60
case EXCP_DATA_ABORT:
61
- /* We should only arrive here with EC in {DATAABORT, INSNABORT}. */
62
ec = syn_get_ec(env->exception.syndrome);
63
- assert(ec == EC_DATAABORT || ec == EC_INSNABORT);
64
-
65
- /* Both EC have the same format for FSC, or close enough. */
66
- fsc = extract32(env->exception.syndrome, 0, 6);
67
- switch (fsc) {
68
- case 0x04 ... 0x07: /* Translation fault, level {0-3} */
69
- si_signo = TARGET_SIGSEGV;
70
- si_code = TARGET_SEGV_MAPERR;
71
+ switch (ec) {
72
+ case EC_DATAABORT:
73
+ case EC_INSNABORT:
74
+ /* Both EC have the same format for FSC, or close enough. */
75
+ fsc = extract32(env->exception.syndrome, 0, 6);
76
+ switch (fsc) {
77
+ case 0x04 ... 0x07: /* Translation fault, level {0-3} */
78
+ si_signo = TARGET_SIGSEGV;
79
+ si_code = TARGET_SEGV_MAPERR;
80
+ break;
81
+ case 0x09 ... 0x0b: /* Access flag fault, level {1-3} */
82
+ case 0x0d ... 0x0f: /* Permission fault, level {1-3} */
83
+ si_signo = TARGET_SIGSEGV;
84
+ si_code = TARGET_SEGV_ACCERR;
85
+ break;
86
+ case 0x11: /* Synchronous Tag Check Fault */
87
+ si_signo = TARGET_SIGSEGV;
88
+ si_code = TARGET_SEGV_MTESERR;
89
+ break;
90
+ case 0x21: /* Alignment fault */
91
+ si_signo = TARGET_SIGBUS;
92
+ si_code = TARGET_BUS_ADRALN;
93
+ break;
94
+ default:
95
+ g_assert_not_reached();
96
+ }
97
break;
98
- case 0x09 ... 0x0b: /* Access flag fault, level {1-3} */
99
- case 0x0d ... 0x0f: /* Permission fault, level {1-3} */
100
- si_signo = TARGET_SIGSEGV;
101
- si_code = TARGET_SEGV_ACCERR;
102
- break;
103
- case 0x11: /* Synchronous Tag Check Fault */
104
- si_signo = TARGET_SIGSEGV;
105
- si_code = TARGET_SEGV_MTESERR;
106
- break;
107
- case 0x21: /* Alignment fault */
108
+ case EC_PCALIGNMENT:
109
si_signo = TARGET_SIGBUS;
110
si_code = TARGET_BUS_ADRALN;
111
break;
112
diff --git a/target/arm/tlb_helper.c b/target/arm/tlb_helper.c
113
index XXXXXXX..XXXXXXX 100644
114
--- a/target/arm/tlb_helper.c
115
+++ b/target/arm/tlb_helper.c
116
@@ -XXX,XX +XXX,XX @@
117
#include "cpu.h"
118
#include "internals.h"
119
#include "exec/exec-all.h"
120
+#include "exec/helper-proto.h"
121
122
static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
123
unsigned int target_el,
124
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr,
125
arm_deliver_fault(cpu, vaddr, access_type, mmu_idx, &fi);
126
}
127
128
+void helper_exception_pc_alignment(CPUARMState *env, target_ulong pc)
129
+{
130
+ ARMMMUFaultInfo fi = { .type = ARMFault_Alignment };
131
+ int target_el = exception_target_el(env);
132
+ int mmu_idx = cpu_mmu_index(env, true);
133
+ uint32_t fsc;
134
+
135
+ env->exception.vaddress = pc;
136
+
137
+ /*
138
+ * Note that the fsc is not applicable to this exception,
139
+ * since any syndrome is pcalignment not insn_abort.
140
+ */
141
+ env->exception.fsr = compute_fsr_fsc(env, &fi, target_el, mmu_idx, &fsc);
142
+ raise_exception(env, EXCP_PREFETCH_ABORT, syn_pcalignment(), target_el);
143
+}
144
+
145
#if !defined(CONFIG_USER_ONLY)
146
33
/*
147
/*
34
* We always set the FP and SIMD FP16 fields to indicate identical
148
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
35
* levels of support (assuming SIMD is implemented at all), so
149
index XXXXXXX..XXXXXXX 100644
36
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
150
--- a/target/arm/translate-a64.c
37
index XXXXXXX..XXXXXXX 100644
151
+++ b/target/arm/translate-a64.c
38
--- a/target/arm/translate-vfp.inc.c
152
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
39
+++ b/target/arm/translate-vfp.inc.c
153
uint64_t pc = s->base.pc_next;
40
@@ -XXX,XX +XXX,XX @@ static bool trans_VSEL(DisasContext *s, arg_VSEL *a)
154
uint32_t insn;
41
((a->vm | a->vn | a->vd) & 0x10)) {
155
42
return false;
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;
43
}
162
}
44
+
163
45
+ if (dp && !dc_isar_feature(aa32_fpdp, s)) {
164
+ if (pc & 3) {
46
+ return false;
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;
47
+ }
176
+ }
48
+
177
+
49
rd = a->vd;
178
s->pc_curr = pc;
50
rn = a->vn;
179
insn = arm_ldl_code(env, &s->base, pc, s->sctlr_b);
51
rm = a->vm;
180
s->insn = insn;
52
@@ -XXX,XX +XXX,XX @@ static bool trans_VMINMAXNM(DisasContext *s, arg_VMINMAXNM *a)
181
diff --git a/target/arm/translate.c b/target/arm/translate.c
53
((a->vm | a->vn | a->vd) & 0x10)) {
182
index XXXXXXX..XXXXXXX 100644
54
return false;
183
--- a/target/arm/translate.c
55
}
184
+++ b/target/arm/translate.c
56
+
185
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
57
+ if (dp && !dc_isar_feature(aa32_fpdp, s)) {
186
uint32_t pc = dc->base.pc_next;
58
+ return false;
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;
59
+ }
194
+ }
60
+
195
+
61
rd = a->vd;
196
+ if (pc & 3) {
62
rn = a->vn;
197
+ /*
63
rm = a->vm;
198
+ * PC alignment fault. This has priority over the instruction abort
64
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINT(DisasContext *s, arg_VRINT *a)
199
+ * that we would receive from a translation fault via arm_ldl_code
65
((a->vm | a->vd) & 0x10)) {
200
+ * (or the execution of the kernelpage entrypoint). This should only
66
return false;
201
+ * be possible after an indirect branch, at the start of the TB.
67
}
202
+ */
68
+
203
+ assert(dc->base.num_insns == 1);
69
+ if (dp && !dc_isar_feature(aa32_fpdp, s)) {
204
+ gen_helper_exception_pc_alignment(cpu_env, tcg_constant_tl(pc));
70
+ return false;
205
+ dc->base.is_jmp = DISAS_NORETURN;
206
+ dc->base.pc_next = QEMU_ALIGN_UP(pc, 4);
207
+ return;
71
+ }
208
+ }
72
+
209
+
73
rd = a->vd;
210
+ if (arm_check_kernelpage(dc)) {
74
rm = a->vm;
211
dc->base.pc_next = pc + 4;
75
212
return;
76
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT(DisasContext *s, arg_VCVT *a)
77
if (dp && !dc_isar_feature(aa32_fp_d32, s) && (a->vm & 0x10)) {
78
return false;
79
}
80
+
81
+ if (dp && !dc_isar_feature(aa32_fpdp, s)) {
82
+ return false;
83
+ }
84
+
85
rd = a->vd;
86
rm = a->vm;
87
88
@@ -XXX,XX +XXX,XX @@ static bool do_vfp_3op_dp(DisasContext *s, VFPGen3OpDPFn *fn,
89
return false;
90
}
91
92
+ if (!dc_isar_feature(aa32_fpdp, s)) {
93
+ return false;
94
+ }
95
+
96
if (!dc_isar_feature(aa32_fpshvec, s) &&
97
(veclen != 0 || s->vec_stride != 0)) {
98
return false;
99
@@ -XXX,XX +XXX,XX @@ static bool do_vfp_2op_dp(DisasContext *s, VFPGen2OpDPFn *fn, int vd, int vm)
100
return false;
101
}
102
103
+ if (!dc_isar_feature(aa32_fpdp, s)) {
104
+ return false;
105
+ }
106
+
107
if (!dc_isar_feature(aa32_fpshvec, s) &&
108
(veclen != 0 || s->vec_stride != 0)) {
109
return false;
110
@@ -XXX,XX +XXX,XX @@ static bool trans_VFM_sp(DisasContext *s, arg_VFM_sp *a)
111
return false;
112
}
113
114
+ if (!dc_isar_feature(aa32_fpdp, s)) {
115
+ return false;
116
+ }
117
+
118
if (!vfp_access_check(s)) {
119
return true;
120
}
121
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_imm_dp(DisasContext *s, arg_VMOV_imm_dp *a)
122
return false;
123
}
124
125
+ if (!dc_isar_feature(aa32_fpdp, s)) {
126
+ return false;
127
+ }
128
+
129
if (!dc_isar_feature(aa32_fpshvec, s) &&
130
(veclen != 0 || s->vec_stride != 0)) {
131
return false;
132
@@ -XXX,XX +XXX,XX @@ static bool trans_VCMP_dp(DisasContext *s, arg_VCMP_dp *a)
133
return false;
134
}
135
136
+ if (!dc_isar_feature(aa32_fpdp, s)) {
137
+ return false;
138
+ }
139
+
140
if (!vfp_access_check(s)) {
141
return true;
142
}
143
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f64_f16(DisasContext *s, arg_VCVT_f64_f16 *a)
144
return false;
145
}
146
147
+ if (!dc_isar_feature(aa32_fpdp, s)) {
148
+ return false;
149
+ }
150
+
151
if (!vfp_access_check(s)) {
152
return true;
153
}
154
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f16_f64(DisasContext *s, arg_VCVT_f16_f64 *a)
155
return false;
156
}
157
158
+ if (!dc_isar_feature(aa32_fpdp, s)) {
159
+ return false;
160
+ }
161
+
162
if (!vfp_access_check(s)) {
163
return true;
164
}
165
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTR_dp(DisasContext *s, arg_VRINTR_dp *a)
166
return false;
167
}
168
169
+ if (!dc_isar_feature(aa32_fpdp, s)) {
170
+ return false;
171
+ }
172
+
173
if (!vfp_access_check(s)) {
174
return true;
175
}
176
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTZ_dp(DisasContext *s, arg_VRINTZ_dp *a)
177
return false;
178
}
179
180
+ if (!dc_isar_feature(aa32_fpdp, s)) {
181
+ return false;
182
+ }
183
+
184
if (!vfp_access_check(s)) {
185
return true;
186
}
187
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTX_dp(DisasContext *s, arg_VRINTX_dp *a)
188
return false;
189
}
190
191
+ if (!dc_isar_feature(aa32_fpdp, s)) {
192
+ return false;
193
+ }
194
+
195
if (!vfp_access_check(s)) {
196
return true;
197
}
198
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_sp(DisasContext *s, arg_VCVT_sp *a)
199
return false;
200
}
201
202
+ if (!dc_isar_feature(aa32_fpdp, s)) {
203
+ return false;
204
+ }
205
+
206
if (!vfp_access_check(s)) {
207
return true;
208
}
209
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_dp(DisasContext *s, arg_VCVT_dp *a)
210
return false;
211
}
212
213
+ if (!dc_isar_feature(aa32_fpdp, s)) {
214
+ return false;
215
+ }
216
+
217
if (!vfp_access_check(s)) {
218
return true;
219
}
220
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_int_dp(DisasContext *s, arg_VCVT_int_dp *a)
221
return false;
222
}
223
224
+ if (!dc_isar_feature(aa32_fpdp, s)) {
225
+ return false;
226
+ }
227
+
228
if (!vfp_access_check(s)) {
229
return true;
230
}
231
@@ -XXX,XX +XXX,XX @@ static bool trans_VJCVT(DisasContext *s, arg_VJCVT *a)
232
return false;
233
}
234
235
+ if (!dc_isar_feature(aa32_fpdp, s)) {
236
+ return false;
237
+ }
238
+
239
if (!vfp_access_check(s)) {
240
return true;
241
}
242
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_fix_dp(DisasContext *s, arg_VCVT_fix_dp *a)
243
return false;
244
}
245
246
+ if (!dc_isar_feature(aa32_fpdp, s)) {
247
+ return false;
248
+ }
249
+
250
if (!vfp_access_check(s)) {
251
return true;
252
}
253
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_dp_int(DisasContext *s, arg_VCVT_dp_int *a)
254
return false;
255
}
256
257
+ if (!dc_isar_feature(aa32_fpdp, s)) {
258
+ return false;
259
+ }
260
+
261
if (!vfp_access_check(s)) {
262
return true;
263
}
213
}
264
--
214
--
265
2.20.1
215
2.25.1
266
216
267
217
diff view generated by jsdifflib
1
Stop using cpu_F0s in the Neon VCVT fixed-point operations.
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Misaligned thumb PC is architecturally impossible.
4
Assert is better than proceeding, in case we've missed
5
something somewhere.
6
7
Expand a comment about aligning the pc in gdbstub.
8
Fail an incoming migrate if a thumb pc is misaligned.
9
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
Message-id: 20190613163917.28589-10-peter.maydell@linaro.org
7
---
13
---
8
target/arm/translate.c | 62 +++++++++++++++++++-----------------------
14
target/arm/gdbstub.c | 9 +++++++--
9
1 file changed, 28 insertions(+), 34 deletions(-)
15
target/arm/machine.c | 10 ++++++++++
16
target/arm/translate.c | 3 +++
17
3 files changed, 20 insertions(+), 2 deletions(-)
10
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
}
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
60
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
61
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
62
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
63
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static const char * const regnames[] =
64
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
16
/* Function prototypes for gen_ functions calling Neon helpers. */
65
uint32_t insn;
17
typedef void NeonGenThreeOpEnvFn(TCGv_i32, TCGv_env, TCGv_i32,
66
bool is_16bit;
18
TCGv_i32, TCGv_i32);
67
19
+/* Function prototypes for gen_ functions for fix point conversions */
68
+ /* Misaligned thumb PC is architecturally impossible. */
20
+typedef void VFPGenFixPointFn(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr);
69
+ assert((dc->base.pc_next & 1) == 0);
21
22
/* initialize TCG globals. */
23
void arm_translate_init(void)
24
@@ -XXX,XX +XXX,XX @@ static TCGv_ptr get_fpstatus_ptr(int neon)
25
return statusptr;
26
}
27
28
-#define VFP_GEN_FIX(name, round) \
29
-static inline void gen_vfp_##name(int dp, int shift, int neon) \
30
-{ \
31
- TCGv_i32 tmp_shift = tcg_const_i32(shift); \
32
- TCGv_ptr statusptr = get_fpstatus_ptr(neon); \
33
- if (dp) { \
34
- gen_helper_vfp_##name##d##round(cpu_F0d, cpu_F0d, tmp_shift, \
35
- statusptr); \
36
- } else { \
37
- gen_helper_vfp_##name##s##round(cpu_F0s, cpu_F0s, tmp_shift, \
38
- statusptr); \
39
- } \
40
- tcg_temp_free_i32(tmp_shift); \
41
- tcg_temp_free_ptr(statusptr); \
42
-}
43
-VFP_GEN_FIX(tosl, _round_to_zero)
44
-VFP_GEN_FIX(toul, _round_to_zero)
45
-VFP_GEN_FIX(slto, )
46
-VFP_GEN_FIX(ulto, )
47
-#undef VFP_GEN_FIX
48
-
49
static inline long vfp_reg_offset(bool dp, unsigned reg)
50
{
51
if (dp) {
52
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
53
}
54
} else if (op >= 14) {
55
/* VCVT fixed-point. */
56
+ TCGv_ptr fpst;
57
+ TCGv_i32 shiftv;
58
+ VFPGenFixPointFn *fn;
59
+
70
+
60
if (!(insn & (1 << 21)) || (q && ((rd | rm) & 1))) {
71
if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
61
return 1;
72
dc->base.pc_next = pc + 2;
62
}
73
return;
63
+
64
+ if (!(op & 1)) {
65
+ if (u) {
66
+ fn = gen_helper_vfp_ultos;
67
+ } else {
68
+ fn = gen_helper_vfp_sltos;
69
+ }
70
+ } else {
71
+ if (u) {
72
+ fn = gen_helper_vfp_touls_round_to_zero;
73
+ } else {
74
+ fn = gen_helper_vfp_tosls_round_to_zero;
75
+ }
76
+ }
77
+
78
/* We have already masked out the must-be-1 top bit of imm6,
79
* hence this 32-shift where the ARM ARM has 64-imm6.
80
*/
81
shift = 32 - shift;
82
+ fpst = get_fpstatus_ptr(1);
83
+ shiftv = tcg_const_i32(shift);
84
for (pass = 0; pass < (q ? 4 : 2); pass++) {
85
- tcg_gen_ld_f32(cpu_F0s, cpu_env, neon_reg_offset(rm, pass));
86
- if (!(op & 1)) {
87
- if (u)
88
- gen_vfp_ulto(0, shift, 1);
89
- else
90
- gen_vfp_slto(0, shift, 1);
91
- } else {
92
- if (u)
93
- gen_vfp_toul(0, shift, 1);
94
- else
95
- gen_vfp_tosl(0, shift, 1);
96
- }
97
- tcg_gen_st_f32(cpu_F0s, cpu_env, neon_reg_offset(rd, pass));
98
+ TCGv_i32 tmpf = neon_load_reg(rm, pass);
99
+ fn(tmpf, tmpf, shiftv, fpst);
100
+ neon_store_reg(rd, pass, tmpf);
101
}
102
+ tcg_temp_free_ptr(fpst);
103
+ tcg_temp_free_i32(shiftv);
104
} else {
105
return 1;
106
}
107
--
74
--
108
2.20.1
75
2.25.1
109
76
110
77
diff view generated by jsdifflib
1
Since Linux v3.17, the kernel's Image header includes a field image_size,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
which gives the total size of the kernel including unpopulated data
3
sections such as the BSS). If this is present, then return it from
4
load_aarch64_image() as the true size of the kernel rather than
5
just using the size of the Image file itself. This allows the code
6
which calculates where to put the initrd to avoid putting it in
7
the kernel's BSS area.
8
2
9
This means that we should be able to reliably load kernel images
3
Both single-step and pc alignment faults have priority over
10
which are larger than 128MB without accidentally putting the
4
breakpoint exceptions.
11
initrd or dtb in locations that clash with the kernel itself.
12
5
13
Fixes: https://bugs.launchpad.net/qemu/+bug/1823998
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
17
Tested-by: Mark Rutland <mark.rutland@arm.com>
18
Message-id: 20190516144733.32399-5-peter.maydell@linaro.org
19
---
9
---
20
hw/arm/boot.c | 17 +++++++++++++++--
10
target/arm/debug_helper.c | 23 +++++++++++++++++++++++
21
1 file changed, 15 insertions(+), 2 deletions(-)
11
1 file changed, 23 insertions(+)
22
12
23
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
13
diff --git a/target/arm/debug_helper.c b/target/arm/debug_helper.c
24
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/arm/boot.c
15
--- a/target/arm/debug_helper.c
26
+++ b/hw/arm/boot.c
16
+++ b/target/arm/debug_helper.c
27
@@ -XXX,XX +XXX,XX @@ static uint64_t load_aarch64_image(const char *filename, hwaddr mem_base,
17
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_breakpoint(CPUState *cs)
28
hwaddr *entry, AddressSpace *as)
29
{
18
{
30
hwaddr kernel_load_offset = KERNEL64_LOAD_ADDR;
19
ARMCPU *cpu = ARM_CPU(cs);
31
+ uint64_t kernel_size = 0;
20
CPUARMState *env = &cpu->env;
32
uint8_t *buffer;
21
+ target_ulong pc;
33
int size;
22
int n;
34
23
35
@@ -XXX,XX +XXX,XX @@ static uint64_t load_aarch64_image(const char *filename, hwaddr mem_base,
24
/*
36
* is only valid if the image_size is non-zero.
25
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_breakpoint(CPUState *cs)
37
*/
26
return false;
38
memcpy(&hdrvals, buffer + ARM64_TEXT_OFFSET_OFFSET, sizeof(hdrvals));
39
- if (hdrvals[1] != 0) {
40
+
41
+ kernel_size = le64_to_cpu(hdrvals[1]);
42
+
43
+ if (kernel_size != 0) {
44
kernel_load_offset = le64_to_cpu(hdrvals[0]);
45
46
/*
47
@@ -XXX,XX +XXX,XX @@ static uint64_t load_aarch64_image(const char *filename, hwaddr mem_base,
48
}
49
}
27
}
50
28
51
+ /*
29
+ /*
52
+ * Kernels before v3.17 don't populate the image_size field, and
30
+ * Single-step exceptions have priority over breakpoint exceptions.
53
+ * raw images have no header. For those our best guess at the size
31
+ * If single-step state is active-pending, suppress the bp.
54
+ * is the size of the Image file itself.
55
+ */
32
+ */
56
+ if (kernel_size == 0) {
33
+ if (arm_singlestep_active(env) && !(env->pstate & PSTATE_SS)) {
57
+ kernel_size = size;
34
+ return false;
58
+ }
35
+ }
59
+
36
+
60
*entry = mem_base + kernel_load_offset;
37
+ /*
61
rom_add_blob_fixed_as(filename, buffer, size, *entry, as);
38
+ * PC alignment faults have priority over breakpoint exceptions.
62
39
+ */
63
g_free(buffer);
40
+ pc = is_a64(env) ? env->pc : env->regs[15];
64
41
+ if ((is_a64(env) || !env->thumb) && (pc & 3) != 0) {
65
- return size;
42
+ return false;
66
+ return kernel_size;
43
+ }
67
}
44
+
68
45
+ /*
69
static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
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;
70
--
54
--
71
2.20.1
55
2.25.1
72
56
73
57
diff view generated by jsdifflib
1
Allow the DSP extension to be disabled via a CPU property for
1
From: Richard Henderson <richard.henderson@linaro.org>
2
M-profile CPUs. (A and R-profile CPUs don't have this extension
3
as a defined separate optional architecture extension, so
4
they don't need the property.)
5
2
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20190517174046.11146-3-peter.maydell@linaro.org
10
---
6
---
11
target/arm/cpu.h | 2 ++
7
tests/tcg/aarch64/pcalign-a64.c | 37 +++++++++++++++++++++++++
12
target/arm/cpu.c | 29 +++++++++++++++++++++++++++++
8
tests/tcg/arm/pcalign-a32.c | 46 +++++++++++++++++++++++++++++++
13
2 files changed, 31 insertions(+)
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
14
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
diff --git a/tests/tcg/aarch64/pcalign-a64.c b/tests/tcg/aarch64/pcalign-a64.c
16
index XXXXXXX..XXXXXXX 100644
16
new file mode 100644
17
--- a/target/arm/cpu.h
17
index XXXXXXX..XXXXXXX
18
+++ b/target/arm/cpu.h
18
--- /dev/null
19
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
19
+++ b/tests/tcg/aarch64/pcalign-a64.c
20
bool has_vfp;
20
@@ -XXX,XX +XXX,XX @@
21
/* CPU has Neon */
21
+/* Test PC misalignment exception */
22
bool has_neon;
23
+ /* CPU has M-profile DSP extension */
24
+ bool has_dsp;
25
26
/* CPU has memory protection unit */
27
bool has_mpu;
28
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/cpu.c
31
+++ b/target/arm/cpu.c
32
@@ -XXX,XX +XXX,XX @@ static Property arm_cpu_has_vfp_property =
33
static Property arm_cpu_has_neon_property =
34
DEFINE_PROP_BOOL("neon", ARMCPU, has_neon, true);
35
36
+static Property arm_cpu_has_dsp_property =
37
+ DEFINE_PROP_BOOL("dsp", ARMCPU, has_dsp, true);
38
+
22
+
39
static Property arm_cpu_has_mpu_property =
23
+#include <assert.h>
40
DEFINE_PROP_BOOL("has-mpu", ARMCPU, has_mpu, true);
24
+#include <signal.h>
41
25
+#include <stdlib.h>
42
@@ -XXX,XX +XXX,XX @@ void arm_cpu_post_init(Object *obj)
26
+#include <stdio.h>
43
}
27
+
44
}
28
+static void *expected;
45
29
+
46
+ if (arm_feature(&cpu->env, ARM_FEATURE_M) &&
30
+static void sigbus(int sig, siginfo_t *info, void *vuc)
47
+ arm_feature(&cpu->env, ARM_FEATURE_THUMB_DSP)) {
31
+{
48
+ qdev_property_add_static(DEVICE(obj), &arm_cpu_has_dsp_property,
32
+ assert(info->si_code == BUS_ADRALN);
49
+ &error_abort);
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;
50
+ }
49
+ }
51
+
50
+
52
if (arm_feature(&cpu->env, ARM_FEATURE_PMSA)) {
51
+ asm volatile("adr %0, 1f + 1\n\t"
53
qdev_property_add_static(DEVICE(obj), &arm_cpu_has_mpu_property,
52
+ "str %0, %1\n\t"
54
&error_abort);
53
+ "br %0\n"
55
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
54
+ "1:"
56
cpu->isar.mvfr0 = u;
55
+ : "=&r"(tmp), "=m"(expected));
57
}
56
+ abort();
58
57
+}
59
+ if (arm_feature(env, ARM_FEATURE_M) && !cpu->has_dsp) {
58
diff --git a/tests/tcg/arm/pcalign-a32.c b/tests/tcg/arm/pcalign-a32.c
60
+ uint32_t u;
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 */
61
+
65
+
62
+ unset_feature(env, ARM_FEATURE_THUMB_DSP);
66
+#ifdef __thumb__
67
+#error "This test must be compiled for ARM"
68
+#endif
63
+
69
+
64
+ u = cpu->isar.id_isar1;
70
+#include <assert.h>
65
+ u = FIELD_DP32(u, ID_ISAR1, EXTEND, 1);
71
+#include <signal.h>
66
+ cpu->isar.id_isar1 = u;
72
+#include <stdlib.h>
73
+#include <stdio.h>
67
+
74
+
68
+ u = cpu->isar.id_isar2;
75
+static void *expected;
69
+ u = FIELD_DP32(u, ID_ISAR2, MULTU, 1);
70
+ u = FIELD_DP32(u, ID_ISAR2, MULTS, 1);
71
+ cpu->isar.id_isar2 = u;
72
+
76
+
73
+ u = cpu->isar.id_isar3;
77
+static void sigbus(int sig, siginfo_t *info, void *vuc)
74
+ u = FIELD_DP32(u, ID_ISAR3, SIMD, 1);
78
+{
75
+ u = FIELD_DP32(u, ID_ISAR3, SATURATE, 0);
79
+ assert(info->si_code == BUS_ADRALN);
76
+ cpu->isar.id_isar3 = u;
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;
77
+ }
96
+ }
78
+
97
+
79
/* Some features automatically imply others: */
98
+ asm volatile("adr %0, 1f + 2\n\t"
80
if (arm_feature(env, ARM_FEATURE_V8)) {
99
+ "str %0, %1\n\t"
81
if (arm_feature(env, ARM_FEATURE_M)) {
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
82
--
140
--
83
2.20.1
141
2.25.1
84
142
85
143
diff view generated by jsdifflib
1
Stop using cpu_F0s for the Neon f32/s32 VCVT operations.
1
In the SSE decode function gen_sse(), we combine a byte
2
Since this is the last user of cpu_F0s in the Neon 2rm-op
2
'b' and a value 'b1' which can be [0..3], and switch on them:
3
loop, we can remove the handling code for it too.
3
b |= (b1 << 8);
4
switch (b) {
5
...
6
default:
7
unknown_op:
8
gen_unknown_opcode(env, s);
9
return;
10
}
4
11
12
In three cases inside this switch, we were then also checking for
13
"if (b1 >= 2) { goto unknown_op; }".
14
However, this can never happen, because the 'case' values in each place
15
are 0x0nn or 0x1nn and the switch will have directed the b1 == (2, 3)
16
cases to the default already.
17
18
This check was added in commit c045af25a52e9 in 2010; the added code
19
was unnecessary then as well, and was apparently intended only to
20
ensure that we never accidentally ended up indexing off the end
21
of an sse_op_table with only 2 entries as a result of future bugs
22
in the decode logic.
23
24
Change the checks to assert() instead, and make sure they're always
25
immediately before the array access they are protecting.
26
27
Fixes: Coverity CID 1460207
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Message-id: 20190613163917.28589-9-peter.maydell@linaro.org
9
---
30
---
10
target/arm/translate.c | 82 ++++++++++++------------------------------
31
target/i386/tcg/translate.c | 12 +++---------
11
1 file changed, 22 insertions(+), 60 deletions(-)
32
1 file changed, 3 insertions(+), 9 deletions(-)
12
33
13
diff --git a/target/arm/translate.c b/target/arm/translate.c
34
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
14
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate.c
36
--- a/target/i386/tcg/translate.c
16
+++ b/target/arm/translate.c
37
+++ b/target/i386/tcg/translate.c
17
@@ -XXX,XX +XXX,XX @@ static TCGv_ptr get_fpstatus_ptr(int neon)
38
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
18
return statusptr;
39
case 0x171: /* shift xmm, im */
19
}
40
case 0x172:
20
41
case 0x173:
21
-#define VFP_GEN_ITOF(name) \
42
- if (b1 >= 2) {
22
-static inline void gen_vfp_##name(int dp, int neon) \
43
- goto unknown_op;
23
-{ \
44
- }
24
- TCGv_ptr statusptr = get_fpstatus_ptr(neon); \
45
val = x86_ldub_code(env, s);
25
- if (dp) { \
46
if (is_xmm) {
26
- gen_helper_vfp_##name##d(cpu_F0d, cpu_F0s, statusptr); \
47
tcg_gen_movi_tl(s->T0, val);
27
- } else { \
48
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
28
- gen_helper_vfp_##name##s(cpu_F0s, cpu_F0s, statusptr); \
49
offsetof(CPUX86State, mmx_t0.MMX_L(1)));
29
- } \
50
op1_offset = offsetof(CPUX86State,mmx_t0);
30
- tcg_temp_free_ptr(statusptr); \
51
}
31
-}
52
+ assert(b1 < 2);
32
-
53
sse_fn_epp = sse_op_table2[((b - 1) & 3) * 8 +
33
-VFP_GEN_ITOF(uito)
54
(((modrm >> 3)) & 7)][b1];
34
-VFP_GEN_ITOF(sito)
55
if (!sse_fn_epp) {
35
-#undef VFP_GEN_ITOF
56
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
36
-
57
rm = modrm & 7;
37
-#define VFP_GEN_FTOI(name) \
58
reg = ((modrm >> 3) & 7) | REX_R(s);
38
-static inline void gen_vfp_##name(int dp, int neon) \
59
mod = (modrm >> 6) & 3;
39
-{ \
60
- if (b1 >= 2) {
40
- TCGv_ptr statusptr = get_fpstatus_ptr(neon); \
61
- goto unknown_op;
41
- if (dp) { \
62
- }
42
- gen_helper_vfp_##name##d(cpu_F0s, cpu_F0d, statusptr); \
63
43
- } else { \
64
+ assert(b1 < 2);
44
- gen_helper_vfp_##name##s(cpu_F0s, cpu_F0s, statusptr); \
65
sse_fn_epp = sse_op_table6[b].op[b1];
45
- } \
66
if (!sse_fn_epp) {
46
- tcg_temp_free_ptr(statusptr); \
67
goto unknown_op;
47
-}
68
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
48
-
69
rm = modrm & 7;
49
-VFP_GEN_FTOI(touiz)
70
reg = ((modrm >> 3) & 7) | REX_R(s);
50
-VFP_GEN_FTOI(tosiz)
71
mod = (modrm >> 6) & 3;
51
-#undef VFP_GEN_FTOI
72
- if (b1 >= 2) {
52
-
73
- goto unknown_op;
53
#define VFP_GEN_FIX(name, round) \
74
- }
54
static inline void gen_vfp_##name(int dp, int shift, int neon) \
75
55
{ \
76
+ assert(b1 < 2);
56
@@ -XXX,XX +XXX,XX @@ static const uint8_t neon_3r_sizes[] = {
77
sse_fn_eppi = sse_op_table7[b].op[b1];
57
#define NEON_2RM_VCVT_SF 62
78
if (!sse_fn_eppi) {
58
#define NEON_2RM_VCVT_UF 63
79
goto unknown_op;
59
60
-static int neon_2rm_is_float_op(int op)
61
-{
62
- /*
63
- * Return true if this neon 2reg-misc op is float-to-float.
64
- * This is not a property of the operation but of our code --
65
- * what we are asking here is "does the code for this case in
66
- * the Neon for-each-pass loop use cpu_F0s?".
67
- */
68
- return op >= NEON_2RM_VCVT_FS;
69
-}
70
-
71
static bool neon_2rm_is_v8_op(int op)
72
{
73
/* Return true if this neon 2reg-misc op is ARMv8 and up */
74
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
75
default:
76
elementwise:
77
for (pass = 0; pass < (q ? 4 : 2); pass++) {
78
- if (neon_2rm_is_float_op(op)) {
79
- tcg_gen_ld_f32(cpu_F0s, cpu_env,
80
- neon_reg_offset(rm, pass));
81
- tmp = NULL;
82
- } else {
83
- tmp = neon_load_reg(rm, pass);
84
- }
85
+ tmp = neon_load_reg(rm, pass);
86
switch (op) {
87
case NEON_2RM_VREV32:
88
switch (size) {
89
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
90
break;
91
}
92
case NEON_2RM_VCVT_FS: /* VCVT.F32.S32 */
93
- gen_vfp_sito(0, 1);
94
+ {
95
+ TCGv_ptr fpstatus = get_fpstatus_ptr(1);
96
+ gen_helper_vfp_sitos(tmp, tmp, fpstatus);
97
+ tcg_temp_free_ptr(fpstatus);
98
break;
99
+ }
100
case NEON_2RM_VCVT_FU: /* VCVT.F32.U32 */
101
- gen_vfp_uito(0, 1);
102
+ {
103
+ TCGv_ptr fpstatus = get_fpstatus_ptr(1);
104
+ gen_helper_vfp_uitos(tmp, tmp, fpstatus);
105
+ tcg_temp_free_ptr(fpstatus);
106
break;
107
+ }
108
case NEON_2RM_VCVT_SF: /* VCVT.S32.F32 */
109
- gen_vfp_tosiz(0, 1);
110
+ {
111
+ TCGv_ptr fpstatus = get_fpstatus_ptr(1);
112
+ gen_helper_vfp_tosizs(tmp, tmp, fpstatus);
113
+ tcg_temp_free_ptr(fpstatus);
114
break;
115
+ }
116
case NEON_2RM_VCVT_UF: /* VCVT.U32.F32 */
117
- gen_vfp_touiz(0, 1);
118
+ {
119
+ TCGv_ptr fpstatus = get_fpstatus_ptr(1);
120
+ gen_helper_vfp_touizs(tmp, tmp, fpstatus);
121
+ tcg_temp_free_ptr(fpstatus);
122
break;
123
+ }
124
default:
125
/* Reserved op values were caught by the
126
* neon_2rm_sizes[] check earlier.
127
*/
128
abort();
129
}
130
- if (neon_2rm_is_float_op(op)) {
131
- tcg_gen_st_f32(cpu_F0s, cpu_env,
132
- neon_reg_offset(rd, pass));
133
- } else {
134
- neon_store_reg(rd, pass, tmp);
135
- }
136
+ neon_store_reg(rd, pass, tmp);
137
}
138
break;
139
}
140
--
80
--
141
2.20.1
81
2.25.1
142
82
143
83
diff view generated by jsdifflib
1
The SSE-200 hardware has configurable integration settings which
1
The qemu-common.h header is not supposed to be included from any
2
determine whether its two CPUs have the FPU and DSP:
2
other header files, only from .c files (as documented in a comment at
3
* CPU0_FPU (default 0)
3
the start of it).
4
* CPU0_DSP (default 0)
5
* CPU1_FPU (default 1)
6
* CPU1_DSP (default 1)
7
4
8
Similarly, the IoTKit has settings for its single CPU:
5
include/hw/i386/x86.h and include/hw/i386/microvm.h break this rule.
9
* CPU0_FPU (default 1)
6
In fact, the include is not required at all, so we can just drop it
10
* CPU0_DSP (default 1)
7
from both files.
11
12
Of our four boards that use either the IoTKit or the SSE-200:
13
* mps2-an505, mps2-an521 and musca-a use the default settings
14
* musca-b1 enables FPU and DSP on both CPUs
15
16
Currently QEMU models all these boards using CPUs with
17
both FPU and DSP enabled. This means that we are incorrect
18
for mps2-an521 and musca-a, which should not have FPU or DSP
19
on CPU0.
20
21
Create QOM properties on the ARMSSE devices corresponding to the
22
default h/w integration settings, and make the Musca-B1 board
23
enable FPU and DSP on both CPUs. This fixes the mps2-an521
24
and musca-a behaviour, and leaves the musca-b1 and mps2-an505
25
behaviour unchanged.
26
8
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
29
Message-id: 20190517174046.11146-5-peter.maydell@linaro.org
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20211129200510.1233037-2-peter.maydell@linaro.org
30
---
13
---
31
include/hw/arm/armsse.h | 7 +++++
14
include/hw/i386/microvm.h | 1 -
32
hw/arm/armsse.c | 58 ++++++++++++++++++++++++++++++++---------
15
include/hw/i386/x86.h | 1 -
33
hw/arm/musca.c | 8 ++++++
16
2 files changed, 2 deletions(-)
34
3 files changed, 61 insertions(+), 12 deletions(-)
35
17
36
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
18
diff --git a/include/hw/i386/microvm.h b/include/hw/i386/microvm.h
37
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
38
--- a/include/hw/arm/armsse.h
20
--- a/include/hw/i386/microvm.h
39
+++ b/include/hw/arm/armsse.h
21
+++ b/include/hw/i386/microvm.h
40
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
41
* address of each SRAM bank (and thus the total amount of internal SRAM)
23
#ifndef HW_I386_MICROVM_H
42
* + QOM property "init-svtor" sets the initial value of the CPU SVTOR register
24
#define HW_I386_MICROVM_H
43
* (where it expects to load the PC and SP from the vector table on reset)
25
44
+ * + QOM properties "CPU0_FPU", "CPU0_DSP", "CPU1_FPU" and "CPU1_DSP" which
26
-#include "qemu-common.h"
45
+ * set whether the CPUs have the FPU and DSP features present. The default
27
#include "exec/hwaddr.h"
46
+ * (matching the hardware) is that for CPU0 in an IoTKit and CPU1 in an
28
#include "qemu/notify.h"
47
+ * SSE-200 both are present; CPU0 in an SSE-200 has neither.
29
48
+ * Since the IoTKit has only one CPU, it does not have the CPU1_* properties.
30
diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
49
* + Named GPIO inputs "EXP_IRQ" 0..n are the expansion interrupts for CPU 0,
50
* which are wired to its NVIC lines 32 .. n+32
51
* + Named GPIO inputs "EXP_CPU1_IRQ" 0..n are the expansion interrupts for
52
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
53
uint32_t mainclk_frq;
54
uint32_t sram_addr_width;
55
uint32_t init_svtor;
56
+ bool cpu_fpu[SSE_MAX_CPUS];
57
+ bool cpu_dsp[SSE_MAX_CPUS];
58
} ARMSSE;
59
60
typedef struct ARMSSEInfo ARMSSEInfo;
61
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
62
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
63
--- a/hw/arm/armsse.c
32
--- a/include/hw/i386/x86.h
64
+++ b/hw/arm/armsse.c
33
+++ b/include/hw/i386/x86.h
65
@@ -XXX,XX +XXX,XX @@ struct ARMSSEInfo {
34
@@ -XXX,XX +XXX,XX @@
66
bool has_cachectrl;
35
#ifndef HW_I386_X86_H
67
bool has_cpusecctrl;
36
#define HW_I386_X86_H
68
bool has_cpuid;
37
69
+ Property *props;
38
-#include "qemu-common.h"
70
+};
39
#include "exec/hwaddr.h"
71
+
40
#include "qemu/notify.h"
72
+static Property iotkit_properties[] = {
73
+ DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
74
+ MemoryRegion *),
75
+ DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
76
+ DEFINE_PROP_UINT32("MAINCLK", ARMSSE, mainclk_frq, 0),
77
+ DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
78
+ DEFINE_PROP_UINT32("init-svtor", ARMSSE, init_svtor, 0x10000000),
79
+ DEFINE_PROP_BOOL("CPU0_FPU", ARMSSE, cpu_fpu[0], true),
80
+ DEFINE_PROP_BOOL("CPU0_DSP", ARMSSE, cpu_dsp[0], true),
81
+ DEFINE_PROP_END_OF_LIST()
82
+};
83
+
84
+static Property armsse_properties[] = {
85
+ DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
86
+ MemoryRegion *),
87
+ DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
88
+ DEFINE_PROP_UINT32("MAINCLK", ARMSSE, mainclk_frq, 0),
89
+ DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
90
+ DEFINE_PROP_UINT32("init-svtor", ARMSSE, init_svtor, 0x10000000),
91
+ DEFINE_PROP_BOOL("CPU0_FPU", ARMSSE, cpu_fpu[0], false),
92
+ DEFINE_PROP_BOOL("CPU0_DSP", ARMSSE, cpu_dsp[0], false),
93
+ DEFINE_PROP_BOOL("CPU1_FPU", ARMSSE, cpu_fpu[1], true),
94
+ DEFINE_PROP_BOOL("CPU1_DSP", ARMSSE, cpu_dsp[1], true),
95
+ DEFINE_PROP_END_OF_LIST()
96
};
97
98
static const ARMSSEInfo armsse_variants[] = {
99
@@ -XXX,XX +XXX,XX @@ static const ARMSSEInfo armsse_variants[] = {
100
.has_cachectrl = false,
101
.has_cpusecctrl = false,
102
.has_cpuid = false,
103
+ .props = iotkit_properties,
104
},
105
{
106
.name = TYPE_SSE200,
107
@@ -XXX,XX +XXX,XX @@ static const ARMSSEInfo armsse_variants[] = {
108
.has_cachectrl = true,
109
.has_cpusecctrl = true,
110
.has_cpuid = true,
111
+ .props = armsse_properties,
112
},
113
};
114
115
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
116
return;
117
}
118
}
119
+ if (!s->cpu_fpu[i]) {
120
+ object_property_set_bool(cpuobj, false, "vfp", &err);
121
+ if (err) {
122
+ error_propagate(errp, err);
123
+ return;
124
+ }
125
+ }
126
+ if (!s->cpu_dsp[i]) {
127
+ object_property_set_bool(cpuobj, false, "dsp", &err);
128
+ if (err) {
129
+ error_propagate(errp, err);
130
+ return;
131
+ }
132
+ }
133
134
if (i > 0) {
135
memory_region_add_subregion_overlap(&s->cpu_container[i], 0,
136
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription armsse_vmstate = {
137
}
138
};
139
140
-static Property armsse_properties[] = {
141
- DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
142
- MemoryRegion *),
143
- DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
144
- DEFINE_PROP_UINT32("MAINCLK", ARMSSE, mainclk_frq, 0),
145
- DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
146
- DEFINE_PROP_UINT32("init-svtor", ARMSSE, init_svtor, 0x10000000),
147
- DEFINE_PROP_END_OF_LIST()
148
-};
149
-
150
static void armsse_reset(DeviceState *dev)
151
{
152
ARMSSE *s = ARMSSE(dev);
153
@@ -XXX,XX +XXX,XX @@ static void armsse_class_init(ObjectClass *klass, void *data)
154
DeviceClass *dc = DEVICE_CLASS(klass);
155
IDAUInterfaceClass *iic = IDAU_INTERFACE_CLASS(klass);
156
ARMSSEClass *asc = ARMSSE_CLASS(klass);
157
+ const ARMSSEInfo *info = data;
158
159
dc->realize = armsse_realize;
160
dc->vmsd = &armsse_vmstate;
161
- dc->props = armsse_properties;
162
+ dc->props = info->props;
163
dc->reset = armsse_reset;
164
iic->check = armsse_idau_check;
165
- asc->info = data;
166
+ asc->info = info;
167
}
168
169
static const TypeInfo armsse_info = {
170
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
171
index XXXXXXX..XXXXXXX 100644
172
--- a/hw/arm/musca.c
173
+++ b/hw/arm/musca.c
174
@@ -XXX,XX +XXX,XX @@ static void musca_init(MachineState *machine)
175
qdev_prop_set_uint32(ssedev, "init-svtor", mmc->init_svtor);
176
qdev_prop_set_uint32(ssedev, "SRAM_ADDR_WIDTH", mmc->sram_addr_width);
177
qdev_prop_set_uint32(ssedev, "MAINCLK", SYSCLK_FRQ);
178
+ /*
179
+ * Musca-A takes the default SSE-200 FPU/DSP settings (ie no for
180
+ * CPU0 and yes for CPU1); Musca-B1 explicitly enables them for CPU0.
181
+ */
182
+ if (mmc->type == MUSCA_B1) {
183
+ qdev_prop_set_bit(ssedev, "CPU0_FPU", true);
184
+ qdev_prop_set_bit(ssedev, "CPU0_DSP", true);
185
+ }
186
object_property_set_bool(OBJECT(&mms->sse), true, "realized",
187
&error_fatal);
188
41
189
--
42
--
190
2.20.1
43
2.25.1
191
44
192
45
diff view generated by jsdifflib
1
Switch NEON_2RM_VRINT* away from using cpu_F0s.
1
The qemu-common.h header is not supposed to be included from any
2
other header files, only from .c files (as documented in a comment at
3
the start of it).
4
5
Move the include to linux-user/hexagon/cpu_loop.c, which needs it for
6
the declaration of cpu_exec_step_atomic().
2
7
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20190613163917.28589-6-peter.maydell@linaro.org
11
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
12
Message-id: 20211129200510.1233037-3-peter.maydell@linaro.org
7
---
13
---
8
target/arm/translate.c | 8 +++-----
14
target/hexagon/cpu.h | 1 -
9
1 file changed, 3 insertions(+), 5 deletions(-)
15
linux-user/hexagon/cpu_loop.c | 1 +
16
2 files changed, 1 insertion(+), 1 deletion(-)
10
17
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
18
diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h
12
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
20
--- a/target/hexagon/cpu.h
14
+++ b/target/arm/translate.c
21
+++ b/target/hexagon/cpu.h
15
@@ -XXX,XX +XXX,XX @@ static int neon_2rm_is_float_op(int op)
22
@@ -XXX,XX +XXX,XX @@ typedef struct CPUHexagonState CPUHexagonState;
16
* what we are asking here is "does the code for this case in
23
17
* the Neon for-each-pass loop use cpu_F0s?".
24
#include "fpu/softfloat-types.h"
18
*/
25
19
- return ((op >= NEON_2RM_VRINTN && op <= NEON_2RM_VRINTZ) ||
26
-#include "qemu-common.h"
20
- op == NEON_2RM_VRINTM ||
27
#include "exec/cpu-defs.h"
21
- (op >= NEON_2RM_VRINTP && op <= NEON_2RM_VCVTMS) ||
28
#include "hex_regs.h"
22
+ return ((op >= NEON_2RM_VCVTAU && op <= NEON_2RM_VCVTMS) ||
29
#include "mmvec/mmvec.h"
23
op >= NEON_2RM_VRECPE_F);
30
diff --git a/linux-user/hexagon/cpu_loop.c b/linux-user/hexagon/cpu_loop.c
24
}
31
index XXXXXXX..XXXXXXX 100644
25
32
--- a/linux-user/hexagon/cpu_loop.c
26
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
33
+++ b/linux-user/hexagon/cpu_loop.c
27
tcg_rmode = tcg_const_i32(arm_rmode_to_sf(rmode));
34
@@ -XXX,XX +XXX,XX @@
28
gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode,
35
*/
29
cpu_env);
36
30
- gen_helper_rints(cpu_F0s, cpu_F0s, fpstatus);
37
#include "qemu/osdep.h"
31
+ gen_helper_rints(tmp, tmp, fpstatus);
38
+#include "qemu-common.h"
32
gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode,
39
#include "qemu.h"
33
cpu_env);
40
#include "user-internals.h"
34
tcg_temp_free_ptr(fpstatus);
41
#include "cpu_loop-common.h"
35
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
36
case NEON_2RM_VRINTX:
37
{
38
TCGv_ptr fpstatus = get_fpstatus_ptr(1);
39
- gen_helper_rints_exact(cpu_F0s, cpu_F0s, fpstatus);
40
+ gen_helper_rints_exact(tmp, tmp, fpstatus);
41
tcg_temp_free_ptr(fpstatus);
42
break;
43
}
44
--
42
--
45
2.20.1
43
2.25.1
46
44
47
45
diff view generated by jsdifflib
1
Stop using cpu_F0s for the NEON_2RM_VCVT[ANPM][US] ops.
1
The qemu-common.h header is not supposed to be included from any
2
other header files, only from .c files (as documented in a comment at
3
the start of it).
4
5
Nothing actually relies on target/rx/cpu.h including it, so we can
6
just drop the include.
2
7
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20190613163917.28589-7-peter.maydell@linaro.org
11
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
12
Reviewed-by: Yoshinori Sato <ysato@users.sourceforge.jp>
13
Message-id: 20211129200510.1233037-4-peter.maydell@linaro.org
7
---
14
---
8
target/arm/translate.c | 7 +++----
15
target/rx/cpu.h | 1 -
9
1 file changed, 3 insertions(+), 4 deletions(-)
16
1 file changed, 1 deletion(-)
10
17
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
18
diff --git a/target/rx/cpu.h b/target/rx/cpu.h
12
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
20
--- a/target/rx/cpu.h
14
+++ b/target/arm/translate.c
21
+++ b/target/rx/cpu.h
15
@@ -XXX,XX +XXX,XX @@ static int neon_2rm_is_float_op(int op)
22
@@ -XXX,XX +XXX,XX @@
16
* what we are asking here is "does the code for this case in
23
#define RX_CPU_H
17
* the Neon for-each-pass loop use cpu_F0s?".
24
18
*/
25
#include "qemu/bitops.h"
19
- return ((op >= NEON_2RM_VCVTAU && op <= NEON_2RM_VCVTMS) ||
26
-#include "qemu-common.h"
20
- op >= NEON_2RM_VRECPE_F);
27
#include "hw/registerfields.h"
21
+ return op >= NEON_2RM_VRECPE_F;
28
#include "cpu-qom.h"
22
}
23
24
static bool neon_2rm_is_v8_op(int op)
25
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
26
cpu_env);
27
28
if (is_signed) {
29
- gen_helper_vfp_tosls(cpu_F0s, cpu_F0s,
30
+ gen_helper_vfp_tosls(tmp, tmp,
31
tcg_shift, fpst);
32
} else {
33
- gen_helper_vfp_touls(cpu_F0s, cpu_F0s,
34
+ gen_helper_vfp_touls(tmp, tmp,
35
tcg_shift, fpst);
36
}
37
29
38
--
30
--
39
2.20.1
31
2.25.1
40
32
41
33
diff view generated by jsdifflib
1
In the Arm kernel/initrd loading code, in some places we make the
1
A lot of C files in hw/arm include qemu-common.h when they don't
2
incorrect assumption that info->ram_size can be treated as the
2
need anything from it. Drop the include lines.
3
address of the end of RAM, as for instance when we calculate the
4
available space for the initrd using "info->ram_size - info->initrd_start".
5
This is wrong, because many Arm boards (including "virt") specify
6
a non-zero info->loader_start to indicate that their RAM area
7
starts at a non-zero physical address.
8
3
9
Correct the places which make this incorrect assumption.
4
omap1.c, pxa2xx.c and strongarm.c retain the include because they
5
use it for the prototype of qemu_get_timedate().
10
6
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Tested-by: Mark Rutland <mark.rutland@arm.com>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20190516144733.32399-2-peter.maydell@linaro.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
15
---
13
---
16
hw/arm/boot.c | 9 ++++-----
14
hw/arm/boot.c | 1 -
17
1 file changed, 4 insertions(+), 5 deletions(-)
15
hw/arm/digic_boards.c | 1 -
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(-)
18
23
19
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
24
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
20
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/boot.c
26
--- a/hw/arm/boot.c
22
+++ b/hw/arm/boot.c
27
+++ b/hw/arm/boot.c
23
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
28
@@ -XXX,XX +XXX,XX @@
24
int elf_machine;
29
*/
25
hwaddr entry;
30
26
static const ARMInsnFixup *primary_loader;
31
#include "qemu/osdep.h"
27
+ uint64_t ram_end = info->loader_start + info->ram_size;
32
-#include "qemu-common.h"
28
33
#include "qemu/datadir.h"
29
if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
34
#include "qemu/error-report.h"
30
primary_loader = bootloader_aarch64;
35
#include "qapi/error.h"
31
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
36
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
32
/* 32-bit ARM */
37
index XXXXXXX..XXXXXXX 100644
33
entry = info->loader_start + KERNEL_LOAD_ADDR;
38
--- a/hw/arm/digic_boards.c
34
kernel_size = load_image_targphys_as(info->kernel_filename, entry,
39
+++ b/hw/arm/digic_boards.c
35
- info->ram_size - KERNEL_LOAD_ADDR,
40
@@ -XXX,XX +XXX,XX @@
36
- as);
41
37
+ ram_end - KERNEL_LOAD_ADDR, as);
42
#include "qemu/osdep.h"
38
is_linux = 1;
43
#include "qapi/error.h"
39
}
44
-#include "qemu-common.h"
40
if (kernel_size < 0) {
45
#include "qemu/datadir.h"
41
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
46
#include "hw/boards.h"
42
if (info->initrd_filename) {
47
#include "qemu/error-report.h"
43
initrd_size = load_ramdisk_as(info->initrd_filename,
48
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
44
info->initrd_start,
49
index XXXXXXX..XXXXXXX 100644
45
- info->ram_size - info->initrd_start,
50
--- a/hw/arm/highbank.c
46
- as);
51
+++ b/hw/arm/highbank.c
47
+ ram_end - info->initrd_start, as);
52
@@ -XXX,XX +XXX,XX @@
48
if (initrd_size < 0) {
53
*/
49
initrd_size = load_image_targphys_as(info->initrd_filename,
54
50
info->initrd_start,
55
#include "qemu/osdep.h"
51
- info->ram_size -
56
-#include "qemu-common.h"
52
+ ram_end -
57
#include "qemu/datadir.h"
53
info->initrd_start,
58
#include "qapi/error.h"
54
as);
59
#include "hw/sysbus.h"
55
}
60
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/hw/arm/npcm7xx_boards.c
63
+++ b/hw/arm/npcm7xx_boards.c
64
@@ -XXX,XX +XXX,XX @@
65
#include "hw/qdev-core.h"
66
#include "hw/qdev-properties.h"
67
#include "qapi/error.h"
68
-#include "qemu-common.h"
69
#include "qemu/datadir.h"
70
#include "qemu/units.h"
71
#include "sysemu/blockdev.h"
72
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/arm/sbsa-ref.c
75
+++ b/hw/arm/sbsa-ref.c
76
@@ -XXX,XX +XXX,XX @@
77
*/
78
79
#include "qemu/osdep.h"
80
-#include "qemu-common.h"
81
#include "qemu/datadir.h"
82
#include "qapi/error.h"
83
#include "qemu/error-report.h"
84
diff --git a/hw/arm/stm32f405_soc.c b/hw/arm/stm32f405_soc.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/hw/arm/stm32f405_soc.c
87
+++ b/hw/arm/stm32f405_soc.c
88
@@ -XXX,XX +XXX,XX @@
89
90
#include "qemu/osdep.h"
91
#include "qapi/error.h"
92
-#include "qemu-common.h"
93
#include "exec/address-spaces.h"
94
#include "sysemu/sysemu.h"
95
#include "hw/arm/stm32f405_soc.h"
96
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
97
index XXXXXXX..XXXXXXX 100644
98
--- a/hw/arm/vexpress.c
99
+++ b/hw/arm/vexpress.c
100
@@ -XXX,XX +XXX,XX @@
101
102
#include "qemu/osdep.h"
103
#include "qapi/error.h"
104
-#include "qemu-common.h"
105
#include "qemu/datadir.h"
106
#include "cpu.h"
107
#include "hw/sysbus.h"
108
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
109
index XXXXXXX..XXXXXXX 100644
110
--- a/hw/arm/virt.c
111
+++ b/hw/arm/virt.c
112
@@ -XXX,XX +XXX,XX @@
113
*/
114
115
#include "qemu/osdep.h"
116
-#include "qemu-common.h"
117
#include "qemu/datadir.h"
118
#include "qemu/units.h"
119
#include "qemu/option.h"
56
--
120
--
57
2.20.1
121
2.25.1
58
122
59
123
diff view generated by jsdifflib
1
Stop using cpu_F0s for NEON_2RM_VRECPE_F and NEON_2RM_VRSQRTE_F.
1
The calculation of the length of TLB range invalidate operations
2
in tlbi_aa64_range_get_length() is incorrect in two ways:
3
* the NUM field is 5 bits, but we read only 4 bits
4
* we miscalculate the page_shift value, because of an
5
off-by-one error:
6
TG 0b00 is invalid
7
TG 0b01 is 4K granule size == 4096 == 2^12
8
TG 0b10 is 16K granule size == 16384 == 2^14
9
TG 0b11 is 64K granule size == 65536 == 2^16
10
so page_shift should be (TG - 1) * 2 + 12
2
11
12
Thanks to the bug report submitter Cha HyunSoo for identifying
13
both these errors.
14
15
Fixes: 84940ed82552d3c ("target/arm: Add support for FEAT_TLBIRANGE")
16
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/734
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
19
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Message-id: 20190613163917.28589-8-peter.maydell@linaro.org
20
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Message-id: 20211130173257.1274194-1-peter.maydell@linaro.org
7
---
22
---
8
target/arm/translate.c | 6 +++---
23
target/arm/helper.c | 6 +++---
9
1 file changed, 3 insertions(+), 3 deletions(-)
24
1 file changed, 3 insertions(+), 3 deletions(-)
10
25
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
26
diff --git a/target/arm/helper.c b/target/arm/helper.c
12
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
28
--- a/target/arm/helper.c
14
+++ b/target/arm/translate.c
29
+++ b/target/arm/helper.c
15
@@ -XXX,XX +XXX,XX @@ static int neon_2rm_is_float_op(int op)
30
@@ -XXX,XX +XXX,XX @@ static uint64_t tlbi_aa64_range_get_length(CPUARMState *env,
16
* what we are asking here is "does the code for this case in
31
uint64_t exponent;
17
* the Neon for-each-pass loop use cpu_F0s?".
32
uint64_t length;
18
*/
33
19
- return op >= NEON_2RM_VRECPE_F;
34
- num = extract64(value, 39, 4);
20
+ return op >= NEON_2RM_VCVT_FS;
35
+ num = extract64(value, 39, 5);
21
}
36
scale = extract64(value, 44, 2);
22
37
page_size_granule = extract64(value, 46, 2);
23
static bool neon_2rm_is_v8_op(int op)
38
24
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
39
- page_shift = page_size_granule * 2 + 12;
25
case NEON_2RM_VRECPE_F:
40
-
26
{
41
if (page_size_granule == 0) {
27
TCGv_ptr fpstatus = get_fpstatus_ptr(1);
42
qemu_log_mask(LOG_GUEST_ERROR, "Invalid page size granule %d\n",
28
- gen_helper_recpe_f32(cpu_F0s, cpu_F0s, fpstatus);
43
page_size_granule);
29
+ gen_helper_recpe_f32(tmp, tmp, fpstatus);
44
return 0;
30
tcg_temp_free_ptr(fpstatus);
45
}
31
break;
46
32
}
47
+ page_shift = (page_size_granule - 1) * 2 + 12;
33
case NEON_2RM_VRSQRTE_F:
48
+
34
{
49
exponent = (5 * scale) + 1;
35
TCGv_ptr fpstatus = get_fpstatus_ptr(1);
50
length = (num + 1) << (exponent + page_shift);
36
- gen_helper_rsqrte_f32(cpu_F0s, cpu_F0s, fpstatus);
51
37
+ gen_helper_rsqrte_f32(tmp, tmp, fpstatus);
38
tcg_temp_free_ptr(fpstatus);
39
break;
40
}
41
--
52
--
42
2.20.1
53
2.25.1
43
54
44
55
diff view generated by jsdifflib
1
Switch NEON_2RM_VABS_F away from using cpu_F0s.
1
From: Patrick Venture <venture@google.com>
2
2
3
The rx_active boolean change to true should always trigger a try_read
4
call that flushes the queue.
5
6
Signed-off-by: Patrick Venture <venture@google.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20211203221002.1719306-1-venture@google.com
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
Message-id: 20190613163917.28589-5-peter.maydell@linaro.org
7
---
10
---
8
target/arm/translate.c | 13 ++-----------
11
hw/net/npcm7xx_emc.c | 18 ++++++++----------
9
1 file changed, 2 insertions(+), 11 deletions(-)
12
1 file changed, 8 insertions(+), 10 deletions(-)
10
13
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
14
diff --git a/hw/net/npcm7xx_emc.c b/hw/net/npcm7xx_emc.c
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
16
--- a/hw/net/npcm7xx_emc.c
14
+++ b/target/arm/translate.c
17
+++ b/hw/net/npcm7xx_emc.c
15
@@ -XXX,XX +XXX,XX @@ static TCGv_ptr get_fpstatus_ptr(int neon)
18
@@ -XXX,XX +XXX,XX @@ static void emc_halt_rx(NPCM7xxEMCState *emc, uint32_t mista_flag)
16
return statusptr;
19
emc_set_mista(emc, mista_flag);
17
}
20
}
18
21
19
-static inline void gen_vfp_neg(int dp)
22
+static void emc_enable_rx_and_flush(NPCM7xxEMCState *emc)
23
+{
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)
20
-{
36
-{
21
- if (dp)
37
- if (emc_can_receive(qemu_get_queue(emc->nic))) {
22
- gen_helper_vfp_negd(cpu_F0d, cpu_F0d);
38
- qemu_flush_queued_packets(qemu_get_queue(emc->nic));
23
- else
39
- }
24
- gen_helper_vfp_negs(cpu_F0s, cpu_F0s);
25
-}
40
-}
26
-
41
-
27
#define VFP_GEN_ITOF(name) \
42
static uint64_t npcm7xx_emc_read(void *opaque, hwaddr offset, unsigned size)
28
static inline void gen_vfp_##name(int dp, int neon) \
43
{
29
{ \
44
NPCM7xxEMCState *emc = opaque;
30
@@ -XXX,XX +XXX,XX @@ static int neon_2rm_is_float_op(int op)
45
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_emc_write(void *opaque, hwaddr offset,
31
* what we are asking here is "does the code for this case in
46
emc->regs[REG_MGSTA] |= REG_MGSTA_RXHA;
32
* the Neon for-each-pass loop use cpu_F0s?".
47
}
33
*/
48
if (value & REG_MCMDR_RXON) {
34
- return (op == NEON_2RM_VNEG_F ||
49
- emc->rx_active = true;
35
- (op >= NEON_2RM_VRINTN && op <= NEON_2RM_VRINTZ) ||
50
+ emc_enable_rx_and_flush(emc);
36
+ return ((op >= NEON_2RM_VRINTN && op <= NEON_2RM_VRINTZ) ||
51
} else {
37
op == NEON_2RM_VRINTM ||
52
emc_halt_rx(emc, 0);
38
(op >= NEON_2RM_VRINTP && op <= NEON_2RM_VCVTMS) ||
53
}
39
op >= NEON_2RM_VRECPE_F);
54
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_emc_write(void *opaque, hwaddr offset,
40
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
55
break;
41
gen_helper_vfp_abss(tmp, tmp);
56
case REG_RSDR:
42
break;
57
if (emc->regs[REG_MCMDR] & REG_MCMDR_RXON) {
43
case NEON_2RM_VNEG_F:
58
- emc->rx_active = true;
44
- gen_vfp_neg(0);
59
- emc_try_receive_next_packet(emc);
45
+ gen_helper_vfp_negs(tmp, tmp);
60
+ emc_enable_rx_and_flush(emc);
46
break;
61
}
47
case NEON_2RM_VSWP:
62
break;
48
tmp2 = neon_load_reg(rd, pass);
63
case REG_MIIDA:
49
--
64
--
50
2.20.1
65
2.25.1
51
66
52
67
diff view generated by jsdifflib
1
We calculate the locations in memory where we want to put the
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
initrd and the DTB based on the size of the kernel, since they
3
come after it. Add some explicit checks that these aren't off the
4
end of RAM entirely.
5
2
6
(At the moment the way we calculate the initrd_start means that
3
When a virtio-iommu is instantiated, describe it using the ACPI VIOT
7
it can't ever be off the end of RAM, but that will change with
4
table.
8
the next commit.)
9
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>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Tested-by: Mark Rutland <mark.rutland@arm.com>
13
Message-id: 20190516144733.32399-3-peter.maydell@linaro.org
14
---
11
---
15
hw/arm/boot.c | 23 +++++++++++++++++++++++
12
hw/arm/virt-acpi-build.c | 7 +++++++
16
1 file changed, 23 insertions(+)
13
hw/arm/Kconfig | 1 +
14
2 files changed, 8 insertions(+)
17
15
18
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
16
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
19
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/boot.c
18
--- a/hw/arm/virt-acpi-build.c
21
+++ b/hw/arm/boot.c
19
+++ b/hw/arm/virt-acpi-build.c
22
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
20
@@ -XXX,XX +XXX,XX @@
23
error_report("could not load kernel '%s'", info->kernel_filename);
21
#include "kvm_arm.h"
24
exit(1);
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)
25
}
29
}
26
+
30
#endif
27
+ if (kernel_size > info->ram_size) {
31
28
+ error_report("kernel '%s' is too large to fit in RAM "
32
+ if (vms->iommu == VIRT_IOMMU_VIRTIO) {
29
+ "(kernel size %d, RAM size %" PRId64 ")",
33
+ acpi_add_table(table_offsets, tables_blob);
30
+ info->kernel_filename, kernel_size, info->ram_size);
34
+ build_viot(ms, tables_blob, tables->linker, vms->virtio_iommu_bdf,
31
+ exit(1);
35
+ vms->oem_id, vms->oem_table_id);
32
+ }
36
+ }
33
+
37
+
34
info->entry = entry;
38
/* XSDT is pointed to by RSDP */
35
if (is_linux) {
39
xsdt = tables_blob->len;
36
uint32_t fixupcontext[FIXUP_MAX];
40
build_xsdt(tables_blob, tables->linker, table_offsets, vms->oem_id,
37
41
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
38
if (info->initrd_filename) {
42
index XXXXXXX..XXXXXXX 100644
39
+
43
--- a/hw/arm/Kconfig
40
+ if (info->initrd_start >= ram_end) {
44
+++ b/hw/arm/Kconfig
41
+ error_report("not enough space after kernel to load initrd");
45
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
42
+ exit(1);
46
select DIMM
43
+ }
47
select ACPI_HW_REDUCED
44
+
48
select ACPI_APEI
45
initrd_size = load_ramdisk_as(info->initrd_filename,
49
+ select ACPI_VIOT
46
info->initrd_start,
50
47
ram_end - info->initrd_start, as);
51
config CHEETAH
48
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
52
bool
49
info->initrd_filename);
50
exit(1);
51
}
52
+ if (info->initrd_start + initrd_size > info->ram_size) {
53
+ error_report("could not load initrd '%s': "
54
+ "too big to fit into RAM after the kernel",
55
+ info->initrd_filename);
56
+ }
57
} else {
58
initrd_size = 0;
59
}
60
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
61
/* Place the DTB after the initrd in memory with alignment. */
62
info->dtb_start = QEMU_ALIGN_UP(info->initrd_start + initrd_size,
63
align);
64
+ if (info->dtb_start >= ram_end) {
65
+ error_report("Not enough space for DTB after kernel/initrd");
66
+ exit(1);
67
+ }
68
fixupcontext[FIXUP_ARGPTR_LO] = info->dtb_start;
69
fixupcontext[FIXUP_ARGPTR_HI] = info->dtb_start >> 32;
70
} else {
71
--
53
--
72
2.20.1
54
2.25.1
73
55
74
56
diff view generated by jsdifflib
1
Where Neon instructions are floating point operations, we
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
mostly use the old VFP utility functions like gen_vfp_abs()
3
which work on the TCG globals cpu_F0s and cpu_F1s. The
4
Neon for-each-element loop conditionally loads the inputs
5
into either a plain old TCG temporary for most operations
6
or into cpu_F0s for float operations, and similarly stores
7
back either cpu_F0s or the temporary.
8
2
9
Switch NEON_2RM_VABS_F away from using cpu_F0s, and
3
virtio-iommu is now supported with ACPI VIOT as well as device tree.
10
update neon_2rm_is_float_op() accordingly.
4
Remove the restriction that prevents from instantiating a virtio-iommu
5
device under ACPI.
11
6
7
Acked-by: Igor Mammedov <imammedo@redhat.com>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
10
Message-id: 20211210170415.583179-3-jean-philippe@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Message-id: 20190613163917.28589-4-peter.maydell@linaro.org
16
---
12
---
17
target/arm/translate.c | 19 ++++++++-----------
13
hw/arm/virt.c | 10 ++--------
18
1 file changed, 8 insertions(+), 11 deletions(-)
14
hw/virtio/virtio-iommu-pci.c | 12 ++----------
15
2 files changed, 4 insertions(+), 18 deletions(-)
19
16
20
diff --git a/target/arm/translate.c b/target/arm/translate.c
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
21
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/translate.c
19
--- a/hw/arm/virt.c
23
+++ b/target/arm/translate.c
20
+++ b/hw/arm/virt.c
24
@@ -XXX,XX +XXX,XX @@ static TCGv_ptr get_fpstatus_ptr(int neon)
21
@@ -XXX,XX +XXX,XX @@ static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
25
return statusptr;
22
MachineClass *mc = MACHINE_GET_CLASS(machine);
23
24
if (device_is_dynamic_sysbus(mc, dev) ||
25
- (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM))) {
26
+ object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) ||
27
+ object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
28
return HOTPLUG_HANDLER(machine);
29
}
30
- if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
31
- VirtMachineState *vms = VIRT_MACHINE(machine);
32
-
33
- if (!vms->bootinfo.firmware_loaded || !virt_is_acpi_enabled(vms)) {
34
- return HOTPLUG_HANDLER(machine);
35
- }
36
- }
37
return NULL;
26
}
38
}
27
39
28
-static inline void gen_vfp_abs(int dp)
40
diff --git a/hw/virtio/virtio-iommu-pci.c b/hw/virtio/virtio-iommu-pci.c
29
-{
41
index XXXXXXX..XXXXXXX 100644
30
- if (dp)
42
--- a/hw/virtio/virtio-iommu-pci.c
31
- gen_helper_vfp_absd(cpu_F0d, cpu_F0d);
43
+++ b/hw/virtio/virtio-iommu-pci.c
32
- else
44
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
33
- gen_helper_vfp_abss(cpu_F0s, cpu_F0s);
45
VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
34
-}
46
47
if (!qdev_get_machine_hotplug_handler(DEVICE(vpci_dev))) {
48
- MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
35
-
49
-
36
static inline void gen_vfp_neg(int dp)
50
- error_setg(errp,
37
{
51
- "%s machine fails to create iommu-map device tree bindings",
38
if (dp)
52
- mc->name);
39
@@ -XXX,XX +XXX,XX @@ static const uint8_t neon_3r_sizes[] = {
53
- error_append_hint(errp,
40
54
- "Check your machine implements a hotplug handler "
41
static int neon_2rm_is_float_op(int op)
55
- "for the virtio-iommu-pci device\n");
42
{
56
- error_append_hint(errp, "Check the guest is booted without FW or with "
43
- /* Return true if this neon 2reg-misc op is float-to-float */
57
- "-no-acpi\n");
44
- return (op == NEON_2RM_VABS_F || op == NEON_2RM_VNEG_F ||
58
+ error_setg(errp, "Check your machine implements a hotplug handler "
45
+ /*
59
+ "for the virtio-iommu-pci device");
46
+ * Return true if this neon 2reg-misc op is float-to-float.
60
return;
47
+ * This is not a property of the operation but of our code --
61
}
48
+ * what we are asking here is "does the code for this case in
62
for (int i = 0; i < s->nb_reserved_regions; i++) {
49
+ * the Neon for-each-pass loop use cpu_F0s?".
50
+ */
51
+ return (op == NEON_2RM_VNEG_F ||
52
(op >= NEON_2RM_VRINTN && op <= NEON_2RM_VRINTZ) ||
53
op == NEON_2RM_VRINTM ||
54
(op >= NEON_2RM_VRINTP && op <= NEON_2RM_VCVTMS) ||
55
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
56
break;
57
}
58
case NEON_2RM_VABS_F:
59
- gen_vfp_abs(0);
60
+ gen_helper_vfp_abss(tmp, tmp);
61
break;
62
case NEON_2RM_VNEG_F:
63
gen_vfp_neg(0);
64
--
63
--
65
2.20.1
64
2.25.1
66
65
67
66
diff view generated by jsdifflib
1
Create "vfp" and "dsp" properties on the armv7m container object
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
which will be forwarded to its CPU object, so that SoCs can
3
configure whether the CPU has these features.
4
2
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
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Message-id: 20190517174046.11146-4-peter.maydell@linaro.org
9
---
13
---
10
include/hw/arm/armv7m.h | 4 ++++
14
hw/arm/virt.c | 5 +++++
11
hw/arm/armv7m.c | 18 ++++++++++++++++++
15
1 file changed, 5 insertions(+)
12
2 files changed, 22 insertions(+)
13
16
14
diff --git a/include/hw/arm/armv7m.h b/include/hw/arm/armv7m.h
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/include/hw/arm/armv7m.h
19
--- a/hw/arm/virt.c
17
+++ b/include/hw/arm/armv7m.h
20
+++ b/hw/arm/virt.c
18
@@ -XXX,XX +XXX,XX @@ typedef struct {
21
@@ -XXX,XX +XXX,XX @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
19
* devices will be automatically layered on top of this view.)
22
hwaddr db_start = 0, db_end = 0;
20
* + Property "idau": IDAU interface (forwarded to CPU object)
23
char *resv_prop_str;
21
* + Property "init-svtor": secure VTOR reset value (forwarded to CPU object)
24
22
+ * + Property "vfp": enable VFP (forwarded to CPU object)
25
+ if (vms->iommu != VIRT_IOMMU_NONE) {
23
+ * + Property "dsp": enable DSP (forwarded to CPU object)
26
+ error_setg(errp, "virt machine does not support multiple IOMMUs");
24
* + Property "enable-bitband": expose bitbanded IO
25
*/
26
typedef struct ARMv7MState {
27
@@ -XXX,XX +XXX,XX @@ typedef struct ARMv7MState {
28
uint32_t init_svtor;
29
bool enable_bitband;
30
bool start_powered_off;
31
+ bool vfp;
32
+ bool dsp;
33
} ARMv7MState;
34
35
#endif
36
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/arm/armv7m.c
39
+++ b/hw/arm/armv7m.c
40
@@ -XXX,XX +XXX,XX @@ static void armv7m_realize(DeviceState *dev, Error **errp)
41
return;
42
}
43
}
44
+ if (object_property_find(OBJECT(s->cpu), "vfp", NULL)) {
45
+ object_property_set_bool(OBJECT(s->cpu), s->vfp,
46
+ "vfp", &err);
47
+ if (err != NULL) {
48
+ error_propagate(errp, err);
49
+ return;
27
+ return;
50
+ }
28
+ }
51
+ }
29
+
52
+ if (object_property_find(OBJECT(s->cpu), "dsp", NULL)) {
30
switch (vms->msi_controller) {
53
+ object_property_set_bool(OBJECT(s->cpu), s->dsp,
31
case VIRT_MSI_CTRL_NONE:
54
+ "dsp", &err);
32
return;
55
+ if (err != NULL) {
56
+ error_propagate(errp, err);
57
+ return;
58
+ }
59
+ }
60
61
/*
62
* Tell the CPU where the NVIC is; it will fail realize if it doesn't
63
@@ -XXX,XX +XXX,XX @@ static Property armv7m_properties[] = {
64
DEFINE_PROP_BOOL("enable-bitband", ARMv7MState, enable_bitband, false),
65
DEFINE_PROP_BOOL("start-powered-off", ARMv7MState, start_powered_off,
66
false),
67
+ DEFINE_PROP_BOOL("vfp", ARMv7MState, vfp, true),
68
+ DEFINE_PROP_BOOL("dsp", ARMv7MState, dsp, true),
69
DEFINE_PROP_END_OF_LIST(),
70
};
71
72
--
33
--
73
2.20.1
34
2.25.1
74
35
75
36
diff view generated by jsdifflib
New patch
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
1
2
3
To propagate errors to the caller of the pre_plug callback, use the
4
object_poperty_set*() functions directly instead of the qdev_prop_set*()
5
helpers.
6
7
Suggested-by: Igor Mammedov <imammedo@redhat.com>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
11
Message-id: 20211210170415.583179-5-jean-philippe@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/virt.c | 5 +++--
15
1 file changed, 3 insertions(+), 2 deletions(-)
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
db_start, db_end,
23
VIRTIO_IOMMU_RESV_MEM_T_MSI);
24
25
- qdev_prop_set_uint32(dev, "len-reserved-regions", 1);
26
- qdev_prop_set_string(dev, "reserved-regions[0]", resv_prop_str);
27
+ object_property_set_uint(OBJECT(dev), "len-reserved-regions", 1, errp);
28
+ object_property_set_str(OBJECT(dev), "reserved-regions[0]",
29
+ resv_prop_str, errp);
30
g_free(resv_prop_str);
31
}
32
}
33
--
34
2.25.1
35
36
diff view generated by jsdifflib
1
The GICv3 specification says that the GICD_TYPER.SecurityExtn bit
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
is RAZ if GICD_CTLR.DS is 1. We were incorrectly making it RAZ
3
if the security extension is unsupported. "Security extension
4
unsupported" always implies GICD_CTLR.DS == 1, but the guest can
5
also set DS on a GIC which does support the security extension.
6
Fix the condition to correctly check the GICD_CTLR.DS bit.
7
2
3
Create empty data files and allow updates for the upcoming VIOT tests.
4
5
Acked-by: Igor Mammedov <imammedo@redhat.com>
6
Reviewed-by: Eric Auger <eric.auger@redhat.com>
7
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
8
Message-id: 20211210170415.583179-6-jean-philippe@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20190524124248.28394-3-peter.maydell@linaro.org
10
---
10
---
11
hw/intc/arm_gicv3_dist.c | 8 +++++++-
11
tests/qtest/bios-tables-test-allowed-diff.h | 3 +++
12
1 file changed, 7 insertions(+), 1 deletion(-)
12
tests/data/acpi/q35/DSDT.viot | 0
13
tests/data/acpi/q35/VIOT.viot | 0
14
tests/data/acpi/virt/VIOT | 0
15
4 files changed, 3 insertions(+)
16
create mode 100644 tests/data/acpi/q35/DSDT.viot
17
create mode 100644 tests/data/acpi/q35/VIOT.viot
18
create mode 100644 tests/data/acpi/virt/VIOT
13
19
14
diff --git a/hw/intc/arm_gicv3_dist.c b/hw/intc/arm_gicv3_dist.c
20
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
15
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/intc/arm_gicv3_dist.c
22
--- a/tests/qtest/bios-tables-test-allowed-diff.h
17
+++ b/hw/intc/arm_gicv3_dist.c
23
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
18
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicd_readl(GICv3State *s, hwaddr offset,
24
@@ -1 +1,4 @@
19
* ITLinesNumber == (num external irqs / 32) - 1
25
/* List of comma-separated changed AML files to ignore */
20
*/
26
+"tests/data/acpi/virt/VIOT",
21
int itlinesnumber = ((s->num_irq - GIC_INTERNAL) / 32) - 1;
27
+"tests/data/acpi/q35/DSDT.viot",
22
+ /*
28
+"tests/data/acpi/q35/VIOT.viot",
23
+ * SecurityExtn must be RAZ if GICD_CTLR.DS == 1, and
29
diff --git a/tests/data/acpi/q35/DSDT.viot b/tests/data/acpi/q35/DSDT.viot
24
+ * "security extensions not supported" always implies DS == 1,
30
new file mode 100644
25
+ * so we only need to check the DS bit.
31
index XXXXXXX..XXXXXXX
26
+ */
32
diff --git a/tests/data/acpi/q35/VIOT.viot b/tests/data/acpi/q35/VIOT.viot
27
+ bool sec_extn = !(s->gicd_ctlr & GICD_CTLR_DS);
33
new file mode 100644
28
34
index XXXXXXX..XXXXXXX
29
- *data = (1 << 25) | (1 << 24) | (s->security_extn << 10) |
35
diff --git a/tests/data/acpi/virt/VIOT b/tests/data/acpi/virt/VIOT
30
+ *data = (1 << 25) | (1 << 24) | (sec_extn << 10) |
36
new file mode 100644
31
(0xf << 19) | itlinesnumber;
37
index XXXXXXX..XXXXXXX
32
return MEMTX_OK;
33
}
34
--
38
--
35
2.20.1
39
2.25.1
36
40
37
41
diff view generated by jsdifflib
1
The AArch32 VMOV (immediate) instruction uses the same VFP encoded
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
immediate format we already handle in vfp_expand_imm(). Use that
3
function rather than hand-decoding it.
4
2
5
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
3
Add two test cases for VIOT, one on the q35 machine and the other on
4
virt. To test complex topologies the q35 test has two PCIe buses that
5
bypass the IOMMU (and are therefore not described by VIOT), and two
6
buses that are translated by virtio-iommu.
7
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-7-jean-philippe@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20190613163917.28589-3-peter.maydell@linaro.org
10
---
13
---
11
target/arm/translate-vfp.inc.c | 28 ++++------------------------
14
tests/qtest/bios-tables-test.c | 38 ++++++++++++++++++++++++++++++++++
12
target/arm/vfp.decode | 10 ++++++----
15
1 file changed, 38 insertions(+)
13
2 files changed, 10 insertions(+), 28 deletions(-)
14
16
15
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
17
diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-vfp.inc.c
19
--- a/tests/qtest/bios-tables-test.c
18
+++ b/target/arm/translate-vfp.inc.c
20
+++ b/tests/qtest/bios-tables-test.c
19
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_imm_sp(DisasContext *s, arg_VMOV_imm_sp *a)
21
@@ -XXX,XX +XXX,XX @@ static void test_acpi_virt_tcg(void)
20
uint32_t delta_d = 0;
22
free_test_data(&data);
21
int veclen = s->vec_len;
23
}
22
TCGv_i32 fd;
24
23
- uint32_t n, i, vd;
25
+static void test_acpi_q35_viot(void)
24
+ uint32_t vd;
26
+{
25
27
+ test_data data = {
26
vd = a->vd;
28
+ .machine = MACHINE_Q35,
27
29
+ .variant = ".viot",
28
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_imm_sp(DisasContext *s, arg_VMOV_imm_sp *a)
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
{
63
int i;
64
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
65
qtest_add_func("acpi/q35/kvm/xapic", test_acpi_q35_kvm_xapic);
66
qtest_add_func("acpi/q35/kvm/dmar", test_acpi_q35_kvm_dmar);
67
}
68
+ qtest_add_func("acpi/q35/viot", test_acpi_q35_viot);
69
} else if (strcmp(arch, "aarch64") == 0) {
70
if (has_tcg) {
71
qtest_add_func("acpi/virt", test_acpi_virt_tcg);
72
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
73
qtest_add_func("acpi/virt/memhp", test_acpi_virt_tcg_memhp);
74
qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb);
75
qtest_add_func("acpi/virt/oem-fields", test_acpi_oem_fields_virt);
76
+ qtest_add_func("acpi/virt/viot", test_acpi_virt_viot);
29
}
77
}
30
}
78
}
31
79
ret = g_test_run();
32
- n = (a->imm4h << 28) & 0x80000000;
33
- i = ((a->imm4h << 4) & 0x70) | a->imm4l;
34
- if (i & 0x40) {
35
- i |= 0x780;
36
- } else {
37
- i |= 0x800;
38
- }
39
- n |= i << 19;
40
-
41
- fd = tcg_temp_new_i32();
42
- tcg_gen_movi_i32(fd, n);
43
+ fd = tcg_const_i32(vfp_expand_imm(MO_32, a->imm));
44
45
for (;;) {
46
neon_store_reg32(fd, vd);
47
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_imm_dp(DisasContext *s, arg_VMOV_imm_dp *a)
48
uint32_t delta_d = 0;
49
int veclen = s->vec_len;
50
TCGv_i64 fd;
51
- uint32_t n, i, vd;
52
+ uint32_t vd;
53
54
vd = a->vd;
55
56
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_imm_dp(DisasContext *s, arg_VMOV_imm_dp *a)
57
}
58
}
59
60
- n = (a->imm4h << 28) & 0x80000000;
61
- i = ((a->imm4h << 4) & 0x70) | a->imm4l;
62
- if (i & 0x40) {
63
- i |= 0x3f80;
64
- } else {
65
- i |= 0x4000;
66
- }
67
- n |= i << 16;
68
-
69
- fd = tcg_temp_new_i64();
70
- tcg_gen_movi_i64(fd, ((uint64_t)n) << 32);
71
+ fd = tcg_const_i64(vfp_expand_imm(MO_64, a->imm));
72
73
for (;;) {
74
neon_store_reg64(fd, vd);
75
diff --git a/target/arm/vfp.decode b/target/arm/vfp.decode
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/arm/vfp.decode
78
+++ b/target/arm/vfp.decode
79
@@ -XXX,XX +XXX,XX @@
80
%vmov_idx_b 21:1 5:2
81
%vmov_idx_h 21:1 6:1
82
83
+%vmov_imm 16:4 0:4
84
+
85
# VMOV scalar to general-purpose register; note that this does
86
# include some Neon cases.
87
VMOV_to_gp ---- 1110 u:1 1. 1 .... rt:4 1011 ... 1 0000 \
88
@@ -XXX,XX +XXX,XX @@ VFM_sp ---- 1110 1.10 .... .... 1010 . o2:1 . 0 .... \
89
VFM_dp ---- 1110 1.10 .... .... 1011 . o2:1 . 0 .... \
90
vm=%vm_dp vn=%vn_dp vd=%vd_dp o1=2
91
92
-VMOV_imm_sp ---- 1110 1.11 imm4h:4 .... 1010 0000 imm4l:4 \
93
- vd=%vd_sp
94
-VMOV_imm_dp ---- 1110 1.11 imm4h:4 .... 1011 0000 imm4l:4 \
95
- vd=%vd_dp
96
+VMOV_imm_sp ---- 1110 1.11 .... .... 1010 0000 .... \
97
+ vd=%vd_sp imm=%vmov_imm
98
+VMOV_imm_dp ---- 1110 1.11 .... .... 1011 0000 .... \
99
+ vd=%vd_dp imm=%vmov_imm
100
101
VMOV_reg_sp ---- 1110 1.11 0000 .... 1010 01.0 .... \
102
vd=%vd_sp vm=%vm_sp
103
--
80
--
104
2.20.1
81
2.25.1
105
82
106
83
diff view generated by jsdifflib
1
Allow VFP and neon to be disabled via a CPU property. As with
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
the "pmu" property, we only allow these features to be removed
2
3
from CPUs which have it by default, not added to CPUs which
3
Add expected blobs of the VIOT and DSDT table for the VIOT test on the
4
don't have it.
4
q35 machine.
5
5
6
The primary motivation here is to be able to optionally
6
Since the test instantiates a virtio device and two PCIe expander
7
create Cortex-M33 CPUs with no FPU, but we provide switches
7
bridges, DSDT.viot has more blocks than the base DSDT.
8
for both VFP and Neon because the two interact:
8
9
* AArch64 can't have one without the other
9
The VIOT table generated for the q35 test is:
10
* Some ID register fields only change if both are disabled
10
11
11
[000h 0000 4] Signature : "VIOT" [Virtual I/O Translation Table]
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
[004h 0004 4] Table Length : 00000070
13
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
[008h 0008 1] Revision : 00
14
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
14
[009h 0009 1] Checksum : 3D
15
Message-id: 20190517174046.11146-2-peter.maydell@linaro.org
15
[00Ah 0010 6] Oem ID : "BOCHS "
16
---
16
[010h 0016 8] Oem Table ID : "BXPC "
17
target/arm/cpu.h | 4 ++
17
[018h 0024 4] Oem Revision : 00000001
18
target/arm/cpu.c | 150 +++++++++++++++++++++++++++++++++++++++++++++--
18
[01Ch 0028 4] Asl Compiler ID : "BXPC"
19
2 files changed, 148 insertions(+), 6 deletions(-)
19
[020h 0032 4] Asl Compiler Revision : 00000001
20
20
21
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
21
[024h 0036 2] Node count : 0003
22
index XXXXXXX..XXXXXXX 100644
22
[026h 0038 2] Node offset : 0030
23
--- a/target/arm/cpu.h
23
[028h 0040 8] Reserved : 0000000000000000
24
+++ b/target/arm/cpu.h
24
25
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
25
[030h 0048 1] Type : 03 [VirtIO-PCI IOMMU]
26
bool has_el3;
26
[031h 0049 1] Reserved : 00
27
/* CPU has PMU (Performance Monitor Unit) */
27
[032h 0050 2] Length : 0010
28
bool has_pmu;
28
29
+ /* CPU has VFP */
29
[034h 0052 2] PCI Segment : 0000
30
+ bool has_vfp;
30
[036h 0054 2] PCI BDF number : 0010
31
+ /* CPU has Neon */
31
[038h 0056 8] Reserved : 0000000000000000
32
+ bool has_neon;
32
33
33
[040h 0064 1] Type : 01 [PCI Range]
34
/* CPU has memory protection unit */
34
[041h 0065 1] Reserved : 00
35
bool has_mpu;
35
[042h 0066 2] Length : 0018
36
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
36
37
index XXXXXXX..XXXXXXX 100644
37
[044h 0068 4] Endpoint start : 00003000
38
--- a/target/arm/cpu.c
38
[048h 0072 2] PCI Segment start : 0000
39
+++ b/target/arm/cpu.c
39
[04Ah 0074 2] PCI Segment end : 0000
40
@@ -XXX,XX +XXX,XX @@ static Property arm_cpu_cfgend_property =
40
[04Ch 0076 2] PCI BDF start : 3000
41
static Property arm_cpu_has_pmu_property =
41
[04Eh 0078 2] PCI BDF end : 30FF
42
DEFINE_PROP_BOOL("pmu", ARMCPU, has_pmu, true);
42
[050h 0080 2] Output node : 0030
43
43
[052h 0082 6] Reserved : 000000000000
44
+static Property arm_cpu_has_vfp_property =
44
45
+ DEFINE_PROP_BOOL("vfp", ARMCPU, has_vfp, true);
45
[058h 0088 1] Type : 01 [PCI Range]
46
+
46
[059h 0089 1] Reserved : 00
47
+static Property arm_cpu_has_neon_property =
47
[05Ah 0090 2] Length : 0018
48
+ DEFINE_PROP_BOOL("neon", ARMCPU, has_neon, true);
48
49
+
49
[05Ch 0092 4] Endpoint start : 00001000
50
static Property arm_cpu_has_mpu_property =
50
[060h 0096 2] PCI Segment start : 0000
51
DEFINE_PROP_BOOL("has-mpu", ARMCPU, has_mpu, true);
51
[062h 0098 2] PCI Segment end : 0000
52
52
[064h 0100 2] PCI BDF start : 1000
53
@@ -XXX,XX +XXX,XX @@ void arm_cpu_post_init(Object *obj)
53
[066h 0102 2] PCI BDF end : 10FF
54
if (arm_feature(&cpu->env, ARM_FEATURE_M)) {
54
[068h 0104 2] Output node : 0030
55
set_feature(&cpu->env, ARM_FEATURE_PMSA);
55
[06Ah 0106 6] Reserved : 000000000000
56
57
And the DSDT diff is:
58
59
@@ -XXX,XX +XXX,XX @@
60
*
61
* Disassembling to symbolic ASL+ operators
62
*
63
- * Disassembly of tests/data/acpi/q35/DSDT, Fri Dec 10 15:03:08 2021
64
+ * Disassembly of /tmp/aml-H9Y5D1, Fri Dec 10 15:02:27 2021
65
*
66
* Original Table Header:
67
* Signature "DSDT"
68
- * Length 0x00002061 (8289)
69
+ * Length 0x000024B6 (9398)
70
* Revision 0x01 **** 32-bit table (V1), no 64-bit math support
71
- * Checksum 0xFA
72
+ * Checksum 0xA7
73
* OEM ID "BOCHS "
74
* OEM Table ID "BXPC "
75
* OEM Revision 0x00000001 (1)
76
@@ -XXX,XX +XXX,XX @@
77
}
56
}
78
}
57
+ /* Similarly for the VFP feature bits */
79
58
+ if (arm_feature(&cpu->env, ARM_FEATURE_VFP4)) {
80
+ Scope (\_SB)
59
+ set_feature(&cpu->env, ARM_FEATURE_VFP3);
81
+ {
60
+ }
82
+ Device (PC30)
61
+ if (arm_feature(&cpu->env, ARM_FEATURE_VFP3)) {
83
+ {
62
+ set_feature(&cpu->env, ARM_FEATURE_VFP);
84
+ Name (_UID, 0x30) // _UID: Unique ID
63
+ }
85
+ Name (_BBN, 0x30) // _BBN: BIOS Bus Number
64
86
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
65
if (arm_feature(&cpu->env, ARM_FEATURE_CBAR) ||
87
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
66
arm_feature(&cpu->env, ARM_FEATURE_CBAR_RO)) {
88
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
67
@@ -XXX,XX +XXX,XX @@ void arm_cpu_post_init(Object *obj)
89
+ {
68
&error_abort);
90
+ CreateDWordField (Arg3, Zero, CDW1)
69
}
91
+ If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
70
92
+ {
71
+ /*
93
+ CreateDWordField (Arg3, 0x04, CDW2)
72
+ * Allow user to turn off VFP and Neon support, but only for TCG --
94
+ CreateDWordField (Arg3, 0x08, CDW3)
73
+ * KVM does not currently allow us to lie to the guest about its
95
+ Local0 = CDW3 /* \_SB_.PC30._OSC.CDW3 */
74
+ * ID/feature registers, so the guest always sees what the host has.
96
+ Local0 &= 0x1F
75
+ */
97
+ If ((Arg1 != One))
76
+ if (arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
98
+ {
77
+ cpu->has_vfp = true;
99
+ CDW1 |= 0x08
78
+ if (!kvm_enabled()) {
100
+ }
79
+ qdev_property_add_static(DEVICE(obj), &arm_cpu_has_vfp_property,
101
+
80
+ &error_abort);
102
+ If ((CDW3 != Local0))
103
+ {
104
+ CDW1 |= 0x10
105
+ }
106
+
107
+ CDW3 = Local0
108
+ }
109
+ Else
110
+ {
111
+ CDW1 |= 0x04
112
+ }
113
+
114
+ Return (Arg3)
115
+ }
116
+
117
+ Method (_PRT, 0, NotSerialized) // _PRT: PCI Routing Table
118
+ {
119
+ Local0 = Package (0x80){}
120
+ Local1 = Zero
121
+ While ((Local1 < 0x80))
122
+ {
123
+ Local2 = (Local1 >> 0x02)
124
+ Local3 = ((Local1 + Local2) & 0x03)
125
+ If ((Local3 == Zero))
126
+ {
127
+ Local4 = Package (0x04)
128
+ {
129
+ Zero,
130
+ Zero,
131
+ LNKD,
132
+ Zero
133
+ }
134
+ }
135
+
136
+ If ((Local3 == One))
137
+ {
138
+ Local4 = Package (0x04)
139
+ {
140
+ Zero,
141
+ Zero,
142
+ LNKA,
143
+ Zero
144
+ }
145
+ }
146
+
147
+ If ((Local3 == 0x02))
148
+ {
149
+ Local4 = Package (0x04)
150
+ {
151
+ Zero,
152
+ Zero,
153
+ LNKB,
154
+ Zero
155
+ }
156
+ }
157
+
158
+ If ((Local3 == 0x03))
159
+ {
160
+ Local4 = Package (0x04)
161
+ {
162
+ Zero,
163
+ Zero,
164
+ LNKC,
165
+ Zero
166
+ }
167
+ }
168
+
169
+ Local4 [Zero] = ((Local2 << 0x10) | 0xFFFF)
170
+ Local4 [One] = (Local1 & 0x03)
171
+ Local0 [Local1] = Local4
172
+ Local1++
173
+ }
174
+
175
+ Return (Local0)
176
+ }
177
+
178
+ Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
179
+ {
180
+ WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
181
+ 0x0000, // Granularity
182
+ 0x0030, // Range Minimum
183
+ 0x0030, // Range Maximum
184
+ 0x0000, // Translation Offset
185
+ 0x0001, // Length
186
+ ,, )
187
+ })
81
+ }
188
+ }
82
+ }
189
+ }
83
+
190
+
84
+ if (arm_feature(&cpu->env, ARM_FEATURE_NEON)) {
191
+ Scope (\_SB)
85
+ cpu->has_neon = true;
192
+ {
86
+ if (!kvm_enabled()) {
193
+ Device (PC20)
87
+ qdev_property_add_static(DEVICE(obj), &arm_cpu_has_neon_property,
194
+ {
88
+ &error_abort);
195
+ Name (_UID, 0x20) // _UID: Unique ID
196
+ Name (_BBN, 0x20) // _BBN: BIOS Bus Number
197
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
198
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
199
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
200
+ {
201
+ CreateDWordField (Arg3, Zero, CDW1)
202
+ If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
203
+ {
204
+ CreateDWordField (Arg3, 0x04, CDW2)
205
+ CreateDWordField (Arg3, 0x08, CDW3)
206
+ Local0 = CDW3 /* \_SB_.PC20._OSC.CDW3 */
207
+ Local0 &= 0x1F
208
+ If ((Arg1 != One))
209
+ {
210
+ CDW1 |= 0x08
211
+ }
212
+
213
+ If ((CDW3 != Local0))
214
+ {
215
+ CDW1 |= 0x10
216
+ }
217
+
218
+ CDW3 = Local0
219
+ }
220
+ Else
221
+ {
222
+ CDW1 |= 0x04
223
+ }
224
+
225
+ Return (Arg3)
226
+ }
227
+
228
+ Method (_PRT, 0, NotSerialized) // _PRT: PCI Routing Table
229
+ {
230
+ Local0 = Package (0x80){}
231
+ Local1 = Zero
232
+ While ((Local1 < 0x80))
233
+ {
234
+ Local2 = (Local1 >> 0x02)
235
+ Local3 = ((Local1 + Local2) & 0x03)
236
+ If ((Local3 == Zero))
237
+ {
238
+ Local4 = Package (0x04)
239
+ {
240
+ Zero,
241
+ Zero,
242
+ LNKD,
243
+ Zero
244
+ }
245
+ }
246
+
247
+ If ((Local3 == One))
248
+ {
249
+ Local4 = Package (0x04)
250
+ {
251
+ Zero,
252
+ Zero,
253
+ LNKA,
254
+ Zero
255
+ }
256
+ }
257
+
258
+ If ((Local3 == 0x02))
259
+ {
260
+ Local4 = Package (0x04)
261
+ {
262
+ Zero,
263
+ Zero,
264
+ LNKB,
265
+ Zero
266
+ }
267
+ }
268
+
269
+ If ((Local3 == 0x03))
270
+ {
271
+ Local4 = Package (0x04)
272
+ {
273
+ Zero,
274
+ Zero,
275
+ LNKC,
276
+ Zero
277
+ }
278
+ }
279
+
280
+ Local4 [Zero] = ((Local2 << 0x10) | 0xFFFF)
281
+ Local4 [One] = (Local1 & 0x03)
282
+ Local0 [Local1] = Local4
283
+ Local1++
284
+ }
285
+
286
+ Return (Local0)
287
+ }
288
+
289
+ Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
290
+ {
291
+ WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
292
+ 0x0000, // Granularity
293
+ 0x0020, // Range Minimum
294
+ 0x0020, // Range Maximum
295
+ 0x0000, // Translation Offset
296
+ 0x0001, // Length
297
+ ,, )
298
+ })
89
+ }
299
+ }
90
+ }
300
+ }
91
+
301
+
92
if (arm_feature(&cpu->env, ARM_FEATURE_PMSA)) {
302
+ Scope (\_SB)
93
qdev_property_add_static(DEVICE(obj), &arm_cpu_has_mpu_property,
303
+ {
94
&error_abort);
304
+ Device (PC10)
95
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
305
+ {
96
return;
306
+ Name (_UID, 0x10) // _UID: Unique ID
97
}
307
+ Name (_BBN, 0x10) // _BBN: BIOS Bus Number
98
308
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
99
+ if (arm_feature(env, ARM_FEATURE_AARCH64) &&
309
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
100
+ cpu->has_vfp != cpu->has_neon) {
310
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
101
+ /*
311
+ {
102
+ * This is an architectural requirement for AArch64; AArch32 is
312
+ CreateDWordField (Arg3, Zero, CDW1)
103
+ * more flexible and permits VFP-no-Neon and Neon-no-VFP.
313
+ If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
104
+ */
314
+ {
105
+ error_setg(errp,
315
+ CreateDWordField (Arg3, 0x04, CDW2)
106
+ "AArch64 CPUs must have both VFP and Neon or neither");
316
+ CreateDWordField (Arg3, 0x08, CDW3)
107
+ return;
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
+ }
108
+ }
411
+ }
109
+
412
+
110
+ if (!cpu->has_vfp) {
413
Scope (\_SB.PCI0)
111
+ uint64_t t;
414
{
112
+ uint32_t u;
415
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
113
+
416
@@ -XXX,XX +XXX,XX @@
114
+ unset_feature(env, ARM_FEATURE_VFP);
417
WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
115
+ unset_feature(env, ARM_FEATURE_VFP3);
418
0x0000, // Granularity
116
+ unset_feature(env, ARM_FEATURE_VFP4);
419
0x0000, // Range Minimum
117
+
420
- 0x00FF, // Range Maximum
118
+ t = cpu->isar.id_aa64isar1;
421
+ 0x000F, // Range Maximum
119
+ t = FIELD_DP64(t, ID_AA64ISAR1, JSCVT, 0);
422
0x0000, // Translation Offset
120
+ cpu->isar.id_aa64isar1 = t;
423
- 0x0100, // Length
121
+
424
+ 0x0010, // Length
122
+ t = cpu->isar.id_aa64pfr0;
425
,, )
123
+ t = FIELD_DP64(t, ID_AA64PFR0, FP, 0xf);
426
IO (Decode16,
124
+ cpu->isar.id_aa64pfr0 = t;
427
0x0CF8, // Range Minimum
125
+
428
@@ -XXX,XX +XXX,XX @@
126
+ u = cpu->isar.id_isar6;
429
}
127
+ u = FIELD_DP32(u, ID_ISAR6, JSCVT, 0);
430
}
128
+ cpu->isar.id_isar6 = u;
431
129
+
432
+ Device (S10)
130
+ u = cpu->isar.mvfr0;
433
+ {
131
+ u = FIELD_DP32(u, MVFR0, FPSP, 0);
434
+ Name (_ADR, 0x00020000) // _ADR: Address
132
+ u = FIELD_DP32(u, MVFR0, FPDP, 0);
435
+ }
133
+ u = FIELD_DP32(u, MVFR0, FPTRAP, 0);
436
+
134
+ u = FIELD_DP32(u, MVFR0, FPDIVIDE, 0);
437
+ Device (S18)
135
+ u = FIELD_DP32(u, MVFR0, FPSQRT, 0);
438
+ {
136
+ u = FIELD_DP32(u, MVFR0, FPSHVEC, 0);
439
+ Name (_ADR, 0x00030000) // _ADR: Address
137
+ u = FIELD_DP32(u, MVFR0, FPROUND, 0);
440
+ }
138
+ cpu->isar.mvfr0 = u;
441
+
139
+
442
+ Device (S20)
140
+ u = cpu->isar.mvfr1;
443
+ {
141
+ u = FIELD_DP32(u, MVFR1, FPFTZ, 0);
444
+ Name (_ADR, 0x00040000) // _ADR: Address
142
+ u = FIELD_DP32(u, MVFR1, FPDNAN, 0);
445
+ }
143
+ u = FIELD_DP32(u, MVFR1, FPHP, 0);
446
+
144
+ cpu->isar.mvfr1 = u;
447
+ Device (S28)
145
+
448
+ {
146
+ u = cpu->isar.mvfr2;
449
+ Name (_ADR, 0x00050000) // _ADR: Address
147
+ u = FIELD_DP32(u, MVFR2, FPMISC, 0);
450
+ }
148
+ cpu->isar.mvfr2 = u;
451
+
149
+ }
452
Method (PCNT, 0, NotSerialized)
150
+
453
{
151
+ if (!cpu->has_neon) {
454
}
152
+ uint64_t t;
455
153
+ uint32_t u;
456
Reviewed-by: Eric Auger <eric.auger@redhat.com>
154
+
457
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
155
+ unset_feature(env, ARM_FEATURE_NEON);
458
Message-id: 20211210170415.583179-8-jean-philippe@linaro.org
156
+
459
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
157
+ t = cpu->isar.id_aa64isar0;
460
---
158
+ t = FIELD_DP64(t, ID_AA64ISAR0, DP, 0);
461
tests/qtest/bios-tables-test-allowed-diff.h | 2 --
159
+ cpu->isar.id_aa64isar0 = t;
462
tests/data/acpi/q35/DSDT.viot | Bin 0 -> 9398 bytes
160
+
463
tests/data/acpi/q35/VIOT.viot | Bin 0 -> 112 bytes
161
+ t = cpu->isar.id_aa64isar1;
464
3 files changed, 2 deletions(-)
162
+ t = FIELD_DP64(t, ID_AA64ISAR1, FCMA, 0);
465
163
+ cpu->isar.id_aa64isar1 = t;
466
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
164
+
467
index XXXXXXX..XXXXXXX 100644
165
+ t = cpu->isar.id_aa64pfr0;
468
--- a/tests/qtest/bios-tables-test-allowed-diff.h
166
+ t = FIELD_DP64(t, ID_AA64PFR0, ADVSIMD, 0xf);
469
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
167
+ cpu->isar.id_aa64pfr0 = t;
470
@@ -XXX,XX +XXX,XX @@
168
+
471
/* List of comma-separated changed AML files to ignore */
169
+ u = cpu->isar.id_isar5;
472
"tests/data/acpi/virt/VIOT",
170
+ u = FIELD_DP32(u, ID_ISAR5, RDM, 0);
473
-"tests/data/acpi/q35/DSDT.viot",
171
+ u = FIELD_DP32(u, ID_ISAR5, VCMA, 0);
474
-"tests/data/acpi/q35/VIOT.viot",
172
+ cpu->isar.id_isar5 = u;
475
diff --git a/tests/data/acpi/q35/DSDT.viot b/tests/data/acpi/q35/DSDT.viot
173
+
476
index XXXXXXX..XXXXXXX 100644
174
+ u = cpu->isar.id_isar6;
477
GIT binary patch
175
+ u = FIELD_DP32(u, ID_ISAR6, DP, 0);
478
literal 9398
176
+ u = FIELD_DP32(u, ID_ISAR6, FHM, 0);
479
zcmeHNO>7&-8J*>iv|O&FB}G~Oi$yp||57BBoWHhc5OS9yDTx$CQgH$r;8Idr*-4Q_
177
+ cpu->isar.id_isar6 = u;
480
z5(9Az1F`}niVsB-)<KW7p`g9Br(A2Gm-gmc1N78GFS!;)e2V(MnH_0{q<{#yMgn&C
178
+
481
zn|*J-d9yqFhO_H6z19~`FlPL*u<DkZ*}|)JH;X@mF-FI<cPg<fti9tEN*yB^i5czN
179
+ u = cpu->isar.mvfr1;
482
zNq&q?!OZ;BE3B7{KWzJ-`Tn~f`9?Qj8~2^N8{Oc8J%57{==w%rS#;nOCp*nTr@iZ1
180
+ u = FIELD_DP32(u, MVFR1, SIMDLS, 0);
483
zb+?i;JLQUJ=O0?8*>S~D)a>NF1~WVB6^~_B#yhJ`H+JU@=6aXs`?Yv)J2h=N?drcS
181
+ u = FIELD_DP32(u, MVFR1, SIMDINT, 0);
484
zeLZ*n<<Bm^n}6`jfBx#u8&(W}1?)}iF9o#mZ~E2+zwdn7yK3AbIzKnxpZ>JRPm3~#
182
+ u = FIELD_DP32(u, MVFR1, SIMDSP, 0);
485
z&ICS{+_OayRW-l=Mtk=~uaS3o8z<_udd|(wqg`&JnVPfCe>BUOO`Su3e>pff_^UW%
183
+ u = FIELD_DP32(u, MVFR1, SIMDHP, 0);
486
z&JE^NO`)=Amg~iqRB1pPscP?(>#ZuY8GHCmlEvD$9g3%4Db~Dfz2SATnddvrR-Oe^
184
+ u = FIELD_DP32(u, MVFR1, SIMDFMAC, 0);
487
z;s;dJec!hnzi)ri^I6YN9vtkm{^TdUF8h7gX8-<Qe4p)GQ=)AtYx2VcwdLVAEXEjG
185
+ cpu->isar.mvfr1 = u;
488
z^Mj|UHPqkj-LsWuzQem1>F3atdZn=zv3$#RmZzSHN+6-yyU#8cJb=YDilX&sl}vNm
186
+
489
znkgAR^O<3kj4if>{ly5fwRfMWuC5=lrlvKPX~i#654Cp}R_d*JS$9laZ$ra6)<ns8
187
+ u = cpu->isar.mvfr2;
490
zFZy28G%xP(nit&F>LDi%G<tIc=TY=gl$jSD&Uv!Yat~XR46h%rI$!}a%!|xG7u8Zn
188
+ u = FIELD_DP32(u, MVFR2, SIMDMISC, 0);
491
zeY8_|n=K>xz_v_W8VX$W-Fg-qFWcT}7MCyz{%%{ia7hZ>Law-k6NOr}VI&_48U=2l
189
+ cpu->isar.mvfr2 = u;
492
zwqDKFE8eTwwozDdms#e?x?5a|v>&JF;2_v0L~z5n%BYU^52<*cWuD4|GYUm@1+?))
190
+ }
493
zte^45>Rz)t*<T5V#={r>@t@{%?^i#W{i=HAZ*Dc9y59Va-+#P!jrGs;u38a{fLr`N
191
+
494
zvT@rUu>DljxJ?^&Z?-?vyJn3C>3D=qux{Y*bs5|5n)Qmi$TD^Zdn4GU$ocJS2Hh-<
192
+ if (!cpu->has_neon && !cpu->has_vfp) {
495
z`xPI^^+v0nUVdjMos8k`WGl7hA`{03ju%<lrgAHSpd^DRf-*}_#Ly0mB!LSfVgWcQ
193
+ uint64_t t;
496
z&T$@~G9)JI=hz5m0vkrel+Xy{Oh7pkAu-V!j*W7rY(bO}Q$nMH2`FbGB&N)QaV4<4
194
+ uint32_t u;
497
zo)~9JXiP9=;}NPl<C@MmXG&;XFlFNrsyfFsonxFSp<}vEgsRSQP3O3#b6nSnP}ON_
195
+
498
zI!#Tdsp~|j>ckUB>FI=~GokB5sOq#dotCE4(sd$KbtW~PNlj-`*NIToiD#j5J#9^=
196
+ t = cpu->isar.id_aa64isar0;
499
zt?NXn>YUJYPG~wObe#xQos*i*NloXZt`niEb4t@WrRki~bs|)CI+{*L)9L6s5vn><
197
+ t = FIELD_DP64(t, ID_AA64ISAR0, FHM, 0);
500
zn$DD_Go|Z9sOn5>I@6lYw5}7Os&iV?Ij!lO)^#FOb!If38BJ$K*NIToIiu;E(R9w}
198
+ cpu->isar.id_aa64isar0 = t;
501
zIuWWmPiZ<&X*y5oIuWWmF_XaEC!a&Jn$B5WCqh-{X-(&8P3LJ{Cqh-{8P3dyPr@^t
199
+
502
zSqL9?X9Uwd3W@23*s~h*tj0X6GZCuHa~kuU#yqDp5vt7d8uPryJg+kms?5hU=3^T3
200
+ t = cpu->isar.id_aa64isar1;
503
zF`bD}WnSP+=`t5MQ$FJ_2&Q~+BP6E0f^%BVIW6a$o)e+SX~IDBih-7z6{O~7YTy`&
201
+ t = FIELD_DP64(t, ID_AA64ISAR1, FRINTTS, 0);
504
zLjy&Cv?7QikV#>n0>>@MV8oK`Gmun34-FKdlm-J8SZSaNlnhir4-FI{S|bfqV8e)V
202
+ cpu->isar.id_aa64isar1 = t;
505
zss<{chX#reE#g=hsKAC%sF6d-Km}BWs!kZFsFpKfpbC@>6rprQGEjt4Ck#|zITHq|
203
+
506
zK*>M_l;<P^MJRQ`Kn0dFVW0|>3{*fllMEE0)CmI>Sk8ojDo`>|0p(0GP=xY&!axO<
204
+ u = cpu->isar.mvfr0;
507
zGhv_#lnhirIg<<&q0|Wj6<E%MfhtfkPyyvkGEjt4Ck#|zITHq|K*>M_lrzad5lWpf
205
+ u = FIELD_DP32(u, MVFR0, SIMDREG, 0);
508
zP=V!47^ngz0~JutBm+e#b;3XemNQ|X3X}{~Ksl2P6rt1!0~J`#gn=qhGEf2KOfpb}
206
+ cpu->isar.mvfr0 = u;
509
zQYQ>lU^x>8szAv=1(Y+%KoLrvFi?TzOc<yFB?A>u&LjgxD0RX>1(q{mpbC@>R6seC
207
+ }
510
z3>2Z%2?G^a&V+#~P%=;f<xDbAgi<FARA4z12C6{GKn0XD$v_cGoiI>=<xCi;0wn_#
208
+
511
zP|hR+MJRQ`Kn0dFVW0|>3{*fllMEE0)CmI>Sk8ojDo`>|0p(0GP=rz^3{+q_69%e4
209
/* Some features automatically imply others: */
512
z$v_2^Gs!>^N}VuJf#pmXr~)Me6;RG314Srx!axxz28u{EP=u<1B2)}iVZuNaCK;&0
210
if (arm_feature(env, ARM_FEATURE_V8)) {
513
zBm-5LFi?dF167!0pbC==RAItE6($T+VUmF=Ofpb~2?JG_Fi?d_2C6X0Kouqo6p_5T
211
if (arm_feature(env, ARM_FEATURE_M)) {
514
zFi=FeV!SiSKoR0H$dH(_Z(*Q_WZ%L-5y`$K14StNmJAdjmWs}HV4<vU_xO+1efmLq
212
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
515
zZ;W>N_U)fP6Qy6Nw5mbt9Y(#emWSi66=>tq#xoh#Ue=0qyhxi8ZOUe5y0V7VfPUhp
213
if (arm_feature(env, ARM_FEATURE_V5)) {
516
zwX=;ymc+i5%sg9Ja~lZ&8oAV@mHc>&CHP9v4R(jhtT?un;O4e9#pno)Xkh7OWgK&a
214
set_feature(env, ARM_FEATURE_V4T);
517
zyj=3Iv0OuoK_;5rOr5f(Kb~ZXDBO+V`OWYo#_C08imwChQxnjdd?wZLDou8aj;$SD
215
}
518
zGDYiA3<$Tu<JnHL(KPOChi#zrR32t83}naR$+ym4P_h?z_5#|cW-nw$XD_sOtE62l
216
- if (arm_feature(env, ARM_FEATURE_VFP4)) {
519
zrD3@*)NVyiklt0&yF9%+klsBey&I<Y2E<!f(E8TuJte)z(|ZHyy<^gQVfx}=`q&B5
217
- set_feature(env, ARM_FEATURE_VFP3);
520
z7nSryp1wGczIaUfVwiq$Fn#<4=@*ssi#+|}K>EdF(l3VTOM~ghPLRH&q%ZOGrGfON
218
- }
521
zW73zx^yR_y<0nX8R??Sw`tm^f@-gYlNFSp|*<gA{q?Zp5Oe-+l#rmyYmKozi9y=P>
219
- if (arm_feature(env, ARM_FEATURE_VFP3)) {
522
zVReJU*h=ZuVXiS$ohTbw-O#v9>(yZbGE|)?8(H1ZIKvV!jWa0>vy!3eMA^vdhQ>`s
220
- set_feature(env, ARM_FEATURE_VFP);
523
zuMSg{q3T50$m)j1!HixV<}X9liL#N^4c*tL^y)CF8LCc{jjV3yKAqL8!%SzWI#H%q
221
- }
524
z=bSrQ&)%JCRttF5g4Zf`6l?y@>PzD7MA^D>wBlcH6r1ucwJ<p0O%rZ?JzIY3-QdmZ
222
if (arm_feature(env, ARM_FEATURE_LPAE)) {
525
zzs|n>`a5r3e|z)wcUaqS>nqFQ-8x}eCF4u`OWUxqst-@1rSmUs%WmKP5e0dcb?e2N
223
set_feature(env, ARM_FEATURE_V7MP);
526
z;Z|x*!);VwF|Yuhqs^khqOM!@u*jY!WYldISF(V6`BoNd&6Qfk3>X#SuD^7J>p_D=
224
set_feature(env, ARM_FEATURE_PXN);
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
225
--
558
--
226
2.20.1
559
2.25.1
227
560
228
561
diff view generated by jsdifflib
1
The GIC ID registers cover an area 0x30 bytes in size
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
(12 registers, 4 bytes each). We were incorrectly decoding
3
only the first 0x20 bytes.
4
2
3
The VIOT blob contains the following:
4
5
[000h 0000 4] Signature : "VIOT" [Virtual I/O Translation Table]
6
[004h 0004 4] Table Length : 00000058
7
[008h 0008 1] Revision : 00
8
[009h 0009 1] Checksum : 66
9
[00Ah 0010 6] Oem ID : "BOCHS "
10
[010h 0016 8] Oem Table ID : "BXPC "
11
[018h 0024 4] Oem Revision : 00000001
12
[01Ch 0028 4] Asl Compiler ID : "BXPC"
13
[020h 0032 4] Asl Compiler Revision : 00000001
14
15
[024h 0036 2] Node count : 0002
16
[026h 0038 2] Node offset : 0030
17
[028h 0040 8] Reserved : 0000000000000000
18
19
[030h 0048 1] Type : 03 [VirtIO-PCI IOMMU]
20
[031h 0049 1] Reserved : 00
21
[032h 0050 2] Length : 0010
22
23
[034h 0052 2] PCI Segment : 0000
24
[036h 0054 2] PCI BDF number : 0008
25
[038h 0056 8] Reserved : 0000000000000000
26
27
[040h 0064 1] Type : 01 [PCI Range]
28
[041h 0065 1] Reserved : 00
29
[042h 0066 2] Length : 0018
30
31
[044h 0068 4] Endpoint start : 00000000
32
[048h 0072 2] PCI Segment start : 0000
33
[04Ah 0074 2] PCI Segment end : 0000
34
[04Ch 0076 2] PCI BDF start : 0000
35
[04Eh 0078 2] PCI BDF end : 00FF
36
[050h 0080 2] Output node : 0030
37
[052h 0082 6] Reserved : 000000000000
38
39
Acked-by: Ani Sinha <ani@anisinha.ca>
40
Reviewed-by: Eric Auger <eric.auger@redhat.com>
41
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
42
Message-id: 20211210170415.583179-9-jean-philippe@linaro.org
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Message-id: 20190524124248.28394-2-peter.maydell@linaro.org
8
---
44
---
9
hw/intc/arm_gicv3_dist.c | 4 ++--
45
tests/qtest/bios-tables-test-allowed-diff.h | 1 -
10
hw/intc/arm_gicv3_redist.c | 4 ++--
46
tests/data/acpi/virt/VIOT | Bin 0 -> 88 bytes
11
2 files changed, 4 insertions(+), 4 deletions(-)
47
2 files changed, 1 deletion(-)
12
48
13
diff --git a/hw/intc/arm_gicv3_dist.c b/hw/intc/arm_gicv3_dist.c
49
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
14
index XXXXXXX..XXXXXXX 100644
50
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/intc/arm_gicv3_dist.c
51
--- a/tests/qtest/bios-tables-test-allowed-diff.h
16
+++ b/hw/intc/arm_gicv3_dist.c
52
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
17
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicd_readl(GICv3State *s, hwaddr offset,
53
@@ -1,2 +1 @@
18
}
54
/* List of comma-separated changed AML files to ignore */
19
return MEMTX_OK;
55
-"tests/data/acpi/virt/VIOT",
20
}
56
diff --git a/tests/data/acpi/virt/VIOT b/tests/data/acpi/virt/VIOT
21
- case GICD_IDREGS ... GICD_IDREGS + 0x1f:
22
+ case GICD_IDREGS ... GICD_IDREGS + 0x2f:
23
/* ID registers */
24
*data = gicv3_idreg(offset - GICD_IDREGS);
25
return MEMTX_OK;
26
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicd_writel(GICv3State *s, hwaddr offset,
27
gicd_write_irouter(s, attrs, irq, r);
28
return MEMTX_OK;
29
}
30
- case GICD_IDREGS ... GICD_IDREGS + 0x1f:
31
+ case GICD_IDREGS ... GICD_IDREGS + 0x2f:
32
case GICD_TYPER:
33
case GICD_IIDR:
34
/* RO registers, ignore the write */
35
diff --git a/hw/intc/arm_gicv3_redist.c b/hw/intc/arm_gicv3_redist.c
36
index XXXXXXX..XXXXXXX 100644
57
index XXXXXXX..XXXXXXX 100644
37
--- a/hw/intc/arm_gicv3_redist.c
58
GIT binary patch
38
+++ b/hw/intc/arm_gicv3_redist.c
59
literal 88
39
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicr_readl(GICv3CPUState *cs, hwaddr offset,
60
zcmWIZ^bd((0D?3pe`k+i1*eDrX9XZ&1PX!JAexE60Hgv8m>C3sGzXN&z`)2L0cSHX
40
}
61
I{D-Rq0Q5fy0RR91
41
*data = cs->gicr_nsacr;
62
42
return MEMTX_OK;
63
literal 0
43
- case GICR_IDREGS ... GICR_IDREGS + 0x1f:
64
HcmV?d00001
44
+ case GICR_IDREGS ... GICR_IDREGS + 0x2f:
65
45
*data = gicv3_idreg(offset - GICR_IDREGS);
46
return MEMTX_OK;
47
default:
48
@@ -XXX,XX +XXX,XX @@ static MemTxResult gicr_writel(GICv3CPUState *cs, hwaddr offset,
49
return MEMTX_OK;
50
case GICR_IIDR:
51
case GICR_TYPER:
52
- case GICR_IDREGS ... GICR_IDREGS + 0x1f:
53
+ case GICR_IDREGS ... GICR_IDREGS + 0x2f:
54
/* RO registers, ignore the write */
55
qemu_log_mask(LOG_GUEST_ERROR,
56
"%s: invalid guest write to RO register at offset "
57
--
66
--
58
2.20.1
67
2.25.1
59
68
60
69
diff view generated by jsdifflib