1
target-arm queue. This has the "plumb txattrs through various
1
Another arm pullreq; nothing particularly exciting here.
2
bits of exec.c" patches, and a collection of bug fixes from
3
various people.
4
2
5
thanks
6
-- PMM
3
-- PMM
7
4
8
5
6
The following changes since commit e27d5b488ef08408691bfed61f34ee2858136287:
9
7
10
The following changes since commit a3ac12fba028df90f7b3dbec924995c126c41022:
8
Merge remote-tracking branch 'remotes/juanquintela/tags/pull-migration-pull-request' into staging (2020-02-28 14:02:31 +0000)
11
12
Merge remote-tracking branch 'remotes/ehabkost/tags/numa-next-pull-request' into staging (2018-05-31 11:12:36 +0100)
13
9
14
are available in the Git repository at:
10
are available in the Git repository at:
15
11
16
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180531
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200228
17
13
18
for you to fetch changes up to 49d1dca0520ea71bc21867fab6647f474fcf857b:
14
for you to fetch changes up to 1904f9b5f1d94fe12fe021db6b504c87d684f6db:
19
15
20
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice (2018-05-31 14:52:53 +0100)
16
hw/intc/arm_gic_kvm: Don't assume kernel can provide a GICv2 (2020-02-28 16:14:57 +0000)
21
17
22
----------------------------------------------------------------
18
----------------------------------------------------------------
23
target-arm queue:
19
target-arm queue:
24
* target/arm: Honour FPCR.FZ in FRECPX
20
* hw/arm: Use TYPE_PL011 to create serial port
25
* MAINTAINERS: Add entries for newer MPS2 boards and devices
21
* target/arm: Set ID_MMFR4.HPDS for aarch64_max_initfn
26
* hw/intc/arm_gicv3: Fix APxR<n> register dispatching
22
* hw/arm/integratorcp: Map the audio codec controller
27
* arm_gicv3_kvm: fix bug in writing zero bits back to the in-kernel
23
* GICv2: Correctly implement the limited number of priority bits
28
GIC state
24
* target/arm: refactoring of VFP related feature checks and decode
29
* tcg: Fix helper function vs host abi for float16
25
* xilinx_zynq: Fix USB port instantiation
30
* arm: fix qemu crash on startup with -bios option
26
* acceptance tests for n800, n810, integratorcp
31
* arm: fix malloc type mismatch
27
* Implement v8.3-RCPC, v8.4-RCPC, v8.3-CCIDX
32
* xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
28
* arm_gic_kvm: Don't assume kernel can provide a GICv2
33
* Correct CPACR reset value for v7 cores
29
(provide better error message for user error)
34
* memory.h: Improve IOMMU related documentation
35
* exec: Plumb transaction attributes through various functions in
36
preparation for allowing IOMMUs to see them
37
* vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
38
* ARM: ACPI: Fix use-after-free due to memory realloc
39
* KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
40
30
41
----------------------------------------------------------------
31
----------------------------------------------------------------
42
Francisco Iglesias (1):
32
Gavin Shan (1):
43
xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
33
hw/arm: Use TYPE_PL011 to create serial port
44
34
45
Igor Mammedov (1):
35
Guenter Roeck (2):
46
arm: fix qemu crash on startup with -bios option
36
hw/arm/xilinx_zynq: Fix USB port instantiation
37
hw/usb/hcd-ehci-sysbus: Remove obsolete xlnx, ps7-usb class
47
38
48
Jan Kiszka (1):
39
Peter Maydell (5):
49
hw/intc/arm_gicv3: Fix APxR<n> register dispatching
40
target/arm: Fix wrong use of FIELD_EX32 on ID_AA64DFR0
41
target/arm: Implement v8.3-RCPC
42
target/arm: Implement v8.4-RCPC
43
target/arm: Implement ARMv8.3-CCIDX
44
hw/intc/arm_gic_kvm: Don't assume kernel can provide a GICv2
50
45
51
Paolo Bonzini (1):
46
Philippe Mathieu-Daudé (3):
52
arm: fix malloc type mismatch
47
hw/arm/integratorcp: Map the audio codec controller
48
tests/acceptance: Extract boot_integratorcp() from test_integratorcp()
49
tests/acceptance/integratorcp: Verify Tux is displayed on framebuffer
53
50
54
Peter Maydell (17):
51
Richard Henderson (17):
55
target/arm: Honour FPCR.FZ in FRECPX
52
target/arm: Set ID_MMFR4.HPDS for aarch64_max_initfn
56
MAINTAINERS: Add entries for newer MPS2 boards and devices
53
target/arm: Add isar_feature_aa32_vfp_simd
57
Correct CPACR reset value for v7 cores
54
target/arm: Rename isar_feature_aa32_fpdp_v2
58
memory.h: Improve IOMMU related documentation
55
target/arm: Add isar_feature_aa32_{fpsp_v2, fpsp_v3, fpdp_v3}
59
Make tb_invalidate_phys_addr() take a MemTxAttrs argument
56
target/arm: Add isar_feature_aa64_fp_simd, isar_feature_aa32_vfp
60
Make address_space_translate{, _cached}() take a MemTxAttrs argument
57
target/arm: Perform fpdp_v2 check first
61
Make address_space_map() take a MemTxAttrs argument
58
target/arm: Replace ARM_FEATURE_VFP3 checks with fp{sp, dp}_v3
62
Make address_space_access_valid() take a MemTxAttrs argument
59
target/arm: Add missing checks for fpsp_v2
63
Make flatview_extend_translation() take a MemTxAttrs argument
60
target/arm: Replace ARM_FEATURE_VFP4 with isar_feature_aa32_simdfmac
64
Make memory_region_access_valid() take a MemTxAttrs argument
61
target/arm: Remove ARM_FEATURE_VFP check from disas_vfp_insn
65
Make MemoryRegion valid.accepts callback take a MemTxAttrs argument
62
target/arm: Move VLLDM and VLSTM to vfp.decode
66
Make flatview_access_valid() take a MemTxAttrs argument
63
target/arm: Move the vfp decodetree calls next to the base isa
67
Make flatview_translate() take a MemTxAttrs argument
64
linux-user/arm: Replace ARM_FEATURE_VFP* tests for HWCAP
68
Make address_space_get_iotlb_entry() take a MemTxAttrs argument
65
target/arm: Remove ARM_FEATURE_VFP*
69
Make flatview_do_translate() take a MemTxAttrs argument
66
target/arm: Add formats for some vfp 2 and 3-register insns
70
Make address_space_translate_iommu take a MemTxAttrs argument
67
target/arm: Split VFM decode
71
vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
68
target/arm: Split VMINMAXNM decode
72
69
73
Richard Henderson (1):
70
Sai Pavan Boddu (3):
74
tcg: Fix helper function vs host abi for float16
71
arm_gic: Mask the un-supported priority bits
72
cpu/a9mpcore: Set number of GIC priority bits to 5
73
cpu/arm11mpcore: Set number of GIC priority bits to 4
75
74
76
Shannon Zhao (3):
75
Thomas Huth (2):
77
arm_gicv3_kvm: increase clroffset accordingly
76
tests/acceptance: Add a test for the N800 and N810 arm machines
78
ARM: ACPI: Fix use-after-free due to memory realloc
77
tests/acceptance: Add a test for the integratorcp arm machine
79
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
80
78
81
include/exec/exec-all.h | 5 +-
79
include/hw/intc/arm_gic.h | 2 +
82
include/exec/helper-head.h | 2 +-
80
include/hw/intc/arm_gic_common.h | 1 +
83
include/exec/memory-internal.h | 3 +-
81
target/arm/cpu.h | 88 +++++-
84
include/exec/memory.h | 128 +++++++++++++++++++++++++++++++++++------
82
hw/arm/integratorcp.c | 1 +
85
include/migration/vmstate.h | 3 +
83
hw/arm/sbsa-ref.c | 3 +-
86
include/sysemu/dma.h | 6 +-
84
hw/arm/virt.c | 3 +-
87
accel/tcg/translate-all.c | 4 +-
85
hw/arm/xilinx_zynq.c | 5 +-
88
exec.c | 95 ++++++++++++++++++------------
86
hw/arm/xlnx-versal.c | 3 +-
89
hw/arm/boot.c | 18 +++---
87
hw/cpu/a9mpcore.c | 4 +
90
hw/arm/virt-acpi-build.c | 20 +++++--
88
hw/cpu/arm11mpcore.c | 5 +
91
hw/dma/xlnx-zdma.c | 10 +++-
89
hw/intc/arm_gic.c | 33 +-
92
hw/hppa/dino.c | 3 +-
90
hw/intc/arm_gic_common.c | 1 +
93
hw/intc/arm_gic_kvm.c | 1 -
91
hw/intc/arm_gic_kvm.c | 9 +
94
hw/intc/arm_gicv3_cpuif.c | 12 ++--
92
hw/intc/armv7m_nvic.c | 20 +-
95
hw/intc/arm_gicv3_kvm.c | 2 +-
93
hw/usb/hcd-ehci-sysbus.c | 17 -
96
hw/nvram/fw_cfg.c | 12 ++--
94
linux-user/arm/signal.c | 4 +-
97
hw/s390x/s390-pci-inst.c | 3 +-
95
linux-user/elfload.c | 25 +-
98
hw/scsi/esp.c | 3 +-
96
target/arm/arch_dump.c | 11 +-
99
hw/vfio/common.c | 3 +-
97
target/arm/cpu.c | 44 +--
100
hw/virtio/vhost.c | 3 +-
98
target/arm/cpu64.c | 5 +-
101
hw/xen/xen_pt_msi.c | 3 +-
99
target/arm/helper.c | 23 +-
102
memory.c | 12 ++--
100
target/arm/kvm32.c | 5 -
103
memory_ldst.inc.c | 18 +++---
101
target/arm/kvm64.c | 1 -
104
target/arm/gdbstub.c | 3 +-
102
target/arm/m_helper.c | 11 +-
105
target/arm/helper-a64.c | 41 +++++++------
103
target/arm/machine.c | 5 +-
106
target/arm/helper.c | 90 ++++++++++++++++-------------
104
target/arm/translate-a64.c | 114 +++++++
107
target/ppc/mmu-hash64.c | 3 +-
105
target/arm/translate-vfp.inc.c | 448 +++++++++++++++++----------
108
target/riscv/helper.c | 2 +-
106
target/arm/translate.c | 122 ++------
109
target/s390x/diag.c | 6 +-
107
MAINTAINERS | 2 +
110
target/s390x/excp_helper.c | 3 +-
108
hw/arm/Kconfig | 1 +
111
target/s390x/mmu_helper.c | 3 +-
109
target/arm/vfp-uncond.decode | 12 +-
112
target/s390x/sigp.c | 3 +-
110
target/arm/vfp.decode | 153 ++++-----
113
target/xtensa/op_helper.c | 3 +-
111
tests/acceptance/machine_arm_integratorcp.py | 99 ++++++
114
MAINTAINERS | 9 ++-
112
tests/acceptance/machine_arm_n8x0.py | 49 +++
115
34 files changed, 353 insertions(+), 182 deletions(-)
113
34 files changed, 865 insertions(+), 464 deletions(-)
114
create mode 100644 tests/acceptance/machine_arm_integratorcp.py
115
create mode 100644 tests/acceptance/machine_arm_n8x0.py
116
116
diff view generated by jsdifflib
New patch
1
From: Gavin Shan <gshan@redhat.com>
1
2
3
This uses TYPE_PL011 when creating the serial port so that the code
4
looks cleaner.
5
6
Signed-off-by: Gavin Shan <gshan@redhat.com>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20200224222223.4128-1-gshan@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/sbsa-ref.c | 3 ++-
13
hw/arm/virt.c | 3 ++-
14
hw/arm/xlnx-versal.c | 3 ++-
15
3 files changed, 6 insertions(+), 3 deletions(-)
16
17
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/sbsa-ref.c
20
+++ b/hw/arm/sbsa-ref.c
21
@@ -XXX,XX +XXX,XX @@
22
#include "hw/pci-host/gpex.h"
23
#include "hw/qdev-properties.h"
24
#include "hw/usb.h"
25
+#include "hw/char/pl011.h"
26
#include "net/net.h"
27
28
#define RAMLIMIT_GB 8192
29
@@ -XXX,XX +XXX,XX @@ static void create_uart(const SBSAMachineState *sms, int uart,
30
{
31
hwaddr base = sbsa_ref_memmap[uart].base;
32
int irq = sbsa_ref_irqmap[uart];
33
- DeviceState *dev = qdev_create(NULL, "pl011");
34
+ DeviceState *dev = qdev_create(NULL, TYPE_PL011);
35
SysBusDevice *s = SYS_BUS_DEVICE(dev);
36
37
qdev_prop_set_chr(dev, "chardev", chr);
38
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/arm/virt.c
41
+++ b/hw/arm/virt.c
42
@@ -XXX,XX +XXX,XX @@
43
#include "hw/mem/nvdimm.h"
44
#include "hw/acpi/generic_event_device.h"
45
#include "hw/virtio/virtio-iommu.h"
46
+#include "hw/char/pl011.h"
47
48
#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
49
static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
50
@@ -XXX,XX +XXX,XX @@ static void create_uart(const VirtMachineState *vms, int uart,
51
int irq = vms->irqmap[uart];
52
const char compat[] = "arm,pl011\0arm,primecell";
53
const char clocknames[] = "uartclk\0apb_pclk";
54
- DeviceState *dev = qdev_create(NULL, "pl011");
55
+ DeviceState *dev = qdev_create(NULL, TYPE_PL011);
56
SysBusDevice *s = SYS_BUS_DEVICE(dev);
57
58
qdev_prop_set_chr(dev, "chardev", chr);
59
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/arm/xlnx-versal.c
62
+++ b/hw/arm/xlnx-versal.c
63
@@ -XXX,XX +XXX,XX @@
64
#include "hw/misc/unimp.h"
65
#include "hw/intc/arm_gicv3_common.h"
66
#include "hw/arm/xlnx-versal.h"
67
+#include "hw/char/pl011.h"
68
69
#define XLNX_VERSAL_ACPU_TYPE ARM_CPU_TYPE_NAME("cortex-a72")
70
#define GEM_REVISION 0x40070106
71
@@ -XXX,XX +XXX,XX @@ static void versal_create_uarts(Versal *s, qemu_irq *pic)
72
DeviceState *dev;
73
MemoryRegion *mr;
74
75
- dev = qdev_create(NULL, "pl011");
76
+ dev = qdev_create(NULL, TYPE_PL011);
77
s->lpd.iou.uart[i] = SYS_BUS_DEVICE(dev);
78
qdev_prop_set_chr(dev, "chardev", serial_hd(i));
79
object_property_add_child(OBJECT(s), name, OBJECT(dev), &error_fatal);
80
--
81
2.20.1
82
83
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
It forgot to increase clroffset during the loop. So it only clear the
3
We had set this for aarch32-only in arm_max_initfn, but
4
first 4 bytes.
4
failed to set the same bit for aarch64.
5
5
6
Fixes: 367b9f527becdd20ddf116e17a3c0c2bbc486920
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Cc: qemu-stable@nongnu.org
7
Message-id: 20200218190958.745-2-richard.henderson@linaro.org
8
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
9
Reviewed-by: Eric Auger <eric.auger@redhat.com>
10
Message-id: 1527047633-12368-1-git-send-email-zhaoshenglong@huawei.com
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
10
---
14
hw/intc/arm_gicv3_kvm.c | 1 +
11
target/arm/cpu64.c | 1 +
15
1 file changed, 1 insertion(+)
12
1 file changed, 1 insertion(+)
16
13
17
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
14
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/arm_gicv3_kvm.c
16
--- a/target/arm/cpu64.c
20
+++ b/hw/intc/arm_gicv3_kvm.c
17
+++ b/target/arm/cpu64.c
21
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
18
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
22
if (clroffset != 0) {
19
cpu->isar.id_mmfr3 = u;
23
reg = 0;
20
24
kvm_gicd_access(s, clroffset, &reg, true);
21
u = cpu->isar.id_mmfr4;
25
+ clroffset += 4;
22
+ u = FIELD_DP32(u, ID_MMFR4, HPDS, 1); /* AA32HPD */
26
}
23
u = FIELD_DP32(u, ID_MMFR4, AC2, 1); /* ACTLR2, HACTLR2 */
27
reg = *gic_bmp_ptr32(bmp, irq);
24
cpu->isar.id_mmfr4 = u;
28
kvm_gicd_access(s, offset, &reg, true);
25
29
--
26
--
30
2.17.1
27
2.20.1
31
28
32
29
diff view generated by jsdifflib
1
From: Jan Kiszka <jan.kiszka@siemens.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
There was a nasty flip in identifying which register group an access is
3
The Linux kernel displays errors why trying to detect the PL041
4
targeting. The issue caused spuriously raised priorities of the guest
4
audio interface:
5
when handing CPUs over in the Jailhouse hypervisor.
6
5
7
Cc: qemu-stable@nongnu.org
6
Linux version 4.16.0 (linus@genomnajs) (gcc version 7.2.1 20171011 (Linaro GCC 7.2-2017.11)) #142 PREEMPT Wed May 9 13:24:55 CEST 2018
8
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
7
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00093177
9
Message-id: 28b927d3-da58-bce4-cc13-bfec7f9b1cb9@siemens.com
8
CPU: VIVT data cache, VIVT instruction cache
9
OF: fdt: Machine model: ARM Integrator/CP
10
...
11
OF: amba_device_add() failed (-19) for /fpga/aaci@1d000000
12
13
Since we have it already modelled, simply plug it.
14
15
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Message-id: 20200223233033.15371-2-f4bug@amsat.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
19
---
13
hw/intc/arm_gicv3_cpuif.c | 12 ++++++------
20
hw/arm/integratorcp.c | 1 +
14
1 file changed, 6 insertions(+), 6 deletions(-)
21
hw/arm/Kconfig | 1 +
22
2 files changed, 2 insertions(+)
15
23
16
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
24
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
17
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/intc/arm_gicv3_cpuif.c
26
--- a/hw/arm/integratorcp.c
19
+++ b/hw/intc/arm_gicv3_cpuif.c
27
+++ b/hw/arm/integratorcp.c
20
@@ -XXX,XX +XXX,XX @@ static uint64_t icv_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
28
@@ -XXX,XX +XXX,XX @@ static void integratorcp_init(MachineState *machine)
21
{
29
qdev_get_gpio_in_named(icp, ICP_GPIO_MMC_WPROT, 0));
22
GICv3CPUState *cs = icc_cs_from_env(env);
30
qdev_connect_gpio_out(dev, 1,
23
int regno = ri->opc2 & 3;
31
qdev_get_gpio_in_named(icp, ICP_GPIO_MMC_CARDIN, 0));
24
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
32
+ sysbus_create_varargs("pl041", 0x1d000000, pic[25], NULL);
25
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
33
26
uint64_t value = cs->ich_apr[grp][regno];
34
if (nd_table[0].used)
27
35
smc91c111_init(&nd_table[0], 0xc8000000, pic[27]);
28
trace_gicv3_icv_ap_read(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
36
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
29
@@ -XXX,XX +XXX,XX @@ static void icv_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
37
index XXXXXXX..XXXXXXX 100644
30
{
38
--- a/hw/arm/Kconfig
31
GICv3CPUState *cs = icc_cs_from_env(env);
39
+++ b/hw/arm/Kconfig
32
int regno = ri->opc2 & 3;
40
@@ -XXX,XX +XXX,XX @@ config INTEGRATOR
33
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
41
select INTEGRATOR_DEBUG
34
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
42
select PL011 # UART
35
43
select PL031 # RTC
36
trace_gicv3_icv_ap_write(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
44
+ select PL041 # audio
37
45
select PL050 # keyboard/mouse
38
@@ -XXX,XX +XXX,XX @@ static uint64_t icc_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
46
select PL110 # pl111 LCD controller
39
uint64_t value;
47
select PL181 # display
40
41
int regno = ri->opc2 & 3;
42
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1;
43
+ int grp = (ri->crm & 1) ? GICV3_G1 : GICV3_G0;
44
45
if (icv_access(env, grp == GICV3_G0 ? HCR_FMO : HCR_IMO)) {
46
return icv_ap_read(env, ri);
47
@@ -XXX,XX +XXX,XX @@ static void icc_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
48
GICv3CPUState *cs = icc_cs_from_env(env);
49
50
int regno = ri->opc2 & 3;
51
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1;
52
+ int grp = (ri->crm & 1) ? GICV3_G1 : GICV3_G0;
53
54
if (icv_access(env, grp == GICV3_G0 ? HCR_FMO : HCR_IMO)) {
55
icv_ap_write(env, ri, value);
56
@@ -XXX,XX +XXX,XX @@ static uint64_t ich_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
57
{
58
GICv3CPUState *cs = icc_cs_from_env(env);
59
int regno = ri->opc2 & 3;
60
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
61
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
62
uint64_t value;
63
64
value = cs->ich_apr[grp][regno];
65
@@ -XXX,XX +XXX,XX @@ static void ich_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
66
{
67
GICv3CPUState *cs = icc_cs_from_env(env);
68
int regno = ri->opc2 & 3;
69
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
70
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
71
72
trace_gicv3_ich_ap_write(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
73
74
--
48
--
75
2.17.1
49
2.20.1
76
50
77
51
diff view generated by jsdifflib
1
In commit f0aff255700 we made cpacr_write() enforce that some CPACR
1
From: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
2
bits are RAZ/WI and some are RAO/WI for ARMv7 cores. Unfortunately
3
we forgot to also update the register's reset value. The effect
4
was that (a) a guest that read CPACR on reset would not see ones in
5
the RAO bits, and (b) if you did a migration before the guest did
6
a write to the CPACR then the migration would fail because the
7
destination would enforce the RAO bits and then complain that they
8
didn't match the zero value from the source.
9
2
10
Implement reset for the CPACR using a custom reset function
3
The GICv2 allows the implementation to implement a variable number
11
that just calls cpacr_write(), to avoid having to duplicate
4
of priority bits; unimplemented bits in the priority registers
12
the logic for which bits are RAO.
5
are read as zeros, writes ignored. We were previously always
6
implementing a full 8 bits of priority, which is allowed but not
7
what the real hardware typically does (which is usually to have
8
4 or 5 bits of priority).
13
9
14
This bug would affect migration for TCG CPUs which are ARMv7
10
Add a new device property to allow the number of implemented
15
with VFP but without one of Neon or VFPv3.
11
property bits to be specified.
16
12
17
Reported-by: Cédric Le Goater <clg@kaod.org>
13
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
14
Message-id: 1582537164-764-2-git-send-email-sai.pavan.boddu@xilinx.com
15
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
[PMM: improved commit message]
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Tested-by: Cédric Le Goater <clg@kaod.org>
20
Message-id: 20180522173713.26282-1-peter.maydell@linaro.org
21
---
19
---
22
target/arm/helper.c | 10 +++++++++-
20
include/hw/intc/arm_gic.h | 2 ++
23
1 file changed, 9 insertions(+), 1 deletion(-)
21
include/hw/intc/arm_gic_common.h | 1 +
22
hw/intc/arm_gic.c | 33 ++++++++++++++++++++++++++++++--
23
hw/intc/arm_gic_common.c | 1 +
24
4 files changed, 35 insertions(+), 2 deletions(-)
24
25
25
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
diff --git a/include/hw/intc/arm_gic.h b/include/hw/intc/arm_gic.h
26
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
27
--- a/target/arm/helper.c
28
--- a/include/hw/intc/arm_gic.h
28
+++ b/target/arm/helper.c
29
+++ b/include/hw/intc/arm_gic.h
29
@@ -XXX,XX +XXX,XX @@ static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri,
30
@@ -XXX,XX +XXX,XX @@
30
env->cp15.cpacr_el1 = value;
31
32
/* Number of SGI target-list bits */
33
#define GIC_TARGETLIST_BITS 8
34
+#define GIC_MAX_PRIORITY_BITS 8
35
+#define GIC_MIN_PRIORITY_BITS 4
36
37
#define TYPE_ARM_GIC "arm_gic"
38
#define ARM_GIC(obj) \
39
diff --git a/include/hw/intc/arm_gic_common.h b/include/hw/intc/arm_gic_common.h
40
index XXXXXXX..XXXXXXX 100644
41
--- a/include/hw/intc/arm_gic_common.h
42
+++ b/include/hw/intc/arm_gic_common.h
43
@@ -XXX,XX +XXX,XX @@ typedef struct GICState {
44
uint16_t priority_mask[GIC_NCPU_VCPU];
45
uint16_t running_priority[GIC_NCPU_VCPU];
46
uint16_t current_pending[GIC_NCPU_VCPU];
47
+ uint32_t n_prio_bits;
48
49
/* If we present the GICv2 without security extensions to a guest,
50
* the guest can configure the GICC_CTLR to configure group 1 binary point
51
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/hw/intc/arm_gic.c
54
+++ b/hw/intc/arm_gic.c
55
@@ -XXX,XX +XXX,XX @@ uint32_t gic_acknowledge_irq(GICState *s, int cpu, MemTxAttrs attrs)
56
return ret;
31
}
57
}
32
58
33
+static void cpacr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
59
+static uint32_t gic_fullprio_mask(GICState *s, int cpu)
34
+{
60
+{
35
+ /* Call cpacr_write() so that we reset with the correct RAO bits set
61
+ /*
36
+ * for our CPU features.
62
+ * Return a mask word which clears the unimplemented priority
63
+ * bits from a priority value for an interrupt. (Not to be
64
+ * confused with the group priority, whose mask depends on BPR.)
37
+ */
65
+ */
38
+ cpacr_write(env, ri, 0);
66
+ int priBits;
67
+
68
+ if (gic_is_vcpu(cpu)) {
69
+ priBits = GIC_VIRT_MAX_GROUP_PRIO_BITS;
70
+ } else {
71
+ priBits = s->n_prio_bits;
72
+ }
73
+ return ~0U << (8 - priBits);
39
+}
74
+}
40
+
75
+
41
static CPAccessResult cpacr_access(CPUARMState *env, const ARMCPRegInfo *ri,
76
void gic_dist_set_priority(GICState *s, int cpu, int irq, uint8_t val,
42
bool isread)
77
MemTxAttrs attrs)
43
{
78
{
44
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
79
@@ -XXX,XX +XXX,XX @@ void gic_dist_set_priority(GICState *s, int cpu, int irq, uint8_t val,
45
{ .name = "CPACR", .state = ARM_CP_STATE_BOTH, .opc0 = 3,
80
val = 0x80 | (val >> 1); /* Non-secure view */
46
.crn = 1, .crm = 0, .opc1 = 0, .opc2 = 2, .accessfn = cpacr_access,
81
}
47
.access = PL1_RW, .fieldoffset = offsetof(CPUARMState, cp15.cpacr_el1),
82
48
- .resetvalue = 0, .writefn = cpacr_write },
83
+ val &= gic_fullprio_mask(s, cpu);
49
+ .resetfn = cpacr_reset, .writefn = cpacr_write },
84
+
50
REGINFO_SENTINEL
85
if (irq < GIC_INTERNAL) {
86
s->priority1[irq][cpu] = val;
87
} else {
88
@@ -XXX,XX +XXX,XX @@ static uint32_t gic_dist_get_priority(GICState *s, int cpu, int irq,
89
}
90
prio = (prio << 1) & 0xff; /* Non-secure view */
91
}
92
- return prio;
93
+ return prio & gic_fullprio_mask(s, cpu);
94
}
95
96
static void gic_set_priority_mask(GICState *s, int cpu, uint8_t pmask,
97
@@ -XXX,XX +XXX,XX @@ static void gic_set_priority_mask(GICState *s, int cpu, uint8_t pmask,
98
return;
99
}
100
}
101
- s->priority_mask[cpu] = pmask;
102
+ s->priority_mask[cpu] = pmask & gic_fullprio_mask(s, cpu);
103
}
104
105
static uint32_t gic_get_priority_mask(GICState *s, int cpu, MemTxAttrs attrs)
106
@@ -XXX,XX +XXX,XX @@ static void arm_gic_realize(DeviceState *dev, Error **errp)
107
return;
108
}
109
110
+ if (s->n_prio_bits > GIC_MAX_PRIORITY_BITS ||
111
+ (s->virt_extn ? s->n_prio_bits < GIC_VIRT_MAX_GROUP_PRIO_BITS :
112
+ s->n_prio_bits < GIC_MIN_PRIORITY_BITS)) {
113
+ error_setg(errp, "num-priority-bits cannot be greater than %d"
114
+ " or less than %d", GIC_MAX_PRIORITY_BITS,
115
+ s->virt_extn ? GIC_VIRT_MAX_GROUP_PRIO_BITS :
116
+ GIC_MIN_PRIORITY_BITS);
117
+ return;
118
+ }
119
+
120
/* This creates distributor, main CPU interface (s->cpuiomem[0]) and if
121
* enabled, virtualization extensions related interfaces (main virtual
122
* interface (s->vifaceiomem[0]) and virtual CPU interface).
123
diff --git a/hw/intc/arm_gic_common.c b/hw/intc/arm_gic_common.c
124
index XXXXXXX..XXXXXXX 100644
125
--- a/hw/intc/arm_gic_common.c
126
+++ b/hw/intc/arm_gic_common.c
127
@@ -XXX,XX +XXX,XX @@ static Property arm_gic_common_properties[] = {
128
DEFINE_PROP_BOOL("has-security-extensions", GICState, security_extn, 0),
129
/* True if the GIC should implement the virtualization extensions */
130
DEFINE_PROP_BOOL("has-virtualization-extensions", GICState, virt_extn, 0),
131
+ DEFINE_PROP_UINT32("num-priority-bits", GICState, n_prio_bits, 8),
132
DEFINE_PROP_END_OF_LIST(),
51
};
133
};
52
134
53
--
135
--
54
2.17.1
136
2.20.1
55
137
56
138
diff view generated by jsdifflib
1
From: Francisco Iglesias <frasse.iglesias@gmail.com>
1
From: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
2
2
3
Coverity found that the string return by 'object_get_canonical_path' was not
3
All A9 CPUs have a GIC with 5 bits of priority.
4
being freed at two locations in the model (CID 1391294 and CID 1391293) and
5
also that a memset was being called with a value greater than the max of a byte
6
on the second argument (CID 1391286). This patch corrects this by adding the
7
freeing of the strings and also changing to memset to zero instead on
8
descriptor unaligned errors.
9
4
10
Signed-off-by: Francisco Iglesias <frasse.iglesias@gmail.com>
5
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
11
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 1582537164-764-3-git-send-email-sai.pavan.boddu@xilinx.com
13
Message-id: 20180528184859.3530-1-frasse.iglesias@gmail.com
8
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
11
---
17
hw/dma/xlnx-zdma.c | 10 +++++++---
12
hw/cpu/a9mpcore.c | 4 ++++
18
1 file changed, 7 insertions(+), 3 deletions(-)
13
1 file changed, 4 insertions(+)
19
14
20
diff --git a/hw/dma/xlnx-zdma.c b/hw/dma/xlnx-zdma.c
15
diff --git a/hw/cpu/a9mpcore.c b/hw/cpu/a9mpcore.c
21
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/dma/xlnx-zdma.c
17
--- a/hw/cpu/a9mpcore.c
23
+++ b/hw/dma/xlnx-zdma.c
18
+++ b/hw/cpu/a9mpcore.c
24
@@ -XXX,XX +XXX,XX @@ static bool zdma_load_descriptor(XlnxZDMA *s, uint64_t addr, void *buf)
19
@@ -XXX,XX +XXX,XX @@
25
qemu_log_mask(LOG_GUEST_ERROR,
20
#include "hw/qdev-properties.h"
26
"zdma: unaligned descriptor at %" PRIx64,
21
#include "hw/core/cpu.h"
27
addr);
22
28
- memset(buf, 0xdeadbeef, sizeof(XlnxZDMADescr));
23
+#define A9_GIC_NUM_PRIORITY_BITS 5
29
+ memset(buf, 0x0, sizeof(XlnxZDMADescr));
24
+
30
s->error = true;
25
static void a9mp_priv_set_irq(void *opaque, int irq, int level)
31
return false;
26
{
32
}
27
A9MPPrivState *s = (A9MPPrivState *)opaque;
33
@@ -XXX,XX +XXX,XX @@ static uint64_t zdma_read(void *opaque, hwaddr addr, unsigned size)
28
@@ -XXX,XX +XXX,XX @@ static void a9mp_priv_realize(DeviceState *dev, Error **errp)
34
RegisterInfo *r = &s->regs_info[addr / 4];
29
gicdev = DEVICE(&s->gic);
35
30
qdev_prop_set_uint32(gicdev, "num-cpu", s->num_cpu);
36
if (!r->data) {
31
qdev_prop_set_uint32(gicdev, "num-irq", s->num_irq);
37
+ gchar *path = object_get_canonical_path(OBJECT(s));
32
+ qdev_prop_set_uint32(gicdev, "num-priority-bits",
38
qemu_log("%s: Decode error: read from %" HWADDR_PRIx "\n",
33
+ A9_GIC_NUM_PRIORITY_BITS);
39
- object_get_canonical_path(OBJECT(s)),
34
40
+ path,
35
/* Make the GIC's TZ support match the CPUs. We assume that
41
addr);
36
* either all the CPUs have TZ, or none do.
42
+ g_free(path);
43
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
44
zdma_ch_imr_update_irq(s);
45
return 0;
46
@@ -XXX,XX +XXX,XX @@ static void zdma_write(void *opaque, hwaddr addr, uint64_t value,
47
RegisterInfo *r = &s->regs_info[addr / 4];
48
49
if (!r->data) {
50
+ gchar *path = object_get_canonical_path(OBJECT(s));
51
qemu_log("%s: Decode error: write to %" HWADDR_PRIx "=%" PRIx64 "\n",
52
- object_get_canonical_path(OBJECT(s)),
53
+ path,
54
addr, value);
55
+ g_free(path);
56
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
57
zdma_ch_imr_update_irq(s);
58
return;
59
--
37
--
60
2.17.1
38
2.20.1
61
39
62
40
diff view generated by jsdifflib
New patch
1
From: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
1
2
3
The GIC built into the ARM11MPCore is always implemented with 4
4
priority bits; set the GIC property accordingly.
5
6
Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 1582537164-764-4-git-send-email-sai.pavan.boddu@xilinx.com
9
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
[PMM: tweaked commit message]
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/cpu/arm11mpcore.c | 5 +++++
15
1 file changed, 5 insertions(+)
16
17
diff --git a/hw/cpu/arm11mpcore.c b/hw/cpu/arm11mpcore.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/cpu/arm11mpcore.c
20
+++ b/hw/cpu/arm11mpcore.c
21
@@ -XXX,XX +XXX,XX @@
22
#include "hw/irq.h"
23
#include "hw/qdev-properties.h"
24
25
+#define ARM11MPCORE_NUM_GIC_PRIORITY_BITS 4
26
27
static void mpcore_priv_set_irq(void *opaque, int irq, int level)
28
{
29
@@ -XXX,XX +XXX,XX @@ static void mpcore_priv_realize(DeviceState *dev, Error **errp)
30
31
qdev_prop_set_uint32(gicdev, "num-cpu", s->num_cpu);
32
qdev_prop_set_uint32(gicdev, "num-irq", s->num_irq);
33
+ qdev_prop_set_uint32(gicdev, "num-priority-bits",
34
+ ARM11MPCORE_NUM_GIC_PRIORITY_BITS);
35
+
36
+
37
object_property_set_bool(OBJECT(&s->gic), true, "realized", &err);
38
if (err != NULL) {
39
error_propagate(errp, err);
40
--
41
2.20.1
42
43
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Depending on the host abi, float16, aka uint16_t, values are
3
Use this in the places that were checking ARM_FEATURE_VFP, and
4
passed and returned either zero-extended in the host register
4
are obviously testing for the existance of the register set
5
or with garbage at the top of the host register.
5
as opposed to testing for some particular instruction extension.
6
6
7
The tcg code generator has so far been assuming garbage, as that
8
matches the x86 abi, but this is incorrect for other host abis.
9
Further, target/arm has so far been assuming zero-extended results,
10
so that it may store the 16-bit value into a 32-bit slot with the
11
high 16-bits already clear.
12
13
Rectify both problems by mapping "f16" in the helper definition
14
to uint32_t instead of (a typedef for) uint16_t. This forces
15
the host compiler to assume garbage in the upper 16 bits on input
16
and to zero-extend the result on output.
17
18
Cc: qemu-stable@nongnu.org
19
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
22
Message-id: 20180522175629.24932-1-richard.henderson@linaro.org
23
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20200224222232.13807-2-richard.henderson@linaro.org
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
---
11
---
26
include/exec/helper-head.h | 2 +-
12
target/arm/cpu.h | 9 +++++++++
27
target/arm/helper-a64.c | 35 +++++++++--------
13
hw/intc/armv7m_nvic.c | 20 ++++++++++----------
28
target/arm/helper.c | 80 +++++++++++++++++++-------------------
14
linux-user/arm/signal.c | 4 ++--
29
3 files changed, 59 insertions(+), 58 deletions(-)
15
target/arm/arch_dump.c | 11 ++++++-----
30
16
target/arm/cpu.c | 4 ++--
31
diff --git a/include/exec/helper-head.h b/include/exec/helper-head.h
17
target/arm/helper.c | 4 ++--
32
index XXXXXXX..XXXXXXX 100644
18
target/arm/m_helper.c | 11 ++++++-----
33
--- a/include/exec/helper-head.h
19
7 files changed, 37 insertions(+), 26 deletions(-)
34
+++ b/include/exec/helper-head.h
20
35
@@ -XXX,XX +XXX,XX @@
21
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
36
#define dh_ctype_int int
22
index XXXXXXX..XXXXXXX 100644
37
#define dh_ctype_i64 uint64_t
23
--- a/target/arm/cpu.h
38
#define dh_ctype_s64 int64_t
24
+++ b/target/arm/cpu.h
39
-#define dh_ctype_f16 float16
25
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_fp16_arith(const ARMISARegisters *id)
40
+#define dh_ctype_f16 uint32_t
26
return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, FP) == 1;
41
#define dh_ctype_f32 float32
42
#define dh_ctype_f64 float64
43
#define dh_ctype_ptr void *
44
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/helper-a64.c
47
+++ b/target/arm/helper-a64.c
48
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float_rel_to_flags(int res)
49
return flags;
50
}
27
}
51
28
52
-uint64_t HELPER(vfp_cmph_a64)(float16 x, float16 y, void *fp_status)
29
+static inline bool isar_feature_aa32_vfp_simd(const ARMISARegisters *id)
53
+uint64_t HELPER(vfp_cmph_a64)(uint32_t x, uint32_t y, void *fp_status)
30
+{
31
+ /*
32
+ * Return true if either VFP or SIMD is implemented.
33
+ * In this case, a minimum of VFP w/ D0-D15.
34
+ */
35
+ return FIELD_EX32(id->mvfr0, MVFR0, SIMDREG) > 0;
36
+}
37
+
38
static inline bool isar_feature_aa32_simd_r32(const ARMISARegisters *id)
54
{
39
{
55
return float_rel_to_flags(float16_compare_quiet(x, y, fp_status));
40
/* Return true if D16-D31 are implemented */
56
}
41
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
57
42
index XXXXXXX..XXXXXXX 100644
58
-uint64_t HELPER(vfp_cmpeh_a64)(float16 x, float16 y, void *fp_status)
43
--- a/hw/intc/armv7m_nvic.c
59
+uint64_t HELPER(vfp_cmpeh_a64)(uint32_t x, uint32_t y, void *fp_status)
44
+++ b/hw/intc/armv7m_nvic.c
45
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
46
case 0xd84: /* CSSELR */
47
return cpu->env.v7m.csselr[attrs.secure];
48
case 0xd88: /* CPACR */
49
- if (!arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
50
+ if (!cpu_isar_feature(aa32_vfp_simd, cpu)) {
51
return 0;
52
}
53
return cpu->env.v7m.cpacr[attrs.secure];
54
case 0xd8c: /* NSACR */
55
- if (!attrs.secure || !arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
56
+ if (!attrs.secure || !cpu_isar_feature(aa32_vfp_simd, cpu)) {
57
return 0;
58
}
59
return cpu->env.v7m.nsacr;
60
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
61
}
62
return cpu->env.v7m.sfar;
63
case 0xf34: /* FPCCR */
64
- if (!arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
65
+ if (!cpu_isar_feature(aa32_vfp_simd, cpu)) {
66
return 0;
67
}
68
if (attrs.secure) {
69
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
70
return value;
71
}
72
case 0xf38: /* FPCAR */
73
- if (!arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
74
+ if (!cpu_isar_feature(aa32_vfp_simd, cpu)) {
75
return 0;
76
}
77
return cpu->env.v7m.fpcar[attrs.secure];
78
case 0xf3c: /* FPDSCR */
79
- if (!arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
80
+ if (!cpu_isar_feature(aa32_vfp_simd, cpu)) {
81
return 0;
82
}
83
return cpu->env.v7m.fpdscr[attrs.secure];
84
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
85
}
86
break;
87
case 0xd88: /* CPACR */
88
- if (arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
89
+ if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
90
/* We implement only the Floating Point extension's CP10/CP11 */
91
cpu->env.v7m.cpacr[attrs.secure] = value & (0xf << 20);
92
}
93
break;
94
case 0xd8c: /* NSACR */
95
- if (attrs.secure && arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
96
+ if (attrs.secure && cpu_isar_feature(aa32_vfp_simd, cpu)) {
97
/* We implement only the Floating Point extension's CP10/CP11 */
98
cpu->env.v7m.nsacr = value & (3 << 10);
99
}
100
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
101
break;
102
}
103
case 0xf34: /* FPCCR */
104
- if (arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
105
+ if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
106
/* Not all bits here are banked. */
107
uint32_t fpccr_s;
108
109
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
110
}
111
break;
112
case 0xf38: /* FPCAR */
113
- if (arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
114
+ if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
115
value &= ~7;
116
cpu->env.v7m.fpcar[attrs.secure] = value;
117
}
118
break;
119
case 0xf3c: /* FPDSCR */
120
- if (arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
121
+ if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
122
value &= 0x07c00000;
123
cpu->env.v7m.fpdscr[attrs.secure] = value;
124
}
125
diff --git a/linux-user/arm/signal.c b/linux-user/arm/signal.c
126
index XXXXXXX..XXXXXXX 100644
127
--- a/linux-user/arm/signal.c
128
+++ b/linux-user/arm/signal.c
129
@@ -XXX,XX +XXX,XX @@ static void setup_sigframe_v2(struct target_ucontext_v2 *uc,
130
setup_sigcontext(&uc->tuc_mcontext, env, set->sig[0]);
131
/* Save coprocessor signal frame. */
132
regspace = uc->tuc_regspace;
133
- if (arm_feature(env, ARM_FEATURE_VFP)) {
134
+ if (cpu_isar_feature(aa32_vfp_simd, env_archcpu(env))) {
135
regspace = setup_sigframe_v2_vfp(regspace, env);
136
}
137
if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
138
@@ -XXX,XX +XXX,XX @@ static int do_sigframe_return_v2(CPUARMState *env,
139
140
/* Restore coprocessor signal frame */
141
regspace = uc->tuc_regspace;
142
- if (arm_feature(env, ARM_FEATURE_VFP)) {
143
+ if (cpu_isar_feature(aa32_vfp_simd, env_archcpu(env))) {
144
regspace = restore_sigframe_v2_vfp(env, regspace);
145
if (!regspace) {
146
return 1;
147
diff --git a/target/arm/arch_dump.c b/target/arm/arch_dump.c
148
index XXXXXXX..XXXXXXX 100644
149
--- a/target/arm/arch_dump.c
150
+++ b/target/arm/arch_dump.c
151
@@ -XXX,XX +XXX,XX @@ int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
152
int cpuid, void *opaque)
60
{
153
{
61
return float_rel_to_flags(float16_compare(x, y, fp_status));
154
struct arm_note note;
62
}
155
- CPUARMState *env = &ARM_CPU(cs)->env;
63
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_cgt_f64)(float64 a, float64 b, void *fpstp)
156
+ ARMCPU *cpu = ARM_CPU(cs);
64
#define float64_three make_float64(0x4008000000000000ULL)
157
+ CPUARMState *env = &cpu->env;
65
#define float64_one_point_five make_float64(0x3FF8000000000000ULL)
158
DumpState *s = opaque;
66
159
- int ret, i, fpvalid = !!arm_feature(env, ARM_FEATURE_VFP);
67
-float16 HELPER(recpsf_f16)(float16 a, float16 b, void *fpstp)
160
+ int ret, i;
68
+uint32_t HELPER(recpsf_f16)(uint32_t a, uint32_t b, void *fpstp)
161
+ bool fpvalid = cpu_isar_feature(aa32_vfp_simd, cpu);
162
163
arm_note_init(&note, s, "CORE", 5, NT_PRSTATUS, sizeof(note.prstatus));
164
165
@@ -XXX,XX +XXX,XX @@ int cpu_get_dump_info(ArchDumpInfo *info,
166
ssize_t cpu_get_note_size(int class, int machine, int nr_cpus)
69
{
167
{
70
float_status *fpst = fpstp;
168
ARMCPU *cpu = ARM_CPU(first_cpu);
71
169
- CPUARMState *env = &cpu->env;
72
@@ -XXX,XX +XXX,XX @@ float64 HELPER(recpsf_f64)(float64 a, float64 b, void *fpstp)
170
size_t note_size;
73
return float64_muladd(a, b, float64_two, 0, fpst);
171
74
}
172
if (class == ELFCLASS64) {
75
173
@@ -XXX,XX +XXX,XX @@ ssize_t cpu_get_note_size(int class, int machine, int nr_cpus)
76
-float16 HELPER(rsqrtsf_f16)(float16 a, float16 b, void *fpstp)
174
note_size += AARCH64_PRFPREG_NOTE_SIZE;
77
+uint32_t HELPER(rsqrtsf_f16)(uint32_t a, uint32_t b, void *fpstp)
175
#ifdef TARGET_AARCH64
78
{
176
if (cpu_isar_feature(aa64_sve, cpu)) {
79
float_status *fpst = fpstp;
177
- note_size += AARCH64_SVE_NOTE_SIZE(env);
80
178
+ note_size += AARCH64_SVE_NOTE_SIZE(&cpu->env);
81
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_addlp_u16)(uint64_t a)
179
}
82
}
180
#endif
83
181
} else {
84
/* Floating-point reciprocal exponent - see FPRecpX in ARM ARM */
182
note_size = ARM_PRSTATUS_NOTE_SIZE;
85
-float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
183
- if (arm_feature(env, ARM_FEATURE_VFP)) {
86
+uint32_t HELPER(frecpx_f16)(uint32_t a, void *fpstp)
184
+ if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
87
{
185
note_size += ARM_VFP_NOTE_SIZE;
88
float_status *fpst = fpstp;
186
}
89
uint16_t val16, sbit;
187
}
90
@@ -XXX,XX +XXX,XX @@ void HELPER(casp_be_parallel)(CPUARMState *env, uint32_t rs, uint64_t addr,
188
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
91
#define ADVSIMD_HELPER(name, suffix) HELPER(glue(glue(advsimd_, name), suffix))
189
index XXXXXXX..XXXXXXX 100644
92
190
--- a/target/arm/cpu.c
93
#define ADVSIMD_HALFOP(name) \
191
+++ b/target/arm/cpu.c
94
-float16 ADVSIMD_HELPER(name, h)(float16 a, float16 b, void *fpstp) \
192
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
95
+uint32_t ADVSIMD_HELPER(name, h)(uint32_t a, uint32_t b, void *fpstp) \
193
env->v7m.ccr[M_REG_S] |= R_V7M_CCR_UNALIGN_TRP_MASK;
96
{ \
194
}
97
float_status *fpst = fpstp; \
195
98
return float16_ ## name(a, b, fpst); \
196
- if (arm_feature(env, ARM_FEATURE_VFP)) {
99
@@ -XXX,XX +XXX,XX @@ ADVSIMD_HALFOP(mulx)
197
+ if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
100
ADVSIMD_TWOHALFOP(mulx)
198
env->v7m.fpccr[M_REG_NS] = R_V7M_FPCCR_ASPEN_MASK;
101
199
env->v7m.fpccr[M_REG_S] = R_V7M_FPCCR_ASPEN_MASK |
102
/* fused multiply-accumulate */
200
R_V7M_FPCCR_LSPEN_MASK | R_V7M_FPCCR_S_MASK;
103
-float16 HELPER(advsimd_muladdh)(float16 a, float16 b, float16 c, void *fpstp)
201
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_dump_state(CPUState *cs, FILE *f, int flags)
104
+uint32_t HELPER(advsimd_muladdh)(uint32_t a, uint32_t b, uint32_t c,
202
int numvfpregs = 0;
105
+ void *fpstp)
203
if (cpu_isar_feature(aa32_simd_r32, cpu)) {
106
{
204
numvfpregs = 32;
107
float_status *fpst = fpstp;
205
- } else if (arm_feature(env, ARM_FEATURE_VFP)) {
108
return float16_muladd(a, b, c, 0, fpst);
206
+ } else if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
109
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_muladd2h)(uint32_t two_a, uint32_t two_b,
207
numvfpregs = 16;
110
208
}
111
#define ADVSIMD_CMPRES(test) (test) ? 0xffff : 0
209
for (i = 0; i < numvfpregs; i++) {
112
113
-uint32_t HELPER(advsimd_ceq_f16)(float16 a, float16 b, void *fpstp)
114
+uint32_t HELPER(advsimd_ceq_f16)(uint32_t a, uint32_t b, void *fpstp)
115
{
116
float_status *fpst = fpstp;
117
int compare = float16_compare_quiet(a, b, fpst);
118
return ADVSIMD_CMPRES(compare == float_relation_equal);
119
}
120
121
-uint32_t HELPER(advsimd_cge_f16)(float16 a, float16 b, void *fpstp)
122
+uint32_t HELPER(advsimd_cge_f16)(uint32_t a, uint32_t b, void *fpstp)
123
{
124
float_status *fpst = fpstp;
125
int compare = float16_compare(a, b, fpst);
126
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_cge_f16)(float16 a, float16 b, void *fpstp)
127
compare == float_relation_equal);
128
}
129
130
-uint32_t HELPER(advsimd_cgt_f16)(float16 a, float16 b, void *fpstp)
131
+uint32_t HELPER(advsimd_cgt_f16)(uint32_t a, uint32_t b, void *fpstp)
132
{
133
float_status *fpst = fpstp;
134
int compare = float16_compare(a, b, fpst);
135
return ADVSIMD_CMPRES(compare == float_relation_greater);
136
}
137
138
-uint32_t HELPER(advsimd_acge_f16)(float16 a, float16 b, void *fpstp)
139
+uint32_t HELPER(advsimd_acge_f16)(uint32_t a, uint32_t b, void *fpstp)
140
{
141
float_status *fpst = fpstp;
142
float16 f0 = float16_abs(a);
143
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acge_f16)(float16 a, float16 b, void *fpstp)
144
compare == float_relation_equal);
145
}
146
147
-uint32_t HELPER(advsimd_acgt_f16)(float16 a, float16 b, void *fpstp)
148
+uint32_t HELPER(advsimd_acgt_f16)(uint32_t a, uint32_t b, void *fpstp)
149
{
150
float_status *fpst = fpstp;
151
float16 f0 = float16_abs(a);
152
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acgt_f16)(float16 a, float16 b, void *fpstp)
153
}
154
155
/* round to integral */
156
-float16 HELPER(advsimd_rinth_exact)(float16 x, void *fp_status)
157
+uint32_t HELPER(advsimd_rinth_exact)(uint32_t x, void *fp_status)
158
{
159
return float16_round_to_int(x, fp_status);
160
}
161
162
-float16 HELPER(advsimd_rinth)(float16 x, void *fp_status)
163
+uint32_t HELPER(advsimd_rinth)(uint32_t x, void *fp_status)
164
{
165
int old_flags = get_float_exception_flags(fp_status), new_flags;
166
float16 ret;
167
@@ -XXX,XX +XXX,XX @@ float16 HELPER(advsimd_rinth)(float16 x, void *fp_status)
168
* setting the mode appropriately before calling the helper.
169
*/
170
171
-uint32_t HELPER(advsimd_f16tosinth)(float16 a, void *fpstp)
172
+uint32_t HELPER(advsimd_f16tosinth)(uint32_t a, void *fpstp)
173
{
174
float_status *fpst = fpstp;
175
176
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_f16tosinth)(float16 a, void *fpstp)
177
return float16_to_int16(a, fpst);
178
}
179
180
-uint32_t HELPER(advsimd_f16touinth)(float16 a, void *fpstp)
181
+uint32_t HELPER(advsimd_f16touinth)(uint32_t a, void *fpstp)
182
{
183
float_status *fpst = fpstp;
184
185
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_f16touinth)(float16 a, void *fpstp)
186
* Square Root and Reciprocal square root
187
*/
188
189
-float16 HELPER(sqrt_f16)(float16 a, void *fpstp)
190
+uint32_t HELPER(sqrt_f16)(uint32_t a, void *fpstp)
191
{
192
float_status *s = fpstp;
193
194
diff --git a/target/arm/helper.c b/target/arm/helper.c
210
diff --git a/target/arm/helper.c b/target/arm/helper.c
195
index XXXXXXX..XXXXXXX 100644
211
index XXXXXXX..XXXXXXX 100644
196
--- a/target/arm/helper.c
212
--- a/target/arm/helper.c
197
+++ b/target/arm/helper.c
213
+++ b/target/arm/helper.c
198
@@ -XXX,XX +XXX,XX @@ DO_VFP_cmp(d, float64)
214
@@ -XXX,XX +XXX,XX @@ static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri,
199
215
* ASEDIS [31] and D32DIS [30] are both UNK/SBZP without VFP.
200
/* Integer to float and float to integer conversions */
216
* TRCDIS [28] is RAZ/WI since we do not implement a trace macrocell.
201
217
*/
202
-#define CONV_ITOF(name, fsz, sign) \
218
- if (arm_feature(env, ARM_FEATURE_VFP)) {
203
- float##fsz HELPER(name)(uint32_t x, void *fpstp) \
219
+ if (cpu_isar_feature(aa32_vfp_simd, env_archcpu(env))) {
204
-{ \
220
/* VFP coprocessor: cp10 & cp11 [23:20] */
205
- float_status *fpst = fpstp; \
221
mask |= (1 << 31) | (1 << 30) | (0xf << 20);
206
- return sign##int32_to_##float##fsz((sign##int32_t)x, fpst); \
222
207
+#define CONV_ITOF(name, ftype, fsz, sign) \
223
@@ -XXX,XX +XXX,XX @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
208
+ftype HELPER(name)(uint32_t x, void *fpstp) \
224
} else if (cpu_isar_feature(aa32_simd_r32, cpu)) {
209
+{ \
225
gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
210
+ float_status *fpst = fpstp; \
226
35, "arm-vfp3.xml", 0);
211
+ return sign##int32_to_##float##fsz((sign##int32_t)x, fpst); \
227
- } else if (arm_feature(env, ARM_FEATURE_VFP)) {
212
}
228
+ } else if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
213
229
gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
214
-#define CONV_FTOI(name, fsz, sign, round) \
230
19, "arm-vfp.xml", 0);
215
-uint32_t HELPER(name)(float##fsz x, void *fpstp) \
231
}
216
-{ \
232
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
217
- float_status *fpst = fpstp; \
233
index XXXXXXX..XXXXXXX 100644
218
- if (float##fsz##_is_any_nan(x)) { \
234
--- a/target/arm/m_helper.c
219
- float_raise(float_flag_invalid, fpst); \
235
+++ b/target/arm/m_helper.c
220
- return 0; \
236
@@ -XXX,XX +XXX,XX @@ static uint32_t v7m_integrity_sig(CPUARMState *env, uint32_t lr)
221
- } \
237
*/
222
- return float##fsz##_to_##sign##int32##round(x, fpst); \
238
uint32_t sig = 0xfefa125a;
223
+#define CONV_FTOI(name, ftype, fsz, sign, round) \
239
224
+uint32_t HELPER(name)(ftype x, void *fpstp) \
240
- if (!arm_feature(env, ARM_FEATURE_VFP) || (lr & R_V7M_EXCRET_FTYPE_MASK)) {
225
+{ \
241
+ if (!cpu_isar_feature(aa32_vfp_simd, env_archcpu(env))
226
+ float_status *fpst = fpstp; \
242
+ || (lr & R_V7M_EXCRET_FTYPE_MASK)) {
227
+ if (float##fsz##_is_any_nan(x)) { \
243
sig |= 1;
228
+ float_raise(float_flag_invalid, fpst); \
244
}
229
+ return 0; \
245
return sig;
230
+ } \
246
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain,
231
+ return float##fsz##_to_##sign##int32##round(x, fpst); \
247
232
}
248
if (dotailchain) {
233
249
/* Sanitize LR FType and PREFIX bits */
234
-#define FLOAT_CONVS(name, p, fsz, sign) \
250
- if (!arm_feature(env, ARM_FEATURE_VFP)) {
235
-CONV_ITOF(vfp_##name##to##p, fsz, sign) \
251
+ if (!cpu_isar_feature(aa32_vfp_simd, cpu)) {
236
-CONV_FTOI(vfp_to##name##p, fsz, sign, ) \
252
lr |= R_V7M_EXCRET_FTYPE_MASK;
237
-CONV_FTOI(vfp_to##name##z##p, fsz, sign, _round_to_zero)
253
}
238
+#define FLOAT_CONVS(name, p, ftype, fsz, sign) \
254
lr = deposit32(lr, 24, 8, 0xff);
239
+ CONV_ITOF(vfp_##name##to##p, ftype, fsz, sign) \
255
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
240
+ CONV_FTOI(vfp_to##name##p, ftype, fsz, sign, ) \
256
241
+ CONV_FTOI(vfp_to##name##z##p, ftype, fsz, sign, _round_to_zero)
257
ftype = excret & R_V7M_EXCRET_FTYPE_MASK;
242
258
243
-FLOAT_CONVS(si, h, 16, )
259
- if (!arm_feature(env, ARM_FEATURE_VFP) && !ftype) {
244
-FLOAT_CONVS(si, s, 32, )
260
+ if (!ftype && !cpu_isar_feature(aa32_vfp_simd, cpu)) {
245
-FLOAT_CONVS(si, d, 64, )
261
qemu_log_mask(LOG_GUEST_ERROR, "M profile: zero FTYPE in exception "
246
-FLOAT_CONVS(ui, h, 16, u)
262
"exit PC value 0x%" PRIx32 " is UNPREDICTABLE "
247
-FLOAT_CONVS(ui, s, 32, u)
263
"if FPU not present\n",
248
-FLOAT_CONVS(ui, d, 64, u)
264
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
249
+FLOAT_CONVS(si, h, uint32_t, 16, )
265
* SFPA is RAZ/WI from NS. FPCA is RO if NSACR.CP10 == 0,
250
+FLOAT_CONVS(si, s, float32, 32, )
266
* RES0 if the FPU is not present, and is stored in the S bank
251
+FLOAT_CONVS(si, d, float64, 64, )
267
*/
252
+FLOAT_CONVS(ui, h, uint32_t, 16, u)
268
- if (arm_feature(env, ARM_FEATURE_VFP) &&
253
+FLOAT_CONVS(ui, s, float32, 32, u)
269
+ if (cpu_isar_feature(aa32_vfp_simd, env_archcpu(env)) &&
254
+FLOAT_CONVS(ui, d, float64, 64, u)
270
extract32(env->v7m.nsacr, 10, 1)) {
255
271
env->v7m.control[M_REG_S] &= ~R_V7M_CONTROL_FPCA_MASK;
256
#undef CONV_ITOF
272
env->v7m.control[M_REG_S] |= val & R_V7M_CONTROL_FPCA_MASK;
257
#undef CONV_FTOI
273
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
258
@@ -XXX,XX +XXX,XX @@ static float16 do_postscale_fp16(float64 f, int shift, float_status *fpst)
274
env->v7m.control[env->v7m.secure] &= ~R_V7M_CONTROL_NPRIV_MASK;
259
return float64_to_float16(float64_scalbn(f, -shift, fpst), true, fpst);
275
env->v7m.control[env->v7m.secure] |= val & R_V7M_CONTROL_NPRIV_MASK;
260
}
276
}
261
277
- if (arm_feature(env, ARM_FEATURE_VFP)) {
262
-float16 HELPER(vfp_sltoh)(uint32_t x, uint32_t shift, void *fpst)
278
+ if (cpu_isar_feature(aa32_vfp_simd, env_archcpu(env))) {
263
+uint32_t HELPER(vfp_sltoh)(uint32_t x, uint32_t shift, void *fpst)
279
/*
264
{
280
* SFPA is RAZ/WI from NS or if no FPU.
265
return do_postscale_fp16(int32_to_float64(x, fpst), shift, fpst);
281
* FPCA is RO if NSACR.CP10 == 0, RES0 if the FPU is not present.
266
}
267
268
-float16 HELPER(vfp_ultoh)(uint32_t x, uint32_t shift, void *fpst)
269
+uint32_t HELPER(vfp_ultoh)(uint32_t x, uint32_t shift, void *fpst)
270
{
271
return do_postscale_fp16(uint32_to_float64(x, fpst), shift, fpst);
272
}
273
274
-float16 HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
275
+uint32_t HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
276
{
277
return do_postscale_fp16(int64_to_float64(x, fpst), shift, fpst);
278
}
279
280
-float16 HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
281
+uint32_t HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
282
{
283
return do_postscale_fp16(uint64_to_float64(x, fpst), shift, fpst);
284
}
285
@@ -XXX,XX +XXX,XX @@ static float64 do_prescale_fp16(float16 f, int shift, float_status *fpst)
286
}
287
}
288
289
-uint32_t HELPER(vfp_toshh)(float16 x, uint32_t shift, void *fpst)
290
+uint32_t HELPER(vfp_toshh)(uint32_t x, uint32_t shift, void *fpst)
291
{
292
return float64_to_int16(do_prescale_fp16(x, shift, fpst), fpst);
293
}
294
295
-uint32_t HELPER(vfp_touhh)(float16 x, uint32_t shift, void *fpst)
296
+uint32_t HELPER(vfp_touhh)(uint32_t x, uint32_t shift, void *fpst)
297
{
298
return float64_to_uint16(do_prescale_fp16(x, shift, fpst), fpst);
299
}
300
301
-uint32_t HELPER(vfp_toslh)(float16 x, uint32_t shift, void *fpst)
302
+uint32_t HELPER(vfp_toslh)(uint32_t x, uint32_t shift, void *fpst)
303
{
304
return float64_to_int32(do_prescale_fp16(x, shift, fpst), fpst);
305
}
306
307
-uint32_t HELPER(vfp_toulh)(float16 x, uint32_t shift, void *fpst)
308
+uint32_t HELPER(vfp_toulh)(uint32_t x, uint32_t shift, void *fpst)
309
{
310
return float64_to_uint32(do_prescale_fp16(x, shift, fpst), fpst);
311
}
312
313
-uint64_t HELPER(vfp_tosqh)(float16 x, uint32_t shift, void *fpst)
314
+uint64_t HELPER(vfp_tosqh)(uint32_t x, uint32_t shift, void *fpst)
315
{
316
return float64_to_int64(do_prescale_fp16(x, shift, fpst), fpst);
317
}
318
319
-uint64_t HELPER(vfp_touqh)(float16 x, uint32_t shift, void *fpst)
320
+uint64_t HELPER(vfp_touqh)(uint32_t x, uint32_t shift, void *fpst)
321
{
322
return float64_to_uint64(do_prescale_fp16(x, shift, fpst), fpst);
323
}
324
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(set_neon_rmode)(uint32_t rmode, CPUARMState *env)
325
}
326
327
/* Half precision conversions. */
328
-float32 HELPER(vfp_fcvt_f16_to_f32)(float16 a, void *fpstp, uint32_t ahp_mode)
329
+float32 HELPER(vfp_fcvt_f16_to_f32)(uint32_t a, void *fpstp, uint32_t ahp_mode)
330
{
331
/* Squash FZ16 to 0 for the duration of conversion. In this case,
332
* it would affect flushing input denormals.
333
@@ -XXX,XX +XXX,XX @@ float32 HELPER(vfp_fcvt_f16_to_f32)(float16 a, void *fpstp, uint32_t ahp_mode)
334
return r;
335
}
336
337
-float16 HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
338
+uint32_t HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
339
{
340
/* Squash FZ16 to 0 for the duration of conversion. In this case,
341
* it would affect flushing output denormals.
342
@@ -XXX,XX +XXX,XX @@ float16 HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
343
return r;
344
}
345
346
-float64 HELPER(vfp_fcvt_f16_to_f64)(float16 a, void *fpstp, uint32_t ahp_mode)
347
+float64 HELPER(vfp_fcvt_f16_to_f64)(uint32_t a, void *fpstp, uint32_t ahp_mode)
348
{
349
/* Squash FZ16 to 0 for the duration of conversion. In this case,
350
* it would affect flushing input denormals.
351
@@ -XXX,XX +XXX,XX @@ float64 HELPER(vfp_fcvt_f16_to_f64)(float16 a, void *fpstp, uint32_t ahp_mode)
352
return r;
353
}
354
355
-float16 HELPER(vfp_fcvt_f64_to_f16)(float64 a, void *fpstp, uint32_t ahp_mode)
356
+uint32_t HELPER(vfp_fcvt_f64_to_f16)(float64 a, void *fpstp, uint32_t ahp_mode)
357
{
358
/* Squash FZ16 to 0 for the duration of conversion. In this case,
359
* it would affect flushing output denormals.
360
@@ -XXX,XX +XXX,XX @@ static bool round_to_inf(float_status *fpst, bool sign_bit)
361
g_assert_not_reached();
362
}
363
364
-float16 HELPER(recpe_f16)(float16 input, void *fpstp)
365
+uint32_t HELPER(recpe_f16)(uint32_t input, void *fpstp)
366
{
367
float_status *fpst = fpstp;
368
float16 f16 = float16_squash_input_denormal(input, fpst);
369
@@ -XXX,XX +XXX,XX @@ static uint64_t recip_sqrt_estimate(int *exp , int exp_off, uint64_t frac)
370
return extract64(estimate, 0, 8) << 44;
371
}
372
373
-float16 HELPER(rsqrte_f16)(float16 input, void *fpstp)
374
+uint32_t HELPER(rsqrte_f16)(uint32_t input, void *fpstp)
375
{
376
float_status *s = fpstp;
377
float16 f16 = float16_squash_input_denormal(input, s);
378
--
282
--
379
2.17.1
283
2.20.1
380
284
381
285
diff view generated by jsdifflib
New patch
1
1
From: Richard Henderson <richard.henderson@linaro.org>
2
3
The old name, isar_feature_aa32_fpdp, does not reflect
4
that the test includes VFPv2. We will introduce another
5
feature tests for VFPv3.
6
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200224222232.13807-3-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 4 ++--
13
target/arm/translate-vfp.inc.c | 40 +++++++++++++++++-----------------
14
2 files changed, 22 insertions(+), 22 deletions(-)
15
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu.h
19
+++ b/target/arm/cpu.h
20
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_fpshvec(const ARMISARegisters *id)
21
return FIELD_EX32(id->mvfr0, MVFR0, FPSHVEC) > 0;
22
}
23
24
-static inline bool isar_feature_aa32_fpdp(const ARMISARegisters *id)
25
+static inline bool isar_feature_aa32_fpdp_v2(const ARMISARegisters *id)
26
{
27
- /* Return true if CPU supports double precision floating point */
28
+ /* Return true if CPU supports double precision floating point, VFPv2 */
29
return FIELD_EX32(id->mvfr0, MVFR0, FPDP) > 0;
30
}
31
32
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/translate-vfp.inc.c
35
+++ b/target/arm/translate-vfp.inc.c
36
@@ -XXX,XX +XXX,XX @@ static bool trans_VSEL(DisasContext *s, arg_VSEL *a)
37
return false;
38
}
39
40
- if (dp && !dc_isar_feature(aa32_fpdp, s)) {
41
+ if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
42
return false;
43
}
44
45
@@ -XXX,XX +XXX,XX @@ static bool trans_VMINMAXNM(DisasContext *s, arg_VMINMAXNM *a)
46
return false;
47
}
48
49
- if (dp && !dc_isar_feature(aa32_fpdp, s)) {
50
+ if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
51
return false;
52
}
53
54
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINT(DisasContext *s, arg_VRINT *a)
55
return false;
56
}
57
58
- if (dp && !dc_isar_feature(aa32_fpdp, s)) {
59
+ if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
60
return false;
61
}
62
63
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT(DisasContext *s, arg_VCVT *a)
64
return false;
65
}
66
67
- if (dp && !dc_isar_feature(aa32_fpdp, s)) {
68
+ if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
69
return false;
70
}
71
72
@@ -XXX,XX +XXX,XX @@ static bool do_vfp_3op_dp(DisasContext *s, VFPGen3OpDPFn *fn,
73
return false;
74
}
75
76
- if (!dc_isar_feature(aa32_fpdp, s)) {
77
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
78
return false;
79
}
80
81
@@ -XXX,XX +XXX,XX @@ static bool do_vfp_2op_dp(DisasContext *s, VFPGen2OpDPFn *fn, int vd, int vm)
82
return false;
83
}
84
85
- if (!dc_isar_feature(aa32_fpdp, s)) {
86
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
87
return false;
88
}
89
90
@@ -XXX,XX +XXX,XX @@ static bool trans_VFM_dp(DisasContext *s, arg_VFM_dp *a)
91
return false;
92
}
93
94
- if (!dc_isar_feature(aa32_fpdp, s)) {
95
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
96
return false;
97
}
98
99
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_imm_dp(DisasContext *s, arg_VMOV_imm_dp *a)
100
return false;
101
}
102
103
- if (!dc_isar_feature(aa32_fpdp, s)) {
104
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
105
return false;
106
}
107
108
@@ -XXX,XX +XXX,XX @@ static bool trans_VCMP_dp(DisasContext *s, arg_VCMP_dp *a)
109
return false;
110
}
111
112
- if (!dc_isar_feature(aa32_fpdp, s)) {
113
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
114
return false;
115
}
116
117
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f64_f16(DisasContext *s, arg_VCVT_f64_f16 *a)
118
return false;
119
}
120
121
- if (!dc_isar_feature(aa32_fpdp, s)) {
122
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
123
return false;
124
}
125
126
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f16_f64(DisasContext *s, arg_VCVT_f16_f64 *a)
127
return false;
128
}
129
130
- if (!dc_isar_feature(aa32_fpdp, s)) {
131
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
132
return false;
133
}
134
135
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTR_dp(DisasContext *s, arg_VRINTR_dp *a)
136
return false;
137
}
138
139
- if (!dc_isar_feature(aa32_fpdp, s)) {
140
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
141
return false;
142
}
143
144
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTZ_dp(DisasContext *s, arg_VRINTZ_dp *a)
145
return false;
146
}
147
148
- if (!dc_isar_feature(aa32_fpdp, s)) {
149
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
150
return false;
151
}
152
153
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTX_dp(DisasContext *s, arg_VRINTX_dp *a)
154
return false;
155
}
156
157
- if (!dc_isar_feature(aa32_fpdp, s)) {
158
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
159
return false;
160
}
161
162
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_sp(DisasContext *s, arg_VCVT_sp *a)
163
return false;
164
}
165
166
- if (!dc_isar_feature(aa32_fpdp, s)) {
167
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
168
return false;
169
}
170
171
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_dp(DisasContext *s, arg_VCVT_dp *a)
172
return false;
173
}
174
175
- if (!dc_isar_feature(aa32_fpdp, s)) {
176
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
177
return false;
178
}
179
180
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_int_dp(DisasContext *s, arg_VCVT_int_dp *a)
181
return false;
182
}
183
184
- if (!dc_isar_feature(aa32_fpdp, s)) {
185
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
186
return false;
187
}
188
189
@@ -XXX,XX +XXX,XX @@ static bool trans_VJCVT(DisasContext *s, arg_VJCVT *a)
190
return false;
191
}
192
193
- if (!dc_isar_feature(aa32_fpdp, s)) {
194
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
195
return false;
196
}
197
198
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_fix_dp(DisasContext *s, arg_VCVT_fix_dp *a)
199
return false;
200
}
201
202
- if (!dc_isar_feature(aa32_fpdp, s)) {
203
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
204
return false;
205
}
206
207
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_dp_int(DisasContext *s, arg_VCVT_dp_int *a)
208
return false;
209
}
210
211
- if (!dc_isar_feature(aa32_fpdp, s)) {
212
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
213
return false;
214
}
215
216
--
217
2.20.1
218
219
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to address_space_map().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
We will shortly use these to test for VFPv2 and VFPv3
4
in different situations.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200224222232.13807-4-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-5-peter.maydell@linaro.org
10
---
10
---
11
include/exec/memory.h | 3 ++-
11
target/arm/cpu.h | 18 ++++++++++++++++++
12
include/sysemu/dma.h | 3 ++-
12
1 file changed, 18 insertions(+)
13
exec.c | 6 ++++--
14
target/ppc/mmu-hash64.c | 3 ++-
15
4 files changed, 10 insertions(+), 5 deletions(-)
16
13
17
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/memory.h
16
--- a/target/arm/cpu.h
20
+++ b/include/exec/memory.h
17
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_
18
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_fpshvec(const ARMISARegisters *id)
22
* @addr: address within that address space
19
return FIELD_EX32(id->mvfr0, MVFR0, FPSHVEC) > 0;
23
* @plen: pointer to length of buffer; updated on return
24
* @is_write: indicates the transfer direction
25
+ * @attrs: memory attributes
26
*/
27
void *address_space_map(AddressSpace *as, hwaddr addr,
28
- hwaddr *plen, bool is_write);
29
+ hwaddr *plen, bool is_write, MemTxAttrs attrs);
30
31
/* address_space_unmap: Unmaps a memory region previously mapped by address_space_map()
32
*
33
diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h
34
index XXXXXXX..XXXXXXX 100644
35
--- a/include/sysemu/dma.h
36
+++ b/include/sysemu/dma.h
37
@@ -XXX,XX +XXX,XX @@ static inline void *dma_memory_map(AddressSpace *as,
38
hwaddr xlen = *len;
39
void *p;
40
41
- p = address_space_map(as, addr, &xlen, dir == DMA_DIRECTION_FROM_DEVICE);
42
+ p = address_space_map(as, addr, &xlen, dir == DMA_DIRECTION_FROM_DEVICE,
43
+ MEMTXATTRS_UNSPECIFIED);
44
*len = xlen;
45
return p;
46
}
20
}
47
diff --git a/exec.c b/exec.c
21
48
index XXXXXXX..XXXXXXX 100644
22
+static inline bool isar_feature_aa32_fpsp_v2(const ARMISARegisters *id)
49
--- a/exec.c
23
+{
50
+++ b/exec.c
24
+ /* Return true if CPU supports single precision floating point, VFPv2 */
51
@@ -XXX,XX +XXX,XX @@ flatview_extend_translation(FlatView *fv, hwaddr addr,
25
+ return FIELD_EX32(id->mvfr0, MVFR0, FPSP) > 0;
52
void *address_space_map(AddressSpace *as,
26
+}
53
hwaddr addr,
27
+
54
hwaddr *plen,
28
+static inline bool isar_feature_aa32_fpsp_v3(const ARMISARegisters *id)
55
- bool is_write)
29
+{
56
+ bool is_write,
30
+ /* Return true if CPU supports single precision floating point, VFPv3 */
57
+ MemTxAttrs attrs)
31
+ return FIELD_EX32(id->mvfr0, MVFR0, FPSP) >= 2;
32
+}
33
+
34
static inline bool isar_feature_aa32_fpdp_v2(const ARMISARegisters *id)
58
{
35
{
59
hwaddr len = *plen;
36
/* Return true if CPU supports double precision floating point, VFPv2 */
60
hwaddr l, xlat;
37
return FIELD_EX32(id->mvfr0, MVFR0, FPDP) > 0;
61
@@ -XXX,XX +XXX,XX @@ void *cpu_physical_memory_map(hwaddr addr,
62
hwaddr *plen,
63
int is_write)
64
{
65
- return address_space_map(&address_space_memory, addr, plen, is_write);
66
+ return address_space_map(&address_space_memory, addr, plen, is_write,
67
+ MEMTXATTRS_UNSPECIFIED);
68
}
38
}
69
39
70
void cpu_physical_memory_unmap(void *buffer, hwaddr len,
40
+static inline bool isar_feature_aa32_fpdp_v3(const ARMISARegisters *id)
71
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
41
+{
72
index XXXXXXX..XXXXXXX 100644
42
+ /* Return true if CPU supports double precision floating point, VFPv3 */
73
--- a/target/ppc/mmu-hash64.c
43
+ return FIELD_EX32(id->mvfr0, MVFR0, FPDP) >= 2;
74
+++ b/target/ppc/mmu-hash64.c
44
+}
75
@@ -XXX,XX +XXX,XX @@ const ppc_hash_pte64_t *ppc_hash64_map_hptes(PowerPCCPU *cpu,
45
+
76
return NULL;
46
/*
77
}
47
* We always set the FP and SIMD FP16 fields to indicate identical
78
48
* levels of support (assuming SIMD is implemented at all), so
79
- hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false);
80
+ hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false,
81
+ MEMTXATTRS_UNSPECIFIED);
82
if (plen < (n * HASH_PTE_SIZE_64)) {
83
hw_error("%s: Unable to map all requested HPTEs\n", __func__);
84
}
85
--
49
--
86
2.17.1
50
2.20.1
87
51
88
52
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to address_space_translate_iommu().
3
2
3
We cannot easily create "any" functions for these, because the
4
ID_AA64PFR0 fields for FP and SIMD signal "enabled" with zero.
5
Which means that an aarch32-only cpu will return incorrect results
6
when testing the aarch64 registers.
7
8
To use these, we must either have context or additionally test
9
vs ARM_FEATURE_AARCH64.
10
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Message-id: 20200224222232.13807-5-richard.henderson@linaro.org
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-14-peter.maydell@linaro.org
8
---
15
---
9
exec.c | 8 +++++---
16
target/arm/cpu.h | 11 +++++++++++
10
1 file changed, 5 insertions(+), 3 deletions(-)
17
target/arm/cpu.c | 9 ++++++---
18
target/arm/machine.c | 5 +++--
19
3 files changed, 20 insertions(+), 5 deletions(-)
11
20
12
diff --git a/exec.c b/exec.c
21
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
13
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
23
--- a/target/arm/cpu.h
15
+++ b/exec.c
24
+++ b/target/arm/cpu.h
16
@@ -XXX,XX +XXX,XX @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x
25
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_fpdp_v3(const ARMISARegisters *id)
17
* @is_write: whether the translation operation is for write
26
return FIELD_EX32(id->mvfr0, MVFR0, FPDP) >= 2;
18
* @is_mmio: whether this can be MMIO, set true if it can
27
}
19
* @target_as: the address space targeted by the IOMMU
28
20
+ * @attrs: transaction attributes
29
+static inline bool isar_feature_aa32_vfp(const ARMISARegisters *id)
21
*
30
+{
22
* This function is called from RCU critical section. It is the common
31
+ return isar_feature_aa32_fpsp_v2(id) || isar_feature_aa32_fpdp_v2(id);
23
* part of flatview_do_translate and address_space_translate_cached.
32
+}
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection address_space_translate_iommu(IOMMUMemoryRegion *iomm
33
+
25
hwaddr *page_mask_out,
34
/*
26
bool is_write,
35
* We always set the FP and SIMD FP16 fields to indicate identical
27
bool is_mmio,
36
* levels of support (assuming SIMD is implemented at all), so
28
- AddressSpace **target_as)
37
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_dcpodp(const ARMISARegisters *id)
29
+ AddressSpace **target_as,
38
return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, DPB) >= 2;
30
+ MemTxAttrs attrs)
39
}
40
41
+static inline bool isar_feature_aa64_fp_simd(const ARMISARegisters *id)
42
+{
43
+ /* We always set the AdvSIMD and FP fields identically. */
44
+ return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, FP) != 0xf;
45
+}
46
+
47
static inline bool isar_feature_aa64_fp16(const ARMISARegisters *id)
31
{
48
{
32
MemoryRegionSection *section;
49
/* We always set the AdvSIMD and FP fields identically wrt FP16. */
33
hwaddr page_mask = (hwaddr)-1;
50
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
34
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
51
index XXXXXXX..XXXXXXX 100644
35
return address_space_translate_iommu(iommu_mr, xlat,
52
--- a/target/arm/cpu.c
36
plen_out, page_mask_out,
53
+++ b/target/arm/cpu.c
37
is_write, is_mmio,
54
@@ -XXX,XX +XXX,XX @@ void arm_cpu_post_init(Object *obj)
38
- target_as);
55
* KVM does not currently allow us to lie to the guest about its
39
+ target_as, attrs);
56
* ID/feature registers, so the guest always sees what the host has.
40
}
57
*/
41
if (page_mask_out) {
58
- if (arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
42
/* Not behind an IOMMU, use default page size. */
59
+ if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)
43
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate_cached(
60
+ ? cpu_isar_feature(aa64_fp_simd, cpu)
44
61
+ : cpu_isar_feature(aa32_vfp, cpu)) {
45
section = address_space_translate_iommu(iommu_mr, xlat, plen,
62
cpu->has_vfp = true;
46
NULL, is_write, true,
63
if (!kvm_enabled()) {
47
- &target_as);
64
qdev_property_add_static(DEVICE(obj), &arm_cpu_has_vfp_property);
48
+ &target_as, attrs);
65
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
49
return section.mr;
66
* We rely on no XScale CPU having VFP so we can use the same bits in the
67
* TB flags field for VECSTRIDE and XSCALE_CPAR.
68
*/
69
- assert(!(arm_feature(env, ARM_FEATURE_VFP) &&
70
- arm_feature(env, ARM_FEATURE_XSCALE)));
71
+ assert(arm_feature(&cpu->env, ARM_FEATURE_AARCH64) ||
72
+ !cpu_isar_feature(aa32_vfp_simd, cpu) ||
73
+ !arm_feature(env, ARM_FEATURE_XSCALE));
74
75
if (arm_feature(env, ARM_FEATURE_V7) &&
76
!arm_feature(env, ARM_FEATURE_M) &&
77
diff --git a/target/arm/machine.c b/target/arm/machine.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/target/arm/machine.c
80
+++ b/target/arm/machine.c
81
@@ -XXX,XX +XXX,XX @@
82
static bool vfp_needed(void *opaque)
83
{
84
ARMCPU *cpu = opaque;
85
- CPUARMState *env = &cpu->env;
86
87
- return arm_feature(env, ARM_FEATURE_VFP);
88
+ return (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)
89
+ ? cpu_isar_feature(aa64_fp_simd, cpu)
90
+ : cpu_isar_feature(aa32_vfp_simd, cpu));
50
}
91
}
51
92
93
static int get_fpscr(QEMUFile *f, void *opaque, size_t size,
52
--
94
--
53
2.17.1
95
2.20.1
54
96
55
97
diff view generated by jsdifflib
New patch
1
1
From: Richard Henderson <richard.henderson@linaro.org>
2
3
Shuffle the order of the checks so that we test the ISA
4
before we test anything else, such as the register arguments.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200224222232.13807-7-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-vfp.inc.c | 140 +++++++++++++++++----------------
12
1 file changed, 71 insertions(+), 69 deletions(-)
13
14
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-vfp.inc.c
17
+++ b/target/arm/translate-vfp.inc.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_VSEL(DisasContext *s, arg_VSEL *a)
19
return false;
20
}
21
22
- /* UNDEF accesses to D16-D31 if they don't exist */
23
- if (dp && !dc_isar_feature(aa32_simd_r32, s) &&
24
- ((a->vm | a->vn | a->vd) & 0x10)) {
25
+ if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
26
return false;
27
}
28
29
- if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
30
+ /* UNDEF accesses to D16-D31 if they don't exist */
31
+ if (dp && !dc_isar_feature(aa32_simd_r32, s) &&
32
+ ((a->vm | a->vn | a->vd) & 0x10)) {
33
return false;
34
}
35
36
@@ -XXX,XX +XXX,XX @@ static bool trans_VMINMAXNM(DisasContext *s, arg_VMINMAXNM *a)
37
return false;
38
}
39
40
- /* UNDEF accesses to D16-D31 if they don't exist */
41
- if (dp && !dc_isar_feature(aa32_simd_r32, s) &&
42
- ((a->vm | a->vn | a->vd) & 0x10)) {
43
+ if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
44
return false;
45
}
46
47
- if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
48
+ /* UNDEF accesses to D16-D31 if they don't exist */
49
+ if (dp && !dc_isar_feature(aa32_simd_r32, s) &&
50
+ ((a->vm | a->vn | a->vd) & 0x10)) {
51
return false;
52
}
53
54
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINT(DisasContext *s, arg_VRINT *a)
55
return false;
56
}
57
58
- /* UNDEF accesses to D16-D31 if they don't exist */
59
- if (dp && !dc_isar_feature(aa32_simd_r32, s) &&
60
- ((a->vm | a->vd) & 0x10)) {
61
+ if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
62
return false;
63
}
64
65
- if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
66
+ /* UNDEF accesses to D16-D31 if they don't exist */
67
+ if (dp && !dc_isar_feature(aa32_simd_r32, s) &&
68
+ ((a->vm | a->vd) & 0x10)) {
69
return false;
70
}
71
72
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT(DisasContext *s, arg_VCVT *a)
73
return false;
74
}
75
76
- /* UNDEF accesses to D16-D31 if they don't exist */
77
- if (dp && !dc_isar_feature(aa32_simd_r32, s) && (a->vm & 0x10)) {
78
+ if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
79
return false;
80
}
81
82
- if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
83
+ /* UNDEF accesses to D16-D31 if they don't exist */
84
+ if (dp && !dc_isar_feature(aa32_simd_r32, s) && (a->vm & 0x10)) {
85
return false;
86
}
87
88
@@ -XXX,XX +XXX,XX @@ static bool do_vfp_3op_dp(DisasContext *s, VFPGen3OpDPFn *fn,
89
TCGv_i64 f0, f1, fd;
90
TCGv_ptr fpst;
91
92
- /* UNDEF accesses to D16-D31 if they don't exist */
93
- if (!dc_isar_feature(aa32_simd_r32, s) && ((vd | vn | vm) & 0x10)) {
94
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
95
return false;
96
}
97
98
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
99
+ /* UNDEF accesses to D16-D31 if they don't exist */
100
+ if (!dc_isar_feature(aa32_simd_r32, s) && ((vd | vn | vm) & 0x10)) {
101
return false;
102
}
103
104
@@ -XXX,XX +XXX,XX @@ static bool do_vfp_2op_dp(DisasContext *s, VFPGen2OpDPFn *fn, int vd, int vm)
105
int veclen = s->vec_len;
106
TCGv_i64 f0, fd;
107
108
- /* UNDEF accesses to D16-D31 if they don't exist */
109
- if (!dc_isar_feature(aa32_simd_r32, s) && ((vd | vm) & 0x10)) {
110
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
111
return false;
112
}
113
114
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
115
+ /* UNDEF accesses to D16-D31 if they don't exist */
116
+ if (!dc_isar_feature(aa32_simd_r32, s) && ((vd | vm) & 0x10)) {
117
return false;
118
}
119
120
@@ -XXX,XX +XXX,XX @@ static bool trans_VFM_dp(DisasContext *s, arg_VFM_dp *a)
121
return false;
122
}
123
124
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
125
+ /* UNDEF accesses to D16-D31 if they don't exist. */
126
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
127
+ ((a->vd | a->vn | a->vm) & 0x10)) {
128
return false;
129
}
130
131
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_imm_dp(DisasContext *s, arg_VMOV_imm_dp *a)
132
133
vd = a->vd;
134
135
- /* UNDEF accesses to D16-D31 if they don't exist. */
136
- if (!dc_isar_feature(aa32_simd_r32, s) && (vd & 0x10)) {
137
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
138
return false;
139
}
140
141
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
142
+ /* UNDEF accesses to D16-D31 if they don't exist. */
143
+ if (!dc_isar_feature(aa32_simd_r32, s) && (vd & 0x10)) {
144
return false;
145
}
146
147
@@ -XXX,XX +XXX,XX @@ static bool trans_VCMP_dp(DisasContext *s, arg_VCMP_dp *a)
148
{
149
TCGv_i64 vd, vm;
150
151
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
152
+ return false;
153
+ }
154
+
155
/* Vm/M bits must be zero for the Z variant */
156
if (a->z && a->vm != 0) {
157
return false;
158
@@ -XXX,XX +XXX,XX @@ static bool trans_VCMP_dp(DisasContext *s, arg_VCMP_dp *a)
159
return false;
160
}
161
162
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
163
- return false;
164
- }
165
-
166
if (!vfp_access_check(s)) {
167
return true;
168
}
169
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f64_f16(DisasContext *s, arg_VCVT_f64_f16 *a)
170
TCGv_i32 tmp;
171
TCGv_i64 vd;
172
173
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
174
+ return false;
175
+ }
176
+
177
if (!dc_isar_feature(aa32_fp16_dpconv, s)) {
178
return false;
179
}
180
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f64_f16(DisasContext *s, arg_VCVT_f64_f16 *a)
181
return false;
182
}
183
184
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
185
- return false;
186
- }
187
-
188
if (!vfp_access_check(s)) {
189
return true;
190
}
191
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f16_f64(DisasContext *s, arg_VCVT_f16_f64 *a)
192
TCGv_i32 tmp;
193
TCGv_i64 vm;
194
195
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
196
+ return false;
197
+ }
198
+
199
if (!dc_isar_feature(aa32_fp16_dpconv, s)) {
200
return false;
201
}
202
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f16_f64(DisasContext *s, arg_VCVT_f16_f64 *a)
203
return false;
204
}
205
206
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
207
- return false;
208
- }
209
-
210
if (!vfp_access_check(s)) {
211
return true;
212
}
213
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTR_dp(DisasContext *s, arg_VRINTR_dp *a)
214
TCGv_ptr fpst;
215
TCGv_i64 tmp;
216
217
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
218
+ return false;
219
+ }
220
+
221
if (!dc_isar_feature(aa32_vrint, s)) {
222
return false;
223
}
224
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTR_dp(DisasContext *s, arg_VRINTR_dp *a)
225
return false;
226
}
227
228
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
229
- return false;
230
- }
231
-
232
if (!vfp_access_check(s)) {
233
return true;
234
}
235
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTZ_dp(DisasContext *s, arg_VRINTZ_dp *a)
236
TCGv_i64 tmp;
237
TCGv_i32 tcg_rmode;
238
239
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
240
+ return false;
241
+ }
242
+
243
if (!dc_isar_feature(aa32_vrint, s)) {
244
return false;
245
}
246
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTZ_dp(DisasContext *s, arg_VRINTZ_dp *a)
247
return false;
248
}
249
250
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
251
- return false;
252
- }
253
-
254
if (!vfp_access_check(s)) {
255
return true;
256
}
257
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTX_dp(DisasContext *s, arg_VRINTX_dp *a)
258
TCGv_ptr fpst;
259
TCGv_i64 tmp;
260
261
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
262
+ return false;
263
+ }
264
+
265
if (!dc_isar_feature(aa32_vrint, s)) {
266
return false;
267
}
268
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTX_dp(DisasContext *s, arg_VRINTX_dp *a)
269
return false;
270
}
271
272
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
273
- return false;
274
- }
275
-
276
if (!vfp_access_check(s)) {
277
return true;
278
}
279
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_sp(DisasContext *s, arg_VCVT_sp *a)
280
TCGv_i64 vd;
281
TCGv_i32 vm;
282
283
- /* UNDEF accesses to D16-D31 if they don't exist. */
284
- if (!dc_isar_feature(aa32_simd_r32, s) && (a->vd & 0x10)) {
285
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
286
return false;
287
}
288
289
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
290
+ /* UNDEF accesses to D16-D31 if they don't exist. */
291
+ if (!dc_isar_feature(aa32_simd_r32, s) && (a->vd & 0x10)) {
292
return false;
293
}
294
295
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_dp(DisasContext *s, arg_VCVT_dp *a)
296
TCGv_i64 vm;
297
TCGv_i32 vd;
298
299
- /* UNDEF accesses to D16-D31 if they don't exist. */
300
- if (!dc_isar_feature(aa32_simd_r32, s) && (a->vm & 0x10)) {
301
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
302
return false;
303
}
304
305
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
306
+ /* UNDEF accesses to D16-D31 if they don't exist. */
307
+ if (!dc_isar_feature(aa32_simd_r32, s) && (a->vm & 0x10)) {
308
return false;
309
}
310
311
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_int_dp(DisasContext *s, arg_VCVT_int_dp *a)
312
TCGv_i64 vd;
313
TCGv_ptr fpst;
314
315
- /* UNDEF accesses to D16-D31 if they don't exist. */
316
- if (!dc_isar_feature(aa32_simd_r32, s) && (a->vd & 0x10)) {
317
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
318
return false;
319
}
320
321
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
322
+ /* UNDEF accesses to D16-D31 if they don't exist. */
323
+ if (!dc_isar_feature(aa32_simd_r32, s) && (a->vd & 0x10)) {
324
return false;
325
}
326
327
@@ -XXX,XX +XXX,XX @@ static bool trans_VJCVT(DisasContext *s, arg_VJCVT *a)
328
TCGv_i32 vd;
329
TCGv_i64 vm;
330
331
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
332
+ return false;
333
+ }
334
+
335
if (!dc_isar_feature(aa32_jscvt, s)) {
336
return false;
337
}
338
@@ -XXX,XX +XXX,XX @@ static bool trans_VJCVT(DisasContext *s, arg_VJCVT *a)
339
return false;
340
}
341
342
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
343
- return false;
344
- }
345
-
346
if (!vfp_access_check(s)) {
347
return true;
348
}
349
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_fix_dp(DisasContext *s, arg_VCVT_fix_dp *a)
350
TCGv_ptr fpst;
351
int frac_bits;
352
353
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
354
+ return false;
355
+ }
356
+
357
if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) {
358
return false;
359
}
360
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_fix_dp(DisasContext *s, arg_VCVT_fix_dp *a)
361
return false;
362
}
363
364
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
365
- return false;
366
- }
367
-
368
if (!vfp_access_check(s)) {
369
return true;
370
}
371
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_dp_int(DisasContext *s, arg_VCVT_dp_int *a)
372
TCGv_i64 vm;
373
TCGv_ptr fpst;
374
375
- /* UNDEF accesses to D16-D31 if they don't exist. */
376
- if (!dc_isar_feature(aa32_simd_r32, s) && (a->vm & 0x10)) {
377
+ if (!dc_isar_feature(aa32_fpdp_v2, s)) {
378
return false;
379
}
380
381
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
382
+ /* UNDEF accesses to D16-D31 if they don't exist. */
383
+ if (!dc_isar_feature(aa32_simd_r32, s) && (a->vm & 0x10)) {
384
return false;
385
}
386
387
--
388
2.20.1
389
390
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
acpi_data_push uses g_array_set_size to resize the memory size. If there
3
Sort this check to the start of a trans_* function.
4
is no enough contiguous memory, the address will be changed. So previous
4
Merge this with any existing test for fpdp_v2.
5
pointer could not be used any more. It must update the pointer and use
6
the new one.
7
5
8
Also, previous codes wrongly use le32 conversion of iort->node_offset
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
for subsequent computations that will result incorrect value if host is
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
not litlle endian. So use the non-converted one instead.
8
Message-id: 20200224222232.13807-8-richard.henderson@linaro.org
11
12
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
13
Reviewed-by: Eric Auger <eric.auger@redhat.com>
14
Message-id: 1527663951-14552-1-git-send-email-zhaoshenglong@huawei.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
10
---
17
hw/arm/virt-acpi-build.c | 20 +++++++++++++++-----
11
target/arm/translate-vfp.inc.c | 24 ++++++++----------------
18
1 file changed, 15 insertions(+), 5 deletions(-)
12
1 file changed, 8 insertions(+), 16 deletions(-)
19
13
20
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
14
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/virt-acpi-build.c
16
--- a/target/arm/translate-vfp.inc.c
23
+++ b/hw/arm/virt-acpi-build.c
17
+++ b/target/arm/translate-vfp.inc.c
24
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
18
@@ -XXX,XX +XXX,XX @@ static bool trans_VMSR_VMRS(DisasContext *s, arg_VMSR_VMRS *a)
25
AcpiIortItsGroup *its;
19
* VFPv2 allows access to FPSID from userspace; VFPv3 restricts
26
AcpiIortTable *iort;
20
* all ID registers to privileged access only.
27
AcpiIortSmmu3 *smmu;
21
*/
28
- size_t node_size, iort_length, smmu_offset = 0;
22
- if (IS_USER(s) && arm_dc_feature(s, ARM_FEATURE_VFP3)) {
29
+ size_t node_size, iort_node_offset, iort_length, smmu_offset = 0;
23
+ if (IS_USER(s) && dc_isar_feature(aa32_fpsp_v3, s)) {
30
AcpiIortRC *rc;
24
return false;
31
25
}
32
iort = acpi_data_push(table_data, sizeof(*iort));
26
ignore_vfp_enabled = true;
33
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
27
@@ -XXX,XX +XXX,XX @@ static bool trans_VMSR_VMRS(DisasContext *s, arg_VMSR_VMRS *a)
34
28
case ARM_VFP_FPINST:
35
iort_length = sizeof(*iort);
29
case ARM_VFP_FPINST2:
36
iort->node_count = cpu_to_le32(nb_nodes);
30
/* Not present in VFPv3 */
37
- iort->node_offset = cpu_to_le32(sizeof(*iort));
31
- if (IS_USER(s) || arm_dc_feature(s, ARM_FEATURE_VFP3)) {
38
+ /*
32
+ if (IS_USER(s) || dc_isar_feature(aa32_fpsp_v3, s)) {
39
+ * Use a copy in case table_data->data moves during acpi_data_push
33
return false;
40
+ * operations.
34
}
41
+ */
35
break;
42
+ iort_node_offset = sizeof(*iort);
36
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_imm_sp(DisasContext *s, arg_VMOV_imm_sp *a)
43
+ iort->node_offset = cpu_to_le32(iort_node_offset);
37
44
38
vd = a->vd;
45
/* ITS group node */
39
46
node_size = sizeof(*its) + sizeof(uint32_t);
40
- if (!dc_isar_feature(aa32_fpshvec, s) &&
47
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
41
- (veclen != 0 || s->vec_stride != 0)) {
48
int irq = vms->irqmap[VIRT_SMMU];
42
+ if (!dc_isar_feature(aa32_fpsp_v3, s)) {
49
43
return false;
50
/* SMMUv3 node */
51
- smmu_offset = iort->node_offset + node_size;
52
+ smmu_offset = iort_node_offset + node_size;
53
node_size = sizeof(*smmu) + sizeof(*idmap);
54
iort_length += node_size;
55
smmu = acpi_data_push(table_data, node_size);
56
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
57
idmap->id_count = cpu_to_le32(0xFFFF);
58
idmap->output_base = 0;
59
/* output IORT node is the ITS group node (the first node) */
60
- idmap->output_reference = cpu_to_le32(iort->node_offset);
61
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
62
}
44
}
63
45
64
/* Root Complex Node */
46
- if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) {
65
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
47
+ if (!dc_isar_feature(aa32_fpshvec, s) &&
66
idmap->output_reference = cpu_to_le32(smmu_offset);
48
+ (veclen != 0 || s->vec_stride != 0)) {
67
} else {
49
return false;
68
/* output IORT node is the ITS group node (the first node) */
69
- idmap->output_reference = cpu_to_le32(iort->node_offset);
70
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
71
}
50
}
72
51
73
+ /*
52
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_imm_dp(DisasContext *s, arg_VMOV_imm_dp *a)
74
+ * Update the pointer address in case table_data->data moves during above
53
75
+ * acpi_data_push operations.
54
vd = a->vd;
76
+ */
55
77
+ iort = (AcpiIortTable *)(table_data->data + iort_start);
56
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
78
iort->length = cpu_to_le32(iort_length);
57
+ if (!dc_isar_feature(aa32_fpdp_v3, s)) {
79
58
return false;
80
build_header(linker, table_data, (void *)(table_data->data + iort_start),
59
}
60
61
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_imm_dp(DisasContext *s, arg_VMOV_imm_dp *a)
62
return false;
63
}
64
65
- if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) {
66
- return false;
67
- }
68
-
69
if (!vfp_access_check(s)) {
70
return true;
71
}
72
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_fix_sp(DisasContext *s, arg_VCVT_fix_sp *a)
73
TCGv_ptr fpst;
74
int frac_bits;
75
76
- if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) {
77
+ if (!dc_isar_feature(aa32_fpsp_v3, s)) {
78
return false;
79
}
80
81
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_fix_dp(DisasContext *s, arg_VCVT_fix_dp *a)
82
TCGv_ptr fpst;
83
int frac_bits;
84
85
- if (!dc_isar_feature(aa32_fpdp_v2, s)) {
86
- return false;
87
- }
88
-
89
- if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) {
90
+ if (!dc_isar_feature(aa32_fpdp_v3, s)) {
91
return false;
92
}
93
81
--
94
--
82
2.17.1
95
2.20.1
83
96
84
97
diff view generated by jsdifflib
New patch
1
1
From: Richard Henderson <richard.henderson@linaro.org>
2
3
We will eventually remove the early ARM_FEATURE_VFP test,
4
so add a proper test for each trans_* that does not already
5
have another ISA test.
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200224222232.13807-9-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/translate-vfp.inc.c | 78 ++++++++++++++++++++++++++++++----
13
1 file changed, 69 insertions(+), 9 deletions(-)
14
15
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-vfp.inc.c
18
+++ b/target/arm/translate-vfp.inc.c
19
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_to_gp(DisasContext *s, arg_VMOV_to_gp *a)
20
int pass;
21
uint32_t offset;
22
23
+ /* SIZE == 2 is a VFP instruction; otherwise NEON. */
24
+ if (a->size == 2
25
+ ? !dc_isar_feature(aa32_fpsp_v2, s)
26
+ : !arm_dc_feature(s, ARM_FEATURE_NEON)) {
27
+ return false;
28
+ }
29
+
30
/* UNDEF accesses to D16-D31 if they don't exist */
31
if (!dc_isar_feature(aa32_simd_r32, s) && (a->vn & 0x10)) {
32
return false;
33
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_to_gp(DisasContext *s, arg_VMOV_to_gp *a)
34
pass = extract32(offset, 2, 1);
35
offset = extract32(offset, 0, 2) * 8;
36
37
- if (a->size != 2 && !arm_dc_feature(s, ARM_FEATURE_NEON)) {
38
- return false;
39
- }
40
-
41
if (!vfp_access_check(s)) {
42
return true;
43
}
44
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_from_gp(DisasContext *s, arg_VMOV_from_gp *a)
45
int pass;
46
uint32_t offset;
47
48
+ /* SIZE == 2 is a VFP instruction; otherwise NEON. */
49
+ if (a->size == 2
50
+ ? !dc_isar_feature(aa32_fpsp_v2, s)
51
+ : !arm_dc_feature(s, ARM_FEATURE_NEON)) {
52
+ return false;
53
+ }
54
+
55
/* UNDEF accesses to D16-D31 if they don't exist */
56
if (!dc_isar_feature(aa32_simd_r32, s) && (a->vn & 0x10)) {
57
return false;
58
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_from_gp(DisasContext *s, arg_VMOV_from_gp *a)
59
pass = extract32(offset, 2, 1);
60
offset = extract32(offset, 0, 2) * 8;
61
62
- if (a->size != 2 && !arm_dc_feature(s, ARM_FEATURE_NEON)) {
63
- return false;
64
- }
65
-
66
if (!vfp_access_check(s)) {
67
return true;
68
}
69
@@ -XXX,XX +XXX,XX @@ static bool trans_VMSR_VMRS(DisasContext *s, arg_VMSR_VMRS *a)
70
TCGv_i32 tmp;
71
bool ignore_vfp_enabled = false;
72
73
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
74
+ return false;
75
+ }
76
+
77
if (arm_dc_feature(s, ARM_FEATURE_M)) {
78
/*
79
* The only M-profile VFP vmrs/vmsr sysreg is FPSCR.
80
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_single(DisasContext *s, arg_VMOV_single *a)
81
{
82
TCGv_i32 tmp;
83
84
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
85
+ return false;
86
+ }
87
+
88
if (!vfp_access_check(s)) {
89
return true;
90
}
91
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_64_sp(DisasContext *s, arg_VMOV_64_sp *a)
92
{
93
TCGv_i32 tmp;
94
95
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
96
+ return false;
97
+ }
98
+
99
/*
100
* VMOV between two general-purpose registers and two single precision
101
* floating point registers
102
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_64_dp(DisasContext *s, arg_VMOV_64_dp *a)
103
104
/*
105
* VMOV between two general-purpose registers and one double precision
106
- * floating point register
107
+ * floating point register. Note that this does not require support
108
+ * for double precision arithmetic.
109
*/
110
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
111
+ return false;
112
+ }
113
114
/* UNDEF accesses to D16-D31 if they don't exist */
115
if (!dc_isar_feature(aa32_simd_r32, s) && (a->vm & 0x10)) {
116
@@ -XXX,XX +XXX,XX @@ static bool trans_VLDR_VSTR_sp(DisasContext *s, arg_VLDR_VSTR_sp *a)
117
uint32_t offset;
118
TCGv_i32 addr, tmp;
119
120
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
121
+ return false;
122
+ }
123
+
124
if (!vfp_access_check(s)) {
125
return true;
126
}
127
@@ -XXX,XX +XXX,XX @@ static bool trans_VLDR_VSTR_dp(DisasContext *s, arg_VLDR_VSTR_dp *a)
128
TCGv_i32 addr;
129
TCGv_i64 tmp;
130
131
+ /* Note that this does not require support for double arithmetic. */
132
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
133
+ return false;
134
+ }
135
+
136
/* UNDEF accesses to D16-D31 if they don't exist */
137
if (!dc_isar_feature(aa32_simd_r32, s) && (a->vd & 0x10)) {
138
return false;
139
@@ -XXX,XX +XXX,XX @@ static bool trans_VLDM_VSTM_sp(DisasContext *s, arg_VLDM_VSTM_sp *a)
140
TCGv_i32 addr, tmp;
141
int i, n;
142
143
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
144
+ return false;
145
+ }
146
+
147
n = a->imm;
148
149
if (n == 0 || (a->vd + n) > 32) {
150
@@ -XXX,XX +XXX,XX @@ static bool trans_VLDM_VSTM_dp(DisasContext *s, arg_VLDM_VSTM_dp *a)
151
TCGv_i64 tmp;
152
int i, n;
153
154
+ /* Note that this does not require support for double arithmetic. */
155
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
156
+ return false;
157
+ }
158
+
159
n = a->imm >> 1;
160
161
if (n == 0 || (a->vd + n) > 32 || n > 16) {
162
@@ -XXX,XX +XXX,XX @@ static bool do_vfp_3op_sp(DisasContext *s, VFPGen3OpSPFn *fn,
163
TCGv_i32 f0, f1, fd;
164
TCGv_ptr fpst;
165
166
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
167
+ return false;
168
+ }
169
+
170
if (!dc_isar_feature(aa32_fpshvec, s) &&
171
(veclen != 0 || s->vec_stride != 0)) {
172
return false;
173
@@ -XXX,XX +XXX,XX @@ static bool do_vfp_2op_sp(DisasContext *s, VFPGen2OpSPFn *fn, int vd, int vm)
174
int veclen = s->vec_len;
175
TCGv_i32 f0, fd;
176
177
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
178
+ return false;
179
+ }
180
+
181
if (!dc_isar_feature(aa32_fpshvec, s) &&
182
(veclen != 0 || s->vec_stride != 0)) {
183
return false;
184
@@ -XXX,XX +XXX,XX @@ static bool trans_VCMP_sp(DisasContext *s, arg_VCMP_sp *a)
185
{
186
TCGv_i32 vd, vm;
187
188
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
189
+ return false;
190
+ }
191
+
192
/* Vm/M bits must be zero for the Z variant */
193
if (a->z && a->vm != 0) {
194
return false;
195
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_int_sp(DisasContext *s, arg_VCVT_int_sp *a)
196
TCGv_i32 vm;
197
TCGv_ptr fpst;
198
199
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
200
+ return false;
201
+ }
202
+
203
if (!vfp_access_check(s)) {
204
return true;
205
}
206
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_sp_int(DisasContext *s, arg_VCVT_sp_int *a)
207
TCGv_i32 vm;
208
TCGv_ptr fpst;
209
210
+ if (!dc_isar_feature(aa32_fpsp_v2, s)) {
211
+ return false;
212
+ }
213
+
214
if (!vfp_access_check(s)) {
215
return true;
216
}
217
--
218
2.20.1
219
220
diff view generated by jsdifflib
1
The FRECPX instructions should (like most other floating point operations)
1
From: Richard Henderson <richard.henderson@linaro.org>
2
honour the FPCR.FZ bit which specifies whether input denormals should
3
be flushed to zero (or FZ16 for the half-precision version).
4
We forgot to implement this, which doesn't affect the results (since
5
the calculation doesn't actually care about the mantissa bits) but did
6
mean we were failing to set the FPSR.IDC bit.
7
2
3
All remaining tests for VFP4 are for fused multiply-add insns.
4
5
Since the MVFR1 field is used for both VFP and NEON, move its adjustment
6
from the !has_neon block to the (!has_vfp && !has_neon) block.
7
8
Test for vfp of the appropraite width alongside the test for simdfmac
9
within translate-vfp.inc.c. Within disas_neon_data_insn, we have
10
already tested for ARM_FEATURE_NEON.
11
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Message-id: 20200224222232.13807-10-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20180521172712.19930-1-peter.maydell@linaro.org
11
---
16
---
12
target/arm/helper-a64.c | 6 ++++++
17
target/arm/cpu.h | 12 ++++++++++++
13
1 file changed, 6 insertions(+)
18
target/arm/cpu.c | 6 +++++-
19
target/arm/translate-vfp.inc.c | 22 ++++++++++++++++++----
20
target/arm/translate.c | 2 +-
21
4 files changed, 36 insertions(+), 6 deletions(-)
14
22
15
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
23
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper-a64.c
25
--- a/target/arm/cpu.h
18
+++ b/target/arm/helper-a64.c
26
+++ b/target/arm/cpu.h
19
@@ -XXX,XX +XXX,XX @@ float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
27
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_fp16_dpconv(const ARMISARegisters *id)
20
return nan;
28
return FIELD_EX32(id->mvfr1, MVFR1, FPHP) > 1;
29
}
30
31
+/*
32
+ * Note that this ID register field covers both VFP and Neon FMAC,
33
+ * so should usually be tested in combination with some other
34
+ * check that confirms the presence of whichever of VFP or Neon is
35
+ * relevant, to avoid accidentally enabling a Neon feature on
36
+ * a VFP-no-Neon core or vice-versa.
37
+ */
38
+static inline bool isar_feature_aa32_simdfmac(const ARMISARegisters *id)
39
+{
40
+ return FIELD_EX32(id->mvfr1, MVFR1, SIMDFMAC) != 0;
41
+}
42
+
43
static inline bool isar_feature_aa32_vsel(const ARMISARegisters *id)
44
{
45
return FIELD_EX32(id->mvfr2, MVFR2, FPMISC) >= 1;
46
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/cpu.c
49
+++ b/target/arm/cpu.c
50
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
51
u = FIELD_DP32(u, MVFR1, SIMDINT, 0);
52
u = FIELD_DP32(u, MVFR1, SIMDSP, 0);
53
u = FIELD_DP32(u, MVFR1, SIMDHP, 0);
54
- u = FIELD_DP32(u, MVFR1, SIMDFMAC, 0);
55
cpu->isar.mvfr1 = u;
56
57
u = cpu->isar.mvfr2;
58
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
59
u = cpu->isar.mvfr0;
60
u = FIELD_DP32(u, MVFR0, SIMDREG, 0);
61
cpu->isar.mvfr0 = u;
62
+
63
+ /* Despite the name, this field covers both VFP and Neon */
64
+ u = cpu->isar.mvfr1;
65
+ u = FIELD_DP32(u, MVFR1, SIMDFMAC, 0);
66
+ cpu->isar.mvfr1 = u;
21
}
67
}
22
68
23
+ a = float16_squash_input_denormal(a, fpst);
69
if (arm_feature(env, ARM_FEATURE_M) && !cpu->has_dsp) {
24
+
70
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
25
val16 = float16_val(a);
71
index XXXXXXX..XXXXXXX 100644
26
sbit = 0x8000 & val16;
72
--- a/target/arm/translate-vfp.inc.c
27
exp = extract32(val16, 10, 5);
73
+++ b/target/arm/translate-vfp.inc.c
28
@@ -XXX,XX +XXX,XX @@ float32 HELPER(frecpx_f32)(float32 a, void *fpstp)
74
@@ -XXX,XX +XXX,XX @@ static bool trans_VFM_sp(DisasContext *s, arg_VFM_sp *a)
29
return nan;
75
76
/*
77
* Present in VFPv4 only.
78
+ * Note that we can't rely on the SIMDFMAC check alone, because
79
+ * in a Neon-no-VFP core that ID register field will be non-zero.
80
+ */
81
+ if (!dc_isar_feature(aa32_simdfmac, s) ||
82
+ !dc_isar_feature(aa32_fpsp_v2, s)) {
83
+ return false;
84
+ }
85
+ /*
86
* In v7A, UNPREDICTABLE with non-zero vector length/stride; from
87
* v8A, must UNDEF. We choose to UNDEF for both v7A and v8A.
88
*/
89
- if (!arm_dc_feature(s, ARM_FEATURE_VFP4) ||
90
- (s->vec_len != 0 || s->vec_stride != 0)) {
91
+ if (s->vec_len != 0 || s->vec_stride != 0) {
92
return false;
30
}
93
}
31
94
32
+ a = float32_squash_input_denormal(a, fpst);
95
@@ -XXX,XX +XXX,XX @@ static bool trans_VFM_dp(DisasContext *s, arg_VFM_dp *a)
33
+
96
34
val32 = float32_val(a);
97
/*
35
sbit = 0x80000000ULL & val32;
98
* Present in VFPv4 only.
36
exp = extract32(val32, 23, 8);
99
+ * Note that we can't rely on the SIMDFMAC check alone, because
37
@@ -XXX,XX +XXX,XX @@ float64 HELPER(frecpx_f64)(float64 a, void *fpstp)
100
+ * in a Neon-no-VFP core that ID register field will be non-zero.
38
return nan;
101
+ */
102
+ if (!dc_isar_feature(aa32_simdfmac, s) ||
103
+ !dc_isar_feature(aa32_fpdp_v2, s)) {
104
+ return false;
105
+ }
106
+ /*
107
* In v7A, UNPREDICTABLE with non-zero vector length/stride; from
108
* v8A, must UNDEF. We choose to UNDEF for both v7A and v8A.
109
*/
110
- if (!arm_dc_feature(s, ARM_FEATURE_VFP4) ||
111
- (s->vec_len != 0 || s->vec_stride != 0)) {
112
+ if (s->vec_len != 0 || s->vec_stride != 0) {
113
return false;
39
}
114
}
40
115
41
+ a = float64_squash_input_denormal(a, fpst);
116
diff --git a/target/arm/translate.c b/target/arm/translate.c
42
+
117
index XXXXXXX..XXXXXXX 100644
43
val64 = float64_val(a);
118
--- a/target/arm/translate.c
44
sbit = 0x8000000000000000ULL & val64;
119
+++ b/target/arm/translate.c
45
exp = extract64(float64_val(a), 52, 11);
120
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
121
}
122
break;
123
case NEON_3R_VFM_VQRDMLSH:
124
- if (!arm_dc_feature(s, ARM_FEATURE_VFP4)) {
125
+ if (!dc_isar_feature(aa32_simdfmac, s)) {
126
return 1;
127
}
128
break;
46
--
129
--
47
2.17.1
130
2.20.1
48
131
49
132
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
We now have proper ISA checks within each trans_* function.
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20200224222232.13807-11-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate.c | 4 ----
11
1 file changed, 4 deletions(-)
12
13
diff --git a/target/arm/translate.c b/target/arm/translate.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate.c
16
+++ b/target/arm/translate.c
17
@@ -XXX,XX +XXX,XX @@ static void gen_neon_dup_high16(TCGv_i32 var)
18
*/
19
static int disas_vfp_insn(DisasContext *s, uint32_t insn)
20
{
21
- if (!arm_dc_feature(s, ARM_FEATURE_VFP)) {
22
- return 1;
23
- }
24
-
25
/*
26
* If the decodetree decoder handles this insn it will always
27
* emit code to either execute the insn or generate an appropriate
28
--
29
2.20.1
30
31
diff view generated by jsdifflib
1
From: Igor Mammedov <imammedo@redhat.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
When QEMU is started with following CLI
3
Now that we no longer have an early check for ARM_FEATURE_VFP,
4
-machine virt,gic-version=3,accel=kvm -cpu host -bios AAVMF_CODE.fd
4
we can use the proper ISA check in trans_VLLDM_VLSTM.
5
it crashes with abort at
6
accel/kvm/kvm-all.c:2164:
7
KVM_SET_DEVICE_ATTR failed: Group 6 attr 0x000000000000c665: Invalid argument
8
5
9
Which is caused by implicit dependency of kvm_arm_gicv3_reset() on
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
arm_gicv3_icc_reset() where the later is called by CPU reset
11
reset callback.
12
13
However commit:
14
3b77f6c arm/boot: split load_dtb() from arm_load_kernel()
15
broke CPU reset callback registration in case
16
17
arm_load_kernel()
18
...
19
if (!info->kernel_filename || info->firmware_loaded)
20
21
branch is taken, i.e. it's sufficient to provide a firmware
22
or do not provide kernel on CLI to skip cpu reset callback
23
registration, where before offending commit the callback
24
has been registered unconditionally.
25
26
Fix it by registering the callback right at the beginning of
27
arm_load_kernel() unconditionally instead of doing it at the end.
28
29
NOTE:
30
we probably should eliminate that dependency anyways as well as
31
separate arch CPU reset parts from arm_load_kernel() into CPU
32
itself, but that refactoring that I probably would have to do
33
anyways later for CPU hotplug to work.
34
35
Reported-by: Auger Eric <eric.auger@redhat.com>
36
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
37
Reviewed-by: Eric Auger <eric.auger@redhat.com>
38
Tested-by: Eric Auger <eric.auger@redhat.com>
39
Message-id: 1527070950-208350-1-git-send-email-imammedo@redhat.com
40
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20200224222232.13807-12-richard.henderson@linaro.org
41
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
42
---
10
---
43
hw/arm/boot.c | 18 +++++++++---------
11
target/arm/translate-vfp.inc.c | 39 +++++++++++++++++++++++++
44
1 file changed, 9 insertions(+), 9 deletions(-)
12
target/arm/translate.c | 53 ++++++----------------------------
13
target/arm/vfp.decode | 2 ++
14
3 files changed, 50 insertions(+), 44 deletions(-)
45
15
46
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
16
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
47
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/boot.c
18
--- a/target/arm/translate-vfp.inc.c
49
+++ b/hw/arm/boot.c
19
+++ b/target/arm/translate-vfp.inc.c
50
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
20
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_dp_int(DisasContext *s, arg_VCVT_dp_int *a)
51
static const ARMInsnFixup *primary_loader;
21
tcg_temp_free_ptr(fpst);
52
AddressSpace *as = arm_boot_address_space(cpu, info);
22
return true;
53
23
}
54
+ /* CPU objects (unlike devices) are not automatically reset on system
24
+
55
+ * reset, so we must always register a handler to do so. If we're
25
+/*
56
+ * actually loading a kernel, the handler is also responsible for
26
+ * Decode VLLDM and VLSTM are nonstandard because:
57
+ * arranging that we start it correctly.
27
+ * * if there is no FPU then these insns must NOP in
58
+ */
28
+ * Secure state and UNDEF in Nonsecure state
59
+ for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
29
+ * * if there is an FPU then these insns do not have
60
+ qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
30
+ * the usual behaviour that vfp_access_check() provides of
31
+ * being controlled by CPACR/NSACR enable bits or the
32
+ * lazy-stacking logic.
33
+ */
34
+static bool trans_VLLDM_VLSTM(DisasContext *s, arg_VLLDM_VLSTM *a)
35
+{
36
+ TCGv_i32 fptr;
37
+
38
+ if (!arm_dc_feature(s, ARM_FEATURE_M) ||
39
+ !arm_dc_feature(s, ARM_FEATURE_V8)) {
40
+ return false;
41
+ }
42
+ /* If not secure, UNDEF. */
43
+ if (!s->v8m_secure) {
44
+ return false;
45
+ }
46
+ /* If no fpu, NOP. */
47
+ if (!dc_isar_feature(aa32_vfp, s)) {
48
+ return true;
61
+ }
49
+ }
62
+
50
+
63
/* The board code is not supposed to set secure_board_setup unless
51
+ fptr = load_reg(s, a->rn);
64
* running its code in secure mode is actually possible, and KVM
52
+ if (a->l) {
65
* doesn't support secure.
53
+ gen_helper_v7m_vlldm(cpu_env, fptr);
66
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
54
+ } else {
67
ARM_CPU(cs)->env.boot_info = info;
55
+ gen_helper_v7m_vlstm(cpu_env, fptr);
68
}
56
+ }
69
57
+ tcg_temp_free_i32(fptr);
70
- /* CPU objects (unlike devices) are not automatically reset on system
58
+
71
- * reset, so we must always register a handler to do so. If we're
59
+ /* End the TB, because we have updated FP control bits */
72
- * actually loading a kernel, the handler is also responsible for
60
+ s->base.is_jmp = DISAS_UPDATE;
73
- * arranging that we start it correctly.
61
+ return true;
74
- */
62
+}
75
- for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
63
diff --git a/target/arm/translate.c b/target/arm/translate.c
76
- qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
64
index XXXXXXX..XXXXXXX 100644
77
- }
65
--- a/target/arm/translate.c
66
+++ b/target/arm/translate.c
67
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
68
goto illegal_op; /* op0 = 0b11 : unallocated */
69
}
70
71
- /*
72
- * Decode VLLDM and VLSTM first: these are nonstandard because:
73
- * * if there is no FPU then these insns must NOP in
74
- * Secure state and UNDEF in Nonsecure state
75
- * * if there is an FPU then these insns do not have
76
- * the usual behaviour that disas_vfp_insn() provides of
77
- * being controlled by CPACR/NSACR enable bits or the
78
- * lazy-stacking logic.
79
- */
80
- if (arm_dc_feature(s, ARM_FEATURE_V8) &&
81
- (insn & 0xffa00f00) == 0xec200a00) {
82
- /* 0b1110_1100_0x1x_xxxx_xxxx_1010_xxxx_xxxx
83
- * - VLLDM, VLSTM
84
- * We choose to UNDEF if the RAZ bits are non-zero.
85
- */
86
- if (!s->v8m_secure || (insn & 0x0040f0ff)) {
87
+ if (disas_vfp_insn(s, insn)) {
88
+ if (((insn >> 8) & 0xe) == 10 &&
89
+ dc_isar_feature(aa32_fpsp_v2, s)) {
90
+ /* FP, and the CPU supports it */
91
goto illegal_op;
92
+ } else {
93
+ /* All other insns: NOCP */
94
+ gen_exception_insn(s, s->pc_curr, EXCP_NOCP,
95
+ syn_uncategorized(),
96
+ default_exception_el(s));
97
}
78
-
98
-
79
if (!info->skip_dtb_autoload && have_dtb(info)) {
99
- if (arm_dc_feature(s, ARM_FEATURE_VFP)) {
80
if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as) < 0) {
100
- uint32_t rn = (insn >> 16) & 0xf;
81
exit(1);
101
- TCGv_i32 fptr = load_reg(s, rn);
102
-
103
- if (extract32(insn, 20, 1)) {
104
- gen_helper_v7m_vlldm(cpu_env, fptr);
105
- } else {
106
- gen_helper_v7m_vlstm(cpu_env, fptr);
107
- }
108
- tcg_temp_free_i32(fptr);
109
-
110
- /* End the TB, because we have updated FP control bits */
111
- s->base.is_jmp = DISAS_UPDATE;
112
- }
113
- break;
114
}
115
- if (arm_dc_feature(s, ARM_FEATURE_VFP) &&
116
- ((insn >> 8) & 0xe) == 10) {
117
- /* FP, and the CPU supports it */
118
- if (disas_vfp_insn(s, insn)) {
119
- goto illegal_op;
120
- }
121
- break;
122
- }
123
-
124
- /* All other insns: NOCP */
125
- gen_exception_insn(s, s->pc_curr, EXCP_NOCP, syn_uncategorized(),
126
- default_exception_el(s));
127
break;
128
}
129
if ((insn & 0xfe000a00) == 0xfc000800
130
diff --git a/target/arm/vfp.decode b/target/arm/vfp.decode
131
index XXXXXXX..XXXXXXX 100644
132
--- a/target/arm/vfp.decode
133
+++ b/target/arm/vfp.decode
134
@@ -XXX,XX +XXX,XX @@ VCVT_sp_int ---- 1110 1.11 110 s:1 .... 1010 rz:1 1.0 .... \
135
vd=%vd_sp vm=%vm_sp
136
VCVT_dp_int ---- 1110 1.11 110 s:1 .... 1011 rz:1 1.0 .... \
137
vd=%vd_sp vm=%vm_dp
138
+
139
+VLLDM_VLSTM 1110 1100 001 l:1 rn:4 0000 1010 0000 0000
82
--
140
--
83
2.17.1
141
2.20.1
84
142
85
143
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to address_space_access_valid().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
Have the calls adjacent as an intermediate step toward
4
actually merging the decodes.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20200224222232.13807-13-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-6-peter.maydell@linaro.org
10
---
10
---
11
include/exec/memory.h | 4 +++-
11
target/arm/translate.c | 83 +++++++++++++++---------------------------
12
include/sysemu/dma.h | 3 ++-
12
1 file changed, 29 insertions(+), 54 deletions(-)
13
exec.c | 3 ++-
14
target/s390x/diag.c | 6 ++++--
15
target/s390x/excp_helper.c | 3 ++-
16
target/s390x/mmu_helper.c | 3 ++-
17
target/s390x/sigp.c | 3 ++-
18
7 files changed, 17 insertions(+), 8 deletions(-)
19
13
20
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/include/exec/memory.h
16
--- a/target/arm/translate.c
23
+++ b/include/exec/memory.h
17
+++ b/target/arm/translate.c
24
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
18
@@ -XXX,XX +XXX,XX @@ static void gen_neon_dup_high16(TCGv_i32 var)
25
* @addr: address within that address space
19
tcg_temp_free_i32(tmp);
26
* @len: length of the area to be checked
20
}
27
* @is_write: indicates the transfer direction
21
28
+ * @attrs: memory attributes
22
-/*
29
*/
23
- * Disassemble a VFP instruction. Returns nonzero if an error occurred
30
-bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write);
24
- * (ie. an undefined instruction).
31
+bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len,
25
- */
32
+ bool is_write, MemTxAttrs attrs);
26
-static int disas_vfp_insn(DisasContext *s, uint32_t insn)
33
27
-{
34
/* address_space_map: map a physical memory region into a host virtual address
28
- /*
35
*
29
- * If the decodetree decoder handles this insn it will always
36
diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h
30
- * emit code to either execute the insn or generate an appropriate
37
index XXXXXXX..XXXXXXX 100644
31
- * exception; so we don't need to ever return non-zero to tell
38
--- a/include/sysemu/dma.h
32
- * the calling code to emit an UNDEF exception.
39
+++ b/include/sysemu/dma.h
33
- */
40
@@ -XXX,XX +XXX,XX @@ static inline bool dma_memory_valid(AddressSpace *as,
34
- if (extract32(insn, 28, 4) == 0xf) {
41
DMADirection dir)
35
- if (disas_vfp_uncond(s, insn)) {
36
- return 0;
37
- }
38
- } else {
39
- if (disas_vfp(s, insn)) {
40
- return 0;
41
- }
42
- }
43
- /* If the decodetree decoder didn't handle this insn, it must be UNDEF */
44
- return 1;
45
-}
46
-
47
static inline bool use_goto_tb(DisasContext *s, target_ulong dest)
42
{
48
{
43
return address_space_access_valid(as, addr, len,
49
#ifndef CONFIG_USER_ONLY
44
- dir == DMA_DIRECTION_FROM_DEVICE);
50
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
45
+ dir == DMA_DIRECTION_FROM_DEVICE,
51
ARCH(5);
46
+ MEMTXATTRS_UNSPECIFIED);
52
47
}
53
/* Unconditional instructions. */
48
54
- if (disas_a32_uncond(s, insn)) {
49
static inline int dma_memory_rw_relaxed(AddressSpace *as, dma_addr_t addr,
55
+ /* TODO: Perhaps merge these into one decodetree output file. */
50
diff --git a/exec.c b/exec.c
56
+ if (disas_a32_uncond(s, insn) ||
51
index XXXXXXX..XXXXXXX 100644
57
+ disas_vfp_uncond(s, insn)) {
52
--- a/exec.c
53
+++ b/exec.c
54
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
55
}
56
57
bool address_space_access_valid(AddressSpace *as, hwaddr addr,
58
- int len, bool is_write)
59
+ int len, bool is_write,
60
+ MemTxAttrs attrs)
61
{
62
FlatView *fv;
63
bool result;
64
diff --git a/target/s390x/diag.c b/target/s390x/diag.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/target/s390x/diag.c
67
+++ b/target/s390x/diag.c
68
@@ -XXX,XX +XXX,XX @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
69
return;
58
return;
70
}
59
}
71
if (!address_space_access_valid(&address_space_memory, addr,
60
/* fall back to legacy decoder */
72
- sizeof(IplParameterBlock), false)) {
61
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
73
+ sizeof(IplParameterBlock), false,
62
}
74
+ MEMTXATTRS_UNSPECIFIED)) {
75
s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra);
76
return;
63
return;
77
}
64
}
78
@@ -XXX,XX +XXX,XX @@ out:
65
- if ((insn & 0x0f000e10) == 0x0e000a00) {
79
return;
66
- /* VFP. */
80
}
67
- if (disas_vfp_insn(s, insn)) {
81
if (!address_space_access_valid(&address_space_memory, addr,
68
- goto illegal_op;
82
- sizeof(IplParameterBlock), true)) {
69
- }
83
+ sizeof(IplParameterBlock), true,
70
- return;
84
+ MEMTXATTRS_UNSPECIFIED)) {
71
- }
85
s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra);
72
if ((insn & 0x0e000f00) == 0x0c000100) {
86
return;
73
if (arm_dc_feature(s, ARM_FEATURE_IWMMXT)) {
87
}
74
/* iWMMXt register transfer. */
88
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
75
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
89
index XXXXXXX..XXXXXXX 100644
76
arm_skip_unless(s, cond);
90
--- a/target/s390x/excp_helper.c
77
}
91
+++ b/target/s390x/excp_helper.c
78
92
@@ -XXX,XX +XXX,XX @@ int s390_cpu_handle_mmu_fault(CPUState *cs, vaddr orig_vaddr, int size,
79
- if (disas_a32(s, insn)) {
93
80
+ /* TODO: Perhaps merge these into one decodetree output file. */
94
/* check out of RAM access */
81
+ if (disas_a32(s, insn) ||
95
if (!address_space_access_valid(&address_space_memory, raddr,
82
+ disas_vfp(s, insn)) {
96
- TARGET_PAGE_SIZE, rw)) {
97
+ TARGET_PAGE_SIZE, rw,
98
+ MEMTXATTRS_UNSPECIFIED)) {
99
DPRINTF("%s: raddr %" PRIx64 " > ram_size %" PRIx64 "\n", __func__,
100
(uint64_t)raddr, (uint64_t)ram_size);
101
trigger_pgm_exception(env, PGM_ADDRESSING, ILEN_AUTO);
102
diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
103
index XXXXXXX..XXXXXXX 100644
104
--- a/target/s390x/mmu_helper.c
105
+++ b/target/s390x/mmu_helper.c
106
@@ -XXX,XX +XXX,XX @@ static int translate_pages(S390CPU *cpu, vaddr addr, int nr_pages,
107
return ret;
108
}
109
if (!address_space_access_valid(&address_space_memory, pages[i],
110
- TARGET_PAGE_SIZE, is_write)) {
111
+ TARGET_PAGE_SIZE, is_write,
112
+ MEMTXATTRS_UNSPECIFIED)) {
113
trigger_access_exception(env, PGM_ADDRESSING, ILEN_AUTO, 0);
114
return -EFAULT;
115
}
116
diff --git a/target/s390x/sigp.c b/target/s390x/sigp.c
117
index XXXXXXX..XXXXXXX 100644
118
--- a/target/s390x/sigp.c
119
+++ b/target/s390x/sigp.c
120
@@ -XXX,XX +XXX,XX @@ static void sigp_set_prefix(CPUState *cs, run_on_cpu_data arg)
121
cpu_synchronize_state(cs);
122
123
if (!address_space_access_valid(&address_space_memory, addr,
124
- sizeof(struct LowCore), false)) {
125
+ sizeof(struct LowCore), false,
126
+ MEMTXATTRS_UNSPECIFIED)) {
127
set_sigp_status(si, SIGP_STAT_INVALID_PARAMETER);
128
return;
83
return;
129
}
84
}
85
/* fall back to legacy decoder */
86
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
87
case 0xd:
88
case 0xe:
89
if (((insn >> 8) & 0xe) == 10) {
90
- /* VFP. */
91
- if (disas_vfp_insn(s, insn)) {
92
- goto illegal_op;
93
- }
94
- } else if (disas_coproc_insn(s, insn)) {
95
+ /* VFP, but failed disas_vfp. */
96
+ goto illegal_op;
97
+ }
98
+ if (disas_coproc_insn(s, insn)) {
99
/* Coprocessor. */
100
goto illegal_op;
101
}
102
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
103
ARCH(6T2);
104
}
105
106
- if (disas_t32(s, insn)) {
107
+ /*
108
+ * TODO: Perhaps merge these into one decodetree output file.
109
+ * Note disas_vfp is written for a32 with cond field in the
110
+ * top nibble. The t32 encoding requires 0xe in the top nibble.
111
+ */
112
+ if (disas_t32(s, insn) ||
113
+ disas_vfp_uncond(s, insn) ||
114
+ ((insn >> 28) == 0xe && disas_vfp(s, insn))) {
115
return;
116
}
117
/* fall back to legacy decoder */
118
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
119
goto illegal_op; /* op0 = 0b11 : unallocated */
120
}
121
122
- if (disas_vfp_insn(s, insn)) {
123
- if (((insn >> 8) & 0xe) == 10 &&
124
- dc_isar_feature(aa32_fpsp_v2, s)) {
125
- /* FP, and the CPU supports it */
126
- goto illegal_op;
127
- } else {
128
- /* All other insns: NOCP */
129
- gen_exception_insn(s, s->pc_curr, EXCP_NOCP,
130
- syn_uncategorized(),
131
- default_exception_el(s));
132
- }
133
+ if (((insn >> 8) & 0xe) == 10 &&
134
+ dc_isar_feature(aa32_fpsp_v2, s)) {
135
+ /* FP, and the CPU supports it */
136
+ goto illegal_op;
137
+ } else {
138
+ /* All other insns: NOCP */
139
+ gen_exception_insn(s, s->pc_curr, EXCP_NOCP,
140
+ syn_uncategorized(),
141
+ default_exception_el(s));
142
}
143
break;
144
}
145
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
146
goto illegal_op;
147
}
148
} else if (((insn >> 8) & 0xe) == 10) {
149
- if (disas_vfp_insn(s, insn)) {
150
- goto illegal_op;
151
- }
152
+ /* VFP, but failed disas_vfp. */
153
+ goto illegal_op;
154
} else {
155
if (insn & (1 << 28))
156
goto illegal_op;
130
--
157
--
131
2.17.1
158
2.20.1
132
159
133
160
diff view generated by jsdifflib
1
Provide a VMSTATE_BOOL_SUB_ARRAY to go with VMSTATE_UINT8_SUB_ARRAY
1
From: Richard Henderson <richard.henderson@linaro.org>
2
and friends.
3
2
3
Use isar feature tests instead of feature bit tests.
4
5
Although none of QEMUs current cpus have VFPv3 without D32,
6
replace the large comment explaining why with one line that
7
sets ARM_HWCAP_ARM_VFPv3D16 under the correct conditions.
8
Mirror the test sequence used in the linux kernel.
9
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Message-id: 20200224222232.13807-14-richard.henderson@linaro.org
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Message-id: 20180521140402.23318-23-peter.maydell@linaro.org
7
---
14
---
8
include/migration/vmstate.h | 3 +++
15
linux-user/elfload.c | 23 +++++++++++++----------
9
1 file changed, 3 insertions(+)
16
1 file changed, 13 insertions(+), 10 deletions(-)
10
17
11
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
18
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
12
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
13
--- a/include/migration/vmstate.h
20
--- a/linux-user/elfload.c
14
+++ b/include/migration/vmstate.h
21
+++ b/linux-user/elfload.c
15
@@ -XXX,XX +XXX,XX @@ extern const VMStateInfo vmstate_info_qtailq;
22
@@ -XXX,XX +XXX,XX @@ static uint32_t get_elf_hwcap(void)
16
#define VMSTATE_BOOL_ARRAY(_f, _s, _n) \
23
17
VMSTATE_BOOL_ARRAY_V(_f, _s, _n, 0)
24
/* EDSP is in v5TE and above, but all our v5 CPUs are v5TE */
18
25
GET_FEATURE(ARM_FEATURE_V5, ARM_HWCAP_ARM_EDSP);
19
+#define VMSTATE_BOOL_SUB_ARRAY(_f, _s, _start, _num) \
26
- GET_FEATURE(ARM_FEATURE_VFP, ARM_HWCAP_ARM_VFP);
20
+ VMSTATE_SUB_ARRAY(_f, _s, _start, _num, 0, vmstate_info_bool, bool)
27
GET_FEATURE(ARM_FEATURE_IWMMXT, ARM_HWCAP_ARM_IWMMXT);
28
GET_FEATURE(ARM_FEATURE_THUMB2EE, ARM_HWCAP_ARM_THUMBEE);
29
GET_FEATURE(ARM_FEATURE_NEON, ARM_HWCAP_ARM_NEON);
30
- GET_FEATURE(ARM_FEATURE_VFP3, ARM_HWCAP_ARM_VFPv3);
31
GET_FEATURE(ARM_FEATURE_V6K, ARM_HWCAP_ARM_TLS);
32
- GET_FEATURE(ARM_FEATURE_VFP4, ARM_HWCAP_ARM_VFPv4);
33
+ GET_FEATURE(ARM_FEATURE_LPAE, ARM_HWCAP_ARM_LPAE);
34
GET_FEATURE_ID(aa32_arm_div, ARM_HWCAP_ARM_IDIVA);
35
GET_FEATURE_ID(aa32_thumb_div, ARM_HWCAP_ARM_IDIVT);
36
- /* All QEMU's VFPv3 CPUs have 32 registers, see VFP_DREG in translate.c.
37
- * Note that the ARM_HWCAP_ARM_VFPv3D16 bit is always the inverse of
38
- * ARM_HWCAP_ARM_VFPD32 (and so always clear for QEMU); it is unrelated
39
- * to our VFP_FP16 feature bit.
40
- */
41
- GET_FEATURE(ARM_FEATURE_VFP3, ARM_HWCAP_ARM_VFPD32);
42
- GET_FEATURE(ARM_FEATURE_LPAE, ARM_HWCAP_ARM_LPAE);
43
+ GET_FEATURE_ID(aa32_vfp, ARM_HWCAP_ARM_VFP);
21
+
44
+
22
#define VMSTATE_UINT16_ARRAY_V(_f, _s, _n, _v) \
45
+ if (cpu_isar_feature(aa32_fpsp_v3, cpu) ||
23
VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint16, uint16_t)
46
+ cpu_isar_feature(aa32_fpdp_v3, cpu)) {
24
47
+ hwcaps |= ARM_HWCAP_ARM_VFPv3;
48
+ if (cpu_isar_feature(aa32_simd_r32, cpu)) {
49
+ hwcaps |= ARM_HWCAP_ARM_VFPD32;
50
+ } else {
51
+ hwcaps |= ARM_HWCAP_ARM_VFPv3D16;
52
+ }
53
+ }
54
+ GET_FEATURE_ID(aa32_simdfmac, ARM_HWCAP_ARM_VFPv4);
55
56
return hwcaps;
57
}
25
--
58
--
26
2.17.1
59
2.20.1
27
60
28
61
diff view generated by jsdifflib
New patch
1
1
From: Richard Henderson <richard.henderson@linaro.org>
2
3
We have converted all tests against these features
4
to ISAR tests.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200224222232.13807-15-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/cpu.h | 3 ---
12
target/arm/cpu.c | 25 -------------------------
13
target/arm/cpu64.c | 3 ---
14
target/arm/kvm32.c | 5 -----
15
target/arm/kvm64.c | 1 -
16
5 files changed, 37 deletions(-)
17
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.h
21
+++ b/target/arm/cpu.h
22
@@ -XXX,XX +XXX,XX @@ QEMU_BUILD_BUG_ON(ARRAY_SIZE(((ARMCPU *)0)->ccsidr) <= R_V7M_CSSELR_INDEX_MASK);
23
* mapping in linux-user/elfload.c:get_elf_hwcap().
24
*/
25
enum arm_features {
26
- ARM_FEATURE_VFP,
27
ARM_FEATURE_AUXCR, /* ARM1026 Auxiliary control register. */
28
ARM_FEATURE_XSCALE, /* Intel XScale extensions. */
29
ARM_FEATURE_IWMMXT, /* Intel iwMMXt extension. */
30
@@ -XXX,XX +XXX,XX @@ enum arm_features {
31
ARM_FEATURE_V7,
32
ARM_FEATURE_THUMB2,
33
ARM_FEATURE_PMSA, /* no MMU; may have Memory Protection Unit */
34
- ARM_FEATURE_VFP3,
35
ARM_FEATURE_NEON,
36
ARM_FEATURE_M, /* Microcontroller profile. */
37
ARM_FEATURE_OMAPCP, /* OMAP specific CP15 ops handling. */
38
@@ -XXX,XX +XXX,XX @@ enum arm_features {
39
ARM_FEATURE_V5,
40
ARM_FEATURE_STRONGARM,
41
ARM_FEATURE_VAPA, /* cp15 VA to PA lookups */
42
- ARM_FEATURE_VFP4, /* VFPv4 (implies that NEON is v2) */
43
ARM_FEATURE_GENERIC_TIMER,
44
ARM_FEATURE_MVFR, /* Media and VFP Feature Registers 0 and 1 */
45
ARM_FEATURE_DUMMY_C15_REGS, /* RAZ/WI all of cp15 crn=15 */
46
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/cpu.c
49
+++ b/target/arm/cpu.c
50
@@ -XXX,XX +XXX,XX @@ void arm_cpu_post_init(Object *obj)
51
if (arm_feature(&cpu->env, ARM_FEATURE_M)) {
52
set_feature(&cpu->env, ARM_FEATURE_PMSA);
53
}
54
- /* Similarly for the VFP feature bits */
55
- if (arm_feature(&cpu->env, ARM_FEATURE_VFP4)) {
56
- set_feature(&cpu->env, ARM_FEATURE_VFP3);
57
- }
58
- if (arm_feature(&cpu->env, ARM_FEATURE_VFP3)) {
59
- set_feature(&cpu->env, ARM_FEATURE_VFP);
60
- }
61
62
if (arm_feature(&cpu->env, ARM_FEATURE_CBAR) ||
63
arm_feature(&cpu->env, ARM_FEATURE_CBAR_RO)) {
64
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
65
uint64_t t;
66
uint32_t u;
67
68
- unset_feature(env, ARM_FEATURE_VFP);
69
- unset_feature(env, ARM_FEATURE_VFP3);
70
- unset_feature(env, ARM_FEATURE_VFP4);
71
-
72
t = cpu->isar.id_aa64isar1;
73
t = FIELD_DP64(t, ID_AA64ISAR1, JSCVT, 0);
74
cpu->isar.id_aa64isar1 = t;
75
@@ -XXX,XX +XXX,XX @@ static void arm926_initfn(Object *obj)
76
77
cpu->dtb_compatible = "arm,arm926";
78
set_feature(&cpu->env, ARM_FEATURE_V5);
79
- set_feature(&cpu->env, ARM_FEATURE_VFP);
80
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
81
set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN);
82
cpu->midr = 0x41069265;
83
@@ -XXX,XX +XXX,XX @@ static void arm1026_initfn(Object *obj)
84
85
cpu->dtb_compatible = "arm,arm1026";
86
set_feature(&cpu->env, ARM_FEATURE_V5);
87
- set_feature(&cpu->env, ARM_FEATURE_VFP);
88
set_feature(&cpu->env, ARM_FEATURE_AUXCR);
89
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
90
set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN);
91
@@ -XXX,XX +XXX,XX @@ static void arm1136_r2_initfn(Object *obj)
92
93
cpu->dtb_compatible = "arm,arm1136";
94
set_feature(&cpu->env, ARM_FEATURE_V6);
95
- set_feature(&cpu->env, ARM_FEATURE_VFP);
96
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
97
set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
98
set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS);
99
@@ -XXX,XX +XXX,XX @@ static void arm1136_initfn(Object *obj)
100
cpu->dtb_compatible = "arm,arm1136";
101
set_feature(&cpu->env, ARM_FEATURE_V6K);
102
set_feature(&cpu->env, ARM_FEATURE_V6);
103
- set_feature(&cpu->env, ARM_FEATURE_VFP);
104
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
105
set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
106
set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS);
107
@@ -XXX,XX +XXX,XX @@ static void arm1176_initfn(Object *obj)
108
109
cpu->dtb_compatible = "arm,arm1176";
110
set_feature(&cpu->env, ARM_FEATURE_V6K);
111
- set_feature(&cpu->env, ARM_FEATURE_VFP);
112
set_feature(&cpu->env, ARM_FEATURE_VAPA);
113
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
114
set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
115
@@ -XXX,XX +XXX,XX @@ static void arm11mpcore_initfn(Object *obj)
116
117
cpu->dtb_compatible = "arm,arm11mpcore";
118
set_feature(&cpu->env, ARM_FEATURE_V6K);
119
- set_feature(&cpu->env, ARM_FEATURE_VFP);
120
set_feature(&cpu->env, ARM_FEATURE_VAPA);
121
set_feature(&cpu->env, ARM_FEATURE_MPIDR);
122
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
123
@@ -XXX,XX +XXX,XX @@ static void cortex_m4_initfn(Object *obj)
124
set_feature(&cpu->env, ARM_FEATURE_M);
125
set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
126
set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
127
- set_feature(&cpu->env, ARM_FEATURE_VFP4);
128
cpu->midr = 0x410fc240; /* r0p0 */
129
cpu->pmsav7_dregion = 8;
130
cpu->isar.mvfr0 = 0x10110021;
131
@@ -XXX,XX +XXX,XX @@ static void cortex_m7_initfn(Object *obj)
132
set_feature(&cpu->env, ARM_FEATURE_M);
133
set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
134
set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
135
- set_feature(&cpu->env, ARM_FEATURE_VFP4);
136
cpu->midr = 0x411fc272; /* r1p2 */
137
cpu->pmsav7_dregion = 8;
138
cpu->isar.mvfr0 = 0x10110221;
139
@@ -XXX,XX +XXX,XX @@ static void cortex_m33_initfn(Object *obj)
140
set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
141
set_feature(&cpu->env, ARM_FEATURE_M_SECURITY);
142
set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
143
- set_feature(&cpu->env, ARM_FEATURE_VFP4);
144
cpu->midr = 0x410fd213; /* r0p3 */
145
cpu->pmsav7_dregion = 16;
146
cpu->sau_sregion = 8;
147
@@ -XXX,XX +XXX,XX @@ static void cortex_r5f_initfn(Object *obj)
148
ARMCPU *cpu = ARM_CPU(obj);
149
150
cortex_r5_initfn(obj);
151
- set_feature(&cpu->env, ARM_FEATURE_VFP3);
152
cpu->isar.mvfr0 = 0x10110221;
153
cpu->isar.mvfr1 = 0x00000011;
154
}
155
@@ -XXX,XX +XXX,XX @@ static void cortex_a8_initfn(Object *obj)
156
157
cpu->dtb_compatible = "arm,cortex-a8";
158
set_feature(&cpu->env, ARM_FEATURE_V7);
159
- set_feature(&cpu->env, ARM_FEATURE_VFP3);
160
set_feature(&cpu->env, ARM_FEATURE_NEON);
161
set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
162
set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
163
@@ -XXX,XX +XXX,XX @@ static void cortex_a9_initfn(Object *obj)
164
165
cpu->dtb_compatible = "arm,cortex-a9";
166
set_feature(&cpu->env, ARM_FEATURE_V7);
167
- set_feature(&cpu->env, ARM_FEATURE_VFP3);
168
set_feature(&cpu->env, ARM_FEATURE_NEON);
169
set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
170
set_feature(&cpu->env, ARM_FEATURE_EL3);
171
@@ -XXX,XX +XXX,XX @@ static void cortex_a7_initfn(Object *obj)
172
173
cpu->dtb_compatible = "arm,cortex-a7";
174
set_feature(&cpu->env, ARM_FEATURE_V7VE);
175
- set_feature(&cpu->env, ARM_FEATURE_VFP4);
176
set_feature(&cpu->env, ARM_FEATURE_NEON);
177
set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
178
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
179
@@ -XXX,XX +XXX,XX @@ static void cortex_a15_initfn(Object *obj)
180
181
cpu->dtb_compatible = "arm,cortex-a15";
182
set_feature(&cpu->env, ARM_FEATURE_V7VE);
183
- set_feature(&cpu->env, ARM_FEATURE_VFP4);
184
set_feature(&cpu->env, ARM_FEATURE_NEON);
185
set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
186
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
187
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
188
index XXXXXXX..XXXXXXX 100644
189
--- a/target/arm/cpu64.c
190
+++ b/target/arm/cpu64.c
191
@@ -XXX,XX +XXX,XX @@ static void aarch64_a57_initfn(Object *obj)
192
193
cpu->dtb_compatible = "arm,cortex-a57";
194
set_feature(&cpu->env, ARM_FEATURE_V8);
195
- set_feature(&cpu->env, ARM_FEATURE_VFP4);
196
set_feature(&cpu->env, ARM_FEATURE_NEON);
197
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
198
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
199
@@ -XXX,XX +XXX,XX @@ static void aarch64_a53_initfn(Object *obj)
200
201
cpu->dtb_compatible = "arm,cortex-a53";
202
set_feature(&cpu->env, ARM_FEATURE_V8);
203
- set_feature(&cpu->env, ARM_FEATURE_VFP4);
204
set_feature(&cpu->env, ARM_FEATURE_NEON);
205
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
206
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
207
@@ -XXX,XX +XXX,XX @@ static void aarch64_a72_initfn(Object *obj)
208
209
cpu->dtb_compatible = "arm,cortex-a72";
210
set_feature(&cpu->env, ARM_FEATURE_V8);
211
- set_feature(&cpu->env, ARM_FEATURE_VFP4);
212
set_feature(&cpu->env, ARM_FEATURE_NEON);
213
set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
214
set_feature(&cpu->env, ARM_FEATURE_AARCH64);
215
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
216
index XXXXXXX..XXXXXXX 100644
217
--- a/target/arm/kvm32.c
218
+++ b/target/arm/kvm32.c
219
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
220
* bits, but a few must be tested.
221
*/
222
set_feature(&features, ARM_FEATURE_V7VE);
223
- set_feature(&features, ARM_FEATURE_VFP3);
224
set_feature(&features, ARM_FEATURE_GENERIC_TIMER);
225
226
if (extract32(id_pfr0, 12, 4) == 1) {
227
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
228
if (extract32(ahcf->isar.mvfr1, 12, 4) == 1) {
229
set_feature(&features, ARM_FEATURE_NEON);
230
}
231
- if (extract32(ahcf->isar.mvfr1, 28, 4) == 1) {
232
- /* FMAC support implies VFPv4 */
233
- set_feature(&features, ARM_FEATURE_VFP4);
234
- }
235
236
ahcf->features = features;
237
238
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
239
index XXXXXXX..XXXXXXX 100644
240
--- a/target/arm/kvm64.c
241
+++ b/target/arm/kvm64.c
242
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
243
* feature bits.
244
*/
245
set_feature(&features, ARM_FEATURE_V8);
246
- set_feature(&features, ARM_FEATURE_VFP4);
247
set_feature(&features, ARM_FEATURE_NEON);
248
set_feature(&features, ARM_FEATURE_AARCH64);
249
set_feature(&features, ARM_FEATURE_PMU);
250
--
251
2.20.1
252
253
diff view generated by jsdifflib
New patch
1
1
From: Richard Henderson <richard.henderson@linaro.org>
2
3
Those vfp instructions without extra opcode fields can
4
share a common @format for brevity.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200224222232.13807-16-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/vfp.decode | 134 ++++++++++++++++--------------------------
12
1 file changed, 52 insertions(+), 82 deletions(-)
13
14
diff --git a/target/arm/vfp.decode b/target/arm/vfp.decode
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/vfp.decode
17
+++ b/target/arm/vfp.decode
18
@@ -XXX,XX +XXX,XX @@
19
20
%vmov_imm 16:4 0:4
21
22
+@vfp_dnm_s ................................ vm=%vm_sp vn=%vn_sp vd=%vd_sp
23
+@vfp_dnm_d ................................ vm=%vm_dp vn=%vn_dp vd=%vd_dp
24
+
25
+@vfp_dm_ss ................................ vm=%vm_sp vd=%vd_sp
26
+@vfp_dm_dd ................................ vm=%vm_dp vd=%vd_dp
27
+@vfp_dm_ds ................................ vm=%vm_sp vd=%vd_dp
28
+@vfp_dm_sd ................................ vm=%vm_dp vd=%vd_sp
29
+
30
# VMOV scalar to general-purpose register; note that this does
31
# include some Neon cases.
32
VMOV_to_gp ---- 1110 u:1 1. 1 .... rt:4 1011 ... 1 0000 \
33
@@ -XXX,XX +XXX,XX @@ VDUP ---- 1110 1 b:1 q:1 0 .... rt:4 1011 . 0 e:1 1 0000 \
34
vn=%vn_dp
35
36
VMSR_VMRS ---- 1110 111 l:1 reg:4 rt:4 1010 0001 0000
37
-VMOV_single ---- 1110 000 l:1 .... rt:4 1010 . 001 0000 \
38
- vn=%vn_sp
39
+VMOV_single ---- 1110 000 l:1 .... rt:4 1010 . 001 0000 vn=%vn_sp
40
41
-VMOV_64_sp ---- 1100 010 op:1 rt2:4 rt:4 1010 00.1 .... \
42
- vm=%vm_sp
43
-VMOV_64_dp ---- 1100 010 op:1 rt2:4 rt:4 1011 00.1 .... \
44
- vm=%vm_dp
45
+VMOV_64_sp ---- 1100 010 op:1 rt2:4 rt:4 1010 00.1 .... vm=%vm_sp
46
+VMOV_64_dp ---- 1100 010 op:1 rt2:4 rt:4 1011 00.1 .... vm=%vm_dp
47
48
# Note that the half-precision variants of VLDR and VSTR are
49
# not part of this decodetree at all because they have bits [9:8] == 0b01
50
-VLDR_VSTR_sp ---- 1101 u:1 .0 l:1 rn:4 .... 1010 imm:8 \
51
- vd=%vd_sp
52
-VLDR_VSTR_dp ---- 1101 u:1 .0 l:1 rn:4 .... 1011 imm:8 \
53
- vd=%vd_dp
54
+VLDR_VSTR_sp ---- 1101 u:1 .0 l:1 rn:4 .... 1010 imm:8 vd=%vd_sp
55
+VLDR_VSTR_dp ---- 1101 u:1 .0 l:1 rn:4 .... 1011 imm:8 vd=%vd_dp
56
57
# We split the load/store multiple up into two patterns to avoid
58
# overlap with other insns in the "Advanced SIMD load/store and 64-bit move"
59
@@ -XXX,XX +XXX,XX @@ VLDM_VSTM_dp ---- 1101 0.1 l:1 rn:4 .... 1011 imm:8 \
60
vd=%vd_dp p=1 u=0 w=1
61
62
# 3-register VFP data-processing; bits [23,21:20,6] identify the operation.
63
-VMLA_sp ---- 1110 0.00 .... .... 1010 .0.0 .... \
64
- vm=%vm_sp vn=%vn_sp vd=%vd_sp
65
-VMLA_dp ---- 1110 0.00 .... .... 1011 .0.0 .... \
66
- vm=%vm_dp vn=%vn_dp vd=%vd_dp
67
+VMLA_sp ---- 1110 0.00 .... .... 1010 .0.0 .... @vfp_dnm_s
68
+VMLA_dp ---- 1110 0.00 .... .... 1011 .0.0 .... @vfp_dnm_d
69
70
-VMLS_sp ---- 1110 0.00 .... .... 1010 .1.0 .... \
71
- vm=%vm_sp vn=%vn_sp vd=%vd_sp
72
-VMLS_dp ---- 1110 0.00 .... .... 1011 .1.0 .... \
73
- vm=%vm_dp vn=%vn_dp vd=%vd_dp
74
+VMLS_sp ---- 1110 0.00 .... .... 1010 .1.0 .... @vfp_dnm_s
75
+VMLS_dp ---- 1110 0.00 .... .... 1011 .1.0 .... @vfp_dnm_d
76
77
-VNMLS_sp ---- 1110 0.01 .... .... 1010 .0.0 .... \
78
- vm=%vm_sp vn=%vn_sp vd=%vd_sp
79
-VNMLS_dp ---- 1110 0.01 .... .... 1011 .0.0 .... \
80
- vm=%vm_dp vn=%vn_dp vd=%vd_dp
81
+VNMLS_sp ---- 1110 0.01 .... .... 1010 .0.0 .... @vfp_dnm_s
82
+VNMLS_dp ---- 1110 0.01 .... .... 1011 .0.0 .... @vfp_dnm_d
83
84
-VNMLA_sp ---- 1110 0.01 .... .... 1010 .1.0 .... \
85
- vm=%vm_sp vn=%vn_sp vd=%vd_sp
86
-VNMLA_dp ---- 1110 0.01 .... .... 1011 .1.0 .... \
87
- vm=%vm_dp vn=%vn_dp vd=%vd_dp
88
+VNMLA_sp ---- 1110 0.01 .... .... 1010 .1.0 .... @vfp_dnm_s
89
+VNMLA_dp ---- 1110 0.01 .... .... 1011 .1.0 .... @vfp_dnm_d
90
91
-VMUL_sp ---- 1110 0.10 .... .... 1010 .0.0 .... \
92
- vm=%vm_sp vn=%vn_sp vd=%vd_sp
93
-VMUL_dp ---- 1110 0.10 .... .... 1011 .0.0 .... \
94
- vm=%vm_dp vn=%vn_dp vd=%vd_dp
95
+VMUL_sp ---- 1110 0.10 .... .... 1010 .0.0 .... @vfp_dnm_s
96
+VMUL_dp ---- 1110 0.10 .... .... 1011 .0.0 .... @vfp_dnm_d
97
98
-VNMUL_sp ---- 1110 0.10 .... .... 1010 .1.0 .... \
99
- vm=%vm_sp vn=%vn_sp vd=%vd_sp
100
-VNMUL_dp ---- 1110 0.10 .... .... 1011 .1.0 .... \
101
- vm=%vm_dp vn=%vn_dp vd=%vd_dp
102
+VNMUL_sp ---- 1110 0.10 .... .... 1010 .1.0 .... @vfp_dnm_s
103
+VNMUL_dp ---- 1110 0.10 .... .... 1011 .1.0 .... @vfp_dnm_d
104
105
-VADD_sp ---- 1110 0.11 .... .... 1010 .0.0 .... \
106
- vm=%vm_sp vn=%vn_sp vd=%vd_sp
107
-VADD_dp ---- 1110 0.11 .... .... 1011 .0.0 .... \
108
- vm=%vm_dp vn=%vn_dp vd=%vd_dp
109
+VADD_sp ---- 1110 0.11 .... .... 1010 .0.0 .... @vfp_dnm_s
110
+VADD_dp ---- 1110 0.11 .... .... 1011 .0.0 .... @vfp_dnm_d
111
112
-VSUB_sp ---- 1110 0.11 .... .... 1010 .1.0 .... \
113
- vm=%vm_sp vn=%vn_sp vd=%vd_sp
114
-VSUB_dp ---- 1110 0.11 .... .... 1011 .1.0 .... \
115
- vm=%vm_dp vn=%vn_dp vd=%vd_dp
116
+VSUB_sp ---- 1110 0.11 .... .... 1010 .1.0 .... @vfp_dnm_s
117
+VSUB_dp ---- 1110 0.11 .... .... 1011 .1.0 .... @vfp_dnm_d
118
119
-VDIV_sp ---- 1110 1.00 .... .... 1010 .0.0 .... \
120
- vm=%vm_sp vn=%vn_sp vd=%vd_sp
121
-VDIV_dp ---- 1110 1.00 .... .... 1011 .0.0 .... \
122
- vm=%vm_dp vn=%vn_dp vd=%vd_dp
123
+VDIV_sp ---- 1110 1.00 .... .... 1010 .0.0 .... @vfp_dnm_s
124
+VDIV_dp ---- 1110 1.00 .... .... 1011 .0.0 .... @vfp_dnm_d
125
126
VFM_sp ---- 1110 1.01 .... .... 1010 . o2:1 . 0 .... \
127
vm=%vm_sp vn=%vn_sp vd=%vd_sp o1=1
128
@@ -XXX,XX +XXX,XX @@ VMOV_imm_sp ---- 1110 1.11 .... .... 1010 0000 .... \
129
VMOV_imm_dp ---- 1110 1.11 .... .... 1011 0000 .... \
130
vd=%vd_dp imm=%vmov_imm
131
132
-VMOV_reg_sp ---- 1110 1.11 0000 .... 1010 01.0 .... \
133
- vd=%vd_sp vm=%vm_sp
134
-VMOV_reg_dp ---- 1110 1.11 0000 .... 1011 01.0 .... \
135
- vd=%vd_dp vm=%vm_dp
136
+VMOV_reg_sp ---- 1110 1.11 0000 .... 1010 01.0 .... @vfp_dm_ss
137
+VMOV_reg_dp ---- 1110 1.11 0000 .... 1011 01.0 .... @vfp_dm_dd
138
139
-VABS_sp ---- 1110 1.11 0000 .... 1010 11.0 .... \
140
- vd=%vd_sp vm=%vm_sp
141
-VABS_dp ---- 1110 1.11 0000 .... 1011 11.0 .... \
142
- vd=%vd_dp vm=%vm_dp
143
+VABS_sp ---- 1110 1.11 0000 .... 1010 11.0 .... @vfp_dm_ss
144
+VABS_dp ---- 1110 1.11 0000 .... 1011 11.0 .... @vfp_dm_dd
145
146
-VNEG_sp ---- 1110 1.11 0001 .... 1010 01.0 .... \
147
- vd=%vd_sp vm=%vm_sp
148
-VNEG_dp ---- 1110 1.11 0001 .... 1011 01.0 .... \
149
- vd=%vd_dp vm=%vm_dp
150
+VNEG_sp ---- 1110 1.11 0001 .... 1010 01.0 .... @vfp_dm_ss
151
+VNEG_dp ---- 1110 1.11 0001 .... 1011 01.0 .... @vfp_dm_dd
152
153
-VSQRT_sp ---- 1110 1.11 0001 .... 1010 11.0 .... \
154
- vd=%vd_sp vm=%vm_sp
155
-VSQRT_dp ---- 1110 1.11 0001 .... 1011 11.0 .... \
156
- vd=%vd_dp vm=%vm_dp
157
+VSQRT_sp ---- 1110 1.11 0001 .... 1010 11.0 .... @vfp_dm_ss
158
+VSQRT_dp ---- 1110 1.11 0001 .... 1011 11.0 .... @vfp_dm_dd
159
160
VCMP_sp ---- 1110 1.11 010 z:1 .... 1010 e:1 1.0 .... \
161
vd=%vd_sp vm=%vm_sp
162
@@ -XXX,XX +XXX,XX @@ VCVT_f32_f16 ---- 1110 1.11 0010 .... 1010 t:1 1.0 .... \
163
VCVT_f64_f16 ---- 1110 1.11 0010 .... 1011 t:1 1.0 .... \
164
vd=%vd_dp vm=%vm_sp
165
166
-# VCVTB and VCVTT to f16: Vd format is always vd_sp; Vm format depends on size bit
167
+# VCVTB and VCVTT to f16: Vd format is always vd_sp;
168
+# Vm format depends on size bit
169
VCVT_f16_f32 ---- 1110 1.11 0011 .... 1010 t:1 1.0 .... \
170
vd=%vd_sp vm=%vm_sp
171
VCVT_f16_f64 ---- 1110 1.11 0011 .... 1011 t:1 1.0 .... \
172
vd=%vd_sp vm=%vm_dp
173
174
-VRINTR_sp ---- 1110 1.11 0110 .... 1010 01.0 .... \
175
- vd=%vd_sp vm=%vm_sp
176
-VRINTR_dp ---- 1110 1.11 0110 .... 1011 01.0 .... \
177
- vd=%vd_dp vm=%vm_dp
178
+VRINTR_sp ---- 1110 1.11 0110 .... 1010 01.0 .... @vfp_dm_ss
179
+VRINTR_dp ---- 1110 1.11 0110 .... 1011 01.0 .... @vfp_dm_dd
180
181
-VRINTZ_sp ---- 1110 1.11 0110 .... 1010 11.0 .... \
182
- vd=%vd_sp vm=%vm_sp
183
-VRINTZ_dp ---- 1110 1.11 0110 .... 1011 11.0 .... \
184
- vd=%vd_dp vm=%vm_dp
185
+VRINTZ_sp ---- 1110 1.11 0110 .... 1010 11.0 .... @vfp_dm_ss
186
+VRINTZ_dp ---- 1110 1.11 0110 .... 1011 11.0 .... @vfp_dm_dd
187
188
-VRINTX_sp ---- 1110 1.11 0111 .... 1010 01.0 .... \
189
- vd=%vd_sp vm=%vm_sp
190
-VRINTX_dp ---- 1110 1.11 0111 .... 1011 01.0 .... \
191
- vd=%vd_dp vm=%vm_dp
192
+VRINTX_sp ---- 1110 1.11 0111 .... 1010 01.0 .... @vfp_dm_ss
193
+VRINTX_dp ---- 1110 1.11 0111 .... 1011 01.0 .... @vfp_dm_dd
194
195
-# VCVT between single and double: Vm precision depends on size; Vd is its reverse
196
-VCVT_sp ---- 1110 1.11 0111 .... 1010 11.0 .... \
197
- vd=%vd_dp vm=%vm_sp
198
-VCVT_dp ---- 1110 1.11 0111 .... 1011 11.0 .... \
199
- vd=%vd_sp vm=%vm_dp
200
+# VCVT between single and double:
201
+# Vm precision depends on size; Vd is its reverse
202
+VCVT_sp ---- 1110 1.11 0111 .... 1010 11.0 .... @vfp_dm_ds
203
+VCVT_dp ---- 1110 1.11 0111 .... 1011 11.0 .... @vfp_dm_sd
204
205
# VCVT from integer to floating point: Vm always single; Vd depends on size
206
VCVT_int_sp ---- 1110 1.11 1000 .... 1010 s:1 1.0 .... \
207
@@ -XXX,XX +XXX,XX @@ VCVT_int_dp ---- 1110 1.11 1000 .... 1011 s:1 1.0 .... \
208
vd=%vd_dp vm=%vm_sp
209
210
# VJCVT is always dp to sp
211
-VJCVT ---- 1110 1.11 1001 .... 1011 11.0 .... \
212
- vd=%vd_sp vm=%vm_dp
213
+VJCVT ---- 1110 1.11 1001 .... 1011 11.0 .... @vfp_dm_sd
214
215
# VCVT between floating-point and fixed-point. The immediate value
216
# is in the same format as a Vm single-precision register number.
217
--
218
2.20.1
219
220
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to flatview_translate(); all its
3
callers now have attrs available.
4
2
3
Passing the raw o1 and o2 fields from the manual is less
4
instructive than it might be. Do the full decode and let
5
the trans_* functions pass in booleans to a helper.
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200224222232.13807-17-richard.henderson@linaro.org
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20180521140402.23318-11-peter.maydell@linaro.org
9
---
11
---
10
include/exec/memory.h | 7 ++++---
12
target/arm/translate-vfp.inc.c | 52 ++++++++++++++++++++++++++++++----
11
exec.c | 17 +++++++++--------
13
target/arm/vfp.decode | 17 +++++------
12
2 files changed, 13 insertions(+), 11 deletions(-)
14
2 files changed, 55 insertions(+), 14 deletions(-)
13
15
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
16
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
18
--- a/target/arm/translate-vfp.inc.c
17
+++ b/include/exec/memory.h
19
+++ b/target/arm/translate-vfp.inc.c
18
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
20
@@ -XXX,XX +XXX,XX @@ static bool trans_VDIV_dp(DisasContext *s, arg_VDIV_dp *a)
19
*/
21
return do_vfp_3op_dp(s, gen_helper_vfp_divd, a->vd, a->vn, a->vm, false);
20
MemoryRegion *flatview_translate(FlatView *fv,
22
}
21
hwaddr addr, hwaddr *xlat,
23
22
- hwaddr *len, bool is_write);
24
-static bool trans_VFM_sp(DisasContext *s, arg_VFM_sp *a)
23
+ hwaddr *len, bool is_write,
25
+static bool do_vfm_sp(DisasContext *s, arg_VFMA_sp *a, bool neg_n, bool neg_d)
24
+ MemTxAttrs attrs);
25
26
static inline MemoryRegion *address_space_translate(AddressSpace *as,
27
hwaddr addr, hwaddr *xlat,
28
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
29
MemTxAttrs attrs)
30
{
26
{
31
return flatview_translate(address_space_to_flatview(as),
27
/*
32
- addr, xlat, len, is_write);
28
* VFNMA : fd = muladd(-fd, fn, fm)
33
+ addr, xlat, len, is_write, attrs);
29
@@ -XXX,XX +XXX,XX @@ static bool trans_VFM_sp(DisasContext *s, arg_VFM_sp *a)
30
31
neon_load_reg32(vn, a->vn);
32
neon_load_reg32(vm, a->vm);
33
- if (a->o2) {
34
+ if (neg_n) {
35
/* VFNMS, VFMS */
36
gen_helper_vfp_negs(vn, vn);
37
}
38
neon_load_reg32(vd, a->vd);
39
- if (a->o1 & 1) {
40
+ if (neg_d) {
41
/* VFNMA, VFNMS */
42
gen_helper_vfp_negs(vd, vd);
43
}
44
@@ -XXX,XX +XXX,XX @@ static bool trans_VFM_sp(DisasContext *s, arg_VFM_sp *a)
45
return true;
34
}
46
}
35
47
36
/* address_space_access_valid: check for validity of accessing an address
48
-static bool trans_VFM_dp(DisasContext *s, arg_VFM_dp *a)
37
@@ -XXX,XX +XXX,XX @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr,
49
+static bool trans_VFMA_sp(DisasContext *s, arg_VFMA_sp *a)
38
rcu_read_lock();
50
+{
39
fv = address_space_to_flatview(as);
51
+ return do_vfm_sp(s, a, false, false);
40
l = len;
52
+}
41
- mr = flatview_translate(fv, addr, &addr1, &l, false);
53
+
42
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
54
+static bool trans_VFMS_sp(DisasContext *s, arg_VFMS_sp *a)
43
if (len == l && memory_access_is_direct(mr, false)) {
55
+{
44
ptr = qemu_map_ram_ptr(mr->ram_block, addr1);
56
+ return do_vfm_sp(s, a, true, false);
45
memcpy(buf, ptr, len);
57
+}
46
diff --git a/exec.c b/exec.c
58
+
59
+static bool trans_VFNMA_sp(DisasContext *s, arg_VFNMA_sp *a)
60
+{
61
+ return do_vfm_sp(s, a, false, true);
62
+}
63
+
64
+static bool trans_VFNMS_sp(DisasContext *s, arg_VFNMS_sp *a)
65
+{
66
+ return do_vfm_sp(s, a, true, true);
67
+}
68
+
69
+static bool do_vfm_dp(DisasContext *s, arg_VFMA_dp *a, bool neg_n, bool neg_d)
70
{
71
/*
72
* VFNMA : fd = muladd(-fd, fn, fm)
73
@@ -XXX,XX +XXX,XX @@ static bool trans_VFM_dp(DisasContext *s, arg_VFM_dp *a)
74
75
neon_load_reg64(vn, a->vn);
76
neon_load_reg64(vm, a->vm);
77
- if (a->o2) {
78
+ if (neg_n) {
79
/* VFNMS, VFMS */
80
gen_helper_vfp_negd(vn, vn);
81
}
82
neon_load_reg64(vd, a->vd);
83
- if (a->o1 & 1) {
84
+ if (neg_d) {
85
/* VFNMA, VFNMS */
86
gen_helper_vfp_negd(vd, vd);
87
}
88
@@ -XXX,XX +XXX,XX @@ static bool trans_VFM_dp(DisasContext *s, arg_VFM_dp *a)
89
return true;
90
}
91
92
+static bool trans_VFMA_dp(DisasContext *s, arg_VFMA_dp *a)
93
+{
94
+ return do_vfm_dp(s, a, false, false);
95
+}
96
+
97
+static bool trans_VFMS_dp(DisasContext *s, arg_VFMS_dp *a)
98
+{
99
+ return do_vfm_dp(s, a, true, false);
100
+}
101
+
102
+static bool trans_VFNMA_dp(DisasContext *s, arg_VFNMA_dp *a)
103
+{
104
+ return do_vfm_dp(s, a, false, true);
105
+}
106
+
107
+static bool trans_VFNMS_dp(DisasContext *s, arg_VFNMS_dp *a)
108
+{
109
+ return do_vfm_dp(s, a, true, true);
110
+}
111
+
112
static bool trans_VMOV_imm_sp(DisasContext *s, arg_VMOV_imm_sp *a)
113
{
114
uint32_t delta_d = 0;
115
diff --git a/target/arm/vfp.decode b/target/arm/vfp.decode
47
index XXXXXXX..XXXXXXX 100644
116
index XXXXXXX..XXXXXXX 100644
48
--- a/exec.c
117
--- a/target/arm/vfp.decode
49
+++ b/exec.c
118
+++ b/target/arm/vfp.decode
50
@@ -XXX,XX +XXX,XX @@ iotlb_fail:
119
@@ -XXX,XX +XXX,XX @@ VSUB_dp ---- 1110 0.11 .... .... 1011 .1.0 .... @vfp_dnm_d
51
120
VDIV_sp ---- 1110 1.00 .... .... 1010 .0.0 .... @vfp_dnm_s
52
/* Called from RCU critical section */
121
VDIV_dp ---- 1110 1.00 .... .... 1011 .0.0 .... @vfp_dnm_d
53
MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
122
54
- hwaddr *plen, bool is_write)
123
-VFM_sp ---- 1110 1.01 .... .... 1010 . o2:1 . 0 .... \
55
+ hwaddr *plen, bool is_write,
124
- vm=%vm_sp vn=%vn_sp vd=%vd_sp o1=1
56
+ MemTxAttrs attrs)
125
-VFM_dp ---- 1110 1.01 .... .... 1011 . o2:1 . 0 .... \
57
{
126
- vm=%vm_dp vn=%vn_dp vd=%vd_dp o1=1
58
MemoryRegion *mr;
127
-VFM_sp ---- 1110 1.10 .... .... 1010 . o2:1 . 0 .... \
59
MemoryRegionSection section;
128
- vm=%vm_sp vn=%vn_sp vd=%vd_sp o1=2
60
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr,
129
-VFM_dp ---- 1110 1.10 .... .... 1011 . o2:1 . 0 .... \
61
}
130
- vm=%vm_dp vn=%vn_dp vd=%vd_dp o1=2
62
131
+VFMA_sp ---- 1110 1.10 .... .... 1010 .0. 0 .... @vfp_dnm_s
63
l = len;
132
+VFMS_sp ---- 1110 1.10 .... .... 1010 .1. 0 .... @vfp_dnm_s
64
- mr = flatview_translate(fv, addr, &addr1, &l, true);
133
+VFNMA_sp ---- 1110 1.01 .... .... 1010 .0. 0 .... @vfp_dnm_s
65
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
134
+VFNMS_sp ---- 1110 1.01 .... .... 1010 .1. 0 .... @vfp_dnm_s
66
}
135
+
67
136
+VFMA_dp ---- 1110 1.10 .... .... 1011 .0.0 .... @vfp_dnm_d
68
return result;
137
+VFMS_dp ---- 1110 1.10 .... .... 1011 .1.0 .... @vfp_dnm_d
69
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
138
+VFNMA_dp ---- 1110 1.01 .... .... 1011 .0.0 .... @vfp_dnm_d
70
MemTxResult result = MEMTX_OK;
139
+VFNMS_dp ---- 1110 1.01 .... .... 1011 .1.0 .... @vfp_dnm_d
71
140
72
l = len;
141
VMOV_imm_sp ---- 1110 1.11 .... .... 1010 0000 .... \
73
- mr = flatview_translate(fv, addr, &addr1, &l, true);
142
vd=%vd_sp imm=%vmov_imm
74
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
75
result = flatview_write_continue(fv, addr, attrs, buf, len,
76
addr1, l, mr);
77
78
@@ -XXX,XX +XXX,XX @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,
79
}
80
81
l = len;
82
- mr = flatview_translate(fv, addr, &addr1, &l, false);
83
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
84
}
85
86
return result;
87
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
88
MemoryRegion *mr;
89
90
l = len;
91
- mr = flatview_translate(fv, addr, &addr1, &l, false);
92
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
93
return flatview_read_continue(fv, addr, attrs, buf, len,
94
addr1, l, mr);
95
}
96
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
97
98
while (len > 0) {
99
l = len;
100
- mr = flatview_translate(fv, addr, &xlat, &l, is_write);
101
+ mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
102
if (!memory_access_is_direct(mr, is_write)) {
103
l = memory_access_size(mr, l, addr);
104
if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
105
@@ -XXX,XX +XXX,XX @@ flatview_extend_translation(FlatView *fv, hwaddr addr,
106
107
len = target_len;
108
this_mr = flatview_translate(fv, addr, &xlat,
109
- &len, is_write);
110
+ &len, is_write, attrs);
111
if (this_mr != mr || xlat != base + done) {
112
return done;
113
}
114
@@ -XXX,XX +XXX,XX @@ void *address_space_map(AddressSpace *as,
115
l = len;
116
rcu_read_lock();
117
fv = address_space_to_flatview(as);
118
- mr = flatview_translate(fv, addr, &xlat, &l, is_write);
119
+ mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
120
121
if (!memory_access_is_direct(mr, is_write)) {
122
if (atomic_xchg(&bounce.in_use, true)) {
123
--
143
--
124
2.17.1
144
2.20.1
125
145
126
146
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
add MemTxAttrs as an argument to flatview_access_valid().
3
Its callers now all have an attrs value to hand, so we can
4
correct our earlier temporary use of MEMTXATTRS_UNSPECIFIED.
5
2
3
Passing the raw op field from the manual is less instructive
4
than it might be. Do the full decode and use the existing
5
helpers to perform the expansion.
6
7
Since these are v8 insns, VECLEN+VECSTRIDE are already RES0.
8
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20200224222232.13807-18-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-10-peter.maydell@linaro.org
10
---
13
---
11
exec.c | 12 +++++-------
14
target/arm/translate-vfp.inc.c | 109 +++++++++++----------------------
12
1 file changed, 5 insertions(+), 7 deletions(-)
15
target/arm/vfp-uncond.decode | 12 ++--
16
2 files changed, 44 insertions(+), 77 deletions(-)
13
17
14
diff --git a/exec.c b/exec.c
18
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
15
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
20
--- a/target/arm/translate-vfp.inc.c
17
+++ b/exec.c
21
+++ b/target/arm/translate-vfp.inc.c
18
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
22
@@ -XXX,XX +XXX,XX @@ static bool trans_VSEL(DisasContext *s, arg_VSEL *a)
19
static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
23
return true;
20
const uint8_t *buf, int len);
21
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
22
- bool is_write);
23
+ bool is_write, MemTxAttrs attrs);
24
25
static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data,
26
unsigned len, MemTxAttrs attrs)
27
@@ -XXX,XX +XXX,XX @@ static bool subpage_accepts(void *opaque, hwaddr addr,
28
#endif
29
30
return flatview_access_valid(subpage->fv, addr + subpage->base,
31
- len, is_write);
32
+ len, is_write, attrs);
33
}
24
}
34
25
35
static const MemoryRegionOps subpage_ops = {
26
-static bool trans_VMINMAXNM(DisasContext *s, arg_VMINMAXNM *a)
36
@@ -XXX,XX +XXX,XX @@ static void cpu_notify_map_clients(void)
27
-{
28
- uint32_t rd, rn, rm;
29
- bool dp = a->dp;
30
- bool vmin = a->op;
31
- TCGv_ptr fpst;
32
-
33
- if (!dc_isar_feature(aa32_vminmaxnm, s)) {
34
- return false;
35
- }
36
-
37
- if (dp && !dc_isar_feature(aa32_fpdp_v2, s)) {
38
- return false;
39
- }
40
-
41
- /* UNDEF accesses to D16-D31 if they don't exist */
42
- if (dp && !dc_isar_feature(aa32_simd_r32, s) &&
43
- ((a->vm | a->vn | a->vd) & 0x10)) {
44
- return false;
45
- }
46
-
47
- rd = a->vd;
48
- rn = a->vn;
49
- rm = a->vm;
50
-
51
- if (!vfp_access_check(s)) {
52
- return true;
53
- }
54
-
55
- fpst = get_fpstatus_ptr(0);
56
-
57
- if (dp) {
58
- TCGv_i64 frn, frm, dest;
59
-
60
- frn = tcg_temp_new_i64();
61
- frm = tcg_temp_new_i64();
62
- dest = tcg_temp_new_i64();
63
-
64
- neon_load_reg64(frn, rn);
65
- neon_load_reg64(frm, rm);
66
- if (vmin) {
67
- gen_helper_vfp_minnumd(dest, frn, frm, fpst);
68
- } else {
69
- gen_helper_vfp_maxnumd(dest, frn, frm, fpst);
70
- }
71
- neon_store_reg64(dest, rd);
72
- tcg_temp_free_i64(frn);
73
- tcg_temp_free_i64(frm);
74
- tcg_temp_free_i64(dest);
75
- } else {
76
- TCGv_i32 frn, frm, dest;
77
-
78
- frn = tcg_temp_new_i32();
79
- frm = tcg_temp_new_i32();
80
- dest = tcg_temp_new_i32();
81
-
82
- neon_load_reg32(frn, rn);
83
- neon_load_reg32(frm, rm);
84
- if (vmin) {
85
- gen_helper_vfp_minnums(dest, frn, frm, fpst);
86
- } else {
87
- gen_helper_vfp_maxnums(dest, frn, frm, fpst);
88
- }
89
- neon_store_reg32(dest, rd);
90
- tcg_temp_free_i32(frn);
91
- tcg_temp_free_i32(frm);
92
- tcg_temp_free_i32(dest);
93
- }
94
-
95
- tcg_temp_free_ptr(fpst);
96
- return true;
97
-}
98
-
99
/*
100
* Table for converting the most common AArch32 encoding of
101
* rounding mode to arm_fprounding order (which matches the
102
@@ -XXX,XX +XXX,XX @@ static bool trans_VDIV_dp(DisasContext *s, arg_VDIV_dp *a)
103
return do_vfp_3op_dp(s, gen_helper_vfp_divd, a->vd, a->vn, a->vm, false);
37
}
104
}
38
105
39
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
106
+static bool trans_VMINNM_sp(DisasContext *s, arg_VMINNM_sp *a)
40
- bool is_write)
107
+{
41
+ bool is_write, MemTxAttrs attrs)
108
+ if (!dc_isar_feature(aa32_vminmaxnm, s)) {
109
+ return false;
110
+ }
111
+ return do_vfp_3op_sp(s, gen_helper_vfp_minnums,
112
+ a->vd, a->vn, a->vm, false);
113
+}
114
+
115
+static bool trans_VMAXNM_sp(DisasContext *s, arg_VMAXNM_sp *a)
116
+{
117
+ if (!dc_isar_feature(aa32_vminmaxnm, s)) {
118
+ return false;
119
+ }
120
+ return do_vfp_3op_sp(s, gen_helper_vfp_maxnums,
121
+ a->vd, a->vn, a->vm, false);
122
+}
123
+
124
+static bool trans_VMINNM_dp(DisasContext *s, arg_VMINNM_dp *a)
125
+{
126
+ if (!dc_isar_feature(aa32_vminmaxnm, s)) {
127
+ return false;
128
+ }
129
+ return do_vfp_3op_dp(s, gen_helper_vfp_minnumd,
130
+ a->vd, a->vn, a->vm, false);
131
+}
132
+
133
+static bool trans_VMAXNM_dp(DisasContext *s, arg_VMAXNM_dp *a)
134
+{
135
+ if (!dc_isar_feature(aa32_vminmaxnm, s)) {
136
+ return false;
137
+ }
138
+ return do_vfp_3op_dp(s, gen_helper_vfp_maxnumd,
139
+ a->vd, a->vn, a->vm, false);
140
+}
141
+
142
static bool do_vfm_sp(DisasContext *s, arg_VFMA_sp *a, bool neg_n, bool neg_d)
42
{
143
{
43
MemoryRegion *mr;
144
/*
44
hwaddr l, xlat;
145
diff --git a/target/arm/vfp-uncond.decode b/target/arm/vfp-uncond.decode
45
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
146
index XXXXXXX..XXXXXXX 100644
46
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
147
--- a/target/arm/vfp-uncond.decode
47
if (!memory_access_is_direct(mr, is_write)) {
148
+++ b/target/arm/vfp-uncond.decode
48
l = memory_access_size(mr, l, addr);
149
@@ -XXX,XX +XXX,XX @@
49
- /* When our callers all have attrs we'll pass them through here */
150
%vd_dp 22:1 12:4
50
- if (!memory_region_access_valid(mr, xlat, l, is_write,
151
%vd_sp 12:4 22:1
51
- MEMTXATTRS_UNSPECIFIED)) {
152
52
+ if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
153
+@vfp_dnm_s ................................ vm=%vm_sp vn=%vn_sp vd=%vd_sp
53
return false;
154
+@vfp_dnm_d ................................ vm=%vm_dp vn=%vn_dp vd=%vd_dp
54
}
155
+
55
}
156
VSEL 1111 1110 0. cc:2 .... .... 1010 .0.0 .... \
56
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
157
vm=%vm_sp vn=%vn_sp vd=%vd_sp dp=0
57
158
VSEL 1111 1110 0. cc:2 .... .... 1011 .0.0 .... \
58
rcu_read_lock();
159
vm=%vm_dp vn=%vn_dp vd=%vd_dp dp=1
59
fv = address_space_to_flatview(as);
160
60
- result = flatview_access_valid(fv, addr, len, is_write);
161
-VMINMAXNM 1111 1110 1.00 .... .... 1010 . op:1 .0 .... \
61
+ result = flatview_access_valid(fv, addr, len, is_write, attrs);
162
- vm=%vm_sp vn=%vn_sp vd=%vd_sp dp=0
62
rcu_read_unlock();
163
-VMINMAXNM 1111 1110 1.00 .... .... 1011 . op:1 .0 .... \
63
return result;
164
- vm=%vm_dp vn=%vn_dp vd=%vd_dp dp=1
64
}
165
+VMAXNM_sp 1111 1110 1.00 .... .... 1010 .0.0 .... @vfp_dnm_s
166
+VMINNM_sp 1111 1110 1.00 .... .... 1010 .1.0 .... @vfp_dnm_s
167
+
168
+VMAXNM_dp 1111 1110 1.00 .... .... 1011 .0.0 .... @vfp_dnm_d
169
+VMINNM_dp 1111 1110 1.00 .... .... 1011 .1.0 .... @vfp_dnm_d
170
171
VRINT 1111 1110 1.11 10 rm:2 .... 1010 01.0 .... \
172
vm=%vm_sp vd=%vd_sp dp=0
65
--
173
--
66
2.17.1
174
2.20.1
67
175
68
176
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Guenter Roeck <linux@roeck-us.net>
2
add MemTxAttrs as an argument to flatview_do_translate().
3
2
3
USB ports on Xilinx Zync must be instantiated as TYPE_CHIPIDEA to work.
4
Linux expects and checks various chipidea registers, which do not exist
5
with the basic ehci emulation. This patch series fixes the problem.
6
7
Without this patch, USB ports fail to instantiate under Linux.
8
9
ci_hdrc ci_hdrc.0: doesn't support host
10
ci_hdrc ci_hdrc.0: no supported roles
11
12
With this patch, USB ports are instantiated, and it is possible
13
to boot from USB drive.
14
15
ci_hdrc ci_hdrc.0: EHCI Host Controller
16
ci_hdrc ci_hdrc.0: new USB bus registered, assigned bus number 1
17
ci_hdrc ci_hdrc.0: USB 2.0 started, EHCI 1.00
18
usb 1-1: new full-speed USB device number 2 using ci_hdrc
19
usb 1-1: not running at top speed; connect to a high speed hub
20
usb 1-1: config 1 interface 0 altsetting 0 endpoint 0x81 has invalid maxpacket 512, setting to 64
21
usb 1-1: config 1 interface 0 altsetting 0 endpoint 0x2 has invalid maxpacket 512, setting to 64
22
usb-storage 1-1:1.0: USB Mass Storage device detected
23
scsi host0: usb-storage 1-1:1.0
24
25
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
26
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
27
Message-id: 20200215122354.13706-2-linux@roeck-us.net
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-13-peter.maydell@linaro.org
8
---
29
---
9
exec.c | 9 ++++++---
30
hw/arm/xilinx_zynq.c | 5 +++--
10
1 file changed, 6 insertions(+), 3 deletions(-)
31
1 file changed, 3 insertions(+), 2 deletions(-)
11
32
12
diff --git a/exec.c b/exec.c
33
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
13
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
35
--- a/hw/arm/xilinx_zynq.c
15
+++ b/exec.c
36
+++ b/hw/arm/xilinx_zynq.c
16
@@ -XXX,XX +XXX,XX @@ unassigned:
37
@@ -XXX,XX +XXX,XX @@
17
* @is_write: whether the translation operation is for write
38
#include "hw/loader.h"
18
* @is_mmio: whether this can be MMIO, set true if it can
39
#include "hw/misc/zynq-xadc.h"
19
* @target_as: the address space targeted by the IOMMU
40
#include "hw/ssi/ssi.h"
20
+ * @attrs: memory transaction attributes
41
+#include "hw/usb/chipidea.h"
21
*
42
#include "qemu/error-report.h"
22
* This function is called from RCU critical section
43
#include "hw/sd/sdhci.h"
23
*/
44
#include "hw/char/cadence_uart.h"
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
45
@@ -XXX,XX +XXX,XX @@ static void zynq_init(MachineState *machine)
25
hwaddr *page_mask_out,
46
zynq_init_spi_flashes(0xE0007000, pic[81-IRQ_OFFSET], false);
26
bool is_write,
47
zynq_init_spi_flashes(0xE000D000, pic[51-IRQ_OFFSET], true);
27
bool is_mmio,
48
28
- AddressSpace **target_as)
49
- sysbus_create_simple("xlnx,ps7-usb", 0xE0002000, pic[53-IRQ_OFFSET]);
29
+ AddressSpace **target_as,
50
- sysbus_create_simple("xlnx,ps7-usb", 0xE0003000, pic[76-IRQ_OFFSET]);
30
+ MemTxAttrs attrs)
51
+ sysbus_create_simple(TYPE_CHIPIDEA, 0xE0002000, pic[53 - IRQ_OFFSET]);
31
{
52
+ sysbus_create_simple(TYPE_CHIPIDEA, 0xE0003000, pic[76 - IRQ_OFFSET]);
32
MemoryRegionSection *section;
53
33
IOMMUMemoryRegion *iommu_mr;
54
cadence_uart_create(0xE0000000, pic[59 - IRQ_OFFSET], serial_hd(0));
34
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
55
cadence_uart_create(0xE0001000, pic[82 - IRQ_OFFSET], serial_hd(1));
35
* but page mask.
36
*/
37
section = flatview_do_translate(address_space_to_flatview(as), addr, &xlat,
38
- NULL, &page_mask, is_write, false, &as);
39
+ NULL, &page_mask, is_write, false, &as,
40
+ attrs);
41
42
/* Illegal translation */
43
if (section.mr == &io_mem_unassigned) {
44
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
45
46
/* This can be MMIO, so setup MMIO bit. */
47
section = flatview_do_translate(fv, addr, xlat, plen, NULL,
48
- is_write, true, &as);
49
+ is_write, true, &as, attrs);
50
mr = section.mr;
51
52
if (xen_enabled() && memory_access_is_direct(mr, is_write)) {
53
--
56
--
54
2.17.1
57
2.20.1
55
58
56
59
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Guenter Roeck <linux@roeck-us.net>
2
add MemTxAttrs as an argument to address_space_get_iotlb_entry().
3
2
3
Xilinx USB devices are now instantiated through TYPE_CHIPIDEA,
4
and xlnx support in the EHCI code is no longer needed.
5
6
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
7
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
8
Message-id: 20200215122354.13706-3-linux@roeck-us.net
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-12-peter.maydell@linaro.org
8
---
10
---
9
include/exec/memory.h | 2 +-
11
hw/usb/hcd-ehci-sysbus.c | 17 -----------------
10
exec.c | 2 +-
12
1 file changed, 17 deletions(-)
11
hw/virtio/vhost.c | 3 ++-
12
3 files changed, 4 insertions(+), 3 deletions(-)
13
13
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
diff --git a/hw/usb/hcd-ehci-sysbus.c b/hw/usb/hcd-ehci-sysbus.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
16
--- a/hw/usb/hcd-ehci-sysbus.c
17
+++ b/include/exec/memory.h
17
+++ b/hw/usb/hcd-ehci-sysbus.c
18
@@ -XXX,XX +XXX,XX @@ void address_space_cache_destroy(MemoryRegionCache *cache);
18
@@ -XXX,XX +XXX,XX @@ static const TypeInfo ehci_platform_type_info = {
19
* entry. Should be called from an RCU critical section.
19
.class_init = ehci_platform_class_init,
20
*/
20
};
21
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
21
22
- bool is_write);
22
-static void ehci_xlnx_class_init(ObjectClass *oc, void *data)
23
+ bool is_write, MemTxAttrs attrs);
23
-{
24
24
- SysBusEHCIClass *sec = SYS_BUS_EHCI_CLASS(oc);
25
/* address_space_translate: translate an address range into an address space
25
- DeviceClass *dc = DEVICE_CLASS(oc);
26
* into a MemoryRegion and an address range into that section. Should be
26
-
27
diff --git a/exec.c b/exec.c
27
- set_bit(DEVICE_CATEGORY_USB, dc->categories);
28
index XXXXXXX..XXXXXXX 100644
28
- sec->capsbase = 0x100;
29
--- a/exec.c
29
- sec->opregbase = 0x140;
30
+++ b/exec.c
30
-}
31
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
31
-
32
32
-static const TypeInfo ehci_xlnx_type_info = {
33
/* Called from RCU critical section */
33
- .name = "xlnx,ps7-usb",
34
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
34
- .parent = TYPE_SYS_BUS_EHCI,
35
- bool is_write)
35
- .class_init = ehci_xlnx_class_init,
36
+ bool is_write, MemTxAttrs attrs)
36
-};
37
-
38
static void ehci_exynos4210_class_init(ObjectClass *oc, void *data)
37
{
39
{
38
MemoryRegionSection section;
40
SysBusEHCIClass *sec = SYS_BUS_EHCI_CLASS(oc);
39
hwaddr xlat, page_mask;
41
@@ -XXX,XX +XXX,XX @@ static void ehci_sysbus_register_types(void)
40
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
42
{
41
index XXXXXXX..XXXXXXX 100644
43
type_register_static(&ehci_type_info);
42
--- a/hw/virtio/vhost.c
44
type_register_static(&ehci_platform_type_info);
43
+++ b/hw/virtio/vhost.c
45
- type_register_static(&ehci_xlnx_type_info);
44
@@ -XXX,XX +XXX,XX @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
46
type_register_static(&ehci_exynos4210_type_info);
45
trace_vhost_iotlb_miss(dev, 1);
47
type_register_static(&ehci_tegra2_type_info);
46
48
type_register_static(&ehci_ppc4xx_type_info);
47
iotlb = address_space_get_iotlb_entry(dev->vdev->dma_as,
48
- iova, write);
49
+ iova, write,
50
+ MEMTXATTRS_UNSPECIFIED);
51
if (iotlb.target_as != NULL) {
52
ret = vhost_memory_region_lookup(dev, iotlb.translated_addr,
53
&uaddr, &len);
54
--
49
--
55
2.17.1
50
2.20.1
56
51
57
52
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Thomas Huth <thuth@redhat.com>
2
add MemTxAttrs as an argument to memory_region_access_valid().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
6
The callsite in flatview_access_valid() is part of a recursive
3
Old kernels from the Meego project can be used to check that Linux
7
loop flatview_access_valid() -> memory_region_access_valid() ->
4
is at least starting on these machines.
8
subpage_accepts() -> flatview_access_valid(); we make it pass
9
MEMTXATTRS_UNSPECIFIED for now, until the next several commits
10
have plumbed an attrs parameter through the rest of the loop
11
and we can add an attrs parameter to flatview_access_valid().
12
5
6
Signed-off-by: Thomas Huth <thuth@redhat.com>
7
Reviewed-by: Wainer dos Santos Moschetta <wainersm@redhat.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20200225172501.29609-2-philmd@redhat.com
12
Message-Id: <20200129131920.22302-1-thuth@redhat.com>
13
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Message-id: 20180521140402.23318-8-peter.maydell@linaro.org
17
---
15
---
18
include/exec/memory-internal.h | 3 ++-
16
MAINTAINERS | 1 +
19
exec.c | 4 +++-
17
tests/acceptance/machine_arm_n8x0.py | 49 ++++++++++++++++++++++++++++
20
hw/s390x/s390-pci-inst.c | 3 ++-
18
2 files changed, 50 insertions(+)
21
memory.c | 7 ++++---
19
create mode 100644 tests/acceptance/machine_arm_n8x0.py
22
4 files changed, 11 insertions(+), 6 deletions(-)
23
20
24
diff --git a/include/exec/memory-internal.h b/include/exec/memory-internal.h
21
diff --git a/MAINTAINERS b/MAINTAINERS
25
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory-internal.h
23
--- a/MAINTAINERS
27
+++ b/include/exec/memory-internal.h
24
+++ b/MAINTAINERS
28
@@ -XXX,XX +XXX,XX @@ void flatview_unref(FlatView *view);
25
@@ -XXX,XX +XXX,XX @@ F: hw/rtc/twl92230.c
29
extern const MemoryRegionOps unassigned_mem_ops;
26
F: include/hw/display/blizzard.h
30
27
F: include/hw/input/tsc2xxx.h
31
bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr,
28
F: include/hw/misc/cbus.h
32
- unsigned size, bool is_write);
29
+F: tests/acceptance/machine_arm_n8x0.py
33
+ unsigned size, bool is_write,
30
34
+ MemTxAttrs attrs);
31
Palm
35
32
M: Andrzej Zaborowski <balrogg@gmail.com>
36
void flatview_add_to_dispatch(FlatView *fv, MemoryRegionSection *section);
33
diff --git a/tests/acceptance/machine_arm_n8x0.py b/tests/acceptance/machine_arm_n8x0.py
37
AddressSpaceDispatch *address_space_dispatch_new(FlatView *fv);
34
new file mode 100644
38
diff --git a/exec.c b/exec.c
35
index XXXXXXX..XXXXXXX
39
index XXXXXXX..XXXXXXX 100644
36
--- /dev/null
40
--- a/exec.c
37
+++ b/tests/acceptance/machine_arm_n8x0.py
41
+++ b/exec.c
38
@@ -XXX,XX +XXX,XX @@
42
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
39
+# Functional test that boots a Linux kernel and checks the console
43
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
40
+#
44
if (!memory_access_is_direct(mr, is_write)) {
41
+# Copyright (c) 2020 Red Hat, Inc.
45
l = memory_access_size(mr, l, addr);
42
+#
46
- if (!memory_region_access_valid(mr, xlat, l, is_write)) {
43
+# Author:
47
+ /* When our callers all have attrs we'll pass them through here */
44
+# Thomas Huth <thuth@redhat.com>
48
+ if (!memory_region_access_valid(mr, xlat, l, is_write,
45
+#
49
+ MEMTXATTRS_UNSPECIFIED)) {
46
+# This work is licensed under the terms of the GNU GPL, version 2 or
50
return false;
47
+# later. See the COPYING file in the top-level directory.
51
}
48
+
52
}
49
+import os
53
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
50
+
54
index XXXXXXX..XXXXXXX 100644
51
+from avocado import skipUnless
55
--- a/hw/s390x/s390-pci-inst.c
52
+from avocado_qemu import Test
56
+++ b/hw/s390x/s390-pci-inst.c
53
+from avocado_qemu import wait_for_console_pattern
57
@@ -XXX,XX +XXX,XX @@ int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr,
54
+
58
mr = s390_get_subregion(mr, offset, len);
55
+class N8x0Machine(Test):
59
offset -= mr->addr;
56
+ """Boots the Linux kernel and checks that the console is operational"""
60
57
+
61
- if (!memory_region_access_valid(mr, offset, len, true)) {
58
+ timeout = 90
62
+ if (!memory_region_access_valid(mr, offset, len, true,
59
+
63
+ MEMTXATTRS_UNSPECIFIED)) {
60
+ def __do_test_n8x0(self):
64
s390_program_interrupt(env, PGM_OPERAND, 6, ra);
61
+ kernel_url = ('http://stskeeps.subnetmask.net/meego-n8x0/'
65
return 0;
62
+ 'meego-arm-n8x0-1.0.80.20100712.1431-'
66
}
63
+ 'vmlinuz-2.6.35~rc4-129.1-n8x0')
67
diff --git a/memory.c b/memory.c
64
+ kernel_hash = 'e9d5ab8d7548923a0061b6fbf601465e479ed269'
68
index XXXXXXX..XXXXXXX 100644
65
+ kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
69
--- a/memory.c
66
+
70
+++ b/memory.c
67
+ self.vm.set_console(console_index=1)
71
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps ram_device_mem_ops = {
68
+ self.vm.add_args('-kernel', kernel_path,
72
bool memory_region_access_valid(MemoryRegion *mr,
69
+ '-append', 'printk.time=0 console=ttyS1')
73
hwaddr addr,
70
+ self.vm.launch()
74
unsigned size,
71
+ wait_for_console_pattern(self, 'TSC2005 driver initializing')
75
- bool is_write)
72
+
76
+ bool is_write,
73
+ @skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code')
77
+ MemTxAttrs attrs)
74
+ def test_n800(self):
78
{
75
+ """
79
int access_size_min, access_size_max;
76
+ :avocado: tags=arch:arm
80
int access_size, i;
77
+ :avocado: tags=machine:n800
81
@@ -XXX,XX +XXX,XX @@ MemTxResult memory_region_dispatch_read(MemoryRegion *mr,
78
+ """
82
{
79
+ self.__do_test_n8x0()
83
MemTxResult r;
80
+
84
81
+ @skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code')
85
- if (!memory_region_access_valid(mr, addr, size, false)) {
82
+ def test_n810(self):
86
+ if (!memory_region_access_valid(mr, addr, size, false, attrs)) {
83
+ """
87
*pval = unassigned_mem_read(mr, addr, size);
84
+ :avocado: tags=arch:arm
88
return MEMTX_DECODE_ERROR;
85
+ :avocado: tags=machine:n810
89
}
86
+ """
90
@@ -XXX,XX +XXX,XX @@ MemTxResult memory_region_dispatch_write(MemoryRegion *mr,
87
+ self.__do_test_n8x0()
91
unsigned size,
92
MemTxAttrs attrs)
93
{
94
- if (!memory_region_access_valid(mr, addr, size, true)) {
95
+ if (!memory_region_access_valid(mr, addr, size, true, attrs)) {
96
unassigned_mem_write(mr, addr, data, size);
97
return MEMTX_DECODE_ERROR;
98
}
99
--
88
--
100
2.17.1
89
2.20.1
101
90
102
91
diff view generated by jsdifflib
1
Add entries to MAINTAINERS to cover the newer MPS2 boards and
1
From: Thomas Huth <thuth@redhat.com>
2
the new devices they use.
3
2
3
There is a kernel and initrd available on github which we can use
4
for testing this machine.
5
6
Signed-off-by: Thomas Huth <thuth@redhat.com>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Wainer dos Santos Moschetta <wainersm@redhat.com>
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20200225172501.29609-3-philmd@redhat.com
12
Message-Id: <20200131170233.14584-1-thuth@redhat.com>
13
[PMD: Renamed test method, moved description from class to method]
14
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20180518153157.14899-1-peter.maydell@linaro.org
6
---
16
---
7
MAINTAINERS | 9 +++++++--
17
MAINTAINERS | 1 +
8
1 file changed, 7 insertions(+), 2 deletions(-)
18
tests/acceptance/machine_arm_integratorcp.py | 43 ++++++++++++++++++++
19
2 files changed, 44 insertions(+)
20
create mode 100644 tests/acceptance/machine_arm_integratorcp.py
9
21
10
diff --git a/MAINTAINERS b/MAINTAINERS
22
diff --git a/MAINTAINERS b/MAINTAINERS
11
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
12
--- a/MAINTAINERS
24
--- a/MAINTAINERS
13
+++ b/MAINTAINERS
25
+++ b/MAINTAINERS
14
@@ -XXX,XX +XXX,XX @@ F: hw/timer/cmsdk-apb-timer.c
26
@@ -XXX,XX +XXX,XX @@ S: Maintained
15
F: include/hw/timer/cmsdk-apb-timer.h
27
F: hw/arm/integratorcp.c
16
F: hw/char/cmsdk-apb-uart.c
28
F: hw/misc/arm_integrator_debug.c
17
F: include/hw/char/cmsdk-apb-uart.h
29
F: include/hw/misc/arm_integrator_debug.h
18
+F: hw/misc/tz-ppc.c
30
+F: tests/acceptance/machine_arm_integratorcp.py
19
+F: include/hw/misc/tz-ppc.h
31
20
32
MCIMX6UL EVK / i.MX6ul
21
ARM cores
22
M: Peter Maydell <peter.maydell@linaro.org>
33
M: Peter Maydell <peter.maydell@linaro.org>
23
@@ -XXX,XX +XXX,XX @@ M: Peter Maydell <peter.maydell@linaro.org>
34
diff --git a/tests/acceptance/machine_arm_integratorcp.py b/tests/acceptance/machine_arm_integratorcp.py
24
L: qemu-arm@nongnu.org
35
new file mode 100644
25
S: Maintained
36
index XXXXXXX..XXXXXXX
26
F: hw/arm/mps2.c
37
--- /dev/null
27
-F: hw/misc/mps2-scc.c
38
+++ b/tests/acceptance/machine_arm_integratorcp.py
28
-F: include/hw/misc/mps2-scc.h
39
@@ -XXX,XX +XXX,XX @@
29
+F: hw/arm/mps2-tz.c
40
+# Functional test that boots a Linux kernel and checks the console
30
+F: hw/misc/mps2-*.c
41
+#
31
+F: include/hw/misc/mps2-*.h
42
+# Copyright (c) 2020 Red Hat, Inc.
32
+F: hw/arm/iotkit.c
43
+#
33
+F: include/hw/arm/iotkit.h
44
+# Author:
34
45
+# Thomas Huth <thuth@redhat.com>
35
Musicpal
46
+#
36
M: Jan Kiszka <jan.kiszka@web.de>
47
+# This work is licensed under the terms of the GNU GPL, version 2 or
48
+# later. See the COPYING file in the top-level directory.
49
+
50
+import os
51
+
52
+from avocado import skipUnless
53
+from avocado_qemu import Test
54
+from avocado_qemu import wait_for_console_pattern
55
+
56
+class IntegratorMachine(Test):
57
+
58
+ timeout = 90
59
+
60
+ @skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code')
61
+ def test_integratorcp_console(self):
62
+ """
63
+ Boots the Linux kernel and checks that the console is operational
64
+ :avocado: tags=arch:arm
65
+ :avocado: tags=machine:integratorcp
66
+ """
67
+ kernel_url = ('https://github.com/zayac/qemu-arm/raw/master/'
68
+ 'arm-test/kernel/zImage.integrator')
69
+ kernel_hash = '0d7adba893c503267c946a3cbdc63b4b54f25468'
70
+ kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
71
+
72
+ initrd_url = ('https://github.com/zayac/qemu-arm/raw/master/'
73
+ 'arm-test/kernel/arm_root.img')
74
+ initrd_hash = 'b51e4154285bf784e017a37586428332d8c7bd8b'
75
+ initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
76
+
77
+ self.vm.set_console()
78
+ self.vm.add_args('-kernel', kernel_path,
79
+ '-initrd', initrd_path,
80
+ '-append', 'printk.time=0 console=ttyAMA0')
81
+ self.vm.launch()
82
+ wait_for_console_pattern(self, 'Log in as root')
37
--
83
--
38
2.17.1
84
2.20.1
39
85
40
86
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
add MemTxAttrs as an argument to flatview_extend_translation().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
As we want to re-use this code, extract it as a new function.
4
Since we are using the PL011 serial console, add a Avocado tag
5
to ease filtering of tests.
6
7
Reviewed-by: Thomas Huth <thuth@redhat.com>
8
Reviewed-by: Wainer dos Santos Moschetta <wainersm@redhat.com>
9
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20200225172501.29609-4-philmd@redhat.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-7-peter.maydell@linaro.org
10
---
12
---
11
exec.c | 15 ++++++++++-----
13
tests/acceptance/machine_arm_integratorcp.py | 18 +++++++++++-------
12
1 file changed, 10 insertions(+), 5 deletions(-)
14
1 file changed, 11 insertions(+), 7 deletions(-)
13
15
14
diff --git a/exec.c b/exec.c
16
diff --git a/tests/acceptance/machine_arm_integratorcp.py b/tests/acceptance/machine_arm_integratorcp.py
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
18
--- a/tests/acceptance/machine_arm_integratorcp.py
17
+++ b/exec.c
19
+++ b/tests/acceptance/machine_arm_integratorcp.py
18
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
20
@@ -XXX,XX +XXX,XX @@ class IntegratorMachine(Test):
19
21
20
static hwaddr
22
timeout = 90
21
flatview_extend_translation(FlatView *fv, hwaddr addr,
23
22
- hwaddr target_len,
24
- @skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code')
23
- MemoryRegion *mr, hwaddr base, hwaddr len,
25
- def test_integratorcp_console(self):
24
- bool is_write)
26
- """
25
+ hwaddr target_len,
27
- Boots the Linux kernel and checks that the console is operational
26
+ MemoryRegion *mr, hwaddr base, hwaddr len,
28
- :avocado: tags=arch:arm
27
+ bool is_write, MemTxAttrs attrs)
29
- :avocado: tags=machine:integratorcp
28
{
30
- """
29
hwaddr done = 0;
31
+ def boot_integratorcp(self):
30
hwaddr xlat;
32
kernel_url = ('https://github.com/zayac/qemu-arm/raw/master/'
31
@@ -XXX,XX +XXX,XX @@ void *address_space_map(AddressSpace *as,
33
'arm-test/kernel/zImage.integrator')
32
34
kernel_hash = '0d7adba893c503267c946a3cbdc63b4b54f25468'
33
memory_region_ref(mr);
35
@@ -XXX,XX +XXX,XX @@ class IntegratorMachine(Test):
34
*plen = flatview_extend_translation(fv, addr, len, mr, xlat,
36
'-initrd', initrd_path,
35
- l, is_write);
37
'-append', 'printk.time=0 console=ttyAMA0')
36
+ l, is_write, attrs);
38
self.vm.launch()
37
ptr = qemu_ram_ptr_length(mr->ram_block, xlat, plen, true);
39
+
38
rcu_read_unlock();
40
+ @skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code')
39
41
+ def test_integratorcp_console(self):
40
@@ -XXX,XX +XXX,XX @@ int64_t address_space_cache_init(MemoryRegionCache *cache,
42
+ """
41
mr = cache->mrs.mr;
43
+ Boots the Linux kernel and checks that the console is operational
42
memory_region_ref(mr);
44
+ :avocado: tags=arch:arm
43
if (memory_access_is_direct(mr, is_write)) {
45
+ :avocado: tags=machine:integratorcp
44
+ /* We don't care about the memory attributes here as we're only
46
+ :avocado: tags=device:pl011
45
+ * doing this if we found actual RAM, which behaves the same
47
+ """
46
+ * regardless of attributes; so UNSPECIFIED is fine.
48
+ self.boot_integratorcp()
47
+ */
49
wait_for_console_pattern(self, 'Log in as root')
48
l = flatview_extend_translation(cache->fv, addr, len, mr,
49
- cache->xlat, l, is_write);
50
+ cache->xlat, l, is_write,
51
+ MEMTXATTRS_UNSPECIFIED);
52
cache->ptr = qemu_ram_ptr_length(mr->ram_block, cache->xlat, &l, true);
53
} else {
54
cache->ptr = NULL;
55
--
50
--
56
2.17.1
51
2.20.1
57
52
58
53
diff view generated by jsdifflib
1
From: Paolo Bonzini <pbonzini@redhat.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
cpregs_keys is an uint32_t* so the allocation should use uint32_t.
3
Add a test that verifies the Tux logo is displayed on the framebuffer.
4
g_new is even better because it is type-safe.
5
4
6
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
5
We simply follow the OpenCV "Template Matching with Multiple Objects"
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
tutorial, replacing Lionel Messi by Tux:
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
https://docs.opencv.org/4.2.0/d4/dc6/tutorial_py_template_matching.html
8
9
When OpenCV and NumPy are installed, this test can be run using:
10
11
$ AVOCADO_ALLOW_UNTRUSTED_CODE=hmmm \
12
avocado --show=app,framebuffer run -t device:framebuffer \
13
tests/acceptance/machine_arm_integratorcp.py
14
JOB ID : 8c46b0f8269242e87d738247883ea2a470df949e
15
JOB LOG : avocado/job-results/job-2020-01-31T21.38-8c46b0f/job.log
16
(1/1) tests/acceptance/machine_arm_integratorcp.py:IntegratorMachine.test_framebuffer_tux_logo:
17
framebuffer: found Tux at position [x, y] = (0, 0)
18
PASS (3.96 s)
19
RESULTS : PASS 1 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0 | CANCEL 0
20
JOB TIME : 4.23 s
21
22
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
23
Reviewed-by: Wainer dos Santos Moschetta <wainersm@redhat.com>
24
Message-id: 20200225172501.29609-5-philmd@redhat.com
25
Message-Id: <20200131211102.29612-3-f4bug@amsat.org>
26
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
28
---
11
target/arm/gdbstub.c | 3 +--
29
tests/acceptance/machine_arm_integratorcp.py | 52 ++++++++++++++++++++
12
1 file changed, 1 insertion(+), 2 deletions(-)
30
1 file changed, 52 insertions(+)
13
31
14
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
32
diff --git a/tests/acceptance/machine_arm_integratorcp.py b/tests/acceptance/machine_arm_integratorcp.py
15
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/gdbstub.c
34
--- a/tests/acceptance/machine_arm_integratorcp.py
17
+++ b/target/arm/gdbstub.c
35
+++ b/tests/acceptance/machine_arm_integratorcp.py
18
@@ -XXX,XX +XXX,XX @@ int arm_gen_dynamic_xml(CPUState *cs)
36
@@ -XXX,XX +XXX,XX @@
19
RegisterSysregXmlParam param = {cs, s};
37
# later. See the COPYING file in the top-level directory.
20
38
21
cpu->dyn_xml.num_cpregs = 0;
39
import os
22
- cpu->dyn_xml.cpregs_keys = g_malloc(sizeof(uint32_t *) *
40
+import logging
23
- g_hash_table_size(cpu->cp_regs));
41
24
+ cpu->dyn_xml.cpregs_keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs));
42
from avocado import skipUnless
25
g_string_printf(s, "<?xml version=\"1.0\"?>");
43
from avocado_qemu import Test
26
g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
44
from avocado_qemu import wait_for_console_pattern
27
g_string_append_printf(s, "<feature name=\"org.qemu.gdb.arm.sys.regs\">");
45
46
+
47
+NUMPY_AVAILABLE = True
48
+try:
49
+ import numpy as np
50
+except ImportError:
51
+ NUMPY_AVAILABLE = False
52
+
53
+CV2_AVAILABLE = True
54
+try:
55
+ import cv2
56
+except ImportError:
57
+ CV2_AVAILABLE = False
58
+
59
+
60
class IntegratorMachine(Test):
61
62
timeout = 90
63
@@ -XXX,XX +XXX,XX @@ class IntegratorMachine(Test):
64
"""
65
self.boot_integratorcp()
66
wait_for_console_pattern(self, 'Log in as root')
67
+
68
+ @skipUnless(NUMPY_AVAILABLE, 'Python NumPy not installed')
69
+ @skipUnless(CV2_AVAILABLE, 'Python OpenCV not installed')
70
+ @skipUnless(os.getenv('AVOCADO_ALLOW_UNTRUSTED_CODE'), 'untrusted code')
71
+ def test_framebuffer_tux_logo(self):
72
+ """
73
+ Boot Linux and verify the Tux logo is displayed on the framebuffer.
74
+ :avocado: tags=arch:arm
75
+ :avocado: tags=machine:integratorcp
76
+ :avocado: tags=device:pl110
77
+ :avocado: tags=device:framebuffer
78
+ """
79
+ screendump_path = os.path.join(self.workdir, "screendump.pbm")
80
+ tuxlogo_url = ('https://github.com/torvalds/linux/raw/v2.6.12/'
81
+ 'drivers/video/logo/logo_linux_vga16.ppm')
82
+ tuxlogo_hash = '3991c2ddbd1ddaecda7601f8aafbcf5b02dc86af'
83
+ tuxlogo_path = self.fetch_asset(tuxlogo_url, asset_hash=tuxlogo_hash)
84
+
85
+ self.boot_integratorcp()
86
+ framebuffer_ready = 'Console: switching to colour frame buffer device'
87
+ wait_for_console_pattern(self, framebuffer_ready)
88
+ self.vm.command('human-monitor-command', command_line='stop')
89
+ self.vm.command('human-monitor-command',
90
+ command_line='screendump %s' % screendump_path)
91
+ logger = logging.getLogger('framebuffer')
92
+
93
+ cpu_count = 1
94
+ match_threshold = 0.92
95
+ screendump_bgr = cv2.imread(screendump_path)
96
+ screendump_gray = cv2.cvtColor(screendump_bgr, cv2.COLOR_BGR2GRAY)
97
+ result = cv2.matchTemplate(screendump_gray, cv2.imread(tuxlogo_path, 0),
98
+ cv2.TM_CCOEFF_NORMED)
99
+ loc = np.where(result >= match_threshold)
100
+ tux_count = 0
101
+ for tux_count, pt in enumerate(zip(*loc[::-1]), start=1):
102
+ logger.debug('found Tux at position [x, y] = %s', pt)
103
+ self.assertGreaterEqual(tux_count, cpu_count)
28
--
104
--
29
2.17.1
105
2.20.1
30
106
31
107
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
We missed an instance of using FIELD_EX32 on a 64-bit ID
2
add MemTxAttrs as an argument to the MemoryRegion valid.accepts
2
register, in isar_feature_aa64_pmu_8_4(). Fix it.
3
callback. We'll need this for subpage_accepts().
4
5
We could take the approach we used with the read and write
6
callbacks and add new a new _with_attrs version, but since there
7
are so few implementations of the accepts hook we just change
8
them all.
9
3
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20180521140402.23318-9-peter.maydell@linaro.org
7
Message-id: 20200224172846.13053-2-peter.maydell@linaro.org
14
---
8
---
15
include/exec/memory.h | 3 ++-
9
target/arm/cpu.h | 4 ++--
16
exec.c | 9 ++++++---
10
1 file changed, 2 insertions(+), 2 deletions(-)
17
hw/hppa/dino.c | 3 ++-
18
hw/nvram/fw_cfg.c | 12 ++++++++----
19
hw/scsi/esp.c | 3 ++-
20
hw/xen/xen_pt_msi.c | 3 ++-
21
memory.c | 5 +++--
22
7 files changed, 25 insertions(+), 13 deletions(-)
23
11
24
diff --git a/include/exec/memory.h b/include/exec/memory.h
12
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
25
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory.h
14
--- a/target/arm/cpu.h
27
+++ b/include/exec/memory.h
15
+++ b/target/arm/cpu.h
28
@@ -XXX,XX +XXX,XX @@ struct MemoryRegionOps {
16
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_pmu_8_1(const ARMISARegisters *id)
29
* as a machine check exception).
17
30
*/
18
static inline bool isar_feature_aa64_pmu_8_4(const ARMISARegisters *id)
31
bool (*accepts)(void *opaque, hwaddr addr,
19
{
32
- unsigned size, bool is_write);
20
- return FIELD_EX32(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) >= 5 &&
33
+ unsigned size, bool is_write,
21
- FIELD_EX32(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) != 0xf;
34
+ MemTxAttrs attrs);
22
+ return FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) >= 5 &&
35
} valid;
23
+ FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) != 0xf;
36
/* Internal implementation constraints: */
37
struct {
38
diff --git a/exec.c b/exec.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/exec.c
41
+++ b/exec.c
42
@@ -XXX,XX +XXX,XX @@ static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
43
}
24
}
44
25
45
static bool notdirty_mem_accepts(void *opaque, hwaddr addr,
26
/*
46
- unsigned size, bool is_write)
47
+ unsigned size, bool is_write,
48
+ MemTxAttrs attrs)
49
{
50
return is_write;
51
}
52
@@ -XXX,XX +XXX,XX @@ static MemTxResult subpage_write(void *opaque, hwaddr addr,
53
}
54
55
static bool subpage_accepts(void *opaque, hwaddr addr,
56
- unsigned len, bool is_write)
57
+ unsigned len, bool is_write,
58
+ MemTxAttrs attrs)
59
{
60
subpage_t *subpage = opaque;
61
#if defined(DEBUG_SUBPAGE)
62
@@ -XXX,XX +XXX,XX @@ static void readonly_mem_write(void *opaque, hwaddr addr,
63
}
64
65
static bool readonly_mem_accepts(void *opaque, hwaddr addr,
66
- unsigned size, bool is_write)
67
+ unsigned size, bool is_write,
68
+ MemTxAttrs attrs)
69
{
70
return is_write;
71
}
72
diff --git a/hw/hppa/dino.c b/hw/hppa/dino.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/hppa/dino.c
75
+++ b/hw/hppa/dino.c
76
@@ -XXX,XX +XXX,XX @@ static void gsc_to_pci_forwarding(DinoState *s)
77
}
78
79
static bool dino_chip_mem_valid(void *opaque, hwaddr addr,
80
- unsigned size, bool is_write)
81
+ unsigned size, bool is_write,
82
+ MemTxAttrs attrs)
83
{
84
switch (addr) {
85
case DINO_IAR0:
86
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/hw/nvram/fw_cfg.c
89
+++ b/hw/nvram/fw_cfg.c
90
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_dma_mem_write(void *opaque, hwaddr addr,
91
}
92
93
static bool fw_cfg_dma_mem_valid(void *opaque, hwaddr addr,
94
- unsigned size, bool is_write)
95
+ unsigned size, bool is_write,
96
+ MemTxAttrs attrs)
97
{
98
return !is_write || ((size == 4 && (addr == 0 || addr == 4)) ||
99
(size == 8 && addr == 0));
100
}
101
102
static bool fw_cfg_data_mem_valid(void *opaque, hwaddr addr,
103
- unsigned size, bool is_write)
104
+ unsigned size, bool is_write,
105
+ MemTxAttrs attrs)
106
{
107
return addr == 0;
108
}
109
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_ctl_mem_write(void *opaque, hwaddr addr,
110
}
111
112
static bool fw_cfg_ctl_mem_valid(void *opaque, hwaddr addr,
113
- unsigned size, bool is_write)
114
+ unsigned size, bool is_write,
115
+ MemTxAttrs attrs)
116
{
117
return is_write && size == 2;
118
}
119
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_comb_write(void *opaque, hwaddr addr,
120
}
121
122
static bool fw_cfg_comb_valid(void *opaque, hwaddr addr,
123
- unsigned size, bool is_write)
124
+ unsigned size, bool is_write,
125
+ MemTxAttrs attrs)
126
{
127
return (size == 1) || (is_write && size == 2);
128
}
129
diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
130
index XXXXXXX..XXXXXXX 100644
131
--- a/hw/scsi/esp.c
132
+++ b/hw/scsi/esp.c
133
@@ -XXX,XX +XXX,XX @@ void esp_reg_write(ESPState *s, uint32_t saddr, uint64_t val)
134
}
135
136
static bool esp_mem_accepts(void *opaque, hwaddr addr,
137
- unsigned size, bool is_write)
138
+ unsigned size, bool is_write,
139
+ MemTxAttrs attrs)
140
{
141
return (size == 1) || (is_write && size == 4);
142
}
143
diff --git a/hw/xen/xen_pt_msi.c b/hw/xen/xen_pt_msi.c
144
index XXXXXXX..XXXXXXX 100644
145
--- a/hw/xen/xen_pt_msi.c
146
+++ b/hw/xen/xen_pt_msi.c
147
@@ -XXX,XX +XXX,XX @@ static uint64_t pci_msix_read(void *opaque, hwaddr addr,
148
}
149
150
static bool pci_msix_accepts(void *opaque, hwaddr addr,
151
- unsigned size, bool is_write)
152
+ unsigned size, bool is_write,
153
+ MemTxAttrs attrs)
154
{
155
return !(addr & (size - 1));
156
}
157
diff --git a/memory.c b/memory.c
158
index XXXXXXX..XXXXXXX 100644
159
--- a/memory.c
160
+++ b/memory.c
161
@@ -XXX,XX +XXX,XX @@ static void unassigned_mem_write(void *opaque, hwaddr addr,
162
}
163
164
static bool unassigned_mem_accepts(void *opaque, hwaddr addr,
165
- unsigned size, bool is_write)
166
+ unsigned size, bool is_write,
167
+ MemTxAttrs attrs)
168
{
169
return false;
170
}
171
@@ -XXX,XX +XXX,XX @@ bool memory_region_access_valid(MemoryRegion *mr,
172
access_size = MAX(MIN(size, access_size_max), access_size_min);
173
for (i = 0; i < size; i += access_size) {
174
if (!mr->ops->valid.accepts(mr->opaque, addr + i, access_size,
175
- is_write)) {
176
+ is_write, attrs)) {
177
return false;
178
}
179
}
180
--
27
--
181
2.17.1
28
2.20.1
182
29
183
30
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
The v8.3-RCPC extension implements three new load instructions
2
add MemTxAttrs as an argument to address_space_translate()
2
which provide slightly weaker consistency guarantees than the
3
and address_space_translate_cached(). Callers either have an
3
existing load-acquire operations. For QEMU we choose to simply
4
attrs value to hand, or don't care and can use MEMTXATTRS_UNSPECIFIED.
4
implement them with a full LDAQ barrier.
5
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-4-peter.maydell@linaro.org
8
Message-id: 20200224172846.13053-3-peter.maydell@linaro.org
10
---
9
---
11
include/exec/memory.h | 4 +++-
10
target/arm/cpu.h | 5 +++++
12
accel/tcg/translate-all.c | 2 +-
11
linux-user/elfload.c | 1 +
13
exec.c | 14 +++++++++-----
12
target/arm/cpu64.c | 1 +
14
hw/vfio/common.c | 3 ++-
13
target/arm/translate-a64.c | 24 ++++++++++++++++++++++++
15
memory_ldst.inc.c | 18 +++++++++---------
14
4 files changed, 31 insertions(+)
16
target/riscv/helper.c | 2 +-
17
6 files changed, 25 insertions(+), 18 deletions(-)
18
15
19
diff --git a/include/exec/memory.h b/include/exec/memory.h
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
20
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
21
--- a/include/exec/memory.h
18
--- a/target/arm/cpu.h
22
+++ b/include/exec/memory.h
19
+++ b/target/arm/cpu.h
23
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
20
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_pmu_8_4(const ARMISARegisters *id)
24
* #MemoryRegion.
21
FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) != 0xf;
25
* @len: pointer to length
22
}
26
* @is_write: indicates the transfer direction
23
27
+ * @attrs: memory attributes
24
+static inline bool isar_feature_aa64_rcpc_8_3(const ARMISARegisters *id)
25
+{
26
+ return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, LRCPC) != 0;
27
+}
28
+
29
/*
30
* Feature tests for "does this exist in either 32-bit or 64-bit?"
28
*/
31
*/
29
MemoryRegion *flatview_translate(FlatView *fv,
32
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
30
hwaddr addr, hwaddr *xlat,
31
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv,
32
33
static inline MemoryRegion *address_space_translate(AddressSpace *as,
34
hwaddr addr, hwaddr *xlat,
35
- hwaddr *len, bool is_write)
36
+ hwaddr *len, bool is_write,
37
+ MemTxAttrs attrs)
38
{
39
return flatview_translate(address_space_to_flatview(as),
40
addr, xlat, len, is_write);
41
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
42
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
43
--- a/accel/tcg/translate-all.c
34
--- a/linux-user/elfload.c
44
+++ b/accel/tcg/translate-all.c
35
+++ b/linux-user/elfload.c
45
@@ -XXX,XX +XXX,XX @@ void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs)
36
@@ -XXX,XX +XXX,XX @@ static uint32_t get_elf_hwcap(void)
46
hwaddr l = 1;
37
GET_FEATURE_ID(aa64_sb, ARM_HWCAP_A64_SB);
47
38
GET_FEATURE_ID(aa64_condm_4, ARM_HWCAP_A64_FLAGM);
48
rcu_read_lock();
39
GET_FEATURE_ID(aa64_dcpop, ARM_HWCAP_A64_DCPOP);
49
- mr = address_space_translate(as, addr, &addr, &l, false);
40
+ GET_FEATURE_ID(aa64_rcpc_8_3, ARM_HWCAP_A64_LRCPC);
50
+ mr = address_space_translate(as, addr, &addr, &l, false, attrs);
41
51
if (!(memory_region_is_ram(mr)
42
return hwcaps;
52
|| memory_region_is_romd(mr))) {
43
}
53
rcu_read_unlock();
44
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
54
diff --git a/exec.c b/exec.c
55
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
56
--- a/exec.c
46
--- a/target/arm/cpu64.c
57
+++ b/exec.c
47
+++ b/target/arm/cpu64.c
58
@@ -XXX,XX +XXX,XX @@ static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
48
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
59
rcu_read_lock();
49
t = FIELD_DP64(t, ID_AA64ISAR1, SB, 1);
60
while (len > 0) {
50
t = FIELD_DP64(t, ID_AA64ISAR1, SPECRES, 1);
61
l = len;
51
t = FIELD_DP64(t, ID_AA64ISAR1, FRINTTS, 1);
62
- mr = address_space_translate(as, addr, &addr1, &l, true);
52
+ t = FIELD_DP64(t, ID_AA64ISAR1, LRCPC, 1); /* ARMv8.3-RCPC */
63
+ mr = address_space_translate(as, addr, &addr1, &l, true,
53
cpu->isar.id_aa64isar1 = t;
64
+ MEMTXATTRS_UNSPECIFIED);
54
65
55
t = cpu->isar.id_aa64pfr0;
66
if (!(memory_region_is_ram(mr) ||
56
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
67
memory_region_is_romd(mr))) {
68
@@ -XXX,XX +XXX,XX @@ void address_space_cache_destroy(MemoryRegionCache *cache)
69
*/
70
static inline MemoryRegion *address_space_translate_cached(
71
MemoryRegionCache *cache, hwaddr addr, hwaddr *xlat,
72
- hwaddr *plen, bool is_write)
73
+ hwaddr *plen, bool is_write, MemTxAttrs attrs)
74
{
75
MemoryRegionSection section;
76
MemoryRegion *mr;
77
@@ -XXX,XX +XXX,XX @@ address_space_read_cached_slow(MemoryRegionCache *cache, hwaddr addr,
78
MemoryRegion *mr;
79
80
l = len;
81
- mr = address_space_translate_cached(cache, addr, &addr1, &l, false);
82
+ mr = address_space_translate_cached(cache, addr, &addr1, &l, false,
83
+ MEMTXATTRS_UNSPECIFIED);
84
flatview_read_continue(cache->fv,
85
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
86
addr1, l, mr);
87
@@ -XXX,XX +XXX,XX @@ address_space_write_cached_slow(MemoryRegionCache *cache, hwaddr addr,
88
MemoryRegion *mr;
89
90
l = len;
91
- mr = address_space_translate_cached(cache, addr, &addr1, &l, true);
92
+ mr = address_space_translate_cached(cache, addr, &addr1, &l, true,
93
+ MEMTXATTRS_UNSPECIFIED);
94
flatview_write_continue(cache->fv,
95
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
96
addr1, l, mr);
97
@@ -XXX,XX +XXX,XX @@ bool cpu_physical_memory_is_io(hwaddr phys_addr)
98
99
rcu_read_lock();
100
mr = address_space_translate(&address_space_memory,
101
- phys_addr, &phys_addr, &l, false);
102
+ phys_addr, &phys_addr, &l, false,
103
+ MEMTXATTRS_UNSPECIFIED);
104
105
res = !(memory_region_is_ram(mr) || memory_region_is_romd(mr));
106
rcu_read_unlock();
107
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
108
index XXXXXXX..XXXXXXX 100644
57
index XXXXXXX..XXXXXXX 100644
109
--- a/hw/vfio/common.c
58
--- a/target/arm/translate-a64.c
110
+++ b/hw/vfio/common.c
59
+++ b/target/arm/translate-a64.c
111
@@ -XXX,XX +XXX,XX @@ static bool vfio_get_vaddr(IOMMUTLBEntry *iotlb, void **vaddr,
60
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_atomic(DisasContext *s, uint32_t insn,
112
*/
61
int rs = extract32(insn, 16, 5);
113
mr = address_space_translate(&address_space_memory,
62
int rn = extract32(insn, 5, 5);
114
iotlb->translated_addr,
63
int o3_opc = extract32(insn, 12, 4);
115
- &xlat, &len, writable);
64
+ bool r = extract32(insn, 22, 1);
116
+ &xlat, &len, writable,
65
+ bool a = extract32(insn, 23, 1);
117
+ MEMTXATTRS_UNSPECIFIED);
66
TCGv_i64 tcg_rs, clean_addr;
118
if (!memory_region_is_ram(mr)) {
67
AtomicThreeOpFn *fn;
119
error_report("iommu map to non memory area %"HWADDR_PRIx"",
68
120
xlat);
69
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_atomic(DisasContext *s, uint32_t insn,
121
diff --git a/memory_ldst.inc.c b/memory_ldst.inc.c
70
case 010: /* SWP */
122
index XXXXXXX..XXXXXXX 100644
71
fn = tcg_gen_atomic_xchg_i64;
123
--- a/memory_ldst.inc.c
72
break;
124
+++ b/memory_ldst.inc.c
73
+ case 014: /* LDAPR, LDAPRH, LDAPRB */
125
@@ -XXX,XX +XXX,XX @@ static inline uint32_t glue(address_space_ldl_internal, SUFFIX)(ARG1_DECL,
74
+ if (!dc_isar_feature(aa64_rcpc_8_3, s) ||
126
bool release_lock = false;
75
+ rs != 31 || a != 1 || r != 0) {
127
76
+ unallocated_encoding(s);
128
RCU_READ_LOCK();
77
+ return;
129
- mr = TRANSLATE(addr, &addr1, &l, false);
78
+ }
130
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
79
+ break;
131
if (l < 4 || !IS_DIRECT(mr, false)) {
80
default:
132
release_lock |= prepare_mmio_access(mr);
81
unallocated_encoding(s);
133
82
return;
134
@@ -XXX,XX +XXX,XX @@ static inline uint64_t glue(address_space_ldq_internal, SUFFIX)(ARG1_DECL,
83
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_atomic(DisasContext *s, uint32_t insn,
135
bool release_lock = false;
84
gen_check_sp_alignment(s);
136
85
}
137
RCU_READ_LOCK();
86
clean_addr = clean_data_tbi(s, cpu_reg_sp(s, rn));
138
- mr = TRANSLATE(addr, &addr1, &l, false);
87
+
139
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
88
+ if (o3_opc == 014) {
140
if (l < 8 || !IS_DIRECT(mr, false)) {
89
+ /*
141
release_lock |= prepare_mmio_access(mr);
90
+ * LDAPR* are a special case because they are a simple load, not a
142
91
+ * fetch-and-do-something op.
143
@@ -XXX,XX +XXX,XX @@ uint32_t glue(address_space_ldub, SUFFIX)(ARG1_DECL,
92
+ * The architectural consistency requirements here are weaker than
144
bool release_lock = false;
93
+ * full load-acquire (we only need "load-acquire processor consistent"),
145
94
+ * but we choose to implement them as full LDAQ.
146
RCU_READ_LOCK();
95
+ */
147
- mr = TRANSLATE(addr, &addr1, &l, false);
96
+ do_gpr_ld(s, cpu_reg(s, rt), clean_addr, size, false, false,
148
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
97
+ true, rt, disas_ldst_compute_iss_sf(size, false, 0), true);
149
if (!IS_DIRECT(mr, false)) {
98
+ tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ);
150
release_lock |= prepare_mmio_access(mr);
99
+ return;
151
100
+ }
152
@@ -XXX,XX +XXX,XX @@ static inline uint32_t glue(address_space_lduw_internal, SUFFIX)(ARG1_DECL,
101
+
153
bool release_lock = false;
102
tcg_rs = read_cpu_reg(s, rs, true);
154
103
155
RCU_READ_LOCK();
104
if (o3_opc == 1) { /* LDCLR */
156
- mr = TRANSLATE(addr, &addr1, &l, false);
157
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
158
if (l < 2 || !IS_DIRECT(mr, false)) {
159
release_lock |= prepare_mmio_access(mr);
160
161
@@ -XXX,XX +XXX,XX @@ void glue(address_space_stl_notdirty, SUFFIX)(ARG1_DECL,
162
bool release_lock = false;
163
164
RCU_READ_LOCK();
165
- mr = TRANSLATE(addr, &addr1, &l, true);
166
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
167
if (l < 4 || !IS_DIRECT(mr, true)) {
168
release_lock |= prepare_mmio_access(mr);
169
170
@@ -XXX,XX +XXX,XX @@ static inline void glue(address_space_stl_internal, SUFFIX)(ARG1_DECL,
171
bool release_lock = false;
172
173
RCU_READ_LOCK();
174
- mr = TRANSLATE(addr, &addr1, &l, true);
175
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
176
if (l < 4 || !IS_DIRECT(mr, true)) {
177
release_lock |= prepare_mmio_access(mr);
178
179
@@ -XXX,XX +XXX,XX @@ void glue(address_space_stb, SUFFIX)(ARG1_DECL,
180
bool release_lock = false;
181
182
RCU_READ_LOCK();
183
- mr = TRANSLATE(addr, &addr1, &l, true);
184
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
185
if (!IS_DIRECT(mr, true)) {
186
release_lock |= prepare_mmio_access(mr);
187
r = memory_region_dispatch_write(mr, addr1, val, 1, attrs);
188
@@ -XXX,XX +XXX,XX @@ static inline void glue(address_space_stw_internal, SUFFIX)(ARG1_DECL,
189
bool release_lock = false;
190
191
RCU_READ_LOCK();
192
- mr = TRANSLATE(addr, &addr1, &l, true);
193
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
194
if (l < 2 || !IS_DIRECT(mr, true)) {
195
release_lock |= prepare_mmio_access(mr);
196
197
@@ -XXX,XX +XXX,XX @@ static void glue(address_space_stq_internal, SUFFIX)(ARG1_DECL,
198
bool release_lock = false;
199
200
RCU_READ_LOCK();
201
- mr = TRANSLATE(addr, &addr1, &l, true);
202
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
203
if (l < 8 || !IS_DIRECT(mr, true)) {
204
release_lock |= prepare_mmio_access(mr);
205
206
diff --git a/target/riscv/helper.c b/target/riscv/helper.c
207
index XXXXXXX..XXXXXXX 100644
208
--- a/target/riscv/helper.c
209
+++ b/target/riscv/helper.c
210
@@ -XXX,XX +XXX,XX @@ restart:
211
MemoryRegion *mr;
212
hwaddr l = sizeof(target_ulong), addr1;
213
mr = address_space_translate(cs->as, pte_addr,
214
- &addr1, &l, false);
215
+ &addr1, &l, false, MEMTXATTRS_UNSPECIFIED);
216
if (memory_access_is_direct(mr, true)) {
217
target_ulong *pte_pa =
218
qemu_map_ram_ptr(mr->ram_block, addr1);
219
--
105
--
220
2.17.1
106
2.20.1
221
107
222
108
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
The v8.4-RCPC extension implements some new instructions:
2
add MemTxAttrs as an argument to tb_invalidate_phys_addr().
2
* LDAPUR, LDAPURB, LDAPURH, LDAPRSB, LDAPRSH, LDAPRSW
3
Its callers either have an attrs value to hand, or don't care
3
* STLUR, STLURB, STLURH
4
and can use MEMTXATTRS_UNSPECIFIED.
4
5
These are all in a new subgroup of encodings that sits below the
6
top-level "Loads and Stores" group in the Arm ARM.
7
8
The STLUR* instructions have standard store-release semantics; the
9
LDAPUR* have Load-AcquirePC semantics, but (as with LDAPR*) we choose
10
to implement them as the slightly stronger Load-Acquire.
5
11
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
14
Message-id: 20200224172846.13053-4-peter.maydell@linaro.org
9
Message-id: 20180521140402.23318-3-peter.maydell@linaro.org
10
---
15
---
11
include/exec/exec-all.h | 5 +++--
16
target/arm/cpu.h | 5 +++
12
accel/tcg/translate-all.c | 2 +-
17
linux-user/elfload.c | 1 +
13
exec.c | 2 +-
18
target/arm/cpu64.c | 2 +-
14
target/xtensa/op_helper.c | 3 ++-
19
target/arm/translate-a64.c | 90 ++++++++++++++++++++++++++++++++++++++
15
4 files changed, 7 insertions(+), 5 deletions(-)
20
4 files changed, 97 insertions(+), 1 deletion(-)
16
21
17
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
22
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/exec-all.h
24
--- a/target/arm/cpu.h
20
+++ b/include/exec/exec-all.h
25
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ void tlb_set_page_with_attrs(CPUState *cpu, target_ulong vaddr,
26
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_rcpc_8_3(const ARMISARegisters *id)
22
void tlb_set_page(CPUState *cpu, target_ulong vaddr,
27
return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, LRCPC) != 0;
23
hwaddr paddr, int prot,
24
int mmu_idx, target_ulong size);
25
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr);
26
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs);
27
void probe_write(CPUArchState *env, target_ulong addr, int size, int mmu_idx,
28
uintptr_t retaddr);
29
#else
30
@@ -XXX,XX +XXX,XX @@ static inline void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu,
31
uint16_t idxmap)
32
{
33
}
28
}
34
-static inline void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
29
35
+static inline void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr,
30
+static inline bool isar_feature_aa64_rcpc_8_4(const ARMISARegisters *id)
36
+ MemTxAttrs attrs)
31
+{
37
{
32
+ return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, LRCPC) >= 2;
33
+}
34
+
35
/*
36
* Feature tests for "does this exist in either 32-bit or 64-bit?"
37
*/
38
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/linux-user/elfload.c
41
+++ b/linux-user/elfload.c
42
@@ -XXX,XX +XXX,XX @@ static uint32_t get_elf_hwcap(void)
43
GET_FEATURE_ID(aa64_condm_4, ARM_HWCAP_A64_FLAGM);
44
GET_FEATURE_ID(aa64_dcpop, ARM_HWCAP_A64_DCPOP);
45
GET_FEATURE_ID(aa64_rcpc_8_3, ARM_HWCAP_A64_LRCPC);
46
+ GET_FEATURE_ID(aa64_rcpc_8_4, ARM_HWCAP_A64_ILRCPC);
47
48
return hwcaps;
38
}
49
}
39
#endif
50
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
40
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
41
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
42
--- a/accel/tcg/translate-all.c
52
--- a/target/arm/cpu64.c
43
+++ b/accel/tcg/translate-all.c
53
+++ b/target/arm/cpu64.c
44
@@ -XXX,XX +XXX,XX @@ static TranslationBlock *tb_find_pc(uintptr_t tc_ptr)
54
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
45
}
55
t = FIELD_DP64(t, ID_AA64ISAR1, SB, 1);
46
56
t = FIELD_DP64(t, ID_AA64ISAR1, SPECRES, 1);
47
#if !defined(CONFIG_USER_ONLY)
57
t = FIELD_DP64(t, ID_AA64ISAR1, FRINTTS, 1);
48
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
58
- t = FIELD_DP64(t, ID_AA64ISAR1, LRCPC, 1); /* ARMv8.3-RCPC */
49
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs)
59
+ t = FIELD_DP64(t, ID_AA64ISAR1, LRCPC, 2); /* ARMv8.4-RCPC */
50
{
60
cpu->isar.id_aa64isar1 = t;
51
ram_addr_t ram_addr;
61
52
MemoryRegion *mr;
62
t = cpu->isar.id_aa64pfr0;
53
diff --git a/exec.c b/exec.c
63
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
54
index XXXXXXX..XXXXXXX 100644
64
index XXXXXXX..XXXXXXX 100644
55
--- a/exec.c
65
--- a/target/arm/translate-a64.c
56
+++ b/exec.c
66
+++ b/target/arm/translate-a64.c
57
@@ -XXX,XX +XXX,XX @@ static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
67
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_pac(DisasContext *s, uint32_t insn,
58
if (phys != -1) {
59
/* Locks grabbed by tb_invalidate_phys_addr */
60
tb_invalidate_phys_addr(cpu->cpu_ases[asidx].as,
61
- phys | (pc & ~TARGET_PAGE_MASK));
62
+ phys | (pc & ~TARGET_PAGE_MASK), attrs);
63
}
68
}
64
}
69
}
65
#endif
70
66
diff --git a/target/xtensa/op_helper.c b/target/xtensa/op_helper.c
71
+/*
67
index XXXXXXX..XXXXXXX 100644
72
+ * LDAPR/STLR (unscaled immediate)
68
--- a/target/xtensa/op_helper.c
73
+ *
69
+++ b/target/xtensa/op_helper.c
74
+ * 31 30 24 22 21 12 10 5 0
70
@@ -XXX,XX +XXX,XX @@ static void tb_invalidate_virtual_addr(CPUXtensaState *env, uint32_t vaddr)
75
+ * +------+-------------+-----+---+--------+-----+----+-----+
71
int ret = xtensa_get_physical_addr(env, false, vaddr, 2, 0,
76
+ * | size | 0 1 1 0 0 1 | opc | 0 | imm9 | 0 0 | Rn | Rt |
72
&paddr, &page_size, &access);
77
+ * +------+-------------+-----+---+--------+-----+----+-----+
73
if (ret == 0) {
78
+ *
74
- tb_invalidate_phys_addr(&address_space_memory, paddr);
79
+ * Rt: source or destination register
75
+ tb_invalidate_phys_addr(&address_space_memory, paddr,
80
+ * Rn: base register
76
+ MEMTXATTRS_UNSPECIFIED);
81
+ * imm9: unscaled immediate offset
77
}
82
+ * opc: 00: STLUR*, 01/10/11: various LDAPUR*
78
}
83
+ * size: size of load/store
79
84
+ */
85
+static void disas_ldst_ldapr_stlr(DisasContext *s, uint32_t insn)
86
+{
87
+ int rt = extract32(insn, 0, 5);
88
+ int rn = extract32(insn, 5, 5);
89
+ int offset = sextract32(insn, 12, 9);
90
+ int opc = extract32(insn, 22, 2);
91
+ int size = extract32(insn, 30, 2);
92
+ TCGv_i64 clean_addr, dirty_addr;
93
+ bool is_store = false;
94
+ bool is_signed = false;
95
+ bool extend = false;
96
+ bool iss_sf;
97
+
98
+ if (!dc_isar_feature(aa64_rcpc_8_4, s)) {
99
+ unallocated_encoding(s);
100
+ return;
101
+ }
102
+
103
+ switch (opc) {
104
+ case 0: /* STLURB */
105
+ is_store = true;
106
+ break;
107
+ case 1: /* LDAPUR* */
108
+ break;
109
+ case 2: /* LDAPURS* 64-bit variant */
110
+ if (size == 3) {
111
+ unallocated_encoding(s);
112
+ return;
113
+ }
114
+ is_signed = true;
115
+ break;
116
+ case 3: /* LDAPURS* 32-bit variant */
117
+ if (size > 1) {
118
+ unallocated_encoding(s);
119
+ return;
120
+ }
121
+ is_signed = true;
122
+ extend = true; /* zero-extend 32->64 after signed load */
123
+ break;
124
+ default:
125
+ g_assert_not_reached();
126
+ }
127
+
128
+ iss_sf = disas_ldst_compute_iss_sf(size, is_signed, opc);
129
+
130
+ if (rn == 31) {
131
+ gen_check_sp_alignment(s);
132
+ }
133
+
134
+ dirty_addr = read_cpu_reg_sp(s, rn, 1);
135
+ tcg_gen_addi_i64(dirty_addr, dirty_addr, offset);
136
+ clean_addr = clean_data_tbi(s, dirty_addr);
137
+
138
+ if (is_store) {
139
+ /* Store-Release semantics */
140
+ tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL);
141
+ do_gpr_st(s, cpu_reg(s, rt), clean_addr, size, true, rt, iss_sf, true);
142
+ } else {
143
+ /*
144
+ * Load-AcquirePC semantics; we implement as the slightly more
145
+ * restrictive Load-Acquire.
146
+ */
147
+ do_gpr_ld(s, cpu_reg(s, rt), clean_addr, size, is_signed, extend,
148
+ true, rt, iss_sf, true);
149
+ tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ);
150
+ }
151
+}
152
+
153
/* Load/store register (all forms) */
154
static void disas_ldst_reg(DisasContext *s, uint32_t insn)
155
{
156
@@ -XXX,XX +XXX,XX @@ static void disas_ldst(DisasContext *s, uint32_t insn)
157
case 0x0d: /* AdvSIMD load/store single structure */
158
disas_ldst_single_struct(s, insn);
159
break;
160
+ case 0x19: /* LDAPR/STLR (unscaled immediate) */
161
+ if (extract32(insn, 10, 2) != 0 ||
162
+ extract32(insn, 21, 1) != 0) {
163
+ unallocated_encoding(s);
164
+ break;
165
+ }
166
+ disas_ldst_ldapr_stlr(s, insn);
167
+ break;
168
default:
169
unallocated_encoding(s);
170
break;
80
--
171
--
81
2.17.1
172
2.20.1
82
173
83
174
diff view generated by jsdifflib
1
Add more detail to the documentation for memory_region_init_iommu()
1
The ARMv8.3-CCIDX extension makes the CCSIDR_EL1 system ID registers
2
and other IOMMU-related functions and data structures.
2
have a format that uses the full 64 bit width of the register, and
3
adds a new CCSIDR2 register so AArch32 can get at the high 32 bits.
4
5
QEMU doesn't implement caches, so we just treat these ID registers as
6
opaque values that are set to the correct constant values for each
7
CPU. The only thing we need to do is allow 64-bit values in our
8
cssidr[] array and provide the CCSIDR2 accessors.
9
10
We don't set the CCIDX field in our 'max' CPU because the CCSIDR
11
constant values we use are the same as the ones used by the
12
Cortex-A57 and they are in the old 32-bit format. This means
13
that the extra regdef added here is unused currently, but it
14
means that whenever in the future we add a CPU that does need
15
the new 64-bit format it will just work when we set the cssidr
16
values and the ID registers for it.
3
17
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
20
Message-id: 20200224182626.29252-1-peter.maydell@linaro.org
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Message-id: 20180521140402.23318-2-peter.maydell@linaro.org
9
---
21
---
10
include/exec/memory.h | 105 ++++++++++++++++++++++++++++++++++++++----
22
target/arm/cpu.h | 17 ++++++++++++++++-
11
1 file changed, 95 insertions(+), 10 deletions(-)
23
target/arm/helper.c | 19 +++++++++++++++++++
24
2 files changed, 35 insertions(+), 1 deletion(-)
12
25
13
diff --git a/include/exec/memory.h b/include/exec/memory.h
26
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
14
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
15
--- a/include/exec/memory.h
28
--- a/target/arm/cpu.h
16
+++ b/include/exec/memory.h
29
+++ b/target/arm/cpu.h
17
@@ -XXX,XX +XXX,XX @@ enum IOMMUMemoryRegionAttr {
30
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
18
IOMMU_ATTR_SPAPR_TCE_FD
31
/* The elements of this array are the CCSIDR values for each cache,
32
* in the order L1DCache, L1ICache, L2DCache, L2ICache, etc.
33
*/
34
- uint32_t ccsidr[16];
35
+ uint64_t ccsidr[16];
36
uint64_t reset_cbar;
37
uint32_t reset_auxcr;
38
bool reset_hivecs;
39
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_ac2(const ARMISARegisters *id)
40
return FIELD_EX32(id->id_mmfr4, ID_MMFR4, AC2) != 0;
41
}
42
43
+static inline bool isar_feature_aa32_ccidx(const ARMISARegisters *id)
44
+{
45
+ return FIELD_EX32(id->id_mmfr4, ID_MMFR4, CCIDX) != 0;
46
+}
47
+
48
/*
49
* 64-bit feature tests via id registers.
50
*/
51
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_rcpc_8_4(const ARMISARegisters *id)
52
return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, LRCPC) >= 2;
53
}
54
55
+static inline bool isar_feature_aa64_ccidx(const ARMISARegisters *id)
56
+{
57
+ return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, CCIDX) != 0;
58
+}
59
+
60
/*
61
* Feature tests for "does this exist in either 32-bit or 64-bit?"
62
*/
63
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_any_pmu_8_4(const ARMISARegisters *id)
64
return isar_feature_aa64_pmu_8_4(id) || isar_feature_aa32_pmu_8_4(id);
65
}
66
67
+static inline bool isar_feature_any_ccidx(const ARMISARegisters *id)
68
+{
69
+ return isar_feature_aa64_ccidx(id) || isar_feature_aa32_ccidx(id);
70
+}
71
+
72
/*
73
* Forward to the above feature tests given an ARMCPU pointer.
74
*/
75
diff --git a/target/arm/helper.c b/target/arm/helper.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/arm/helper.c
78
+++ b/target/arm/helper.c
79
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo predinv_reginfo[] = {
80
REGINFO_SENTINEL
19
};
81
};
20
82
21
+/**
83
+static uint64_t ccsidr2_read(CPUARMState *env, const ARMCPRegInfo *ri)
22
+ * IOMMUMemoryRegionClass:
84
+{
23
+ *
85
+ /* Read the high 32 bits of the current CCSIDR */
24
+ * All IOMMU implementations need to subclass TYPE_IOMMU_MEMORY_REGION
86
+ return extract64(ccsidr_read(env, ri), 32, 32);
25
+ * and provide an implementation of at least the @translate method here
87
+}
26
+ * to handle requests to the memory region. Other methods are optional.
88
+
27
+ *
89
+static const ARMCPRegInfo ccsidr2_reginfo[] = {
28
+ * The IOMMU implementation must use the IOMMU notifier infrastructure
90
+ { .name = "CCSIDR2", .state = ARM_CP_STATE_BOTH,
29
+ * to report whenever mappings are changed, by calling
91
+ .opc0 = 3, .opc1 = 1, .crn = 0, .crm = 0, .opc2 = 2,
30
+ * memory_region_notify_iommu() (or, if necessary, by calling
92
+ .access = PL1_R,
31
+ * memory_region_notify_one() for each registered notifier).
93
+ .accessfn = access_aa64_tid2,
32
+ */
94
+ .readfn = ccsidr2_read, .type = ARM_CP_NO_RAW },
33
typedef struct IOMMUMemoryRegionClass {
95
+ REGINFO_SENTINEL
34
/* private */
96
+};
35
struct DeviceClass parent_class;
97
+
36
98
static CPAccessResult access_aa64_tid3(CPUARMState *env, const ARMCPRegInfo *ri,
99
bool isread)
100
{
101
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
102
define_arm_cp_regs(cpu, predinv_reginfo);
103
}
104
105
+ if (cpu_isar_feature(any_ccidx, cpu)) {
106
+ define_arm_cp_regs(cpu, ccsidr2_reginfo);
107
+ }
108
+
109
#ifndef CONFIG_USER_ONLY
37
/*
110
/*
38
- * Return a TLB entry that contains a given address. Flag should
111
* Register redirections and aliases must be done last,
39
- * be the access permission of this translation operation. We can
40
- * set flag to IOMMU_NONE to mean that we don't need any
41
- * read/write permission checks, like, when for region replay.
42
+ * Return a TLB entry that contains a given address.
43
+ *
44
+ * The IOMMUAccessFlags indicated via @flag are optional and may
45
+ * be specified as IOMMU_NONE to indicate that the caller needs
46
+ * the full translation information for both reads and writes. If
47
+ * the access flags are specified then the IOMMU implementation
48
+ * may use this as an optimization, to stop doing a page table
49
+ * walk as soon as it knows that the requested permissions are not
50
+ * allowed. If IOMMU_NONE is passed then the IOMMU must do the
51
+ * full page table walk and report the permissions in the returned
52
+ * IOMMUTLBEntry. (Note that this implies that an IOMMU may not
53
+ * return different mappings for reads and writes.)
54
+ *
55
+ * The returned information remains valid while the caller is
56
+ * holding the big QEMU lock or is inside an RCU critical section;
57
+ * if the caller wishes to cache the mapping beyond that it must
58
+ * register an IOMMU notifier so it can invalidate its cached
59
+ * information when the IOMMU mapping changes.
60
+ *
61
+ * @iommu: the IOMMUMemoryRegion
62
+ * @hwaddr: address to be translated within the memory region
63
+ * @flag: requested access permissions
64
*/
65
IOMMUTLBEntry (*translate)(IOMMUMemoryRegion *iommu, hwaddr addr,
66
IOMMUAccessFlags flag);
67
- /* Returns minimum supported page size */
68
+ /* Returns minimum supported page size in bytes.
69
+ * If this method is not provided then the minimum is assumed to
70
+ * be TARGET_PAGE_SIZE.
71
+ *
72
+ * @iommu: the IOMMUMemoryRegion
73
+ */
74
uint64_t (*get_min_page_size)(IOMMUMemoryRegion *iommu);
75
- /* Called when IOMMU Notifier flag changed */
76
+ /* Called when IOMMU Notifier flag changes (ie when the set of
77
+ * events which IOMMU users are requesting notification for changes).
78
+ * Optional method -- need not be provided if the IOMMU does not
79
+ * need to know exactly which events must be notified.
80
+ *
81
+ * @iommu: the IOMMUMemoryRegion
82
+ * @old_flags: events which previously needed to be notified
83
+ * @new_flags: events which now need to be notified
84
+ */
85
void (*notify_flag_changed)(IOMMUMemoryRegion *iommu,
86
IOMMUNotifierFlag old_flags,
87
IOMMUNotifierFlag new_flags);
88
- /* Set this up to provide customized IOMMU replay function */
89
+ /* Called to handle memory_region_iommu_replay().
90
+ *
91
+ * The default implementation of memory_region_iommu_replay() is to
92
+ * call the IOMMU translate method for every page in the address space
93
+ * with flag == IOMMU_NONE and then call the notifier if translate
94
+ * returns a valid mapping. If this method is implemented then it
95
+ * overrides the default behaviour, and must provide the full semantics
96
+ * of memory_region_iommu_replay(), by calling @notifier for every
97
+ * translation present in the IOMMU.
98
+ *
99
+ * Optional method -- an IOMMU only needs to provide this method
100
+ * if the default is inefficient or produces undesirable side effects.
101
+ *
102
+ * Note: this is not related to record-and-replay functionality.
103
+ */
104
void (*replay)(IOMMUMemoryRegion *iommu, IOMMUNotifier *notifier);
105
106
- /* Get IOMMU misc attributes */
107
- int (*get_attr)(IOMMUMemoryRegion *iommu, enum IOMMUMemoryRegionAttr,
108
+ /* Get IOMMU misc attributes. This is an optional method that
109
+ * can be used to allow users of the IOMMU to get implementation-specific
110
+ * information. The IOMMU implements this method to handle calls
111
+ * by IOMMU users to memory_region_iommu_get_attr() by filling in
112
+ * the arbitrary data pointer for any IOMMUMemoryRegionAttr values that
113
+ * the IOMMU supports. If the method is unimplemented then
114
+ * memory_region_iommu_get_attr() will always return -EINVAL.
115
+ *
116
+ * @iommu: the IOMMUMemoryRegion
117
+ * @attr: attribute being queried
118
+ * @data: memory to fill in with the attribute data
119
+ *
120
+ * Returns 0 on success, or a negative errno; in particular
121
+ * returns -EINVAL for unrecognized or unimplemented attribute types.
122
+ */
123
+ int (*get_attr)(IOMMUMemoryRegion *iommu, enum IOMMUMemoryRegionAttr attr,
124
void *data);
125
} IOMMUMemoryRegionClass;
126
127
@@ -XXX,XX +XXX,XX @@ static inline void memory_region_init_reservation(MemoryRegion *mr,
128
* An IOMMU region translates addresses and forwards accesses to a target
129
* memory region.
130
*
131
+ * The IOMMU implementation must define a subclass of TYPE_IOMMU_MEMORY_REGION.
132
+ * @_iommu_mr should be a pointer to enough memory for an instance of
133
+ * that subclass, @instance_size is the size of that subclass, and
134
+ * @mrtypename is its name. This function will initialize @_iommu_mr as an
135
+ * instance of the subclass, and its methods will then be called to handle
136
+ * accesses to the memory region. See the documentation of
137
+ * #IOMMUMemoryRegionClass for further details.
138
+ *
139
* @_iommu_mr: the #IOMMUMemoryRegion to be initialized
140
* @instance_size: the IOMMUMemoryRegion subclass instance size
141
* @mrtypename: the type name of the #IOMMUMemoryRegion
142
@@ -XXX,XX +XXX,XX @@ void memory_region_register_iommu_notifier(MemoryRegion *mr,
143
* a notifier with the minimum page granularity returned by
144
* mr->iommu_ops->get_page_size().
145
*
146
+ * Note: this is not related to record-and-replay functionality.
147
+ *
148
* @iommu_mr: the memory region to observe
149
* @n: the notifier to which to replay iommu mappings
150
*/
151
@@ -XXX,XX +XXX,XX @@ void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n);
152
* memory_region_iommu_replay_all: replay existing IOMMU translations
153
* to all the notifiers registered.
154
*
155
+ * Note: this is not related to record-and-replay functionality.
156
+ *
157
* @iommu_mr: the memory region to observe
158
*/
159
void memory_region_iommu_replay_all(IOMMUMemoryRegion *iommu_mr);
160
@@ -XXX,XX +XXX,XX @@ void memory_region_unregister_iommu_notifier(MemoryRegion *mr,
161
* memory_region_iommu_get_attr: return an IOMMU attr if get_attr() is
162
* defined on the IOMMU.
163
*
164
- * Returns 0 if succeded, error code otherwise.
165
+ * Returns 0 on success, or a negative errno otherwise. In particular,
166
+ * -EINVAL indicates that the IOMMU does not support the requested
167
+ * attribute.
168
*
169
* @iommu_mr: the memory region
170
* @attr: the requested attribute
171
--
112
--
172
2.17.1
113
2.20.1
173
114
174
115
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
In our KVM GICv2 realize function, we try to cope with old kernels
2
that don't provide the device control API (KVM_CAP_DEVICE_CTRL): we
3
try to use the device control, and if that fails we fall back to
4
assuming that the kernel has the old style KVM_CREATE_IRQCHIP and
5
that it will provide a GICv2.
2
6
3
kvm_irqchip_create called by kvm_init will call kvm_init_irq_routing to
7
This doesn't cater for the possibility of a kernel and hardware which
4
initialize global capability variables. If we call kvm_init_irq_routing in
8
only provide a GICv3, which is very common now. On that setup we
5
GIC realize function, previous allocated memory will leak.
9
will abort() later on in kvm_arm_pmu_set_irq() when we try to wire up
10
an interrupt to the GIC we failed to create:
6
11
7
Fix this by deleting the unnecessary call.
12
qemu-system-aarch64: PMU: KVM_SET_DEVICE_ATTR: Invalid argument
13
qemu-system-aarch64: failed to set irq for PMU
14
Aborted
8
15
9
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
16
If the kernel advertises KVM_CAP_DEVICE_CTRL we should trust it if it
10
Reviewed-by: Eric Auger <eric.auger@redhat.com>
17
says it can't create a GICv2, rather than assuming it has one. We
11
Message-id: 1527750994-14360-1-git-send-email-zhaoshenglong@huawei.com
18
can then produce a more helpful error message including a hint about
19
the most probable reason for the failure.
20
21
If the kernel doesn't advertise KVM_CAP_DEVICE_CTRL then it is truly
22
ancient by this point but we might as well still fall back to a
23
KVM_CREATE_IRQCHIP GICv2.
24
25
With this patch then the user misconfiguration which previously
26
caused an abort now prints:
27
qemu-system-aarch64: Initialization of device kvm-arm-gic failed: error creating in-kernel VGIC: No such device
28
Perhaps the host CPU does not support GICv2?
29
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
30
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
31
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
32
Reviewed-by: Andrew Jones <drjones@redhat.com>
33
Tested-by: Andrew Jones <drjones@redhat.com>
34
Message-id: 20200225182435.1131-1-peter.maydell@linaro.org
13
---
35
---
14
hw/intc/arm_gic_kvm.c | 1 -
36
hw/intc/arm_gic_kvm.c | 9 +++++++++
15
hw/intc/arm_gicv3_kvm.c | 1 -
37
1 file changed, 9 insertions(+)
16
2 files changed, 2 deletions(-)
17
38
18
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
39
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
19
index XXXXXXX..XXXXXXX 100644
40
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/intc/arm_gic_kvm.c
41
--- a/hw/intc/arm_gic_kvm.c
21
+++ b/hw/intc/arm_gic_kvm.c
42
+++ b/hw/intc/arm_gic_kvm.c
22
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
43
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
23
44
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true,
24
if (kvm_has_gsi_routing()) {
45
&error_abort);
25
/* set up irq routing */
26
- kvm_init_irq_routing(kvm_state);
27
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
28
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
29
}
46
}
30
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
47
+ } else if (kvm_check_extension(kvm_state, KVM_CAP_DEVICE_CTRL)) {
31
index XXXXXXX..XXXXXXX 100644
48
+ error_setg_errno(errp, -ret, "error creating in-kernel VGIC");
32
--- a/hw/intc/arm_gicv3_kvm.c
49
+ error_append_hint(errp,
33
+++ b/hw/intc/arm_gicv3_kvm.c
50
+ "Perhaps the host CPU does not support GICv2?\n");
34
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
51
} else if (ret != -ENODEV && ret != -ENOTSUP) {
35
52
+ /*
36
if (kvm_has_gsi_routing()) {
53
+ * Very ancient kernel without KVM_CAP_DEVICE_CTRL: assume that
37
/* set up irq routing */
54
+ * ENODEV or ENOTSUP mean "can't create GICv2 with KVM_CREATE_DEVICE",
38
- kvm_init_irq_routing(kvm_state);
55
+ * and that we will get a GICv2 via KVM_CREATE_IRQCHIP.
39
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
56
+ */
40
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
57
error_setg_errno(errp, -ret, "error creating in-kernel VGIC");
41
}
58
return;
59
}
42
--
60
--
43
2.17.1
61
2.20.1
44
62
45
63
diff view generated by jsdifflib