1
Nothing earth-shaking in here, just a lot of refactoring and cleanup
1
Hi; here's the first target-arm pullreq for the 7.0 cycle.
2
and a few bugfixes. I suspect I'll have another pullreq to come in
3
the early part of next week...
4
2
5
The following changes since commit 19591e9e0938ea5066984553c256a043bd5d822f:
3
thanks
4
-- PMM
6
5
7
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2020-08-27 16:59:02 +0100)
6
The following changes since commit 76b56fdfc9fa43ec6e5986aee33f108c6c6a511e:
7
8
Merge tag 'block-pull-request' of https://gitlab.com/stefanha/qemu into staging (2021-12-14 12:46:18 -0800)
8
9
9
are available in the Git repository at:
10
are available in the Git repository at:
10
11
11
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200828
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20211215
12
13
13
for you to fetch changes up to ed78849d9711805bda37ee026018d6ee7a606d0e:
14
for you to fetch changes up to aed176558806674d030a8305d989d4e6a5073359:
14
15
15
target/arm: Convert sq{, r}dmulh to gvec for aa64 advsimd (2020-08-28 10:02:50 +0100)
16
tests/acpi: add expected blob for VIOT test on virt machine (2021-12-15 10:35:26 +0000)
16
17
17
----------------------------------------------------------------
18
----------------------------------------------------------------
18
target-arm queue:
19
target-arm queue:
19
* target/arm: Cleanup and refactoring preparatory to SVE2
20
* ITS: error reporting cleanup
20
* armsse: Define ARMSSEClass correctly
21
* aspeed: improve documentation
21
* hw/misc/unimp: Improve information provided in log messages
22
* Fix STM32F2XX USART data register readout
22
* hw/qdev-clock: Avoid calling qdev_connect_clock_in after DeviceRealize
23
* allow emulated GICv3 to be disabled in non-TCG builds
23
* hw/arm/xilinx_zynq: Call qdev_connect_clock_in() before DeviceRealize
24
* fix exception priority for singlestep, misaligned PC, bp, etc
24
* hw/net/allwinner-sun8i-emac: Use AddressSpace for DMA transfers
25
* Correct calculation of tlb range invalidate length
25
* hw/sd/allwinner-sdhost: Use AddressSpace for DMA transfers
26
* npcm7xx_emc: fix missing queue_flush
26
* target/arm: Fill in the WnR syndrome bit in mte_check_fail
27
* virt: Add VIOT ACPI table for virtio-iommu
27
* target/arm: Clarify HCR_EL2 ARMCPRegInfo type
28
* target/i386: Use assert() to sanity-check b1 in SSE decode
28
* hw/arm/musicpal: Use AddressSpace for DMA transfers
29
* Don't include qemu-common unnecessarily
29
* hw/clock: Minor cleanups
30
* hw/arm/sbsa-ref: fix typo breaking PCIe IRQs
31
30
32
----------------------------------------------------------------
31
----------------------------------------------------------------
33
Eduardo Habkost (1):
32
Alex Bennée (1):
34
armsse: Define ARMSSEClass correctly
33
hw/intc: clean-up error reporting for failed ITS cmd
35
34
36
Graeme Gregory (1):
35
Jean-Philippe Brucker (8):
37
hw/arm/sbsa-ref: fix typo breaking PCIe IRQs
36
hw/arm/virt-acpi-build: Add VIOT table for virtio-iommu
37
hw/arm/virt: Remove device tree restriction for virtio-iommu
38
hw/arm/virt: Reject instantiation of multiple IOMMUs
39
hw/arm/virt: Use object_property_set instead of qdev_prop_set
40
tests/acpi: allow updates of VIOT expected data files
41
tests/acpi: add test case for VIOT
42
tests/acpi: add expected blobs for VIOT test on q35 machine
43
tests/acpi: add expected blob for VIOT test on virt machine
38
44
39
Philippe Mathieu-Daudé (14):
45
Joel Stanley (4):
40
hw/clock: Remove unused clock_init*() functions
46
docs: aspeed: Add new boards
41
hw/clock: Let clock_set() return boolean value
47
docs: aspeed: Update OpenBMC image URL
42
hw/clock: Only propagate clock changes if the clock is changed
48
docs: aspeed: Give an example of booting a kernel
43
hw/arm/musicpal: Use AddressSpace for DMA transfers
49
docs: aspeed: ADC is now modelled
44
target/arm: Clarify HCR_EL2 ARMCPRegInfo type
45
hw/sd/allwinner-sdhost: Use AddressSpace for DMA transfers
46
hw/net/allwinner-sun8i-emac: Use AddressSpace for DMA transfers
47
hw/arm/xilinx_zynq: Uninline cadence_uart_create()
48
hw/arm/xilinx_zynq: Call qdev_connect_clock_in() before DeviceRealize
49
hw/qdev-clock: Uninline qdev_connect_clock_in()
50
hw/qdev-clock: Avoid calling qdev_connect_clock_in after DeviceRealize
51
hw/misc/unimp: Display value after offset
52
hw/misc/unimp: Display the value with width of the access size
53
hw/misc/unimp: Display the offset with width of the region size
54
50
55
Richard Henderson (19):
51
Olivier Hériveaux (1):
56
target/arm: Pass the entire mte descriptor to mte_check_fail
52
Fix STM32F2XX USART data register readout
57
target/arm: Fill in the WnR syndrome bit in mte_check_fail
58
qemu/int128: Add int128_lshift
59
target/arm: Split out gen_gvec_fn_zz
60
target/arm: Split out gen_gvec_fn_zzz, do_zzz_fn
61
target/arm: Rearrange {sve,fp}_check_access assert
62
target/arm: Merge do_vector2_p into do_mov_p
63
target/arm: Clean up 4-operand predicate expansion
64
target/arm: Use tcg_gen_gvec_bitsel for trans_SEL_pppp
65
target/arm: Split out gen_gvec_ool_zzzp
66
target/arm: Merge helper_sve_clr_* and helper_sve_movz_*
67
target/arm: Split out gen_gvec_ool_zzp
68
target/arm: Split out gen_gvec_ool_zzz
69
target/arm: Split out gen_gvec_ool_zz
70
target/arm: Tidy SVE tszimm shift formats
71
target/arm: Generalize inl_qrdmlah_* helper functions
72
target/arm: Convert integer multiply (indexed) to gvec for aa64 advsimd
73
target/arm: Convert integer multiply-add (indexed) to gvec for aa64 advsimd
74
target/arm: Convert sq{, r}dmulh to gvec for aa64 advsimd
75
53
76
include/hw/arm/armsse.h | 2 +-
54
Patrick Venture (1):
77
include/hw/char/cadence_uart.h | 17 --
55
hw/net: npcm7xx_emc fix missing queue_flush
78
include/hw/clock.h | 30 +--
79
include/hw/misc/unimp.h | 1 +
80
include/hw/net/allwinner-sun8i-emac.h | 6 +
81
include/hw/qdev-clock.h | 8 +-
82
include/hw/sd/allwinner-sdhost.h | 6 +
83
include/qemu/int128.h | 16 ++
84
target/arm/helper-sve.h | 5 -
85
target/arm/helper.h | 28 +++
86
target/arm/translate.h | 1 +
87
target/arm/sve.decode | 35 ++-
88
hw/arm/allwinner-a10.c | 2 +
89
hw/arm/allwinner-h3.c | 4 +
90
hw/arm/armsse.c | 1 +
91
hw/arm/musicpal.c | 45 ++--
92
hw/arm/sbsa-ref.c | 2 +-
93
hw/arm/xilinx_zynq.c | 24 +-
94
hw/core/clock.c | 7 +-
95
hw/core/qdev-clock.c | 6 +
96
hw/misc/unimp.c | 14 +-
97
hw/net/allwinner-sun8i-emac.c | 46 ++--
98
hw/sd/allwinner-sdhost.c | 37 +++-
99
target/arm/helper.c | 1 -
100
target/arm/mte_helper.c | 19 +-
101
target/arm/sve_helper.c | 70 ++----
102
target/arm/translate-a64.c | 110 ++++++++--
103
target/arm/translate-sve.c | 399 ++++++++++++++--------------------
104
target/arm/vec_helper.c | 182 +++++++++++-----
105
29 files changed, 629 insertions(+), 495 deletions(-)
106
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
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
To have a better idea of how big is the region where the offset
3
While trying to debug a GIC ITS failure I saw some guest errors that
4
belongs, display the value with the width of the region size
4
had poor formatting as well as leaving me confused as to what failed.
5
(i.e. a region of 0x1000 bytes uses 0x000 format).
5
As most of the checks aren't possible without a valid dte split that
6
check apart and then check the other conditions in steps. This avoids
7
us relying on undefined data.
6
8
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
I still get a failure with the current kvm-unit-tests but at least I
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
know (partially) why now:
9
Message-id: 20200812190206.31595-4-f4bug@amsat.org
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>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
26
---
12
include/hw/misc/unimp.h | 1 +
27
hw/intc/arm_gicv3_its.c | 39 +++++++++++++++++++++++++++------------
13
hw/misc/unimp.c | 10 ++++++----
28
1 file changed, 27 insertions(+), 12 deletions(-)
14
2 files changed, 7 insertions(+), 4 deletions(-)
15
29
16
diff --git a/include/hw/misc/unimp.h b/include/hw/misc/unimp.h
30
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
17
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/misc/unimp.h
32
--- a/hw/intc/arm_gicv3_its.c
19
+++ b/include/hw/misc/unimp.h
33
+++ b/hw/intc/arm_gicv3_its.c
20
@@ -XXX,XX +XXX,XX @@
34
@@ -XXX,XX +XXX,XX @@ static bool process_its_cmd(GICv3ITSState *s, uint64_t value, uint32_t offset,
21
typedef struct {
35
if (res != MEMTX_OK) {
22
SysBusDevice parent_obj;
36
return result;
23
MemoryRegion iomem;
37
}
24
+ unsigned offset_fmt_width;
38
+ } else {
25
char *name;
39
+ qemu_log_mask(LOG_GUEST_ERROR,
26
uint64_t size;
40
+ "%s: invalid command attributes: "
27
} UnimplementedDeviceState;
41
+ "invalid dte: %"PRIx64" for %d (MEM_TX: %d)\n",
28
diff --git a/hw/misc/unimp.c b/hw/misc/unimp.c
42
+ __func__, dte, devid, res);
29
index XXXXXXX..XXXXXXX 100644
43
+ return result;
30
--- a/hw/misc/unimp.c
31
+++ b/hw/misc/unimp.c
32
@@ -XXX,XX +XXX,XX @@ static uint64_t unimp_read(void *opaque, hwaddr offset, unsigned size)
33
UnimplementedDeviceState *s = UNIMPLEMENTED_DEVICE(opaque);
34
35
qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read "
36
- "(size %d, offset 0x%" HWADDR_PRIx ")\n",
37
- s->name, size, offset);
38
+ "(size %d, offset 0x%0*" HWADDR_PRIx ")\n",
39
+ s->name, size, s->offset_fmt_width, offset);
40
return 0;
41
}
42
43
@@ -XXX,XX +XXX,XX @@ static void unimp_write(void *opaque, hwaddr offset,
44
UnimplementedDeviceState *s = UNIMPLEMENTED_DEVICE(opaque);
45
46
qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write "
47
- "(size %d, offset 0x%" HWADDR_PRIx
48
+ "(size %d, offset 0x%0*" HWADDR_PRIx
49
", value 0x%0*" PRIx64 ")\n",
50
- s->name, size, offset, size << 1, value);
51
+ s->name, size, s->offset_fmt_width, offset, size << 1, value);
52
}
53
54
static const MemoryRegionOps unimp_ops = {
55
@@ -XXX,XX +XXX,XX @@ static void unimp_realize(DeviceState *dev, Error **errp)
56
return;
57
}
44
}
58
45
59
+ s->offset_fmt_width = DIV_ROUND_UP(64 - clz64(s->size - 1), 4);
46
- if ((devid > s->dt.maxids.max_devids) || !dte_valid || !ite_valid ||
47
- !cte_valid || (eventid > max_eventid)) {
60
+
48
+
61
memory_region_init_io(&s->iomem, OBJECT(s), &unimp_ops, s,
49
+ /*
62
s->name, s->size);
50
+ * In this implementation, in case of guest errors we ignore the
63
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem);
51
+ * command and move onto the next command in the queue.
52
+ */
53
+ if (devid > s->dt.maxids.max_devids) {
54
qemu_log_mask(LOG_GUEST_ERROR,
55
- "%s: invalid command attributes "
56
- "devid %d or eventid %d or invalid dte %d or"
57
- "invalid cte %d or invalid ite %d\n",
58
- __func__, devid, eventid, dte_valid, cte_valid,
59
- ite_valid);
60
- /*
61
- * in this implementation, in case of error
62
- * we ignore this command and move onto the next
63
- * command in the queue
64
- */
65
+ "%s: invalid command attributes: devid %d>%d",
66
+ __func__, devid, s->dt.maxids.max_devids);
67
+
68
+ } else if (!dte_valid || !ite_valid || !cte_valid) {
69
+ qemu_log_mask(LOG_GUEST_ERROR,
70
+ "%s: invalid command attributes: "
71
+ "dte: %s, ite: %s, cte: %s\n",
72
+ __func__,
73
+ dte_valid ? "valid" : "invalid",
74
+ ite_valid ? "valid" : "invalid",
75
+ cte_valid ? "valid" : "invalid");
76
+ } else if (eventid > max_eventid) {
77
+ qemu_log_mask(LOG_GUEST_ERROR,
78
+ "%s: invalid command attributes: eventid %d > %d\n",
79
+ __func__, eventid, max_eventid);
80
} else {
81
/*
82
* Current implementation only supports rdbase == procnum
64
--
83
--
65
2.20.1
84
2.25.1
66
85
67
86
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
Unify add/sub helpers and add a parameter for rounding.
3
Add X11, FP5280G2, G220A, Rainier and Fuji. Mention that Swift will be
4
This will allow saturating non-rounding to reuse this code.
4
removed in v7.0.
5
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Joel Stanley <joel@jms.id.au>
7
[PMM: fixed accidental use of '=' rather than '+=' in do_sqrdmlah_s]
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20211117065752.330632-2-joel@jms.id.au
9
Message-id: 20200815013145.539409-15-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
target/arm/vec_helper.c | 80 +++++++++++++++--------------------------
11
docs/system/arm/aspeed.rst | 7 ++++++-
13
1 file changed, 29 insertions(+), 51 deletions(-)
12
1 file changed, 6 insertions(+), 1 deletion(-)
14
13
15
diff --git a/target/arm/vec_helper.c b/target/arm/vec_helper.c
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/vec_helper.c
16
--- a/docs/system/arm/aspeed.rst
18
+++ b/target/arm/vec_helper.c
17
+++ b/docs/system/arm/aspeed.rst
19
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ AST2400 SoC based machines :
20
#endif
19
21
20
- ``palmetto-bmc`` OpenPOWER Palmetto POWER8 BMC
22
/* Signed saturating rounding doubling multiply-accumulate high half, 16-bit */
21
- ``quanta-q71l-bmc`` OpenBMC Quanta BMC
23
-static int16_t inl_qrdmlah_s16(int16_t src1, int16_t src2,
22
+- ``supermicrox11-bmc`` Supermicro X11 BMC
24
- int16_t src3, uint32_t *sat)
23
25
+static int16_t do_sqrdmlah_h(int16_t src1, int16_t src2, int16_t src3,
24
AST2500 SoC based machines :
26
+ bool neg, bool round, uint32_t *sat)
25
27
{
26
@@ -XXX,XX +XXX,XX @@ AST2500 SoC based machines :
28
- /* Simplify:
27
- ``romulus-bmc`` OpenPOWER Romulus POWER9 BMC
29
+ /*
28
- ``witherspoon-bmc`` OpenPOWER Witherspoon POWER9 BMC
30
+ * Simplify:
29
- ``sonorapass-bmc`` OCP SonoraPass BMC
31
* = ((a3 << 16) + ((e1 * e2) << 1) + (1 << 15)) >> 16
30
-- ``swift-bmc`` OpenPOWER Swift BMC POWER9
32
* = ((a3 << 15) + (e1 * e2) + (1 << 14)) >> 15
31
+- ``swift-bmc`` OpenPOWER Swift BMC POWER9 (to be removed in v7.0)
33
*/
32
+- ``fp5280g2-bmc`` Inspur FP5280G2 BMC
34
int32_t ret = (int32_t)src1 * src2;
33
+- ``g220a-bmc`` Bytedance G220A BMC
35
- ret = ((int32_t)src3 << 15) + ret + (1 << 14);
34
36
+ if (neg) {
35
AST2600 SoC based machines :
37
+ ret = -ret;
36
38
+ }
37
- ``ast2600-evb`` Aspeed AST2600 Evaluation board (Cortex-A7)
39
+ ret += ((int32_t)src3 << 15) + (round << 14);
38
- ``tacoma-bmc`` OpenPOWER Witherspoon POWER9 AST2600 BMC
40
ret >>= 15;
39
+- ``rainier-bmc`` IBM Rainier POWER10 BMC
41
+
40
+- ``fuji-bmc`` Facebook Fuji BMC
42
if (ret != (int16_t)ret) {
41
43
*sat = 1;
42
Supported devices
44
- ret = (ret < 0 ? -0x8000 : 0x7fff);
43
-----------------
45
+ ret = (ret < 0 ? INT16_MIN : INT16_MAX);
46
}
47
return ret;
48
}
49
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(neon_qrdmlah_s16)(CPUARMState *env, uint32_t src1,
50
uint32_t src2, uint32_t src3)
51
{
52
uint32_t *sat = &env->vfp.qc[0];
53
- uint16_t e1 = inl_qrdmlah_s16(src1, src2, src3, sat);
54
- uint16_t e2 = inl_qrdmlah_s16(src1 >> 16, src2 >> 16, src3 >> 16, sat);
55
+ uint16_t e1 = do_sqrdmlah_h(src1, src2, src3, false, true, sat);
56
+ uint16_t e2 = do_sqrdmlah_h(src1 >> 16, src2 >> 16, src3 >> 16,
57
+ false, true, sat);
58
return deposit32(e1, 16, 16, e2);
59
}
60
61
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_qrdmlah_s16)(void *vd, void *vn, void *vm,
62
uintptr_t i;
63
64
for (i = 0; i < opr_sz / 2; ++i) {
65
- d[i] = inl_qrdmlah_s16(n[i], m[i], d[i], vq);
66
+ d[i] = do_sqrdmlah_h(n[i], m[i], d[i], false, true, vq);
67
}
68
clear_tail(d, opr_sz, simd_maxsz(desc));
69
}
70
71
-/* Signed saturating rounding doubling multiply-subtract high half, 16-bit */
72
-static int16_t inl_qrdmlsh_s16(int16_t src1, int16_t src2,
73
- int16_t src3, uint32_t *sat)
74
-{
75
- /* Similarly, using subtraction:
76
- * = ((a3 << 16) - ((e1 * e2) << 1) + (1 << 15)) >> 16
77
- * = ((a3 << 15) - (e1 * e2) + (1 << 14)) >> 15
78
- */
79
- int32_t ret = (int32_t)src1 * src2;
80
- ret = ((int32_t)src3 << 15) - ret + (1 << 14);
81
- ret >>= 15;
82
- if (ret != (int16_t)ret) {
83
- *sat = 1;
84
- ret = (ret < 0 ? -0x8000 : 0x7fff);
85
- }
86
- return ret;
87
-}
88
-
89
uint32_t HELPER(neon_qrdmlsh_s16)(CPUARMState *env, uint32_t src1,
90
uint32_t src2, uint32_t src3)
91
{
92
uint32_t *sat = &env->vfp.qc[0];
93
- uint16_t e1 = inl_qrdmlsh_s16(src1, src2, src3, sat);
94
- uint16_t e2 = inl_qrdmlsh_s16(src1 >> 16, src2 >> 16, src3 >> 16, sat);
95
+ uint16_t e1 = do_sqrdmlah_h(src1, src2, src3, true, true, sat);
96
+ uint16_t e2 = do_sqrdmlah_h(src1 >> 16, src2 >> 16, src3 >> 16,
97
+ true, true, sat);
98
return deposit32(e1, 16, 16, e2);
99
}
100
101
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_qrdmlsh_s16)(void *vd, void *vn, void *vm,
102
uintptr_t i;
103
104
for (i = 0; i < opr_sz / 2; ++i) {
105
- d[i] = inl_qrdmlsh_s16(n[i], m[i], d[i], vq);
106
+ d[i] = do_sqrdmlah_h(n[i], m[i], d[i], true, true, vq);
107
}
108
clear_tail(d, opr_sz, simd_maxsz(desc));
109
}
110
111
/* Signed saturating rounding doubling multiply-accumulate high half, 32-bit */
112
-static int32_t inl_qrdmlah_s32(int32_t src1, int32_t src2,
113
- int32_t src3, uint32_t *sat)
114
+static int32_t do_sqrdmlah_s(int32_t src1, int32_t src2, int32_t src3,
115
+ bool neg, bool round, uint32_t *sat)
116
{
117
/* Simplify similarly to int_qrdmlah_s16 above. */
118
int64_t ret = (int64_t)src1 * src2;
119
- ret = ((int64_t)src3 << 31) + ret + (1 << 30);
120
+ if (neg) {
121
+ ret = -ret;
122
+ }
123
+ ret += ((int64_t)src3 << 31) + (round << 30);
124
ret >>= 31;
125
+
126
if (ret != (int32_t)ret) {
127
*sat = 1;
128
ret = (ret < 0 ? INT32_MIN : INT32_MAX);
129
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(neon_qrdmlah_s32)(CPUARMState *env, int32_t src1,
130
int32_t src2, int32_t src3)
131
{
132
uint32_t *sat = &env->vfp.qc[0];
133
- return inl_qrdmlah_s32(src1, src2, src3, sat);
134
+ return do_sqrdmlah_s(src1, src2, src3, false, true, sat);
135
}
136
137
void HELPER(gvec_qrdmlah_s32)(void *vd, void *vn, void *vm,
138
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_qrdmlah_s32)(void *vd, void *vn, void *vm,
139
uintptr_t i;
140
141
for (i = 0; i < opr_sz / 4; ++i) {
142
- d[i] = inl_qrdmlah_s32(n[i], m[i], d[i], vq);
143
+ d[i] = do_sqrdmlah_s(n[i], m[i], d[i], false, true, vq);
144
}
145
clear_tail(d, opr_sz, simd_maxsz(desc));
146
}
147
148
-/* Signed saturating rounding doubling multiply-subtract high half, 32-bit */
149
-static int32_t inl_qrdmlsh_s32(int32_t src1, int32_t src2,
150
- int32_t src3, uint32_t *sat)
151
-{
152
- /* Simplify similarly to int_qrdmlsh_s16 above. */
153
- int64_t ret = (int64_t)src1 * src2;
154
- ret = ((int64_t)src3 << 31) - ret + (1 << 30);
155
- ret >>= 31;
156
- if (ret != (int32_t)ret) {
157
- *sat = 1;
158
- ret = (ret < 0 ? INT32_MIN : INT32_MAX);
159
- }
160
- return ret;
161
-}
162
-
163
uint32_t HELPER(neon_qrdmlsh_s32)(CPUARMState *env, int32_t src1,
164
int32_t src2, int32_t src3)
165
{
166
uint32_t *sat = &env->vfp.qc[0];
167
- return inl_qrdmlsh_s32(src1, src2, src3, sat);
168
+ return do_sqrdmlah_s(src1, src2, src3, true, true, sat);
169
}
170
171
void HELPER(gvec_qrdmlsh_s32)(void *vd, void *vn, void *vm,
172
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_qrdmlsh_s32)(void *vd, void *vn, void *vm,
173
uintptr_t i;
174
175
for (i = 0; i < opr_sz / 4; ++i) {
176
- d[i] = inl_qrdmlsh_s32(n[i], m[i], d[i], vq);
177
+ d[i] = do_sqrdmlah_s(n[i], m[i], d[i], true, true, vq);
178
}
179
clear_tail(d, opr_sz, simd_maxsz(desc));
180
}
181
--
44
--
182
2.20.1
45
2.25.1
183
46
184
47
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
Rather than require the user to fill in the immediate (shl or shr),
3
This is the latest URL for the OpenBMC CI. The old URL still works, but
4
create full formats that include the immediate.
4
redirects.
5
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Joel Stanley <joel@jms.id.au>
8
Message-id: 20200815013145.539409-14-richard.henderson@linaro.org
8
Message-id: 20211117065752.330632-3-joel@jms.id.au
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/sve.decode | 35 ++++++++++++++++-------------------
11
docs/system/arm/aspeed.rst | 2 +-
12
1 file changed, 16 insertions(+), 19 deletions(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
13
14
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/sve.decode
16
--- a/docs/system/arm/aspeed.rst
17
+++ b/target/arm/sve.decode
17
+++ b/docs/system/arm/aspeed.rst
18
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ The Aspeed machines can be started using the ``-kernel`` option to
19
@rd_rn_i6 ........ ... rn:5 ..... imm:s6 rd:5 &rri
19
load a Linux kernel or from a firmware. Images can be downloaded from
20
20
the OpenBMC jenkins :
21
# Two register operand, one immediate operand, with predicate,
21
22
-# element size encoded as TSZHL. User must fill in imm.
22
- https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/distro=ubuntu,label=docker-builder
23
-@rdn_pg_tszimm ........ .. ... ... ... pg:3 ..... rd:5 \
23
+ https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/
24
- &rpri_esz rn=%reg_movprfx esz=%tszimm_esz
24
25
+# element size encoded as TSZHL.
25
or directly from the OpenBMC GitHub release repository :
26
+@rdn_pg_tszimm_shl ........ .. ... ... ... pg:3 ..... rd:5 \
26
27
+ &rpri_esz rn=%reg_movprfx esz=%tszimm_esz imm=%tszimm_shl
28
+@rdn_pg_tszimm_shr ........ .. ... ... ... pg:3 ..... rd:5 \
29
+ &rpri_esz rn=%reg_movprfx esz=%tszimm_esz imm=%tszimm_shr
30
31
# Similarly without predicate.
32
-@rd_rn_tszimm ........ .. ... ... ...... rn:5 rd:5 \
33
- &rri_esz esz=%tszimm16_esz
34
+@rd_rn_tszimm_shl ........ .. ... ... ...... rn:5 rd:5 \
35
+ &rri_esz esz=%tszimm16_esz imm=%tszimm16_shl
36
+@rd_rn_tszimm_shr ........ .. ... ... ...... rn:5 rd:5 \
37
+ &rri_esz esz=%tszimm16_esz imm=%tszimm16_shr
38
39
# Two register operand, one immediate operand, with 4-bit predicate.
40
# User must fill in imm.
41
@@ -XXX,XX +XXX,XX @@ UMINV 00000100 .. 001 011 001 ... ..... ..... @rd_pg_rn
42
### SVE Shift by Immediate - Predicated Group
43
44
# SVE bitwise shift by immediate (predicated)
45
-ASR_zpzi 00000100 .. 000 000 100 ... .. ... ..... \
46
- @rdn_pg_tszimm imm=%tszimm_shr
47
-LSR_zpzi 00000100 .. 000 001 100 ... .. ... ..... \
48
- @rdn_pg_tszimm imm=%tszimm_shr
49
-LSL_zpzi 00000100 .. 000 011 100 ... .. ... ..... \
50
- @rdn_pg_tszimm imm=%tszimm_shl
51
-ASRD 00000100 .. 000 100 100 ... .. ... ..... \
52
- @rdn_pg_tszimm imm=%tszimm_shr
53
+ASR_zpzi 00000100 .. 000 000 100 ... .. ... ..... @rdn_pg_tszimm_shr
54
+LSR_zpzi 00000100 .. 000 001 100 ... .. ... ..... @rdn_pg_tszimm_shr
55
+LSL_zpzi 00000100 .. 000 011 100 ... .. ... ..... @rdn_pg_tszimm_shl
56
+ASRD 00000100 .. 000 100 100 ... .. ... ..... @rdn_pg_tszimm_shr
57
58
# SVE bitwise shift by vector (predicated)
59
ASR_zpzz 00000100 .. 010 000 100 ... ..... ..... @rdn_pg_rm
60
@@ -XXX,XX +XXX,XX @@ RDVL 00000100 101 11111 01010 imm:s6 rd:5
61
### SVE Bitwise Shift - Unpredicated Group
62
63
# SVE bitwise shift by immediate (unpredicated)
64
-ASR_zzi 00000100 .. 1 ..... 1001 00 ..... ..... \
65
- @rd_rn_tszimm imm=%tszimm16_shr
66
-LSR_zzi 00000100 .. 1 ..... 1001 01 ..... ..... \
67
- @rd_rn_tszimm imm=%tszimm16_shr
68
-LSL_zzi 00000100 .. 1 ..... 1001 11 ..... ..... \
69
- @rd_rn_tszimm imm=%tszimm16_shl
70
+ASR_zzi 00000100 .. 1 ..... 1001 00 ..... ..... @rd_rn_tszimm_shr
71
+LSR_zzi 00000100 .. 1 ..... 1001 01 ..... ..... @rd_rn_tszimm_shr
72
+LSL_zzi 00000100 .. 1 ..... 1001 11 ..... ..... @rd_rn_tszimm_shl
73
74
# SVE bitwise shift by wide elements (unpredicated)
75
# Note esz != 3
76
--
27
--
77
2.20.1
28
2.25.1
78
29
79
30
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
A common use case for the ASPEED machine is to boot a Linux kernel.
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Provide a full example command line.
5
Message-id: 20200815013145.539409-13-richard.henderson@linaro.org
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
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/translate-sve.c | 20 ++++++++++++--------
11
docs/system/arm/aspeed.rst | 15 ++++++++++++---
9
1 file changed, 12 insertions(+), 8 deletions(-)
12
1 file changed, 12 insertions(+), 3 deletions(-)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/docs/system/arm/aspeed.rst
14
+++ b/target/arm/translate-sve.c
17
+++ b/docs/system/arm/aspeed.rst
15
@@ -XXX,XX +XXX,XX @@ static int pred_gvec_reg_size(DisasContext *s)
18
@@ -XXX,XX +XXX,XX @@ Missing devices
16
return size_for_gvec(pred_full_reg_size(s));
19
Boot options
17
}
20
------------
18
21
19
+/* Invoke an out-of-line helper on 2 Zregs. */
22
-The Aspeed machines can be started using the ``-kernel`` option to
20
+static void gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
23
-load a Linux kernel or from a firmware. Images can be downloaded from
21
+ int rd, int rn, int data)
24
-the OpenBMC jenkins :
22
+{
25
+The Aspeed machines can be started using the ``-kernel`` and ``-dtb`` options
23
+ unsigned vsz = vec_full_reg_size(s);
26
+to load a Linux kernel or from a firmware. Images can be downloaded from the
24
+ tcg_gen_gvec_2_ool(vec_full_reg_offset(s, rd),
27
+OpenBMC jenkins :
25
+ vec_full_reg_offset(s, rn),
28
26
+ vsz, vsz, data, fn);
29
https://jenkins.openbmc.org/job/ci-openbmc/lastSuccessfulBuild/
27
+}
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:
28
+
36
+
29
/* Invoke an out-of-line helper on 3 Zregs. */
37
+.. code-block:: bash
30
static void gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
38
+
31
int rd, int rn, int rm, int data)
39
+ $ qemu-system-arm -M ast2600-evb -nographic \
32
@@ -XXX,XX +XXX,XX @@ static bool trans_FEXPA(DisasContext *s, arg_rr_esz *a)
40
+ -kernel arch/arm/boot/zImage \
33
return false;
41
+ -dtb arch/arm/boot/dts/aspeed-ast2600-evb.dtb \
34
}
42
+ -initrd rootfs.cpio
35
if (sve_access_check(s)) {
43
+
36
- unsigned vsz = vec_full_reg_size(s);
44
The image should be attached as an MTD drive. Run :
37
- tcg_gen_gvec_2_ool(vec_full_reg_offset(s, a->rd),
45
38
- vec_full_reg_offset(s, a->rn),
46
.. code-block:: bash
39
- vsz, vsz, 0, fns[a->esz]);
40
+ gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
41
}
42
return true;
43
}
44
@@ -XXX,XX +XXX,XX @@ static bool trans_REV_v(DisasContext *s, arg_rr_esz *a)
45
};
46
47
if (sve_access_check(s)) {
48
- unsigned vsz = vec_full_reg_size(s);
49
- tcg_gen_gvec_2_ool(vec_full_reg_offset(s, a->rd),
50
- vec_full_reg_offset(s, a->rn),
51
- vsz, vsz, 0, fns[a->esz]);
52
+ gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
53
}
54
return true;
55
}
56
--
47
--
57
2.20.1
48
2.25.1
58
49
59
50
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Move it to the supported list.
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
5
Message-id: 20200815013145.539409-12-richard.henderson@linaro.org
5
Signed-off-by: Joel Stanley <joel@jms.id.au>
6
Message-id: 20211117065752.330632-5-joel@jms.id.au
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
---
8
target/arm/translate-sve.c | 53 +++++++++++++-------------------------
9
docs/system/arm/aspeed.rst | 2 +-
9
1 file changed, 18 insertions(+), 35 deletions(-)
10
1 file changed, 1 insertion(+), 1 deletion(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/docs/system/arm/aspeed.rst
14
+++ b/target/arm/translate-sve.c
15
+++ b/docs/system/arm/aspeed.rst
15
@@ -XXX,XX +XXX,XX @@ static int pred_gvec_reg_size(DisasContext *s)
16
@@ -XXX,XX +XXX,XX @@ Supported devices
16
return size_for_gvec(pred_full_reg_size(s));
17
* Front LEDs (PCA9552 on I2C bus)
17
}
18
* LPC Peripheral Controller (a subset of subdevices are supported)
18
19
* Hash/Crypto Engine (HACE) - Hash support only. TODO: HMAC and RSA
19
+/* Invoke an out-of-line helper on 3 Zregs. */
20
+ * ADC
20
+static void gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
21
21
+ int rd, int rn, int rm, int data)
22
22
+{
23
Missing devices
23
+ unsigned vsz = vec_full_reg_size(s);
24
---------------
24
+ tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
25
25
+ vec_full_reg_offset(s, rn),
26
* Coprocessor support
26
+ vec_full_reg_offset(s, rm),
27
- * ADC (out of tree implementation)
27
+ vsz, vsz, data, fn);
28
* PWM and Fan Controller
28
+}
29
* Slave GPIO Controller
29
+
30
* Super I/O Controller
30
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
31
static void gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
32
int rd, int rn, int pg, int data)
33
@@ -XXX,XX +XXX,XX @@ static bool do_zzw_ool(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
34
return false;
35
}
36
if (sve_access_check(s)) {
37
- unsigned vsz = vec_full_reg_size(s);
38
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
39
- vec_full_reg_offset(s, a->rn),
40
- vec_full_reg_offset(s, a->rm),
41
- vsz, vsz, 0, fn);
42
+ gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
43
}
44
return true;
45
}
46
@@ -XXX,XX +XXX,XX @@ static bool trans_RDVL(DisasContext *s, arg_RDVL *a)
47
static bool do_adr(DisasContext *s, arg_rrri *a, gen_helper_gvec_3 *fn)
48
{
49
if (sve_access_check(s)) {
50
- unsigned vsz = vec_full_reg_size(s);
51
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
52
- vec_full_reg_offset(s, a->rn),
53
- vec_full_reg_offset(s, a->rm),
54
- vsz, vsz, a->imm, fn);
55
+ gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, a->imm);
56
}
57
return true;
58
}
59
@@ -XXX,XX +XXX,XX @@ static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
60
return false;
61
}
62
if (sve_access_check(s)) {
63
- unsigned vsz = vec_full_reg_size(s);
64
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
65
- vec_full_reg_offset(s, a->rn),
66
- vec_full_reg_offset(s, a->rm),
67
- vsz, vsz, 0, fns[a->esz]);
68
+ gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
69
}
70
return true;
71
}
72
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
73
};
74
75
if (sve_access_check(s)) {
76
- unsigned vsz = vec_full_reg_size(s);
77
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
78
- vec_full_reg_offset(s, a->rn),
79
- vec_full_reg_offset(s, a->rm),
80
- vsz, vsz, 0, fns[a->esz]);
81
+ gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
82
}
83
return true;
84
}
85
@@ -XXX,XX +XXX,XX @@ static bool do_zzz_data_ool(DisasContext *s, arg_rrr_esz *a, int data,
86
gen_helper_gvec_3 *fn)
87
{
88
if (sve_access_check(s)) {
89
- unsigned vsz = vec_full_reg_size(s);
90
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
91
- vec_full_reg_offset(s, a->rn),
92
- vec_full_reg_offset(s, a->rm),
93
- vsz, vsz, data, fn);
94
+ gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
95
}
96
return true;
97
}
98
@@ -XXX,XX +XXX,XX @@ static bool trans_DOT_zzz(DisasContext *s, arg_DOT_zzz *a)
99
};
100
101
if (sve_access_check(s)) {
102
- unsigned vsz = vec_full_reg_size(s);
103
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
104
- vec_full_reg_offset(s, a->rn),
105
- vec_full_reg_offset(s, a->rm),
106
- vsz, vsz, 0, fns[a->u][a->sz]);
107
+ gen_gvec_ool_zzz(s, fns[a->u][a->sz], a->rd, a->rn, a->rm, 0);
108
}
109
return true;
110
}
111
@@ -XXX,XX +XXX,XX @@ static bool trans_DOT_zzx(DisasContext *s, arg_DOT_zzx *a)
112
};
113
114
if (sve_access_check(s)) {
115
- unsigned vsz = vec_full_reg_size(s);
116
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
117
- vec_full_reg_offset(s, a->rn),
118
- vec_full_reg_offset(s, a->rm),
119
- vsz, vsz, a->index, fns[a->u][a->sz]);
120
+ gen_gvec_ool_zzz(s, fns[a->u][a->sz], a->rd, a->rn, a->rm, a->index);
121
}
122
return true;
123
}
124
--
31
--
125
2.20.1
32
2.25.1
126
33
127
34
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Olivier Hériveaux <olivier.heriveaux@ledger.fr>
2
2
3
Model after gen_gvec_fn_zzz et al.
3
Fix issue where the data register may be overwritten by next character
4
reception before being read and returned.
4
5
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Olivier Hériveaux <olivier.heriveaux@ledger.fr>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20200815013145.539409-9-richard.henderson@linaro.org
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20211128120723.4053-1-olivier.heriveaux@ledger.fr
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
11
---
10
target/arm/translate-sve.c | 35 ++++++++++++++++-------------------
12
hw/char/stm32f2xx_usart.c | 3 ++-
11
1 file changed, 16 insertions(+), 19 deletions(-)
13
1 file changed, 2 insertions(+), 1 deletion(-)
12
14
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/hw/char/stm32f2xx_usart.c b/hw/char/stm32f2xx_usart.c
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
17
--- a/hw/char/stm32f2xx_usart.c
16
+++ b/target/arm/translate-sve.c
18
+++ b/hw/char/stm32f2xx_usart.c
17
@@ -XXX,XX +XXX,XX @@ static int pred_gvec_reg_size(DisasContext *s)
19
@@ -XXX,XX +XXX,XX @@ static uint64_t stm32f2xx_usart_read(void *opaque, hwaddr addr,
18
return size_for_gvec(pred_full_reg_size(s));
20
return retvalue;
19
}
21
case USART_DR:
20
22
DB_PRINT("Value: 0x%" PRIx32 ", %c\n", s->usart_dr, (char) s->usart_dr);
21
-/* Invoke a vector expander on two Zregs. */
23
+ retvalue = s->usart_dr & 0x3FF;
22
+/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
24
s->usart_sr &= ~USART_SR_RXNE;
23
+static void gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
25
qemu_chr_fe_accept_input(&s->chr);
24
+ int rd, int rn, int rm, int pg, int data)
26
qemu_set_irq(s->irq, 0);
25
+{
27
- return s->usart_dr & 0x3FF;
26
+ unsigned vsz = vec_full_reg_size(s);
28
+ return retvalue;
27
+ tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
29
case USART_BRR:
28
+ vec_full_reg_offset(s, rn),
30
return s->usart_brr;
29
+ vec_full_reg_offset(s, rm),
31
case USART_CR1:
30
+ pred_full_reg_offset(s, pg),
31
+ vsz, vsz, data, fn);
32
+}
33
34
+/* Invoke a vector expander on two Zregs. */
35
static void gen_gvec_fn_zz(DisasContext *s, GVecGen2Fn *gvec_fn,
36
int esz, int rd, int rn)
37
{
38
@@ -XXX,XX +XXX,XX @@ static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
39
40
static bool do_zpzz_ool(DisasContext *s, arg_rprr_esz *a, gen_helper_gvec_4 *fn)
41
{
42
- unsigned vsz = vec_full_reg_size(s);
43
if (fn == NULL) {
44
return false;
45
}
46
if (sve_access_check(s)) {
47
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, a->rd),
48
- vec_full_reg_offset(s, a->rn),
49
- vec_full_reg_offset(s, a->rm),
50
- pred_full_reg_offset(s, a->pg),
51
- vsz, vsz, 0, fn);
52
+ gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, 0);
53
}
54
return true;
55
}
56
@@ -XXX,XX +XXX,XX @@ static void do_sel_z(DisasContext *s, int rd, int rn, int rm, int pg, int esz)
57
gen_helper_sve_sel_zpzz_b, gen_helper_sve_sel_zpzz_h,
58
gen_helper_sve_sel_zpzz_s, gen_helper_sve_sel_zpzz_d
59
};
60
- unsigned vsz = vec_full_reg_size(s);
61
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
62
- vec_full_reg_offset(s, rn),
63
- vec_full_reg_offset(s, rm),
64
- pred_full_reg_offset(s, pg),
65
- vsz, vsz, 0, fns[esz]);
66
+ gen_gvec_ool_zzzp(s, fns[esz], rd, rn, rm, pg, 0);
67
}
68
69
#define DO_ZPZZ(NAME, name) \
70
@@ -XXX,XX +XXX,XX @@ static bool trans_RBIT(DisasContext *s, arg_rpr_esz *a)
71
static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
72
{
73
if (sve_access_check(s)) {
74
- unsigned vsz = vec_full_reg_size(s);
75
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, a->rd),
76
- vec_full_reg_offset(s, a->rn),
77
- vec_full_reg_offset(s, a->rm),
78
- pred_full_reg_offset(s, a->pg),
79
- vsz, vsz, a->esz, gen_helper_sve_splice);
80
+ gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
81
+ a->rd, a->rn, a->rm, a->pg, 0);
82
}
83
return true;
84
}
85
--
32
--
86
2.20.1
33
2.25.1
87
34
88
35
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
This is the only user of the function.
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".
4
8
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20200815013145.539409-6-richard.henderson@linaro.org
11
Message-id: 20211115223619.2599282-2-philmd@redhat.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
13
---
10
target/arm/translate-sve.c | 19 ++++++-------------
14
hw/intc/arm_gicv3_cpuif.c | 10 +---------
11
1 file changed, 6 insertions(+), 13 deletions(-)
15
hw/intc/arm_gicv3_cpuif_common.c | 22 ++++++++++++++++++++++
16
hw/intc/meson.build | 1 +
17
3 files changed, 24 insertions(+), 9 deletions(-)
18
create mode 100644 hw/intc/arm_gicv3_cpuif_common.c
12
19
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
20
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
14
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
22
--- a/hw/intc/arm_gicv3_cpuif.c
16
+++ b/target/arm/translate-sve.c
23
+++ b/hw/intc/arm_gicv3_cpuif.c
17
@@ -XXX,XX +XXX,XX @@ static void do_dupi_z(DisasContext *s, int rd, uint64_t word)
24
@@ -XXX,XX +XXX,XX @@
18
tcg_gen_gvec_dup_imm(MO_64, vec_full_reg_offset(s, rd), vsz, vsz, word);
25
/*
19
}
26
- * ARM Generic Interrupt Controller v3
20
27
+ * ARM Generic Interrupt Controller v3 (emulation)
21
-/* Invoke a vector expander on two Pregs. */
28
*
22
-static bool do_vector2_p(DisasContext *s, GVecGen2Fn *gvec_fn,
29
* Copyright (c) 2016 Linaro Limited
23
- int esz, int rd, int rn)
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)
24
-{
36
-{
25
- if (sve_access_check(s)) {
37
- ARMCPU *arm_cpu = ARM_CPU(cpu);
26
- unsigned psz = pred_gvec_reg_size(s);
38
- CPUARMState *env = &arm_cpu->env;
27
- gvec_fn(esz, pred_full_reg_offset(s, rd),
28
- pred_full_reg_offset(s, rn), psz, psz);
29
- }
30
- return true;
31
-}
32
-
39
-
33
/* Invoke a vector expander on three Pregs. */
40
- env->gicv3state = (void *)s;
34
static bool do_vector3_p(DisasContext *s, GVecGen3Fn *gvec_fn,
41
-};
35
int esz, int rd, int rn, int rm)
42
-
36
@@ -XXX,XX +XXX,XX @@ static bool do_vecop4_p(DisasContext *s, const GVecGen4 *gvec_op,
43
static GICv3CPUState *icc_cs_from_env(CPUARMState *env)
37
/* Invoke a vector move on two Pregs. */
38
static bool do_mov_p(DisasContext *s, int rd, int rn)
39
{
44
{
40
- return do_vector2_p(s, tcg_gen_gvec_mov, 0, rd, rn);
45
return env->gicv3state;
41
+ if (sve_access_check(s)) {
46
diff --git a/hw/intc/arm_gicv3_cpuif_common.c b/hw/intc/arm_gicv3_cpuif_common.c
42
+ unsigned psz = pred_gvec_reg_size(s);
47
new file mode 100644
43
+ tcg_gen_gvec_mov(MO_8, pred_full_reg_offset(s, rd),
48
index XXXXXXX..XXXXXXX
44
+ pred_full_reg_offset(s, rn), psz, psz);
49
--- /dev/null
45
+ }
50
+++ b/hw/intc/arm_gicv3_cpuif_common.c
46
+ return true;
51
@@ -XXX,XX +XXX,XX @@
47
}
52
+/* SPDX-License-Identifier: GPL-2.0-or-later */
48
53
+/*
49
/* Set the cpu flags as per a return from an SVE helper. */
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'))
50
--
86
--
51
2.20.1
87
2.25.1
52
88
53
89
diff view generated by jsdifflib
1
From: Eduardo Habkost <ehabkost@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
TYPE_ARM_SSE is a TYPE_SYS_BUS_DEVICE subclass, but
3
The TYPE_ARM_GICV3 device is an emulated one. When using
4
ARMSSEClass::parent_class is declared as DeviceClass.
4
KVM, it is recommended to use the TYPE_KVM_ARM_GICV3 device
5
(which uses in-kernel support).
5
6
6
It never caused any problems by pure luck:
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.
7
11
8
We were not setting class_size for TYPE_ARM_SSE, so class_size of
12
Therefore introduce the CONFIG_ARM_GIC_TCG Kconfig selector
9
TYPE_SYS_BUS_DEVICE was being used (sizeof(SysBusDeviceClass)).
13
which select the files required to have the TYPE_ARM_GICV3
10
This made the system allocate enough memory for TYPE_ARM_SSE
14
device, but also allowing to de-select this device.
11
devices even though ARMSSEClass was too small for a sysbus
12
device.
13
15
14
Additionally, the ARMSSEClass::info field ended up at the same
16
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
offset as SysBusDeviceClass::explicit_ofw_unit_address. This
16
would make sysbus_get_fw_dev_path() crash for the device.
17
Luckily, sysbus_get_fw_dev_path() never gets called for
18
TYPE_ARM_SSE devices, because qdev_get_fw_dev_path() is only used
19
by the boot device code, and TYPE_ARM_SSE devices don't appear at
20
the fw_boot_order list.
21
22
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
23
Message-id: 20200826181006.4097163-1-ehabkost@redhat.com
24
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Message-id: 20211115223619.2599282-3-philmd@redhat.com
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
---
20
---
27
include/hw/arm/armsse.h | 2 +-
21
hw/intc/arm_gicv3.c | 2 +-
28
hw/arm/armsse.c | 1 +
22
hw/intc/Kconfig | 5 +++++
29
2 files changed, 2 insertions(+), 1 deletion(-)
23
hw/intc/meson.build | 10 ++++++----
24
3 files changed, 12 insertions(+), 5 deletions(-)
30
25
31
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
26
diff --git a/hw/intc/arm_gicv3.c b/hw/intc/arm_gicv3.c
32
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
33
--- a/include/hw/arm/armsse.h
28
--- a/hw/intc/arm_gicv3.c
34
+++ b/include/hw/arm/armsse.h
29
+++ b/hw/intc/arm_gicv3.c
35
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
30
@@ -XXX,XX +XXX,XX @@
36
typedef struct ARMSSEInfo ARMSSEInfo;
31
/*
37
32
- * ARM Generic Interrupt Controller v3
38
typedef struct ARMSSEClass {
33
+ * ARM Generic Interrupt Controller v3 (emulation)
39
- DeviceClass parent_class;
34
*
40
+ SysBusDeviceClass parent_class;
35
* Copyright (c) 2015 Huawei.
41
const ARMSSEInfo *info;
36
* Copyright (c) 2016 Linaro Limited
42
} ARMSSEClass;
37
diff --git a/hw/intc/Kconfig b/hw/intc/Kconfig
43
44
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
45
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/arm/armsse.c
39
--- a/hw/intc/Kconfig
47
+++ b/hw/arm/armsse.c
40
+++ b/hw/intc/Kconfig
48
@@ -XXX,XX +XXX,XX @@ static const TypeInfo armsse_info = {
41
@@ -XXX,XX +XXX,XX @@ config APIC
49
.name = TYPE_ARMSSE,
42
select MSI_NONBROKEN
50
.parent = TYPE_SYS_BUS_DEVICE,
43
select I8259
51
.instance_size = sizeof(ARMSSE),
44
52
+ .class_size = sizeof(ARMSSEClass),
45
+config ARM_GIC_TCG
53
.instance_init = armsse_init,
46
+ bool
54
.abstract = true,
47
+ default y
55
.interfaces = (InterfaceInfo[]) {
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'))
56
--
84
--
57
2.20.1
85
2.25.1
58
86
59
87
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20200815013145.539409-20-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
---
6
---
8
target/arm/helper.h | 14 ++++++++++++++
7
target/arm/translate-a64.c | 7 ++++---
9
target/arm/translate-a64.c | 34 ++++++++++++++++++++++++++++++++++
8
1 file changed, 4 insertions(+), 3 deletions(-)
10
target/arm/vec_helper.c | 25 +++++++++++++++++++++++++
11
3 files changed, 73 insertions(+)
12
9
13
diff --git a/target/arm/helper.h b/target/arm/helper.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.h
16
+++ b/target/arm/helper.h
17
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_mul_idx_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
18
DEF_HELPER_FLAGS_4(gvec_mul_idx_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
19
DEF_HELPER_FLAGS_4(gvec_mul_idx_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
20
21
+DEF_HELPER_FLAGS_5(gvec_mla_idx_h, TCG_CALL_NO_RWG,
22
+ void, ptr, ptr, ptr, ptr, i32)
23
+DEF_HELPER_FLAGS_5(gvec_mla_idx_s, TCG_CALL_NO_RWG,
24
+ void, ptr, ptr, ptr, ptr, i32)
25
+DEF_HELPER_FLAGS_5(gvec_mla_idx_d, TCG_CALL_NO_RWG,
26
+ void, ptr, ptr, ptr, ptr, i32)
27
+
28
+DEF_HELPER_FLAGS_5(gvec_mls_idx_h, TCG_CALL_NO_RWG,
29
+ void, ptr, ptr, ptr, ptr, i32)
30
+DEF_HELPER_FLAGS_5(gvec_mls_idx_s, TCG_CALL_NO_RWG,
31
+ void, ptr, ptr, ptr, ptr, i32)
32
+DEF_HELPER_FLAGS_5(gvec_mls_idx_d, TCG_CALL_NO_RWG,
33
+ void, ptr, ptr, ptr, ptr, i32)
34
+
35
#ifdef TARGET_AARCH64
36
#include "helper-a64.h"
37
#include "helper-sve.h"
38
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
10
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
39
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
40
--- a/target/arm/translate-a64.c
12
--- a/target/arm/translate-a64.c
41
+++ b/target/arm/translate-a64.c
13
+++ b/target/arm/translate-a64.c
42
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
14
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
43
return;
15
{
44
}
16
DisasContext *s = container_of(dcbase, DisasContext, base);
45
break;
17
CPUARMState *env = cpu->env_ptr;
46
+
18
+ uint64_t pc = s->base.pc_next;
47
+ case 0x10: /* MLA */
19
uint32_t insn;
48
+ if (!is_long && !is_scalar) {
20
49
+ static gen_helper_gvec_4 * const fns[3] = {
21
if (s->ss_active && !s->pstate_ss) {
50
+ gen_helper_gvec_mla_idx_h,
22
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
51
+ gen_helper_gvec_mla_idx_s,
23
return;
52
+ gen_helper_gvec_mla_idx_d,
53
+ };
54
+ tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
55
+ vec_full_reg_offset(s, rn),
56
+ vec_full_reg_offset(s, rm),
57
+ vec_full_reg_offset(s, rd),
58
+ is_q ? 16 : 8, vec_full_reg_size(s),
59
+ index, fns[size - 1]);
60
+ return;
61
+ }
62
+ break;
63
+
64
+ case 0x14: /* MLS */
65
+ if (!is_long && !is_scalar) {
66
+ static gen_helper_gvec_4 * const fns[3] = {
67
+ gen_helper_gvec_mls_idx_h,
68
+ gen_helper_gvec_mls_idx_s,
69
+ gen_helper_gvec_mls_idx_d,
70
+ };
71
+ tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
72
+ vec_full_reg_offset(s, rn),
73
+ vec_full_reg_offset(s, rm),
74
+ vec_full_reg_offset(s, rd),
75
+ is_q ? 16 : 8, vec_full_reg_size(s),
76
+ index, fns[size - 1]);
77
+ return;
78
+ }
79
+ break;
80
}
24
}
81
25
82
if (size == 3) {
26
- s->pc_curr = s->base.pc_next;
83
diff --git a/target/arm/vec_helper.c b/target/arm/vec_helper.c
27
- insn = arm_ldl_code(env, &s->base, s->base.pc_next, s->sctlr_b);
84
index XXXXXXX..XXXXXXX 100644
28
+ s->pc_curr = pc;
85
--- a/target/arm/vec_helper.c
29
+ insn = arm_ldl_code(env, &s->base, pc, s->sctlr_b);
86
+++ b/target/arm/vec_helper.c
30
s->insn = insn;
87
@@ -XXX,XX +XXX,XX @@ DO_MUL_IDX(gvec_mul_idx_d, uint64_t, )
31
- s->base.pc_next += 4;
88
32
+ s->base.pc_next = pc + 4;
89
#undef DO_MUL_IDX
33
90
34
s->fp_access_checked = false;
91
+#define DO_MLA_IDX(NAME, TYPE, OP, H) \
35
s->sve_access_checked = false;
92
+void HELPER(NAME)(void *vd, void *vn, void *vm, void *va, uint32_t desc) \
93
+{ \
94
+ intptr_t i, j, oprsz = simd_oprsz(desc), segment = 16 / sizeof(TYPE); \
95
+ intptr_t idx = simd_data(desc); \
96
+ TYPE *d = vd, *n = vn, *m = vm, *a = va; \
97
+ for (i = 0; i < oprsz / sizeof(TYPE); i += segment) { \
98
+ TYPE mm = m[H(i + idx)]; \
99
+ for (j = 0; j < segment; j++) { \
100
+ d[i + j] = a[i + j] OP n[i + j] * mm; \
101
+ } \
102
+ } \
103
+ clear_tail(d, oprsz, simd_maxsz(desc)); \
104
+}
105
+
106
+DO_MLA_IDX(gvec_mla_idx_h, uint16_t, +, H2)
107
+DO_MLA_IDX(gvec_mla_idx_s, uint32_t, +, H4)
108
+DO_MLA_IDX(gvec_mla_idx_d, uint64_t, +, )
109
+
110
+DO_MLA_IDX(gvec_mls_idx_h, uint16_t, -, H2)
111
+DO_MLA_IDX(gvec_mls_idx_s, uint32_t, -, H4)
112
+DO_MLA_IDX(gvec_mls_idx_d, uint64_t, -, )
113
+
114
+#undef DO_MLA_IDX
115
+
116
#define DO_FMUL_IDX(NAME, TYPE, H) \
117
void HELPER(NAME)(void *vd, void *vn, void *vm, void *stat, uint32_t desc) \
118
{ \
119
--
36
--
120
2.20.1
37
2.25.1
121
38
122
39
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
According to AArch64.TagCheckFault, none of the other ISS values are
4
provided, so we do not need to go so far as merge_syn_data_abort.
5
But we were missing the WnR bit.
6
7
Tested-by: Andrey Konovalov <andreyknvl@google.com>
8
Reported-by: Andrey Konovalov <andreyknvl@google.com>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20200813200816.3037186-3-richard.henderson@linaro.org
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
6
---
14
target/arm/mte_helper.c | 9 +++++----
7
target/arm/translate.c | 9 +++++----
15
1 file changed, 5 insertions(+), 4 deletions(-)
8
1 file changed, 5 insertions(+), 4 deletions(-)
16
9
17
diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c
10
diff --git a/target/arm/translate.c b/target/arm/translate.c
18
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/mte_helper.c
12
--- a/target/arm/translate.c
20
+++ b/target/arm/mte_helper.c
13
+++ b/target/arm/translate.c
21
@@ -XXX,XX +XXX,XX @@ static void mte_check_fail(CPUARMState *env, uint32_t desc,
14
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
22
{
15
{
23
int mmu_idx = FIELD_EX32(desc, MTEDESC, MIDX);
16
DisasContext *dc = container_of(dcbase, DisasContext, base);
24
ARMMMUIdx arm_mmu_idx = core_to_aa64_mmu_idx(mmu_idx);
17
CPUARMState *env = cpu->env_ptr;
25
- int el, reg_el, tcf, select;
18
+ uint32_t pc = dc->base.pc_next;
26
+ int el, reg_el, tcf, select, is_write, syn;
19
unsigned int insn;
27
uint64_t sctlr;
20
28
21
if (arm_pre_translate_insn(dc)) {
29
reg_el = regime_el(env, arm_mmu_idx);
22
- dc->base.pc_next += 4;
30
@@ -XXX,XX +XXX,XX @@ static void mte_check_fail(CPUARMState *env, uint32_t desc,
23
+ dc->base.pc_next = pc + 4;
31
*/
24
return;
32
cpu_restore_state(env_cpu(env), ra, true);
25
}
33
env->exception.vaddress = dirty_ptr;
26
34
- raise_exception(env, EXCP_DATA_ABORT,
27
- dc->pc_curr = dc->base.pc_next;
35
- syn_data_abort_no_iss(el != 0, 0, 0, 0, 0, 0, 0x11),
28
- insn = arm_ldl_code(env, &dc->base, dc->base.pc_next, dc->sctlr_b);
36
- exception_target_el(env));
29
+ dc->pc_curr = pc;
37
+
30
+ insn = arm_ldl_code(env, &dc->base, pc, dc->sctlr_b);
38
+ is_write = FIELD_EX32(desc, MTEDESC, WRITE);
31
dc->insn = insn;
39
+ syn = syn_data_abort_no_iss(el != 0, 0, 0, 0, 0, is_write, 0x11);
32
- dc->base.pc_next += 4;
40
+ raise_exception(env, EXCP_DATA_ABORT, syn, exception_target_el(env));
33
+ dc->base.pc_next = pc + 4;
41
/* noreturn, but fall through to the assert anyway */
34
disas_arm_insn(dc, insn);
42
35
43
case 0:
36
arm_post_translate_insn(dc);
44
--
37
--
45
2.20.1
38
2.25.1
46
39
47
40
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
We need more information than just the mmu_idx in order
4
to create the proper exception syndrome. Only change the
5
function signature so far.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200813200816.3037186-2-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
6
---
12
target/arm/mte_helper.c | 10 +++++-----
7
target/arm/translate.c | 16 ++++++++--------
13
1 file changed, 5 insertions(+), 5 deletions(-)
8
1 file changed, 8 insertions(+), 8 deletions(-)
14
9
15
diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c
10
diff --git a/target/arm/translate.c b/target/arm/translate.c
16
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/mte_helper.c
12
--- a/target/arm/translate.c
18
+++ b/target/arm/mte_helper.c
13
+++ b/target/arm/translate.c
19
@@ -XXX,XX +XXX,XX @@ void HELPER(stzgm_tags)(CPUARMState *env, uint64_t ptr, uint64_t val)
14
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
20
}
21
22
/* Record a tag check failure. */
23
-static void mte_check_fail(CPUARMState *env, int mmu_idx,
24
+static void mte_check_fail(CPUARMState *env, uint32_t desc,
25
uint64_t dirty_ptr, uintptr_t ra)
26
{
15
{
27
+ int mmu_idx = FIELD_EX32(desc, MTEDESC, MIDX);
16
DisasContext *dc = container_of(dcbase, DisasContext, base);
28
ARMMMUIdx arm_mmu_idx = core_to_aa64_mmu_idx(mmu_idx);
17
CPUARMState *env = cpu->env_ptr;
29
int el, reg_el, tcf, select;
18
+ uint32_t pc = dc->base.pc_next;
30
uint64_t sctlr;
19
uint32_t insn;
31
@@ -XXX,XX +XXX,XX @@ uint64_t mte_check1(CPUARMState *env, uint32_t desc,
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;
32
}
26
}
33
27
34
if (unlikely(!mte_probe1_int(env, desc, ptr, ra, bit55))) {
28
- dc->pc_curr = dc->base.pc_next;
35
- int mmu_idx = FIELD_EX32(desc, MTEDESC, MIDX);
29
- insn = arm_lduw_code(env, &dc->base, dc->base.pc_next, dc->sctlr_b);
36
- mte_check_fail(env, mmu_idx, ptr, ra);
30
+ dc->pc_curr = pc;
37
+ mte_check_fail(env, desc, ptr, ra);
31
+ insn = arm_lduw_code(env, &dc->base, pc, dc->sctlr_b);
32
is_16bit = thumb_insn_is_16bit(dc, dc->base.pc_next, insn);
33
- dc->base.pc_next += 2;
34
+ pc += 2;
35
if (!is_16bit) {
36
- uint32_t insn2 = arm_lduw_code(env, &dc->base, dc->base.pc_next,
37
- dc->sctlr_b);
38
-
39
+ uint32_t insn2 = arm_lduw_code(env, &dc->base, pc, dc->sctlr_b);
40
insn = insn << 16 | insn2;
41
- dc->base.pc_next += 2;
42
+ pc += 2;
38
}
43
}
39
44
+ dc->base.pc_next = pc;
40
return useronly_clean_ptr(ptr);
45
dc->insn = insn;
41
@@ -XXX,XX +XXX,XX @@ uint64_t mte_checkN(CPUARMState *env, uint32_t desc,
46
42
47
if (dc->pstate_il) {
43
fail_ofs = tag_first + n * TAG_GRANULE - ptr;
44
fail_ofs = ROUND_UP(fail_ofs, esize);
45
- mte_check_fail(env, mmu_idx, ptr + fail_ofs, ra);
46
+ mte_check_fail(env, desc, ptr + fail_ofs, ra);
47
}
48
49
done:
50
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(mte_check_zva)(CPUARMState *env, uint32_t desc, uint64_t ptr)
51
fail:
52
/* Locate the first nibble that differs. */
53
i = ctz64(mem_tag ^ ptr_tag) >> 4;
54
- mte_check_fail(env, mmu_idx, align_ptr + i * TAG_GRANULE, ra);
55
+ mte_check_fail(env, desc, align_ptr + i * TAG_GRANULE, ra);
56
57
done:
58
return useronly_clean_ptr(ptr);
59
--
48
--
60
2.20.1
49
2.25.1
61
50
62
51
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Model the new function on gen_gvec_fn2 in translate-a64.c, but
3
Create arm_check_ss_active and arm_check_kernelpage.
4
indicating which kind of register and in which order. Since there
4
5
is only one user of do_vector2_z, fold it into do_mov_z.
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.
6
9
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20200815013145.539409-3-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
13
---
12
target/arm/translate-sve.c | 19 ++++++++++---------
14
target/arm/translate.c | 10 +++++++---
13
1 file changed, 10 insertions(+), 9 deletions(-)
15
1 file changed, 7 insertions(+), 3 deletions(-)
14
16
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
17
diff --git a/target/arm/translate.c b/target/arm/translate.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
19
--- a/target/arm/translate.c
18
+++ b/target/arm/translate-sve.c
20
+++ b/target/arm/translate.c
19
@@ -XXX,XX +XXX,XX @@ static int pred_gvec_reg_size(DisasContext *s)
21
@@ -XXX,XX +XXX,XX @@ static void arm_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
22
dc->insn_start = tcg_last_op();
20
}
23
}
21
24
22
/* Invoke a vector expander on two Zregs. */
25
-static bool arm_pre_translate_insn(DisasContext *dc)
23
-static bool do_vector2_z(DisasContext *s, GVecGen2Fn *gvec_fn,
26
+static bool arm_check_kernelpage(DisasContext *dc)
24
- int esz, int rd, int rn)
25
+
26
+static void gen_gvec_fn_zz(DisasContext *s, GVecGen2Fn *gvec_fn,
27
+ int esz, int rd, int rn)
28
{
27
{
29
- if (sve_access_check(s)) {
28
#ifdef CONFIG_USER_ONLY
30
- unsigned vsz = vec_full_reg_size(s);
29
/* Intercept jump to the magic kernel page. */
31
- gvec_fn(esz, vec_full_reg_offset(s, rd),
30
@@ -XXX,XX +XXX,XX @@ static bool arm_pre_translate_insn(DisasContext *dc)
32
- vec_full_reg_offset(s, rn), vsz, vsz);
31
return true;
33
- }
32
}
34
- return true;
33
#endif
35
+ unsigned vsz = vec_full_reg_size(s);
34
+ return false;
36
+ gvec_fn(esz, vec_full_reg_offset(s, rd),
35
+}
37
+ vec_full_reg_offset(s, rn), vsz, vsz);
36
38
}
37
+static bool arm_check_ss_active(DisasContext *dc)
39
38
+{
40
/* Invoke a vector expander on three Zregs. */
39
if (dc->ss_active && !dc->pstate_ss) {
41
@@ -XXX,XX +XXX,XX @@ static bool do_vector3_z(DisasContext *s, GVecGen3Fn *gvec_fn,
40
/* Singlestep state is Active-pending.
42
/* Invoke a vector move on two Zregs. */
41
* If we're in this state at the start of a TB then either
43
static bool do_mov_z(DisasContext *s, int rd, int rn)
42
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
44
{
43
uint32_t pc = dc->base.pc_next;
45
- return do_vector2_z(s, tcg_gen_gvec_mov, 0, rd, rn);
44
unsigned int insn;
46
+ if (sve_access_check(s)) {
45
47
+ gen_gvec_fn_zz(s, tcg_gen_gvec_mov, MO_8, rd, rn);
46
- if (arm_pre_translate_insn(dc)) {
48
+ }
47
+ if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
49
+ return true;
48
dc->base.pc_next = pc + 4;
50
}
49
return;
51
50
}
52
/* Initialize a Zreg with replications of a 64-bit immediate. */
51
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
52
uint32_t insn;
53
bool is_16bit;
54
55
- if (arm_pre_translate_insn(dc)) {
56
+ if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
57
dc->base.pc_next = pc + 2;
58
return;
59
}
53
--
60
--
54
2.20.1
61
2.25.1
55
62
56
63
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
We want to ensure that access is checked by the time we ask
3
The size of the code covered by a TranslationBlock cannot be 0;
4
for a specific fp/vector register. We want to ensure that
4
this is checked via assert in tb_gen_code.
5
we do not emit two lots of code to raise an exception.
6
7
But sometimes it's difficult to cleanly organize the code
8
such that we never pass through sve_check_access exactly once.
9
Allow multiple calls so long as the result is true, that is,
10
no exception to be raised.
11
5
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Message-id: 20200815013145.539409-5-richard.henderson@linaro.org
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
9
---
17
target/arm/translate.h | 1 +
10
target/arm/translate-a64.c | 1 +
18
target/arm/translate-a64.c | 27 ++++++++++++++++-----------
11
1 file changed, 1 insertion(+)
19
2 files changed, 17 insertions(+), 11 deletions(-)
20
12
21
diff --git a/target/arm/translate.h b/target/arm/translate.h
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/translate.h
24
+++ b/target/arm/translate.h
25
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
26
* that it is set at the point where we actually touch the FP regs.
27
*/
28
bool fp_access_checked;
29
+ bool sve_access_checked;
30
/* ARMv8 single-step state (this is distinct from the QEMU gdbstub
31
* single-step support).
32
*/
33
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
34
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/translate-a64.c
15
--- a/target/arm/translate-a64.c
36
+++ b/target/arm/translate-a64.c
16
+++ b/target/arm/translate-a64.c
37
@@ -XXX,XX +XXX,XX @@ static void do_vec_ld(DisasContext *s, int destidx, int element,
17
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
38
* unallocated-encoding checks (otherwise the syndrome information
18
assert(s->base.num_insns == 1);
39
* for the resulting exception will be incorrect).
19
gen_swstep_exception(s, 0, 0);
40
*/
20
s->base.is_jmp = DISAS_NORETURN;
41
-static inline bool fp_access_check(DisasContext *s)
21
+ s->base.pc_next = pc + 4;
42
+static bool fp_access_check(DisasContext *s)
22
return;
43
{
44
- assert(!s->fp_access_checked);
45
- s->fp_access_checked = true;
46
+ if (s->fp_excp_el) {
47
+ assert(!s->fp_access_checked);
48
+ s->fp_access_checked = true;
49
50
- if (!s->fp_excp_el) {
51
- return true;
52
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
53
+ syn_fp_access_trap(1, 0xe, false), s->fp_excp_el);
54
+ return false;
55
}
23
}
56
-
24
57
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
58
- syn_fp_access_trap(1, 0xe, false), s->fp_excp_el);
59
- return false;
60
+ s->fp_access_checked = true;
61
+ return true;
62
}
63
64
/* Check that SVE access is enabled. If it is, return true.
65
@@ -XXX,XX +XXX,XX @@ static inline bool fp_access_check(DisasContext *s)
66
bool sve_access_check(DisasContext *s)
67
{
68
if (s->sve_excp_el) {
69
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_sve_access_trap(),
70
- s->sve_excp_el);
71
+ assert(!s->sve_access_checked);
72
+ s->sve_access_checked = true;
73
+
74
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
75
+ syn_sve_access_trap(), s->sve_excp_el);
76
return false;
77
}
78
+ s->sve_access_checked = true;
79
return fp_access_check(s);
80
}
81
82
@@ -XXX,XX +XXX,XX @@ static void disas_a64_insn(CPUARMState *env, DisasContext *s)
83
s->base.pc_next += 4;
84
85
s->fp_access_checked = false;
86
+ s->sve_access_checked = false;
87
88
if (dc_isar_feature(aa64_bti, s)) {
89
if (s->base.num_insns == 1) {
90
--
25
--
91
2.20.1
26
2.25.1
92
27
93
28
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Model after gen_gvec_fn_zzz et al.
3
We will reuse this section of arm_deliver_fault for
4
raising pc alignment faults.
4
5
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20200815013145.539409-11-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
9
---
10
target/arm/translate-sve.c | 29 ++++++++++++++---------------
10
target/arm/tlb_helper.c | 45 +++++++++++++++++++++++++----------------
11
1 file changed, 14 insertions(+), 15 deletions(-)
11
1 file changed, 28 insertions(+), 17 deletions(-)
12
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
diff --git a/target/arm/tlb_helper.c b/target/arm/tlb_helper.c
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
15
--- a/target/arm/tlb_helper.c
16
+++ b/target/arm/translate-sve.c
16
+++ b/target/arm/tlb_helper.c
17
@@ -XXX,XX +XXX,XX @@ static int pred_gvec_reg_size(DisasContext *s)
17
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
18
return size_for_gvec(pred_full_reg_size(s));
18
return syn;
19
}
19
}
20
20
21
+/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
21
-static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
22
+static void gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
22
- MMUAccessType access_type,
23
+ int rd, int rn, int pg, int data)
23
- int mmu_idx, ARMMMUFaultInfo *fi)
24
+{
24
+static uint32_t compute_fsr_fsc(CPUARMState *env, ARMMMUFaultInfo *fi,
25
+ unsigned vsz = vec_full_reg_size(s);
25
+ int target_el, int mmu_idx, uint32_t *ret_fsc)
26
+ tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
26
{
27
+ vec_full_reg_offset(s, rn),
27
- CPUARMState *env = &cpu->env;
28
+ pred_full_reg_offset(s, pg),
28
- int target_el;
29
+ vsz, vsz, data, fn);
29
- bool same_el;
30
- uint32_t syn, exc, fsr, fsc;
31
ARMMMUIdx arm_mmu_idx = core_to_arm_mmu_idx(env, mmu_idx);
32
-
33
- target_el = exception_target_el(env);
34
- if (fi->stage2) {
35
- target_el = 2;
36
- env->cp15.hpfar_el2 = extract64(fi->s2addr, 12, 47) << 4;
37
- if (arm_is_secure_below_el3(env) && fi->s1ns) {
38
- env->cp15.hpfar_el2 |= HPFAR_NS;
39
- }
40
- }
41
- same_el = (arm_current_el(env) == target_el);
42
+ uint32_t fsr, fsc;
43
44
if (target_el == 2 || arm_el_is_aa64(env, target_el) ||
45
arm_s1_regime_using_lpae_format(env, arm_mmu_idx)) {
46
@@ -XXX,XX +XXX,XX @@ static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
47
fsc = 0x3f;
48
}
49
50
+ *ret_fsc = fsc;
51
+ return fsr;
30
+}
52
+}
31
+
53
+
32
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
54
+static void QEMU_NORETURN arm_deliver_fault(ARMCPU *cpu, vaddr addr,
33
static void gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
55
+ MMUAccessType access_type,
34
int rd, int rn, int rm, int pg, int data)
56
+ int mmu_idx, ARMMMUFaultInfo *fi)
35
@@ -XXX,XX +XXX,XX @@ static bool do_zpz_ool(DisasContext *s, arg_rpr_esz *a, gen_helper_gvec_3 *fn)
57
+{
36
return false;
58
+ CPUARMState *env = &cpu->env;
37
}
59
+ int target_el;
38
if (sve_access_check(s)) {
60
+ bool same_el;
39
- unsigned vsz = vec_full_reg_size(s);
61
+ uint32_t syn, exc, fsr, fsc;
40
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
62
+
41
- vec_full_reg_offset(s, a->rn),
63
+ target_el = exception_target_el(env);
42
- pred_full_reg_offset(s, a->pg),
64
+ if (fi->stage2) {
43
- vsz, vsz, 0, fn);
65
+ target_el = 2;
44
+ gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, 0);
66
+ env->cp15.hpfar_el2 = extract64(fi->s2addr, 12, 47) << 4;
45
}
67
+ if (arm_is_secure_below_el3(env) && fi->s1ns) {
46
return true;
68
+ env->cp15.hpfar_el2 |= HPFAR_NS;
47
}
69
+ }
48
@@ -XXX,XX +XXX,XX @@ static bool do_movz_zpz(DisasContext *s, int rd, int rn, int pg,
70
+ }
49
};
71
+ same_el = (arm_current_el(env) == target_el);
50
72
+
51
if (sve_access_check(s)) {
73
+ fsr = compute_fsr_fsc(env, fi, target_el, mmu_idx, &fsc);
52
- unsigned vsz = vec_full_reg_size(s);
74
+
53
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
75
if (access_type == MMU_INST_FETCH) {
54
- vec_full_reg_offset(s, rn),
76
syn = syn_insn_abort(same_el, fi->ea, fi->s1ptw, fsc);
55
- pred_full_reg_offset(s, pg),
77
exc = EXCP_PREFETCH_ABORT;
56
- vsz, vsz, invert, fns[esz]);
57
+ gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
58
}
59
return true;
60
}
61
@@ -XXX,XX +XXX,XX @@ static bool do_zpzi_ool(DisasContext *s, arg_rpri_esz *a,
62
gen_helper_gvec_3 *fn)
63
{
64
if (sve_access_check(s)) {
65
- unsigned vsz = vec_full_reg_size(s);
66
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
67
- vec_full_reg_offset(s, a->rn),
68
- pred_full_reg_offset(s, a->pg),
69
- vsz, vsz, a->imm, fn);
70
+ gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
71
}
72
return true;
73
}
74
--
78
--
75
2.20.1
79
2.25.1
76
80
77
81
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
3
For A64, any input to an indirect branch can cause this.
4
5
For A32, many indirect branch paths force the branch to be aligned,
6
but BXWritePC does not. This includes the BX instruction but also
7
other interworking changes to PC. Prior to v8, this case is UNDEFINED.
8
With v8, this is CONSTRAINED UNPREDICTABLE and may either raise an
9
exception or force align the PC.
10
11
We choose to raise an exception because we have the infrastructure,
12
it makes the generated code for gen_bx simpler, and it has the
13
possibility of catching more guest bugs.
2
14
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
15
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20200815013145.539409-19-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
18
---
8
target/arm/helper.h | 4 ++++
19
target/arm/helper.h | 1 +
9
target/arm/translate-a64.c | 16 ++++++++++++++++
20
target/arm/syndrome.h | 5 ++++
10
target/arm/vec_helper.c | 29 +++++++++++++++++++++++++----
21
linux-user/aarch64/cpu_loop.c | 46 ++++++++++++++++++++---------------
11
3 files changed, 45 insertions(+), 4 deletions(-)
22
target/arm/tlb_helper.c | 18 ++++++++++++++
23
target/arm/translate-a64.c | 15 ++++++++++++
24
target/arm/translate.c | 22 ++++++++++++++++-
25
6 files changed, 87 insertions(+), 20 deletions(-)
12
26
13
diff --git a/target/arm/helper.h b/target/arm/helper.h
27
diff --git a/target/arm/helper.h b/target/arm/helper.h
14
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.h
29
--- a/target/arm/helper.h
16
+++ b/target/arm/helper.h
30
+++ b/target/arm/helper.h
17
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_uaba_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
31
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RWG_SE,
18
DEF_HELPER_FLAGS_4(gvec_uaba_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
32
DEF_HELPER_2(exception_internal, void, env, i32)
19
DEF_HELPER_FLAGS_4(gvec_uaba_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
33
DEF_HELPER_4(exception_with_syndrome, void, env, i32, i32, i32)
20
34
DEF_HELPER_2(exception_bkpt_insn, void, env, i32)
21
+DEF_HELPER_FLAGS_4(gvec_mul_idx_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
35
+DEF_HELPER_2(exception_pc_alignment, noreturn, env, tl)
22
+DEF_HELPER_FLAGS_4(gvec_mul_idx_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
36
DEF_HELPER_1(setend, void, env)
23
+DEF_HELPER_FLAGS_4(gvec_mul_idx_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
37
DEF_HELPER_2(wfi, void, env, i32)
24
+
38
DEF_HELPER_1(wfe, void, env)
25
#ifdef TARGET_AARCH64
39
diff --git a/target/arm/syndrome.h b/target/arm/syndrome.h
26
#include "helper-a64.h"
40
index XXXXXXX..XXXXXXX 100644
27
#include "helper-sve.h"
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;
45
}
46
47
+static inline uint32_t syn_pcalignment(void)
48
+{
49
+ return (EC_PCALIGNMENT << ARM_EL_EC_SHIFT) | ARM_EL_IL;
50
+}
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
147
/*
28
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
148
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
29
index XXXXXXX..XXXXXXX 100644
149
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/translate-a64.c
150
--- a/target/arm/translate-a64.c
31
+++ b/target/arm/translate-a64.c
151
+++ b/target/arm/translate-a64.c
32
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
152
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
33
data, gen_helper_gvec_fmlal_idx_a64);
153
uint64_t pc = s->base.pc_next;
34
}
154
uint32_t insn;
155
156
+ /* Singlestep exceptions have the highest priority. */
157
if (s->ss_active && !s->pstate_ss) {
158
/* Singlestep state is Active-pending.
159
* If we're in this state at the start of a TB then either
160
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
35
return;
161
return;
36
+
37
+ case 0x08: /* MUL */
38
+ if (!is_long && !is_scalar) {
39
+ static gen_helper_gvec_3 * const fns[3] = {
40
+ gen_helper_gvec_mul_idx_h,
41
+ gen_helper_gvec_mul_idx_s,
42
+ gen_helper_gvec_mul_idx_d,
43
+ };
44
+ tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
45
+ vec_full_reg_offset(s, rn),
46
+ vec_full_reg_offset(s, rm),
47
+ is_q ? 16 : 8, vec_full_reg_size(s),
48
+ index, fns[size - 1]);
49
+ return;
50
+ }
51
+ break;
52
}
162
}
53
163
54
if (size == 3) {
164
+ if (pc & 3) {
55
diff --git a/target/arm/vec_helper.c b/target/arm/vec_helper.c
165
+ /*
56
index XXXXXXX..XXXXXXX 100644
166
+ * PC alignment fault. This has priority over the instruction abort
57
--- a/target/arm/vec_helper.c
167
+ * that we would receive from a translation fault via arm_ldl_code.
58
+++ b/target/arm/vec_helper.c
168
+ * This should only be possible after an indirect branch, at the
59
@@ -XXX,XX +XXX,XX @@ DO_3OP(gvec_rsqrts_d, helper_rsqrtsf_f64, float64)
169
+ * start of the TB.
60
*/
170
+ */
61
171
+ assert(s->base.num_insns == 1);
62
#define DO_MUL_IDX(NAME, TYPE, H) \
172
+ gen_helper_exception_pc_alignment(cpu_env, tcg_constant_tl(pc));
63
+void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc) \
173
+ s->base.is_jmp = DISAS_NORETURN;
64
+{ \
174
+ s->base.pc_next = QEMU_ALIGN_UP(pc, 4);
65
+ intptr_t i, j, oprsz = simd_oprsz(desc), segment = 16 / sizeof(TYPE); \
175
+ return;
66
+ intptr_t idx = simd_data(desc); \
176
+ }
67
+ TYPE *d = vd, *n = vn, *m = vm; \
177
+
68
+ for (i = 0; i < oprsz / sizeof(TYPE); i += segment) { \
178
s->pc_curr = pc;
69
+ TYPE mm = m[H(i + idx)]; \
179
insn = arm_ldl_code(env, &s->base, pc, s->sctlr_b);
70
+ for (j = 0; j < segment; j++) { \
180
s->insn = insn;
71
+ d[i + j] = n[i + j] * mm; \
181
diff --git a/target/arm/translate.c b/target/arm/translate.c
72
+ } \
182
index XXXXXXX..XXXXXXX 100644
73
+ } \
183
--- a/target/arm/translate.c
74
+ clear_tail(d, oprsz, simd_maxsz(desc)); \
184
+++ b/target/arm/translate.c
75
+}
185
@@ -XXX,XX +XXX,XX @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
76
+
186
uint32_t pc = dc->base.pc_next;
77
+DO_MUL_IDX(gvec_mul_idx_h, uint16_t, H2)
187
unsigned int insn;
78
+DO_MUL_IDX(gvec_mul_idx_s, uint32_t, H4)
188
79
+DO_MUL_IDX(gvec_mul_idx_d, uint64_t, )
189
- if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
80
+
190
+ /* Singlestep exceptions have the highest priority. */
81
+#undef DO_MUL_IDX
191
+ if (arm_check_ss_active(dc)) {
82
+
192
+ dc->base.pc_next = pc + 4;
83
+#define DO_FMUL_IDX(NAME, TYPE, H) \
193
+ return;
84
void HELPER(NAME)(void *vd, void *vn, void *vm, void *stat, uint32_t desc) \
194
+ }
85
{ \
195
+
86
intptr_t i, j, oprsz = simd_oprsz(desc), segment = 16 / sizeof(TYPE); \
196
+ if (pc & 3) {
87
@@ -XXX,XX +XXX,XX @@ void HELPER(NAME)(void *vd, void *vn, void *vm, void *stat, uint32_t desc) \
197
+ /*
88
clear_tail(d, oprsz, simd_maxsz(desc)); \
198
+ * PC alignment fault. This has priority over the instruction abort
89
}
199
+ * that we would receive from a translation fault via arm_ldl_code
90
200
+ * (or the execution of the kernelpage entrypoint). This should only
91
-DO_MUL_IDX(gvec_fmul_idx_h, float16, H2)
201
+ * be possible after an indirect branch, at the start of the TB.
92
-DO_MUL_IDX(gvec_fmul_idx_s, float32, H4)
202
+ */
93
-DO_MUL_IDX(gvec_fmul_idx_d, float64, )
203
+ assert(dc->base.num_insns == 1);
94
+DO_FMUL_IDX(gvec_fmul_idx_h, float16, H2)
204
+ gen_helper_exception_pc_alignment(cpu_env, tcg_constant_tl(pc));
95
+DO_FMUL_IDX(gvec_fmul_idx_s, float32, H4)
205
+ dc->base.is_jmp = DISAS_NORETURN;
96
+DO_FMUL_IDX(gvec_fmul_idx_d, float64, )
206
+ dc->base.pc_next = QEMU_ALIGN_UP(pc, 4);
97
207
+ return;
98
-#undef DO_MUL_IDX
208
+ }
99
+#undef DO_FMUL_IDX
209
+
100
210
+ if (arm_check_kernelpage(dc)) {
101
#define DO_FMLA_IDX(NAME, TYPE, H) \
211
dc->base.pc_next = pc + 4;
102
void HELPER(NAME)(void *vd, void *vn, void *vm, void *va, \
212
return;
213
}
103
--
214
--
104
2.20.1
215
2.25.1
105
216
106
217
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Move the check for !S into do_pppp_flags, which allows to merge in
3
Misaligned thumb PC is architecturally impossible.
4
do_vecop4_p. Split out gen_gvec_fn_ppp without sve_access_check,
4
Assert is better than proceeding, in case we've missed
5
to mirror gen_gvec_fn_zzz.
5
something somewhere.
6
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>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20200815013145.539409-7-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
13
---
12
target/arm/translate-sve.c | 111 ++++++++++++++-----------------------
14
target/arm/gdbstub.c | 9 +++++++--
13
1 file changed, 43 insertions(+), 68 deletions(-)
15
target/arm/machine.c | 10 ++++++++++
16
target/arm/translate.c | 3 +++
17
3 files changed, 20 insertions(+), 2 deletions(-)
14
18
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
19
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
16
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
21
--- a/target/arm/gdbstub.c
18
+++ b/target/arm/translate-sve.c
22
+++ b/target/arm/gdbstub.c
19
@@ -XXX,XX +XXX,XX @@ static void do_dupi_z(DisasContext *s, int rd, uint64_t word)
23
@@ -XXX,XX +XXX,XX @@ int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
20
}
24
21
25
tmp = ldl_p(mem_buf);
22
/* Invoke a vector expander on three Pregs. */
26
23
-static bool do_vector3_p(DisasContext *s, GVecGen3Fn *gvec_fn,
27
- /* Mask out low bit of PC to workaround gdb bugs. This will probably
24
- int esz, int rd, int rn, int rm)
28
- cause problems if we ever implement the Jazelle DBX extensions. */
25
+static void gen_gvec_fn_ppp(DisasContext *s, GVecGen3Fn *gvec_fn,
29
+ /*
26
+ int rd, int rn, int rm)
30
+ * Mask out low bits of PC to workaround gdb bugs.
27
{
31
+ * This avoids an assert in thumb_tr_translate_insn, because it is
28
- if (sve_access_check(s)) {
32
+ * architecturally impossible to misalign the pc.
29
- unsigned psz = pred_gvec_reg_size(s);
33
+ * This will probably cause problems if we ever implement the
30
- gvec_fn(esz, pred_full_reg_offset(s, rd),
34
+ * Jazelle DBX extensions.
31
- pred_full_reg_offset(s, rn),
35
+ */
32
- pred_full_reg_offset(s, rm), psz, psz);
36
if (n == 15) {
33
- }
37
tmp &= ~1;
34
- return true;
38
}
35
-}
39
diff --git a/target/arm/machine.c b/target/arm/machine.c
36
-
40
index XXXXXXX..XXXXXXX 100644
37
-/* Invoke a vector operation on four Pregs. */
41
--- a/target/arm/machine.c
38
-static bool do_vecop4_p(DisasContext *s, const GVecGen4 *gvec_op,
42
+++ b/target/arm/machine.c
39
- int rd, int rn, int rm, int rg)
43
@@ -XXX,XX +XXX,XX @@ static int cpu_post_load(void *opaque, int version_id)
40
-{
44
return -1;
41
- if (sve_access_check(s)) {
45
}
42
- unsigned psz = pred_gvec_reg_size(s);
46
}
43
- tcg_gen_gvec_4(pred_full_reg_offset(s, rd),
47
+
44
- pred_full_reg_offset(s, rn),
48
+ /*
45
- pred_full_reg_offset(s, rm),
49
+ * Misaligned thumb pc is architecturally impossible.
46
- pred_full_reg_offset(s, rg),
50
+ * We have an assert in thumb_tr_translate_insn to verify this.
47
- psz, psz, gvec_op);
51
+ * Fail an incoming migrate to avoid this assert.
48
- }
52
+ */
49
- return true;
53
+ if (!is_a64(env) && env->thumb && (env->regs[15] & 1)) {
50
+ unsigned psz = pred_gvec_reg_size(s);
54
+ return -1;
51
+ gvec_fn(MO_64, pred_full_reg_offset(s, rd),
52
+ pred_full_reg_offset(s, rn),
53
+ pred_full_reg_offset(s, rm), psz, psz);
54
}
55
56
/* Invoke a vector move on two Pregs. */
57
@@ -XXX,XX +XXX,XX @@ static bool do_pppp_flags(DisasContext *s, arg_rprr_s *a,
58
int mofs = pred_full_reg_offset(s, a->rm);
59
int gofs = pred_full_reg_offset(s, a->pg);
60
61
+ if (!a->s) {
62
+ tcg_gen_gvec_4(dofs, nofs, mofs, gofs, psz, psz, gvec_op);
63
+ return true;
64
+ }
55
+ }
65
+
56
+
66
if (psz == 8) {
57
if (!kvm_enabled()) {
67
/* Do the operation and the flags generation in temps. */
58
pmu_op_finish(&cpu->env);
68
TCGv_i64 pd = tcg_temp_new_i64();
59
}
69
@@ -XXX,XX +XXX,XX @@ static bool trans_AND_pppp(DisasContext *s, arg_rprr_s *a)
60
diff --git a/target/arm/translate.c b/target/arm/translate.c
70
.fno = gen_helper_sve_and_pppp,
61
index XXXXXXX..XXXXXXX 100644
71
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
62
--- a/target/arm/translate.c
72
};
63
+++ b/target/arm/translate.c
73
- if (a->s) {
64
@@ -XXX,XX +XXX,XX @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
74
- return do_pppp_flags(s, a, &op);
65
uint32_t insn;
75
- } else if (a->rn == a->rm) {
66
bool is_16bit;
76
- if (a->pg == a->rn) {
67
77
- return do_mov_p(s, a->rd, a->rn);
68
+ /* Misaligned thumb PC is architecturally impossible. */
78
- } else {
69
+ assert((dc->base.pc_next & 1) == 0);
79
- return do_vector3_p(s, tcg_gen_gvec_and, 0, a->rd, a->rn, a->pg);
80
+
70
+
81
+ if (!a->s) {
71
if (arm_check_ss_active(dc) || arm_check_kernelpage(dc)) {
82
+ if (!sve_access_check(s)) {
72
dc->base.pc_next = pc + 2;
83
+ return true;
73
return;
84
+ }
85
+ if (a->rn == a->rm) {
86
+ if (a->pg == a->rn) {
87
+ do_mov_p(s, a->rd, a->rn);
88
+ } else {
89
+ gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->pg);
90
+ }
91
+ return true;
92
+ } else if (a->pg == a->rn || a->pg == a->rm) {
93
+ gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->rm);
94
+ return true;
95
}
96
- } else if (a->pg == a->rn || a->pg == a->rm) {
97
- return do_vector3_p(s, tcg_gen_gvec_and, 0, a->rd, a->rn, a->rm);
98
- } else {
99
- return do_vecop4_p(s, &op, a->rd, a->rn, a->rm, a->pg);
100
}
101
+ return do_pppp_flags(s, a, &op);
102
}
103
104
static void gen_bic_pg_i64(TCGv_i64 pd, TCGv_i64 pn, TCGv_i64 pm, TCGv_i64 pg)
105
@@ -XXX,XX +XXX,XX @@ static bool trans_BIC_pppp(DisasContext *s, arg_rprr_s *a)
106
.fno = gen_helper_sve_bic_pppp,
107
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
108
};
109
- if (a->s) {
110
- return do_pppp_flags(s, a, &op);
111
- } else if (a->pg == a->rn) {
112
- return do_vector3_p(s, tcg_gen_gvec_andc, 0, a->rd, a->rn, a->rm);
113
- } else {
114
- return do_vecop4_p(s, &op, a->rd, a->rn, a->rm, a->pg);
115
+
116
+ if (!a->s && a->pg == a->rn) {
117
+ if (sve_access_check(s)) {
118
+ gen_gvec_fn_ppp(s, tcg_gen_gvec_andc, a->rd, a->rn, a->rm);
119
+ }
120
+ return true;
121
}
122
+ return do_pppp_flags(s, a, &op);
123
}
124
125
static void gen_eor_pg_i64(TCGv_i64 pd, TCGv_i64 pn, TCGv_i64 pm, TCGv_i64 pg)
126
@@ -XXX,XX +XXX,XX @@ static bool trans_EOR_pppp(DisasContext *s, arg_rprr_s *a)
127
.fno = gen_helper_sve_eor_pppp,
128
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
129
};
130
- if (a->s) {
131
- return do_pppp_flags(s, a, &op);
132
- } else {
133
- return do_vecop4_p(s, &op, a->rd, a->rn, a->rm, a->pg);
134
- }
135
+ return do_pppp_flags(s, a, &op);
136
}
137
138
static void gen_sel_pg_i64(TCGv_i64 pd, TCGv_i64 pn, TCGv_i64 pm, TCGv_i64 pg)
139
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_pppp(DisasContext *s, arg_rprr_s *a)
140
.fno = gen_helper_sve_sel_pppp,
141
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
142
};
143
+
144
if (a->s) {
145
return false;
146
- } else {
147
- return do_vecop4_p(s, &op, a->rd, a->rn, a->rm, a->pg);
148
}
149
+ return do_pppp_flags(s, a, &op);
150
}
151
152
static void gen_orr_pg_i64(TCGv_i64 pd, TCGv_i64 pn, TCGv_i64 pm, TCGv_i64 pg)
153
@@ -XXX,XX +XXX,XX @@ static bool trans_ORR_pppp(DisasContext *s, arg_rprr_s *a)
154
.fno = gen_helper_sve_orr_pppp,
155
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
156
};
157
- if (a->s) {
158
- return do_pppp_flags(s, a, &op);
159
- } else if (a->pg == a->rn && a->rn == a->rm) {
160
+
161
+ if (!a->s && a->pg == a->rn && a->rn == a->rm) {
162
return do_mov_p(s, a->rd, a->rn);
163
- } else {
164
- return do_vecop4_p(s, &op, a->rd, a->rn, a->rm, a->pg);
165
}
166
+ return do_pppp_flags(s, a, &op);
167
}
168
169
static void gen_orn_pg_i64(TCGv_i64 pd, TCGv_i64 pn, TCGv_i64 pm, TCGv_i64 pg)
170
@@ -XXX,XX +XXX,XX @@ static bool trans_ORN_pppp(DisasContext *s, arg_rprr_s *a)
171
.fno = gen_helper_sve_orn_pppp,
172
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
173
};
174
- if (a->s) {
175
- return do_pppp_flags(s, a, &op);
176
- } else {
177
- return do_vecop4_p(s, &op, a->rd, a->rn, a->rm, a->pg);
178
- }
179
+ return do_pppp_flags(s, a, &op);
180
}
181
182
static void gen_nor_pg_i64(TCGv_i64 pd, TCGv_i64 pn, TCGv_i64 pm, TCGv_i64 pg)
183
@@ -XXX,XX +XXX,XX @@ static bool trans_NOR_pppp(DisasContext *s, arg_rprr_s *a)
184
.fno = gen_helper_sve_nor_pppp,
185
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
186
};
187
- if (a->s) {
188
- return do_pppp_flags(s, a, &op);
189
- } else {
190
- return do_vecop4_p(s, &op, a->rd, a->rn, a->rm, a->pg);
191
- }
192
+ return do_pppp_flags(s, a, &op);
193
}
194
195
static void gen_nand_pg_i64(TCGv_i64 pd, TCGv_i64 pn, TCGv_i64 pm, TCGv_i64 pg)
196
@@ -XXX,XX +XXX,XX @@ static bool trans_NAND_pppp(DisasContext *s, arg_rprr_s *a)
197
.fno = gen_helper_sve_nand_pppp,
198
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
199
};
200
- if (a->s) {
201
- return do_pppp_flags(s, a, &op);
202
- } else {
203
- return do_vecop4_p(s, &op, a->rd, a->rn, a->rm, a->pg);
204
- }
205
+ return do_pppp_flags(s, a, &op);
206
}
207
208
/*
209
--
74
--
210
2.20.1
75
2.25.1
211
76
212
77
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The gvec operation was added after the initial implementation
3
Both single-step and pc alignment faults have priority over
4
of the SEL instruction and was missed in the conversion.
4
breakpoint exceptions.
5
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20200815013145.539409-8-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
9
---
11
target/arm/translate-sve.c | 31 ++++++++-----------------------
10
target/arm/debug_helper.c | 23 +++++++++++++++++++++++
12
1 file changed, 8 insertions(+), 23 deletions(-)
11
1 file changed, 23 insertions(+)
13
12
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
diff --git a/target/arm/debug_helper.c b/target/arm/debug_helper.c
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
15
--- a/target/arm/debug_helper.c
17
+++ b/target/arm/translate-sve.c
16
+++ b/target/arm/debug_helper.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_EOR_pppp(DisasContext *s, arg_rprr_s *a)
17
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_breakpoint(CPUState *cs)
19
return do_pppp_flags(s, a, &op);
20
}
21
22
-static void gen_sel_pg_i64(TCGv_i64 pd, TCGv_i64 pn, TCGv_i64 pm, TCGv_i64 pg)
23
-{
24
- tcg_gen_and_i64(pn, pn, pg);
25
- tcg_gen_andc_i64(pm, pm, pg);
26
- tcg_gen_or_i64(pd, pn, pm);
27
-}
28
-
29
-static void gen_sel_pg_vec(unsigned vece, TCGv_vec pd, TCGv_vec pn,
30
- TCGv_vec pm, TCGv_vec pg)
31
-{
32
- tcg_gen_and_vec(vece, pn, pn, pg);
33
- tcg_gen_andc_vec(vece, pm, pm, pg);
34
- tcg_gen_or_vec(vece, pd, pn, pm);
35
-}
36
-
37
static bool trans_SEL_pppp(DisasContext *s, arg_rprr_s *a)
38
{
18
{
39
- static const GVecGen4 op = {
19
ARMCPU *cpu = ARM_CPU(cs);
40
- .fni8 = gen_sel_pg_i64,
20
CPUARMState *env = &cpu->env;
41
- .fniv = gen_sel_pg_vec,
21
+ target_ulong pc;
42
- .fno = gen_helper_sve_sel_pppp,
22
int n;
43
- .prefer_i64 = TCG_TARGET_REG_BITS == 64,
23
44
- };
24
/*
45
-
25
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_breakpoint(CPUState *cs)
46
if (a->s) {
47
return false;
26
return false;
48
}
27
}
49
- return do_pppp_flags(s, a, &op);
28
50
+ if (sve_access_check(s)) {
29
+ /*
51
+ unsigned psz = pred_gvec_reg_size(s);
30
+ * Single-step exceptions have priority over breakpoint exceptions.
52
+ tcg_gen_gvec_bitsel(MO_8, pred_full_reg_offset(s, a->rd),
31
+ * If single-step state is active-pending, suppress the bp.
53
+ pred_full_reg_offset(s, a->pg),
32
+ */
54
+ pred_full_reg_offset(s, a->rn),
33
+ if (arm_singlestep_active(env) && !(env->pstate & PSTATE_SS)) {
55
+ pred_full_reg_offset(s, a->rm), psz, psz);
34
+ return false;
56
+ }
35
+ }
57
+ return true;
36
+
58
}
37
+ /*
59
38
+ * PC alignment faults have priority over breakpoint exceptions.
60
static void gen_orr_pg_i64(TCGv_i64 pd, TCGv_i64 pn, TCGv_i64 pm, TCGv_i64 pg)
39
+ */
40
+ pc = is_a64(env) ? env->pc : env->regs[15];
41
+ if ((is_a64(env) || !env->thumb) && (pc & 3) != 0) {
42
+ return false;
43
+ }
44
+
45
+ /*
46
+ * Instruction aborts have priority over breakpoint exceptions.
47
+ * TODO: We would need to look up the page for PC and verify that
48
+ * it is present and executable.
49
+ */
50
+
51
for (n = 0; n < ARRAY_SIZE(env->cpu_breakpoint); n++) {
52
if (bp_wp_matches(cpu, n, false)) {
53
return true;
61
--
54
--
62
2.20.1
55
2.25.1
63
56
64
57
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20200815013145.539409-21-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
---
6
---
8
target/arm/helper.h | 10 ++++++++
7
tests/tcg/aarch64/pcalign-a64.c | 37 +++++++++++++++++++++++++
9
target/arm/translate-a64.c | 33 ++++++++++++++++++--------
8
tests/tcg/arm/pcalign-a32.c | 46 +++++++++++++++++++++++++++++++
10
target/arm/vec_helper.c | 48 ++++++++++++++++++++++++++++++++++++++
9
tests/tcg/aarch64/Makefile.target | 4 +--
11
3 files changed, 81 insertions(+), 10 deletions(-)
10
tests/tcg/arm/Makefile.target | 4 +++
11
4 files changed, 89 insertions(+), 2 deletions(-)
12
create mode 100644 tests/tcg/aarch64/pcalign-a64.c
13
create mode 100644 tests/tcg/arm/pcalign-a32.c
12
14
13
diff --git a/target/arm/helper.h b/target/arm/helper.h
15
diff --git a/tests/tcg/aarch64/pcalign-a64.c b/tests/tcg/aarch64/pcalign-a64.c
14
index XXXXXXX..XXXXXXX 100644
16
new file mode 100644
15
--- a/target/arm/helper.h
17
index XXXXXXX..XXXXXXX
16
+++ b/target/arm/helper.h
18
--- /dev/null
17
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(gvec_mls_idx_s, TCG_CALL_NO_RWG,
19
+++ b/tests/tcg/aarch64/pcalign-a64.c
18
DEF_HELPER_FLAGS_5(gvec_mls_idx_d, TCG_CALL_NO_RWG,
20
@@ -XXX,XX +XXX,XX @@
19
void, ptr, ptr, ptr, ptr, i32)
21
+/* Test PC misalignment exception */
20
21
+DEF_HELPER_FLAGS_5(neon_sqdmulh_h, TCG_CALL_NO_RWG,
22
+ void, ptr, ptr, ptr, ptr, i32)
23
+DEF_HELPER_FLAGS_5(neon_sqdmulh_s, TCG_CALL_NO_RWG,
24
+ void, ptr, ptr, ptr, ptr, i32)
25
+
22
+
26
+DEF_HELPER_FLAGS_5(neon_sqrdmulh_h, TCG_CALL_NO_RWG,
23
+#include <assert.h>
27
+ void, ptr, ptr, ptr, ptr, i32)
24
+#include <signal.h>
28
+DEF_HELPER_FLAGS_5(neon_sqrdmulh_s, TCG_CALL_NO_RWG,
25
+#include <stdlib.h>
29
+ void, ptr, ptr, ptr, ptr, i32)
26
+#include <stdio.h>
30
+
27
+
31
#ifdef TARGET_AARCH64
28
+static void *expected;
32
#include "helper-a64.h"
29
+
33
#include "helper-sve.h"
30
+static void sigbus(int sig, siginfo_t *info, void *vuc)
34
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/translate-a64.c
37
+++ b/target/arm/translate-a64.c
38
@@ -XXX,XX +XXX,XX @@ static void gen_gvec_op3_fpst(DisasContext *s, bool is_q, int rd, int rn,
39
tcg_temp_free_ptr(fpst);
40
}
41
42
+/* Expand a 3-operand + qc + operation using an out-of-line helper. */
43
+static void gen_gvec_op3_qc(DisasContext *s, bool is_q, int rd, int rn,
44
+ int rm, gen_helper_gvec_3_ptr *fn)
45
+{
31
+{
46
+ TCGv_ptr qc_ptr = tcg_temp_new_ptr();
32
+ assert(info->si_code == BUS_ADRALN);
47
+
33
+ assert(info->si_addr == expected);
48
+ tcg_gen_addi_ptr(qc_ptr, cpu_env, offsetof(CPUARMState, vfp.qc));
34
+ exit(EXIT_SUCCESS);
49
+ tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
50
+ vec_full_reg_offset(s, rn),
51
+ vec_full_reg_offset(s, rm), qc_ptr,
52
+ is_q ? 16 : 8, vec_full_reg_size(s), 0, fn);
53
+ tcg_temp_free_ptr(qc_ptr);
54
+}
35
+}
55
+
36
+
56
/* Set ZF and NF based on a 64 bit result. This is alas fiddlier
37
+int main()
57
* than the 32 bit equivalent.
58
*/
59
@@ -XXX,XX +XXX,XX @@ static void disas_simd_3same_int(DisasContext *s, uint32_t insn)
60
gen_gvec_fn3(s, is_q, rd, rn, rm, gen_gvec_mla, size);
61
}
62
return;
63
+ case 0x16: /* SQDMULH, SQRDMULH */
64
+ {
65
+ static gen_helper_gvec_3_ptr * const fns[2][2] = {
66
+ { gen_helper_neon_sqdmulh_h, gen_helper_neon_sqrdmulh_h },
67
+ { gen_helper_neon_sqdmulh_s, gen_helper_neon_sqrdmulh_s },
68
+ };
69
+ gen_gvec_op3_qc(s, is_q, rd, rn, rm, fns[size - 1][u]);
70
+ }
71
+ return;
72
case 0x11:
73
if (!u) { /* CMTST */
74
gen_gvec_fn3(s, is_q, rd, rn, rm, gen_gvec_cmtst, size);
75
@@ -XXX,XX +XXX,XX @@ static void disas_simd_3same_int(DisasContext *s, uint32_t insn)
76
genenvfn = fns[size][u];
77
break;
78
}
79
- case 0x16: /* SQDMULH, SQRDMULH */
80
- {
81
- static NeonGenTwoOpEnvFn * const fns[2][2] = {
82
- { gen_helper_neon_qdmulh_s16, gen_helper_neon_qrdmulh_s16 },
83
- { gen_helper_neon_qdmulh_s32, gen_helper_neon_qrdmulh_s32 },
84
- };
85
- assert(size == 1 || size == 2);
86
- genenvfn = fns[size - 1][u];
87
- break;
88
- }
89
default:
90
g_assert_not_reached();
91
}
92
diff --git a/target/arm/vec_helper.c b/target/arm/vec_helper.c
93
index XXXXXXX..XXXXXXX 100644
94
--- a/target/arm/vec_helper.c
95
+++ b/target/arm/vec_helper.c
96
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_qrdmlsh_s16)(void *vd, void *vn, void *vm,
97
clear_tail(d, opr_sz, simd_maxsz(desc));
98
}
99
100
+void HELPER(neon_sqdmulh_h)(void *vd, void *vn, void *vm,
101
+ void *vq, uint32_t desc)
102
+{
38
+{
103
+ intptr_t i, opr_sz = simd_oprsz(desc);
39
+ void *tmp;
104
+ int16_t *d = vd, *n = vn, *m = vm;
105
+
40
+
106
+ for (i = 0; i < opr_sz / 2; ++i) {
41
+ struct sigaction sa = {
107
+ d[i] = do_sqrdmlah_h(n[i], m[i], 0, false, false, vq);
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;
108
+ }
49
+ }
109
+ clear_tail(d, opr_sz, simd_maxsz(desc));
50
+
51
+ asm volatile("adr %0, 1f + 1\n\t"
52
+ "str %0, %1\n\t"
53
+ "br %0\n"
54
+ "1:"
55
+ : "=&r"(tmp), "=m"(expected));
56
+ abort();
57
+}
58
diff --git a/tests/tcg/arm/pcalign-a32.c b/tests/tcg/arm/pcalign-a32.c
59
new file mode 100644
60
index XXXXXXX..XXXXXXX
61
--- /dev/null
62
+++ b/tests/tcg/arm/pcalign-a32.c
63
@@ -XXX,XX +XXX,XX @@
64
+/* Test PC misalignment exception */
65
+
66
+#ifdef __thumb__
67
+#error "This test must be compiled for ARM"
68
+#endif
69
+
70
+#include <assert.h>
71
+#include <signal.h>
72
+#include <stdlib.h>
73
+#include <stdio.h>
74
+
75
+static void *expected;
76
+
77
+static void sigbus(int sig, siginfo_t *info, void *vuc)
78
+{
79
+ assert(info->si_code == BUS_ADRALN);
80
+ assert(info->si_addr == expected);
81
+ exit(EXIT_SUCCESS);
110
+}
82
+}
111
+
83
+
112
+void HELPER(neon_sqrdmulh_h)(void *vd, void *vn, void *vm,
84
+int main()
113
+ void *vq, uint32_t desc)
114
+{
85
+{
115
+ intptr_t i, opr_sz = simd_oprsz(desc);
86
+ void *tmp;
116
+ int16_t *d = vd, *n = vn, *m = vm;
117
+
87
+
118
+ for (i = 0; i < opr_sz / 2; ++i) {
88
+ struct sigaction sa = {
119
+ d[i] = do_sqrdmlah_h(n[i], m[i], 0, false, true, vq);
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;
120
+ }
96
+ }
121
+ clear_tail(d, opr_sz, simd_maxsz(desc));
97
+
98
+ asm volatile("adr %0, 1f + 2\n\t"
99
+ "str %0, %1\n\t"
100
+ "bx %0\n"
101
+ "1:"
102
+ : "=&r"(tmp), "=m"(expected));
103
+
104
+ /*
105
+ * From v8, it is CONSTRAINED UNPREDICTABLE whether BXWritePC aligns
106
+ * the address or not. If so, we can legitimately fall through.
107
+ */
108
+ return EXIT_SUCCESS;
122
+}
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
123
+
136
+
124
/* Signed saturating rounding doubling multiply-accumulate high half, 32-bit */
137
ifeq ($(CONFIG_ARM_COMPATIBLE_SEMIHOSTING),y)
125
static int32_t do_sqrdmlah_s(int32_t src1, int32_t src2, int32_t src3,
138
126
bool neg, bool round, uint32_t *sat)
139
# Semihosting smoke test for linux-user
127
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_qrdmlsh_s32)(void *vd, void *vn, void *vm,
128
clear_tail(d, opr_sz, simd_maxsz(desc));
129
}
130
131
+void HELPER(neon_sqdmulh_s)(void *vd, void *vn, void *vm,
132
+ void *vq, uint32_t desc)
133
+{
134
+ intptr_t i, opr_sz = simd_oprsz(desc);
135
+ int32_t *d = vd, *n = vn, *m = vm;
136
+
137
+ for (i = 0; i < opr_sz / 4; ++i) {
138
+ d[i] = do_sqrdmlah_s(n[i], m[i], 0, false, false, vq);
139
+ }
140
+ clear_tail(d, opr_sz, simd_maxsz(desc));
141
+}
142
+
143
+void HELPER(neon_sqrdmulh_s)(void *vd, void *vn, void *vm,
144
+ void *vq, uint32_t desc)
145
+{
146
+ intptr_t i, opr_sz = simd_oprsz(desc);
147
+ int32_t *d = vd, *n = vn, *m = vm;
148
+
149
+ for (i = 0; i < opr_sz / 4; ++i) {
150
+ d[i] = do_sqrdmlah_s(n[i], m[i], 0, false, true, vq);
151
+ }
152
+ clear_tail(d, opr_sz, simd_maxsz(desc));
153
+}
154
+
155
/* Integer 8 and 16-bit dot-product.
156
*
157
* Note that for the loops herein, host endianness does not matter
158
--
140
--
159
2.20.1
141
2.25.1
160
142
161
143
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
In the SSE decode function gen_sse(), we combine a byte
2
'b' and a value 'b1' which can be [0..3], and switch on them:
3
b |= (b1 << 8);
4
switch (b) {
5
...
6
default:
7
unknown_op:
8
gen_unknown_opcode(env, s);
9
return;
10
}
2
11
3
To quickly notice the access size, display the value with the
12
In three cases inside this switch, we were then also checking for
4
width of the access (i.e. 16-bit access is displayed 0x0000,
13
"if (b1 >= 2) { goto unknown_op; }".
5
while 8-bit access 0x00).
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.
6
17
18
This check was added in commit c045af25a52e9 in 2010; the added code
19
was unnecessary then as well, and was apparently intended only to
20
ensure that we never accidentally ended up indexing off the end
21
of an sse_op_table with only 2 entries as a result of future bugs
22
in the decode logic.
23
24
Change the checks to assert() instead, and make sure they're always
25
immediately before the array access they are protecting.
26
27
Fixes: Coverity CID 1460207
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20200812190206.31595-3-f4bug@amsat.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
30
---
12
hw/misc/unimp.c | 4 ++--
31
target/i386/tcg/translate.c | 12 +++---------
13
1 file changed, 2 insertions(+), 2 deletions(-)
32
1 file changed, 3 insertions(+), 9 deletions(-)
14
33
15
diff --git a/hw/misc/unimp.c b/hw/misc/unimp.c
34
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
16
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/misc/unimp.c
36
--- a/target/i386/tcg/translate.c
18
+++ b/hw/misc/unimp.c
37
+++ b/target/i386/tcg/translate.c
19
@@ -XXX,XX +XXX,XX @@ static void unimp_write(void *opaque, hwaddr offset,
38
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
20
39
case 0x171: /* shift xmm, im */
21
qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write "
40
case 0x172:
22
"(size %d, offset 0x%" HWADDR_PRIx
41
case 0x173:
23
- ", value 0x%" PRIx64 ")\n",
42
- if (b1 >= 2) {
24
- s->name, size, offset, value);
43
- goto unknown_op;
25
+ ", value 0x%0*" PRIx64 ")\n",
44
- }
26
+ s->name, size, offset, size << 1, value);
45
val = x86_ldub_code(env, s);
27
}
46
if (is_xmm) {
28
47
tcg_gen_movi_tl(s->T0, val);
29
static const MemoryRegionOps unimp_ops = {
48
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
49
offsetof(CPUX86State, mmx_t0.MMX_L(1)));
50
op1_offset = offsetof(CPUX86State,mmx_t0);
51
}
52
+ assert(b1 < 2);
53
sse_fn_epp = sse_op_table2[((b - 1) & 3) * 8 +
54
(((modrm >> 3)) & 7)][b1];
55
if (!sse_fn_epp) {
56
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
57
rm = modrm & 7;
58
reg = ((modrm >> 3) & 7) | REX_R(s);
59
mod = (modrm >> 6) & 3;
60
- if (b1 >= 2) {
61
- goto unknown_op;
62
- }
63
64
+ assert(b1 < 2);
65
sse_fn_epp = sse_op_table6[b].op[b1];
66
if (!sse_fn_epp) {
67
goto unknown_op;
68
@@ -XXX,XX +XXX,XX @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
69
rm = modrm & 7;
70
reg = ((modrm >> 3) & 7) | REX_R(s);
71
mod = (modrm >> 6) & 3;
72
- if (b1 >= 2) {
73
- goto unknown_op;
74
- }
75
76
+ assert(b1 < 2);
77
sse_fn_eppi = sse_op_table7[b].op[b1];
78
if (!sse_fn_eppi) {
79
goto unknown_op;
30
--
80
--
31
2.20.1
81
2.25.1
32
82
33
83
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The qemu-common.h header is not supposed to be included from any
2
other header files, only from .c files (as documented in a comment at
3
the start of it).
2
4
3
As we want to call qdev_connect_clock_in() before the device
5
include/hw/i386/x86.h and include/hw/i386/microvm.h break this rule.
4
is realized, we need to uninline cadence_uart_create() first.
6
In fact, the include is not required at all, so we can just drop it
7
from both files.
5
8
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20200803105647.22223-2-f4bug@amsat.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20211129200510.1233037-2-peter.maydell@linaro.org
10
---
13
---
11
include/hw/char/cadence_uart.h | 17 -----------------
14
include/hw/i386/microvm.h | 1 -
12
hw/arm/xilinx_zynq.c | 14 ++++++++++++--
15
include/hw/i386/x86.h | 1 -
13
2 files changed, 12 insertions(+), 19 deletions(-)
16
2 files changed, 2 deletions(-)
14
17
15
diff --git a/include/hw/char/cadence_uart.h b/include/hw/char/cadence_uart.h
18
diff --git a/include/hw/i386/microvm.h b/include/hw/i386/microvm.h
16
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/char/cadence_uart.h
20
--- a/include/hw/i386/microvm.h
18
+++ b/include/hw/char/cadence_uart.h
21
+++ b/include/hw/i386/microvm.h
19
@@ -XXX,XX +XXX,XX @@ typedef struct {
22
@@ -XXX,XX +XXX,XX @@
20
Clock *refclk;
23
#ifndef HW_I386_MICROVM_H
21
} CadenceUARTState;
24
#define HW_I386_MICROVM_H
22
25
23
-static inline DeviceState *cadence_uart_create(hwaddr addr,
26
-#include "qemu-common.h"
24
- qemu_irq irq,
27
#include "exec/hwaddr.h"
25
- Chardev *chr)
28
#include "qemu/notify.h"
26
-{
29
27
- DeviceState *dev;
30
diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
28
- SysBusDevice *s;
29
-
30
- dev = qdev_new(TYPE_CADENCE_UART);
31
- s = SYS_BUS_DEVICE(dev);
32
- qdev_prop_set_chr(dev, "chardev", chr);
33
- sysbus_realize_and_unref(s, &error_fatal);
34
- sysbus_mmio_map(s, 0, addr);
35
- sysbus_connect_irq(s, 0, irq);
36
-
37
- return dev;
38
-}
39
-
40
#endif
41
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
42
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
43
--- a/hw/arm/xilinx_zynq.c
32
--- a/include/hw/i386/x86.h
44
+++ b/hw/arm/xilinx_zynq.c
33
+++ b/include/hw/i386/x86.h
45
@@ -XXX,XX +XXX,XX @@ static void zynq_init(MachineState *machine)
34
@@ -XXX,XX +XXX,XX @@
46
sysbus_create_simple(TYPE_CHIPIDEA, 0xE0002000, pic[53 - IRQ_OFFSET]);
35
#ifndef HW_I386_X86_H
47
sysbus_create_simple(TYPE_CHIPIDEA, 0xE0003000, pic[76 - IRQ_OFFSET]);
36
#define HW_I386_X86_H
48
37
49
- dev = cadence_uart_create(0xE0000000, pic[59 - IRQ_OFFSET], serial_hd(0));
38
-#include "qemu-common.h"
50
+ dev = qdev_new(TYPE_CADENCE_UART);
39
#include "exec/hwaddr.h"
51
+ busdev = SYS_BUS_DEVICE(dev);
40
#include "qemu/notify.h"
52
+ qdev_prop_set_chr(dev, "chardev", serial_hd(0));
53
+ sysbus_realize_and_unref(busdev, &error_fatal);
54
+ sysbus_mmio_map(busdev, 0, 0xE0000000);
55
+ sysbus_connect_irq(busdev, 0, pic[59 - IRQ_OFFSET]);
56
qdev_connect_clock_in(dev, "refclk",
57
qdev_get_clock_out(slcr, "uart0_ref_clk"));
58
- dev = cadence_uart_create(0xE0001000, pic[82 - IRQ_OFFSET], serial_hd(1));
59
+ dev = qdev_new(TYPE_CADENCE_UART);
60
+ busdev = SYS_BUS_DEVICE(dev);
61
+ qdev_prop_set_chr(dev, "chardev", serial_hd(1));
62
+ sysbus_realize_and_unref(busdev, &error_fatal);
63
+ sysbus_mmio_map(busdev, 0, 0xE0001000);
64
+ sysbus_connect_irq(busdev, 0, pic[82 - IRQ_OFFSET]);
65
qdev_connect_clock_in(dev, "refclk",
66
qdev_get_clock_out(slcr, "uart1_ref_clk"));
67
41
68
--
42
--
69
2.20.1
43
2.25.1
70
44
71
45
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
The qemu-common.h header is not supposed to be included from any
2
other header files, only from .c files (as documented in a comment at
3
the start of it).
2
4
3
Model gen_gvec_fn_zzz on gen_gvec_fn3 in translate-a64.c, but
5
Move the include to linux-user/hexagon/cpu_loop.c, which needs it for
4
indicating which kind of register and in which order.
6
the declaration of cpu_exec_step_atomic().
5
7
6
Model do_zzz_fn on the other do_foo functions that take an
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
argument set and verify sve enabled.
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
12
Message-id: 20211129200510.1233037-3-peter.maydell@linaro.org
13
---
14
target/hexagon/cpu.h | 1 -
15
linux-user/hexagon/cpu_loop.c | 1 +
16
2 files changed, 1 insertion(+), 1 deletion(-)
8
17
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
18
diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20200815013145.539409-4-richard.henderson@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
target/arm/translate-sve.c | 43 +++++++++++++++++++++-----------------
15
1 file changed, 24 insertions(+), 19 deletions(-)
16
17
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
18
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/translate-sve.c
20
--- a/target/hexagon/cpu.h
20
+++ b/target/arm/translate-sve.c
21
+++ b/target/hexagon/cpu.h
21
@@ -XXX,XX +XXX,XX @@ static void gen_gvec_fn_zz(DisasContext *s, GVecGen2Fn *gvec_fn,
22
@@ -XXX,XX +XXX,XX @@ typedef struct CPUHexagonState CPUHexagonState;
22
}
23
23
24
#include "fpu/softfloat-types.h"
24
/* Invoke a vector expander on three Zregs. */
25
25
-static bool do_vector3_z(DisasContext *s, GVecGen3Fn *gvec_fn,
26
-#include "qemu-common.h"
26
- int esz, int rd, int rn, int rm)
27
#include "exec/cpu-defs.h"
27
+static void gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
28
#include "hex_regs.h"
28
+ int esz, int rd, int rn, int rm)
29
#include "mmvec/mmvec.h"
29
{
30
diff --git a/linux-user/hexagon/cpu_loop.c b/linux-user/hexagon/cpu_loop.c
30
- if (sve_access_check(s)) {
31
index XXXXXXX..XXXXXXX 100644
31
- unsigned vsz = vec_full_reg_size(s);
32
--- a/linux-user/hexagon/cpu_loop.c
32
- gvec_fn(esz, vec_full_reg_offset(s, rd),
33
+++ b/linux-user/hexagon/cpu_loop.c
33
- vec_full_reg_offset(s, rn),
34
@@ -XXX,XX +XXX,XX @@
34
- vec_full_reg_offset(s, rm), vsz, vsz);
35
- }
36
- return true;
37
+ unsigned vsz = vec_full_reg_size(s);
38
+ gvec_fn(esz, vec_full_reg_offset(s, rd),
39
+ vec_full_reg_offset(s, rn),
40
+ vec_full_reg_offset(s, rm), vsz, vsz);
41
}
42
43
/* Invoke a vector move on two Zregs. */
44
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
45
*** SVE Logical - Unpredicated Group
46
*/
35
*/
47
36
48
+static bool do_zzz_fn(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *gvec_fn)
37
#include "qemu/osdep.h"
49
+{
38
+#include "qemu-common.h"
50
+ if (sve_access_check(s)) {
39
#include "qemu.h"
51
+ gen_gvec_fn_zzz(s, gvec_fn, a->esz, a->rd, a->rn, a->rm);
40
#include "user-internals.h"
52
+ }
41
#include "cpu_loop-common.h"
53
+ return true;
54
+}
55
+
56
static bool trans_AND_zzz(DisasContext *s, arg_rrr_esz *a)
57
{
58
- return do_vector3_z(s, tcg_gen_gvec_and, 0, a->rd, a->rn, a->rm);
59
+ return do_zzz_fn(s, a, tcg_gen_gvec_and);
60
}
61
62
static bool trans_ORR_zzz(DisasContext *s, arg_rrr_esz *a)
63
{
64
- return do_vector3_z(s, tcg_gen_gvec_or, 0, a->rd, a->rn, a->rm);
65
+ return do_zzz_fn(s, a, tcg_gen_gvec_or);
66
}
67
68
static bool trans_EOR_zzz(DisasContext *s, arg_rrr_esz *a)
69
{
70
- return do_vector3_z(s, tcg_gen_gvec_xor, 0, a->rd, a->rn, a->rm);
71
+ return do_zzz_fn(s, a, tcg_gen_gvec_xor);
72
}
73
74
static bool trans_BIC_zzz(DisasContext *s, arg_rrr_esz *a)
75
{
76
- return do_vector3_z(s, tcg_gen_gvec_andc, 0, a->rd, a->rn, a->rm);
77
+ return do_zzz_fn(s, a, tcg_gen_gvec_andc);
78
}
79
80
/*
81
@@ -XXX,XX +XXX,XX @@ static bool trans_BIC_zzz(DisasContext *s, arg_rrr_esz *a)
82
83
static bool trans_ADD_zzz(DisasContext *s, arg_rrr_esz *a)
84
{
85
- return do_vector3_z(s, tcg_gen_gvec_add, a->esz, a->rd, a->rn, a->rm);
86
+ return do_zzz_fn(s, a, tcg_gen_gvec_add);
87
}
88
89
static bool trans_SUB_zzz(DisasContext *s, arg_rrr_esz *a)
90
{
91
- return do_vector3_z(s, tcg_gen_gvec_sub, a->esz, a->rd, a->rn, a->rm);
92
+ return do_zzz_fn(s, a, tcg_gen_gvec_sub);
93
}
94
95
static bool trans_SQADD_zzz(DisasContext *s, arg_rrr_esz *a)
96
{
97
- return do_vector3_z(s, tcg_gen_gvec_ssadd, a->esz, a->rd, a->rn, a->rm);
98
+ return do_zzz_fn(s, a, tcg_gen_gvec_ssadd);
99
}
100
101
static bool trans_SQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
102
{
103
- return do_vector3_z(s, tcg_gen_gvec_sssub, a->esz, a->rd, a->rn, a->rm);
104
+ return do_zzz_fn(s, a, tcg_gen_gvec_sssub);
105
}
106
107
static bool trans_UQADD_zzz(DisasContext *s, arg_rrr_esz *a)
108
{
109
- return do_vector3_z(s, tcg_gen_gvec_usadd, a->esz, a->rd, a->rn, a->rm);
110
+ return do_zzz_fn(s, a, tcg_gen_gvec_usadd);
111
}
112
113
static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
114
{
115
- return do_vector3_z(s, tcg_gen_gvec_ussub, a->esz, a->rd, a->rn, a->rm);
116
+ return do_zzz_fn(s, a, tcg_gen_gvec_ussub);
117
}
118
119
/*
120
--
42
--
121
2.20.1
43
2.25.1
122
44
123
45
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The qemu-common.h header is not supposed to be included from any
2
other header files, only from .c files (as documented in a comment at
3
the start of it).
2
4
3
Allow the device to execute the DMA transfers in a different
5
Nothing actually relies on target/rx/cpu.h including it, so we can
4
AddressSpace.
6
just drop the include.
5
7
6
The H3 SoC keeps using the system_memory address space,
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
but via the proper dma_memory_access() API.
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
12
Reviewed-by: Yoshinori Sato <ysato@users.sourceforge.jp>
13
Message-id: 20211129200510.1233037-4-peter.maydell@linaro.org
14
---
15
target/rx/cpu.h | 1 -
16
1 file changed, 1 deletion(-)
8
17
9
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
diff --git a/target/rx/cpu.h b/target/rx/cpu.h
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
12
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
13
Message-id: 20200814122907.27732-1-f4bug@amsat.org
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
include/hw/net/allwinner-sun8i-emac.h | 6 ++++
17
hw/arm/allwinner-h3.c | 2 ++
18
hw/net/allwinner-sun8i-emac.c | 46 +++++++++++++++++----------
19
3 files changed, 38 insertions(+), 16 deletions(-)
20
21
diff --git a/include/hw/net/allwinner-sun8i-emac.h b/include/hw/net/allwinner-sun8i-emac.h
22
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/net/allwinner-sun8i-emac.h
20
--- a/target/rx/cpu.h
24
+++ b/include/hw/net/allwinner-sun8i-emac.h
21
+++ b/target/rx/cpu.h
25
@@ -XXX,XX +XXX,XX @@ typedef struct AwSun8iEmacState {
26
/** Interrupt output signal to notify CPU */
27
qemu_irq irq;
28
29
+ /** Memory region where DMA transfers are done */
30
+ MemoryRegion *dma_mr;
31
+
32
+ /** Address space used internally for DMA transfers */
33
+ AddressSpace dma_as;
34
+
35
/** Generic Network Interface Controller (NIC) for networking API */
36
NICState *nic;
37
38
diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/arm/allwinner-h3.c
41
+++ b/hw/arm/allwinner-h3.c
42
@@ -XXX,XX +XXX,XX @@ static void allwinner_h3_realize(DeviceState *dev, Error **errp)
43
qemu_check_nic_model(&nd_table[0], TYPE_AW_SUN8I_EMAC);
44
qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]);
45
}
46
+ object_property_set_link(OBJECT(&s->emac), "dma-memory",
47
+ OBJECT(get_system_memory()), &error_fatal);
48
sysbus_realize(SYS_BUS_DEVICE(&s->emac), &error_fatal);
49
sysbus_mmio_map(SYS_BUS_DEVICE(&s->emac), 0, s->memmap[AW_H3_EMAC]);
50
sysbus_connect_irq(SYS_BUS_DEVICE(&s->emac), 0,
51
diff --git a/hw/net/allwinner-sun8i-emac.c b/hw/net/allwinner-sun8i-emac.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/hw/net/allwinner-sun8i-emac.c
54
+++ b/hw/net/allwinner-sun8i-emac.c
55
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
56
23
#define RX_CPU_H
57
#include "qemu/osdep.h"
24
58
#include "qemu/units.h"
25
#include "qemu/bitops.h"
59
+#include "qapi/error.h"
26
-#include "qemu-common.h"
60
#include "hw/sysbus.h"
27
#include "hw/registerfields.h"
61
#include "migration/vmstate.h"
28
#include "cpu-qom.h"
62
#include "net/net.h"
63
@@ -XXX,XX +XXX,XX @@
64
#include "net/checksum.h"
65
#include "qemu/module.h"
66
#include "exec/cpu-common.h"
67
+#include "sysemu/dma.h"
68
#include "hw/net/allwinner-sun8i-emac.h"
69
70
/* EMAC register offsets */
71
@@ -XXX,XX +XXX,XX @@ static void allwinner_sun8i_emac_update_irq(AwSun8iEmacState *s)
72
qemu_set_irq(s->irq, (s->int_sta & s->int_en) != 0);
73
}
74
75
-static uint32_t allwinner_sun8i_emac_next_desc(FrameDescriptor *desc,
76
+static uint32_t allwinner_sun8i_emac_next_desc(AwSun8iEmacState *s,
77
+ FrameDescriptor *desc,
78
size_t min_size)
79
{
80
uint32_t paddr = desc->next;
81
82
- cpu_physical_memory_read(paddr, desc, sizeof(*desc));
83
+ dma_memory_read(&s->dma_as, paddr, desc, sizeof(*desc));
84
85
if ((desc->status & DESC_STATUS_CTL) &&
86
(desc->status2 & DESC_STATUS2_BUF_SIZE_MASK) >= min_size) {
87
@@ -XXX,XX +XXX,XX @@ static uint32_t allwinner_sun8i_emac_next_desc(FrameDescriptor *desc,
88
}
89
}
90
91
-static uint32_t allwinner_sun8i_emac_get_desc(FrameDescriptor *desc,
92
+static uint32_t allwinner_sun8i_emac_get_desc(AwSun8iEmacState *s,
93
+ FrameDescriptor *desc,
94
uint32_t start_addr,
95
size_t min_size)
96
{
97
@@ -XXX,XX +XXX,XX @@ static uint32_t allwinner_sun8i_emac_get_desc(FrameDescriptor *desc,
98
99
/* Note that the list is a cycle. Last entry points back to the head. */
100
while (desc_addr != 0) {
101
- cpu_physical_memory_read(desc_addr, desc, sizeof(*desc));
102
+ dma_memory_read(&s->dma_as, desc_addr, desc, sizeof(*desc));
103
104
if ((desc->status & DESC_STATUS_CTL) &&
105
(desc->status2 & DESC_STATUS2_BUF_SIZE_MASK) >= min_size) {
106
@@ -XXX,XX +XXX,XX @@ static uint32_t allwinner_sun8i_emac_rx_desc(AwSun8iEmacState *s,
107
FrameDescriptor *desc,
108
size_t min_size)
109
{
110
- return allwinner_sun8i_emac_get_desc(desc, s->rx_desc_curr, min_size);
111
+ return allwinner_sun8i_emac_get_desc(s, desc, s->rx_desc_curr, min_size);
112
}
113
114
static uint32_t allwinner_sun8i_emac_tx_desc(AwSun8iEmacState *s,
115
FrameDescriptor *desc,
116
size_t min_size)
117
{
118
- return allwinner_sun8i_emac_get_desc(desc, s->tx_desc_head, min_size);
119
+ return allwinner_sun8i_emac_get_desc(s, desc, s->tx_desc_head, min_size);
120
}
121
122
-static void allwinner_sun8i_emac_flush_desc(FrameDescriptor *desc,
123
+static void allwinner_sun8i_emac_flush_desc(AwSun8iEmacState *s,
124
+ FrameDescriptor *desc,
125
uint32_t phys_addr)
126
{
127
- cpu_physical_memory_write(phys_addr, desc, sizeof(*desc));
128
+ dma_memory_write(&s->dma_as, phys_addr, desc, sizeof(*desc));
129
}
130
131
static bool allwinner_sun8i_emac_can_receive(NetClientState *nc)
132
@@ -XXX,XX +XXX,XX @@ static ssize_t allwinner_sun8i_emac_receive(NetClientState *nc,
133
<< RX_DESC_STATUS_FRM_LEN_SHIFT;
134
}
135
136
- cpu_physical_memory_write(desc.addr, buf, desc_bytes);
137
- allwinner_sun8i_emac_flush_desc(&desc, s->rx_desc_curr);
138
+ dma_memory_write(&s->dma_as, desc.addr, buf, desc_bytes);
139
+ allwinner_sun8i_emac_flush_desc(s, &desc, s->rx_desc_curr);
140
trace_allwinner_sun8i_emac_receive(s->rx_desc_curr, desc.addr,
141
desc_bytes);
142
143
@@ -XXX,XX +XXX,XX @@ static ssize_t allwinner_sun8i_emac_receive(NetClientState *nc,
144
bytes_left -= desc_bytes;
145
146
/* Move to the next descriptor */
147
- s->rx_desc_curr = allwinner_sun8i_emac_next_desc(&desc, 64);
148
+ s->rx_desc_curr = allwinner_sun8i_emac_next_desc(s, &desc, 64);
149
if (!s->rx_desc_curr) {
150
/* Not enough buffer space available */
151
s->int_sta |= INT_STA_RX_BUF_UA;
152
@@ -XXX,XX +XXX,XX @@ static void allwinner_sun8i_emac_transmit(AwSun8iEmacState *s)
153
desc.status |= TX_DESC_STATUS_LENGTH_ERR;
154
break;
155
}
156
- cpu_physical_memory_read(desc.addr, packet_buf + packet_bytes, bytes);
157
+ dma_memory_read(&s->dma_as, desc.addr, packet_buf + packet_bytes, bytes);
158
packet_bytes += bytes;
159
desc.status &= ~DESC_STATUS_CTL;
160
- allwinner_sun8i_emac_flush_desc(&desc, s->tx_desc_curr);
161
+ allwinner_sun8i_emac_flush_desc(s, &desc, s->tx_desc_curr);
162
163
/* After the last descriptor, send the packet */
164
if (desc.status2 & TX_DESC_STATUS2_LAST_DESC) {
165
@@ -XXX,XX +XXX,XX @@ static void allwinner_sun8i_emac_transmit(AwSun8iEmacState *s)
166
packet_bytes = 0;
167
transmitted++;
168
}
169
- s->tx_desc_curr = allwinner_sun8i_emac_next_desc(&desc, 0);
170
+ s->tx_desc_curr = allwinner_sun8i_emac_next_desc(s, &desc, 0);
171
}
172
173
/* Raise transmit completed interrupt */
174
@@ -XXX,XX +XXX,XX @@ static uint64_t allwinner_sun8i_emac_read(void *opaque, hwaddr offset,
175
break;
176
case REG_TX_CUR_BUF: /* Transmit Current Buffer */
177
if (s->tx_desc_curr != 0) {
178
- cpu_physical_memory_read(s->tx_desc_curr, &desc, sizeof(desc));
179
+ dma_memory_read(&s->dma_as, s->tx_desc_curr, &desc, sizeof(desc));
180
value = desc.addr;
181
} else {
182
value = 0;
183
@@ -XXX,XX +XXX,XX @@ static uint64_t allwinner_sun8i_emac_read(void *opaque, hwaddr offset,
184
break;
185
case REG_RX_CUR_BUF: /* Receive Current Buffer */
186
if (s->rx_desc_curr != 0) {
187
- cpu_physical_memory_read(s->rx_desc_curr, &desc, sizeof(desc));
188
+ dma_memory_read(&s->dma_as, s->rx_desc_curr, &desc, sizeof(desc));
189
value = desc.addr;
190
} else {
191
value = 0;
192
@@ -XXX,XX +XXX,XX @@ static void allwinner_sun8i_emac_realize(DeviceState *dev, Error **errp)
193
{
194
AwSun8iEmacState *s = AW_SUN8I_EMAC(dev);
195
196
+ if (!s->dma_mr) {
197
+ error_setg(errp, TYPE_AW_SUN8I_EMAC " 'dma-memory' link not set");
198
+ return;
199
+ }
200
+
201
+ address_space_init(&s->dma_as, s->dma_mr, "emac-dma");
202
+
203
qemu_macaddr_default_if_unset(&s->conf.macaddr);
204
s->nic = qemu_new_nic(&net_allwinner_sun8i_emac_info, &s->conf,
205
object_get_typename(OBJECT(dev)), dev->id, s);
206
@@ -XXX,XX +XXX,XX @@ static void allwinner_sun8i_emac_realize(DeviceState *dev, Error **errp)
207
static Property allwinner_sun8i_emac_properties[] = {
208
DEFINE_NIC_PROPERTIES(AwSun8iEmacState, conf),
209
DEFINE_PROP_UINT8("phy-addr", AwSun8iEmacState, mii_phy_addr, 0),
210
+ DEFINE_PROP_LINK("dma-memory", AwSun8iEmacState, dma_mr,
211
+ TYPE_MEMORY_REGION, MemoryRegion *),
212
DEFINE_PROP_END_OF_LIST(),
213
};
214
29
215
--
30
--
216
2.20.1
31
2.25.1
217
32
218
33
diff view generated by jsdifflib
1
From: Graeme Gregory <graeme@nuviainc.com>
1
A lot of C files in hw/arm include qemu-common.h when they don't
2
need anything from it. Drop the include lines.
2
3
3
Fixing a typo in a previous patch that translated an "i" to a 1
4
omap1.c, pxa2xx.c and strongarm.c retain the include because they
4
and therefore breaking the allocation of PCIe interrupts. This was
5
use it for the prototype of qemu_get_timedate().
5
discovered when virtio-net-pci devices ceased to function correctly.
6
6
7
Cc: qemu-stable@nongnu.org
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Fixes: 48ba18e6d3f3 ("hw/arm/sbsa-ref: Simplify by moving the gic in the machine state")
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Graeme Gregory <graeme@nuviainc.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20200821083853.356490-1-graeme@nuviainc.com
10
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Yoshinori Sato <ysato@users.sourceforge.jp>
12
Message-id: 20211129200510.1233037-5-peter.maydell@linaro.org
13
---
13
---
14
hw/arm/sbsa-ref.c | 2 +-
14
hw/arm/boot.c | 1 -
15
1 file changed, 1 insertion(+), 1 deletion(-)
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(-)
16
23
24
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/boot.c
27
+++ b/hw/arm/boot.c
28
@@ -XXX,XX +XXX,XX @@
29
*/
30
31
#include "qemu/osdep.h"
32
-#include "qemu-common.h"
33
#include "qemu/datadir.h"
34
#include "qemu/error-report.h"
35
#include "qapi/error.h"
36
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/arm/digic_boards.c
39
+++ b/hw/arm/digic_boards.c
40
@@ -XXX,XX +XXX,XX @@
41
42
#include "qemu/osdep.h"
43
#include "qapi/error.h"
44
-#include "qemu-common.h"
45
#include "qemu/datadir.h"
46
#include "hw/boards.h"
47
#include "qemu/error-report.h"
48
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/hw/arm/highbank.c
51
+++ b/hw/arm/highbank.c
52
@@ -XXX,XX +XXX,XX @@
53
*/
54
55
#include "qemu/osdep.h"
56
-#include "qemu-common.h"
57
#include "qemu/datadir.h"
58
#include "qapi/error.h"
59
#include "hw/sysbus.h"
60
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/hw/arm/npcm7xx_boards.c
63
+++ b/hw/arm/npcm7xx_boards.c
64
@@ -XXX,XX +XXX,XX @@
65
#include "hw/qdev-core.h"
66
#include "hw/qdev-properties.h"
67
#include "qapi/error.h"
68
-#include "qemu-common.h"
69
#include "qemu/datadir.h"
70
#include "qemu/units.h"
71
#include "sysemu/blockdev.h"
17
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
72
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
18
index XXXXXXX..XXXXXXX 100644
73
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/sbsa-ref.c
74
--- a/hw/arm/sbsa-ref.c
20
+++ b/hw/arm/sbsa-ref.c
75
+++ b/hw/arm/sbsa-ref.c
21
@@ -XXX,XX +XXX,XX @@ static void create_pcie(SBSAMachineState *sms)
76
@@ -XXX,XX +XXX,XX @@
22
77
*/
23
for (i = 0; i < GPEX_NUM_IRQS; i++) {
78
24
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i,
79
#include "qemu/osdep.h"
25
- qdev_get_gpio_in(sms->gic, irq + 1));
80
-#include "qemu-common.h"
26
+ qdev_get_gpio_in(sms->gic, irq + i));
81
#include "qemu/datadir.h"
27
gpex_set_irq_num(GPEX_HOST(dev), i, irq + i);
82
#include "qapi/error.h"
28
}
83
#include "qemu/error-report.h"
29
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"
30
--
120
--
31
2.20.1
121
2.25.1
32
122
33
123
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
clock_init*() inlined funtions are simple wrappers around
4
clock_set*() and are not used. Remove them in favor of clock_set*().
5
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200806123858.30058-2-f4bug@amsat.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
include/hw/clock.h | 13 -------------
12
1 file changed, 13 deletions(-)
13
14
diff --git a/include/hw/clock.h b/include/hw/clock.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/include/hw/clock.h
17
+++ b/include/hw/clock.h
18
@@ -XXX,XX +XXX,XX @@ static inline bool clock_is_enabled(const Clock *clk)
19
return clock_get(clk) != 0;
20
}
21
22
-static inline void clock_init(Clock *clk, uint64_t value)
23
-{
24
- clock_set(clk, value);
25
-}
26
-static inline void clock_init_hz(Clock *clk, uint64_t value)
27
-{
28
- clock_set_hz(clk, value);
29
-}
30
-static inline void clock_init_ns(Clock *clk, uint64_t value)
31
-{
32
- clock_set_ns(clk, value);
33
-}
34
-
35
#endif /* QEMU_HW_CLOCK_H */
36
--
37
2.20.1
38
39
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
Let clock_set() return a boolean value whether the clock
4
has been updated or not.
5
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200806123858.30058-3-f4bug@amsat.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
include/hw/clock.h | 12 +++++++-----
12
hw/core/clock.c | 7 ++++++-
13
2 files changed, 13 insertions(+), 6 deletions(-)
14
15
diff --git a/include/hw/clock.h b/include/hw/clock.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/clock.h
18
+++ b/include/hw/clock.h
19
@@ -XXX,XX +XXX,XX @@ void clock_set_source(Clock *clk, Clock *src);
20
* @value: the clock's value, 0 means unclocked
21
*
22
* Set the local cached period value of @clk to @value.
23
+ *
24
+ * @return: true if the clock is changed.
25
*/
26
-void clock_set(Clock *clk, uint64_t value);
27
+bool clock_set(Clock *clk, uint64_t value);
28
29
-static inline void clock_set_hz(Clock *clk, unsigned hz)
30
+static inline bool clock_set_hz(Clock *clk, unsigned hz)
31
{
32
- clock_set(clk, CLOCK_PERIOD_FROM_HZ(hz));
33
+ return clock_set(clk, CLOCK_PERIOD_FROM_HZ(hz));
34
}
35
36
-static inline void clock_set_ns(Clock *clk, unsigned ns)
37
+static inline bool clock_set_ns(Clock *clk, unsigned ns)
38
{
39
- clock_set(clk, CLOCK_PERIOD_FROM_NS(ns));
40
+ return clock_set(clk, CLOCK_PERIOD_FROM_NS(ns));
41
}
42
43
/**
44
diff --git a/hw/core/clock.c b/hw/core/clock.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/core/clock.c
47
+++ b/hw/core/clock.c
48
@@ -XXX,XX +XXX,XX @@ void clock_clear_callback(Clock *clk)
49
clock_set_callback(clk, NULL, NULL);
50
}
51
52
-void clock_set(Clock *clk, uint64_t period)
53
+bool clock_set(Clock *clk, uint64_t period)
54
{
55
+ if (clk->period == period) {
56
+ return false;
57
+ }
58
trace_clock_set(CLOCK_PATH(clk), CLOCK_PERIOD_TO_NS(clk->period),
59
CLOCK_PERIOD_TO_NS(period));
60
clk->period = period;
61
+
62
+ return true;
63
}
64
65
static void clock_propagate_period(Clock *clk, bool call_callbacks)
66
--
67
2.20.1
68
69
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The calculation of the length of TLB range invalidate operations
2
in tlbi_aa64_range_get_length() is incorrect in two ways:
3
* the NUM field is 5 bits, but we read only 4 bits
4
* we miscalculate the page_shift value, because of an
5
off-by-one error:
6
TG 0b00 is invalid
7
TG 0b01 is 4K granule size == 4096 == 2^12
8
TG 0b10 is 16K granule size == 16384 == 2^14
9
TG 0b11 is 64K granule size == 65536 == 2^16
10
so page_shift should be (TG - 1) * 2 + 12
2
11
3
In commit ce4afed839 ("target/arm: Implement AArch32 HCR and HCR2")
12
Thanks to the bug report submitter Cha HyunSoo for identifying
4
the HCR_EL2 register has been changed from type NO_RAW (no underlying
13
both these errors.
5
state and does not support raw access for state saving/loading) to
6
type CONST (TCG can assume the value to be constant), removing the
7
read/write accessors.
8
We forgot to remove the previous type ARM_CP_NO_RAW. This is not
9
really a problem since the field is overwritten. However it makes
10
code review confuse, so remove it.
11
14
12
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Fixes: 84940ed82552d3c ("target/arm: Add support for FEAT_TLBIRANGE")
13
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
16
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/734
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20200812111223.7787-1-f4bug@amsat.org
19
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Message-id: 20211130173257.1274194-1-peter.maydell@linaro.org
17
---
22
---
18
target/arm/helper.c | 1 -
23
target/arm/helper.c | 6 +++---
19
1 file changed, 1 deletion(-)
24
1 file changed, 3 insertions(+), 3 deletions(-)
20
25
21
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
diff --git a/target/arm/helper.c b/target/arm/helper.c
22
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/helper.c
28
--- a/target/arm/helper.c
24
+++ b/target/arm/helper.c
29
+++ b/target/arm/helper.c
25
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el3_no_el2_cp_reginfo[] = {
30
@@ -XXX,XX +XXX,XX @@ static uint64_t tlbi_aa64_range_get_length(CPUARMState *env,
26
.access = PL2_RW,
31
uint64_t exponent;
27
.readfn = arm_cp_read_zero, .writefn = arm_cp_write_ignore },
32
uint64_t length;
28
{ .name = "HCR_EL2", .state = ARM_CP_STATE_BOTH,
33
29
- .type = ARM_CP_NO_RAW,
34
- num = extract64(value, 39, 4);
30
.opc0 = 3, .opc1 = 4, .crn = 1, .crm = 1, .opc2 = 0,
35
+ num = extract64(value, 39, 5);
31
.access = PL2_RW,
36
scale = extract64(value, 44, 2);
32
.type = ARM_CP_CONST, .resetvalue = 0 },
37
page_size_granule = extract64(value, 46, 2);
38
39
- page_shift = page_size_granule * 2 + 12;
40
-
41
if (page_size_granule == 0) {
42
qemu_log_mask(LOG_GUEST_ERROR, "Invalid page size granule %d\n",
43
page_size_granule);
44
return 0;
45
}
46
47
+ page_shift = (page_size_granule - 1) * 2 + 12;
48
+
49
exponent = (5 * scale) + 1;
50
length = (num + 1) << (exponent + page_shift);
51
33
--
52
--
34
2.20.1
53
2.25.1
35
54
36
55
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Patrick Venture <venture@google.com>
2
2
3
The existing clr functions have only one vector argument, and so
3
The rx_active boolean change to true should always trigger a try_read
4
can only clear in place. The existing movz functions have two
4
call that flushes the queue.
5
vector arguments, and so can clear while moving. Merge them, with
6
a flag that controls the sense of active vs inactive elements
7
being cleared.
8
5
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Patrick Venture <venture@google.com>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20200815013145.539409-10-richard.henderson@linaro.org
8
Message-id: 20211203221002.1719306-1-venture@google.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
10
---
14
target/arm/helper-sve.h | 5 ---
11
hw/net/npcm7xx_emc.c | 18 ++++++++----------
15
target/arm/sve_helper.c | 70 ++++++++------------------------------
12
1 file changed, 8 insertions(+), 10 deletions(-)
16
target/arm/translate-sve.c | 53 +++++++++++------------------
17
3 files changed, 34 insertions(+), 94 deletions(-)
18
13
19
diff --git a/target/arm/helper-sve.h b/target/arm/helper-sve.h
14
diff --git a/hw/net/npcm7xx_emc.c b/hw/net/npcm7xx_emc.c
20
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/helper-sve.h
16
--- a/hw/net/npcm7xx_emc.c
22
+++ b/target/arm/helper-sve.h
17
+++ b/hw/net/npcm7xx_emc.c
23
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(sve_uminv_h, TCG_CALL_NO_RWG, i64, ptr, ptr, i32)
18
@@ -XXX,XX +XXX,XX @@ static void emc_halt_rx(NPCM7xxEMCState *emc, uint32_t mista_flag)
24
DEF_HELPER_FLAGS_3(sve_uminv_s, TCG_CALL_NO_RWG, i64, ptr, ptr, i32)
19
emc_set_mista(emc, mista_flag);
25
DEF_HELPER_FLAGS_3(sve_uminv_d, TCG_CALL_NO_RWG, i64, ptr, ptr, i32)
26
27
-DEF_HELPER_FLAGS_3(sve_clr_b, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
28
-DEF_HELPER_FLAGS_3(sve_clr_h, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
29
-DEF_HELPER_FLAGS_3(sve_clr_s, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
30
-DEF_HELPER_FLAGS_3(sve_clr_d, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
31
-
32
DEF_HELPER_FLAGS_4(sve_movz_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
33
DEF_HELPER_FLAGS_4(sve_movz_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
34
DEF_HELPER_FLAGS_4(sve_movz_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
35
diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/arm/sve_helper.c
38
+++ b/target/arm/sve_helper.c
39
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(sve_pnext)(void *vd, void *vg, uint32_t pred_desc)
40
return flags;
41
}
20
}
42
21
43
-/* Store zero into every active element of Zd. We will use this for two
22
+static void emc_enable_rx_and_flush(NPCM7xxEMCState *emc)
44
- * and three-operand predicated instructions for which logic dictates a
23
+{
45
- * zero result. In particular, logical shift by element size, which is
24
+ emc->rx_active = true;
46
- * otherwise undefined on the host.
25
+ qemu_flush_queued_packets(qemu_get_queue(emc->nic));
47
- *
26
+}
48
- * For element sizes smaller than uint64_t, we use tables to expand
27
+
49
- * the N bits of the controlling predicate to a byte mask, and clear
28
static void emc_set_next_tx_descriptor(NPCM7xxEMCState *emc,
50
- * those bytes.
29
const NPCM7xxEMCTxDesc *tx_desc,
51
+/*
30
uint32_t desc_addr)
52
+ * Copy Zn into Zd, and store zero into inactive elements.
31
@@ -XXX,XX +XXX,XX @@ static ssize_t emc_receive(NetClientState *nc, const uint8_t *buf, size_t len1)
53
+ * If inv, store zeros into the active elements.
32
return len;
54
*/
33
}
55
-void HELPER(sve_clr_b)(void *vd, void *vg, uint32_t desc)
34
35
-static void emc_try_receive_next_packet(NPCM7xxEMCState *emc)
56
-{
36
-{
57
- intptr_t i, opr_sz = simd_oprsz(desc) / 8;
37
- if (emc_can_receive(qemu_get_queue(emc->nic))) {
58
- uint64_t *d = vd;
38
- qemu_flush_queued_packets(qemu_get_queue(emc->nic));
59
- uint8_t *pg = vg;
60
- for (i = 0; i < opr_sz; i += 1) {
61
- d[i] &= ~expand_pred_b(pg[H1(i)]);
62
- }
39
- }
63
-}
40
-}
64
-
41
-
65
-void HELPER(sve_clr_h)(void *vd, void *vg, uint32_t desc)
42
static uint64_t npcm7xx_emc_read(void *opaque, hwaddr offset, unsigned size)
66
-{
67
- intptr_t i, opr_sz = simd_oprsz(desc) / 8;
68
- uint64_t *d = vd;
69
- uint8_t *pg = vg;
70
- for (i = 0; i < opr_sz; i += 1) {
71
- d[i] &= ~expand_pred_h(pg[H1(i)]);
72
- }
73
-}
74
-
75
-void HELPER(sve_clr_s)(void *vd, void *vg, uint32_t desc)
76
-{
77
- intptr_t i, opr_sz = simd_oprsz(desc) / 8;
78
- uint64_t *d = vd;
79
- uint8_t *pg = vg;
80
- for (i = 0; i < opr_sz; i += 1) {
81
- d[i] &= ~expand_pred_s(pg[H1(i)]);
82
- }
83
-}
84
-
85
-void HELPER(sve_clr_d)(void *vd, void *vg, uint32_t desc)
86
-{
87
- intptr_t i, opr_sz = simd_oprsz(desc) / 8;
88
- uint64_t *d = vd;
89
- uint8_t *pg = vg;
90
- for (i = 0; i < opr_sz; i += 1) {
91
- if (pg[H1(i)] & 1) {
92
- d[i] = 0;
93
- }
94
- }
95
-}
96
-
97
-/* Copy Zn into Zd, and store zero into inactive elements. */
98
void HELPER(sve_movz_b)(void *vd, void *vn, void *vg, uint32_t desc)
99
{
43
{
100
intptr_t i, opr_sz = simd_oprsz(desc) / 8;
44
NPCM7xxEMCState *emc = opaque;
101
+ uint64_t inv = -(uint64_t)(simd_data(desc) & 1);
45
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_emc_write(void *opaque, hwaddr offset,
102
uint64_t *d = vd, *n = vn;
46
emc->regs[REG_MGSTA] |= REG_MGSTA_RXHA;
103
uint8_t *pg = vg;
47
}
104
+
48
if (value & REG_MCMDR_RXON) {
105
for (i = 0; i < opr_sz; i += 1) {
49
- emc->rx_active = true;
106
- d[i] = n[i] & expand_pred_b(pg[H1(i)]);
50
+ emc_enable_rx_and_flush(emc);
107
+ d[i] = n[i] & (expand_pred_b(pg[H1(i)]) ^ inv);
51
} else {
108
}
52
emc_halt_rx(emc, 0);
109
}
53
}
110
54
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_emc_write(void *opaque, hwaddr offset,
111
void HELPER(sve_movz_h)(void *vd, void *vn, void *vg, uint32_t desc)
55
break;
112
{
56
case REG_RSDR:
113
intptr_t i, opr_sz = simd_oprsz(desc) / 8;
57
if (emc->regs[REG_MCMDR] & REG_MCMDR_RXON) {
114
+ uint64_t inv = -(uint64_t)(simd_data(desc) & 1);
58
- emc->rx_active = true;
115
uint64_t *d = vd, *n = vn;
59
- emc_try_receive_next_packet(emc);
116
uint8_t *pg = vg;
60
+ emc_enable_rx_and_flush(emc);
117
+
61
}
118
for (i = 0; i < opr_sz; i += 1) {
62
break;
119
- d[i] = n[i] & expand_pred_h(pg[H1(i)]);
63
case REG_MIIDA:
120
+ d[i] = n[i] & (expand_pred_h(pg[H1(i)]) ^ inv);
121
}
122
}
123
124
void HELPER(sve_movz_s)(void *vd, void *vn, void *vg, uint32_t desc)
125
{
126
intptr_t i, opr_sz = simd_oprsz(desc) / 8;
127
+ uint64_t inv = -(uint64_t)(simd_data(desc) & 1);
128
uint64_t *d = vd, *n = vn;
129
uint8_t *pg = vg;
130
+
131
for (i = 0; i < opr_sz; i += 1) {
132
- d[i] = n[i] & expand_pred_s(pg[H1(i)]);
133
+ d[i] = n[i] & (expand_pred_s(pg[H1(i)]) ^ inv);
134
}
135
}
136
137
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_movz_d)(void *vd, void *vn, void *vg, uint32_t desc)
138
intptr_t i, opr_sz = simd_oprsz(desc) / 8;
139
uint64_t *d = vd, *n = vn;
140
uint8_t *pg = vg;
141
+ uint8_t inv = simd_data(desc);
142
+
143
for (i = 0; i < opr_sz; i += 1) {
144
- d[i] = n[i] & -(uint64_t)(pg[H1(i)] & 1);
145
+ d[i] = n[i] & -(uint64_t)((pg[H1(i)] ^ inv) & 1);
146
}
147
}
148
149
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
150
index XXXXXXX..XXXXXXX 100644
151
--- a/target/arm/translate-sve.c
152
+++ b/target/arm/translate-sve.c
153
@@ -XXX,XX +XXX,XX @@ static bool trans_SADDV(DisasContext *s, arg_rpr_esz *a)
154
*** SVE Shift by Immediate - Predicated Group
155
*/
156
157
-/* Store zero into every active element of Zd. We will use this for two
158
- * and three-operand predicated instructions for which logic dictates a
159
- * zero result.
160
+/*
161
+ * Copy Zn into Zd, storing zeros into inactive elements.
162
+ * If invert, store zeros into the active elements.
163
*/
164
-static bool do_clr_zp(DisasContext *s, int rd, int pg, int esz)
165
-{
166
- static gen_helper_gvec_2 * const fns[4] = {
167
- gen_helper_sve_clr_b, gen_helper_sve_clr_h,
168
- gen_helper_sve_clr_s, gen_helper_sve_clr_d,
169
- };
170
- if (sve_access_check(s)) {
171
- unsigned vsz = vec_full_reg_size(s);
172
- tcg_gen_gvec_2_ool(vec_full_reg_offset(s, rd),
173
- pred_full_reg_offset(s, pg),
174
- vsz, vsz, 0, fns[esz]);
175
- }
176
- return true;
177
-}
178
-
179
-/* Copy Zn into Zd, storing zeros into inactive elements. */
180
-static void do_movz_zpz(DisasContext *s, int rd, int rn, int pg, int esz)
181
+static bool do_movz_zpz(DisasContext *s, int rd, int rn, int pg,
182
+ int esz, bool invert)
183
{
184
static gen_helper_gvec_3 * const fns[4] = {
185
gen_helper_sve_movz_b, gen_helper_sve_movz_h,
186
gen_helper_sve_movz_s, gen_helper_sve_movz_d,
187
};
188
- unsigned vsz = vec_full_reg_size(s);
189
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
190
- vec_full_reg_offset(s, rn),
191
- pred_full_reg_offset(s, pg),
192
- vsz, vsz, 0, fns[esz]);
193
+
194
+ if (sve_access_check(s)) {
195
+ unsigned vsz = vec_full_reg_size(s);
196
+ tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
197
+ vec_full_reg_offset(s, rn),
198
+ pred_full_reg_offset(s, pg),
199
+ vsz, vsz, invert, fns[esz]);
200
+ }
201
+ return true;
202
}
203
204
static bool do_zpzi_ool(DisasContext *s, arg_rpri_esz *a,
205
@@ -XXX,XX +XXX,XX @@ static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
206
/* Shift by element size is architecturally valid.
207
For logical shifts, it is a zeroing operation. */
208
if (a->imm >= (8 << a->esz)) {
209
- return do_clr_zp(s, a->rd, a->pg, a->esz);
210
+ return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
211
} else {
212
return do_zpzi_ool(s, a, fns[a->esz]);
213
}
214
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
215
/* Shift by element size is architecturally valid.
216
For logical shifts, it is a zeroing operation. */
217
if (a->imm >= (8 << a->esz)) {
218
- return do_clr_zp(s, a->rd, a->pg, a->esz);
219
+ return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
220
} else {
221
return do_zpzi_ool(s, a, fns[a->esz]);
222
}
223
@@ -XXX,XX +XXX,XX @@ static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
224
/* Shift by element size is architecturally valid. For arithmetic
225
right shift for division, it is a zeroing operation. */
226
if (a->imm >= (8 << a->esz)) {
227
- return do_clr_zp(s, a->rd, a->pg, a->esz);
228
+ return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
229
} else {
230
return do_zpzi_ool(s, a, fns[a->esz]);
231
}
232
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1R_zpri(DisasContext *s, arg_rpri_load *a)
233
234
/* Zero the inactive elements. */
235
gen_set_label(over);
236
- do_movz_zpz(s, a->rd, a->rd, a->pg, esz);
237
- return true;
238
+ return do_movz_zpz(s, a->rd, a->rd, a->pg, esz, false);
239
}
240
241
static void do_st_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr,
242
@@ -XXX,XX +XXX,XX @@ static bool trans_MOVPRFX_m(DisasContext *s, arg_rpr_esz *a)
243
244
static bool trans_MOVPRFX_z(DisasContext *s, arg_rpr_esz *a)
245
{
246
- if (sve_access_check(s)) {
247
- do_movz_zpz(s, a->rd, a->rn, a->pg, a->esz);
248
- }
249
- return true;
250
+ return do_movz_zpz(s, a->rd, a->rn, a->pg, a->esz, false);
251
}
252
--
64
--
253
2.20.1
65
2.25.1
254
66
255
67
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
Allow the device to execute the DMA transfers in a different
3
When a virtio-iommu is instantiated, describe it using the ACPI VIOT
4
AddressSpace.
4
table.
5
5
6
The A10 and H3 SoC keep using the system_memory address space,
6
Acked-by: Igor Mammedov <imammedo@redhat.com>
7
but via the proper dma_memory_access() API.
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
8
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
9
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20211210170415.583179-2-jean-philippe@linaro.org
10
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
11
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
12
Message-id: 20200814110057.307-1-f4bug@amsat.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
11
---
15
include/hw/sd/allwinner-sdhost.h | 6 ++++++
12
hw/arm/virt-acpi-build.c | 7 +++++++
16
hw/arm/allwinner-a10.c | 2 ++
13
hw/arm/Kconfig | 1 +
17
hw/arm/allwinner-h3.c | 2 ++
14
2 files changed, 8 insertions(+)
18
hw/sd/allwinner-sdhost.c | 37 ++++++++++++++++++++++++++------
19
4 files changed, 41 insertions(+), 6 deletions(-)
20
15
21
diff --git a/include/hw/sd/allwinner-sdhost.h b/include/hw/sd/allwinner-sdhost.h
16
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
22
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/sd/allwinner-sdhost.h
18
--- a/hw/arm/virt-acpi-build.c
24
+++ b/include/hw/sd/allwinner-sdhost.h
19
+++ b/hw/arm/virt-acpi-build.c
25
@@ -XXX,XX +XXX,XX @@ typedef struct AwSdHostState {
20
@@ -XXX,XX +XXX,XX @@
26
/** Interrupt output signal to notify CPU */
21
#include "kvm_arm.h"
27
qemu_irq irq;
22
#include "migration/vmstate.h"
28
23
#include "hw/acpi/ghes.h"
29
+ /** Memory region where DMA transfers are done */
24
+#include "hw/acpi/viot.h"
30
+ MemoryRegion *dma_mr;
25
31
+
26
#define ARM_SPI_BASE 32
32
+ /** Address space used internally for DMA transfers */
27
33
+ AddressSpace dma_as;
28
@@ -XXX,XX +XXX,XX @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
34
+
35
/** Number of bytes left in current DMA transfer */
36
uint32_t transfer_cnt;
37
38
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/arm/allwinner-a10.c
41
+++ b/hw/arm/allwinner-a10.c
42
@@ -XXX,XX +XXX,XX @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
43
}
29
}
44
30
#endif
45
/* SD/MMC */
31
46
+ object_property_set_link(OBJECT(&s->mmc0), "dma-memory",
32
+ if (vms->iommu == VIRT_IOMMU_VIRTIO) {
47
+ OBJECT(get_system_memory()), &error_fatal);
33
+ acpi_add_table(table_offsets, tables_blob);
48
sysbus_realize(SYS_BUS_DEVICE(&s->mmc0), &error_fatal);
34
+ build_viot(ms, tables_blob, tables->linker, vms->virtio_iommu_bdf,
49
sysbus_mmio_map(SYS_BUS_DEVICE(&s->mmc0), 0, AW_A10_MMC0_BASE);
35
+ vms->oem_id, vms->oem_table_id);
50
sysbus_connect_irq(SYS_BUS_DEVICE(&s->mmc0), 0, qdev_get_gpio_in(dev, 32));
51
diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/hw/arm/allwinner-h3.c
54
+++ b/hw/arm/allwinner-h3.c
55
@@ -XXX,XX +XXX,XX @@ static void allwinner_h3_realize(DeviceState *dev, Error **errp)
56
sysbus_mmio_map(SYS_BUS_DEVICE(&s->sid), 0, s->memmap[AW_H3_SID]);
57
58
/* SD/MMC */
59
+ object_property_set_link(OBJECT(&s->mmc0), "dma-memory",
60
+ OBJECT(get_system_memory()), &error_fatal);
61
sysbus_realize(SYS_BUS_DEVICE(&s->mmc0), &error_fatal);
62
sysbus_mmio_map(SYS_BUS_DEVICE(&s->mmc0), 0, s->memmap[AW_H3_MMC0]);
63
sysbus_connect_irq(SYS_BUS_DEVICE(&s->mmc0), 0,
64
diff --git a/hw/sd/allwinner-sdhost.c b/hw/sd/allwinner-sdhost.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/hw/sd/allwinner-sdhost.c
67
+++ b/hw/sd/allwinner-sdhost.c
68
@@ -XXX,XX +XXX,XX @@
69
#include "qemu/log.h"
70
#include "qemu/module.h"
71
#include "qemu/units.h"
72
+#include "qapi/error.h"
73
#include "sysemu/blockdev.h"
74
+#include "sysemu/dma.h"
75
+#include "hw/qdev-properties.h"
76
#include "hw/irq.h"
77
#include "hw/sd/allwinner-sdhost.h"
78
#include "migration/vmstate.h"
79
@@ -XXX,XX +XXX,XX @@ static uint32_t allwinner_sdhost_process_desc(AwSdHostState *s,
80
uint8_t buf[1024];
81
82
/* Read descriptor */
83
- cpu_physical_memory_read(desc_addr, desc, sizeof(*desc));
84
+ dma_memory_read(&s->dma_as, desc_addr, desc, sizeof(*desc));
85
if (desc->size == 0) {
86
desc->size = klass->max_desc_size;
87
} else if (desc->size > klass->max_desc_size) {
88
@@ -XXX,XX +XXX,XX @@ static uint32_t allwinner_sdhost_process_desc(AwSdHostState *s,
89
90
/* Write to SD bus */
91
if (is_write) {
92
- cpu_physical_memory_read((desc->addr & DESC_SIZE_MASK) + num_done,
93
- buf, buf_bytes);
94
+ dma_memory_read(&s->dma_as,
95
+ (desc->addr & DESC_SIZE_MASK) + num_done,
96
+ buf, buf_bytes);
97
sdbus_write_data(&s->sdbus, buf, buf_bytes);
98
99
/* Read from SD bus */
100
} else {
101
sdbus_read_data(&s->sdbus, buf, buf_bytes);
102
- cpu_physical_memory_write((desc->addr & DESC_SIZE_MASK) + num_done,
103
- buf, buf_bytes);
104
+ dma_memory_write(&s->dma_as,
105
+ (desc->addr & DESC_SIZE_MASK) + num_done,
106
+ buf, buf_bytes);
107
}
108
num_done += buf_bytes;
109
}
110
111
/* Clear hold flag and flush descriptor */
112
desc->status &= ~DESC_STATUS_HOLD;
113
- cpu_physical_memory_write(desc_addr, desc, sizeof(*desc));
114
+ dma_memory_write(&s->dma_as, desc_addr, desc, sizeof(*desc));
115
116
return num_done;
117
}
118
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_allwinner_sdhost = {
119
}
120
};
121
122
+static Property allwinner_sdhost_properties[] = {
123
+ DEFINE_PROP_LINK("dma-memory", AwSdHostState, dma_mr,
124
+ TYPE_MEMORY_REGION, MemoryRegion *),
125
+ DEFINE_PROP_END_OF_LIST(),
126
+};
127
+
128
static void allwinner_sdhost_init(Object *obj)
129
{
130
AwSdHostState *s = AW_SDHOST(obj);
131
@@ -XXX,XX +XXX,XX @@ static void allwinner_sdhost_init(Object *obj)
132
sysbus_init_irq(SYS_BUS_DEVICE(s), &s->irq);
133
}
134
135
+static void allwinner_sdhost_realize(DeviceState *dev, Error **errp)
136
+{
137
+ AwSdHostState *s = AW_SDHOST(dev);
138
+
139
+ if (!s->dma_mr) {
140
+ error_setg(errp, TYPE_AW_SDHOST " 'dma-memory' link not set");
141
+ return;
142
+ }
36
+ }
143
+
37
+
144
+ address_space_init(&s->dma_as, s->dma_mr, "sdhost-dma");
38
/* XSDT is pointed to by RSDP */
145
+}
39
xsdt = tables_blob->len;
146
+
40
build_xsdt(tables_blob, tables->linker, table_offsets, vms->oem_id,
147
static void allwinner_sdhost_reset(DeviceState *dev)
41
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
148
{
42
index XXXXXXX..XXXXXXX 100644
149
AwSdHostState *s = AW_SDHOST(dev);
43
--- a/hw/arm/Kconfig
150
@@ -XXX,XX +XXX,XX @@ static void allwinner_sdhost_class_init(ObjectClass *klass, void *data)
44
+++ b/hw/arm/Kconfig
151
45
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
152
dc->reset = allwinner_sdhost_reset;
46
select DIMM
153
dc->vmsd = &vmstate_allwinner_sdhost;
47
select ACPI_HW_REDUCED
154
+ dc->realize = allwinner_sdhost_realize;
48
select ACPI_APEI
155
+ device_class_set_props(dc, allwinner_sdhost_properties);
49
+ select ACPI_VIOT
156
}
50
157
51
config CHEETAH
158
static void allwinner_sdhost_sun4i_class_init(ObjectClass *klass, void *data)
52
bool
159
--
53
--
160
2.20.1
54
2.25.1
161
55
162
56
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
To better align the read/write accesses, display the value after
3
virtio-iommu is now supported with ACPI VIOT as well as device tree.
4
the offset (read accesses only display the offset).
4
Remove the restriction that prevents from instantiating a virtio-iommu
5
device under ACPI.
5
6
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Acked-by: Igor Mammedov <imammedo@redhat.com>
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Message-id: 20200812190206.31595-2-f4bug@amsat.org
9
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
10
Message-id: 20211210170415.583179-3-jean-philippe@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
12
---
11
hw/misc/unimp.c | 8 ++++----
13
hw/arm/virt.c | 10 ++--------
12
1 file changed, 4 insertions(+), 4 deletions(-)
14
hw/virtio/virtio-iommu-pci.c | 12 ++----------
15
2 files changed, 4 insertions(+), 18 deletions(-)
13
16
14
diff --git a/hw/misc/unimp.c b/hw/misc/unimp.c
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/misc/unimp.c
19
--- a/hw/arm/virt.c
17
+++ b/hw/misc/unimp.c
20
+++ b/hw/arm/virt.c
18
@@ -XXX,XX +XXX,XX @@ static uint64_t unimp_read(void *opaque, hwaddr offset, unsigned size)
21
@@ -XXX,XX +XXX,XX @@ static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
19
{
22
MachineClass *mc = MACHINE_GET_CLASS(machine);
20
UnimplementedDeviceState *s = UNIMPLEMENTED_DEVICE(opaque);
23
21
24
if (device_is_dynamic_sysbus(mc, dev) ||
22
- qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read "
25
- (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM))) {
23
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read "
26
+ object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) ||
24
"(size %d, offset 0x%" HWADDR_PRIx ")\n",
27
+ object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
25
s->name, size, offset);
28
return HOTPLUG_HANDLER(machine);
26
return 0;
29
}
27
@@ -XXX,XX +XXX,XX @@ static void unimp_write(void *opaque, hwaddr offset,
30
- if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
28
UnimplementedDeviceState *s = UNIMPLEMENTED_DEVICE(opaque);
31
- VirtMachineState *vms = VIRT_MACHINE(machine);
29
32
-
30
qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write "
33
- if (!vms->bootinfo.firmware_loaded || !virt_is_acpi_enabled(vms)) {
31
- "(size %d, value 0x%" PRIx64
34
- return HOTPLUG_HANDLER(machine);
32
- ", offset 0x%" HWADDR_PRIx ")\n",
35
- }
33
- s->name, size, value, offset);
36
- }
34
+ "(size %d, offset 0x%" HWADDR_PRIx
37
return NULL;
35
+ ", value 0x%" PRIx64 ")\n",
36
+ s->name, size, offset, value);
37
}
38
}
38
39
39
static const MemoryRegionOps unimp_ops = {
40
diff --git a/hw/virtio/virtio-iommu-pci.c b/hw/virtio/virtio-iommu-pci.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/virtio/virtio-iommu-pci.c
43
+++ b/hw/virtio/virtio-iommu-pci.c
44
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
45
VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
46
47
if (!qdev_get_machine_hotplug_handler(DEVICE(vpci_dev))) {
48
- MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
49
-
50
- error_setg(errp,
51
- "%s machine fails to create iommu-map device tree bindings",
52
- mc->name);
53
- error_append_hint(errp,
54
- "Check your machine implements a hotplug handler "
55
- "for the virtio-iommu-pci device\n");
56
- error_append_hint(errp, "Check the guest is booted without FW or with "
57
- "-no-acpi\n");
58
+ error_setg(errp, "Check your machine implements a hotplug handler "
59
+ "for the virtio-iommu-pci device");
60
return;
61
}
62
for (int i = 0; i < s->nb_reserved_regions; i++) {
40
--
63
--
41
2.20.1
64
2.25.1
42
65
43
66
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
Clock canonical name is set in device_set_realized (see the block
3
We do not support instantiating multiple IOMMUs. Before adding a
4
added to hw/core/qdev.c in commit 0e6934f264).
4
virtio-iommu, check that no other IOMMU is present. This will detect
5
If we connect a clock after the device is realized, this code is
5
both "iommu=smmuv3" machine parameter and another virtio-iommu instance.
6
not executed. This is currently not a problem as this name is only
7
used for trace events, however this disrupt tracing.
8
6
9
Add a comment to document qdev_connect_clock_in() must be called
7
Fixes: 70e89132c9 ("hw/arm/virt: Add the virtio-iommu device tree mappings")
10
before the device is realized, and assert this condition.
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
11
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
12
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-id: 20211210170415.583179-4-jean-philippe@linaro.org
14
Message-id: 20200803105647.22223-5-f4bug@amsat.org
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
13
---
17
include/hw/qdev-clock.h | 2 ++
14
hw/arm/virt.c | 5 +++++
18
hw/core/qdev-clock.c | 1 +
15
1 file changed, 5 insertions(+)
19
2 files changed, 3 insertions(+)
20
16
21
diff --git a/include/hw/qdev-clock.h b/include/hw/qdev-clock.h
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
22
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/qdev-clock.h
19
--- a/hw/arm/virt.c
24
+++ b/include/hw/qdev-clock.h
20
+++ b/hw/arm/virt.c
25
@@ -XXX,XX +XXX,XX @@ Clock *qdev_get_clock_out(DeviceState *dev, const char *name);
21
@@ -XXX,XX +XXX,XX @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
26
*
22
hwaddr db_start = 0, db_end = 0;
27
* Set the source clock of input clock @name of device @dev to @source.
23
char *resv_prop_str;
28
* @source period update will be propagated to @name clock.
24
29
+ *
25
+ if (vms->iommu != VIRT_IOMMU_NONE) {
30
+ * Must be called before @dev is realized.
26
+ error_setg(errp, "virt machine does not support multiple IOMMUs");
31
*/
27
+ return;
32
void qdev_connect_clock_in(DeviceState *dev, const char *name, Clock *source);
28
+ }
33
29
+
34
diff --git a/hw/core/qdev-clock.c b/hw/core/qdev-clock.c
30
switch (vms->msi_controller) {
35
index XXXXXXX..XXXXXXX 100644
31
case VIRT_MSI_CTRL_NONE:
36
--- a/hw/core/qdev-clock.c
32
return;
37
+++ b/hw/core/qdev-clock.c
38
@@ -XXX,XX +XXX,XX @@ Clock *qdev_alias_clock(DeviceState *dev, const char *name,
39
40
void qdev_connect_clock_in(DeviceState *dev, const char *name, Clock *source)
41
{
42
+ assert(!dev->realized);
43
clock_set_source(qdev_get_clock_in(dev, name), source);
44
}
45
--
33
--
46
2.20.1
34
2.25.1
47
35
48
36
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
Avoid propagating the clock change when the clock does not change.
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.
4
6
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Suggested-by: Igor Mammedov <imammedo@redhat.com>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
7
Message-id: 20200806123858.30058-4-f4bug@amsat.org
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
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
13
---
10
include/hw/clock.h | 5 +++--
14
hw/arm/virt.c | 5 +++--
11
1 file changed, 3 insertions(+), 2 deletions(-)
15
1 file changed, 3 insertions(+), 2 deletions(-)
12
16
13
diff --git a/include/hw/clock.h b/include/hw/clock.h
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/clock.h
19
--- a/hw/arm/virt.c
16
+++ b/include/hw/clock.h
20
+++ b/hw/arm/virt.c
17
@@ -XXX,XX +XXX,XX @@ void clock_propagate(Clock *clk);
21
@@ -XXX,XX +XXX,XX @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
18
*/
22
db_start, db_end,
19
static inline void clock_update(Clock *clk, uint64_t value)
23
VIRTIO_IOMMU_RESV_MEM_T_MSI);
20
{
24
21
- clock_set(clk, value);
25
- qdev_prop_set_uint32(dev, "len-reserved-regions", 1);
22
- clock_propagate(clk);
26
- qdev_prop_set_string(dev, "reserved-regions[0]", resv_prop_str);
23
+ if (clock_set(clk, value)) {
27
+ object_property_set_uint(OBJECT(dev), "len-reserved-regions", 1, errp);
24
+ clock_propagate(clk);
28
+ object_property_set_str(OBJECT(dev), "reserved-regions[0]",
25
+ }
29
+ resv_prop_str, errp);
30
g_free(resv_prop_str);
31
}
26
}
32
}
27
28
static inline void clock_update_hz(Clock *clk, unsigned hz)
29
--
33
--
30
2.20.1
34
2.25.1
31
35
32
36
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
We want to assert the device is not realized. To avoid overloading
3
Create empty data files and allow updates for the upcoming VIOT tests.
4
this header including "hw/qdev-core.h", uninline the function first.
5
4
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Acked-by: Igor Mammedov <imammedo@redhat.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Message-id: 20200803105647.22223-4-f4bug@amsat.org
7
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
8
Message-id: 20211210170415.583179-6-jean-philippe@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
include/hw/qdev-clock.h | 6 +-----
11
tests/qtest/bios-tables-test-allowed-diff.h | 3 +++
12
hw/core/qdev-clock.c | 5 +++++
12
tests/data/acpi/q35/DSDT.viot | 0
13
2 files changed, 6 insertions(+), 5 deletions(-)
13
tests/data/acpi/q35/VIOT.viot | 0
14
tests/data/acpi/virt/VIOT | 0
15
4 files changed, 3 insertions(+)
16
create mode 100644 tests/data/acpi/q35/DSDT.viot
17
create mode 100644 tests/data/acpi/q35/VIOT.viot
18
create mode 100644 tests/data/acpi/virt/VIOT
14
19
15
diff --git a/include/hw/qdev-clock.h b/include/hw/qdev-clock.h
20
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
16
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/qdev-clock.h
22
--- a/tests/qtest/bios-tables-test-allowed-diff.h
18
+++ b/include/hw/qdev-clock.h
23
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
19
@@ -XXX,XX +XXX,XX @@ Clock *qdev_get_clock_out(DeviceState *dev, const char *name);
24
@@ -1 +1,4 @@
20
* Set the source clock of input clock @name of device @dev to @source.
25
/* List of comma-separated changed AML files to ignore */
21
* @source period update will be propagated to @name clock.
26
+"tests/data/acpi/virt/VIOT",
22
*/
27
+"tests/data/acpi/q35/DSDT.viot",
23
-static inline void qdev_connect_clock_in(DeviceState *dev, const char *name,
28
+"tests/data/acpi/q35/VIOT.viot",
24
- Clock *source)
29
diff --git a/tests/data/acpi/q35/DSDT.viot b/tests/data/acpi/q35/DSDT.viot
25
-{
30
new file mode 100644
26
- clock_set_source(qdev_get_clock_in(dev, name), source);
31
index XXXXXXX..XXXXXXX
27
-}
32
diff --git a/tests/data/acpi/q35/VIOT.viot b/tests/data/acpi/q35/VIOT.viot
28
+void qdev_connect_clock_in(DeviceState *dev, const char *name, Clock *source);
33
new file mode 100644
29
34
index XXXXXXX..XXXXXXX
30
/**
35
diff --git a/tests/data/acpi/virt/VIOT b/tests/data/acpi/virt/VIOT
31
* qdev_alias_clock:
36
new file mode 100644
32
diff --git a/hw/core/qdev-clock.c b/hw/core/qdev-clock.c
37
index XXXXXXX..XXXXXXX
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/core/qdev-clock.c
35
+++ b/hw/core/qdev-clock.c
36
@@ -XXX,XX +XXX,XX @@ Clock *qdev_alias_clock(DeviceState *dev, const char *name,
37
38
return ncl->clock;
39
}
40
+
41
+void qdev_connect_clock_in(DeviceState *dev, const char *name, Clock *source)
42
+{
43
+ clock_set_source(qdev_get_clock_in(dev, name), source);
44
+}
45
--
38
--
46
2.20.1
39
2.25.1
47
40
48
41
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
Add left-shift to match the existing right-shift.
3
Add two test cases for VIOT, one on the q35 machine and the other on
4
virt. To test complex topologies the q35 test has two PCIe buses that
5
bypass the IOMMU (and are therefore not described by VIOT), and two
6
buses that are translated by virtio-iommu.
4
7
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
7
Message-id: 20200815013145.539409-2-richard.henderson@linaro.org
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
11
Message-id: 20211210170415.583179-7-jean-philippe@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
13
---
10
include/qemu/int128.h | 16 ++++++++++++++++
14
tests/qtest/bios-tables-test.c | 38 ++++++++++++++++++++++++++++++++++
11
1 file changed, 16 insertions(+)
15
1 file changed, 38 insertions(+)
12
16
13
diff --git a/include/qemu/int128.h b/include/qemu/int128.h
17
diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/include/qemu/int128.h
19
--- a/tests/qtest/bios-tables-test.c
16
+++ b/include/qemu/int128.h
20
+++ b/tests/qtest/bios-tables-test.c
17
@@ -XXX,XX +XXX,XX @@ static inline Int128 int128_rshift(Int128 a, int n)
21
@@ -XXX,XX +XXX,XX @@ static void test_acpi_virt_tcg(void)
18
return a >> n;
22
free_test_data(&data);
19
}
23
}
20
24
21
+static inline Int128 int128_lshift(Int128 a, int n)
25
+static void test_acpi_q35_viot(void)
22
+{
26
+{
23
+ return a << n;
27
+ test_data data = {
28
+ .machine = MACHINE_Q35,
29
+ .variant = ".viot",
30
+ };
31
+
32
+ /*
33
+ * To keep things interesting, two buses bypass the IOMMU.
34
+ * VIOT should only describes the other two buses.
35
+ */
36
+ test_acpi_one("-machine default_bus_bypass_iommu=on "
37
+ "-device virtio-iommu-pci "
38
+ "-device pxb-pcie,bus_nr=0x10,id=pcie.100,bus=pcie.0 "
39
+ "-device pxb-pcie,bus_nr=0x20,id=pcie.200,bus=pcie.0,bypass_iommu=on "
40
+ "-device pxb-pcie,bus_nr=0x30,id=pcie.300,bus=pcie.0",
41
+ &data);
42
+ free_test_data(&data);
24
+}
43
+}
25
+
44
+
26
static inline Int128 int128_add(Int128 a, Int128 b)
45
+static void test_acpi_virt_viot(void)
27
{
28
return a + b;
29
@@ -XXX,XX +XXX,XX @@ static inline Int128 int128_rshift(Int128 a, int n)
30
}
31
}
32
33
+static inline Int128 int128_lshift(Int128 a, int n)
34
+{
46
+{
35
+ uint64_t l = a.lo << (n & 63);
47
+ test_data data = {
36
+ if (n >= 64) {
48
+ .machine = "virt",
37
+ return int128_make128(0, l);
49
+ .uefi_fl1 = "pc-bios/edk2-aarch64-code.fd",
38
+ } else if (n > 0) {
50
+ .uefi_fl2 = "pc-bios/edk2-arm-vars.fd",
39
+ return int128_make128(l, (a.hi << n) | (a.lo >> (64 - n)));
51
+ .cd = "tests/data/uefi-boot-images/bios-tables-test.aarch64.iso.qcow2",
40
+ }
52
+ .ram_start = 0x40000000ULL,
41
+ return a;
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);
42
+}
59
+}
43
+
60
+
44
static inline Int128 int128_add(Int128 a, Int128 b)
61
static void test_oem_fields(test_data *data)
45
{
62
{
46
uint64_t lo = a.lo + b.lo;
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);
77
}
78
}
79
ret = g_test_run();
47
--
80
--
48
2.20.1
81
2.25.1
49
82
50
83
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
Allow the device to execute the DMA transfers in a different
3
Add expected blobs of the VIOT and DSDT table for the VIOT test on the
4
AddressSpace.
4
q35 machine.
5
5
6
We keep using the system_memory address space, but via the
6
Since the test instantiates a virtio device and two PCIe expander
7
proper dma_memory_access() API.
7
bridges, DSDT.viot has more blocks than the base DSDT.
8
8
9
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
The VIOT table generated for the q35 test is:
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
11
Message-id: 20200814125533.4047-1-f4bug@amsat.org
11
[000h 0000 4] Signature : "VIOT" [Virtual I/O Translation Table]
12
[004h 0004 4] Table Length : 00000070
13
[008h 0008 1] Revision : 00
14
[009h 0009 1] Checksum : 3D
15
[00Ah 0010 6] Oem ID : "BOCHS "
16
[010h 0016 8] Oem Table ID : "BXPC "
17
[018h 0024 4] Oem Revision : 00000001
18
[01Ch 0028 4] Asl Compiler ID : "BXPC"
19
[020h 0032 4] Asl Compiler Revision : 00000001
20
21
[024h 0036 2] Node count : 0003
22
[026h 0038 2] Node offset : 0030
23
[028h 0040 8] Reserved : 0000000000000000
24
25
[030h 0048 1] Type : 03 [VirtIO-PCI IOMMU]
26
[031h 0049 1] Reserved : 00
27
[032h 0050 2] Length : 0010
28
29
[034h 0052 2] PCI Segment : 0000
30
[036h 0054 2] PCI BDF number : 0010
31
[038h 0056 8] Reserved : 0000000000000000
32
33
[040h 0064 1] Type : 01 [PCI Range]
34
[041h 0065 1] Reserved : 00
35
[042h 0066 2] Length : 0018
36
37
[044h 0068 4] Endpoint start : 00003000
38
[048h 0072 2] PCI Segment start : 0000
39
[04Ah 0074 2] PCI Segment end : 0000
40
[04Ch 0076 2] PCI BDF start : 3000
41
[04Eh 0078 2] PCI BDF end : 30FF
42
[050h 0080 2] Output node : 0030
43
[052h 0082 6] Reserved : 000000000000
44
45
[058h 0088 1] Type : 01 [PCI Range]
46
[059h 0089 1] Reserved : 00
47
[05Ah 0090 2] Length : 0018
48
49
[05Ch 0092 4] Endpoint start : 00001000
50
[060h 0096 2] PCI Segment start : 0000
51
[062h 0098 2] PCI Segment end : 0000
52
[064h 0100 2] PCI BDF start : 1000
53
[066h 0102 2] PCI BDF end : 10FF
54
[068h 0104 2] Output node : 0030
55
[06Ah 0106 6] Reserved : 000000000000
56
57
And the DSDT diff is:
58
59
@@ -XXX,XX +XXX,XX @@
60
*
61
* Disassembling to symbolic ASL+ operators
62
*
63
- * Disassembly of tests/data/acpi/q35/DSDT, Fri Dec 10 15:03:08 2021
64
+ * Disassembly of /tmp/aml-H9Y5D1, Fri Dec 10 15:02:27 2021
65
*
66
* Original Table Header:
67
* Signature "DSDT"
68
- * Length 0x00002061 (8289)
69
+ * Length 0x000024B6 (9398)
70
* Revision 0x01 **** 32-bit table (V1), no 64-bit math support
71
- * Checksum 0xFA
72
+ * Checksum 0xA7
73
* OEM ID "BOCHS "
74
* OEM Table ID "BXPC "
75
* OEM Revision 0x00000001 (1)
76
@@ -XXX,XX +XXX,XX @@
77
}
78
}
79
80
+ Scope (\_SB)
81
+ {
82
+ Device (PC30)
83
+ {
84
+ Name (_UID, 0x30) // _UID: Unique ID
85
+ Name (_BBN, 0x30) // _BBN: BIOS Bus Number
86
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
87
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
88
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
89
+ {
90
+ CreateDWordField (Arg3, Zero, CDW1)
91
+ If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
92
+ {
93
+ CreateDWordField (Arg3, 0x04, CDW2)
94
+ CreateDWordField (Arg3, 0x08, CDW3)
95
+ Local0 = CDW3 /* \_SB_.PC30._OSC.CDW3 */
96
+ Local0 &= 0x1F
97
+ If ((Arg1 != One))
98
+ {
99
+ CDW1 |= 0x08
100
+ }
101
+
102
+ If ((CDW3 != Local0))
103
+ {
104
+ CDW1 |= 0x10
105
+ }
106
+
107
+ CDW3 = Local0
108
+ }
109
+ Else
110
+ {
111
+ CDW1 |= 0x04
112
+ }
113
+
114
+ Return (Arg3)
115
+ }
116
+
117
+ Method (_PRT, 0, NotSerialized) // _PRT: PCI Routing Table
118
+ {
119
+ Local0 = Package (0x80){}
120
+ Local1 = Zero
121
+ While ((Local1 < 0x80))
122
+ {
123
+ Local2 = (Local1 >> 0x02)
124
+ Local3 = ((Local1 + Local2) & 0x03)
125
+ If ((Local3 == Zero))
126
+ {
127
+ Local4 = Package (0x04)
128
+ {
129
+ Zero,
130
+ Zero,
131
+ LNKD,
132
+ Zero
133
+ }
134
+ }
135
+
136
+ If ((Local3 == One))
137
+ {
138
+ Local4 = Package (0x04)
139
+ {
140
+ Zero,
141
+ Zero,
142
+ LNKA,
143
+ Zero
144
+ }
145
+ }
146
+
147
+ If ((Local3 == 0x02))
148
+ {
149
+ Local4 = Package (0x04)
150
+ {
151
+ Zero,
152
+ Zero,
153
+ LNKB,
154
+ Zero
155
+ }
156
+ }
157
+
158
+ If ((Local3 == 0x03))
159
+ {
160
+ Local4 = Package (0x04)
161
+ {
162
+ Zero,
163
+ Zero,
164
+ LNKC,
165
+ Zero
166
+ }
167
+ }
168
+
169
+ Local4 [Zero] = ((Local2 << 0x10) | 0xFFFF)
170
+ Local4 [One] = (Local1 & 0x03)
171
+ Local0 [Local1] = Local4
172
+ Local1++
173
+ }
174
+
175
+ Return (Local0)
176
+ }
177
+
178
+ Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
179
+ {
180
+ WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
181
+ 0x0000, // Granularity
182
+ 0x0030, // Range Minimum
183
+ 0x0030, // Range Maximum
184
+ 0x0000, // Translation Offset
185
+ 0x0001, // Length
186
+ ,, )
187
+ })
188
+ }
189
+ }
190
+
191
+ Scope (\_SB)
192
+ {
193
+ Device (PC20)
194
+ {
195
+ Name (_UID, 0x20) // _UID: Unique ID
196
+ Name (_BBN, 0x20) // _BBN: BIOS Bus Number
197
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
198
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
199
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
200
+ {
201
+ CreateDWordField (Arg3, Zero, CDW1)
202
+ If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
203
+ {
204
+ CreateDWordField (Arg3, 0x04, CDW2)
205
+ CreateDWordField (Arg3, 0x08, CDW3)
206
+ Local0 = CDW3 /* \_SB_.PC20._OSC.CDW3 */
207
+ Local0 &= 0x1F
208
+ If ((Arg1 != One))
209
+ {
210
+ CDW1 |= 0x08
211
+ }
212
+
213
+ If ((CDW3 != Local0))
214
+ {
215
+ CDW1 |= 0x10
216
+ }
217
+
218
+ CDW3 = Local0
219
+ }
220
+ Else
221
+ {
222
+ CDW1 |= 0x04
223
+ }
224
+
225
+ Return (Arg3)
226
+ }
227
+
228
+ Method (_PRT, 0, NotSerialized) // _PRT: PCI Routing Table
229
+ {
230
+ Local0 = Package (0x80){}
231
+ Local1 = Zero
232
+ While ((Local1 < 0x80))
233
+ {
234
+ Local2 = (Local1 >> 0x02)
235
+ Local3 = ((Local1 + Local2) & 0x03)
236
+ If ((Local3 == Zero))
237
+ {
238
+ Local4 = Package (0x04)
239
+ {
240
+ Zero,
241
+ Zero,
242
+ LNKD,
243
+ Zero
244
+ }
245
+ }
246
+
247
+ If ((Local3 == One))
248
+ {
249
+ Local4 = Package (0x04)
250
+ {
251
+ Zero,
252
+ Zero,
253
+ LNKA,
254
+ Zero
255
+ }
256
+ }
257
+
258
+ If ((Local3 == 0x02))
259
+ {
260
+ Local4 = Package (0x04)
261
+ {
262
+ Zero,
263
+ Zero,
264
+ LNKB,
265
+ Zero
266
+ }
267
+ }
268
+
269
+ If ((Local3 == 0x03))
270
+ {
271
+ Local4 = Package (0x04)
272
+ {
273
+ Zero,
274
+ Zero,
275
+ LNKC,
276
+ Zero
277
+ }
278
+ }
279
+
280
+ Local4 [Zero] = ((Local2 << 0x10) | 0xFFFF)
281
+ Local4 [One] = (Local1 & 0x03)
282
+ Local0 [Local1] = Local4
283
+ Local1++
284
+ }
285
+
286
+ Return (Local0)
287
+ }
288
+
289
+ Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
290
+ {
291
+ WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
292
+ 0x0000, // Granularity
293
+ 0x0020, // Range Minimum
294
+ 0x0020, // Range Maximum
295
+ 0x0000, // Translation Offset
296
+ 0x0001, // Length
297
+ ,, )
298
+ })
299
+ }
300
+ }
301
+
302
+ Scope (\_SB)
303
+ {
304
+ Device (PC10)
305
+ {
306
+ Name (_UID, 0x10) // _UID: Unique ID
307
+ Name (_BBN, 0x10) // _BBN: BIOS Bus Number
308
+ Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */) // _HID: Hardware ID
309
+ Name (_CID, EisaId ("PNP0A03") /* PCI Bus */) // _CID: Compatible ID
310
+ Method (_OSC, 4, NotSerialized) // _OSC: Operating System Capabilities
311
+ {
312
+ CreateDWordField (Arg3, Zero, CDW1)
313
+ If ((Arg0 == ToUUID ("33db4d5b-1ff7-401c-9657-7441c03dd766") /* PCI Host Bridge Device */))
314
+ {
315
+ CreateDWordField (Arg3, 0x04, CDW2)
316
+ CreateDWordField (Arg3, 0x08, CDW3)
317
+ Local0 = CDW3 /* \_SB_.PC10._OSC.CDW3 */
318
+ Local0 &= 0x1F
319
+ If ((Arg1 != One))
320
+ {
321
+ CDW1 |= 0x08
322
+ }
323
+
324
+ If ((CDW3 != Local0))
325
+ {
326
+ CDW1 |= 0x10
327
+ }
328
+
329
+ CDW3 = Local0
330
+ }
331
+ Else
332
+ {
333
+ CDW1 |= 0x04
334
+ }
335
+
336
+ Return (Arg3)
337
+ }
338
+
339
+ Method (_PRT, 0, NotSerialized) // _PRT: PCI Routing Table
340
+ {
341
+ Local0 = Package (0x80){}
342
+ Local1 = Zero
343
+ While ((Local1 < 0x80))
344
+ {
345
+ Local2 = (Local1 >> 0x02)
346
+ Local3 = ((Local1 + Local2) & 0x03)
347
+ If ((Local3 == Zero))
348
+ {
349
+ Local4 = Package (0x04)
350
+ {
351
+ Zero,
352
+ Zero,
353
+ LNKD,
354
+ Zero
355
+ }
356
+ }
357
+
358
+ If ((Local3 == One))
359
+ {
360
+ Local4 = Package (0x04)
361
+ {
362
+ Zero,
363
+ Zero,
364
+ LNKA,
365
+ Zero
366
+ }
367
+ }
368
+
369
+ If ((Local3 == 0x02))
370
+ {
371
+ Local4 = Package (0x04)
372
+ {
373
+ Zero,
374
+ Zero,
375
+ LNKB,
376
+ Zero
377
+ }
378
+ }
379
+
380
+ If ((Local3 == 0x03))
381
+ {
382
+ Local4 = Package (0x04)
383
+ {
384
+ Zero,
385
+ Zero,
386
+ LNKC,
387
+ Zero
388
+ }
389
+ }
390
+
391
+ Local4 [Zero] = ((Local2 << 0x10) | 0xFFFF)
392
+ Local4 [One] = (Local1 & 0x03)
393
+ Local0 [Local1] = Local4
394
+ Local1++
395
+ }
396
+
397
+ Return (Local0)
398
+ }
399
+
400
+ Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
401
+ {
402
+ WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
403
+ 0x0000, // Granularity
404
+ 0x0010, // Range Minimum
405
+ 0x0010, // Range Maximum
406
+ 0x0000, // Translation Offset
407
+ 0x0001, // Length
408
+ ,, )
409
+ })
410
+ }
411
+ }
412
+
413
Scope (\_SB.PCI0)
414
{
415
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
416
@@ -XXX,XX +XXX,XX @@
417
WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
418
0x0000, // Granularity
419
0x0000, // Range Minimum
420
- 0x00FF, // Range Maximum
421
+ 0x000F, // Range Maximum
422
0x0000, // Translation Offset
423
- 0x0100, // Length
424
+ 0x0010, // Length
425
,, )
426
IO (Decode16,
427
0x0CF8, // Range Minimum
428
@@ -XXX,XX +XXX,XX @@
429
}
430
}
431
432
+ Device (S10)
433
+ {
434
+ Name (_ADR, 0x00020000) // _ADR: Address
435
+ }
436
+
437
+ Device (S18)
438
+ {
439
+ Name (_ADR, 0x00030000) // _ADR: Address
440
+ }
441
+
442
+ Device (S20)
443
+ {
444
+ Name (_ADR, 0x00040000) // _ADR: Address
445
+ }
446
+
447
+ Device (S28)
448
+ {
449
+ Name (_ADR, 0x00050000) // _ADR: Address
450
+ }
451
+
452
Method (PCNT, 0, NotSerialized)
453
{
454
}
455
456
Reviewed-by: Eric Auger <eric.auger@redhat.com>
457
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
458
Message-id: 20211210170415.583179-8-jean-philippe@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
459
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
460
---
14
hw/arm/musicpal.c | 45 +++++++++++++++++++++++++++++++--------------
461
tests/qtest/bios-tables-test-allowed-diff.h | 2 --
15
1 file changed, 31 insertions(+), 14 deletions(-)
462
tests/data/acpi/q35/DSDT.viot | Bin 0 -> 9398 bytes
16
463
tests/data/acpi/q35/VIOT.viot | Bin 0 -> 112 bytes
17
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
464
3 files changed, 2 deletions(-)
465
466
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
18
index XXXXXXX..XXXXXXX 100644
467
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/musicpal.c
468
--- a/tests/qtest/bios-tables-test-allowed-diff.h
20
+++ b/hw/arm/musicpal.c
469
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
21
@@ -XXX,XX +XXX,XX @@
470
@@ -XXX,XX +XXX,XX @@
22
#include "hw/audio/wm8750.h"
471
/* List of comma-separated changed AML files to ignore */
23
#include "sysemu/block-backend.h"
472
"tests/data/acpi/virt/VIOT",
24
#include "sysemu/runstate.h"
473
-"tests/data/acpi/q35/DSDT.viot",
25
+#include "sysemu/dma.h"
474
-"tests/data/acpi/q35/VIOT.viot",
26
#include "exec/address-spaces.h"
475
diff --git a/tests/data/acpi/q35/DSDT.viot b/tests/data/acpi/q35/DSDT.viot
27
#include "ui/pixel_ops.h"
476
index XXXXXXX..XXXXXXX 100644
28
#include "qemu/cutils.h"
477
GIT binary patch
29
@@ -XXX,XX +XXX,XX @@ typedef struct mv88w8618_eth_state {
478
literal 9398
30
479
zcmeHNO>7&-8J*>iv|O&FB}G~Oi$yp||57BBoWHhc5OS9yDTx$CQgH$r;8Idr*-4Q_
31
MemoryRegion iomem;
480
z5(9Az1F`}niVsB-)<KW7p`g9Br(A2Gm-gmc1N78GFS!;)e2V(MnH_0{q<{#yMgn&C
32
qemu_irq irq;
481
zn|*J-d9yqFhO_H6z19~`FlPL*u<DkZ*}|)JH;X@mF-FI<cPg<fti9tEN*yB^i5czN
33
+ MemoryRegion *dma_mr;
482
zNq&q?!OZ;BE3B7{KWzJ-`Tn~f`9?Qj8~2^N8{Oc8J%57{==w%rS#;nOCp*nTr@iZ1
34
+ AddressSpace dma_as;
483
zb+?i;JLQUJ=O0?8*>S~D)a>NF1~WVB6^~_B#yhJ`H+JU@=6aXs`?Yv)J2h=N?drcS
35
uint32_t smir;
484
zeLZ*n<<Bm^n}6`jfBx#u8&(W}1?)}iF9o#mZ~E2+zwdn7yK3AbIzKnxpZ>JRPm3~#
36
uint32_t icr;
485
z&ICS{+_OayRW-l=Mtk=~uaS3o8z<_udd|(wqg`&JnVPfCe>BUOO`Su3e>pff_^UW%
37
uint32_t imr;
486
z&JE^NO`)=Amg~iqRB1pPscP?(>#ZuY8GHCmlEvD$9g3%4Db~Dfz2SATnddvrR-Oe^
38
@@ -XXX,XX +XXX,XX @@ typedef struct mv88w8618_eth_state {
487
z;s;dJec!hnzi)ri^I6YN9vtkm{^TdUF8h7gX8-<Qe4p)GQ=)AtYx2VcwdLVAEXEjG
39
NICConf conf;
488
z^Mj|UHPqkj-LsWuzQem1>F3atdZn=zv3$#RmZzSHN+6-yyU#8cJb=YDilX&sl}vNm
40
} mv88w8618_eth_state;
489
znkgAR^O<3kj4if>{ly5fwRfMWuC5=lrlvKPX~i#654Cp}R_d*JS$9laZ$ra6)<ns8
41
490
zFZy28G%xP(nit&F>LDi%G<tIc=TY=gl$jSD&Uv!Yat~XR46h%rI$!}a%!|xG7u8Zn
42
-static void eth_rx_desc_put(uint32_t addr, mv88w8618_rx_desc *desc)
491
zeY8_|n=K>xz_v_W8VX$W-Fg-qFWcT}7MCyz{%%{ia7hZ>Law-k6NOr}VI&_48U=2l
43
+static void eth_rx_desc_put(AddressSpace *dma_as, uint32_t addr,
492
zwqDKFE8eTwwozDdms#e?x?5a|v>&JF;2_v0L~z5n%BYU^52<*cWuD4|GYUm@1+?))
44
+ mv88w8618_rx_desc *desc)
493
zte^45>Rz)t*<T5V#={r>@t@{%?^i#W{i=HAZ*Dc9y59Va-+#P!jrGs;u38a{fLr`N
45
{
494
zvT@rUu>DljxJ?^&Z?-?vyJn3C>3D=qux{Y*bs5|5n)Qmi$TD^Zdn4GU$ocJS2Hh-<
46
cpu_to_le32s(&desc->cmdstat);
495
z`xPI^^+v0nUVdjMos8k`WGl7hA`{03ju%<lrgAHSpd^DRf-*}_#Ly0mB!LSfVgWcQ
47
cpu_to_le16s(&desc->bytes);
496
z&T$@~G9)JI=hz5m0vkrel+Xy{Oh7pkAu-V!j*W7rY(bO}Q$nMH2`FbGB&N)QaV4<4
48
cpu_to_le16s(&desc->buffer_size);
497
zo)~9JXiP9=;}NPl<C@MmXG&;XFlFNrsyfFsonxFSp<}vEgsRSQP3O3#b6nSnP}ON_
49
cpu_to_le32s(&desc->buffer);
498
zI!#Tdsp~|j>ckUB>FI=~GokB5sOq#dotCE4(sd$KbtW~PNlj-`*NIToiD#j5J#9^=
50
cpu_to_le32s(&desc->next);
499
zt?NXn>YUJYPG~wObe#xQos*i*NloXZt`niEb4t@WrRki~bs|)CI+{*L)9L6s5vn><
51
- cpu_physical_memory_write(addr, desc, sizeof(*desc));
500
zn$DD_Go|Z9sOn5>I@6lYw5}7Os&iV?Ij!lO)^#FOb!If38BJ$K*NIToIiu;E(R9w}
52
+ dma_memory_write(dma_as, addr, desc, sizeof(*desc));
501
zIuWWmPiZ<&X*y5oIuWWmF_XaEC!a&Jn$B5WCqh-{X-(&8P3LJ{Cqh-{8P3dyPr@^t
53
}
502
zSqL9?X9Uwd3W@23*s~h*tj0X6GZCuHa~kuU#yqDp5vt7d8uPryJg+kms?5hU=3^T3
54
503
zF`bD}WnSP+=`t5MQ$FJ_2&Q~+BP6E0f^%BVIW6a$o)e+SX~IDBih-7z6{O~7YTy`&
55
-static void eth_rx_desc_get(uint32_t addr, mv88w8618_rx_desc *desc)
504
zLjy&Cv?7QikV#>n0>>@MV8oK`Gmun34-FKdlm-J8SZSaNlnhir4-FI{S|bfqV8e)V
56
+static void eth_rx_desc_get(AddressSpace *dma_as, uint32_t addr,
505
zss<{chX#reE#g=hsKAC%sF6d-Km}BWs!kZFsFpKfpbC@>6rprQGEjt4Ck#|zITHq|
57
+ mv88w8618_rx_desc *desc)
506
zK*>M_l;<P^MJRQ`Kn0dFVW0|>3{*fllMEE0)CmI>Sk8ojDo`>|0p(0GP=xY&!axO<
58
{
507
zGhv_#lnhirIg<<&q0|Wj6<E%MfhtfkPyyvkGEjt4Ck#|zITHq|K*>M_lrzad5lWpf
59
- cpu_physical_memory_read(addr, desc, sizeof(*desc));
508
zP=V!47^ngz0~JutBm+e#b;3XemNQ|X3X}{~Ksl2P6rt1!0~J`#gn=qhGEf2KOfpb}
60
+ dma_memory_read(dma_as, addr, desc, sizeof(*desc));
509
zQYQ>lU^x>8szAv=1(Y+%KoLrvFi?TzOc<yFB?A>u&LjgxD0RX>1(q{mpbC@>R6seC
61
le32_to_cpus(&desc->cmdstat);
510
z3>2Z%2?G^a&V+#~P%=;f<xDbAgi<FARA4z12C6{GKn0XD$v_cGoiI>=<xCi;0wn_#
62
le16_to_cpus(&desc->bytes);
511
zP|hR+MJRQ`Kn0dFVW0|>3{*fllMEE0)CmI>Sk8ojDo`>|0p(0GP=rz^3{+q_69%e4
63
le16_to_cpus(&desc->buffer_size);
512
z$v_2^Gs!>^N}VuJf#pmXr~)Me6;RG314Srx!axxz28u{EP=u<1B2)}iVZuNaCK;&0
64
@@ -XXX,XX +XXX,XX @@ static ssize_t eth_receive(NetClientState *nc, const uint8_t *buf, size_t size)
513
zBm-5LFi?dF167!0pbC==RAItE6($T+VUmF=Ofpb~2?JG_Fi?d_2C6X0Kouqo6p_5T
65
continue;
514
zFi=FeV!SiSKoR0H$dH(_Z(*Q_WZ%L-5y`$K14StNmJAdjmWs}HV4<vU_xO+1efmLq
66
}
515
zZ;W>N_U)fP6Qy6Nw5mbt9Y(#emWSi66=>tq#xoh#Ue=0qyhxi8ZOUe5y0V7VfPUhp
67
do {
516
zwX=;ymc+i5%sg9Ja~lZ&8oAV@mHc>&CHP9v4R(jhtT?un;O4e9#pno)Xkh7OWgK&a
68
- eth_rx_desc_get(desc_addr, &desc);
517
zyj=3Iv0OuoK_;5rOr5f(Kb~ZXDBO+V`OWYo#_C08imwChQxnjdd?wZLDou8aj;$SD
69
+ eth_rx_desc_get(&s->dma_as, desc_addr, &desc);
518
zGDYiA3<$Tu<JnHL(KPOChi#zrR32t83}naR$+ym4P_h?z_5#|cW-nw$XD_sOtE62l
70
if ((desc.cmdstat & MP_ETH_RX_OWN) && desc.buffer_size >= size) {
519
zrD3@*)NVyiklt0&yF9%+klsBey&I<Y2E<!f(E8TuJte)z(|ZHyy<^gQVfx}=`q&B5
71
- cpu_physical_memory_write(desc.buffer + s->vlan_header,
520
z7nSryp1wGczIaUfVwiq$Fn#<4=@*ssi#+|}K>EdF(l3VTOM~ghPLRH&q%ZOGrGfON
72
+ dma_memory_write(&s->dma_as, desc.buffer + s->vlan_header,
521
zW73zx^yR_y<0nX8R??Sw`tm^f@-gYlNFSp|*<gA{q?Zp5Oe-+l#rmyYmKozi9y=P>
73
buf, size);
522
zVReJU*h=ZuVXiS$ohTbw-O#v9>(yZbGE|)?8(H1ZIKvV!jWa0>vy!3eMA^vdhQ>`s
74
desc.bytes = size + s->vlan_header;
523
zuMSg{q3T50$m)j1!HixV<}X9liL#N^4c*tL^y)CF8LCc{jjV3yKAqL8!%SzWI#H%q
75
desc.cmdstat &= ~MP_ETH_RX_OWN;
524
z=bSrQ&)%JCRttF5g4Zf`6l?y@>PzD7MA^D>wBlcH6r1ucwJ<p0O%rZ?JzIY3-QdmZ
76
@@ -XXX,XX +XXX,XX @@ static ssize_t eth_receive(NetClientState *nc, const uint8_t *buf, size_t size)
525
zzs|n>`a5r3e|z)wcUaqS>nqFQ-8x}eCF4u`OWUxqst-@1rSmUs%WmKP5e0dcb?e2N
77
if (s->icr & s->imr) {
526
z;Z|x*!);VwF|Yuhqs^khqOM!@u*jY!WYldISF(V6`BoNd&6Qfk3>X#SuD^7J>p_D=
78
qemu_irq_raise(s->irq);
527
zBPa51y^_n#=cpOt#Zf$ya$Ae9Mfz56n|<i!a=ELS@)%a{^NIH3SDuN<R~sah1km#P
79
}
528
zU@?*f%<rG=4W1wgfi;C?_n|W@%lm$&8YfvNOJodIg&IcIpIJQRHr<+ej11GQ6)&eF
80
- eth_rx_desc_put(desc_addr, &desc);
529
z2Lam*jIH}#y0>KnY%4JQfOYS$*uU%f#@$U6`N8I3N-lV?5ErFCdv~xDmu2(wexld4
81
+ eth_rx_desc_put(&s->dma_as, desc_addr, &desc);
530
z4v^;aVAT2k6GJ^m*FD(Wqc(Qg^)6a<?}h$zLoj}4;PP!+(O{@!a1y-hoAhF_7!z+6
82
return size;
531
zslpAmNtYbjHrw-~#SPVk_FUf>-Obg6yV`8o$8_`PyJe_;bY5_EMBfBfWU!Q=*9HsG
83
}
532
z%_Cda{@_Krr!oHVhv9+y+T5qR8zZ2aZ>5r!$*|f$^U%yBUYfR&B!+EYy_PwL!BeUi
84
desc_addr = desc.next;
533
zJH^}r3r9Q+B)X@Z)fk=P13w&7x#wBtXTZ)g>WITPg5r&pQc!nmyrmk#S(>>b9xnNr
85
@@ -XXX,XX +XXX,XX @@ static ssize_t eth_receive(NetClientState *nc, const uint8_t *buf, size_t size)
534
zx_b#v9Xv-Y><Wb%?S^0Xe&<)bbKl_=Z|3C$tf|F<bYzE*mfHB;uC)`q-?buaBe?l?
86
return size;
535
zcLTpK*k<49Z32`K?|nSBMFqxTK^_IE-li2fEGdK~(ZdoKBl6ab4a;Hler#`xvEXJG
87
}
536
zb?<E%EZExfX>jcOVhS*0rS~RS1dA#xhkv@Nct@#q?LyeKS<$uFec!bw>{@uu$gZ6a
88
537
zyVen1i{1BKd%~`D7|m$;U0a<I*3I7%^N%N%lGYdU_GS!gaR8T$NA@GzFi~z`l7hdl
89
-static void eth_tx_desc_put(uint32_t addr, mv88w8618_tx_desc *desc)
538
zarZy6590|88pi(1zq;V(>38zM0sT&<zX;R5$1w3;`_JMG`;&I&0Y23DMx1%@(w(R9
90
+static void eth_tx_desc_put(AddressSpace *dma_as, uint32_t addr,
539
z4M$j;D5J+Gy%fijRQsctzFKf&cv|BAz#YLq3CZJWDdtL4u1u1|mkdcUp7|sxJC+?Y
91
+ mv88w8618_tx_desc *desc)
540
z_@@s`v3j}Q7*z>6X~cwUxUL8G1KT)_XTp!KAbs;vCp{K3&~_X@+ew=-D}v`2MbFV0
92
{
541
zQsVsL=rXi-pI*G|iiz;VTCutgUs)hDzV1+4?8KcoP3xROf<M%qC6lgVdpFt4<-|uM
93
cpu_to_le32s(&desc->cmdstat);
542
z=#rl_b1#YjSIl6Toj2z_hOZcKupkdE(LozC(fN=FY(x|sk)ym|;Rq2E1xJWD%Z!ol
94
cpu_to_le16s(&desc->res);
543
Gu>S+TT-130
95
cpu_to_le16s(&desc->bytes);
544
96
cpu_to_le32s(&desc->buffer);
545
literal 0
97
cpu_to_le32s(&desc->next);
546
HcmV?d00001
98
- cpu_physical_memory_write(addr, desc, sizeof(*desc));
547
99
+ dma_memory_write(dma_as, addr, desc, sizeof(*desc));
548
diff --git a/tests/data/acpi/q35/VIOT.viot b/tests/data/acpi/q35/VIOT.viot
100
}
549
index XXXXXXX..XXXXXXX 100644
101
550
GIT binary patch
102
-static void eth_tx_desc_get(uint32_t addr, mv88w8618_tx_desc *desc)
551
literal 112
103
+static void eth_tx_desc_get(AddressSpace *dma_as, uint32_t addr,
552
zcmWIZ^baXu00LVle`k+i1*eDrX9XZ&1PX!JAex!M0Hgv8m>C3sGzdcgBZCA3T-xBj
104
+ mv88w8618_tx_desc *desc)
553
Q0Zb)W9Hva*zW_`e0M!8s0RR91
105
{
554
106
- cpu_physical_memory_read(addr, desc, sizeof(*desc));
555
literal 0
107
+ dma_memory_read(dma_as, addr, desc, sizeof(*desc));
556
HcmV?d00001
108
le32_to_cpus(&desc->cmdstat);
557
109
le16_to_cpus(&desc->res);
110
le16_to_cpus(&desc->bytes);
111
@@ -XXX,XX +XXX,XX @@ static void eth_send(mv88w8618_eth_state *s, int queue_index)
112
int len;
113
114
do {
115
- eth_tx_desc_get(desc_addr, &desc);
116
+ eth_tx_desc_get(&s->dma_as, desc_addr, &desc);
117
next_desc = desc.next;
118
if (desc.cmdstat & MP_ETH_TX_OWN) {
119
len = desc.bytes;
120
if (len < 2048) {
121
- cpu_physical_memory_read(desc.buffer, buf, len);
122
+ dma_memory_read(&s->dma_as, desc.buffer, buf, len);
123
qemu_send_packet(qemu_get_queue(s->nic), buf, len);
124
}
125
desc.cmdstat &= ~MP_ETH_TX_OWN;
126
s->icr |= 1 << (MP_ETH_IRQ_TXLO_BIT - queue_index);
127
- eth_tx_desc_put(desc_addr, &desc);
128
+ eth_tx_desc_put(&s->dma_as, desc_addr, &desc);
129
}
130
desc_addr = next_desc;
131
} while (desc_addr != s->tx_queue[queue_index]);
132
@@ -XXX,XX +XXX,XX @@ static void mv88w8618_eth_realize(DeviceState *dev, Error **errp)
133
{
134
mv88w8618_eth_state *s = MV88W8618_ETH(dev);
135
136
+ if (!s->dma_mr) {
137
+ error_setg(errp, TYPE_MV88W8618_ETH " 'dma-memory' link not set");
138
+ return;
139
+ }
140
+
141
+ address_space_init(&s->dma_as, s->dma_mr, "emac-dma");
142
s->nic = qemu_new_nic(&net_mv88w8618_info, &s->conf,
143
object_get_typename(OBJECT(dev)), dev->id, s);
144
}
145
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription mv88w8618_eth_vmsd = {
146
147
static Property mv88w8618_eth_properties[] = {
148
DEFINE_NIC_PROPERTIES(mv88w8618_eth_state, conf),
149
+ DEFINE_PROP_LINK("dma-memory", mv88w8618_eth_state, dma_mr,
150
+ TYPE_MEMORY_REGION, MemoryRegion *),
151
DEFINE_PROP_END_OF_LIST(),
152
};
153
154
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
155
qemu_check_nic_model(&nd_table[0], "mv88w8618");
156
dev = qdev_new(TYPE_MV88W8618_ETH);
157
qdev_set_nic_properties(dev, &nd_table[0]);
158
+ object_property_set_link(OBJECT(dev), "dma-memory",
159
+ OBJECT(get_system_memory()), &error_fatal);
160
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
161
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, MP_ETH_BASE);
162
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[MP_ETH_IRQ]);
163
--
558
--
164
2.20.1
559
2.25.1
165
560
166
561
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
Clock canonical name is set in device_set_realized (see the block
3
The VIOT blob contains the following:
4
added to hw/core/qdev.c in commit 0e6934f264).
5
If we connect a clock after the device is realized, this code is
6
not executed. This is currently not a problem as this name is only
7
used for trace events, however this disrupt tracing.
8
4
9
Fix by calling qdev_connect_clock_in() before realizing.
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
10
14
11
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
[024h 0036 2] Node count : 0002
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
16
[026h 0038 2] Node offset : 0030
13
Message-id: 20200803105647.22223-3-f4bug@amsat.org
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
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
44
---
16
hw/arm/xilinx_zynq.c | 18 +++++++++---------
45
tests/qtest/bios-tables-test-allowed-diff.h | 1 -
17
1 file changed, 9 insertions(+), 9 deletions(-)
46
tests/data/acpi/virt/VIOT | Bin 0 -> 88 bytes
47
2 files changed, 1 deletion(-)
18
48
19
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
49
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
20
index XXXXXXX..XXXXXXX 100644
50
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/xilinx_zynq.c
51
--- a/tests/qtest/bios-tables-test-allowed-diff.h
22
+++ b/hw/arm/xilinx_zynq.c
52
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
23
@@ -XXX,XX +XXX,XX @@ static void zynq_init(MachineState *machine)
53
@@ -1,2 +1 @@
24
1, 0x0066, 0x0022, 0x0000, 0x0000, 0x0555, 0x2aa,
54
/* List of comma-separated changed AML files to ignore */
25
0);
55
-"tests/data/acpi/virt/VIOT",
26
56
diff --git a/tests/data/acpi/virt/VIOT b/tests/data/acpi/virt/VIOT
27
- /* Create slcr, keep a pointer to connect clocks */
57
index XXXXXXX..XXXXXXX 100644
28
- slcr = qdev_new("xilinx,zynq_slcr");
58
GIT binary patch
29
- sysbus_realize_and_unref(SYS_BUS_DEVICE(slcr), &error_fatal);
59
literal 88
30
- sysbus_mmio_map(SYS_BUS_DEVICE(slcr), 0, 0xF8000000);
60
zcmWIZ^bd((0D?3pe`k+i1*eDrX9XZ&1PX!JAexE60Hgv8m>C3sGzXN&z`)2L0cSHX
31
-
61
I{D-Rq0Q5fy0RR91
32
/* Create the main clock source, and feed slcr with it */
62
33
zynq_machine->ps_clk = CLOCK(object_new(TYPE_CLOCK));
63
literal 0
34
object_property_add_child(OBJECT(zynq_machine), "ps_clk",
64
HcmV?d00001
35
OBJECT(zynq_machine->ps_clk));
65
36
object_unref(OBJECT(zynq_machine->ps_clk));
37
clock_set_hz(zynq_machine->ps_clk, PS_CLK_FREQUENCY);
38
+
39
+ /* Create slcr, keep a pointer to connect clocks */
40
+ slcr = qdev_new("xilinx,zynq_slcr");
41
qdev_connect_clock_in(slcr, "ps_clk", zynq_machine->ps_clk);
42
+ sysbus_realize_and_unref(SYS_BUS_DEVICE(slcr), &error_fatal);
43
+ sysbus_mmio_map(SYS_BUS_DEVICE(slcr), 0, 0xF8000000);
44
45
dev = qdev_new(TYPE_A9MPCORE_PRIV);
46
qdev_prop_set_uint32(dev, "num-cpu", 1);
47
@@ -XXX,XX +XXX,XX @@ static void zynq_init(MachineState *machine)
48
dev = qdev_new(TYPE_CADENCE_UART);
49
busdev = SYS_BUS_DEVICE(dev);
50
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
51
+ qdev_connect_clock_in(dev, "refclk",
52
+ qdev_get_clock_out(slcr, "uart0_ref_clk"));
53
sysbus_realize_and_unref(busdev, &error_fatal);
54
sysbus_mmio_map(busdev, 0, 0xE0000000);
55
sysbus_connect_irq(busdev, 0, pic[59 - IRQ_OFFSET]);
56
- qdev_connect_clock_in(dev, "refclk",
57
- qdev_get_clock_out(slcr, "uart0_ref_clk"));
58
dev = qdev_new(TYPE_CADENCE_UART);
59
busdev = SYS_BUS_DEVICE(dev);
60
qdev_prop_set_chr(dev, "chardev", serial_hd(1));
61
+ qdev_connect_clock_in(dev, "refclk",
62
+ qdev_get_clock_out(slcr, "uart1_ref_clk"));
63
sysbus_realize_and_unref(busdev, &error_fatal);
64
sysbus_mmio_map(busdev, 0, 0xE0001000);
65
sysbus_connect_irq(busdev, 0, pic[82 - IRQ_OFFSET]);
66
- qdev_connect_clock_in(dev, "refclk",
67
- qdev_get_clock_out(slcr, "uart1_ref_clk"));
68
69
sysbus_create_varargs("cadence_ttc", 0xF8001000,
70
pic[42-IRQ_OFFSET], pic[43-IRQ_OFFSET], pic[44-IRQ_OFFSET], NULL);
71
--
66
--
72
2.20.1
67
2.25.1
73
68
74
69
diff view generated by jsdifflib