1
Most of this is the Neon decodetree patches, followed by Edgar's versal cleanups.
1
First arm pullreq of the 8.0 series...
2
2
3
thanks
3
The following changes since commit ae2b87341b5ddb0dcb1b3f2d4f586ef18de75873:
4
-- PMM
5
4
6
5
Merge tag 'pull-qapi-2022-12-14-v2' of https://repo.or.cz/qemu/armbru into staging (2022-12-14 22:42:14 +0000)
7
The following changes since commit 2ef486e76d64436be90f7359a3071fb2a56ce835:
8
9
Merge remote-tracking branch 'remotes/marcel/tags/rdma-pull-request' into staging (2020-05-03 14:12:56 +0100)
10
6
11
are available in the Git repository at:
7
are available in the Git repository at:
12
8
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200504
9
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20221215
14
10
15
for you to fetch changes up to 9aefc6cf9b73f66062d2f914a0136756e7a28211:
11
for you to fetch changes up to 4f3ebdc33618e7c163f769047859d6f34373e3af:
16
12
17
target/arm: Move gen_ function typedefs to translate.h (2020-05-04 12:59:26 +0100)
13
target/arm: Restrict arm_cpu_exec_interrupt() to TCG accelerator (2022-12-15 11:18:20 +0000)
18
14
19
----------------------------------------------------------------
15
----------------------------------------------------------------
20
target-arm queue:
16
target-arm queue:
21
* Start of conversion of Neon insns to decodetree
17
* hw/arm/virt: Add properties to allow more granular
22
* versal board: support SD and RTC
18
configuration of use of highmem space
23
* Implement ARMv8.2-TTS2UXN
19
* target/arm: Add Cortex-A55 CPU
24
* Make VQDMULL undefined when U=1
20
* hw/intc/arm_gicv3: Fix GICD_TYPER ITLinesNumber advertisement
25
* Some minor code cleanups
21
* Implement FEAT_EVT
22
* Some 3-phase-reset conversions for Arm GIC, SMMU
23
* hw/arm/boot: set initrd with #address-cells type in fdt
24
* align user-mode exposed ID registers with Linux
25
* hw/misc: Move some arm-related files from specific_ss into softmmu_ss
26
* Restrict arm_cpu_exec_interrupt() to TCG accelerator
26
27
27
----------------------------------------------------------------
28
----------------------------------------------------------------
28
Edgar E. Iglesias (11):
29
Gavin Shan (7):
29
hw/arm: versal: Remove inclusion of arm_gicv3_common.h
30
hw/arm/virt: Introduce virt_set_high_memmap() helper
30
hw/arm: versal: Move misplaced comment
31
hw/arm/virt: Rename variable size to region_size in virt_set_high_memmap()
31
hw/arm: versal-virt: Fix typo xlnx-ve -> xlnx-versal
32
hw/arm/virt: Introduce variable region_base in virt_set_high_memmap()
32
hw/arm: versal: Embed the UARTs into the SoC type
33
hw/arm/virt: Introduce virt_get_high_memmap_enabled() helper
33
hw/arm: versal: Embed the GEMs into the SoC type
34
hw/arm/virt: Improve high memory region address assignment
34
hw/arm: versal: Embed the ADMAs into the SoC type
35
hw/arm/virt: Add 'compact-highmem' property
35
hw/arm: versal: Embed the APUs into the SoC type
36
hw/arm/virt: Add properties to disable high memory regions
36
hw/arm: versal: Add support for SD
37
hw/arm: versal: Add support for the RTC
38
hw/arm: versal-virt: Add support for SD
39
hw/arm: versal-virt: Add support for the RTC
40
37
41
Fredrik Strupe (1):
38
Luke Starrett (1):
42
target/arm: Make VQDMULL undefined when U=1
39
hw/intc/arm_gicv3: Fix GICD_TYPER ITLinesNumber advertisement
43
40
44
Peter Maydell (25):
41
Mihai Carabas (1):
45
target/arm: Don't use a TLB for ARMMMUIdx_Stage2
42
hw/arm/virt: build SMBIOS 19 table
46
target/arm: Use enum constant in get_phys_addr_lpae() call
47
target/arm: Add new 's1_is_el0' argument to get_phys_addr_lpae()
48
target/arm: Implement ARMv8.2-TTS2UXN
49
target/arm: Use correct variable for setting 'max' cpu's ID_AA64DFR0
50
target/arm/translate-vfp.inc.c: Remove duplicate simd_r32 check
51
target/arm: Don't allow Thumb Neon insns without FEATURE_NEON
52
target/arm: Add stubs for AArch32 Neon decodetree
53
target/arm: Convert VCMLA (vector) to decodetree
54
target/arm: Convert VCADD (vector) to decodetree
55
target/arm: Convert V[US]DOT (vector) to decodetree
56
target/arm: Convert VFM[AS]L (vector) to decodetree
57
target/arm: Convert VCMLA (scalar) to decodetree
58
target/arm: Convert V[US]DOT (scalar) to decodetree
59
target/arm: Convert VFM[AS]L (scalar) to decodetree
60
target/arm: Convert Neon load/store multiple structures to decodetree
61
target/arm: Convert Neon 'load single structure to all lanes' to decodetree
62
target/arm: Convert Neon 'load/store single structure' to decodetree
63
target/arm: Convert Neon 3-reg-same VADD/VSUB to decodetree
64
target/arm: Convert Neon 3-reg-same logic ops to decodetree
65
target/arm: Convert Neon 3-reg-same VMAX/VMIN to decodetree
66
target/arm: Convert Neon 3-reg-same comparisons to decodetree
67
target/arm: Convert Neon 3-reg-same VQADD/VQSUB to decodetree
68
target/arm: Convert Neon 3-reg-same VMUL, VMLA, VMLS, VSHL to decodetree
69
target/arm: Move gen_ function typedefs to translate.h
70
43
71
Philippe Mathieu-Daudé (2):
44
Peter Maydell (15):
72
hw/arm/mps2-tz: Use TYPE_IOTKIT instead of hardcoded string
45
target/arm: Allow relevant HCR bits to be written for FEAT_EVT
73
target/arm: Use uint64_t for midr field in CPU state struct
46
target/arm: Implement HCR_EL2.TTLBIS traps
47
target/arm: Implement HCR_EL2.TTLBOS traps
48
target/arm: Implement HCR_EL2.TICAB,TOCU traps
49
target/arm: Implement HCR_EL2.TID4 traps
50
target/arm: Report FEAT_EVT for TCG '-cpu max'
51
hw/arm: Convert TYPE_ARM_SMMU to 3-phase reset
52
hw/arm: Convert TYPE_ARM_SMMUV3 to 3-phase reset
53
hw/intc: Convert TYPE_ARM_GIC_COMMON to 3-phase reset
54
hw/intc: Convert TYPE_ARM_GIC_KVM to 3-phase reset
55
hw/intc: Convert TYPE_ARM_GICV3_COMMON to 3-phase reset
56
hw/intc: Convert TYPE_KVM_ARM_GICV3 to 3-phase reset
57
hw/intc: Convert TYPE_ARM_GICV3_ITS_COMMON to 3-phase reset
58
hw/intc: Convert TYPE_ARM_GICV3_ITS to 3-phase reset
59
hw/intc: Convert TYPE_KVM_ARM_ITS to 3-phase reset
74
60
75
include/hw/arm/xlnx-versal.h | 31 +-
61
Philippe Mathieu-Daudé (1):
76
target/arm/cpu-param.h | 2 +-
62
target/arm: Restrict arm_cpu_exec_interrupt() to TCG accelerator
77
target/arm/cpu.h | 38 ++-
78
target/arm/translate-a64.h | 9 -
79
target/arm/translate.h | 26 ++
80
target/arm/neon-dp.decode | 86 +++++
81
target/arm/neon-ls.decode | 52 +++
82
target/arm/neon-shared.decode | 66 ++++
83
hw/arm/mps2-tz.c | 2 +-
84
hw/arm/xlnx-versal-virt.c | 74 ++++-
85
hw/arm/xlnx-versal.c | 115 +++++--
86
target/arm/cpu.c | 3 +-
87
target/arm/cpu64.c | 8 +-
88
target/arm/helper.c | 183 ++++------
89
target/arm/translate-a64.c | 17 -
90
target/arm/translate-neon.inc.c | 714 +++++++++++++++++++++++++++++++++++++++
91
target/arm/translate-vfp.inc.c | 6 -
92
target/arm/translate.c | 716 +++-------------------------------------
93
target/arm/Makefile.objs | 18 +
94
19 files changed, 1302 insertions(+), 864 deletions(-)
95
create mode 100644 target/arm/neon-dp.decode
96
create mode 100644 target/arm/neon-ls.decode
97
create mode 100644 target/arm/neon-shared.decode
98
create mode 100644 target/arm/translate-neon.inc.c
99
63
64
Schspa Shi (1):
65
hw/arm/boot: set initrd with #address-cells type in fdt
66
67
Thomas Huth (1):
68
hw/misc: Move some arm-related files from specific_ss into softmmu_ss
69
70
Timofey Kutergin (1):
71
target/arm: Add Cortex-A55 CPU
72
73
Zhuojia Shen (1):
74
target/arm: align exposed ID registers with Linux
75
76
docs/system/arm/emulation.rst | 1 +
77
docs/system/arm/virt.rst | 18 +++
78
include/hw/arm/smmuv3.h | 2 +-
79
include/hw/arm/virt.h | 2 +
80
include/hw/misc/xlnx-zynqmp-apu-ctrl.h | 2 +-
81
target/arm/cpu.h | 30 +++++
82
target/arm/kvm-consts.h | 8 +-
83
hw/arm/boot.c | 10 +-
84
hw/arm/smmu-common.c | 7 +-
85
hw/arm/smmuv3.c | 12 +-
86
hw/arm/virt.c | 202 +++++++++++++++++++++++-----
87
hw/intc/arm_gic_common.c | 7 +-
88
hw/intc/arm_gic_kvm.c | 14 +-
89
hw/intc/arm_gicv3_common.c | 7 +-
90
hw/intc/arm_gicv3_dist.c | 4 +-
91
hw/intc/arm_gicv3_its.c | 14 +-
92
hw/intc/arm_gicv3_its_common.c | 7 +-
93
hw/intc/arm_gicv3_its_kvm.c | 14 +-
94
hw/intc/arm_gicv3_kvm.c | 14 +-
95
hw/misc/imx6_src.c | 2 +-
96
hw/misc/iotkit-sysctl.c | 1 -
97
target/arm/cpu.c | 5 +-
98
target/arm/cpu64.c | 70 ++++++++++
99
target/arm/cpu_tcg.c | 1 +
100
target/arm/helper.c | 231 ++++++++++++++++++++++++---------
101
hw/misc/meson.build | 11 +-
102
26 files changed, 538 insertions(+), 158 deletions(-)
103
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Gavin Shan <gshan@redhat.com>
2
2
3
Add support for SD.
3
This introduces virt_set_high_memmap() helper. The logic of high
4
memory region address assignment is moved to the helper. The intention
5
is to make the subsequent optimization for high memory region address
6
assignment easier.
4
7
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
No functional change intended.
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Signed-off-by: Gavin Shan <gshan@redhat.com>
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
11
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Message-id: 20200427181649.26851-9-edgar.iglesias@gmail.com
12
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
13
Reviewed-by: Marc Zyngier <maz@kernel.org>
14
Tested-by: Zhenyu Zhang <zhenyzha@redhat.com>
15
Message-id: 20221029224307.138822-2-gshan@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
17
---
12
include/hw/arm/xlnx-versal.h | 12 ++++++++++++
18
hw/arm/virt.c | 74 ++++++++++++++++++++++++++++-----------------------
13
hw/arm/xlnx-versal.c | 31 +++++++++++++++++++++++++++++++
19
1 file changed, 41 insertions(+), 33 deletions(-)
14
2 files changed, 43 insertions(+)
15
20
16
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
21
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
17
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/xlnx-versal.h
23
--- a/hw/arm/virt.c
19
+++ b/include/hw/arm/xlnx-versal.h
24
+++ b/hw/arm/virt.c
20
@@ -XXX,XX +XXX,XX @@
25
@@ -XXX,XX +XXX,XX @@ static uint64_t virt_cpu_mp_affinity(VirtMachineState *vms, int idx)
21
26
return arm_cpu_mp_affinity(idx, clustersz);
22
#include "hw/sysbus.h"
23
#include "hw/arm/boot.h"
24
+#include "hw/sd/sdhci.h"
25
#include "hw/intc/arm_gicv3.h"
26
#include "hw/char/pl011.h"
27
#include "hw/dma/xlnx-zdma.h"
28
@@ -XXX,XX +XXX,XX @@
29
#define XLNX_VERSAL_NR_UARTS 2
30
#define XLNX_VERSAL_NR_GEMS 2
31
#define XLNX_VERSAL_NR_ADMAS 8
32
+#define XLNX_VERSAL_NR_SDS 2
33
#define XLNX_VERSAL_NR_IRQS 192
34
35
typedef struct Versal {
36
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
37
} iou;
38
} lpd;
39
40
+ /* The Platform Management Controller subsystem. */
41
+ struct {
42
+ struct {
43
+ SDHCIState sd[XLNX_VERSAL_NR_SDS];
44
+ } iou;
45
+ } pmc;
46
+
47
struct {
48
MemoryRegion *mr_ddr;
49
uint32_t psci_conduit;
50
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
51
#define VERSAL_GEM1_IRQ_0 58
52
#define VERSAL_GEM1_WAKE_IRQ_0 59
53
#define VERSAL_ADMA_IRQ_0 60
54
+#define VERSAL_SD0_IRQ_0 126
55
56
/* Architecturally reserved IRQs suitable for virtualization. */
57
#define VERSAL_RSVD_IRQ_FIRST 111
58
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
59
#define MM_FPD_CRF 0xfd1a0000U
60
#define MM_FPD_CRF_SIZE 0x140000
61
62
+#define MM_PMC_SD0 0xf1040000U
63
+#define MM_PMC_SD0_SIZE 0x10000
64
#define MM_PMC_CRP 0xf1260000U
65
#define MM_PMC_CRP_SIZE 0x10000
66
#endif
67
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
68
index XXXXXXX..XXXXXXX 100644
69
--- a/hw/arm/xlnx-versal.c
70
+++ b/hw/arm/xlnx-versal.c
71
@@ -XXX,XX +XXX,XX @@ static void versal_create_admas(Versal *s, qemu_irq *pic)
72
}
73
}
27
}
74
28
75
+#define SDHCI_CAPABILITIES 0x280737ec6481 /* Same as on ZynqMP. */
29
+static void virt_set_high_memmap(VirtMachineState *vms,
76
+static void versal_create_sds(Versal *s, qemu_irq *pic)
30
+ hwaddr base, int pa_bits)
77
+{
31
+{
78
+ int i;
32
+ int i;
79
+
33
+
80
+ for (i = 0; i < ARRAY_SIZE(s->pmc.iou.sd); i++) {
34
+ for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) {
81
+ DeviceState *dev;
35
+ hwaddr size = extended_memmap[i].size;
82
+ MemoryRegion *mr;
36
+ bool fits;
83
+
37
+
84
+ sysbus_init_child_obj(OBJECT(s), "sd[*]",
38
+ base = ROUND_UP(base, size);
85
+ &s->pmc.iou.sd[i], sizeof(s->pmc.iou.sd[i]),
39
+ vms->memmap[i].base = base;
86
+ TYPE_SYSBUS_SDHCI);
40
+ vms->memmap[i].size = size;
87
+ dev = DEVICE(&s->pmc.iou.sd[i]);
88
+
41
+
89
+ object_property_set_uint(OBJECT(dev),
42
+ /*
90
+ 3, "sd-spec-version", &error_fatal);
43
+ * Check each device to see if they fit in the PA space,
91
+ object_property_set_uint(OBJECT(dev), SDHCI_CAPABILITIES, "capareg",
44
+ * moving highest_gpa as we go.
92
+ &error_fatal);
45
+ *
93
+ object_property_set_uint(OBJECT(dev), UHS_I, "uhs", &error_fatal);
46
+ * For each device that doesn't fit, disable it.
94
+ qdev_init_nofail(dev);
47
+ */
48
+ fits = (base + size) <= BIT_ULL(pa_bits);
49
+ if (fits) {
50
+ vms->highest_gpa = base + size - 1;
51
+ }
95
+
52
+
96
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
53
+ switch (i) {
97
+ memory_region_add_subregion(&s->mr_ps,
54
+ case VIRT_HIGH_GIC_REDIST2:
98
+ MM_PMC_SD0 + i * MM_PMC_SD0_SIZE, mr);
55
+ vms->highmem_redists &= fits;
56
+ break;
57
+ case VIRT_HIGH_PCIE_ECAM:
58
+ vms->highmem_ecam &= fits;
59
+ break;
60
+ case VIRT_HIGH_PCIE_MMIO:
61
+ vms->highmem_mmio &= fits;
62
+ break;
63
+ }
99
+
64
+
100
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
65
+ base += size;
101
+ pic[VERSAL_SD0_IRQ_0 + i * 2]);
102
+ }
66
+ }
103
+}
67
+}
104
+
68
+
105
/* This takes the board allocated linear DDR memory and creates aliases
69
static void virt_set_memmap(VirtMachineState *vms, int pa_bits)
106
* for each split DDR range/aperture on the Versal address map.
70
{
107
*/
71
MachineState *ms = MACHINE(vms);
108
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
72
@@ -XXX,XX +XXX,XX @@ static void virt_set_memmap(VirtMachineState *vms, int pa_bits)
109
versal_create_uarts(s, pic);
73
/* We know for sure that at least the memory fits in the PA space */
110
versal_create_gems(s, pic);
74
vms->highest_gpa = memtop - 1;
111
versal_create_admas(s, pic);
75
112
+ versal_create_sds(s, pic);
76
- for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) {
113
versal_map_ddr(s);
77
- hwaddr size = extended_memmap[i].size;
114
versal_unimp(s);
78
- bool fits;
115
79
-
80
- base = ROUND_UP(base, size);
81
- vms->memmap[i].base = base;
82
- vms->memmap[i].size = size;
83
-
84
- /*
85
- * Check each device to see if they fit in the PA space,
86
- * moving highest_gpa as we go.
87
- *
88
- * For each device that doesn't fit, disable it.
89
- */
90
- fits = (base + size) <= BIT_ULL(pa_bits);
91
- if (fits) {
92
- vms->highest_gpa = base + size - 1;
93
- }
94
-
95
- switch (i) {
96
- case VIRT_HIGH_GIC_REDIST2:
97
- vms->highmem_redists &= fits;
98
- break;
99
- case VIRT_HIGH_PCIE_ECAM:
100
- vms->highmem_ecam &= fits;
101
- break;
102
- case VIRT_HIGH_PCIE_MMIO:
103
- vms->highmem_mmio &= fits;
104
- break;
105
- }
106
-
107
- base += size;
108
- }
109
+ virt_set_high_memmap(vms, base, pa_bits);
110
111
if (device_memory_size > 0) {
112
ms->device_memory = g_malloc0(sizeof(*ms->device_memory));
116
--
113
--
117
2.20.1
114
2.25.1
118
119
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Gavin Shan <gshan@redhat.com>
2
2
3
Add support for the RTC.
3
This renames variable 'size' to 'region_size' in virt_set_high_memmap().
4
Its counterpart ('region_base') will be introduced in next patch.
4
5
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
No functional change intended.
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
7
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
8
Signed-off-by: Gavin Shan <gshan@redhat.com>
8
Message-id: 20200427181649.26851-12-edgar.iglesias@gmail.com
9
Reviewed-by: Eric Auger <eric.auger@redhat.com>
10
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
11
Reviewed-by: Marc Zyngier <maz@kernel.org>
12
Tested-by: Zhenyu Zhang <zhenyzha@redhat.com>
13
Message-id: 20221029224307.138822-3-gshan@redhat.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
15
---
11
hw/arm/xlnx-versal-virt.c | 22 ++++++++++++++++++++++
16
hw/arm/virt.c | 15 ++++++++-------
12
1 file changed, 22 insertions(+)
17
1 file changed, 8 insertions(+), 7 deletions(-)
13
18
14
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
19
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
15
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/xlnx-versal-virt.c
21
--- a/hw/arm/virt.c
17
+++ b/hw/arm/xlnx-versal-virt.c
22
+++ b/hw/arm/virt.c
18
@@ -XXX,XX +XXX,XX @@ static void fdt_add_sd_nodes(VersalVirt *s)
23
@@ -XXX,XX +XXX,XX @@ static uint64_t virt_cpu_mp_affinity(VirtMachineState *vms, int idx)
24
static void virt_set_high_memmap(VirtMachineState *vms,
25
hwaddr base, int pa_bits)
26
{
27
+ hwaddr region_size;
28
+ bool fits;
29
int i;
30
31
for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) {
32
- hwaddr size = extended_memmap[i].size;
33
- bool fits;
34
+ region_size = extended_memmap[i].size;
35
36
- base = ROUND_UP(base, size);
37
+ base = ROUND_UP(base, region_size);
38
vms->memmap[i].base = base;
39
- vms->memmap[i].size = size;
40
+ vms->memmap[i].size = region_size;
41
42
/*
43
* Check each device to see if they fit in the PA space,
44
@@ -XXX,XX +XXX,XX @@ static void virt_set_high_memmap(VirtMachineState *vms,
45
*
46
* For each device that doesn't fit, disable it.
47
*/
48
- fits = (base + size) <= BIT_ULL(pa_bits);
49
+ fits = (base + region_size) <= BIT_ULL(pa_bits);
50
if (fits) {
51
- vms->highest_gpa = base + size - 1;
52
+ vms->highest_gpa = base + region_size - 1;
53
}
54
55
switch (i) {
56
@@ -XXX,XX +XXX,XX @@ static void virt_set_high_memmap(VirtMachineState *vms,
57
break;
58
}
59
60
- base += size;
61
+ base += region_size;
19
}
62
}
20
}
63
}
21
64
22
+static void fdt_add_rtc_node(VersalVirt *s)
23
+{
24
+ const char compat[] = "xlnx,zynqmp-rtc";
25
+ const char interrupt_names[] = "alarm\0sec";
26
+ char *name = g_strdup_printf("/rtc@%x", MM_PMC_RTC);
27
+
28
+ qemu_fdt_add_subnode(s->fdt, name);
29
+
30
+ qemu_fdt_setprop_cells(s->fdt, name, "interrupts",
31
+ GIC_FDT_IRQ_TYPE_SPI, VERSAL_RTC_ALARM_IRQ,
32
+ GIC_FDT_IRQ_FLAGS_LEVEL_HI,
33
+ GIC_FDT_IRQ_TYPE_SPI, VERSAL_RTC_SECONDS_IRQ,
34
+ GIC_FDT_IRQ_FLAGS_LEVEL_HI);
35
+ qemu_fdt_setprop(s->fdt, name, "interrupt-names",
36
+ interrupt_names, sizeof(interrupt_names));
37
+ qemu_fdt_setprop_sized_cells(s->fdt, name, "reg",
38
+ 2, MM_PMC_RTC, 2, MM_PMC_RTC_SIZE);
39
+ qemu_fdt_setprop(s->fdt, name, "compatible", compat, sizeof(compat));
40
+ g_free(name);
41
+}
42
+
43
static void fdt_nop_memory_nodes(void *fdt, Error **errp)
44
{
45
Error *err = NULL;
46
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
47
fdt_add_timer_nodes(s);
48
fdt_add_zdma_nodes(s);
49
fdt_add_sd_nodes(s);
50
+ fdt_add_rtc_node(s);
51
fdt_add_cpu_nodes(s, psci_conduit);
52
fdt_add_clk_node(s, "/clk125", 125000000, s->phandle.clk_125Mhz);
53
fdt_add_clk_node(s, "/clk25", 25000000, s->phandle.clk_25Mhz);
54
--
65
--
55
2.20.1
66
2.25.1
56
57
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Gavin Shan <gshan@redhat.com>
2
2
3
Embed the UARTs into the SoC type.
3
This introduces variable 'region_base' for the base address of the
4
specific high memory region. It's the preparatory work to optimize
5
high memory region address assignment.
4
6
5
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
7
No functional change intended.
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Gavin Shan <gshan@redhat.com>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
11
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
10
Message-id: 20200427181649.26851-5-edgar.iglesias@gmail.com
12
Reviewed-by: Marc Zyngier <maz@kernel.org>
13
Tested-by: Zhenyu Zhang <zhenyzha@redhat.com>
14
Message-id: 20221029224307.138822-4-gshan@redhat.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
16
---
13
include/hw/arm/xlnx-versal.h | 3 ++-
17
hw/arm/virt.c | 12 ++++++------
14
hw/arm/xlnx-versal.c | 12 ++++++------
18
1 file changed, 6 insertions(+), 6 deletions(-)
15
2 files changed, 8 insertions(+), 7 deletions(-)
16
19
17
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
20
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
18
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/xlnx-versal.h
22
--- a/hw/arm/virt.c
20
+++ b/include/hw/arm/xlnx-versal.h
23
+++ b/hw/arm/virt.c
21
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@ static uint64_t virt_cpu_mp_affinity(VirtMachineState *vms, int idx)
22
#include "hw/sysbus.h"
25
static void virt_set_high_memmap(VirtMachineState *vms,
23
#include "hw/arm/boot.h"
26
hwaddr base, int pa_bits)
24
#include "hw/intc/arm_gicv3.h"
27
{
25
+#include "hw/char/pl011.h"
28
- hwaddr region_size;
26
29
+ hwaddr region_base, region_size;
27
#define TYPE_XLNX_VERSAL "xlnx-versal"
30
bool fits;
28
#define XLNX_VERSAL(obj) OBJECT_CHECK(Versal, (obj), TYPE_XLNX_VERSAL)
31
int i;
29
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
32
30
MemoryRegion mr_ocm;
33
for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) {
31
34
+ region_base = ROUND_UP(base, extended_memmap[i].size);
32
struct {
35
region_size = extended_memmap[i].size;
33
- SysBusDevice *uart[XLNX_VERSAL_NR_UARTS];
36
34
+ PL011State uart[XLNX_VERSAL_NR_UARTS];
37
- base = ROUND_UP(base, region_size);
35
SysBusDevice *gem[XLNX_VERSAL_NR_GEMS];
38
- vms->memmap[i].base = base;
36
SysBusDevice *adma[XLNX_VERSAL_NR_ADMAS];
39
+ vms->memmap[i].base = region_base;
37
} iou;
40
vms->memmap[i].size = region_size;
38
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
41
39
index XXXXXXX..XXXXXXX 100644
42
/*
40
--- a/hw/arm/xlnx-versal.c
43
@@ -XXX,XX +XXX,XX @@ static void virt_set_high_memmap(VirtMachineState *vms,
41
+++ b/hw/arm/xlnx-versal.c
44
*
42
@@ -XXX,XX +XXX,XX @@
45
* For each device that doesn't fit, disable it.
43
#include "kvm_arm.h"
46
*/
44
#include "hw/misc/unimp.h"
47
- fits = (base + region_size) <= BIT_ULL(pa_bits);
45
#include "hw/arm/xlnx-versal.h"
48
+ fits = (region_base + region_size) <= BIT_ULL(pa_bits);
46
-#include "hw/char/pl011.h"
49
if (fits) {
47
50
- vms->highest_gpa = base + region_size - 1;
48
#define XLNX_VERSAL_ACPU_TYPE ARM_CPU_TYPE_NAME("cortex-a72")
51
+ vms->highest_gpa = region_base + region_size - 1;
49
#define GEM_REVISION 0x40070106
52
}
50
@@ -XXX,XX +XXX,XX @@ static void versal_create_uarts(Versal *s, qemu_irq *pic)
53
51
DeviceState *dev;
54
switch (i) {
52
MemoryRegion *mr;
55
@@ -XXX,XX +XXX,XX @@ static void virt_set_high_memmap(VirtMachineState *vms,
53
56
break;
54
- dev = qdev_create(NULL, TYPE_PL011);
57
}
55
- s->lpd.iou.uart[i] = SYS_BUS_DEVICE(dev);
58
56
+ sysbus_init_child_obj(OBJECT(s), name,
59
- base += region_size;
57
+ &s->lpd.iou.uart[i], sizeof(s->lpd.iou.uart[i]),
60
+ base = region_base + region_size;
58
+ TYPE_PL011);
59
+ dev = DEVICE(&s->lpd.iou.uart[i]);
60
qdev_prop_set_chr(dev, "chardev", serial_hd(i));
61
- object_property_add_child(OBJECT(s), name, OBJECT(dev), &error_fatal);
62
qdev_init_nofail(dev);
63
64
- mr = sysbus_mmio_get_region(s->lpd.iou.uart[i], 0);
65
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
66
memory_region_add_subregion(&s->mr_ps, addrs[i], mr);
67
68
- sysbus_connect_irq(s->lpd.iou.uart[i], 0, pic[irqs[i]]);
69
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[irqs[i]]);
70
g_free(name);
71
}
61
}
72
}
62
}
63
73
--
64
--
74
2.20.1
65
2.25.1
75
76
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Gavin Shan <gshan@redhat.com>
2
2
3
Embed the ADMAs into the SoC type.
3
This introduces virt_get_high_memmap_enabled() helper, which returns
4
the pointer to vms->highmem_{redists, ecam, mmio}. The pointer will
5
be used in the subsequent patches.
4
6
5
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
7
No functional change intended.
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Signed-off-by: Gavin Shan <gshan@redhat.com>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
11
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
10
Message-id: 20200427181649.26851-7-edgar.iglesias@gmail.com
12
Reviewed-by: Marc Zyngier <maz@kernel.org>
13
Tested-by: Zhenyu Zhang <zhenyzha@redhat.com>
14
Message-id: 20221029224307.138822-5-gshan@redhat.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
16
---
13
include/hw/arm/xlnx-versal.h | 3 ++-
17
hw/arm/virt.c | 32 +++++++++++++++++++-------------
14
hw/arm/xlnx-versal.c | 14 +++++++-------
18
1 file changed, 19 insertions(+), 13 deletions(-)
15
2 files changed, 9 insertions(+), 8 deletions(-)
16
19
17
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
20
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
18
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/xlnx-versal.h
22
--- a/hw/arm/virt.c
20
+++ b/include/hw/arm/xlnx-versal.h
23
+++ b/hw/arm/virt.c
21
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@ static uint64_t virt_cpu_mp_affinity(VirtMachineState *vms, int idx)
22
#include "hw/arm/boot.h"
25
return arm_cpu_mp_affinity(idx, clustersz);
23
#include "hw/intc/arm_gicv3.h"
26
}
24
#include "hw/char/pl011.h"
27
25
+#include "hw/dma/xlnx-zdma.h"
28
+static inline bool *virt_get_high_memmap_enabled(VirtMachineState *vms,
26
#include "hw/net/cadence_gem.h"
29
+ int index)
27
30
+{
28
#define TYPE_XLNX_VERSAL "xlnx-versal"
31
+ bool *enabled_array[] = {
29
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
32
+ &vms->highmem_redists,
30
struct {
33
+ &vms->highmem_ecam,
31
PL011State uart[XLNX_VERSAL_NR_UARTS];
34
+ &vms->highmem_mmio,
32
CadenceGEMState gem[XLNX_VERSAL_NR_GEMS];
35
+ };
33
- SysBusDevice *adma[XLNX_VERSAL_NR_ADMAS];
36
+
34
+ XlnxZDMA adma[XLNX_VERSAL_NR_ADMAS];
37
+ assert(ARRAY_SIZE(extended_memmap) - VIRT_LOWMEMMAP_LAST ==
35
} iou;
38
+ ARRAY_SIZE(enabled_array));
36
} lpd;
39
+ assert(index - VIRT_LOWMEMMAP_LAST < ARRAY_SIZE(enabled_array));
37
40
+
38
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
41
+ return enabled_array[index - VIRT_LOWMEMMAP_LAST];
39
index XXXXXXX..XXXXXXX 100644
42
+}
40
--- a/hw/arm/xlnx-versal.c
43
+
41
+++ b/hw/arm/xlnx-versal.c
44
static void virt_set_high_memmap(VirtMachineState *vms,
42
@@ -XXX,XX +XXX,XX @@ static void versal_create_admas(Versal *s, qemu_irq *pic)
45
hwaddr base, int pa_bits)
43
DeviceState *dev;
46
{
44
MemoryRegion *mr;
47
hwaddr region_base, region_size;
45
48
- bool fits;
46
- dev = qdev_create(NULL, "xlnx.zdma");
49
+ bool *region_enabled, fits;
47
- s->lpd.iou.adma[i] = SYS_BUS_DEVICE(dev);
50
int i;
48
- object_property_set_int(OBJECT(s->lpd.iou.adma[i]), 128, "bus-width",
51
49
- &error_abort);
52
for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) {
50
- object_property_add_child(OBJECT(s), name, OBJECT(dev), &error_fatal);
53
+ region_enabled = virt_get_high_memmap_enabled(vms, i);
51
+ sysbus_init_child_obj(OBJECT(s), name,
54
region_base = ROUND_UP(base, extended_memmap[i].size);
52
+ &s->lpd.iou.adma[i], sizeof(s->lpd.iou.adma[i]),
55
region_size = extended_memmap[i].size;
53
+ TYPE_XLNX_ZDMA);
56
54
+ dev = DEVICE(&s->lpd.iou.adma[i]);
57
@@ -XXX,XX +XXX,XX @@ static void virt_set_high_memmap(VirtMachineState *vms,
55
+ object_property_set_int(OBJECT(dev), 128, "bus-width", &error_abort);
58
vms->highest_gpa = region_base + region_size - 1;
56
qdev_init_nofail(dev);
59
}
57
60
58
- mr = sysbus_mmio_get_region(s->lpd.iou.adma[i], 0);
61
- switch (i) {
59
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
62
- case VIRT_HIGH_GIC_REDIST2:
60
memory_region_add_subregion(&s->mr_ps,
63
- vms->highmem_redists &= fits;
61
MM_ADMA_CH0 + i * MM_ADMA_CH0_SIZE, mr);
64
- break;
62
65
- case VIRT_HIGH_PCIE_ECAM:
63
- sysbus_connect_irq(s->lpd.iou.adma[i], 0, pic[VERSAL_ADMA_IRQ_0 + i]);
66
- vms->highmem_ecam &= fits;
64
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[VERSAL_ADMA_IRQ_0 + i]);
67
- break;
65
g_free(name);
68
- case VIRT_HIGH_PCIE_MMIO:
69
- vms->highmem_mmio &= fits;
70
- break;
71
- }
72
-
73
+ *region_enabled &= fits;
74
base = region_base + region_size;
66
}
75
}
67
}
76
}
68
--
77
--
69
2.20.1
78
2.25.1
70
71
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Gavin Shan <gshan@redhat.com>
2
2
3
Embed the APUs into the SoC type.
3
There are three high memory regions, which are VIRT_HIGH_REDIST2,
4
VIRT_HIGH_PCIE_ECAM and VIRT_HIGH_PCIE_MMIO. Their base addresses
5
are floating on highest RAM address. However, they can be disabled
6
in several cases.
4
7
5
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
8
(1) One specific high memory region is likely to be disabled by
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
code by toggling vms->highmem_{redists, ecam, mmio}.
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
(2) VIRT_HIGH_PCIE_ECAM region is disabled on machine, which is
9
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
12
'virt-2.12' or ealier than it.
10
Message-id: 20200427181649.26851-8-edgar.iglesias@gmail.com
13
14
(3) VIRT_HIGH_PCIE_ECAM region is disabled when firmware is loaded
15
on 32-bits system.
16
17
(4) One specific high memory region is disabled when it breaks the
18
PA space limit.
19
20
The current implementation of virt_set_{memmap, high_memmap}() isn't
21
optimized because the high memory region's PA space is always reserved,
22
regardless of whatever the actual state in the corresponding
23
vms->highmem_{redists, ecam, mmio} flag. In the code, 'base' and
24
'vms->highest_gpa' are always increased for case (1), (2) and (3).
25
It's unnecessary since the assigned PA space for the disabled high
26
memory region won't be used afterwards.
27
28
Improve the address assignment for those three high memory region by
29
skipping the address assignment for one specific high memory region if
30
it has been disabled in case (1), (2) and (3). The memory layout may
31
be changed after the improvement is applied, which leads to potential
32
migration breakage. So 'vms->highmem_compact' is added to control if
33
the improvement should be applied. For now, 'vms->highmem_compact' is
34
set to false, meaning that we don't have memory layout change until it
35
becomes configurable through property 'compact-highmem' in next patch.
36
37
Signed-off-by: Gavin Shan <gshan@redhat.com>
38
Reviewed-by: Eric Auger <eric.auger@redhat.com>
39
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
40
Reviewed-by: Marc Zyngier <maz@kernel.org>
41
Tested-by: Zhenyu Zhang <zhenyzha@redhat.com>
42
Message-id: 20221029224307.138822-6-gshan@redhat.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
44
---
13
include/hw/arm/xlnx-versal.h | 2 +-
45
include/hw/arm/virt.h | 1 +
14
hw/arm/xlnx-versal-virt.c | 4 ++--
46
hw/arm/virt.c | 15 ++++++++++-----
15
hw/arm/xlnx-versal.c | 19 +++++--------------
47
2 files changed, 11 insertions(+), 5 deletions(-)
16
3 files changed, 8 insertions(+), 17 deletions(-)
17
48
18
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
49
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
19
index XXXXXXX..XXXXXXX 100644
50
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/arm/xlnx-versal.h
51
--- a/include/hw/arm/virt.h
21
+++ b/include/hw/arm/xlnx-versal.h
52
+++ b/include/hw/arm/virt.h
22
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
53
@@ -XXX,XX +XXX,XX @@ struct VirtMachineState {
23
struct {
54
PFlashCFI01 *flash[2];
24
struct {
55
bool secure;
25
MemoryRegion mr;
56
bool highmem;
26
- ARMCPU *cpu[XLNX_VERSAL_NR_ACPUS];
57
+ bool highmem_compact;
27
+ ARMCPU cpu[XLNX_VERSAL_NR_ACPUS];
58
bool highmem_ecam;
28
GICv3State gic;
59
bool highmem_mmio;
29
} apu;
60
bool highmem_redists;
30
} fpd;
61
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
31
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
32
index XXXXXXX..XXXXXXX 100644
62
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/arm/xlnx-versal-virt.c
63
--- a/hw/arm/virt.c
34
+++ b/hw/arm/xlnx-versal-virt.c
64
+++ b/hw/arm/virt.c
35
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
65
@@ -XXX,XX +XXX,XX @@ static void virt_set_high_memmap(VirtMachineState *vms,
36
s->binfo.get_dtb = versal_virt_get_dtb;
66
vms->memmap[i].size = region_size;
37
s->binfo.modify_dtb = versal_virt_modify_dtb;
67
38
if (machine->kernel_filename) {
68
/*
39
- arm_load_kernel(s->soc.fpd.apu.cpu[0], machine, &s->binfo);
69
- * Check each device to see if they fit in the PA space,
40
+ arm_load_kernel(&s->soc.fpd.apu.cpu[0], machine, &s->binfo);
70
- * moving highest_gpa as we go.
41
} else {
71
+ * Check each device to see if it fits in the PA space,
42
- AddressSpace *as = arm_boot_address_space(s->soc.fpd.apu.cpu[0],
72
+ * moving highest_gpa as we go. For compatibility, move
43
+ AddressSpace *as = arm_boot_address_space(&s->soc.fpd.apu.cpu[0],
73
+ * highest_gpa for disabled fitting devices as well, if
44
&s->binfo);
74
+ * the compact layout has been disabled.
45
/* Some boot-loaders (e.g u-boot) don't like blobs at address 0 (NULL).
75
*
46
* Offset things by 4K. */
76
* For each device that doesn't fit, disable it.
47
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
77
*/
48
index XXXXXXX..XXXXXXX 100644
78
fits = (region_base + region_size) <= BIT_ULL(pa_bits);
49
--- a/hw/arm/xlnx-versal.c
79
- if (fits) {
50
+++ b/hw/arm/xlnx-versal.c
80
- vms->highest_gpa = region_base + region_size - 1;
51
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
81
+ *region_enabled &= fits;
52
82
+ if (vms->highmem_compact && !*region_enabled) {
53
for (i = 0; i < ARRAY_SIZE(s->fpd.apu.cpu); i++) {
83
+ continue;
54
Object *obj;
84
}
55
- char *name;
85
56
-
86
- *region_enabled &= fits;
57
- obj = object_new(XLNX_VERSAL_ACPU_TYPE);
87
base = region_base + region_size;
58
- if (!obj) {
88
+ if (fits) {
59
- error_report("Unable to create apu.cpu[%d] of type %s",
89
+ vms->highest_gpa = base - 1;
60
- i, XLNX_VERSAL_ACPU_TYPE);
90
+ }
61
- exit(EXIT_FAILURE);
62
- }
63
-
64
- name = g_strdup_printf("apu-cpu[%d]", i);
65
- object_property_add_child(OBJECT(s), name, obj, &error_fatal);
66
- g_free(name);
67
68
+ object_initialize_child(OBJECT(s), "apu-cpu[*]",
69
+ &s->fpd.apu.cpu[i], sizeof(s->fpd.apu.cpu[i]),
70
+ XLNX_VERSAL_ACPU_TYPE, &error_abort, NULL);
71
+ obj = OBJECT(&s->fpd.apu.cpu[i]);
72
object_property_set_int(obj, s->cfg.psci_conduit,
73
"psci-conduit", &error_abort);
74
if (i) {
75
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
76
object_property_set_link(obj, OBJECT(&s->fpd.apu.mr), "memory",
77
&error_abort);
78
object_property_set_bool(obj, true, "realized", &error_fatal);
79
- s->fpd.apu.cpu[i] = ARM_CPU(obj);
80
}
91
}
81
}
92
}
82
93
83
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_gic(Versal *s, qemu_irq *pic)
84
}
85
86
for (i = 0; i < nr_apu_cpus; i++) {
87
- DeviceState *cpudev = DEVICE(s->fpd.apu.cpu[i]);
88
+ DeviceState *cpudev = DEVICE(&s->fpd.apu.cpu[i]);
89
int ppibase = XLNX_VERSAL_NR_IRQS + i * GIC_INTERNAL + GIC_NR_SGIS;
90
qemu_irq maint_irq;
91
int ti;
92
--
94
--
93
2.20.1
95
2.25.1
94
95
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Gavin Shan <gshan@redhat.com>
2
2
3
hw/arm: versal: Add support for the RTC.
3
After the improvement to high memory region address assignment is
4
applied, the memory layout can be changed, introducing possible
5
migration breakage. For example, VIRT_HIGH_PCIE_MMIO memory region
6
is disabled or enabled when the optimization is applied or not, with
7
the following configuration. The configuration is only achievable by
8
modifying the source code until more properties are added to allow
9
users selectively disable those high memory regions.
4
10
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
11
pa_bits = 40;
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
vms->highmem_redists = false;
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
vms->highmem_ecam = false;
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
14
vms->highmem_mmio = true;
9
Message-id: 20200427181649.26851-10-edgar.iglesias@gmail.com
15
16
# qemu-system-aarch64 -accel kvm -cpu host \
17
-machine virt-7.2,compact-highmem={on, off} \
18
-m 4G,maxmem=511G -monitor stdio
19
20
Region compact-highmem=off compact-highmem=on
21
----------------------------------------------------------------
22
MEM [1GB 512GB] [1GB 512GB]
23
HIGH_GIC_REDISTS2 [512GB 512GB+64MB] [disabled]
24
HIGH_PCIE_ECAM [512GB+256MB 512GB+512MB] [disabled]
25
HIGH_PCIE_MMIO [disabled] [512GB 1TB]
26
27
In order to keep backwords compatibility, we need to disable the
28
optimization on machine, which is virt-7.1 or ealier than it. It
29
means the optimization is enabled by default from virt-7.2. Besides,
30
'compact-highmem' property is added so that the optimization can be
31
explicitly enabled or disabled on all machine types by users.
32
33
Signed-off-by: Gavin Shan <gshan@redhat.com>
34
Reviewed-by: Eric Auger <eric.auger@redhat.com>
35
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
36
Reviewed-by: Marc Zyngier <maz@kernel.org>
37
Tested-by: Zhenyu Zhang <zhenyzha@redhat.com>
38
Message-id: 20221029224307.138822-7-gshan@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
39
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
40
---
12
include/hw/arm/xlnx-versal.h | 8 ++++++++
41
docs/system/arm/virt.rst | 4 ++++
13
hw/arm/xlnx-versal.c | 21 +++++++++++++++++++++
42
include/hw/arm/virt.h | 1 +
14
2 files changed, 29 insertions(+)
43
hw/arm/virt.c | 32 ++++++++++++++++++++++++++++++++
44
3 files changed, 37 insertions(+)
15
45
16
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
46
diff --git a/docs/system/arm/virt.rst b/docs/system/arm/virt.rst
17
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/xlnx-versal.h
48
--- a/docs/system/arm/virt.rst
19
+++ b/include/hw/arm/xlnx-versal.h
49
+++ b/docs/system/arm/virt.rst
20
@@ -XXX,XX +XXX,XX @@
50
@@ -XXX,XX +XXX,XX @@ highmem
21
#include "hw/char/pl011.h"
51
address space above 32 bits. The default is ``on`` for machine types
22
#include "hw/dma/xlnx-zdma.h"
52
later than ``virt-2.12``.
23
#include "hw/net/cadence_gem.h"
53
24
+#include "hw/rtc/xlnx-zynqmp-rtc.h"
54
+compact-highmem
25
55
+ Set ``on``/``off`` to enable/disable the compact layout for high memory regions.
26
#define TYPE_XLNX_VERSAL "xlnx-versal"
56
+ The default is ``on`` for machine types later than ``virt-7.2``.
27
#define XLNX_VERSAL(obj) OBJECT_CHECK(Versal, (obj), TYPE_XLNX_VERSAL)
28
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
29
struct {
30
SDHCIState sd[XLNX_VERSAL_NR_SDS];
31
} iou;
32
+
57
+
33
+ XlnxZynqMPRTC rtc;
58
gic-version
34
} pmc;
59
Specify the version of the Generic Interrupt Controller (GIC) to provide.
35
60
Valid values are:
36
struct {
61
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
37
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
38
#define VERSAL_GEM1_IRQ_0 58
39
#define VERSAL_GEM1_WAKE_IRQ_0 59
40
#define VERSAL_ADMA_IRQ_0 60
41
+#define VERSAL_RTC_APB_ERR_IRQ 121
42
#define VERSAL_SD0_IRQ_0 126
43
+#define VERSAL_RTC_ALARM_IRQ 142
44
+#define VERSAL_RTC_SECONDS_IRQ 143
45
46
/* Architecturally reserved IRQs suitable for virtualization. */
47
#define VERSAL_RSVD_IRQ_FIRST 111
48
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
49
#define MM_PMC_SD0_SIZE 0x10000
50
#define MM_PMC_CRP 0xf1260000U
51
#define MM_PMC_CRP_SIZE 0x10000
52
+#define MM_PMC_RTC 0xf12a0000
53
+#define MM_PMC_RTC_SIZE 0x10000
54
#endif
55
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
56
index XXXXXXX..XXXXXXX 100644
62
index XXXXXXX..XXXXXXX 100644
57
--- a/hw/arm/xlnx-versal.c
63
--- a/include/hw/arm/virt.h
58
+++ b/hw/arm/xlnx-versal.c
64
+++ b/include/hw/arm/virt.h
59
@@ -XXX,XX +XXX,XX @@ static void versal_create_sds(Versal *s, qemu_irq *pic)
65
@@ -XXX,XX +XXX,XX @@ struct VirtMachineClass {
60
}
66
bool no_pmu;
67
bool claim_edge_triggered_timers;
68
bool smbios_old_sys_ver;
69
+ bool no_highmem_compact;
70
bool no_highmem_ecam;
71
bool no_ged; /* Machines < 4.2 have no support for ACPI GED device */
72
bool kvm_no_adjvtime;
73
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
74
index XXXXXXX..XXXXXXX 100644
75
--- a/hw/arm/virt.c
76
+++ b/hw/arm/virt.c
77
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry base_memmap[] = {
78
* Note the extended_memmap is sized so that it eventually also includes the
79
* base_memmap entries (VIRT_HIGH_GIC_REDIST2 index is greater than the last
80
* index of base_memmap).
81
+ *
82
+ * The memory map for these Highmem IO Regions can be in legacy or compact
83
+ * layout, depending on 'compact-highmem' property. With legacy layout, the
84
+ * PA space for one specific region is always reserved, even if the region
85
+ * has been disabled or doesn't fit into the PA space. However, the PA space
86
+ * for the region won't be reserved in these circumstances with compact layout.
87
*/
88
static MemMapEntry extended_memmap[] = {
89
/* Additional 64 MB redist region (can contain up to 512 redistributors) */
90
@@ -XXX,XX +XXX,XX @@ static void virt_set_highmem(Object *obj, bool value, Error **errp)
91
vms->highmem = value;
61
}
92
}
62
93
63
+static void versal_create_rtc(Versal *s, qemu_irq *pic)
94
+static bool virt_get_compact_highmem(Object *obj, Error **errp)
64
+{
95
+{
65
+ SysBusDevice *sbd;
96
+ VirtMachineState *vms = VIRT_MACHINE(obj);
66
+ MemoryRegion *mr;
67
+
97
+
68
+ sysbus_init_child_obj(OBJECT(s), "rtc", &s->pmc.rtc, sizeof(s->pmc.rtc),
98
+ return vms->highmem_compact;
69
+ TYPE_XLNX_ZYNQMP_RTC);
70
+ sbd = SYS_BUS_DEVICE(&s->pmc.rtc);
71
+ qdev_init_nofail(DEVICE(sbd));
72
+
73
+ mr = sysbus_mmio_get_region(sbd, 0);
74
+ memory_region_add_subregion(&s->mr_ps, MM_PMC_RTC, mr);
75
+
76
+ /*
77
+ * TODO: Connect the ALARM and SECONDS interrupts once our RTC model
78
+ * supports them.
79
+ */
80
+ sysbus_connect_irq(sbd, 1, pic[VERSAL_RTC_APB_ERR_IRQ]);
81
+}
99
+}
82
+
100
+
83
/* This takes the board allocated linear DDR memory and creates aliases
101
+static void virt_set_compact_highmem(Object *obj, bool value, Error **errp)
84
* for each split DDR range/aperture on the Versal address map.
102
+{
85
*/
103
+ VirtMachineState *vms = VIRT_MACHINE(obj);
86
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
104
+
87
versal_create_gems(s, pic);
105
+ vms->highmem_compact = value;
88
versal_create_admas(s, pic);
106
+}
89
versal_create_sds(s, pic);
107
+
90
+ versal_create_rtc(s, pic);
108
static bool virt_get_its(Object *obj, Error **errp)
91
versal_map_ddr(s);
109
{
92
versal_unimp(s);
110
VirtMachineState *vms = VIRT_MACHINE(obj);
111
@@ -XXX,XX +XXX,XX @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
112
"Set on/off to enable/disable using "
113
"physical address space above 32 bits");
114
115
+ object_class_property_add_bool(oc, "compact-highmem",
116
+ virt_get_compact_highmem,
117
+ virt_set_compact_highmem);
118
+ object_class_property_set_description(oc, "compact-highmem",
119
+ "Set on/off to enable/disable compact "
120
+ "layout for high memory regions");
121
+
122
object_class_property_add_str(oc, "gic-version", virt_get_gic_version,
123
virt_set_gic_version);
124
object_class_property_set_description(oc, "gic-version",
125
@@ -XXX,XX +XXX,XX @@ static void virt_instance_init(Object *obj)
126
127
/* High memory is enabled by default */
128
vms->highmem = true;
129
+ vms->highmem_compact = !vmc->no_highmem_compact;
130
vms->gic_version = VIRT_GIC_VERSION_NOSEL;
131
132
vms->highmem_ecam = !vmc->no_highmem_ecam;
133
@@ -XXX,XX +XXX,XX @@ DEFINE_VIRT_MACHINE_AS_LATEST(7, 2)
134
135
static void virt_machine_7_1_options(MachineClass *mc)
136
{
137
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
138
+
139
virt_machine_7_2_options(mc);
140
compat_props_add(mc->compat_props, hw_compat_7_1, hw_compat_7_1_len);
141
+ /* Compact layout for high memory regions was introduced with 7.2 */
142
+ vmc->no_highmem_compact = true;
143
}
144
DEFINE_VIRT_MACHINE(7, 1)
93
145
94
--
146
--
95
2.20.1
147
2.25.1
96
97
diff view generated by jsdifflib
1
Convert the Neon VMUL, VMLA, VMLS and VSHL insns in the
1
From: Gavin Shan <gshan@redhat.com>
2
3-reg-same grouping to decodetree.
3
2
3
The 3 high memory regions are usually enabled by default, but they may
4
be not used. For example, VIRT_HIGH_GIC_REDIST2 isn't needed by GICv2.
5
This leads to waste in the PA space.
6
7
Add properties ("highmem-redists", "highmem-ecam", "highmem-mmio") to
8
allow users selectively disable them if needed. After that, the high
9
memory region for GICv3 or GICv4 redistributor can be disabled by user,
10
the number of maximal supported CPUs needs to be calculated based on
11
'vms->highmem_redists'. The follow-up error message is also improved
12
to indicate if the high memory region for GICv3 and GICv4 has been
13
enabled or not.
14
15
Suggested-by: Marc Zyngier <maz@kernel.org>
16
Signed-off-by: Gavin Shan <gshan@redhat.com>
17
Reviewed-by: Marc Zyngier <maz@kernel.org>
18
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
19
Reviewed-by: Eric Auger <eric.auger@redhat.com>
20
Message-id: 20221029224307.138822-8-gshan@redhat.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20200430181003.21682-20-peter.maydell@linaro.org
7
---
22
---
8
target/arm/neon-dp.decode | 9 +++++++
23
docs/system/arm/virt.rst | 13 +++++++
9
target/arm/translate-neon.inc.c | 44 +++++++++++++++++++++++++++++++++
24
hw/arm/virt.c | 75 ++++++++++++++++++++++++++++++++++++++--
10
target/arm/translate.c | 28 +++------------------
25
2 files changed, 86 insertions(+), 2 deletions(-)
11
3 files changed, 56 insertions(+), 25 deletions(-)
12
26
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
27
diff --git a/docs/system/arm/virt.rst b/docs/system/arm/virt.rst
14
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
29
--- a/docs/system/arm/virt.rst
16
+++ b/target/arm/neon-dp.decode
30
+++ b/docs/system/arm/virt.rst
17
@@ -XXX,XX +XXX,XX @@ VCGT_U_3s 1111 001 1 0 . .. .... .... 0011 . . . 0 .... @3same
31
@@ -XXX,XX +XXX,XX @@ compact-highmem
18
VCGE_S_3s 1111 001 0 0 . .. .... .... 0011 . . . 1 .... @3same
32
Set ``on``/``off`` to enable/disable the compact layout for high memory regions.
19
VCGE_U_3s 1111 001 1 0 . .. .... .... 0011 . . . 1 .... @3same
33
The default is ``on`` for machine types later than ``virt-7.2``.
20
34
21
+VSHL_S_3s 1111 001 0 0 . .. .... .... 0100 . . . 0 .... @3same
35
+highmem-redists
22
+VSHL_U_3s 1111 001 1 0 . .. .... .... 0100 . . . 0 .... @3same
36
+ Set ``on``/``off`` to enable/disable the high memory region for GICv3 or
37
+ GICv4 redistributor. The default is ``on``. Setting this to ``off`` will
38
+ limit the maximum number of CPUs when GICv3 or GICv4 is used.
23
+
39
+
24
VMAX_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 0 .... @3same
40
+highmem-ecam
25
VMAX_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 0 .... @3same
41
+ Set ``on``/``off`` to enable/disable the high memory region for PCI ECAM.
26
VMIN_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 1 .... @3same
42
+ The default is ``on`` for machine types later than ``virt-3.0``.
27
@@ -XXX,XX +XXX,XX @@ VSUB_3s 1111 001 1 0 . .. .... .... 1000 . . . 0 .... @3same
28
29
VTST_3s 1111 001 0 0 . .. .... .... 1000 . . . 1 .... @3same
30
VCEQ_3s 1111 001 1 0 . .. .... .... 1000 . . . 1 .... @3same
31
+
43
+
32
+VMLA_3s 1111 001 0 0 . .. .... .... 1001 . . . 0 .... @3same
44
+highmem-mmio
33
+VMLS_3s 1111 001 1 0 . .. .... .... 1001 . . . 0 .... @3same
45
+ Set ``on``/``off`` to enable/disable the high memory region for PCI MMIO.
46
+ The default is ``on``.
34
+
47
+
35
+VMUL_3s 1111 001 0 0 . .. .... .... 1001 . . . 1 .... @3same
48
gic-version
36
+VMUL_p_3s 1111 001 1 0 . .. .... .... 1001 . . . 1 .... @3same
49
Specify the version of the Generic Interrupt Controller (GIC) to provide.
37
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
50
Valid values are:
51
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
38
index XXXXXXX..XXXXXXX 100644
52
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/translate-neon.inc.c
53
--- a/hw/arm/virt.c
40
+++ b/target/arm/translate-neon.inc.c
54
+++ b/hw/arm/virt.c
41
@@ -XXX,XX +XXX,XX @@ DO_3SAME_NO_SZ_3(VMAX_S, tcg_gen_gvec_smax)
55
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
42
DO_3SAME_NO_SZ_3(VMAX_U, tcg_gen_gvec_umax)
56
if (vms->gic_version == VIRT_GIC_VERSION_2) {
43
DO_3SAME_NO_SZ_3(VMIN_S, tcg_gen_gvec_smin)
57
virt_max_cpus = GIC_NCPU;
44
DO_3SAME_NO_SZ_3(VMIN_U, tcg_gen_gvec_umin)
58
} else {
45
+DO_3SAME_NO_SZ_3(VMUL, tcg_gen_gvec_mul)
59
- virt_max_cpus = virt_redist_capacity(vms, VIRT_GIC_REDIST) +
46
60
- virt_redist_capacity(vms, VIRT_HIGH_GIC_REDIST2);
47
#define DO_3SAME_CMP(INSN, COND) \
61
+ virt_max_cpus = virt_redist_capacity(vms, VIRT_GIC_REDIST);
48
static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
62
+ if (vms->highmem_redists) {
49
@@ -XXX,XX +XXX,XX @@ DO_3SAME_GVEC4(VQADD_S, sqadd_op)
63
+ virt_max_cpus += virt_redist_capacity(vms, VIRT_HIGH_GIC_REDIST2);
50
DO_3SAME_GVEC4(VQADD_U, uqadd_op)
64
+ }
51
DO_3SAME_GVEC4(VQSUB_S, sqsub_op)
65
}
52
DO_3SAME_GVEC4(VQSUB_U, uqsub_op)
66
67
if (max_cpus > virt_max_cpus) {
68
error_report("Number of SMP CPUs requested (%d) exceeds max CPUs "
69
"supported by machine 'mach-virt' (%d)",
70
max_cpus, virt_max_cpus);
71
+ if (vms->gic_version != VIRT_GIC_VERSION_2 && !vms->highmem_redists) {
72
+ error_printf("Try 'highmem-redists=on' for more CPUs\n");
73
+ }
53
+
74
+
54
+static void gen_VMUL_p_3s(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
75
exit(1);
55
+ uint32_t rm_ofs, uint32_t oprsz, uint32_t maxsz)
76
}
77
78
@@ -XXX,XX +XXX,XX @@ static void virt_set_compact_highmem(Object *obj, bool value, Error **errp)
79
vms->highmem_compact = value;
80
}
81
82
+static bool virt_get_highmem_redists(Object *obj, Error **errp)
56
+{
83
+{
57
+ tcg_gen_gvec_3_ool(rd_ofs, rn_ofs, rm_ofs, oprsz, maxsz,
84
+ VirtMachineState *vms = VIRT_MACHINE(obj);
58
+ 0, gen_helper_gvec_pmul_b);
85
+
86
+ return vms->highmem_redists;
59
+}
87
+}
60
+
88
+
61
+static bool trans_VMUL_p_3s(DisasContext *s, arg_3same *a)
89
+static void virt_set_highmem_redists(Object *obj, bool value, Error **errp)
62
+{
90
+{
63
+ if (a->size != 0) {
91
+ VirtMachineState *vms = VIRT_MACHINE(obj);
64
+ return false;
92
+
65
+ }
93
+ vms->highmem_redists = value;
66
+ return do_3same(s, a, gen_VMUL_p_3s);
67
+}
94
+}
68
+
95
+
69
+#define DO_3SAME_GVEC3_NO_SZ_3(INSN, OPARRAY) \
96
+static bool virt_get_highmem_ecam(Object *obj, Error **errp)
70
+ static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
97
+{
71
+ uint32_t rn_ofs, uint32_t rm_ofs, \
98
+ VirtMachineState *vms = VIRT_MACHINE(obj);
72
+ uint32_t oprsz, uint32_t maxsz) \
99
+
73
+ { \
100
+ return vms->highmem_ecam;
74
+ tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs, \
101
+}
75
+ oprsz, maxsz, &OPARRAY[vece]); \
102
+
76
+ } \
103
+static void virt_set_highmem_ecam(Object *obj, bool value, Error **errp)
77
+ DO_3SAME_NO_SZ_3(INSN, gen_##INSN##_3s)
104
+{
105
+ VirtMachineState *vms = VIRT_MACHINE(obj);
106
+
107
+ vms->highmem_ecam = value;
108
+}
109
+
110
+static bool virt_get_highmem_mmio(Object *obj, Error **errp)
111
+{
112
+ VirtMachineState *vms = VIRT_MACHINE(obj);
113
+
114
+ return vms->highmem_mmio;
115
+}
116
+
117
+static void virt_set_highmem_mmio(Object *obj, bool value, Error **errp)
118
+{
119
+ VirtMachineState *vms = VIRT_MACHINE(obj);
120
+
121
+ vms->highmem_mmio = value;
122
+}
78
+
123
+
79
+
124
+
80
+DO_3SAME_GVEC3_NO_SZ_3(VMLA, mla_op)
125
static bool virt_get_its(Object *obj, Error **errp)
81
+DO_3SAME_GVEC3_NO_SZ_3(VMLS, mls_op)
126
{
127
VirtMachineState *vms = VIRT_MACHINE(obj);
128
@@ -XXX,XX +XXX,XX @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
129
"Set on/off to enable/disable compact "
130
"layout for high memory regions");
131
132
+ object_class_property_add_bool(oc, "highmem-redists",
133
+ virt_get_highmem_redists,
134
+ virt_set_highmem_redists);
135
+ object_class_property_set_description(oc, "highmem-redists",
136
+ "Set on/off to enable/disable high "
137
+ "memory region for GICv3 or GICv4 "
138
+ "redistributor");
82
+
139
+
83
+#define DO_3SAME_GVEC3_SHIFT(INSN, OPARRAY) \
140
+ object_class_property_add_bool(oc, "highmem-ecam",
84
+ static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
141
+ virt_get_highmem_ecam,
85
+ uint32_t rn_ofs, uint32_t rm_ofs, \
142
+ virt_set_highmem_ecam);
86
+ uint32_t oprsz, uint32_t maxsz) \
143
+ object_class_property_set_description(oc, "highmem-ecam",
87
+ { \
144
+ "Set on/off to enable/disable high "
88
+ /* Note the operation is vshl vd,vm,vn */ \
145
+ "memory region for PCI ECAM");
89
+ tcg_gen_gvec_3(rd_ofs, rm_ofs, rn_ofs, \
90
+ oprsz, maxsz, &OPARRAY[vece]); \
91
+ } \
92
+ DO_3SAME(INSN, gen_##INSN##_3s)
93
+
146
+
94
+DO_3SAME_GVEC3_SHIFT(VSHL_S, sshl_op)
147
+ object_class_property_add_bool(oc, "highmem-mmio",
95
+DO_3SAME_GVEC3_SHIFT(VSHL_U, ushl_op)
148
+ virt_get_highmem_mmio,
96
diff --git a/target/arm/translate.c b/target/arm/translate.c
149
+ virt_set_highmem_mmio);
97
index XXXXXXX..XXXXXXX 100644
150
+ object_class_property_set_description(oc, "highmem-mmio",
98
--- a/target/arm/translate.c
151
+ "Set on/off to enable/disable high "
99
+++ b/target/arm/translate.c
152
+ "memory region for PCI MMIO");
100
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
153
+
101
}
154
object_class_property_add_str(oc, "gic-version", virt_get_gic_version,
102
return 1;
155
virt_set_gic_version);
103
156
object_class_property_set_description(oc, "gic-version",
104
- case NEON_3R_VMUL: /* VMUL */
105
- if (u) {
106
- /* Polynomial case allows only P8. */
107
- if (size != 0) {
108
- return 1;
109
- }
110
- tcg_gen_gvec_3_ool(rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size,
111
- 0, gen_helper_gvec_pmul_b);
112
- } else {
113
- tcg_gen_gvec_mul(size, rd_ofs, rn_ofs, rm_ofs,
114
- vec_size, vec_size);
115
- }
116
- return 0;
117
-
118
- case NEON_3R_VML: /* VMLA, VMLS */
119
- tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size,
120
- u ? &mls_op[size] : &mla_op[size]);
121
- return 0;
122
-
123
- case NEON_3R_VSHL:
124
- /* Note the operation is vshl vd,vm,vn */
125
- tcg_gen_gvec_3(rd_ofs, rm_ofs, rn_ofs, vec_size, vec_size,
126
- u ? &ushl_op[size] : &sshl_op[size]);
127
- return 0;
128
-
129
case NEON_3R_VADD_VSUB:
130
case NEON_3R_LOGIC:
131
case NEON_3R_VMAX:
132
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
133
case NEON_3R_VCGE:
134
case NEON_3R_VQADD:
135
case NEON_3R_VQSUB:
136
+ case NEON_3R_VMUL:
137
+ case NEON_3R_VML:
138
+ case NEON_3R_VSHL:
139
/* Already handled by decodetree */
140
return 1;
141
}
142
--
157
--
143
2.20.1
158
2.25.1
144
145
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Mihai Carabas <mihai.carabas@oracle.com>
2
2
3
Embed the GEMs into the SoC type.
3
Use the base_memmap to build the SMBIOS 19 table which provides the address
4
mapping for a Physical Memory Array (from spec [1] chapter 7.20).
4
5
5
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
6
This was present on i386 from commit c97294ec1b9e36887e119589d456557d72ab37b5
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
("SMBIOS: Build aggregate smbios tables and entry point").
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
[1] https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.5.0.pdf
9
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
10
10
Message-id: 20200427181649.26851-6-edgar.iglesias@gmail.com
11
The absence of this table is a breach of the specs and is
12
detected by the FirmwareTestSuite (FWTS), but it doesn't
13
cause any known problems for guest OSes.
14
15
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
16
Message-id: 1668789029-5432-1-git-send-email-mihai.carabas@oracle.com
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
include/hw/arm/xlnx-versal.h | 3 ++-
20
hw/arm/virt.c | 8 +++++++-
14
hw/arm/xlnx-versal.c | 15 ++++++++-------
21
1 file changed, 7 insertions(+), 1 deletion(-)
15
2 files changed, 10 insertions(+), 8 deletions(-)
16
22
17
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
23
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
18
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/xlnx-versal.h
25
--- a/hw/arm/virt.c
20
+++ b/include/hw/arm/xlnx-versal.h
26
+++ b/hw/arm/virt.c
21
@@ -XXX,XX +XXX,XX @@
27
@@ -XXX,XX +XXX,XX @@ static void *machvirt_dtb(const struct arm_boot_info *binfo, int *fdt_size)
22
#include "hw/arm/boot.h"
28
static void virt_build_smbios(VirtMachineState *vms)
23
#include "hw/intc/arm_gicv3.h"
29
{
24
#include "hw/char/pl011.h"
30
MachineClass *mc = MACHINE_GET_CLASS(vms);
25
+#include "hw/net/cadence_gem.h"
31
+ MachineState *ms = MACHINE(vms);
26
32
VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
27
#define TYPE_XLNX_VERSAL "xlnx-versal"
33
uint8_t *smbios_tables, *smbios_anchor;
28
#define XLNX_VERSAL(obj) OBJECT_CHECK(Versal, (obj), TYPE_XLNX_VERSAL)
34
size_t smbios_tables_len, smbios_anchor_len;
29
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
35
+ struct smbios_phys_mem_area mem_array;
30
36
const char *product = "QEMU Virtual Machine";
31
struct {
37
32
PL011State uart[XLNX_VERSAL_NR_UARTS];
38
if (kvm_enabled()) {
33
- SysBusDevice *gem[XLNX_VERSAL_NR_GEMS];
39
@@ -XXX,XX +XXX,XX @@ static void virt_build_smbios(VirtMachineState *vms)
34
+ CadenceGEMState gem[XLNX_VERSAL_NR_GEMS];
40
vmc->smbios_old_sys_ver ? "1.0" : mc->name, false,
35
SysBusDevice *adma[XLNX_VERSAL_NR_ADMAS];
41
true, SMBIOS_ENTRY_POINT_TYPE_64);
36
} iou;
42
37
} lpd;
43
- smbios_get_tables(MACHINE(vms), NULL, 0,
38
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
44
+ /* build the array of physical mem area from base_memmap */
39
index XXXXXXX..XXXXXXX 100644
45
+ mem_array.address = vms->memmap[VIRT_MEM].base;
40
--- a/hw/arm/xlnx-versal.c
46
+ mem_array.length = ms->ram_size;
41
+++ b/hw/arm/xlnx-versal.c
47
+
42
@@ -XXX,XX +XXX,XX @@ static void versal_create_gems(Versal *s, qemu_irq *pic)
48
+ smbios_get_tables(ms, &mem_array, 1,
43
DeviceState *dev;
49
&smbios_tables, &smbios_tables_len,
44
MemoryRegion *mr;
50
&smbios_anchor, &smbios_anchor_len,
45
51
&error_fatal);
46
- dev = qdev_create(NULL, "cadence_gem");
47
- s->lpd.iou.gem[i] = SYS_BUS_DEVICE(dev);
48
- object_property_add_child(OBJECT(s), name, OBJECT(dev), &error_fatal);
49
+ sysbus_init_child_obj(OBJECT(s), name,
50
+ &s->lpd.iou.gem[i], sizeof(s->lpd.iou.gem[i]),
51
+ TYPE_CADENCE_GEM);
52
+ dev = DEVICE(&s->lpd.iou.gem[i]);
53
if (nd->used) {
54
qemu_check_nic_model(nd, "cadence_gem");
55
qdev_set_nic_properties(dev, nd);
56
}
57
- object_property_set_int(OBJECT(s->lpd.iou.gem[i]),
58
+ object_property_set_int(OBJECT(dev),
59
2, "num-priority-queues",
60
&error_abort);
61
- object_property_set_link(OBJECT(s->lpd.iou.gem[i]),
62
+ object_property_set_link(OBJECT(dev),
63
OBJECT(&s->mr_ps), "dma",
64
&error_abort);
65
qdev_init_nofail(dev);
66
67
- mr = sysbus_mmio_get_region(s->lpd.iou.gem[i], 0);
68
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
69
memory_region_add_subregion(&s->mr_ps, addrs[i], mr);
70
71
- sysbus_connect_irq(s->lpd.iou.gem[i], 0, pic[irqs[i]]);
72
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[irqs[i]]);
73
g_free(name);
74
}
75
}
76
--
52
--
77
2.20.1
53
2.25.1
78
79
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Timofey Kutergin <tkutergin@gmail.com>
2
2
3
Add support for SD.
3
The Cortex-A55 is one of the newer armv8.2+ CPUs; in particular
4
it supports the Privileged Access Never (PAN) feature. Add
5
a model of this CPU, so you can use a CPU type on the virt
6
board that models a specific real hardware CPU, rather than
7
having to use the QEMU-specific "max" CPU type.
4
8
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Signed-off-by: Timofey Kutergin <tkutergin@gmail.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20221121150819.2782817-1-tkutergin@gmail.com
7
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
11
[PMM: tweaked commit message]
8
Message-id: 20200427181649.26851-11-edgar.iglesias@gmail.com
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
14
---
11
hw/arm/xlnx-versal-virt.c | 46 +++++++++++++++++++++++++++++++++++++++
15
docs/system/arm/virt.rst | 1 +
12
1 file changed, 46 insertions(+)
16
hw/arm/virt.c | 1 +
17
target/arm/cpu64.c | 69 ++++++++++++++++++++++++++++++++++++++++
18
3 files changed, 71 insertions(+)
13
19
14
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
20
diff --git a/docs/system/arm/virt.rst b/docs/system/arm/virt.rst
15
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/xlnx-versal-virt.c
22
--- a/docs/system/arm/virt.rst
17
+++ b/hw/arm/xlnx-versal-virt.c
23
+++ b/docs/system/arm/virt.rst
18
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@ Supported guest CPU types:
19
#include "hw/arm/sysbus-fdt.h"
25
- ``cortex-a15`` (32-bit; the default)
20
#include "hw/arm/fdt.h"
26
- ``cortex-a35`` (64-bit)
21
#include "cpu.h"
27
- ``cortex-a53`` (64-bit)
22
+#include "hw/qdev-properties.h"
28
+- ``cortex-a55`` (64-bit)
23
#include "hw/arm/xlnx-versal.h"
29
- ``cortex-a57`` (64-bit)
24
30
- ``cortex-a72`` (64-bit)
25
#define TYPE_XLNX_VERSAL_VIRT_MACHINE MACHINE_TYPE_NAME("xlnx-versal-virt")
31
- ``cortex-a76`` (64-bit)
26
@@ -XXX,XX +XXX,XX @@ static void fdt_add_zdma_nodes(VersalVirt *s)
32
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
27
}
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/arm/virt.c
35
+++ b/hw/arm/virt.c
36
@@ -XXX,XX +XXX,XX @@ static const char *valid_cpus[] = {
37
ARM_CPU_TYPE_NAME("cortex-a15"),
38
ARM_CPU_TYPE_NAME("cortex-a35"),
39
ARM_CPU_TYPE_NAME("cortex-a53"),
40
+ ARM_CPU_TYPE_NAME("cortex-a55"),
41
ARM_CPU_TYPE_NAME("cortex-a57"),
42
ARM_CPU_TYPE_NAME("cortex-a72"),
43
ARM_CPU_TYPE_NAME("cortex-a76"),
44
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/cpu64.c
47
+++ b/target/arm/cpu64.c
48
@@ -XXX,XX +XXX,XX @@ static void aarch64_a53_initfn(Object *obj)
49
define_cortex_a72_a57_a53_cp_reginfo(cpu);
28
}
50
}
29
51
30
+static void fdt_add_sd_nodes(VersalVirt *s)
52
+static void aarch64_a55_initfn(Object *obj)
31
+{
53
+{
32
+ const char clocknames[] = "clk_xin\0clk_ahb";
54
+ ARMCPU *cpu = ARM_CPU(obj);
33
+ const char compat[] = "arasan,sdhci-8.9a";
34
+ int i;
35
+
55
+
36
+ for (i = ARRAY_SIZE(s->soc.pmc.iou.sd) - 1; i >= 0; i--) {
56
+ cpu->dtb_compatible = "arm,cortex-a55";
37
+ uint64_t addr = MM_PMC_SD0 + MM_PMC_SD0_SIZE * i;
57
+ set_feature(&cpu->env, ARM_FEATURE_V8);
38
+ char *name = g_strdup_printf("/sdhci@%" PRIx64, addr);
58
+ set_feature(&cpu->env, ARM_FEATURE_NEON);
59
+ set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
60
+ set_feature(&cpu->env, ARM_FEATURE_AARCH64);
61
+ set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
62
+ set_feature(&cpu->env, ARM_FEATURE_EL2);
63
+ set_feature(&cpu->env, ARM_FEATURE_EL3);
64
+ set_feature(&cpu->env, ARM_FEATURE_PMU);
39
+
65
+
40
+ qemu_fdt_add_subnode(s->fdt, name);
66
+ /* Ordered by B2.4 AArch64 registers by functional group */
67
+ cpu->clidr = 0x82000023;
68
+ cpu->ctr = 0x84448004; /* L1Ip = VIPT */
69
+ cpu->dcz_blocksize = 4; /* 64 bytes */
70
+ cpu->isar.id_aa64dfr0 = 0x0000000010305408ull;
71
+ cpu->isar.id_aa64isar0 = 0x0000100010211120ull;
72
+ cpu->isar.id_aa64isar1 = 0x0000000000100001ull;
73
+ cpu->isar.id_aa64mmfr0 = 0x0000000000101122ull;
74
+ cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
75
+ cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull;
76
+ cpu->isar.id_aa64pfr0 = 0x0000000010112222ull;
77
+ cpu->isar.id_aa64pfr1 = 0x0000000000000010ull;
78
+ cpu->id_afr0 = 0x00000000;
79
+ cpu->isar.id_dfr0 = 0x04010088;
80
+ cpu->isar.id_isar0 = 0x02101110;
81
+ cpu->isar.id_isar1 = 0x13112111;
82
+ cpu->isar.id_isar2 = 0x21232042;
83
+ cpu->isar.id_isar3 = 0x01112131;
84
+ cpu->isar.id_isar4 = 0x00011142;
85
+ cpu->isar.id_isar5 = 0x01011121;
86
+ cpu->isar.id_isar6 = 0x00000010;
87
+ cpu->isar.id_mmfr0 = 0x10201105;
88
+ cpu->isar.id_mmfr1 = 0x40000000;
89
+ cpu->isar.id_mmfr2 = 0x01260000;
90
+ cpu->isar.id_mmfr3 = 0x02122211;
91
+ cpu->isar.id_mmfr4 = 0x00021110;
92
+ cpu->isar.id_pfr0 = 0x10010131;
93
+ cpu->isar.id_pfr1 = 0x00011011;
94
+ cpu->isar.id_pfr2 = 0x00000011;
95
+ cpu->midr = 0x412FD050; /* r2p0 */
96
+ cpu->revidr = 0;
41
+
97
+
42
+ qemu_fdt_setprop_cells(s->fdt, name, "clocks",
98
+ /* From B2.23 CCSIDR_EL1 */
43
+ s->phandle.clk_25Mhz, s->phandle.clk_25Mhz);
99
+ cpu->ccsidr[0] = 0x700fe01a; /* 32KB L1 dcache */
44
+ qemu_fdt_setprop(s->fdt, name, "clock-names",
100
+ cpu->ccsidr[1] = 0x200fe01a; /* 32KB L1 icache */
45
+ clocknames, sizeof(clocknames));
101
+ cpu->ccsidr[2] = 0x703fe07a; /* 512KB L2 cache */
46
+ qemu_fdt_setprop_cells(s->fdt, name, "interrupts",
102
+
47
+ GIC_FDT_IRQ_TYPE_SPI, VERSAL_SD0_IRQ_0 + i * 2,
103
+ /* From B2.96 SCTLR_EL3 */
48
+ GIC_FDT_IRQ_FLAGS_LEVEL_HI);
104
+ cpu->reset_sctlr = 0x30c50838;
49
+ qemu_fdt_setprop_sized_cells(s->fdt, name, "reg",
105
+
50
+ 2, addr, 2, MM_PMC_SD0_SIZE);
106
+ /* From B4.45 ICH_VTR_EL2 */
51
+ qemu_fdt_setprop(s->fdt, name, "compatible", compat, sizeof(compat));
107
+ cpu->gic_num_lrs = 4;
52
+ g_free(name);
108
+ cpu->gic_vpribits = 5;
53
+ }
109
+ cpu->gic_vprebits = 5;
110
+ cpu->gic_pribits = 5;
111
+
112
+ cpu->isar.mvfr0 = 0x10110222;
113
+ cpu->isar.mvfr1 = 0x13211111;
114
+ cpu->isar.mvfr2 = 0x00000043;
115
+
116
+ /* From D5.4 AArch64 PMU register summary */
117
+ cpu->isar.reset_pmcr_el0 = 0x410b3000;
54
+}
118
+}
55
+
119
+
56
static void fdt_nop_memory_nodes(void *fdt, Error **errp)
120
static void aarch64_a72_initfn(Object *obj)
57
{
121
{
58
Error *err = NULL;
122
ARMCPU *cpu = ARM_CPU(obj);
59
@@ -XXX,XX +XXX,XX @@ static void create_virtio_regions(VersalVirt *s)
123
@@ -XXX,XX +XXX,XX @@ static const ARMCPUInfo aarch64_cpus[] = {
60
}
124
{ .name = "cortex-a35", .initfn = aarch64_a35_initfn },
61
}
125
{ .name = "cortex-a57", .initfn = aarch64_a57_initfn },
62
126
{ .name = "cortex-a53", .initfn = aarch64_a53_initfn },
63
+static void sd_plugin_card(SDHCIState *sd, DriveInfo *di)
127
+ { .name = "cortex-a55", .initfn = aarch64_a55_initfn },
64
+{
128
{ .name = "cortex-a72", .initfn = aarch64_a72_initfn },
65
+ BlockBackend *blk = di ? blk_by_legacy_dinfo(di) : NULL;
129
{ .name = "cortex-a76", .initfn = aarch64_a76_initfn },
66
+ DeviceState *card;
130
{ .name = "a64fx", .initfn = aarch64_a64fx_initfn },
67
+
68
+ card = qdev_create(qdev_get_child_bus(DEVICE(sd), "sd-bus"), TYPE_SD_CARD);
69
+ object_property_add_child(OBJECT(sd), "card[*]", OBJECT(card),
70
+ &error_fatal);
71
+ qdev_prop_set_drive(card, "drive", blk, &error_fatal);
72
+ object_property_set_bool(OBJECT(card), true, "realized", &error_fatal);
73
+}
74
+
75
static void versal_virt_init(MachineState *machine)
76
{
77
VersalVirt *s = XLNX_VERSAL_VIRT_MACHINE(machine);
78
int psci_conduit = QEMU_PSCI_CONDUIT_DISABLED;
79
+ int i;
80
81
/*
82
* If the user provides an Operating System to be loaded, we expect them
83
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
84
fdt_add_gic_nodes(s);
85
fdt_add_timer_nodes(s);
86
fdt_add_zdma_nodes(s);
87
+ fdt_add_sd_nodes(s);
88
fdt_add_cpu_nodes(s, psci_conduit);
89
fdt_add_clk_node(s, "/clk125", 125000000, s->phandle.clk_125Mhz);
90
fdt_add_clk_node(s, "/clk25", 25000000, s->phandle.clk_25Mhz);
91
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
92
memory_region_add_subregion_overlap(get_system_memory(),
93
0, &s->soc.fpd.apu.mr, 0);
94
95
+ /* Plugin SD cards. */
96
+ for (i = 0; i < ARRAY_SIZE(s->soc.pmc.iou.sd); i++) {
97
+ sd_plugin_card(&s->soc.pmc.iou.sd[i], drive_get_next(IF_SD));
98
+ }
99
+
100
s->binfo.ram_size = machine->ram_size;
101
s->binfo.loader_start = 0x0;
102
s->binfo.get_dtb = versal_virt_get_dtb;
103
--
131
--
104
2.20.1
132
2.25.1
105
106
diff view generated by jsdifflib
1
From: Fredrik Strupe <fredrik@strupe.net>
1
From: Luke Starrett <lukes@xsightlabs.com>
2
2
3
According to Arm ARM, VQDMULL is only valid when U=0, while having
3
The ARM GICv3 TRM describes that the ITLinesNumber field of GICD_TYPER
4
U=1 is unallocated.
4
register:
5
5
6
Signed-off-by: Fredrik Strupe <fredrik@strupe.net>
6
"indicates the maximum SPI INTID that the GIC implementation supports"
7
Fixes: 695272dcb976 ("target-arm: Handle UNDEF cases for Neon 3-regs-different-widths")
7
8
As SPI #0 is absolute IRQ #32, the max SPI INTID should have accounted
9
for the internal 16x SGI's and 16x PPI's. However, the original GICv3
10
model subtracted off the SGI/PPI. Cosmetically this can be seen at OS
11
boot (Linux) showing 32 shy of what should be there, i.e.:
12
13
[ 0.000000] GICv3: 224 SPIs implemented
14
15
Though in hw/arm/virt.c, the machine is configured for 256 SPI's. ARM
16
virt machine likely doesn't have a problem with this because the upper
17
32 IRQ's don't actually have anything meaningful wired. But, this does
18
become a functional issue on a custom use case which wants to make use
19
of these IRQ's. Additionally, boot code (i.e. TF-A) will only init up
20
to the number (blocks of 32) that it believes to actually be there.
21
22
Signed-off-by: Luke Starrett <lukes@xsightlabs.com>
23
Message-id: AM9P193MB168473D99B761E204E032095D40D9@AM9P193MB1684.EURP193.PROD.OUTLOOK.COM
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
24
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
26
---
11
target/arm/translate.c | 2 +-
27
hw/intc/arm_gicv3_dist.c | 4 ++--
12
1 file changed, 1 insertion(+), 1 deletion(-)
28
1 file changed, 2 insertions(+), 2 deletions(-)
13
29
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
30
diff --git a/hw/intc/arm_gicv3_dist.c b/hw/intc/arm_gicv3_dist.c
15
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate.c
32
--- a/hw/intc/arm_gicv3_dist.c
17
+++ b/target/arm/translate.c
33
+++ b/hw/intc/arm_gicv3_dist.c
18
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
34
@@ -XXX,XX +XXX,XX @@ static bool gicd_readl(GICv3State *s, hwaddr offset,
19
{0, 0, 0, 0}, /* VMLSL */
35
* MBIS == 0 (message-based SPIs not supported)
20
{0, 0, 0, 9}, /* VQDMLSL */
36
* SecurityExtn == 1 if security extns supported
21
{0, 0, 0, 0}, /* Integer VMULL */
37
* CPUNumber == 0 since for us ARE is always 1
22
- {0, 0, 0, 1}, /* VQDMULL */
38
- * ITLinesNumber == (num external irqs / 32) - 1
23
+ {0, 0, 0, 9}, /* VQDMULL */
39
+ * ITLinesNumber == (((max SPI IntID + 1) / 32) - 1)
24
{0, 0, 0, 0xa}, /* Polynomial VMULL */
40
*/
25
{0, 0, 0, 7}, /* Reserved: always UNDEF */
41
- int itlinesnumber = ((s->num_irq - GIC_INTERNAL) / 32) - 1;
26
};
42
+ int itlinesnumber = (s->num_irq / 32) - 1;
43
/*
44
* SecurityExtn must be RAZ if GICD_CTLR.DS == 1, and
45
* "security extensions not supported" always implies DS == 1,
27
--
46
--
28
2.20.1
47
2.25.1
29
30
diff view generated by jsdifflib
1
The ARMv8.2-TTS2UXN feature extends the XN field in stage 2
1
FEAT_EVT adds five new bits to the HCR_EL2 register: TTLBIS, TTLBOS,
2
translation table descriptors from just bit [54] to bits [54:53],
2
TICAB, TOCU and TID4. These allow the guest to enable trapping of
3
allowing stage 2 to control execution permissions separately for EL0
3
various EL1 instructions to EL2. In this commit, add the necessary
4
and EL1. Implement the new semantics of the XN field and enable
4
code to allow the guest to set these bits if the feature is present;
5
the feature for our 'max' CPU.
5
because the bit is always zero when the feature isn't present we
6
won't need to use explicit feature checks in the "trap on condition"
7
tests in the following commits.
8
9
Note that although full implementation of the feature (mandatory from
10
Armv8.5 onward) requires all five trap bits, the ID registers permit
11
a value indicating that only TICAB, TOCU and TID4 are implemented,
12
which might be the case for CPUs between Armv8.2 and Armv8.5.
6
13
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20200330210400.11724-5-peter.maydell@linaro.org
11
---
16
---
12
target/arm/cpu.h | 15 +++++++++++++++
17
target/arm/cpu.h | 30 ++++++++++++++++++++++++++++++
13
target/arm/cpu.c | 1 +
18
target/arm/helper.c | 6 ++++++
14
target/arm/cpu64.c | 2 ++
19
2 files changed, 36 insertions(+)
15
target/arm/helper.c | 37 +++++++++++++++++++++++++++++++------
16
4 files changed, 49 insertions(+), 6 deletions(-)
17
20
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
21
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.h
23
--- a/target/arm/cpu.h
21
+++ b/target/arm/cpu.h
24
+++ b/target/arm/cpu.h
22
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_ccidx(const ARMISARegisters *id)
25
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_tts2uxn(const ARMISARegisters *id)
23
return FIELD_EX32(id->id_mmfr4, ID_MMFR4, CCIDX) != 0;
26
return FIELD_EX32(id->id_mmfr4, ID_MMFR4, XNX) != 0;
24
}
27
}
25
28
26
+static inline bool isar_feature_aa32_tts2uxn(const ARMISARegisters *id)
29
+static inline bool isar_feature_aa32_half_evt(const ARMISARegisters *id)
27
+{
30
+{
28
+ return FIELD_EX32(id->id_mmfr4, ID_MMFR4, XNX) != 0;
31
+ return FIELD_EX32(id->id_mmfr4, ID_MMFR4, EVT) >= 1;
29
+}
32
+}
30
+
33
+
31
/*
34
+static inline bool isar_feature_aa32_evt(const ARMISARegisters *id)
32
* 64-bit feature tests via id registers.
33
*/
34
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_ccidx(const ARMISARegisters *id)
35
return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, CCIDX) != 0;
36
}
37
38
+static inline bool isar_feature_aa64_tts2uxn(const ARMISARegisters *id)
39
+{
35
+{
40
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, XNX) != 0;
36
+ return FIELD_EX32(id->id_mmfr4, ID_MMFR4, EVT) >= 2;
41
+}
37
+}
42
+
38
+
43
/*
39
static inline bool isar_feature_aa32_dit(const ARMISARegisters *id)
44
* Feature tests for "does this exist in either 32-bit or 64-bit?"
40
{
45
*/
41
return FIELD_EX32(id->id_pfr0, ID_PFR0, DIT) != 0;
46
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_any_ccidx(const ARMISARegisters *id)
42
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_ids(const ARMISARegisters *id)
47
return isar_feature_aa64_ccidx(id) || isar_feature_aa32_ccidx(id);
43
return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, IDS) != 0;
48
}
44
}
49
45
50
+static inline bool isar_feature_any_tts2uxn(const ARMISARegisters *id)
46
+static inline bool isar_feature_aa64_half_evt(const ARMISARegisters *id)
51
+{
47
+{
52
+ return isar_feature_aa64_tts2uxn(id) || isar_feature_aa32_tts2uxn(id);
48
+ return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, EVT) >= 1;
49
+}
50
+
51
+static inline bool isar_feature_aa64_evt(const ARMISARegisters *id)
52
+{
53
+ return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, EVT) >= 2;
54
+}
55
+
56
static inline bool isar_feature_aa64_bti(const ARMISARegisters *id)
57
{
58
return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, BT) != 0;
59
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_any_ras(const ARMISARegisters *id)
60
return isar_feature_aa64_ras(id) || isar_feature_aa32_ras(id);
61
}
62
63
+static inline bool isar_feature_any_half_evt(const ARMISARegisters *id)
64
+{
65
+ return isar_feature_aa64_half_evt(id) || isar_feature_aa32_half_evt(id);
66
+}
67
+
68
+static inline bool isar_feature_any_evt(const ARMISARegisters *id)
69
+{
70
+ return isar_feature_aa64_evt(id) || isar_feature_aa32_evt(id);
53
+}
71
+}
54
+
72
+
55
/*
73
/*
56
* Forward to the above feature tests given an ARMCPU pointer.
74
* Forward to the above feature tests given an ARMCPU pointer.
57
*/
75
*/
58
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
59
index XXXXXXX..XXXXXXX 100644
60
--- a/target/arm/cpu.c
61
+++ b/target/arm/cpu.c
62
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
63
t = FIELD_DP32(t, ID_MMFR4, HPDS, 1); /* AA32HPD */
64
t = FIELD_DP32(t, ID_MMFR4, AC2, 1); /* ACTLR2, HACTLR2 */
65
t = FIELD_DP32(t, ID_MMFR4, CNP, 1); /* TTCNP */
66
+ t = FIELD_DP32(t, ID_MMFR4, XNX, 1); /* TTS2UXN */
67
cpu->isar.id_mmfr4 = t;
68
}
69
#endif
70
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
71
index XXXXXXX..XXXXXXX 100644
72
--- a/target/arm/cpu64.c
73
+++ b/target/arm/cpu64.c
74
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
75
t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1);
76
t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* ATS1E1 */
77
t = FIELD_DP64(t, ID_AA64MMFR1, VMIDBITS, 2); /* VMID16 */
78
+ t = FIELD_DP64(t, ID_AA64MMFR1, XNX, 1); /* TTS2UXN */
79
cpu->isar.id_aa64mmfr1 = t;
80
81
t = cpu->isar.id_aa64mmfr2;
82
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
83
u = FIELD_DP32(u, ID_MMFR4, HPDS, 1); /* AA32HPD */
84
u = FIELD_DP32(u, ID_MMFR4, AC2, 1); /* ACTLR2, HACTLR2 */
85
u = FIELD_DP32(u, ID_MMFR4, CNP, 1); /* TTCNP */
86
+ u = FIELD_DP32(u, ID_MMFR4, XNX, 1); /* TTS2UXN */
87
cpu->isar.id_mmfr4 = u;
88
89
u = cpu->isar.id_aa64dfr0;
90
diff --git a/target/arm/helper.c b/target/arm/helper.c
76
diff --git a/target/arm/helper.c b/target/arm/helper.c
91
index XXXXXXX..XXXXXXX 100644
77
index XXXXXXX..XXXXXXX 100644
92
--- a/target/arm/helper.c
78
--- a/target/arm/helper.c
93
+++ b/target/arm/helper.c
79
+++ b/target/arm/helper.c
94
@@ -XXX,XX +XXX,XX @@ simple_ap_to_rw_prot(CPUARMState *env, ARMMMUIdx mmu_idx, int ap)
80
@@ -XXX,XX +XXX,XX @@ static void do_hcr_write(CPUARMState *env, uint64_t value, uint64_t valid_mask)
95
*
96
* @env: CPUARMState
97
* @s2ap: The 2-bit stage2 access permissions (S2AP)
98
- * @xn: XN (execute-never) bit
99
+ * @xn: XN (execute-never) bits
100
+ * @s1_is_el0: true if this is S2 of an S1+2 walk for EL0
101
*/
102
-static int get_S2prot(CPUARMState *env, int s2ap, int xn)
103
+static int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0)
104
{
105
int prot = 0;
106
107
@@ -XXX,XX +XXX,XX @@ static int get_S2prot(CPUARMState *env, int s2ap, int xn)
108
if (s2ap & 2) {
109
prot |= PAGE_WRITE;
110
}
111
- if (!xn) {
112
- if (arm_el_is_aa64(env, 2) || prot & PAGE_READ) {
113
+
114
+ if (cpu_isar_feature(any_tts2uxn, env_archcpu(env))) {
115
+ switch (xn) {
116
+ case 0:
117
prot |= PAGE_EXEC;
118
+ break;
119
+ case 1:
120
+ if (s1_is_el0) {
121
+ prot |= PAGE_EXEC;
122
+ }
123
+ break;
124
+ case 2:
125
+ break;
126
+ case 3:
127
+ if (!s1_is_el0) {
128
+ prot |= PAGE_EXEC;
129
+ }
130
+ break;
131
+ default:
132
+ g_assert_not_reached();
133
+ }
134
+ } else {
135
+ if (!extract32(xn, 1, 1)) {
136
+ if (arm_el_is_aa64(env, 2) || prot & PAGE_READ) {
137
+ prot |= PAGE_EXEC;
138
+ }
139
}
81
}
140
}
82
}
141
return prot;
83
142
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
84
+ if (cpu_isar_feature(any_evt, cpu)) {
143
}
85
+ valid_mask |= HCR_TTLBIS | HCR_TTLBOS | HCR_TICAB | HCR_TOCU | HCR_TID4;
144
86
+ } else if (cpu_isar_feature(any_half_evt, cpu)) {
145
ap = extract32(attrs, 4, 2);
87
+ valid_mask |= HCR_TICAB | HCR_TOCU | HCR_TID4;
146
- xn = extract32(attrs, 12, 1);
88
+ }
147
89
+
148
if (mmu_idx == ARMMMUIdx_Stage2) {
90
/* Clear RES0 bits. */
149
ns = true;
91
value &= valid_mask;
150
- *prot = get_S2prot(env, ap, xn);
92
151
+ xn = extract32(attrs, 11, 2);
152
+ *prot = get_S2prot(env, ap, xn, s1_is_el0);
153
} else {
154
ns = extract32(attrs, 3, 1);
155
+ xn = extract32(attrs, 12, 1);
156
pxn = extract32(attrs, 11, 1);
157
*prot = get_S1prot(env, mmu_idx, aarch64, ap, ns, xn, pxn);
158
}
159
--
93
--
160
2.20.1
94
2.25.1
161
162
diff view generated by jsdifflib
1
Convert the Neon 3-reg-same VADD and VSUB insns to decodetree.
1
For FEAT_EVT, the HCR_EL2.TTLBIS bit allows trapping on EL1 use of
2
TLB maintenance instructions that operate on the inner shareable
3
domain:
2
4
3
Note that we don't need the neon_3r_sizes[op] check here because all
5
AArch64:
4
size values are OK for VADD and VSUB; we'll add this when we convert
6
TLBI VMALLE1IS, TLBI VAE1IS, TLBI ASIDE1IS, TLBI VAAE1IS,
5
the first insn that has size restrictions.
7
TLBI VALE1IS, TLBI VAALE1IS, TLBI RVAE1IS, TLBI RVAAE1IS,
8
TLBI RVALE1IS, and TLBI RVAALE1IS.
6
9
7
For this we need one of the GVecGen*Fn typedefs currently in
10
AArch32:
8
translate-a64.h; move them all to translate.h as a block so they
11
TLBIALLIS, TLBIMVAIS, TLBIASIDIS, TLBIMVAAIS, TLBIMVALIS,
9
are visible to the 32-bit decoder.
12
and TLBIMVAALIS.
13
14
Add the trapping support.
10
15
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20200430181003.21682-15-peter.maydell@linaro.org
14
---
18
---
15
target/arm/translate-a64.h | 9 --------
19
target/arm/helper.c | 43 +++++++++++++++++++++++++++----------------
16
target/arm/translate.h | 9 ++++++++
20
1 file changed, 27 insertions(+), 16 deletions(-)
17
target/arm/neon-dp.decode | 17 +++++++++++++++
18
target/arm/translate-neon.inc.c | 38 +++++++++++++++++++++++++++++++++
19
target/arm/translate.c | 14 ++++--------
20
5 files changed, 68 insertions(+), 19 deletions(-)
21
21
22
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
22
diff --git a/target/arm/helper.c b/target/arm/helper.c
23
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
24
--- a/target/arm/translate-a64.h
24
--- a/target/arm/helper.c
25
+++ b/target/arm/translate-a64.h
25
+++ b/target/arm/helper.c
26
@@ -XXX,XX +XXX,XX @@ static inline int vec_full_reg_size(DisasContext *s)
26
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
27
27
return CP_ACCESS_OK;
28
bool disas_sve(DisasContext *, uint32_t);
29
30
-/* Note that the gvec expanders operate on offsets + sizes. */
31
-typedef void GVecGen2Fn(unsigned, uint32_t, uint32_t, uint32_t, uint32_t);
32
-typedef void GVecGen2iFn(unsigned, uint32_t, uint32_t, int64_t,
33
- uint32_t, uint32_t);
34
-typedef void GVecGen3Fn(unsigned, uint32_t, uint32_t,
35
- uint32_t, uint32_t, uint32_t);
36
-typedef void GVecGen4Fn(unsigned, uint32_t, uint32_t, uint32_t,
37
- uint32_t, uint32_t, uint32_t);
38
-
39
#endif /* TARGET_ARM_TRANSLATE_A64_H */
40
diff --git a/target/arm/translate.h b/target/arm/translate.h
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/translate.h
43
+++ b/target/arm/translate.h
44
@@ -XXX,XX +XXX,XX @@ void gen_sshl_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b);
45
#define dc_isar_feature(name, ctx) \
46
({ DisasContext *ctx_ = (ctx); isar_feature_##name(ctx_->isar); })
47
48
+/* Note that the gvec expanders operate on offsets + sizes. */
49
+typedef void GVecGen2Fn(unsigned, uint32_t, uint32_t, uint32_t, uint32_t);
50
+typedef void GVecGen2iFn(unsigned, uint32_t, uint32_t, int64_t,
51
+ uint32_t, uint32_t);
52
+typedef void GVecGen3Fn(unsigned, uint32_t, uint32_t,
53
+ uint32_t, uint32_t, uint32_t);
54
+typedef void GVecGen4Fn(unsigned, uint32_t, uint32_t, uint32_t,
55
+ uint32_t, uint32_t, uint32_t);
56
+
57
#endif /* TARGET_ARM_TRANSLATE_H */
58
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
59
index XXXXXXX..XXXXXXX 100644
60
--- a/target/arm/neon-dp.decode
61
+++ b/target/arm/neon-dp.decode
62
@@ -XXX,XX +XXX,XX @@
63
#
64
# This file is processed by scripts/decodetree.py
65
#
66
+# VFP/Neon register fields; same as vfp.decode
67
+%vm_dp 5:1 0:4
68
+%vn_dp 7:1 16:4
69
+%vd_dp 22:1 12:4
70
71
# Encodings for Neon data processing instructions where the T32 encoding
72
# is a simple transformation of the A32 encoding.
73
@@ -XXX,XX +XXX,XX @@
74
# 0b111p_1111_qqqq_qqqq_qqqq_qqqq_qqqq_qqqq
75
# This file works on the A32 encoding only; calling code for T32 has to
76
# transform the insn into the A32 version first.
77
+
78
+######################################################################
79
+# 3-reg-same grouping:
80
+# 1111 001 U 0 D sz:2 Vn:4 Vd:4 opc:4 N Q M op Vm:4
81
+######################################################################
82
+
83
+&3same vm vn vd q size
84
+
85
+@3same .... ... . . . size:2 .... .... .... . q:1 . . .... \
86
+ &3same vm=%vm_dp vn=%vn_dp vd=%vd_dp
87
+
88
+VADD_3s 1111 001 0 0 . .. .... .... 1000 . . . 0 .... @3same
89
+VSUB_3s 1111 001 1 0 . .. .... .... 1000 . . . 0 .... @3same
90
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
91
index XXXXXXX..XXXXXXX 100644
92
--- a/target/arm/translate-neon.inc.c
93
+++ b/target/arm/translate-neon.inc.c
94
@@ -XXX,XX +XXX,XX @@ static bool trans_VLDST_single(DisasContext *s, arg_VLDST_single *a)
95
96
return true;
97
}
28
}
98
+
29
99
+static bool do_3same(DisasContext *s, arg_3same *a, GVecGen3Fn fn)
30
+/* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBIS. */
31
+static CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
32
+ bool isread)
100
+{
33
+{
101
+ int vec_size = a->q ? 16 : 8;
34
+ if (arm_current_el(env) == 1 &&
102
+ int rd_ofs = neon_reg_offset(a->vd, 0);
35
+ (arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBIS))) {
103
+ int rn_ofs = neon_reg_offset(a->vn, 0);
36
+ return CP_ACCESS_TRAP_EL2;
104
+ int rm_ofs = neon_reg_offset(a->vm, 0);
105
+
106
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
107
+ return false;
108
+ }
37
+ }
109
+
38
+ return CP_ACCESS_OK;
110
+ /* UNDEF accesses to D16-D31 if they don't exist. */
111
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
112
+ ((a->vd | a->vn | a->vm) & 0x10)) {
113
+ return false;
114
+ }
115
+
116
+ if ((a->vn | a->vm | a->vd) & a->q) {
117
+ return false;
118
+ }
119
+
120
+ if (!vfp_access_check(s)) {
121
+ return true;
122
+ }
123
+
124
+ fn(a->size, rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
125
+ return true;
126
+}
39
+}
127
+
40
+
128
+#define DO_3SAME(INSN, FUNC) \
41
static void dacr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
129
+ static bool trans_##INSN##_3s(DisasContext *s, arg_3same *a) \
42
{
130
+ { \
43
ARMCPU *cpu = env_archcpu(env);
131
+ return do_3same(s, a, FUNC); \
44
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
132
+ }
45
static const ARMCPRegInfo v7mp_cp_reginfo[] = {
133
+
46
/* 32 bit TLB invalidates, Inner Shareable */
134
+DO_3SAME(VADD, tcg_gen_gvec_add)
47
{ .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
135
+DO_3SAME(VSUB, tcg_gen_gvec_sub)
48
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
136
diff --git a/target/arm/translate.c b/target/arm/translate.c
49
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
137
index XXXXXXX..XXXXXXX 100644
50
.writefn = tlbiall_is_write },
138
--- a/target/arm/translate.c
51
{ .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
139
+++ b/target/arm/translate.c
52
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
140
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
53
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
141
}
54
.writefn = tlbimva_is_write },
142
return 0;
55
{ .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
143
56
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
144
- case NEON_3R_VADD_VSUB:
57
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
145
- if (u) {
58
.writefn = tlbiasid_is_write },
146
- tcg_gen_gvec_sub(size, rd_ofs, rn_ofs, rm_ofs,
59
{ .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
147
- vec_size, vec_size);
60
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
148
- } else {
61
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
149
- tcg_gen_gvec_add(size, rd_ofs, rn_ofs, rm_ofs,
62
.writefn = tlbimvaa_is_write },
150
- vec_size, vec_size);
63
};
151
- }
64
152
- return 0;
65
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
153
-
66
/* TLBI operations */
154
case NEON_3R_VQADD:
67
{ .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64,
155
tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
68
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
156
rn_ofs, rm_ofs, vec_size, vec_size,
69
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
157
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
70
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
158
tcg_gen_gvec_3(rd_ofs, rm_ofs, rn_ofs, vec_size, vec_size,
71
.writefn = tlbi_aa64_vmalle1is_write },
159
u ? &ushl_op[size] : &sshl_op[size]);
72
{ .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64,
160
return 0;
73
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
161
+
74
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
162
+ case NEON_3R_VADD_VSUB:
75
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
163
+ /* Already handled by decodetree */
76
.writefn = tlbi_aa64_vae1is_write },
164
+ return 1;
77
{ .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64,
165
}
78
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
166
79
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
167
if (size == 3) {
80
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
81
.writefn = tlbi_aa64_vmalle1is_write },
82
{ .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64,
83
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
84
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
85
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
86
.writefn = tlbi_aa64_vae1is_write },
87
{ .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64,
88
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
89
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
90
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
91
.writefn = tlbi_aa64_vae1is_write },
92
{ .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64,
93
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
94
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
95
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
96
.writefn = tlbi_aa64_vae1is_write },
97
{ .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64,
98
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
99
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
100
#endif
101
/* TLB invalidate last level of translation table walk */
102
{ .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
103
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
104
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
105
.writefn = tlbimva_is_write },
106
{ .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
107
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
108
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
109
.writefn = tlbimvaa_is_write },
110
{ .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
111
.type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
112
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo pauth_reginfo[] = {
113
static const ARMCPRegInfo tlbirange_reginfo[] = {
114
{ .name = "TLBI_RVAE1IS", .state = ARM_CP_STATE_AA64,
115
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 1,
116
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
117
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
118
.writefn = tlbi_aa64_rvae1is_write },
119
{ .name = "TLBI_RVAAE1IS", .state = ARM_CP_STATE_AA64,
120
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 3,
121
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
122
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
123
.writefn = tlbi_aa64_rvae1is_write },
124
{ .name = "TLBI_RVALE1IS", .state = ARM_CP_STATE_AA64,
125
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 5,
126
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
127
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
128
.writefn = tlbi_aa64_rvae1is_write },
129
{ .name = "TLBI_RVAALE1IS", .state = ARM_CP_STATE_AA64,
130
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 7,
131
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
132
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
133
.writefn = tlbi_aa64_rvae1is_write },
134
{ .name = "TLBI_RVAE1OS", .state = ARM_CP_STATE_AA64,
135
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
168
--
136
--
169
2.20.1
137
2.25.1
170
171
diff view generated by jsdifflib
1
We're going to want at least some of the NeonGen* typedefs
1
For FEAT_EVT, the HCR_EL2.TTLBOS bit allows trapping on EL1
2
for the refactored 32-bit Neon decoder, so move them all
2
use of TLB maintenance instructions that operate on the
3
to translate.h since it makes more sense to keep them in
3
outer shareable domain:
4
one group.
4
5
TLBI VMALLE1OS, TLBI VAE1OS, TLBI ASIDE1OS,TLBI VAAE1OS,
6
TLBI VALE1OS, TLBI VAALE1OS, TLBI RVAE1OS, TLBI RVAAE1OS,
7
TLBI RVALE1OS, and TLBI RVAALE1OS.
8
9
(There are no AArch32 outer-shareable TLB maintenance ops.)
10
11
Implement the trapping.
5
12
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200430181003.21682-23-peter.maydell@linaro.org
9
---
15
---
10
target/arm/translate.h | 17 +++++++++++++++++
16
target/arm/helper.c | 33 +++++++++++++++++++++++----------
11
target/arm/translate-a64.c | 17 -----------------
17
1 file changed, 23 insertions(+), 10 deletions(-)
12
2 files changed, 17 insertions(+), 17 deletions(-)
13
18
14
diff --git a/target/arm/translate.h b/target/arm/translate.h
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate.h
21
--- a/target/arm/helper.c
17
+++ b/target/arm/translate.h
22
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ typedef void GVecGen3Fn(unsigned, uint32_t, uint32_t,
23
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
19
typedef void GVecGen4Fn(unsigned, uint32_t, uint32_t, uint32_t,
24
return CP_ACCESS_OK;
20
uint32_t, uint32_t, uint32_t);
25
}
21
26
22
+/* Function prototype for gen_ functions for calling Neon helpers */
27
+#ifdef TARGET_AARCH64
23
+typedef void NeonGenOneOpEnvFn(TCGv_i32, TCGv_ptr, TCGv_i32);
28
+/* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBOS. */
24
+typedef void NeonGenTwoOpFn(TCGv_i32, TCGv_i32, TCGv_i32);
29
+static CPAccessResult access_ttlbos(CPUARMState *env, const ARMCPRegInfo *ri,
25
+typedef void NeonGenTwoOpEnvFn(TCGv_i32, TCGv_ptr, TCGv_i32, TCGv_i32);
30
+ bool isread)
26
+typedef void NeonGenTwo64OpFn(TCGv_i64, TCGv_i64, TCGv_i64);
31
+{
27
+typedef void NeonGenTwo64OpEnvFn(TCGv_i64, TCGv_ptr, TCGv_i64, TCGv_i64);
32
+ if (arm_current_el(env) == 1 &&
28
+typedef void NeonGenNarrowFn(TCGv_i32, TCGv_i64);
33
+ (arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBOS))) {
29
+typedef void NeonGenNarrowEnvFn(TCGv_i32, TCGv_ptr, TCGv_i64);
34
+ return CP_ACCESS_TRAP_EL2;
30
+typedef void NeonGenWidenFn(TCGv_i64, TCGv_i32);
35
+ }
31
+typedef void NeonGenTwoSingleOPFn(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr);
36
+ return CP_ACCESS_OK;
32
+typedef void NeonGenTwoDoubleOPFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_ptr);
37
+}
33
+typedef void NeonGenOneOpFn(TCGv_i64, TCGv_i64);
38
+#endif
34
+typedef void CryptoTwoOpFn(TCGv_ptr, TCGv_ptr);
35
+typedef void CryptoThreeOpIntFn(TCGv_ptr, TCGv_ptr, TCGv_i32);
36
+typedef void CryptoThreeOpFn(TCGv_ptr, TCGv_ptr, TCGv_ptr);
37
+typedef void AtomicThreeOpFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGArg, MemOp);
38
+
39
+
39
#endif /* TARGET_ARM_TRANSLATE_H */
40
static void dacr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
40
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/translate-a64.c
43
+++ b/target/arm/translate-a64.c
44
@@ -XXX,XX +XXX,XX @@ typedef struct AArch64DecodeTable {
45
AArch64DecodeFn *disas_fn;
46
} AArch64DecodeTable;
47
48
-/* Function prototype for gen_ functions for calling Neon helpers */
49
-typedef void NeonGenOneOpEnvFn(TCGv_i32, TCGv_ptr, TCGv_i32);
50
-typedef void NeonGenTwoOpFn(TCGv_i32, TCGv_i32, TCGv_i32);
51
-typedef void NeonGenTwoOpEnvFn(TCGv_i32, TCGv_ptr, TCGv_i32, TCGv_i32);
52
-typedef void NeonGenTwo64OpFn(TCGv_i64, TCGv_i64, TCGv_i64);
53
-typedef void NeonGenTwo64OpEnvFn(TCGv_i64, TCGv_ptr, TCGv_i64, TCGv_i64);
54
-typedef void NeonGenNarrowFn(TCGv_i32, TCGv_i64);
55
-typedef void NeonGenNarrowEnvFn(TCGv_i32, TCGv_ptr, TCGv_i64);
56
-typedef void NeonGenWidenFn(TCGv_i64, TCGv_i32);
57
-typedef void NeonGenTwoSingleOPFn(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr);
58
-typedef void NeonGenTwoDoubleOPFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_ptr);
59
-typedef void NeonGenOneOpFn(TCGv_i64, TCGv_i64);
60
-typedef void CryptoTwoOpFn(TCGv_ptr, TCGv_ptr);
61
-typedef void CryptoThreeOpIntFn(TCGv_ptr, TCGv_ptr, TCGv_i32);
62
-typedef void CryptoThreeOpFn(TCGv_ptr, TCGv_ptr, TCGv_ptr);
63
-typedef void AtomicThreeOpFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGArg, MemOp);
64
-
65
/* initialize TCG globals. */
66
void a64_translate_init(void)
67
{
41
{
42
ARMCPU *cpu = env_archcpu(env);
43
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo tlbirange_reginfo[] = {
44
.writefn = tlbi_aa64_rvae1is_write },
45
{ .name = "TLBI_RVAE1OS", .state = ARM_CP_STATE_AA64,
46
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
47
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
48
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
49
.writefn = tlbi_aa64_rvae1is_write },
50
{ .name = "TLBI_RVAAE1OS", .state = ARM_CP_STATE_AA64,
51
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 3,
52
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
53
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
54
.writefn = tlbi_aa64_rvae1is_write },
55
{ .name = "TLBI_RVALE1OS", .state = ARM_CP_STATE_AA64,
56
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 5,
57
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
58
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
59
.writefn = tlbi_aa64_rvae1is_write },
60
{ .name = "TLBI_RVAALE1OS", .state = ARM_CP_STATE_AA64,
61
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 7,
62
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
63
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
64
.writefn = tlbi_aa64_rvae1is_write },
65
{ .name = "TLBI_RVAE1", .state = ARM_CP_STATE_AA64,
66
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
67
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo tlbirange_reginfo[] = {
68
static const ARMCPRegInfo tlbios_reginfo[] = {
69
{ .name = "TLBI_VMALLE1OS", .state = ARM_CP_STATE_AA64,
70
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 0,
71
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
72
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
73
.writefn = tlbi_aa64_vmalle1is_write },
74
{ .name = "TLBI_VAE1OS", .state = ARM_CP_STATE_AA64,
75
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 1,
76
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
77
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
78
.writefn = tlbi_aa64_vae1is_write },
79
{ .name = "TLBI_ASIDE1OS", .state = ARM_CP_STATE_AA64,
80
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 2,
81
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
82
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
83
.writefn = tlbi_aa64_vmalle1is_write },
84
{ .name = "TLBI_VAAE1OS", .state = ARM_CP_STATE_AA64,
85
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 3,
86
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
87
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
88
.writefn = tlbi_aa64_vae1is_write },
89
{ .name = "TLBI_VALE1OS", .state = ARM_CP_STATE_AA64,
90
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 5,
91
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
92
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
93
.writefn = tlbi_aa64_vae1is_write },
94
{ .name = "TLBI_VAALE1OS", .state = ARM_CP_STATE_AA64,
95
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 7,
96
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
97
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
98
.writefn = tlbi_aa64_vae1is_write },
99
{ .name = "TLBI_ALLE2OS", .state = ARM_CP_STATE_AA64,
100
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 0,
68
--
101
--
69
2.20.1
102
2.25.1
70
71
diff view generated by jsdifflib
1
We define ARMMMUIdx_Stage2 as being an MMU index which uses a QEMU
1
For FEAT_EVT, the HCR_EL2.TICAB bit allows trapping of the ICIALLUIS
2
TLB. However we never actually use the TLB -- all stage 2 lookups
2
and IC IALLUIS cache maintenance instructions.
3
are done by direct calls to get_phys_addr_lpae() followed by a
4
physical address load via address_space_ld*().
5
3
6
Remove Stage2 from the list of ARM MMU indexes which correspond to
4
The HCR_EL2.TOCU bit traps all the other cache maintenance
7
real core MMU indexes, and instead put it in the set of "NOTLB" ARM
5
instructions that operate to the point of unification:
8
MMU indexes.
6
AArch64 IC IVAU, IC IALLU, DC CVAU
7
AArch32 ICIMVAU, ICIALLU, DCCMVAU
9
8
10
This allows us to drop NB_MMU_MODES to 11. It also means we can
9
The two trap bits between them cover all of the cache maintenance
11
safely add support for the ARMv8.3-TTS2UXN extension, which adds
10
instructions which must also check the HCR_TPU flag. Turn the old
12
permission bits to the stage 2 descriptors which define execute
11
aa64_cacheop_pou_access() function into a helper function which takes
13
permission separatel for EL0 and EL1; supporting that while keeping
12
the set of HCR_EL2 flags to check as an argument, and call it from
14
Stage2 in a QEMU TLB would require us to use separate TLBs for
13
new access_ticab() and access_tocu() functions as appropriate for
15
"Stage2 for an EL0 access" and "Stage2 for an EL1 access", which is a
14
each cache op.
16
lot of extra complication given we aren't even using the QEMU TLB.
17
18
In the process of updating the comment on our MMU index use,
19
fix a couple of other minor errors:
20
* NS EL2 EL2&0 was missing from the list in the comment
21
* some text hadn't been updated from when we bumped NB_MMU_MODES
22
above 8
23
15
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
26
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
27
Message-id: 20200330210400.11724-2-peter.maydell@linaro.org
28
---
18
---
29
target/arm/cpu-param.h | 2 +-
19
target/arm/helper.c | 36 +++++++++++++++++++++++-------------
30
target/arm/cpu.h | 21 +++++---
20
1 file changed, 23 insertions(+), 13 deletions(-)
31
target/arm/helper.c | 112 ++++-------------------------------------
32
3 files changed, 27 insertions(+), 108 deletions(-)
33
21
34
diff --git a/target/arm/cpu-param.h b/target/arm/cpu-param.h
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/cpu-param.h
37
+++ b/target/arm/cpu-param.h
38
@@ -XXX,XX +XXX,XX @@
39
# define TARGET_PAGE_BITS_MIN 10
40
#endif
41
42
-#define NB_MMU_MODES 12
43
+#define NB_MMU_MODES 11
44
45
#endif
46
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/cpu.h
49
+++ b/target/arm/cpu.h
50
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync);
51
* handling via the TLB. The only way to do a stage 1 translation without
52
* the immediate stage 2 translation is via the ATS or AT system insns,
53
* which can be slow-pathed and always do a page table walk.
54
+ * The only use of stage 2 translations is either as part of an s1+2
55
+ * lookup or when loading the descriptors during a stage 1 page table walk,
56
+ * and in both those cases we don't use the TLB.
57
* 4. we can also safely fold together the "32 bit EL3" and "64 bit EL3"
58
* translation regimes, because they map reasonably well to each other
59
* and they can't both be active at the same time.
60
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync);
61
* NS EL1 EL1&0 stage 1+2 (aka NS PL1)
62
* NS EL1 EL1&0 stage 1+2 +PAN
63
* NS EL0 EL2&0
64
+ * NS EL2 EL2&0
65
* NS EL2 EL2&0 +PAN
66
* NS EL2 (aka NS PL2)
67
* S EL0 EL1&0 (aka S PL0)
68
* S EL1 EL1&0 (not used if EL3 is 32 bit)
69
* S EL1 EL1&0 +PAN
70
* S EL3 (aka S PL1)
71
- * NS EL1&0 stage 2
72
*
73
- * for a total of 12 different mmu_idx.
74
+ * for a total of 11 different mmu_idx.
75
*
76
* R profile CPUs have an MPU, but can use the same set of MMU indexes
77
* as A profile. They only need to distinguish NS EL0 and NS EL1 (and
78
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync);
79
* are not quite the same -- different CPU types (most notably M profile
80
* vs A/R profile) would like to use MMU indexes with different semantics,
81
* but since we don't ever need to use all of those in a single CPU we
82
- * can avoid setting NB_MMU_MODES to more than 8. The lower bits of
83
+ * can avoid having to set NB_MMU_MODES to "total number of A profile MMU
84
+ * modes + total number of M profile MMU modes". The lower bits of
85
* ARMMMUIdx are the core TLB mmu index, and the higher bits are always
86
* the same for any particular CPU.
87
* Variables of type ARMMUIdx are always full values, and the core
88
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdx {
89
ARMMMUIdx_SE10_1_PAN = 9 | ARM_MMU_IDX_A,
90
ARMMMUIdx_SE3 = 10 | ARM_MMU_IDX_A,
91
92
- ARMMMUIdx_Stage2 = 11 | ARM_MMU_IDX_A,
93
-
94
/*
95
* These are not allocated TLBs and are used only for AT system
96
* instructions or for the first stage of an S12 page table walk.
97
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdx {
98
ARMMMUIdx_Stage1_E0 = 0 | ARM_MMU_IDX_NOTLB,
99
ARMMMUIdx_Stage1_E1 = 1 | ARM_MMU_IDX_NOTLB,
100
ARMMMUIdx_Stage1_E1_PAN = 2 | ARM_MMU_IDX_NOTLB,
101
+ /*
102
+ * Not allocated a TLB: used only for second stage of an S12 page
103
+ * table walk, or for descriptor loads during first stage of an S1
104
+ * page table walk. Note that if we ever want to have a TLB for this
105
+ * then various TLB flush insns which currently are no-ops or flush
106
+ * only stage 1 MMU indexes will need to change to flush stage 2.
107
+ */
108
+ ARMMMUIdx_Stage2 = 3 | ARM_MMU_IDX_NOTLB,
109
110
/*
111
* M-profile.
112
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdxBit {
113
TO_CORE_BIT(SE10_1),
114
TO_CORE_BIT(SE10_1_PAN),
115
TO_CORE_BIT(SE3),
116
- TO_CORE_BIT(Stage2),
117
118
TO_CORE_BIT(MUser),
119
TO_CORE_BIT(MPriv),
120
diff --git a/target/arm/helper.c b/target/arm/helper.c
22
diff --git a/target/arm/helper.c b/target/arm/helper.c
121
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
122
--- a/target/arm/helper.c
24
--- a/target/arm/helper.c
123
+++ b/target/arm/helper.c
25
+++ b/target/arm/helper.c
124
@@ -XXX,XX +XXX,XX @@ static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
26
@@ -XXX,XX +XXX,XX @@ static CPAccessResult aa64_cacheop_poc_access(CPUARMState *env,
125
tlb_flush_by_mmuidx(cs,
27
return CP_ACCESS_OK;
126
ARMMMUIdxBit_E10_1 |
127
ARMMMUIdxBit_E10_1_PAN |
128
- ARMMMUIdxBit_E10_0 |
129
- ARMMMUIdxBit_Stage2);
130
+ ARMMMUIdxBit_E10_0);
131
}
28
}
132
29
133
static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
30
-static CPAccessResult aa64_cacheop_pou_access(CPUARMState *env,
134
@@ -XXX,XX +XXX,XX @@ static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
31
- const ARMCPRegInfo *ri,
135
tlb_flush_by_mmuidx_all_cpus_synced(cs,
32
- bool isread)
136
ARMMMUIdxBit_E10_1 |
33
+static CPAccessResult do_cacheop_pou_access(CPUARMState *env, uint64_t hcrflags)
137
ARMMMUIdxBit_E10_1_PAN |
34
{
138
- ARMMMUIdxBit_E10_0 |
35
/* Cache invalidate/clean to Point of Unification... */
139
- ARMMMUIdxBit_Stage2);
36
switch (arm_current_el(env)) {
140
+ ARMMMUIdxBit_E10_0);
37
@@ -XXX,XX +XXX,XX @@ static CPAccessResult aa64_cacheop_pou_access(CPUARMState *env,
38
}
39
/* fall through */
40
case 1:
41
- /* ... EL1 must trap to EL2 if HCR_EL2.TPU is set. */
42
- if (arm_hcr_el2_eff(env) & HCR_TPU) {
43
+ /* ... EL1 must trap to EL2 if relevant HCR_EL2 flags are set. */
44
+ if (arm_hcr_el2_eff(env) & hcrflags) {
45
return CP_ACCESS_TRAP_EL2;
46
}
47
break;
48
@@ -XXX,XX +XXX,XX @@ static CPAccessResult aa64_cacheop_pou_access(CPUARMState *env,
49
return CP_ACCESS_OK;
141
}
50
}
142
51
143
-static void tlbiipas2_write(CPUARMState *env, const ARMCPRegInfo *ri,
52
+static CPAccessResult access_ticab(CPUARMState *env, const ARMCPRegInfo *ri,
144
- uint64_t value)
53
+ bool isread)
145
-{
54
+{
146
- /* Invalidate by IPA. This has to invalidate any structures that
55
+ return do_cacheop_pou_access(env, HCR_TICAB | HCR_TPU);
147
- * contain only stage 2 translation information, but does not need
56
+}
148
- * to apply to structures that contain combined stage 1 and stage 2
57
+
149
- * translation information.
58
+static CPAccessResult access_tocu(CPUARMState *env, const ARMCPRegInfo *ri,
150
- * This must NOP if EL2 isn't implemented or SCR_EL3.NS is zero.
59
+ bool isread)
151
- */
60
+{
152
- CPUState *cs = env_cpu(env);
61
+ return do_cacheop_pou_access(env, HCR_TOCU | HCR_TPU);
153
- uint64_t pageaddr;
62
+}
154
-
63
+
155
- if (!arm_feature(env, ARM_FEATURE_EL2) || !(env->cp15.scr_el3 & SCR_NS)) {
64
/* See: D4.7.2 TLB maintenance requirements and the TLB maintenance instructions
156
- return;
65
* Page D4-1736 (DDI0487A.b)
157
- }
66
*/
158
-
159
- pageaddr = sextract64(value << 12, 0, 40);
160
-
161
- tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2);
162
-}
163
-
164
-static void tlbiipas2_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
165
- uint64_t value)
166
-{
167
- CPUState *cs = env_cpu(env);
168
- uint64_t pageaddr;
169
-
170
- if (!arm_feature(env, ARM_FEATURE_EL2) || !(env->cp15.scr_el3 & SCR_NS)) {
171
- return;
172
- }
173
-
174
- pageaddr = sextract64(value << 12, 0, 40);
175
-
176
- tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
177
- ARMMMUIdxBit_Stage2);
178
-}
179
180
static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
181
uint64_t value)
182
@@ -XXX,XX +XXX,XX @@ static void vttbr_write(CPUARMState *env, const ARMCPRegInfo *ri,
183
tlb_flush_by_mmuidx(cs,
184
ARMMMUIdxBit_E10_1 |
185
ARMMMUIdxBit_E10_1_PAN |
186
- ARMMMUIdxBit_E10_0 |
187
- ARMMMUIdxBit_Stage2);
188
+ ARMMMUIdxBit_E10_0);
189
raw_write(env, ri, value);
190
}
191
}
192
@@ -XXX,XX +XXX,XX @@ static int alle1_tlbmask(CPUARMState *env)
193
return ARMMMUIdxBit_SE10_1 |
194
ARMMMUIdxBit_SE10_1_PAN |
195
ARMMMUIdxBit_SE10_0;
196
- } else if (arm_feature(env, ARM_FEATURE_EL2)) {
197
- return ARMMMUIdxBit_E10_1 |
198
- ARMMMUIdxBit_E10_1_PAN |
199
- ARMMMUIdxBit_E10_0 |
200
- ARMMMUIdxBit_Stage2;
201
} else {
202
return ARMMMUIdxBit_E10_1 |
203
ARMMMUIdxBit_E10_1_PAN |
204
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
205
ARMMMUIdxBit_SE3);
206
}
207
208
-static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
209
- uint64_t value)
210
-{
211
- /* Invalidate by IPA. This has to invalidate any structures that
212
- * contain only stage 2 translation information, but does not need
213
- * to apply to structures that contain combined stage 1 and stage 2
214
- * translation information.
215
- * This must NOP if EL2 isn't implemented or SCR_EL3.NS is zero.
216
- */
217
- ARMCPU *cpu = env_archcpu(env);
218
- CPUState *cs = CPU(cpu);
219
- uint64_t pageaddr;
220
-
221
- if (!arm_feature(env, ARM_FEATURE_EL2) || !(env->cp15.scr_el3 & SCR_NS)) {
222
- return;
223
- }
224
-
225
- pageaddr = sextract64(value << 12, 0, 48);
226
-
227
- tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2);
228
-}
229
-
230
-static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
231
- uint64_t value)
232
-{
233
- CPUState *cs = env_cpu(env);
234
- uint64_t pageaddr;
235
-
236
- if (!arm_feature(env, ARM_FEATURE_EL2) || !(env->cp15.scr_el3 & SCR_NS)) {
237
- return;
238
- }
239
-
240
- pageaddr = sextract64(value << 12, 0, 48);
241
-
242
- tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
243
- ARMMMUIdxBit_Stage2);
244
-}
245
-
246
static CPAccessResult aa64_zva_access(CPUARMState *env, const ARMCPRegInfo *ri,
247
bool isread)
248
{
249
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
67
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
250
.writefn = tlbi_aa64_vae1_write },
68
{ .name = "IC_IALLUIS", .state = ARM_CP_STATE_AA64,
251
{ .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
69
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 1, .opc2 = 0,
252
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
70
.access = PL1_W, .type = ARM_CP_NOP,
253
- .access = PL2_W, .type = ARM_CP_NO_RAW,
71
- .accessfn = aa64_cacheop_pou_access },
254
- .writefn = tlbi_aa64_ipas2e1is_write },
72
+ .accessfn = access_ticab },
255
+ .access = PL2_W, .type = ARM_CP_NOP },
73
{ .name = "IC_IALLU", .state = ARM_CP_STATE_AA64,
256
{ .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64,
74
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 5, .opc2 = 0,
257
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
75
.access = PL1_W, .type = ARM_CP_NOP,
258
- .access = PL2_W, .type = ARM_CP_NO_RAW,
76
- .accessfn = aa64_cacheop_pou_access },
259
- .writefn = tlbi_aa64_ipas2e1is_write },
77
+ .accessfn = access_tocu },
260
+ .access = PL2_W, .type = ARM_CP_NOP },
78
{ .name = "IC_IVAU", .state = ARM_CP_STATE_AA64,
261
{ .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64,
79
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 5, .opc2 = 1,
262
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
80
.access = PL0_W, .type = ARM_CP_NOP,
263
.access = PL2_W, .type = ARM_CP_NO_RAW,
81
- .accessfn = aa64_cacheop_pou_access },
82
+ .accessfn = access_tocu },
83
{ .name = "DC_IVAC", .state = ARM_CP_STATE_AA64,
84
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 6, .opc2 = 1,
85
.access = PL1_W, .accessfn = aa64_cacheop_poc_access,
264
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
86
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
265
.writefn = tlbi_aa64_alle1is_write },
87
{ .name = "DC_CVAU", .state = ARM_CP_STATE_AA64,
266
{ .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64,
88
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 11, .opc2 = 1,
267
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
89
.access = PL0_W, .type = ARM_CP_NOP,
268
- .access = PL2_W, .type = ARM_CP_NO_RAW,
90
- .accessfn = aa64_cacheop_pou_access },
269
- .writefn = tlbi_aa64_ipas2e1_write },
91
+ .accessfn = access_tocu },
270
+ .access = PL2_W, .type = ARM_CP_NOP },
92
{ .name = "DC_CIVAC", .state = ARM_CP_STATE_AA64,
271
{ .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64,
93
.opc0 = 1, .opc1 = 3, .crn = 7, .crm = 14, .opc2 = 1,
272
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
94
.access = PL0_W, .type = ARM_CP_NOP,
273
- .access = PL2_W, .type = ARM_CP_NO_RAW,
274
- .writefn = tlbi_aa64_ipas2e1_write },
275
+ .access = PL2_W, .type = ARM_CP_NOP },
276
{ .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64,
277
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
278
.access = PL2_W, .type = ARM_CP_NO_RAW,
279
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
95
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
280
.writefn = tlbimva_hyp_is_write },
96
.writefn = tlbiipas2is_hyp_write },
281
{ .name = "TLBIIPAS2",
282
.cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
283
- .type = ARM_CP_NO_RAW, .access = PL2_W,
284
- .writefn = tlbiipas2_write },
285
+ .type = ARM_CP_NOP, .access = PL2_W },
286
{ .name = "TLBIIPAS2IS",
287
.cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
288
- .type = ARM_CP_NO_RAW, .access = PL2_W,
289
- .writefn = tlbiipas2_is_write },
290
+ .type = ARM_CP_NOP, .access = PL2_W },
291
{ .name = "TLBIIPAS2L",
292
.cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
293
- .type = ARM_CP_NO_RAW, .access = PL2_W,
294
- .writefn = tlbiipas2_write },
295
+ .type = ARM_CP_NOP, .access = PL2_W },
296
{ .name = "TLBIIPAS2LIS",
297
.cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
298
- .type = ARM_CP_NO_RAW, .access = PL2_W,
299
- .writefn = tlbiipas2_is_write },
300
+ .type = ARM_CP_NOP, .access = PL2_W },
301
/* 32 bit cache operations */
97
/* 32 bit cache operations */
302
{ .name = "ICIALLUIS", .cp = 15, .opc1 = 0, .crn = 7, .crm = 1, .opc2 = 0,
98
{ .name = "ICIALLUIS", .cp = 15, .opc1 = 0, .crn = 7, .crm = 1, .opc2 = 0,
303
.type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_pou_access },
99
- .type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_pou_access },
100
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_ticab },
101
{ .name = "BPIALLUIS", .cp = 15, .opc1 = 0, .crn = 7, .crm = 1, .opc2 = 6,
102
.type = ARM_CP_NOP, .access = PL1_W },
103
{ .name = "ICIALLU", .cp = 15, .opc1 = 0, .crn = 7, .crm = 5, .opc2 = 0,
104
- .type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_pou_access },
105
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_tocu },
106
{ .name = "ICIMVAU", .cp = 15, .opc1 = 0, .crn = 7, .crm = 5, .opc2 = 1,
107
- .type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_pou_access },
108
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_tocu },
109
{ .name = "BPIALL", .cp = 15, .opc1 = 0, .crn = 7, .crm = 5, .opc2 = 6,
110
.type = ARM_CP_NOP, .access = PL1_W },
111
{ .name = "BPIMVA", .cp = 15, .opc1 = 0, .crn = 7, .crm = 5, .opc2 = 7,
112
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
113
{ .name = "DCCSW", .cp = 15, .opc1 = 0, .crn = 7, .crm = 10, .opc2 = 2,
114
.type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_tsw },
115
{ .name = "DCCMVAU", .cp = 15, .opc1 = 0, .crn = 7, .crm = 11, .opc2 = 1,
116
- .type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_pou_access },
117
+ .type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_tocu },
118
{ .name = "DCCIMVAC", .cp = 15, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 1,
119
.type = ARM_CP_NOP, .access = PL1_W, .accessfn = aa64_cacheop_poc_access },
120
{ .name = "DCCISW", .cp = 15, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 2,
304
--
121
--
305
2.20.1
122
2.25.1
306
307
diff view generated by jsdifflib
1
For ARMv8.2-TTS2UXN, the stage 2 page table walk wants to know
1
For FEAT_EVT, the HCR_EL2.TID4 trap allows trapping of the cache ID
2
whether the stage 1 access is for EL0 or not, because whether
2
registers CCSIDR_EL1, CCSIDR2_EL1, CLIDR_EL1 and CSSELR_EL1 (and
3
exec permission is given can depend on whether this is an EL0
3
their AArch32 equivalents). This is a subset of the registers
4
or EL1 access. Add a new argument to get_phys_addr_lpae() so
4
trapped by HCR_EL2.TID2, which includes all of these and also the
5
the call sites can pass this information in.
5
CTR_EL0 register.
6
6
7
Since get_phys_addr_lpae() doesn't already have a doc comment,
7
Our implementation already uses a separate access function for
8
add one so we have a place to put the documentation of the
8
CTR_EL0 (ctr_el0_access()), so all of the registers currently using
9
semantics of the new s1_is_el0 argument.
9
access_aa64_tid2() should also be checking TID4. Make that function
10
check both TID2 and TID4, and rename it appropriately.
10
11
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20200330210400.11724-4-peter.maydell@linaro.org
15
---
14
---
16
target/arm/helper.c | 29 ++++++++++++++++++++++++++++-
15
target/arm/helper.c | 17 +++++++++--------
17
1 file changed, 28 insertions(+), 1 deletion(-)
16
1 file changed, 9 insertions(+), 8 deletions(-)
18
17
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
18
diff --git a/target/arm/helper.c b/target/arm/helper.c
20
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/helper.c
20
--- a/target/arm/helper.c
22
+++ b/target/arm/helper.c
21
+++ b/target/arm/helper.c
23
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ static void scr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
24
23
scr_write(env, ri, 0);
25
static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
26
MMUAccessType access_type, ARMMMUIdx mmu_idx,
27
+ bool s1_is_el0,
28
hwaddr *phys_ptr, MemTxAttrs *txattrs, int *prot,
29
target_ulong *page_size_ptr,
30
ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs);
31
@@ -XXX,XX +XXX,XX @@ static hwaddr S1_ptw_translate(CPUARMState *env, ARMMMUIdx mmu_idx,
32
}
33
34
ret = get_phys_addr_lpae(env, addr, MMU_DATA_LOAD, ARMMMUIdx_Stage2,
35
+ false,
36
&s2pa, &txattrs, &s2prot, &s2size, fi,
37
pcacheattrs);
38
if (ret) {
39
@@ -XXX,XX +XXX,XX @@ static ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
40
};
41
}
24
}
42
25
43
+/**
26
-static CPAccessResult access_aa64_tid2(CPUARMState *env,
44
+ * get_phys_addr_lpae: perform one stage of page table walk, LPAE format
27
- const ARMCPRegInfo *ri,
45
+ *
28
- bool isread)
46
+ * Returns false if the translation was successful. Otherwise, phys_ptr, attrs,
29
+static CPAccessResult access_tid4(CPUARMState *env,
47
+ * prot and page_size may not be filled in, and the populated fsr value provides
30
+ const ARMCPRegInfo *ri,
48
+ * information on why the translation aborted, in the format of a long-format
31
+ bool isread)
49
+ * DFSR/IFSR fault register, with the following caveats:
32
{
50
+ * * the WnR bit is never set (the caller must do this).
33
- if (arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_TID2)) {
51
+ *
34
+ if (arm_current_el(env) == 1 &&
52
+ * @env: CPUARMState
35
+ (arm_hcr_el2_eff(env) & (HCR_TID2 | HCR_TID4))) {
53
+ * @address: virtual address to get physical address for
36
return CP_ACCESS_TRAP_EL2;
54
+ * @access_type: MMU_DATA_LOAD, MMU_DATA_STORE or MMU_INST_FETCH
55
+ * @mmu_idx: MMU index indicating required translation regime
56
+ * @s1_is_el0: if @mmu_idx is ARMMMUIdx_Stage2 (so this is a stage 2 page table
57
+ * walk), must be true if this is stage 2 of a stage 1+2 walk for an
58
+ * EL0 access). If @mmu_idx is anything else, @s1_is_el0 is ignored.
59
+ * @phys_ptr: set to the physical address corresponding to the virtual address
60
+ * @attrs: set to the memory transaction attributes to use
61
+ * @prot: set to the permissions for the page containing phys_ptr
62
+ * @page_size_ptr: set to the size of the page containing phys_ptr
63
+ * @fi: set to fault info if the translation fails
64
+ * @cacheattrs: (if non-NULL) set to the cacheability/shareability attributes
65
+ */
66
static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
67
MMUAccessType access_type, ARMMMUIdx mmu_idx,
68
+ bool s1_is_el0,
69
hwaddr *phys_ptr, MemTxAttrs *txattrs, int *prot,
70
target_ulong *page_size_ptr,
71
ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs)
72
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
73
74
/* S1 is done. Now do S2 translation. */
75
ret = get_phys_addr_lpae(env, ipa, access_type, ARMMMUIdx_Stage2,
76
+ mmu_idx == ARMMMUIdx_E10_0,
77
phys_ptr, attrs, &s2_prot,
78
page_size, fi,
79
cacheattrs != NULL ? &cacheattrs2 : NULL);
80
@@ -XXX,XX +XXX,XX @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
81
}
37
}
82
38
83
if (regime_using_lpae_format(env, mmu_idx)) {
39
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
84
- return get_phys_addr_lpae(env, address, access_type, mmu_idx,
40
{ .name = "CCSIDR", .state = ARM_CP_STATE_BOTH,
85
+ return get_phys_addr_lpae(env, address, access_type, mmu_idx, false,
41
.opc0 = 3, .crn = 0, .crm = 0, .opc1 = 1, .opc2 = 0,
86
phys_ptr, attrs, prot, page_size,
42
.access = PL1_R,
87
fi, cacheattrs);
43
- .accessfn = access_aa64_tid2,
88
} else if (regime_sctlr(env, mmu_idx) & SCTLR_XP) {
44
+ .accessfn = access_tid4,
45
.readfn = ccsidr_read, .type = ARM_CP_NO_RAW },
46
{ .name = "CSSELR", .state = ARM_CP_STATE_BOTH,
47
.opc0 = 3, .crn = 0, .crm = 0, .opc1 = 2, .opc2 = 0,
48
.access = PL1_RW,
49
- .accessfn = access_aa64_tid2,
50
+ .accessfn = access_tid4,
51
.writefn = csselr_write, .resetvalue = 0,
52
.bank_fieldoffsets = { offsetof(CPUARMState, cp15.csselr_s),
53
offsetof(CPUARMState, cp15.csselr_ns) } },
54
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo ccsidr2_reginfo[] = {
55
{ .name = "CCSIDR2", .state = ARM_CP_STATE_BOTH,
56
.opc0 = 3, .opc1 = 1, .crn = 0, .crm = 0, .opc2 = 2,
57
.access = PL1_R,
58
- .accessfn = access_aa64_tid2,
59
+ .accessfn = access_tid4,
60
.readfn = ccsidr2_read, .type = ARM_CP_NO_RAW },
61
};
62
63
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
64
.name = "CLIDR", .state = ARM_CP_STATE_BOTH,
65
.opc0 = 3, .crn = 0, .crm = 0, .opc1 = 1, .opc2 = 1,
66
.access = PL1_R, .type = ARM_CP_CONST,
67
- .accessfn = access_aa64_tid2,
68
+ .accessfn = access_tid4,
69
.resetvalue = cpu->clidr
70
};
71
define_one_arm_cp_reg(cpu, &clidr);
89
--
72
--
90
2.20.1
73
2.25.1
91
92
diff view generated by jsdifflib
1
In aarch64_max_initfn() we update both 32-bit and 64-bit ID
1
Update the ID registers for TCG's '-cpu max' to report the
2
registers. The intended pattern is that for 64-bit ID registers we
2
FEAT_EVT Enhanced Virtualization Traps support.
3
use FIELD_DP64 and the uint64_t 't' register, while 32-bit ID
4
registers use FIELD_DP32 and the uint32_t 'u' register. For
5
ID_AA64DFR0 we accidentally used 'u', meaning that the top 32 bits of
6
this 64-bit ID register would end up always zero. Luckily at the
7
moment that's what they should be anyway, so this bug has no visible
8
effects.
9
3
10
Use the right-sized variable.
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
docs/system/arm/emulation.rst | 1 +
8
target/arm/cpu64.c | 1 +
9
target/arm/cpu_tcg.c | 1 +
10
3 files changed, 3 insertions(+)
11
11
12
Fixes: 3bec78447a958d481991
12
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
index XXXXXXX..XXXXXXX 100644
14
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
14
--- a/docs/system/arm/emulation.rst
15
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
+++ b/docs/system/arm/emulation.rst
16
Message-id: 20200423110915.10527-1-peter.maydell@linaro.org
16
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
17
---
17
- FEAT_DoubleFault (Double Fault Extension)
18
target/arm/cpu64.c | 6 +++---
18
- FEAT_E0PD (Preventing EL0 access to halves of address maps)
19
1 file changed, 3 insertions(+), 3 deletions(-)
19
- FEAT_ETS (Enhanced Translation Synchronization)
20
20
+- FEAT_EVT (Enhanced Virtualization Traps)
21
- FEAT_FCMA (Floating-point complex number instructions)
22
- FEAT_FHM (Floating-point half-precision multiplication instructions)
23
- FEAT_FP16 (Half-precision floating-point data processing)
21
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
24
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
22
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/cpu64.c
26
--- a/target/arm/cpu64.c
24
+++ b/target/arm/cpu64.c
27
+++ b/target/arm/cpu64.c
25
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
28
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
26
u = FIELD_DP32(u, ID_MMFR4, XNX, 1); /* TTS2UXN */
29
t = FIELD_DP64(t, ID_AA64MMFR2, FWB, 1); /* FEAT_S2FWB */
27
cpu->isar.id_mmfr4 = u;
30
t = FIELD_DP64(t, ID_AA64MMFR2, TTL, 1); /* FEAT_TTL */
28
31
t = FIELD_DP64(t, ID_AA64MMFR2, BBM, 2); /* FEAT_BBM at level 2 */
29
- u = cpu->isar.id_aa64dfr0;
32
+ t = FIELD_DP64(t, ID_AA64MMFR2, EVT, 2); /* FEAT_EVT */
30
- u = FIELD_DP64(u, ID_AA64DFR0, PMUVER, 5); /* v8.4-PMU */
33
t = FIELD_DP64(t, ID_AA64MMFR2, E0PD, 1); /* FEAT_E0PD */
31
- cpu->isar.id_aa64dfr0 = u;
34
cpu->isar.id_aa64mmfr2 = t;
32
+ t = cpu->isar.id_aa64dfr0;
35
33
+ t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 5); /* v8.4-PMU */
36
diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
34
+ cpu->isar.id_aa64dfr0 = t;
37
index XXXXXXX..XXXXXXX 100644
35
38
--- a/target/arm/cpu_tcg.c
36
u = cpu->isar.id_dfr0;
39
+++ b/target/arm/cpu_tcg.c
37
u = FIELD_DP32(u, ID_DFR0, PERFMON, 5); /* v8.4-PMU */
40
@@ -XXX,XX +XXX,XX @@ void aa32_max_features(ARMCPU *cpu)
41
t = FIELD_DP32(t, ID_MMFR4, AC2, 1); /* ACTLR2, HACTLR2 */
42
t = FIELD_DP32(t, ID_MMFR4, CNP, 1); /* FEAT_TTCNP */
43
t = FIELD_DP32(t, ID_MMFR4, XNX, 1); /* FEAT_XNX */
44
+ t = FIELD_DP32(t, ID_MMFR4, EVT, 2); /* FEAT_EVT */
45
cpu->isar.id_mmfr4 = t;
46
47
t = cpu->isar.id_mmfr5;
38
--
48
--
39
2.20.1
49
2.25.1
40
41
diff view generated by jsdifflib
1
Convert the Neon "load/store single structure to one lane" insns to
1
Convert the TYPE_ARM_SMMU device to 3-phase reset. The legacy method
2
decodetree.
2
doesn't do anything that's invalid in the hold phase, so the
3
conversion is simple and not a behaviour change.
3
4
4
As this is the last set of insns in the neon load/store group,
5
Note that we must convert this base class before we can convert the
5
we can remove the whole disas_neon_ls_insn() function.
6
TYPE_ARM_SMMUV3 subclass -- transitional support in Resettable
7
handles "chain to parent class reset" when the base class is 3-phase
8
and the subclass is still using legacy reset, but not the other way
9
around.
6
10
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200430181003.21682-14-peter.maydell@linaro.org
14
Reviewed-by: Eric Auger <eric.auger@redhat.com>
15
Message-id: 20221109161444.3397405-2-peter.maydell@linaro.org
10
---
16
---
11
target/arm/neon-ls.decode | 11 +++
17
hw/arm/smmu-common.c | 7 ++++---
12
target/arm/translate-neon.inc.c | 89 +++++++++++++++++++
18
1 file changed, 4 insertions(+), 3 deletions(-)
13
target/arm/translate.c | 147 --------------------------------
14
3 files changed, 100 insertions(+), 147 deletions(-)
15
19
16
diff --git a/target/arm/neon-ls.decode b/target/arm/neon-ls.decode
20
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
17
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/neon-ls.decode
22
--- a/hw/arm/smmu-common.c
19
+++ b/target/arm/neon-ls.decode
23
+++ b/hw/arm/smmu-common.c
20
@@ -XXX,XX +XXX,XX @@ VLDST_multiple 1111 0100 0 . l:1 0 rn:4 .... itype:4 size:2 align:2 rm:4 \
24
@@ -XXX,XX +XXX,XX @@ static void smmu_base_realize(DeviceState *dev, Error **errp)
21
25
}
22
VLD_all_lanes 1111 0100 1 . 1 0 rn:4 .... 11 n:2 size:2 t:1 a:1 rm:4 \
23
vd=%vd_dp
24
+
25
+# Neon load/store single structure to one lane
26
+%imm1_5_p1 5:1 !function=plus1
27
+%imm1_6_p1 6:1 !function=plus1
28
+
29
+VLDST_single 1111 0100 1 . l:1 0 rn:4 .... 00 n:2 reg_idx:3 align:1 rm:4 \
30
+ vd=%vd_dp size=0 stride=1
31
+VLDST_single 1111 0100 1 . l:1 0 rn:4 .... 01 n:2 reg_idx:2 align:2 rm:4 \
32
+ vd=%vd_dp size=1 stride=%imm1_5_p1
33
+VLDST_single 1111 0100 1 . l:1 0 rn:4 .... 10 n:2 reg_idx:1 align:3 rm:4 \
34
+ vd=%vd_dp size=2 stride=%imm1_6_p1
35
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/arm/translate-neon.inc.c
38
+++ b/target/arm/translate-neon.inc.c
39
@@ -XXX,XX +XXX,XX @@
40
* It might be possible to convert it to a standalone .c file eventually.
41
*/
42
43
+static inline int plus1(DisasContext *s, int x)
44
+{
45
+ return x + 1;
46
+}
47
+
48
/* Include the generated Neon decoder */
49
#include "decode-neon-dp.inc.c"
50
#include "decode-neon-ls.inc.c"
51
@@ -XXX,XX +XXX,XX @@ static bool trans_VLD_all_lanes(DisasContext *s, arg_VLD_all_lanes *a)
52
53
return true;
54
}
26
}
55
+
27
56
+static bool trans_VLDST_single(DisasContext *s, arg_VLDST_single *a)
28
-static void smmu_base_reset(DeviceState *dev)
57
+{
29
+static void smmu_base_reset_hold(Object *obj)
58
+ /* Neon load/store single structure to one lane */
30
{
59
+ int reg;
31
- SMMUState *s = ARM_SMMU(dev);
60
+ int nregs = a->n + 1;
32
+ SMMUState *s = ARM_SMMU(obj);
61
+ int vd = a->vd;
33
62
+ TCGv_i32 addr, tmp;
34
g_hash_table_remove_all(s->configs);
63
+
35
g_hash_table_remove_all(s->iotlb);
64
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
36
@@ -XXX,XX +XXX,XX @@ static Property smmu_dev_properties[] = {
65
+ return false;
37
static void smmu_base_class_init(ObjectClass *klass, void *data)
66
+ }
38
{
67
+
39
DeviceClass *dc = DEVICE_CLASS(klass);
68
+ /* UNDEF accesses to D16-D31 if they don't exist */
40
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
69
+ if (!dc_isar_feature(aa32_simd_r32, s) && (a->vd & 0x10)) {
41
SMMUBaseClass *sbc = ARM_SMMU_CLASS(klass);
70
+ return false;
42
71
+ }
43
device_class_set_props(dc, smmu_dev_properties);
72
+
44
device_class_set_parent_realize(dc, smmu_base_realize,
73
+ /* Catch the UNDEF cases. This is unavoidably a bit messy. */
45
&sbc->parent_realize);
74
+ switch (nregs) {
46
- dc->reset = smmu_base_reset;
75
+ case 1:
47
+ rc->phases.hold = smmu_base_reset_hold;
76
+ if (((a->align & (1 << a->size)) != 0) ||
77
+ (a->size == 2 && ((a->align & 3) == 1 || (a->align & 3) == 2))) {
78
+ return false;
79
+ }
80
+ break;
81
+ case 3:
82
+ if ((a->align & 1) != 0) {
83
+ return false;
84
+ }
85
+ /* fall through */
86
+ case 2:
87
+ if (a->size == 2 && (a->align & 2) != 0) {
88
+ return false;
89
+ }
90
+ break;
91
+ case 4:
92
+ if ((a->size == 2) && ((a->align & 3) == 3)) {
93
+ return false;
94
+ }
95
+ break;
96
+ default:
97
+ abort();
98
+ }
99
+ if ((vd + a->stride * (nregs - 1)) > 31) {
100
+ /*
101
+ * Attempts to write off the end of the register file are
102
+ * UNPREDICTABLE; we choose to UNDEF because otherwise we would
103
+ * access off the end of the array that holds the register data.
104
+ */
105
+ return false;
106
+ }
107
+
108
+ if (!vfp_access_check(s)) {
109
+ return true;
110
+ }
111
+
112
+ tmp = tcg_temp_new_i32();
113
+ addr = tcg_temp_new_i32();
114
+ load_reg_var(s, addr, a->rn);
115
+ /*
116
+ * TODO: if we implemented alignment exceptions, we should check
117
+ * addr against the alignment encoded in a->align here.
118
+ */
119
+ for (reg = 0; reg < nregs; reg++) {
120
+ if (a->l) {
121
+ gen_aa32_ld_i32(s, tmp, addr, get_mem_index(s),
122
+ s->be_data | a->size);
123
+ neon_store_element(vd, a->reg_idx, a->size, tmp);
124
+ } else { /* Store */
125
+ neon_load_element(tmp, vd, a->reg_idx, a->size);
126
+ gen_aa32_st_i32(s, tmp, addr, get_mem_index(s),
127
+ s->be_data | a->size);
128
+ }
129
+ vd += a->stride;
130
+ tcg_gen_addi_i32(addr, addr, 1 << a->size);
131
+ }
132
+ tcg_temp_free_i32(addr);
133
+ tcg_temp_free_i32(tmp);
134
+
135
+ gen_neon_ldst_base_update(s, a->rm, a->rn, (1 << a->size) * nregs);
136
+
137
+ return true;
138
+}
139
diff --git a/target/arm/translate.c b/target/arm/translate.c
140
index XXXXXXX..XXXXXXX 100644
141
--- a/target/arm/translate.c
142
+++ b/target/arm/translate.c
143
@@ -XXX,XX +XXX,XX @@ static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1)
144
tcg_temp_free_i32(rd);
145
}
48
}
146
49
147
-
50
static const TypeInfo smmu_base_info = {
148
-/* Translate a NEON load/store element instruction. Return nonzero if the
149
- instruction is invalid. */
150
-static int disas_neon_ls_insn(DisasContext *s, uint32_t insn)
151
-{
152
- int rd, rn, rm;
153
- int nregs;
154
- int stride;
155
- int size;
156
- int reg;
157
- int load;
158
- TCGv_i32 addr;
159
- TCGv_i32 tmp;
160
-
161
- if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
162
- return 1;
163
- }
164
-
165
- /* FIXME: this access check should not take precedence over UNDEF
166
- * for invalid encodings; we will generate incorrect syndrome information
167
- * for attempts to execute invalid vfp/neon encodings with FP disabled.
168
- */
169
- if (s->fp_excp_el) {
170
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
171
- syn_simd_access_trap(1, 0xe, false), s->fp_excp_el);
172
- return 0;
173
- }
174
-
175
- if (!s->vfp_enabled)
176
- return 1;
177
- VFP_DREG_D(rd, insn);
178
- rn = (insn >> 16) & 0xf;
179
- rm = insn & 0xf;
180
- load = (insn & (1 << 21)) != 0;
181
- if ((insn & (1 << 23)) == 0) {
182
- /* Load store all elements -- handled already by decodetree */
183
- return 1;
184
- } else {
185
- size = (insn >> 10) & 3;
186
- if (size == 3) {
187
- /* Load single element to all lanes -- handled by decodetree */
188
- return 1;
189
- } else {
190
- /* Single element. */
191
- int idx = (insn >> 4) & 0xf;
192
- int reg_idx;
193
- switch (size) {
194
- case 0:
195
- reg_idx = (insn >> 5) & 7;
196
- stride = 1;
197
- break;
198
- case 1:
199
- reg_idx = (insn >> 6) & 3;
200
- stride = (insn & (1 << 5)) ? 2 : 1;
201
- break;
202
- case 2:
203
- reg_idx = (insn >> 7) & 1;
204
- stride = (insn & (1 << 6)) ? 2 : 1;
205
- break;
206
- default:
207
- abort();
208
- }
209
- nregs = ((insn >> 8) & 3) + 1;
210
- /* Catch the UNDEF cases. This is unavoidably a bit messy. */
211
- switch (nregs) {
212
- case 1:
213
- if (((idx & (1 << size)) != 0) ||
214
- (size == 2 && ((idx & 3) == 1 || (idx & 3) == 2))) {
215
- return 1;
216
- }
217
- break;
218
- case 3:
219
- if ((idx & 1) != 0) {
220
- return 1;
221
- }
222
- /* fall through */
223
- case 2:
224
- if (size == 2 && (idx & 2) != 0) {
225
- return 1;
226
- }
227
- break;
228
- case 4:
229
- if ((size == 2) && ((idx & 3) == 3)) {
230
- return 1;
231
- }
232
- break;
233
- default:
234
- abort();
235
- }
236
- if ((rd + stride * (nregs - 1)) > 31) {
237
- /* Attempts to write off the end of the register file
238
- * are UNPREDICTABLE; we choose to UNDEF because otherwise
239
- * the neon_load_reg() would write off the end of the array.
240
- */
241
- return 1;
242
- }
243
- tmp = tcg_temp_new_i32();
244
- addr = tcg_temp_new_i32();
245
- load_reg_var(s, addr, rn);
246
- for (reg = 0; reg < nregs; reg++) {
247
- if (load) {
248
- gen_aa32_ld_i32(s, tmp, addr, get_mem_index(s),
249
- s->be_data | size);
250
- neon_store_element(rd, reg_idx, size, tmp);
251
- } else { /* Store */
252
- neon_load_element(tmp, rd, reg_idx, size);
253
- gen_aa32_st_i32(s, tmp, addr, get_mem_index(s),
254
- s->be_data | size);
255
- }
256
- rd += stride;
257
- tcg_gen_addi_i32(addr, addr, 1 << size);
258
- }
259
- tcg_temp_free_i32(addr);
260
- tcg_temp_free_i32(tmp);
261
- stride = nregs * (1 << size);
262
- }
263
- }
264
- if (rm != 15) {
265
- TCGv_i32 base;
266
-
267
- base = load_reg(s, rn);
268
- if (rm == 13) {
269
- tcg_gen_addi_i32(base, base, stride);
270
- } else {
271
- TCGv_i32 index;
272
- index = load_reg(s, rm);
273
- tcg_gen_add_i32(base, base, index);
274
- tcg_temp_free_i32(index);
275
- }
276
- store_reg(s, rn, base);
277
- }
278
- return 0;
279
-}
280
-
281
static inline void gen_neon_narrow(int size, TCGv_i32 dest, TCGv_i64 src)
282
{
283
switch (size) {
284
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
285
}
286
return;
287
}
288
- if ((insn & 0x0f100000) == 0x04000000) {
289
- /* NEON load/store. */
290
- if (disas_neon_ls_insn(s, insn)) {
291
- goto illegal_op;
292
- }
293
- return;
294
- }
295
if ((insn & 0x0e000f00) == 0x0c000100) {
296
if (arm_dc_feature(s, ARM_FEATURE_IWMMXT)) {
297
/* iWMMXt register transfer. */
298
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
299
}
300
break;
301
case 12:
302
- if ((insn & 0x01100000) == 0x01000000) {
303
- if (disas_neon_ls_insn(s, insn)) {
304
- goto illegal_op;
305
- }
306
- break;
307
- }
308
goto illegal_op;
309
default:
310
illegal_op:
311
--
51
--
312
2.20.1
52
2.25.1
313
53
314
54
diff view generated by jsdifflib
1
Convert the Neon VQADD/VQSUB insns in the 3-reg-same grouping
1
Convert the TYPE_ARM_SMMUV3 device to 3-phase reset. The legacy
2
to decodetree.
2
reset method doesn't do anything that's invalid in the hold phase, so
3
the conversion only requires changing it to a hold phase method, and
4
using the 3-phase versions of the "save the parent reset method and
5
chain to it" code.
3
6
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20200430181003.21682-19-peter.maydell@linaro.org
9
Reviewed-by: Eric Auger <eric.auger@redhat.com>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Message-id: 20221109161444.3397405-3-peter.maydell@linaro.org
7
---
12
---
8
target/arm/neon-dp.decode | 6 ++++++
13
include/hw/arm/smmuv3.h | 2 +-
9
target/arm/translate-neon.inc.c | 15 +++++++++++++++
14
hw/arm/smmuv3.c | 12 ++++++++----
10
target/arm/translate.c | 14 ++------------
15
2 files changed, 9 insertions(+), 5 deletions(-)
11
3 files changed, 23 insertions(+), 12 deletions(-)
12
16
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
17
diff --git a/include/hw/arm/smmuv3.h b/include/hw/arm/smmuv3.h
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
19
--- a/include/hw/arm/smmuv3.h
16
+++ b/target/arm/neon-dp.decode
20
+++ b/include/hw/arm/smmuv3.h
17
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ struct SMMUv3Class {
18
@3same .... ... . . . size:2 .... .... .... . q:1 . . .... \
22
/*< public >*/
19
&3same vm=%vm_dp vn=%vn_dp vd=%vd_dp
23
20
24
DeviceRealize parent_realize;
21
+VQADD_S_3s 1111 001 0 0 . .. .... .... 0000 . . . 1 .... @3same
25
- DeviceReset parent_reset;
22
+VQADD_U_3s 1111 001 1 0 . .. .... .... 0000 . . . 1 .... @3same
26
+ ResettablePhases parent_phases;
23
+
27
};
24
@3same_logic .... ... . . . .. .... .... .... . q:1 .. .... \
28
25
&3same vm=%vm_dp vn=%vn_dp vd=%vd_dp size=0
29
#define TYPE_ARM_SMMUV3 "arm-smmuv3"
26
30
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
27
@@ -XXX,XX +XXX,XX @@ VBSL_3s 1111 001 1 0 . 01 .... .... 0001 ... 1 .... @3same_logic
28
VBIT_3s 1111 001 1 0 . 10 .... .... 0001 ... 1 .... @3same_logic
29
VBIF_3s 1111 001 1 0 . 11 .... .... 0001 ... 1 .... @3same_logic
30
31
+VQSUB_S_3s 1111 001 0 0 . .. .... .... 0010 . . . 1 .... @3same
32
+VQSUB_U_3s 1111 001 1 0 . .. .... .... 0010 . . . 1 .... @3same
33
+
34
VCGT_S_3s 1111 001 0 0 . .. .... .... 0011 . . . 0 .... @3same
35
VCGT_U_3s 1111 001 1 0 . .. .... .... 0011 . . . 0 .... @3same
36
VCGE_S_3s 1111 001 0 0 . .. .... .... 0011 . . . 1 .... @3same
37
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
38
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/translate-neon.inc.c
32
--- a/hw/arm/smmuv3.c
40
+++ b/target/arm/translate-neon.inc.c
33
+++ b/hw/arm/smmuv3.c
41
@@ -XXX,XX +XXX,XX @@ static void gen_VTST_3s(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
34
@@ -XXX,XX +XXX,XX @@ static void smmu_init_irq(SMMUv3State *s, SysBusDevice *dev)
42
tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs, oprsz, maxsz, &cmtst_op[vece]);
35
}
43
}
36
}
44
DO_3SAME_NO_SZ_3(VTST, gen_VTST_3s)
37
45
+
38
-static void smmu_reset(DeviceState *dev)
46
+#define DO_3SAME_GVEC4(INSN, OPARRAY) \
39
+static void smmu_reset_hold(Object *obj)
47
+ static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
40
{
48
+ uint32_t rn_ofs, uint32_t rm_ofs, \
41
- SMMUv3State *s = ARM_SMMUV3(dev);
49
+ uint32_t oprsz, uint32_t maxsz) \
42
+ SMMUv3State *s = ARM_SMMUV3(obj);
50
+ { \
43
SMMUv3Class *c = ARM_SMMUV3_GET_CLASS(s);
51
+ tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc), \
44
52
+ rn_ofs, rm_ofs, oprsz, maxsz, &OPARRAY[vece]); \
45
- c->parent_reset(dev);
53
+ } \
46
+ if (c->parent_phases.hold) {
54
+ DO_3SAME(INSN, gen_##INSN##_3s)
47
+ c->parent_phases.hold(obj);
55
+
48
+ }
56
+DO_3SAME_GVEC4(VQADD_S, sqadd_op)
49
57
+DO_3SAME_GVEC4(VQADD_U, uqadd_op)
50
smmuv3_init_regs(s);
58
+DO_3SAME_GVEC4(VQSUB_S, sqsub_op)
51
}
59
+DO_3SAME_GVEC4(VQSUB_U, uqsub_op)
52
@@ -XXX,XX +XXX,XX @@ static void smmuv3_instance_init(Object *obj)
60
diff --git a/target/arm/translate.c b/target/arm/translate.c
53
static void smmuv3_class_init(ObjectClass *klass, void *data)
61
index XXXXXXX..XXXXXXX 100644
54
{
62
--- a/target/arm/translate.c
55
DeviceClass *dc = DEVICE_CLASS(klass);
63
+++ b/target/arm/translate.c
56
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
64
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
57
SMMUv3Class *c = ARM_SMMUV3_CLASS(klass);
65
}
58
66
return 1;
59
dc->vmsd = &vmstate_smmuv3;
67
60
- device_class_set_parent_reset(dc, smmu_reset, &c->parent_reset);
68
- case NEON_3R_VQADD:
61
+ resettable_class_set_parent_phases(rc, NULL, smmu_reset_hold, NULL,
69
- tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
62
+ &c->parent_phases);
70
- rn_ofs, rm_ofs, vec_size, vec_size,
63
c->parent_realize = dc->realize;
71
- (u ? uqadd_op : sqadd_op) + size);
64
dc->realize = smmu_realize;
72
- return 0;
65
}
73
-
74
- case NEON_3R_VQSUB:
75
- tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
76
- rn_ofs, rm_ofs, vec_size, vec_size,
77
- (u ? uqsub_op : sqsub_op) + size);
78
- return 0;
79
-
80
case NEON_3R_VMUL: /* VMUL */
81
if (u) {
82
/* Polynomial case allows only P8. */
83
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
84
case NEON_3R_VTST_VCEQ:
85
case NEON_3R_VCGT:
86
case NEON_3R_VCGE:
87
+ case NEON_3R_VQADD:
88
+ case NEON_3R_VQSUB:
89
/* Already handled by decodetree */
90
return 1;
91
}
92
--
66
--
93
2.20.1
67
2.25.1
94
68
95
69
diff view generated by jsdifflib
1
Convert the Neon comparison ops in the 3-reg-same grouping
1
Convert the TYPE_ARM_GIC_COMMON device to 3-phase reset. This is a
2
to decodetree.
2
simple no-behaviour-change conversion.
3
3
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20200430181003.21682-18-peter.maydell@linaro.org
7
Message-id: 20221109161444.3397405-4-peter.maydell@linaro.org
7
---
8
---
8
target/arm/neon-dp.decode | 8 ++++++++
9
hw/intc/arm_gic_common.c | 7 ++++---
9
target/arm/translate-neon.inc.c | 22 ++++++++++++++++++++++
10
1 file changed, 4 insertions(+), 3 deletions(-)
10
target/arm/translate.c | 23 +++--------------------
11
3 files changed, 33 insertions(+), 20 deletions(-)
12
11
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
12
diff --git a/hw/intc/arm_gic_common.c b/hw/intc/arm_gic_common.c
14
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
14
--- a/hw/intc/arm_gic_common.c
16
+++ b/target/arm/neon-dp.decode
15
+++ b/hw/intc/arm_gic_common.c
17
@@ -XXX,XX +XXX,XX @@ VBSL_3s 1111 001 1 0 . 01 .... .... 0001 ... 1 .... @3same_logic
16
@@ -XXX,XX +XXX,XX @@ static inline void arm_gic_common_reset_irq_state(GICState *s, int first_cpu,
18
VBIT_3s 1111 001 1 0 . 10 .... .... 0001 ... 1 .... @3same_logic
17
}
19
VBIF_3s 1111 001 1 0 . 11 .... .... 0001 ... 1 .... @3same_logic
18
}
20
19
21
+VCGT_S_3s 1111 001 0 0 . .. .... .... 0011 . . . 0 .... @3same
20
-static void arm_gic_common_reset(DeviceState *dev)
22
+VCGT_U_3s 1111 001 1 0 . .. .... .... 0011 . . . 0 .... @3same
21
+static void arm_gic_common_reset_hold(Object *obj)
23
+VCGE_S_3s 1111 001 0 0 . .. .... .... 0011 . . . 1 .... @3same
22
{
24
+VCGE_U_3s 1111 001 1 0 . .. .... .... 0011 . . . 1 .... @3same
23
- GICState *s = ARM_GIC_COMMON(dev);
25
+
24
+ GICState *s = ARM_GIC_COMMON(obj);
26
VMAX_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 0 .... @3same
25
int i, j;
27
VMAX_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 0 .... @3same
26
int resetprio;
28
VMIN_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 1 .... @3same
27
29
@@ -XXX,XX +XXX,XX @@ VMIN_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 1 .... @3same
28
@@ -XXX,XX +XXX,XX @@ static Property arm_gic_common_properties[] = {
30
29
static void arm_gic_common_class_init(ObjectClass *klass, void *data)
31
VADD_3s 1111 001 0 0 . .. .... .... 1000 . . . 0 .... @3same
30
{
32
VSUB_3s 1111 001 1 0 . .. .... .... 1000 . . . 0 .... @3same
31
DeviceClass *dc = DEVICE_CLASS(klass);
33
+
32
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
34
+VTST_3s 1111 001 0 0 . .. .... .... 1000 . . . 1 .... @3same
33
ARMLinuxBootIfClass *albifc = ARM_LINUX_BOOT_IF_CLASS(klass);
35
+VCEQ_3s 1111 001 1 0 . .. .... .... 1000 . . . 1 .... @3same
34
36
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
35
- dc->reset = arm_gic_common_reset;
37
index XXXXXXX..XXXXXXX 100644
36
+ rc->phases.hold = arm_gic_common_reset_hold;
38
--- a/target/arm/translate-neon.inc.c
37
dc->realize = arm_gic_common_realize;
39
+++ b/target/arm/translate-neon.inc.c
38
device_class_set_props(dc, arm_gic_common_properties);
40
@@ -XXX,XX +XXX,XX @@ DO_3SAME_NO_SZ_3(VMAX_S, tcg_gen_gvec_smax)
39
dc->vmsd = &vmstate_gic;
41
DO_3SAME_NO_SZ_3(VMAX_U, tcg_gen_gvec_umax)
42
DO_3SAME_NO_SZ_3(VMIN_S, tcg_gen_gvec_smin)
43
DO_3SAME_NO_SZ_3(VMIN_U, tcg_gen_gvec_umin)
44
+
45
+#define DO_3SAME_CMP(INSN, COND) \
46
+ static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
47
+ uint32_t rn_ofs, uint32_t rm_ofs, \
48
+ uint32_t oprsz, uint32_t maxsz) \
49
+ { \
50
+ tcg_gen_gvec_cmp(COND, vece, rd_ofs, rn_ofs, rm_ofs, oprsz, maxsz); \
51
+ } \
52
+ DO_3SAME_NO_SZ_3(INSN, gen_##INSN##_3s)
53
+
54
+DO_3SAME_CMP(VCGT_S, TCG_COND_GT)
55
+DO_3SAME_CMP(VCGT_U, TCG_COND_GTU)
56
+DO_3SAME_CMP(VCGE_S, TCG_COND_GE)
57
+DO_3SAME_CMP(VCGE_U, TCG_COND_GEU)
58
+DO_3SAME_CMP(VCEQ, TCG_COND_EQ)
59
+
60
+static void gen_VTST_3s(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
61
+ uint32_t rm_ofs, uint32_t oprsz, uint32_t maxsz)
62
+{
63
+ tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs, oprsz, maxsz, &cmtst_op[vece]);
64
+}
65
+DO_3SAME_NO_SZ_3(VTST, gen_VTST_3s)
66
diff --git a/target/arm/translate.c b/target/arm/translate.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/arm/translate.c
69
+++ b/target/arm/translate.c
70
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
71
u ? &mls_op[size] : &mla_op[size]);
72
return 0;
73
74
- case NEON_3R_VTST_VCEQ:
75
- if (u) { /* VCEQ */
76
- tcg_gen_gvec_cmp(TCG_COND_EQ, size, rd_ofs, rn_ofs, rm_ofs,
77
- vec_size, vec_size);
78
- } else { /* VTST */
79
- tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs,
80
- vec_size, vec_size, &cmtst_op[size]);
81
- }
82
- return 0;
83
-
84
- case NEON_3R_VCGT:
85
- tcg_gen_gvec_cmp(u ? TCG_COND_GTU : TCG_COND_GT, size,
86
- rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
87
- return 0;
88
-
89
- case NEON_3R_VCGE:
90
- tcg_gen_gvec_cmp(u ? TCG_COND_GEU : TCG_COND_GE, size,
91
- rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
92
- return 0;
93
-
94
case NEON_3R_VSHL:
95
/* Note the operation is vshl vd,vm,vn */
96
tcg_gen_gvec_3(rd_ofs, rm_ofs, rn_ofs, vec_size, vec_size,
97
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
98
case NEON_3R_LOGIC:
99
case NEON_3R_VMAX:
100
case NEON_3R_VMIN:
101
+ case NEON_3R_VTST_VCEQ:
102
+ case NEON_3R_VCGT:
103
+ case NEON_3R_VCGE:
104
/* Already handled by decodetree */
105
return 1;
106
}
107
--
40
--
108
2.20.1
41
2.25.1
109
42
110
43
diff view generated by jsdifflib
1
Convert the Neon "load/store multiple structures" insns to decodetree.
1
Now we have converted TYPE_ARM_GIC_COMMON, we can convert the
2
TYPE_ARM_GIC_KVM subclass to 3-phase reset.
2
3
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20200430181003.21682-12-peter.maydell@linaro.org
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Message-id: 20221109161444.3397405-5-peter.maydell@linaro.org
6
---
8
---
7
target/arm/neon-ls.decode | 7 ++
9
hw/intc/arm_gic_kvm.c | 14 +++++++++-----
8
target/arm/translate-neon.inc.c | 124 ++++++++++++++++++++++++++++++++
10
1 file changed, 9 insertions(+), 5 deletions(-)
9
target/arm/translate.c | 91 +----------------------
10
3 files changed, 133 insertions(+), 89 deletions(-)
11
11
12
diff --git a/target/arm/neon-ls.decode b/target/arm/neon-ls.decode
12
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
13
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-ls.decode
14
--- a/hw/intc/arm_gic_kvm.c
15
+++ b/target/arm/neon-ls.decode
15
+++ b/hw/intc/arm_gic_kvm.c
16
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@ DECLARE_OBJ_CHECKERS(GICState, KVMARMGICClass,
17
# 0b1111_1001_xxx0_xxxx_xxxx_xxxx_xxxx_xxxx
17
struct KVMARMGICClass {
18
# This file works on the A32 encoding only; calling code for T32 has to
18
ARMGICCommonClass parent_class;
19
# transform the insn into the A32 version first.
19
DeviceRealize parent_realize;
20
+
20
- void (*parent_reset)(DeviceState *dev);
21
+%vd_dp 22:1 12:4
21
+ ResettablePhases parent_phases;
22
+
22
};
23
+# Neon load/store multiple structures
23
24
+
24
void kvm_arm_gic_set_irq(uint32_t num_irq, int irq, int level)
25
+VLDST_multiple 1111 0100 0 . l:1 0 rn:4 .... itype:4 size:2 align:2 rm:4 \
25
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_get(GICState *s)
26
+ vd=%vd_dp
26
}
27
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/translate-neon.inc.c
30
+++ b/target/arm/translate-neon.inc.c
31
@@ -XXX,XX +XXX,XX @@ static bool trans_VFML_scalar(DisasContext *s, arg_VFML_scalar *a)
32
gen_helper_gvec_fmlal_idx_a32);
33
return true;
34
}
27
}
35
+
28
36
+static struct {
29
-static void kvm_arm_gic_reset(DeviceState *dev)
37
+ int nregs;
30
+static void kvm_arm_gic_reset_hold(Object *obj)
38
+ int interleave;
31
{
39
+ int spacing;
32
- GICState *s = ARM_GIC_COMMON(dev);
40
+} const neon_ls_element_type[11] = {
33
+ GICState *s = ARM_GIC_COMMON(obj);
41
+ {1, 4, 1},
34
KVMARMGICClass *kgc = KVM_ARM_GIC_GET_CLASS(s);
42
+ {1, 4, 2},
35
43
+ {4, 1, 1},
36
- kgc->parent_reset(dev);
44
+ {2, 2, 2},
37
+ if (kgc->parent_phases.hold) {
45
+ {1, 3, 1},
38
+ kgc->parent_phases.hold(obj);
46
+ {1, 3, 2},
47
+ {3, 1, 1},
48
+ {1, 1, 1},
49
+ {1, 2, 1},
50
+ {1, 2, 2},
51
+ {2, 1, 1}
52
+};
53
+
54
+static void gen_neon_ldst_base_update(DisasContext *s, int rm, int rn,
55
+ int stride)
56
+{
57
+ if (rm != 15) {
58
+ TCGv_i32 base;
59
+
60
+ base = load_reg(s, rn);
61
+ if (rm == 13) {
62
+ tcg_gen_addi_i32(base, base, stride);
63
+ } else {
64
+ TCGv_i32 index;
65
+ index = load_reg(s, rm);
66
+ tcg_gen_add_i32(base, base, index);
67
+ tcg_temp_free_i32(index);
68
+ }
69
+ store_reg(s, rn, base);
70
+ }
39
+ }
71
+}
40
72
+
41
if (kvm_arm_gic_can_save_restore(s)) {
73
+static bool trans_VLDST_multiple(DisasContext *s, arg_VLDST_multiple *a)
42
kvm_arm_gic_put(s);
74
+{
43
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
75
+ /* Neon load/store multiple structures */
44
static void kvm_arm_gic_class_init(ObjectClass *klass, void *data)
76
+ int nregs, interleave, spacing, reg, n;
45
{
77
+ MemOp endian = s->be_data;
46
DeviceClass *dc = DEVICE_CLASS(klass);
78
+ int mmu_idx = get_mem_index(s);
47
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
79
+ int size = a->size;
48
ARMGICCommonClass *agcc = ARM_GIC_COMMON_CLASS(klass);
80
+ TCGv_i64 tmp64;
49
KVMARMGICClass *kgc = KVM_ARM_GIC_CLASS(klass);
81
+ TCGv_i32 addr, tmp;
50
82
+
51
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_class_init(ObjectClass *klass, void *data)
83
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
52
agcc->post_load = kvm_arm_gic_put;
84
+ return false;
53
device_class_set_parent_realize(dc, kvm_arm_gic_realize,
85
+ }
54
&kgc->parent_realize);
86
+
55
- device_class_set_parent_reset(dc, kvm_arm_gic_reset, &kgc->parent_reset);
87
+ /* UNDEF accesses to D16-D31 if they don't exist */
56
+ resettable_class_set_parent_phases(rc, NULL, kvm_arm_gic_reset_hold, NULL,
88
+ if (!dc_isar_feature(aa32_simd_r32, s) && (a->vd & 0x10)) {
57
+ &kgc->parent_phases);
89
+ return false;
90
+ }
91
+ if (a->itype > 10) {
92
+ return false;
93
+ }
94
+ /* Catch UNDEF cases for bad values of align field */
95
+ switch (a->itype & 0xc) {
96
+ case 4:
97
+ if (a->align >= 2) {
98
+ return false;
99
+ }
100
+ break;
101
+ case 8:
102
+ if (a->align == 3) {
103
+ return false;
104
+ }
105
+ break;
106
+ default:
107
+ break;
108
+ }
109
+ nregs = neon_ls_element_type[a->itype].nregs;
110
+ interleave = neon_ls_element_type[a->itype].interleave;
111
+ spacing = neon_ls_element_type[a->itype].spacing;
112
+ if (size == 3 && (interleave | spacing) != 1) {
113
+ return false;
114
+ }
115
+
116
+ if (!vfp_access_check(s)) {
117
+ return true;
118
+ }
119
+
120
+ /* For our purposes, bytes are always little-endian. */
121
+ if (size == 0) {
122
+ endian = MO_LE;
123
+ }
124
+ /*
125
+ * Consecutive little-endian elements from a single register
126
+ * can be promoted to a larger little-endian operation.
127
+ */
128
+ if (interleave == 1 && endian == MO_LE) {
129
+ size = 3;
130
+ }
131
+ tmp64 = tcg_temp_new_i64();
132
+ addr = tcg_temp_new_i32();
133
+ tmp = tcg_const_i32(1 << size);
134
+ load_reg_var(s, addr, a->rn);
135
+ for (reg = 0; reg < nregs; reg++) {
136
+ for (n = 0; n < 8 >> size; n++) {
137
+ int xs;
138
+ for (xs = 0; xs < interleave; xs++) {
139
+ int tt = a->vd + reg + spacing * xs;
140
+
141
+ if (a->l) {
142
+ gen_aa32_ld_i64(s, tmp64, addr, mmu_idx, endian | size);
143
+ neon_store_element64(tt, n, size, tmp64);
144
+ } else {
145
+ neon_load_element64(tmp64, tt, n, size);
146
+ gen_aa32_st_i64(s, tmp64, addr, mmu_idx, endian | size);
147
+ }
148
+ tcg_gen_add_i32(addr, addr, tmp);
149
+ }
150
+ }
151
+ }
152
+ tcg_temp_free_i32(addr);
153
+ tcg_temp_free_i32(tmp);
154
+ tcg_temp_free_i64(tmp64);
155
+
156
+ gen_neon_ldst_base_update(s, a->rm, a->rn, nregs * interleave * 8);
157
+ return true;
158
+}
159
diff --git a/target/arm/translate.c b/target/arm/translate.c
160
index XXXXXXX..XXXXXXX 100644
161
--- a/target/arm/translate.c
162
+++ b/target/arm/translate.c
163
@@ -XXX,XX +XXX,XX @@ static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1)
164
}
58
}
165
59
166
60
static const TypeInfo kvm_arm_gic_info = {
167
-static struct {
168
- int nregs;
169
- int interleave;
170
- int spacing;
171
-} const neon_ls_element_type[11] = {
172
- {1, 4, 1},
173
- {1, 4, 2},
174
- {4, 1, 1},
175
- {2, 2, 2},
176
- {1, 3, 1},
177
- {1, 3, 2},
178
- {3, 1, 1},
179
- {1, 1, 1},
180
- {1, 2, 1},
181
- {1, 2, 2},
182
- {2, 1, 1}
183
-};
184
-
185
/* Translate a NEON load/store element instruction. Return nonzero if the
186
instruction is invalid. */
187
static int disas_neon_ls_insn(DisasContext *s, uint32_t insn)
188
{
189
int rd, rn, rm;
190
- int op;
191
int nregs;
192
- int interleave;
193
- int spacing;
194
int stride;
195
int size;
196
int reg;
197
int load;
198
- int n;
199
int vec_size;
200
- int mmu_idx;
201
- MemOp endian;
202
TCGv_i32 addr;
203
TCGv_i32 tmp;
204
- TCGv_i32 tmp2;
205
- TCGv_i64 tmp64;
206
207
if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
208
return 1;
209
@@ -XXX,XX +XXX,XX @@ static int disas_neon_ls_insn(DisasContext *s, uint32_t insn)
210
rn = (insn >> 16) & 0xf;
211
rm = insn & 0xf;
212
load = (insn & (1 << 21)) != 0;
213
- endian = s->be_data;
214
- mmu_idx = get_mem_index(s);
215
if ((insn & (1 << 23)) == 0) {
216
- /* Load store all elements. */
217
- op = (insn >> 8) & 0xf;
218
- size = (insn >> 6) & 3;
219
- if (op > 10)
220
- return 1;
221
- /* Catch UNDEF cases for bad values of align field */
222
- switch (op & 0xc) {
223
- case 4:
224
- if (((insn >> 5) & 1) == 1) {
225
- return 1;
226
- }
227
- break;
228
- case 8:
229
- if (((insn >> 4) & 3) == 3) {
230
- return 1;
231
- }
232
- break;
233
- default:
234
- break;
235
- }
236
- nregs = neon_ls_element_type[op].nregs;
237
- interleave = neon_ls_element_type[op].interleave;
238
- spacing = neon_ls_element_type[op].spacing;
239
- if (size == 3 && (interleave | spacing) != 1) {
240
- return 1;
241
- }
242
- /* For our purposes, bytes are always little-endian. */
243
- if (size == 0) {
244
- endian = MO_LE;
245
- }
246
- /* Consecutive little-endian elements from a single register
247
- * can be promoted to a larger little-endian operation.
248
- */
249
- if (interleave == 1 && endian == MO_LE) {
250
- size = 3;
251
- }
252
- tmp64 = tcg_temp_new_i64();
253
- addr = tcg_temp_new_i32();
254
- tmp2 = tcg_const_i32(1 << size);
255
- load_reg_var(s, addr, rn);
256
- for (reg = 0; reg < nregs; reg++) {
257
- for (n = 0; n < 8 >> size; n++) {
258
- int xs;
259
- for (xs = 0; xs < interleave; xs++) {
260
- int tt = rd + reg + spacing * xs;
261
-
262
- if (load) {
263
- gen_aa32_ld_i64(s, tmp64, addr, mmu_idx, endian | size);
264
- neon_store_element64(tt, n, size, tmp64);
265
- } else {
266
- neon_load_element64(tmp64, tt, n, size);
267
- gen_aa32_st_i64(s, tmp64, addr, mmu_idx, endian | size);
268
- }
269
- tcg_gen_add_i32(addr, addr, tmp2);
270
- }
271
- }
272
- }
273
- tcg_temp_free_i32(addr);
274
- tcg_temp_free_i32(tmp2);
275
- tcg_temp_free_i64(tmp64);
276
- stride = nregs * interleave * 8;
277
+ /* Load store all elements -- handled already by decodetree */
278
+ return 1;
279
} else {
280
size = (insn >> 10) & 3;
281
if (size == 3) {
282
--
61
--
283
2.20.1
62
2.25.1
284
63
285
64
diff view generated by jsdifflib
1
Convert the Neon 3-reg-same VMAX and VMIN insns to decodetree.
1
Convert the TYPE_ARM_GICV3_COMMON parent class to 3-phase reset.
2
2
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20200430181003.21682-17-peter.maydell@linaro.org
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Message-id: 20221109161444.3397405-6-peter.maydell@linaro.org
6
---
7
---
7
target/arm/neon-dp.decode | 5 +++++
8
hw/intc/arm_gicv3_common.c | 7 ++++---
8
target/arm/translate-neon.inc.c | 14 ++++++++++++++
9
1 file changed, 4 insertions(+), 3 deletions(-)
9
target/arm/translate.c | 21 ++-------------------
10
3 files changed, 21 insertions(+), 19 deletions(-)
11
10
12
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
11
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-dp.decode
13
--- a/hw/intc/arm_gicv3_common.c
15
+++ b/target/arm/neon-dp.decode
14
+++ b/hw/intc/arm_gicv3_common.c
16
@@ -XXX,XX +XXX,XX @@ VBSL_3s 1111 001 1 0 . 01 .... .... 0001 ... 1 .... @3same_logic
15
@@ -XXX,XX +XXX,XX @@ static void arm_gicv3_finalize(Object *obj)
17
VBIT_3s 1111 001 1 0 . 10 .... .... 0001 ... 1 .... @3same_logic
16
g_free(s->redist_region_count);
18
VBIF_3s 1111 001 1 0 . 11 .... .... 0001 ... 1 .... @3same_logic
17
}
19
18
20
+VMAX_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 0 .... @3same
19
-static void arm_gicv3_common_reset(DeviceState *dev)
21
+VMAX_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 0 .... @3same
20
+static void arm_gicv3_common_reset_hold(Object *obj)
22
+VMIN_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 1 .... @3same
21
{
23
+VMIN_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 1 .... @3same
22
- GICv3State *s = ARM_GICV3_COMMON(dev);
24
+
23
+ GICv3State *s = ARM_GICV3_COMMON(obj);
25
VADD_3s 1111 001 0 0 . .. .... .... 1000 . . . 0 .... @3same
24
int i;
26
VSUB_3s 1111 001 1 0 . .. .... .... 1000 . . . 0 .... @3same
25
27
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
26
for (i = 0; i < s->num_cpu; i++) {
28
index XXXXXXX..XXXXXXX 100644
27
@@ -XXX,XX +XXX,XX @@ static Property arm_gicv3_common_properties[] = {
29
--- a/target/arm/translate-neon.inc.c
28
static void arm_gicv3_common_class_init(ObjectClass *klass, void *data)
30
+++ b/target/arm/translate-neon.inc.c
29
{
31
@@ -XXX,XX +XXX,XX @@ DO_3SAME(VEOR, tcg_gen_gvec_xor)
30
DeviceClass *dc = DEVICE_CLASS(klass);
32
DO_3SAME_BITSEL(VBSL, rd_ofs, rn_ofs, rm_ofs)
31
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
33
DO_3SAME_BITSEL(VBIT, rm_ofs, rn_ofs, rd_ofs)
32
ARMLinuxBootIfClass *albifc = ARM_LINUX_BOOT_IF_CLASS(klass);
34
DO_3SAME_BITSEL(VBIF, rm_ofs, rd_ofs, rn_ofs)
33
35
+
34
- dc->reset = arm_gicv3_common_reset;
36
+#define DO_3SAME_NO_SZ_3(INSN, FUNC) \
35
+ rc->phases.hold = arm_gicv3_common_reset_hold;
37
+ static bool trans_##INSN##_3s(DisasContext *s, arg_3same *a) \
36
dc->realize = arm_gicv3_common_realize;
38
+ { \
37
device_class_set_props(dc, arm_gicv3_common_properties);
39
+ if (a->size == 3) { \
38
dc->vmsd = &vmstate_gicv3;
40
+ return false; \
41
+ } \
42
+ return do_3same(s, a, FUNC); \
43
+ }
44
+
45
+DO_3SAME_NO_SZ_3(VMAX_S, tcg_gen_gvec_smax)
46
+DO_3SAME_NO_SZ_3(VMAX_U, tcg_gen_gvec_umax)
47
+DO_3SAME_NO_SZ_3(VMIN_S, tcg_gen_gvec_smin)
48
+DO_3SAME_NO_SZ_3(VMIN_U, tcg_gen_gvec_umin)
49
diff --git a/target/arm/translate.c b/target/arm/translate.c
50
index XXXXXXX..XXXXXXX 100644
51
--- a/target/arm/translate.c
52
+++ b/target/arm/translate.c
53
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
54
rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
55
return 0;
56
57
- case NEON_3R_VMAX:
58
- if (u) {
59
- tcg_gen_gvec_umax(size, rd_ofs, rn_ofs, rm_ofs,
60
- vec_size, vec_size);
61
- } else {
62
- tcg_gen_gvec_smax(size, rd_ofs, rn_ofs, rm_ofs,
63
- vec_size, vec_size);
64
- }
65
- return 0;
66
- case NEON_3R_VMIN:
67
- if (u) {
68
- tcg_gen_gvec_umin(size, rd_ofs, rn_ofs, rm_ofs,
69
- vec_size, vec_size);
70
- } else {
71
- tcg_gen_gvec_smin(size, rd_ofs, rn_ofs, rm_ofs,
72
- vec_size, vec_size);
73
- }
74
- return 0;
75
-
76
case NEON_3R_VSHL:
77
/* Note the operation is vshl vd,vm,vn */
78
tcg_gen_gvec_3(rd_ofs, rm_ofs, rn_ofs, vec_size, vec_size,
79
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
80
81
case NEON_3R_VADD_VSUB:
82
case NEON_3R_LOGIC:
83
+ case NEON_3R_VMAX:
84
+ case NEON_3R_VMIN:
85
/* Already handled by decodetree */
86
return 1;
87
}
88
--
39
--
89
2.20.1
40
2.25.1
90
41
91
42
diff view generated by jsdifflib
1
Convert the VFM[AS]L (scalar) insns in the 2reg-scalar-ext group
1
Convert the TYPE_KVM_ARM_GICV3 device to 3-phase reset.
2
to decodetree. These are the last ones in the group so we can remove
3
all the legacy decode for the group.
4
5
Note that in disas_thumb2_insn() the parts of this encoding space
6
where the decodetree decoder returns false will correctly be directed
7
to illegal_op by the "(insn & (1 << 28))" check so they won't fall
8
into disas_coproc_insn() by mistake.
9
2
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20200430181003.21682-11-peter.maydell@linaro.org
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Message-id: 20221109161444.3397405-7-peter.maydell@linaro.org
13
---
7
---
14
target/arm/neon-shared.decode | 7 +++
8
hw/intc/arm_gicv3_kvm.c | 14 +++++++++-----
15
target/arm/translate-neon.inc.c | 32 ++++++++++
9
1 file changed, 9 insertions(+), 5 deletions(-)
16
target/arm/translate.c | 107 +-------------------------------
17
3 files changed, 40 insertions(+), 106 deletions(-)
18
10
19
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
11
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
20
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/neon-shared.decode
13
--- a/hw/intc/arm_gicv3_kvm.c
22
+++ b/target/arm/neon-shared.decode
14
+++ b/hw/intc/arm_gicv3_kvm.c
23
@@ -XXX,XX +XXX,XX @@ VCMLA_scalar 1111 1110 1 . rot:2 .... .... 1000 . q:1 . 0 .... \
15
@@ -XXX,XX +XXX,XX @@ DECLARE_OBJ_CHECKERS(GICv3State, KVMARMGICv3Class,
24
16
struct KVMARMGICv3Class {
25
VDOT_scalar 1111 1110 0 . 10 .... .... 1101 . q:1 index:1 u:1 rm:4 \
17
ARMGICv3CommonClass parent_class;
26
vm=%vm_dp vn=%vn_dp vd=%vd_dp
18
DeviceRealize parent_realize;
27
+
19
- void (*parent_reset)(DeviceState *dev);
28
+%vfml_scalar_q0_rm 0:3 5:1
20
+ ResettablePhases parent_phases;
29
+%vfml_scalar_q1_index 5:1 3:1
21
};
30
+VFML_scalar 1111 1110 0 . 0 s:1 .... .... 1000 . 0 . 1 index:1 ... \
22
31
+ rm=%vfml_scalar_q0_rm vn=%vn_sp vd=%vd_dp q=0
23
static void kvm_arm_gicv3_set_irq(void *opaque, int irq, int level)
32
+VFML_scalar 1111 1110 0 . 0 s:1 .... .... 1000 . 1 . 1 . rm:3 \
24
@@ -XXX,XX +XXX,XX @@ static void arm_gicv3_icc_reset(CPUARMState *env, const ARMCPRegInfo *ri)
33
+ index=%vfml_scalar_q1_index vn=%vn_dp vd=%vd_dp q=1
25
c->icc_ctlr_el1[GICV3_S] = c->icc_ctlr_el1[GICV3_NS];
34
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/translate-neon.inc.c
37
+++ b/target/arm/translate-neon.inc.c
38
@@ -XXX,XX +XXX,XX @@ static bool trans_VDOT_scalar(DisasContext *s, arg_VDOT_scalar *a)
39
tcg_temp_free_ptr(fpst);
40
return true;
41
}
26
}
42
+
27
43
+static bool trans_VFML_scalar(DisasContext *s, arg_VFML_scalar *a)
28
-static void kvm_arm_gicv3_reset(DeviceState *dev)
44
+{
29
+static void kvm_arm_gicv3_reset_hold(Object *obj)
45
+ int opr_sz;
30
{
46
+
31
- GICv3State *s = ARM_GICV3_COMMON(dev);
47
+ if (!dc_isar_feature(aa32_fhm, s)) {
32
+ GICv3State *s = ARM_GICV3_COMMON(obj);
48
+ return false;
33
KVMARMGICv3Class *kgc = KVM_ARM_GICV3_GET_CLASS(s);
34
35
DPRINTF("Reset\n");
36
37
- kgc->parent_reset(dev);
38
+ if (kgc->parent_phases.hold) {
39
+ kgc->parent_phases.hold(obj);
49
+ }
40
+ }
50
+
41
51
+ /* UNDEF accesses to D16-D31 if they don't exist. */
42
if (s->migration_blocker) {
52
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
43
DPRINTF("Cannot put kernel gic state, no kernel interface\n");
53
+ ((a->vd & 0x10) || (a->q && (a->vn & 0x10)))) {
44
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
54
+ return false;
45
static void kvm_arm_gicv3_class_init(ObjectClass *klass, void *data)
55
+ }
46
{
56
+
47
DeviceClass *dc = DEVICE_CLASS(klass);
57
+ if (a->vd & a->q) {
48
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
58
+ return false;
49
ARMGICv3CommonClass *agcc = ARM_GICV3_COMMON_CLASS(klass);
59
+ }
50
KVMARMGICv3Class *kgc = KVM_ARM_GICV3_CLASS(klass);
60
+
51
61
+ if (!vfp_access_check(s)) {
52
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_class_init(ObjectClass *klass, void *data)
62
+ return true;
53
agcc->post_load = kvm_arm_gicv3_put;
63
+ }
54
device_class_set_parent_realize(dc, kvm_arm_gicv3_realize,
64
+
55
&kgc->parent_realize);
65
+ opr_sz = (1 + a->q) * 8;
56
- device_class_set_parent_reset(dc, kvm_arm_gicv3_reset, &kgc->parent_reset);
66
+ tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
57
+ resettable_class_set_parent_phases(rc, NULL, kvm_arm_gicv3_reset_hold, NULL,
67
+ vfp_reg_offset(a->q, a->vn),
58
+ &kgc->parent_phases);
68
+ vfp_reg_offset(a->q, a->rm),
69
+ cpu_env, opr_sz, opr_sz,
70
+ (a->index << 2) | a->s, /* is_2 == 0 */
71
+ gen_helper_gvec_fmlal_idx_a32);
72
+ return true;
73
+}
74
diff --git a/target/arm/translate.c b/target/arm/translate.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/target/arm/translate.c
77
+++ b/target/arm/translate.c
78
@@ -XXX,XX +XXX,XX @@ static int disas_dsp_insn(DisasContext *s, uint32_t insn)
79
}
59
}
80
60
81
#define VFP_REG_SHR(x, n) (((n) > 0) ? (x) >> (n) : (x) << -(n))
61
static const TypeInfo kvm_arm_gicv3_info = {
82
-#define VFP_SREG(insn, bigbit, smallbit) \
83
- ((VFP_REG_SHR(insn, bigbit - 1) & 0x1e) | (((insn) >> (smallbit)) & 1))
84
#define VFP_DREG(reg, insn, bigbit, smallbit) do { \
85
if (dc_isar_feature(aa32_simd_r32, s)) { \
86
reg = (((insn) >> (bigbit)) & 0x0f) \
87
@@ -XXX,XX +XXX,XX @@ static int disas_dsp_insn(DisasContext *s, uint32_t insn)
88
reg = ((insn) >> (bigbit)) & 0x0f; \
89
}} while (0)
90
91
-#define VFP_SREG_D(insn) VFP_SREG(insn, 12, 22)
92
#define VFP_DREG_D(reg, insn) VFP_DREG(reg, insn, 12, 22)
93
-#define VFP_SREG_N(insn) VFP_SREG(insn, 16, 7)
94
#define VFP_DREG_N(reg, insn) VFP_DREG(reg, insn, 16, 7)
95
-#define VFP_SREG_M(insn) VFP_SREG(insn, 0, 5)
96
#define VFP_DREG_M(reg, insn) VFP_DREG(reg, insn, 0, 5)
97
98
static void gen_neon_dup_low16(TCGv_i32 var)
99
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
100
return 0;
101
}
102
103
-/* Advanced SIMD two registers and a scalar extension.
104
- * 31 24 23 22 20 16 12 11 10 9 8 3 0
105
- * +-----------------+----+---+----+----+----+---+----+---+----+---------+----+
106
- * | 1 1 1 1 1 1 1 0 | o1 | D | o2 | Vn | Vd | 1 | o3 | 0 | o4 | N Q M U | Vm |
107
- * +-----------------+----+---+----+----+----+---+----+---+----+---------+----+
108
- *
109
- */
110
-
111
-static int disas_neon_insn_2reg_scalar_ext(DisasContext *s, uint32_t insn)
112
-{
113
- gen_helper_gvec_3 *fn_gvec = NULL;
114
- gen_helper_gvec_3_ptr *fn_gvec_ptr = NULL;
115
- int rd, rn, rm, opr_sz, data;
116
- int off_rn, off_rm;
117
- bool is_long = false, q = extract32(insn, 6, 1);
118
- bool ptr_is_env = false;
119
-
120
- if ((insn & 0xffa00f10) == 0xfe000810) {
121
- /* VFM[AS]L -- 1111 1110 0.0S .... .... 1000 .Q.1 .... */
122
- int is_s = extract32(insn, 20, 1);
123
- int vm20 = extract32(insn, 0, 3);
124
- int vm3 = extract32(insn, 3, 1);
125
- int m = extract32(insn, 5, 1);
126
- int index;
127
-
128
- if (!dc_isar_feature(aa32_fhm, s)) {
129
- return 1;
130
- }
131
- if (q) {
132
- rm = vm20;
133
- index = m * 2 + vm3;
134
- } else {
135
- rm = vm20 * 2 + m;
136
- index = vm3;
137
- }
138
- is_long = true;
139
- data = (index << 2) | is_s; /* is_2 == 0 */
140
- fn_gvec_ptr = gen_helper_gvec_fmlal_idx_a32;
141
- ptr_is_env = true;
142
- } else {
143
- return 1;
144
- }
145
-
146
- VFP_DREG_D(rd, insn);
147
- if (rd & q) {
148
- return 1;
149
- }
150
- if (q || !is_long) {
151
- VFP_DREG_N(rn, insn);
152
- if (rn & q & !is_long) {
153
- return 1;
154
- }
155
- off_rn = vfp_reg_offset(1, rn);
156
- off_rm = vfp_reg_offset(1, rm);
157
- } else {
158
- rn = VFP_SREG_N(insn);
159
- off_rn = vfp_reg_offset(0, rn);
160
- off_rm = vfp_reg_offset(0, rm);
161
- }
162
- if (s->fp_excp_el) {
163
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
164
- syn_simd_access_trap(1, 0xe, false), s->fp_excp_el);
165
- return 0;
166
- }
167
- if (!s->vfp_enabled) {
168
- return 1;
169
- }
170
-
171
- opr_sz = (1 + q) * 8;
172
- if (fn_gvec_ptr) {
173
- TCGv_ptr ptr;
174
- if (ptr_is_env) {
175
- ptr = cpu_env;
176
- } else {
177
- ptr = get_fpstatus_ptr(1);
178
- }
179
- tcg_gen_gvec_3_ptr(vfp_reg_offset(1, rd), off_rn, off_rm, ptr,
180
- opr_sz, opr_sz, data, fn_gvec_ptr);
181
- if (!ptr_is_env) {
182
- tcg_temp_free_ptr(ptr);
183
- }
184
- } else {
185
- tcg_gen_gvec_3_ool(vfp_reg_offset(1, rd), off_rn, off_rm,
186
- opr_sz, opr_sz, data, fn_gvec);
187
- }
188
- return 0;
189
-}
190
-
191
static int disas_coproc_insn(DisasContext *s, uint32_t insn)
192
{
193
int cpnum, is64, crn, crm, opc1, opc2, isread, rt, rt2;
194
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
195
}
196
}
197
}
198
- } else if ((insn & 0x0f000a00) == 0x0e000800
199
- && arm_dc_feature(s, ARM_FEATURE_V8)) {
200
- if (disas_neon_insn_2reg_scalar_ext(s, insn)) {
201
- goto illegal_op;
202
- }
203
- return;
204
}
205
goto illegal_op;
206
}
207
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
208
}
209
break;
210
}
211
- if ((insn & 0xff000a00) == 0xfe000800
212
- && arm_dc_feature(s, ARM_FEATURE_V8)) {
213
- /* The Thumb2 and ARM encodings are identical. */
214
- if (disas_neon_insn_2reg_scalar_ext(s, insn)) {
215
- goto illegal_op;
216
- }
217
- } else if (((insn >> 24) & 3) == 3) {
218
+ if (((insn >> 24) & 3) == 3) {
219
/* Translate into the equivalent ARM encoding. */
220
insn = (insn & 0xe2ffffff) | ((insn & (1 << 28)) >> 4) | (1 << 28);
221
if (disas_neon_data_insn(s, insn)) {
222
--
62
--
223
2.20.1
63
2.25.1
224
64
225
65
diff view generated by jsdifflib
1
Convert the VFM[AS]L (vector) insns to decodetree. This is the last
1
Convert the TYPE_ARM_GICV3_ITS_COMMON parent class to 3-phase reset.
2
insn in the legacy decoder for the 3same_ext group, so we can
3
delete the legacy decoder function for the group entirely.
4
5
Note that in disas_thumb2_insn() the parts of this encoding space
6
where the decodetree decoder returns false will correctly be directed
7
to illegal_op by the "(insn & (1 << 28))" check so they won't fall
8
into disas_coproc_insn() by mistake.
9
2
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20200430181003.21682-8-peter.maydell@linaro.org
6
Message-id: 20221109161444.3397405-8-peter.maydell@linaro.org
13
---
7
---
14
target/arm/neon-shared.decode | 6 +++
8
hw/intc/arm_gicv3_its_common.c | 7 ++++---
15
target/arm/translate-neon.inc.c | 31 +++++++++++
9
1 file changed, 4 insertions(+), 3 deletions(-)
16
target/arm/translate.c | 92 +--------------------------------
17
3 files changed, 38 insertions(+), 91 deletions(-)
18
10
19
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
11
diff --git a/hw/intc/arm_gicv3_its_common.c b/hw/intc/arm_gicv3_its_common.c
20
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/neon-shared.decode
13
--- a/hw/intc/arm_gicv3_its_common.c
22
+++ b/target/arm/neon-shared.decode
14
+++ b/hw/intc/arm_gicv3_its_common.c
23
@@ -XXX,XX +XXX,XX @@ VCADD 1111 110 rot:1 1 . 0 size:1 .... .... 1000 . q:1 . 0 .... \
15
@@ -XXX,XX +XXX,XX @@ void gicv3_its_init_mmio(GICv3ITSState *s, const MemoryRegionOps *ops,
24
# VUDOT and VSDOT
16
msi_nonbroken = true;
25
VDOT 1111 110 00 . 10 .... .... 1101 . q:1 . u:1 .... \
26
vm=%vm_dp vn=%vn_dp vd=%vd_dp
27
+
28
+# VFM[AS]L
29
+VFML 1111 110 0 s:1 . 10 .... .... 1000 . 0 . 1 .... \
30
+ vm=%vm_sp vn=%vn_sp vd=%vd_dp q=0
31
+VFML 1111 110 0 s:1 . 10 .... .... 1000 . 1 . 1 .... \
32
+ vm=%vm_dp vn=%vn_dp vd=%vd_dp q=1
33
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/translate-neon.inc.c
36
+++ b/target/arm/translate-neon.inc.c
37
@@ -XXX,XX +XXX,XX @@ static bool trans_VDOT(DisasContext *s, arg_VDOT *a)
38
opr_sz, opr_sz, 0, fn_gvec);
39
return true;
40
}
17
}
41
+
18
42
+static bool trans_VFML(DisasContext *s, arg_VFML *a)
19
-static void gicv3_its_common_reset(DeviceState *dev)
43
+{
20
+static void gicv3_its_common_reset_hold(Object *obj)
44
+ int opr_sz;
21
{
45
+
22
- GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev);
46
+ if (!dc_isar_feature(aa32_fhm, s)) {
23
+ GICv3ITSState *s = ARM_GICV3_ITS_COMMON(obj);
47
+ return false;
24
48
+ }
25
s->ctlr = 0;
49
+
26
s->cbaser = 0;
50
+ /* UNDEF accesses to D16-D31 if they don't exist. */
27
@@ -XXX,XX +XXX,XX @@ static void gicv3_its_common_reset(DeviceState *dev)
51
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
28
static void gicv3_its_common_class_init(ObjectClass *klass, void *data)
52
+ (a->vd & 0x10)) {
29
{
53
+ return false;
30
DeviceClass *dc = DEVICE_CLASS(klass);
54
+ }
31
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
55
+
32
56
+ if (a->vd & a->q) {
33
- dc->reset = gicv3_its_common_reset;
57
+ return false;
34
+ rc->phases.hold = gicv3_its_common_reset_hold;
58
+ }
35
dc->vmsd = &vmstate_its;
59
+
60
+ if (!vfp_access_check(s)) {
61
+ return true;
62
+ }
63
+
64
+ opr_sz = (1 + a->q) * 8;
65
+ tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
66
+ vfp_reg_offset(a->q, a->vn),
67
+ vfp_reg_offset(a->q, a->vm),
68
+ cpu_env, opr_sz, opr_sz, a->s, /* is_2 == 0 */
69
+ gen_helper_gvec_fmlal_a32);
70
+ return true;
71
+}
72
diff --git a/target/arm/translate.c b/target/arm/translate.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/target/arm/translate.c
75
+++ b/target/arm/translate.c
76
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
77
return 0;
78
}
36
}
79
37
80
-/* Advanced SIMD three registers of the same length extension.
81
- * 31 25 23 22 20 16 12 11 10 9 8 3 0
82
- * +---------------+-----+---+-----+----+----+---+----+---+----+---------+----+
83
- * | 1 1 1 1 1 1 0 | op1 | D | op2 | Vn | Vd | 1 | o3 | 0 | o4 | N Q M U | Vm |
84
- * +---------------+-----+---+-----+----+----+---+----+---+----+---------+----+
85
- */
86
-static int disas_neon_insn_3same_ext(DisasContext *s, uint32_t insn)
87
-{
88
- gen_helper_gvec_3 *fn_gvec = NULL;
89
- gen_helper_gvec_3_ptr *fn_gvec_ptr = NULL;
90
- int rd, rn, rm, opr_sz;
91
- int data = 0;
92
- int off_rn, off_rm;
93
- bool is_long = false, q = extract32(insn, 6, 1);
94
- bool ptr_is_env = false;
95
-
96
- if ((insn & 0xff300f10) == 0xfc200810) {
97
- /* VFM[AS]L -- 1111 1100 S.10 .... .... 1000 .Q.1 .... */
98
- int is_s = extract32(insn, 23, 1);
99
- if (!dc_isar_feature(aa32_fhm, s)) {
100
- return 1;
101
- }
102
- is_long = true;
103
- data = is_s; /* is_2 == 0 */
104
- fn_gvec_ptr = gen_helper_gvec_fmlal_a32;
105
- ptr_is_env = true;
106
- } else {
107
- return 1;
108
- }
109
-
110
- VFP_DREG_D(rd, insn);
111
- if (rd & q) {
112
- return 1;
113
- }
114
- if (q || !is_long) {
115
- VFP_DREG_N(rn, insn);
116
- VFP_DREG_M(rm, insn);
117
- if ((rn | rm) & q & !is_long) {
118
- return 1;
119
- }
120
- off_rn = vfp_reg_offset(1, rn);
121
- off_rm = vfp_reg_offset(1, rm);
122
- } else {
123
- rn = VFP_SREG_N(insn);
124
- rm = VFP_SREG_M(insn);
125
- off_rn = vfp_reg_offset(0, rn);
126
- off_rm = vfp_reg_offset(0, rm);
127
- }
128
-
129
- if (s->fp_excp_el) {
130
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
131
- syn_simd_access_trap(1, 0xe, false), s->fp_excp_el);
132
- return 0;
133
- }
134
- if (!s->vfp_enabled) {
135
- return 1;
136
- }
137
-
138
- opr_sz = (1 + q) * 8;
139
- if (fn_gvec_ptr) {
140
- TCGv_ptr ptr;
141
- if (ptr_is_env) {
142
- ptr = cpu_env;
143
- } else {
144
- ptr = get_fpstatus_ptr(1);
145
- }
146
- tcg_gen_gvec_3_ptr(vfp_reg_offset(1, rd), off_rn, off_rm, ptr,
147
- opr_sz, opr_sz, data, fn_gvec_ptr);
148
- if (!ptr_is_env) {
149
- tcg_temp_free_ptr(ptr);
150
- }
151
- } else {
152
- tcg_gen_gvec_3_ool(vfp_reg_offset(1, rd), off_rn, off_rm,
153
- opr_sz, opr_sz, data, fn_gvec);
154
- }
155
- return 0;
156
-}
157
-
158
/* Advanced SIMD two registers and a scalar extension.
159
* 31 24 23 22 20 16 12 11 10 9 8 3 0
160
* +-----------------+----+---+----+----+----+---+----+---+----+---------+----+
161
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
162
}
163
}
164
}
165
- } else if ((insn & 0x0e000a00) == 0x0c000800
166
- && arm_dc_feature(s, ARM_FEATURE_V8)) {
167
- if (disas_neon_insn_3same_ext(s, insn)) {
168
- goto illegal_op;
169
- }
170
- return;
171
} else if ((insn & 0x0f000a00) == 0x0e000800
172
&& arm_dc_feature(s, ARM_FEATURE_V8)) {
173
if (disas_neon_insn_2reg_scalar_ext(s, insn)) {
174
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
175
}
176
break;
177
}
178
- if ((insn & 0xfe000a00) == 0xfc000800
179
+ if ((insn & 0xff000a00) == 0xfe000800
180
&& arm_dc_feature(s, ARM_FEATURE_V8)) {
181
/* The Thumb2 and ARM encodings are identical. */
182
- if (disas_neon_insn_3same_ext(s, insn)) {
183
- goto illegal_op;
184
- }
185
- } else if ((insn & 0xff000a00) == 0xfe000800
186
- && arm_dc_feature(s, ARM_FEATURE_V8)) {
187
- /* The Thumb2 and ARM encodings are identical. */
188
if (disas_neon_insn_2reg_scalar_ext(s, insn)) {
189
goto illegal_op;
190
}
191
--
38
--
192
2.20.1
39
2.25.1
193
40
194
41
diff view generated by jsdifflib
1
Convert VCMLA (scalar) in the 2reg-scalar-ext group to decodetree.
1
Convert the TYPE_ARM_GICV3_ITS device to 3-phase reset.
2
2
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20200430181003.21682-9-peter.maydell@linaro.org
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Message-id: 20221109161444.3397405-9-peter.maydell@linaro.org
6
---
7
---
7
target/arm/neon-shared.decode | 5 +++++
8
hw/intc/arm_gicv3_its.c | 14 +++++++++-----
8
target/arm/translate-neon.inc.c | 40 +++++++++++++++++++++++++++++++++
9
1 file changed, 9 insertions(+), 5 deletions(-)
9
target/arm/translate.c | 26 +--------------------
10
3 files changed, 46 insertions(+), 25 deletions(-)
11
10
12
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
11
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-shared.decode
13
--- a/hw/intc/arm_gicv3_its.c
15
+++ b/target/arm/neon-shared.decode
14
+++ b/hw/intc/arm_gicv3_its.c
16
@@ -XXX,XX +XXX,XX @@ VFML 1111 110 0 s:1 . 10 .... .... 1000 . 0 . 1 .... \
15
@@ -XXX,XX +XXX,XX @@ DECLARE_OBJ_CHECKERS(GICv3ITSState, GICv3ITSClass,
17
vm=%vm_sp vn=%vn_sp vd=%vd_dp q=0
16
18
VFML 1111 110 0 s:1 . 10 .... .... 1000 . 1 . 1 .... \
17
struct GICv3ITSClass {
19
vm=%vm_dp vn=%vn_dp vd=%vd_dp q=1
18
GICv3ITSCommonClass parent_class;
20
+
19
- void (*parent_reset)(DeviceState *dev);
21
+VCMLA_scalar 1111 1110 0 . rot:2 .... .... 1000 . q:1 index:1 0 vm:4 \
20
+ ResettablePhases parent_phases;
22
+ vn=%vn_dp vd=%vd_dp size=0
21
};
23
+VCMLA_scalar 1111 1110 1 . rot:2 .... .... 1000 . q:1 . 0 .... \
22
24
+ vm=%vm_dp vn=%vn_dp vd=%vd_dp size=1 index=0
23
/*
25
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
24
@@ -XXX,XX +XXX,XX @@ static void gicv3_arm_its_realize(DeviceState *dev, Error **errp)
26
index XXXXXXX..XXXXXXX 100644
25
}
27
--- a/target/arm/translate-neon.inc.c
28
+++ b/target/arm/translate-neon.inc.c
29
@@ -XXX,XX +XXX,XX @@ static bool trans_VFML(DisasContext *s, arg_VFML *a)
30
gen_helper_gvec_fmlal_a32);
31
return true;
32
}
26
}
33
+
27
34
+static bool trans_VCMLA_scalar(DisasContext *s, arg_VCMLA_scalar *a)
28
-static void gicv3_its_reset(DeviceState *dev)
35
+{
29
+static void gicv3_its_reset_hold(Object *obj)
36
+ gen_helper_gvec_3_ptr *fn_gvec_ptr;
30
{
37
+ int opr_sz;
31
- GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev);
38
+ TCGv_ptr fpst;
32
+ GICv3ITSState *s = ARM_GICV3_ITS_COMMON(obj);
39
+
33
GICv3ITSClass *c = ARM_GICV3_ITS_GET_CLASS(s);
40
+ if (!dc_isar_feature(aa32_vcma, s)) {
34
41
+ return false;
35
- c->parent_reset(dev);
36
+ if (c->parent_phases.hold) {
37
+ c->parent_phases.hold(obj);
42
+ }
38
+ }
43
+ if (a->size == 0 && !dc_isar_feature(aa32_fp16_arith, s)) {
39
44
+ return false;
40
/* Quiescent bit reset to 1 */
45
+ }
41
s->ctlr = FIELD_DP32(s->ctlr, GITS_CTLR, QUIESCENT, 1);
46
+
42
@@ -XXX,XX +XXX,XX @@ static Property gicv3_its_props[] = {
47
+ /* UNDEF accesses to D16-D31 if they don't exist. */
43
static void gicv3_its_class_init(ObjectClass *klass, void *data)
48
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
44
{
49
+ ((a->vd | a->vn | a->vm) & 0x10)) {
45
DeviceClass *dc = DEVICE_CLASS(klass);
50
+ return false;
46
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
51
+ }
47
GICv3ITSClass *ic = ARM_GICV3_ITS_CLASS(klass);
52
+
48
GICv3ITSCommonClass *icc = ARM_GICV3_ITS_COMMON_CLASS(klass);
53
+ if ((a->vd | a->vn) & a->q) {
49
54
+ return false;
50
dc->realize = gicv3_arm_its_realize;
55
+ }
51
device_class_set_props(dc, gicv3_its_props);
56
+
52
- device_class_set_parent_reset(dc, gicv3_its_reset, &ic->parent_reset);
57
+ if (!vfp_access_check(s)) {
53
+ resettable_class_set_parent_phases(rc, NULL, gicv3_its_reset_hold, NULL,
58
+ return true;
54
+ &ic->parent_phases);
59
+ }
55
icc->post_load = gicv3_its_post_load;
60
+
56
}
61
+ fn_gvec_ptr = (a->size ? gen_helper_gvec_fcmlas_idx
62
+ : gen_helper_gvec_fcmlah_idx);
63
+ opr_sz = (1 + a->q) * 8;
64
+ fpst = get_fpstatus_ptr(1);
65
+ tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
66
+ vfp_reg_offset(1, a->vn),
67
+ vfp_reg_offset(1, a->vm),
68
+ fpst, opr_sz, opr_sz,
69
+ (a->index << 2) | a->rot, fn_gvec_ptr);
70
+ tcg_temp_free_ptr(fpst);
71
+ return true;
72
+}
73
diff --git a/target/arm/translate.c b/target/arm/translate.c
74
index XXXXXXX..XXXXXXX 100644
75
--- a/target/arm/translate.c
76
+++ b/target/arm/translate.c
77
@@ -XXX,XX +XXX,XX @@ static int disas_neon_insn_2reg_scalar_ext(DisasContext *s, uint32_t insn)
78
bool is_long = false, q = extract32(insn, 6, 1);
79
bool ptr_is_env = false;
80
81
- if ((insn & 0xff000f10) == 0xfe000800) {
82
- /* VCMLA (indexed) -- 1111 1110 S.RR .... .... 1000 ...0 .... */
83
- int rot = extract32(insn, 20, 2);
84
- int size = extract32(insn, 23, 1);
85
- int index;
86
-
87
- if (!dc_isar_feature(aa32_vcma, s)) {
88
- return 1;
89
- }
90
- if (size == 0) {
91
- if (!dc_isar_feature(aa32_fp16_arith, s)) {
92
- return 1;
93
- }
94
- /* For fp16, rm is just Vm, and index is M. */
95
- rm = extract32(insn, 0, 4);
96
- index = extract32(insn, 5, 1);
97
- } else {
98
- /* For fp32, rm is the usual M:Vm, and index is 0. */
99
- VFP_DREG_M(rm, insn);
100
- index = 0;
101
- }
102
- data = (index << 2) | rot;
103
- fn_gvec_ptr = (size ? gen_helper_gvec_fcmlas_idx
104
- : gen_helper_gvec_fcmlah_idx);
105
- } else if ((insn & 0xffb00f00) == 0xfe200d00) {
106
+ if ((insn & 0xffb00f00) == 0xfe200d00) {
107
/* V[US]DOT -- 1111 1110 0.10 .... .... 1101 .Q.U .... */
108
int u = extract32(insn, 4, 1);
109
57
110
--
58
--
111
2.20.1
59
2.25.1
112
60
113
61
diff view generated by jsdifflib
1
Convert the Neon logic ops in the 3-reg-same grouping to decodetree.
1
Convert the TYPE_KVM_ARM_ITS device to 3-phase reset.
2
Note that for the logic ops the 'size' field forms part of their
3
decode and the actual operations are always bitwise.
4
2
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20200430181003.21682-16-peter.maydell@linaro.org
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Message-id: 20221109161444.3397405-10-peter.maydell@linaro.org
8
---
7
---
9
target/arm/neon-dp.decode | 12 +++++++++++
8
hw/intc/arm_gicv3_its_kvm.c | 14 +++++++++-----
10
target/arm/translate-neon.inc.c | 19 +++++++++++++++++
9
1 file changed, 9 insertions(+), 5 deletions(-)
11
target/arm/translate.c | 38 +--------------------------------
12
3 files changed, 32 insertions(+), 37 deletions(-)
13
10
14
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
11
diff --git a/hw/intc/arm_gicv3_its_kvm.c b/hw/intc/arm_gicv3_its_kvm.c
15
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/neon-dp.decode
13
--- a/hw/intc/arm_gicv3_its_kvm.c
17
+++ b/target/arm/neon-dp.decode
14
+++ b/hw/intc/arm_gicv3_its_kvm.c
18
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@ DECLARE_OBJ_CHECKERS(GICv3ITSState, KVMARMITSClass,
19
@3same .... ... . . . size:2 .... .... .... . q:1 . . .... \
16
20
&3same vm=%vm_dp vn=%vn_dp vd=%vd_dp
17
struct KVMARMITSClass {
21
18
GICv3ITSCommonClass parent_class;
22
+@3same_logic .... ... . . . .. .... .... .... . q:1 .. .... \
19
- void (*parent_reset)(DeviceState *dev);
23
+ &3same vm=%vm_dp vn=%vn_dp vd=%vd_dp size=0
20
+ ResettablePhases parent_phases;
24
+
21
};
25
+VAND_3s 1111 001 0 0 . 00 .... .... 0001 ... 1 .... @3same_logic
22
26
+VBIC_3s 1111 001 0 0 . 01 .... .... 0001 ... 1 .... @3same_logic
23
27
+VORR_3s 1111 001 0 0 . 10 .... .... 0001 ... 1 .... @3same_logic
24
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_its_post_load(GICv3ITSState *s)
28
+VORN_3s 1111 001 0 0 . 11 .... .... 0001 ... 1 .... @3same_logic
25
GITS_CTLR, &s->ctlr, true, &error_abort);
29
+VEOR_3s 1111 001 1 0 . 00 .... .... 0001 ... 1 .... @3same_logic
26
}
30
+VBSL_3s 1111 001 1 0 . 01 .... .... 0001 ... 1 .... @3same_logic
27
31
+VBIT_3s 1111 001 1 0 . 10 .... .... 0001 ... 1 .... @3same_logic
28
-static void kvm_arm_its_reset(DeviceState *dev)
32
+VBIF_3s 1111 001 1 0 . 11 .... .... 0001 ... 1 .... @3same_logic
29
+static void kvm_arm_its_reset_hold(Object *obj)
33
+
30
{
34
VADD_3s 1111 001 0 0 . .. .... .... 1000 . . . 0 .... @3same
31
- GICv3ITSState *s = ARM_GICV3_ITS_COMMON(dev);
35
VSUB_3s 1111 001 1 0 . .. .... .... 1000 . . . 0 .... @3same
32
+ GICv3ITSState *s = ARM_GICV3_ITS_COMMON(obj);
36
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
33
KVMARMITSClass *c = KVM_ARM_ITS_GET_CLASS(s);
37
index XXXXXXX..XXXXXXX 100644
34
int i;
38
--- a/target/arm/translate-neon.inc.c
35
39
+++ b/target/arm/translate-neon.inc.c
36
- c->parent_reset(dev);
40
@@ -XXX,XX +XXX,XX @@ static bool do_3same(DisasContext *s, arg_3same *a, GVecGen3Fn fn)
37
+ if (c->parent_phases.hold) {
41
38
+ c->parent_phases.hold(obj);
42
DO_3SAME(VADD, tcg_gen_gvec_add)
39
+ }
43
DO_3SAME(VSUB, tcg_gen_gvec_sub)
40
44
+DO_3SAME(VAND, tcg_gen_gvec_and)
41
if (kvm_device_check_attr(s->dev_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
45
+DO_3SAME(VBIC, tcg_gen_gvec_andc)
42
KVM_DEV_ARM_ITS_CTRL_RESET)) {
46
+DO_3SAME(VORR, tcg_gen_gvec_or)
43
@@ -XXX,XX +XXX,XX @@ static Property kvm_arm_its_props[] = {
47
+DO_3SAME(VORN, tcg_gen_gvec_orc)
44
static void kvm_arm_its_class_init(ObjectClass *klass, void *data)
48
+DO_3SAME(VEOR, tcg_gen_gvec_xor)
45
{
49
+
46
DeviceClass *dc = DEVICE_CLASS(klass);
50
+/* These insns are all gvec_bitsel but with the inputs in various orders. */
47
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
51
+#define DO_3SAME_BITSEL(INSN, O1, O2, O3) \
48
GICv3ITSCommonClass *icc = ARM_GICV3_ITS_COMMON_CLASS(klass);
52
+ static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
49
KVMARMITSClass *ic = KVM_ARM_ITS_CLASS(klass);
53
+ uint32_t rn_ofs, uint32_t rm_ofs, \
50
54
+ uint32_t oprsz, uint32_t maxsz) \
51
dc->realize = kvm_arm_its_realize;
55
+ { \
52
device_class_set_props(dc, kvm_arm_its_props);
56
+ tcg_gen_gvec_bitsel(vece, rd_ofs, O1, O2, O3, oprsz, maxsz); \
53
- device_class_set_parent_reset(dc, kvm_arm_its_reset, &ic->parent_reset);
57
+ } \
54
+ resettable_class_set_parent_phases(rc, NULL, kvm_arm_its_reset_hold, NULL,
58
+ DO_3SAME(INSN, gen_##INSN##_3s)
55
+ &ic->parent_phases);
59
+
56
icc->send_msi = kvm_its_send_msi;
60
+DO_3SAME_BITSEL(VBSL, rd_ofs, rn_ofs, rm_ofs)
57
icc->pre_save = kvm_arm_its_pre_save;
61
+DO_3SAME_BITSEL(VBIT, rm_ofs, rn_ofs, rd_ofs)
58
icc->post_load = kvm_arm_its_post_load;
62
+DO_3SAME_BITSEL(VBIF, rm_ofs, rd_ofs, rn_ofs)
63
diff --git a/target/arm/translate.c b/target/arm/translate.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/target/arm/translate.c
66
+++ b/target/arm/translate.c
67
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
68
}
69
return 1;
70
71
- case NEON_3R_LOGIC: /* Logic ops. */
72
- switch ((u << 2) | size) {
73
- case 0: /* VAND */
74
- tcg_gen_gvec_and(0, rd_ofs, rn_ofs, rm_ofs,
75
- vec_size, vec_size);
76
- break;
77
- case 1: /* VBIC */
78
- tcg_gen_gvec_andc(0, rd_ofs, rn_ofs, rm_ofs,
79
- vec_size, vec_size);
80
- break;
81
- case 2: /* VORR */
82
- tcg_gen_gvec_or(0, rd_ofs, rn_ofs, rm_ofs,
83
- vec_size, vec_size);
84
- break;
85
- case 3: /* VORN */
86
- tcg_gen_gvec_orc(0, rd_ofs, rn_ofs, rm_ofs,
87
- vec_size, vec_size);
88
- break;
89
- case 4: /* VEOR */
90
- tcg_gen_gvec_xor(0, rd_ofs, rn_ofs, rm_ofs,
91
- vec_size, vec_size);
92
- break;
93
- case 5: /* VBSL */
94
- tcg_gen_gvec_bitsel(MO_8, rd_ofs, rd_ofs, rn_ofs, rm_ofs,
95
- vec_size, vec_size);
96
- break;
97
- case 6: /* VBIT */
98
- tcg_gen_gvec_bitsel(MO_8, rd_ofs, rm_ofs, rn_ofs, rd_ofs,
99
- vec_size, vec_size);
100
- break;
101
- case 7: /* VBIF */
102
- tcg_gen_gvec_bitsel(MO_8, rd_ofs, rm_ofs, rd_ofs, rn_ofs,
103
- vec_size, vec_size);
104
- break;
105
- }
106
- return 0;
107
-
108
case NEON_3R_VQADD:
109
tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
110
rn_ofs, rm_ofs, vec_size, vec_size,
111
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
112
return 0;
113
114
case NEON_3R_VADD_VSUB:
115
+ case NEON_3R_LOGIC:
116
/* Already handled by decodetree */
117
return 1;
118
}
119
--
59
--
120
2.20.1
60
2.25.1
121
61
122
62
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Schspa Shi <schspa@gmail.com>
2
2
3
By using the TYPE_* definitions for devices, we can:
3
We use 32bit value for linux,initrd-[start/end], when we have
4
- quickly find where devices are used with 'git-grep'
4
loader_start > 4GB, there will be a wrong initrd_start passed
5
- easily rename a device (one-line change).
5
to the kernel, and the kernel will report the following warning.
6
6
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
[ 0.000000] ------------[ cut here ]------------
8
Message-id: 20200428154650.21991-1-f4bug@amsat.org
8
[ 0.000000] initrd not fully accessible via the linear mapping -- please check your bootloader ...
9
[ 0.000000] WARNING: CPU: 0 PID: 0 at arch/arm64/mm/init.c:355 arm64_memblock_init+0x158/0x244
10
[ 0.000000] Modules linked in:
11
[ 0.000000] CPU: 0 PID: 0 Comm: swapper Tainted: G W 6.1.0-rc3-13250-g30a0b95b1335-dirty #28
12
[ 0.000000] Hardware name: Horizon Sigi Virtual development board (DT)
13
[ 0.000000] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
14
[ 0.000000] pc : arm64_memblock_init+0x158/0x244
15
[ 0.000000] lr : arm64_memblock_init+0x158/0x244
16
[ 0.000000] sp : ffff800009273df0
17
[ 0.000000] x29: ffff800009273df0 x28: 0000001000cc0010 x27: 0000800000000000
18
[ 0.000000] x26: 000000000050a3e2 x25: ffff800008b46000 x24: ffff800008b46000
19
[ 0.000000] x23: ffff800008a53000 x22: ffff800009420000 x21: ffff800008a53000
20
[ 0.000000] x20: 0000000004000000 x19: 0000000004000000 x18: 00000000ffff1020
21
[ 0.000000] x17: 6568632065736165 x16: 6c70202d2d20676e x15: 697070616d207261
22
[ 0.000000] x14: 656e696c20656874 x13: 0a2e2e2e20726564 x12: 0000000000000000
23
[ 0.000000] x11: 0000000000000000 x10: 00000000ffffffff x9 : 0000000000000000
24
[ 0.000000] x8 : 0000000000000000 x7 : 796c6c756620746f x6 : 6e20647274696e69
25
[ 0.000000] x5 : ffff8000093c7c47 x4 : ffff800008a2102f x3 : ffff800009273a88
26
[ 0.000000] x2 : 80000000fffff038 x1 : 00000000000000c0 x0 : 0000000000000056
27
[ 0.000000] Call trace:
28
[ 0.000000] arm64_memblock_init+0x158/0x244
29
[ 0.000000] setup_arch+0x164/0x1cc
30
[ 0.000000] start_kernel+0x94/0x4ac
31
[ 0.000000] __primary_switched+0xb4/0xbc
32
[ 0.000000] ---[ end trace 0000000000000000 ]---
33
[ 0.000000] Zone ranges:
34
[ 0.000000] DMA [mem 0x0000001000000000-0x0000001007ffffff]
35
36
This doesn't affect any machine types we currently support, because
37
for all of our machine types the RAM starts well below the 4GB
38
mark, but it does demonstrate that we're not currently writing
39
the device-tree properties quite as intended.
40
41
To fix it, we can change it to write these values to the dtb using a
42
type width matching #address-cells. This is the intended size for
43
these dtb properties, and is how u-boot, for instance, writes them,
44
although in practice the Linux kernel will cope with them being any
45
width as long as they're big enough to fit the value.
46
47
Signed-off-by: Schspa Shi <schspa@gmail.com>
48
Message-id: 20221129160724.75667-1-schspa@gmail.com
49
[PMM: tweaked commit message]
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
50
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
51
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
52
---
12
hw/arm/mps2-tz.c | 2 +-
53
hw/arm/boot.c | 10 ++++++----
13
1 file changed, 1 insertion(+), 1 deletion(-)
54
1 file changed, 6 insertions(+), 4 deletions(-)
14
55
15
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
56
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
16
index XXXXXXX..XXXXXXX 100644
57
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/mps2-tz.c
58
--- a/hw/arm/boot.c
18
+++ b/hw/arm/mps2-tz.c
59
+++ b/hw/arm/boot.c
19
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
60
@@ -XXX,XX +XXX,XX @@ int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
20
exit(EXIT_FAILURE);
21
}
61
}
22
62
23
- sysbus_init_child_obj(OBJECT(machine), "iotkit", &mms->iotkit,
63
if (binfo->initrd_size) {
24
+ sysbus_init_child_obj(OBJECT(machine), TYPE_IOTKIT, &mms->iotkit,
64
- rc = qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-start",
25
sizeof(mms->iotkit), mmc->armsse_type);
65
- binfo->initrd_start);
26
iotkitdev = DEVICE(&mms->iotkit);
66
+ rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", "linux,initrd-start",
27
object_property_set_link(OBJECT(&mms->iotkit), OBJECT(system_memory),
67
+ acells, binfo->initrd_start);
68
if (rc < 0) {
69
fprintf(stderr, "couldn't set /chosen/linux,initrd-start\n");
70
goto fail;
71
}
72
73
- rc = qemu_fdt_setprop_cell(fdt, "/chosen", "linux,initrd-end",
74
- binfo->initrd_start + binfo->initrd_size);
75
+ rc = qemu_fdt_setprop_sized_cells(fdt, "/chosen", "linux,initrd-end",
76
+ acells,
77
+ binfo->initrd_start +
78
+ binfo->initrd_size);
79
if (rc < 0) {
80
fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n");
81
goto fail;
28
--
82
--
29
2.20.1
83
2.25.1
30
31
diff view generated by jsdifflib
1
The access_type argument to get_phys_addr_lpae() is an MMUAccessType;
1
From: Zhuojia Shen <chaosdefinition@hotmail.com>
2
use the enum constant MMU_DATA_LOAD rather than a literal 0 when we
3
call it in S1_ptw_translate().
4
2
3
In CPUID registers exposed to userspace, some registers were missing
4
and some fields were not exposed. This patch aligns exposed ID
5
registers and their fields with what the upstream kernel currently
6
exposes.
7
8
Specifically, the following new ID registers/fields are exposed to
9
userspace:
10
11
ID_AA64PFR1_EL1.BT: bits 3-0
12
ID_AA64PFR1_EL1.MTE: bits 11-8
13
ID_AA64PFR1_EL1.SME: bits 27-24
14
15
ID_AA64ZFR0_EL1.SVEver: bits 3-0
16
ID_AA64ZFR0_EL1.AES: bits 7-4
17
ID_AA64ZFR0_EL1.BitPerm: bits 19-16
18
ID_AA64ZFR0_EL1.BF16: bits 23-20
19
ID_AA64ZFR0_EL1.SHA3: bits 35-32
20
ID_AA64ZFR0_EL1.SM4: bits 43-40
21
ID_AA64ZFR0_EL1.I8MM: bits 47-44
22
ID_AA64ZFR0_EL1.F32MM: bits 55-52
23
ID_AA64ZFR0_EL1.F64MM: bits 59-56
24
25
ID_AA64SMFR0_EL1.F32F32: bit 32
26
ID_AA64SMFR0_EL1.B16F32: bit 34
27
ID_AA64SMFR0_EL1.F16F32: bit 35
28
ID_AA64SMFR0_EL1.I8I32: bits 39-36
29
ID_AA64SMFR0_EL1.F64F64: bit 48
30
ID_AA64SMFR0_EL1.I16I64: bits 55-52
31
ID_AA64SMFR0_EL1.FA64: bit 63
32
33
ID_AA64MMFR0_EL1.ECV: bits 63-60
34
35
ID_AA64MMFR1_EL1.AFP: bits 47-44
36
37
ID_AA64MMFR2_EL1.AT: bits 35-32
38
39
ID_AA64ISAR0_EL1.RNDR: bits 63-60
40
41
ID_AA64ISAR1_EL1.FRINTTS: bits 35-32
42
ID_AA64ISAR1_EL1.BF16: bits 47-44
43
ID_AA64ISAR1_EL1.DGH: bits 51-48
44
ID_AA64ISAR1_EL1.I8MM: bits 55-52
45
46
ID_AA64ISAR2_EL1.WFxT: bits 3-0
47
ID_AA64ISAR2_EL1.RPRES: bits 7-4
48
ID_AA64ISAR2_EL1.GPA3: bits 11-8
49
ID_AA64ISAR2_EL1.APA3: bits 15-12
50
51
The code is also refactored to use symbolic names for ID register fields
52
for better readability and maintainability.
53
54
Signed-off-by: Zhuojia Shen <chaosdefinition@hotmail.com>
55
Message-id: DS7PR12MB6309BC9133877BCC6FC419FEAC0D9@DS7PR12MB6309.namprd12.prod.outlook.com
56
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
57
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200330210400.11724-3-peter.maydell@linaro.org
9
---
58
---
10
target/arm/helper.c | 5 +++--
59
target/arm/helper.c | 96 +++++++++++++++++++++++++++++++++++++--------
11
1 file changed, 3 insertions(+), 2 deletions(-)
60
1 file changed, 79 insertions(+), 17 deletions(-)
12
61
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
62
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
index XXXXXXX..XXXXXXX 100644
63
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
64
--- a/target/arm/helper.c
16
+++ b/target/arm/helper.c
65
+++ b/target/arm/helper.c
17
@@ -XXX,XX +XXX,XX @@ static hwaddr S1_ptw_translate(CPUARMState *env, ARMMMUIdx mmu_idx,
66
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
18
pcacheattrs = &cacheattrs;
67
#ifdef CONFIG_USER_ONLY
19
}
68
static const ARMCPRegUserSpaceInfo v8_user_idregs[] = {
20
69
{ .name = "ID_AA64PFR0_EL1",
21
- ret = get_phys_addr_lpae(env, addr, 0, ARMMMUIdx_Stage2, &s2pa,
70
- .exported_bits = 0x000f000f00ff0000,
22
- &txattrs, &s2prot, &s2size, fi, pcacheattrs);
71
- .fixed_bits = 0x0000000000000011 },
23
+ ret = get_phys_addr_lpae(env, addr, MMU_DATA_LOAD, ARMMMUIdx_Stage2,
72
+ .exported_bits = R_ID_AA64PFR0_FP_MASK |
24
+ &s2pa, &txattrs, &s2prot, &s2size, fi,
73
+ R_ID_AA64PFR0_ADVSIMD_MASK |
25
+ pcacheattrs);
74
+ R_ID_AA64PFR0_SVE_MASK |
26
if (ret) {
75
+ R_ID_AA64PFR0_DIT_MASK,
27
assert(fi->type != ARMFault_None);
76
+ .fixed_bits = (0x1 << R_ID_AA64PFR0_EL0_SHIFT) |
28
fi->s2addr = addr;
77
+ (0x1 << R_ID_AA64PFR0_EL1_SHIFT) },
78
{ .name = "ID_AA64PFR1_EL1",
79
- .exported_bits = 0x00000000000000f0 },
80
+ .exported_bits = R_ID_AA64PFR1_BT_MASK |
81
+ R_ID_AA64PFR1_SSBS_MASK |
82
+ R_ID_AA64PFR1_MTE_MASK |
83
+ R_ID_AA64PFR1_SME_MASK },
84
{ .name = "ID_AA64PFR*_EL1_RESERVED",
85
- .is_glob = true },
86
- { .name = "ID_AA64ZFR0_EL1" },
87
+ .is_glob = true },
88
+ { .name = "ID_AA64ZFR0_EL1",
89
+ .exported_bits = R_ID_AA64ZFR0_SVEVER_MASK |
90
+ R_ID_AA64ZFR0_AES_MASK |
91
+ R_ID_AA64ZFR0_BITPERM_MASK |
92
+ R_ID_AA64ZFR0_BFLOAT16_MASK |
93
+ R_ID_AA64ZFR0_SHA3_MASK |
94
+ R_ID_AA64ZFR0_SM4_MASK |
95
+ R_ID_AA64ZFR0_I8MM_MASK |
96
+ R_ID_AA64ZFR0_F32MM_MASK |
97
+ R_ID_AA64ZFR0_F64MM_MASK },
98
+ { .name = "ID_AA64SMFR0_EL1",
99
+ .exported_bits = R_ID_AA64SMFR0_F32F32_MASK |
100
+ R_ID_AA64SMFR0_B16F32_MASK |
101
+ R_ID_AA64SMFR0_F16F32_MASK |
102
+ R_ID_AA64SMFR0_I8I32_MASK |
103
+ R_ID_AA64SMFR0_F64F64_MASK |
104
+ R_ID_AA64SMFR0_I16I64_MASK |
105
+ R_ID_AA64SMFR0_FA64_MASK },
106
{ .name = "ID_AA64MMFR0_EL1",
107
- .fixed_bits = 0x00000000ff000000 },
108
- { .name = "ID_AA64MMFR1_EL1" },
109
+ .exported_bits = R_ID_AA64MMFR0_ECV_MASK,
110
+ .fixed_bits = (0xf << R_ID_AA64MMFR0_TGRAN64_SHIFT) |
111
+ (0xf << R_ID_AA64MMFR0_TGRAN4_SHIFT) },
112
+ { .name = "ID_AA64MMFR1_EL1",
113
+ .exported_bits = R_ID_AA64MMFR1_AFP_MASK },
114
+ { .name = "ID_AA64MMFR2_EL1",
115
+ .exported_bits = R_ID_AA64MMFR2_AT_MASK },
116
{ .name = "ID_AA64MMFR*_EL1_RESERVED",
117
- .is_glob = true },
118
+ .is_glob = true },
119
{ .name = "ID_AA64DFR0_EL1",
120
- .fixed_bits = 0x0000000000000006 },
121
- { .name = "ID_AA64DFR1_EL1" },
122
+ .fixed_bits = (0x6 << R_ID_AA64DFR0_DEBUGVER_SHIFT) },
123
+ { .name = "ID_AA64DFR1_EL1" },
124
{ .name = "ID_AA64DFR*_EL1_RESERVED",
125
- .is_glob = true },
126
+ .is_glob = true },
127
{ .name = "ID_AA64AFR*",
128
- .is_glob = true },
129
+ .is_glob = true },
130
{ .name = "ID_AA64ISAR0_EL1",
131
- .exported_bits = 0x00fffffff0fffff0 },
132
+ .exported_bits = R_ID_AA64ISAR0_AES_MASK |
133
+ R_ID_AA64ISAR0_SHA1_MASK |
134
+ R_ID_AA64ISAR0_SHA2_MASK |
135
+ R_ID_AA64ISAR0_CRC32_MASK |
136
+ R_ID_AA64ISAR0_ATOMIC_MASK |
137
+ R_ID_AA64ISAR0_RDM_MASK |
138
+ R_ID_AA64ISAR0_SHA3_MASK |
139
+ R_ID_AA64ISAR0_SM3_MASK |
140
+ R_ID_AA64ISAR0_SM4_MASK |
141
+ R_ID_AA64ISAR0_DP_MASK |
142
+ R_ID_AA64ISAR0_FHM_MASK |
143
+ R_ID_AA64ISAR0_TS_MASK |
144
+ R_ID_AA64ISAR0_RNDR_MASK },
145
{ .name = "ID_AA64ISAR1_EL1",
146
- .exported_bits = 0x000000f0ffffffff },
147
+ .exported_bits = R_ID_AA64ISAR1_DPB_MASK |
148
+ R_ID_AA64ISAR1_APA_MASK |
149
+ R_ID_AA64ISAR1_API_MASK |
150
+ R_ID_AA64ISAR1_JSCVT_MASK |
151
+ R_ID_AA64ISAR1_FCMA_MASK |
152
+ R_ID_AA64ISAR1_LRCPC_MASK |
153
+ R_ID_AA64ISAR1_GPA_MASK |
154
+ R_ID_AA64ISAR1_GPI_MASK |
155
+ R_ID_AA64ISAR1_FRINTTS_MASK |
156
+ R_ID_AA64ISAR1_SB_MASK |
157
+ R_ID_AA64ISAR1_BF16_MASK |
158
+ R_ID_AA64ISAR1_DGH_MASK |
159
+ R_ID_AA64ISAR1_I8MM_MASK },
160
+ { .name = "ID_AA64ISAR2_EL1",
161
+ .exported_bits = R_ID_AA64ISAR2_WFXT_MASK |
162
+ R_ID_AA64ISAR2_RPRES_MASK |
163
+ R_ID_AA64ISAR2_GPA3_MASK |
164
+ R_ID_AA64ISAR2_APA3_MASK },
165
{ .name = "ID_AA64ISAR*_EL1_RESERVED",
166
- .is_glob = true },
167
+ .is_glob = true },
168
};
169
modify_arm_cp_regs(v8_idregs, v8_user_idregs);
170
#endif
171
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
172
#ifdef CONFIG_USER_ONLY
173
static const ARMCPRegUserSpaceInfo id_v8_user_midr_cp_reginfo[] = {
174
{ .name = "MIDR_EL1",
175
- .exported_bits = 0x00000000ffffffff },
176
- { .name = "REVIDR_EL1" },
177
+ .exported_bits = R_MIDR_EL1_REVISION_MASK |
178
+ R_MIDR_EL1_PARTNUM_MASK |
179
+ R_MIDR_EL1_ARCHITECTURE_MASK |
180
+ R_MIDR_EL1_VARIANT_MASK |
181
+ R_MIDR_EL1_IMPLEMENTER_MASK },
182
+ { .name = "REVIDR_EL1" },
183
};
184
modify_arm_cp_regs(id_v8_midr_cp_reginfo, id_v8_user_midr_cp_reginfo);
185
#endif
29
--
186
--
30
2.20.1
187
2.25.1
31
32
diff view generated by jsdifflib
1
Convert the Neon "load single structure to all lanes" insns to
1
From: Thomas Huth <thuth@redhat.com>
2
decodetree.
3
2
3
The header target/arm/kvm-consts.h checks CONFIG_KVM which is marked as
4
poisoned in common code, so the files that include this header have to
5
be added to specific_ss and recompiled for each, qemu-system-arm and
6
qemu-system-aarch64. However, since the kvm headers are only optionally
7
used in kvm-constants.h for some sanity checks, we can additionally
8
check the NEED_CPU_H macro first to avoid the poisoned CONFIG_KVM macro,
9
so kvm-constants.h can also be used from "common" files (without the
10
sanity checks - which should be OK since they are still done from other
11
target-specific files instead). This way, and by adjusting some other
12
include statements in the related files here and there, we can move some
13
files from specific_ss into softmmu_ss, so that they only need to be
14
compiled once during the build process.
15
16
Signed-off-by: Thomas Huth <thuth@redhat.com>
17
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
18
Message-id: 20221202154023.293614-1-thuth@redhat.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20200430181003.21682-13-peter.maydell@linaro.org
7
---
20
---
8
target/arm/neon-ls.decode | 5 +++
21
include/hw/misc/xlnx-zynqmp-apu-ctrl.h | 2 +-
9
target/arm/translate-neon.inc.c | 73 +++++++++++++++++++++++++++++++++
22
target/arm/kvm-consts.h | 8 ++++----
10
target/arm/translate.c | 55 +------------------------
23
hw/misc/imx6_src.c | 2 +-
11
3 files changed, 80 insertions(+), 53 deletions(-)
24
hw/misc/iotkit-sysctl.c | 1 -
25
hw/misc/meson.build | 11 +++++------
26
5 files changed, 11 insertions(+), 13 deletions(-)
12
27
13
diff --git a/target/arm/neon-ls.decode b/target/arm/neon-ls.decode
28
diff --git a/include/hw/misc/xlnx-zynqmp-apu-ctrl.h b/include/hw/misc/xlnx-zynqmp-apu-ctrl.h
14
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-ls.decode
30
--- a/include/hw/misc/xlnx-zynqmp-apu-ctrl.h
16
+++ b/target/arm/neon-ls.decode
31
+++ b/include/hw/misc/xlnx-zynqmp-apu-ctrl.h
17
@@ -XXX,XX +XXX,XX @@
32
@@ -XXX,XX +XXX,XX @@
18
33
19
VLDST_multiple 1111 0100 0 . l:1 0 rn:4 .... itype:4 size:2 align:2 rm:4 \
34
#include "hw/sysbus.h"
20
vd=%vd_dp
35
#include "hw/register.h"
21
+
36
-#include "target/arm/cpu.h"
22
+# Neon load single element to all lanes
37
+#include "target/arm/cpu-qom.h"
23
+
38
24
+VLD_all_lanes 1111 0100 1 . 1 0 rn:4 .... 11 n:2 size:2 t:1 a:1 rm:4 \
39
#define TYPE_XLNX_ZYNQMP_APU_CTRL "xlnx.apu-ctrl"
25
+ vd=%vd_dp
40
OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPAPUCtrl, XLNX_ZYNQMP_APU_CTRL)
26
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
41
diff --git a/target/arm/kvm-consts.h b/target/arm/kvm-consts.h
27
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
28
--- a/target/arm/translate-neon.inc.c
43
--- a/target/arm/kvm-consts.h
29
+++ b/target/arm/translate-neon.inc.c
44
+++ b/target/arm/kvm-consts.h
30
@@ -XXX,XX +XXX,XX @@ static bool trans_VLDST_multiple(DisasContext *s, arg_VLDST_multiple *a)
45
@@ -XXX,XX +XXX,XX @@
31
gen_neon_ldst_base_update(s, a->rm, a->rn, nregs * interleave * 8);
46
#ifndef ARM_KVM_CONSTS_H
32
return true;
47
#define ARM_KVM_CONSTS_H
33
}
48
34
+
49
+#ifdef NEED_CPU_H
35
+static bool trans_VLD_all_lanes(DisasContext *s, arg_VLD_all_lanes *a)
50
#ifdef CONFIG_KVM
36
+{
51
#include <linux/kvm.h>
37
+ /* Neon load single structure to all lanes */
52
#include <linux/psci.h>
38
+ int reg, stride, vec_size;
53
-
39
+ int vd = a->vd;
54
#define MISMATCH_CHECK(X, Y) QEMU_BUILD_BUG_ON(X != Y)
40
+ int size = a->size;
55
+#endif
41
+ int nregs = a->n + 1;
56
+#endif
42
+ TCGv_i32 addr, tmp;
57
43
+
58
-#else
44
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
59
-
45
+ return false;
60
+#ifndef MISMATCH_CHECK
46
+ }
61
#define MISMATCH_CHECK(X, Y) QEMU_BUILD_BUG_ON(0)
47
+
62
-
48
+ /* UNDEF accesses to D16-D31 if they don't exist */
63
#endif
49
+ if (!dc_isar_feature(aa32_simd_r32, s) && (a->vd & 0x10)) {
64
50
+ return false;
65
#define CP_REG_SIZE_SHIFT 52
51
+ }
66
diff --git a/hw/misc/imx6_src.c b/hw/misc/imx6_src.c
52
+
53
+ if (size == 3) {
54
+ if (nregs != 4 || a->a == 0) {
55
+ return false;
56
+ }
57
+ /* For VLD4 size == 3 a == 1 means 32 bits at 16 byte alignment */
58
+ size = 2;
59
+ }
60
+ if (nregs == 1 && a->a == 1 && size == 0) {
61
+ return false;
62
+ }
63
+ if (nregs == 3 && a->a == 1) {
64
+ return false;
65
+ }
66
+
67
+ if (!vfp_access_check(s)) {
68
+ return true;
69
+ }
70
+
71
+ /*
72
+ * VLD1 to all lanes: T bit indicates how many Dregs to write.
73
+ * VLD2/3/4 to all lanes: T bit indicates register stride.
74
+ */
75
+ stride = a->t ? 2 : 1;
76
+ vec_size = nregs == 1 ? stride * 8 : 8;
77
+
78
+ tmp = tcg_temp_new_i32();
79
+ addr = tcg_temp_new_i32();
80
+ load_reg_var(s, addr, a->rn);
81
+ for (reg = 0; reg < nregs; reg++) {
82
+ gen_aa32_ld_i32(s, tmp, addr, get_mem_index(s),
83
+ s->be_data | size);
84
+ if ((vd & 1) && vec_size == 16) {
85
+ /*
86
+ * We cannot write 16 bytes at once because the
87
+ * destination is unaligned.
88
+ */
89
+ tcg_gen_gvec_dup_i32(size, neon_reg_offset(vd, 0),
90
+ 8, 8, tmp);
91
+ tcg_gen_gvec_mov(0, neon_reg_offset(vd + 1, 0),
92
+ neon_reg_offset(vd, 0), 8, 8);
93
+ } else {
94
+ tcg_gen_gvec_dup_i32(size, neon_reg_offset(vd, 0),
95
+ vec_size, vec_size, tmp);
96
+ }
97
+ tcg_gen_addi_i32(addr, addr, 1 << size);
98
+ vd += stride;
99
+ }
100
+ tcg_temp_free_i32(tmp);
101
+ tcg_temp_free_i32(addr);
102
+
103
+ gen_neon_ldst_base_update(s, a->rm, a->rn, (1 << size) * nregs);
104
+
105
+ return true;
106
+}
107
diff --git a/target/arm/translate.c b/target/arm/translate.c
108
index XXXXXXX..XXXXXXX 100644
67
index XXXXXXX..XXXXXXX 100644
109
--- a/target/arm/translate.c
68
--- a/hw/misc/imx6_src.c
110
+++ b/target/arm/translate.c
69
+++ b/hw/misc/imx6_src.c
111
@@ -XXX,XX +XXX,XX @@ static int disas_neon_ls_insn(DisasContext *s, uint32_t insn)
70
@@ -XXX,XX +XXX,XX @@
112
int size;
71
#include "qemu/log.h"
113
int reg;
72
#include "qemu/main-loop.h"
114
int load;
73
#include "qemu/module.h"
115
- int vec_size;
74
-#include "arm-powerctl.h"
116
TCGv_i32 addr;
75
+#include "target/arm/arm-powerctl.h"
117
TCGv_i32 tmp;
76
#include "hw/core/cpu.h"
118
77
119
@@ -XXX,XX +XXX,XX @@ static int disas_neon_ls_insn(DisasContext *s, uint32_t insn)
78
#ifndef DEBUG_IMX6_SRC
120
} else {
79
diff --git a/hw/misc/iotkit-sysctl.c b/hw/misc/iotkit-sysctl.c
121
size = (insn >> 10) & 3;
80
index XXXXXXX..XXXXXXX 100644
122
if (size == 3) {
81
--- a/hw/misc/iotkit-sysctl.c
123
- /* Load single element to all lanes. */
82
+++ b/hw/misc/iotkit-sysctl.c
124
- int a = (insn >> 4) & 1;
83
@@ -XXX,XX +XXX,XX @@
125
- if (!load) {
84
#include "hw/qdev-properties.h"
126
- return 1;
85
#include "hw/arm/armsse-version.h"
127
- }
86
#include "target/arm/arm-powerctl.h"
128
- size = (insn >> 6) & 3;
87
-#include "target/arm/cpu.h"
129
- nregs = ((insn >> 8) & 3) + 1;
88
89
REG32(SECDBGSTAT, 0x0)
90
REG32(SECDBGSET, 0x4)
91
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
92
index XXXXXXX..XXXXXXX 100644
93
--- a/hw/misc/meson.build
94
+++ b/hw/misc/meson.build
95
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_IMX', if_true: files(
96
'imx25_ccm.c',
97
'imx31_ccm.c',
98
'imx6_ccm.c',
99
+ 'imx6_src.c',
100
'imx6ul_ccm.c',
101
'imx7_ccm.c',
102
'imx7_gpr.c',
103
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files(
104
))
105
softmmu_ss.add(when: 'CONFIG_SLAVIO', if_true: files('slavio_misc.c'))
106
softmmu_ss.add(when: 'CONFIG_ZYNQ', if_true: files('zynq_slcr.c'))
107
-specific_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-crf.c'))
108
-specific_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-apu-ctrl.c'))
109
+softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-crf.c'))
110
+softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp-apu-ctrl.c'))
111
specific_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal-crl.c'))
112
softmmu_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files(
113
'xlnx-versal-xramc.c',
114
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_TZ_MPC', if_true: files('tz-mpc.c'))
115
softmmu_ss.add(when: 'CONFIG_TZ_MSC', if_true: files('tz-msc.c'))
116
softmmu_ss.add(when: 'CONFIG_TZ_PPC', if_true: files('tz-ppc.c'))
117
softmmu_ss.add(when: 'CONFIG_IOTKIT_SECCTL', if_true: files('iotkit-secctl.c'))
118
+softmmu_ss.add(when: 'CONFIG_IOTKIT_SYSCTL', if_true: files('iotkit-sysctl.c'))
119
softmmu_ss.add(when: 'CONFIG_IOTKIT_SYSINFO', if_true: files('iotkit-sysinfo.c'))
120
softmmu_ss.add(when: 'CONFIG_ARMSSE_CPU_PWRCTRL', if_true: files('armsse-cpu-pwrctrl.c'))
121
softmmu_ss.add(when: 'CONFIG_ARMSSE_CPUID', if_true: files('armsse-cpuid.c'))
122
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_GRLIB', if_true: files('grlib_ahb_apb_pnp.c'))
123
124
specific_ss.add(when: 'CONFIG_AVR_POWER', if_true: files('avr_power.c'))
125
126
-specific_ss.add(when: 'CONFIG_IMX', if_true: files('imx6_src.c'))
127
-specific_ss.add(when: 'CONFIG_IOTKIT_SYSCTL', if_true: files('iotkit-sysctl.c'))
130
-
128
-
131
- if (size == 3) {
129
specific_ss.add(when: 'CONFIG_MAC_VIA', if_true: files('mac_via.c'))
132
- if (nregs != 4 || a == 0) {
130
133
- return 1;
131
specific_ss.add(when: 'CONFIG_MIPS_CPS', if_true: files('mips_cmgcr.c', 'mips_cpc.c'))
134
- }
132
specific_ss.add(when: 'CONFIG_MIPS_ITU', if_true: files('mips_itu.c'))
135
- /* For VLD4 size==3 a == 1 means 32 bits at 16 byte alignment */
133
136
- size = 2;
134
-specific_ss.add(when: 'CONFIG_SBSA_REF', if_true: files('sbsa_ec.c'))
137
- }
135
+softmmu_ss.add(when: 'CONFIG_SBSA_REF', if_true: files('sbsa_ec.c'))
138
- if (nregs == 1 && a == 1 && size == 0) {
136
139
- return 1;
137
# HPPA devices
140
- }
138
softmmu_ss.add(when: 'CONFIG_LASI', if_true: files('lasi.c'))
141
- if (nregs == 3 && a == 1) {
142
- return 1;
143
- }
144
- addr = tcg_temp_new_i32();
145
- load_reg_var(s, addr, rn);
146
-
147
- /* VLD1 to all lanes: bit 5 indicates how many Dregs to write.
148
- * VLD2/3/4 to all lanes: bit 5 indicates register stride.
149
- */
150
- stride = (insn & (1 << 5)) ? 2 : 1;
151
- vec_size = nregs == 1 ? stride * 8 : 8;
152
-
153
- tmp = tcg_temp_new_i32();
154
- for (reg = 0; reg < nregs; reg++) {
155
- gen_aa32_ld_i32(s, tmp, addr, get_mem_index(s),
156
- s->be_data | size);
157
- if ((rd & 1) && vec_size == 16) {
158
- /* We cannot write 16 bytes at once because the
159
- * destination is unaligned.
160
- */
161
- tcg_gen_gvec_dup_i32(size, neon_reg_offset(rd, 0),
162
- 8, 8, tmp);
163
- tcg_gen_gvec_mov(0, neon_reg_offset(rd + 1, 0),
164
- neon_reg_offset(rd, 0), 8, 8);
165
- } else {
166
- tcg_gen_gvec_dup_i32(size, neon_reg_offset(rd, 0),
167
- vec_size, vec_size, tmp);
168
- }
169
- tcg_gen_addi_i32(addr, addr, 1 << size);
170
- rd += stride;
171
- }
172
- tcg_temp_free_i32(tmp);
173
- tcg_temp_free_i32(addr);
174
- stride = (1 << size) * nregs;
175
+ /* Load single element to all lanes -- handled by decodetree */
176
+ return 1;
177
} else {
178
/* Single element. */
179
int idx = (insn >> 4) & 0xf;
180
--
139
--
181
2.20.1
140
2.25.1
182
141
183
142
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
MIDR_EL1 is a 64-bit system register with the top 32-bit being RES0.
3
When building with --disable-tcg on Darwin we get:
4
Represent it in QEMU's ARMCPU struct with a uint64_t, not a
5
uint32_t.
6
4
7
This fixes an error when compiling with -Werror=conversion
5
target/arm/cpu.c:725:16: error: incomplete definition of type 'struct TCGCPUOps'
8
because we were manipulating the register value using a
6
cc->tcg_ops->do_interrupt(cs);
9
local uint64_t variable:
7
~~~~~~~~~~~^
10
8
11
target/arm/cpu64.c: In function ‘aarch64_max_initfn’:
9
Commit 083afd18a9 ("target/arm: Restrict cpu_exec_interrupt()
12
target/arm/cpu64.c:628:21: error: conversion from ‘uint64_t’ {aka ‘long unsigned int’} to ‘uint32_t’ {aka ‘unsigned int’} may change value [-Werror=conversion]
10
handler to sysemu") limited this block to system emulation,
13
628 | cpu->midr = t;
11
but neglected to also limit it to TCG.
14
| ^
15
12
16
and future-proofs us against a possible future architecture
13
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
17
change using some of the top 32 bits.
14
Reviewed-by: Fabiano Rosas <farosas@suse.de>
18
15
Message-id: 20221209110823.59495-1-philmd@linaro.org
19
Suggested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
20
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
22
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
23
Message-id: 20200428172634.29707-1-f4bug@amsat.org
24
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
---
17
---
27
target/arm/cpu.h | 2 +-
18
target/arm/cpu.c | 5 +++--
28
target/arm/cpu.c | 2 +-
19
1 file changed, 3 insertions(+), 2 deletions(-)
29
2 files changed, 2 insertions(+), 2 deletions(-)
30
20
31
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/cpu.h
34
+++ b/target/arm/cpu.h
35
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
36
uint64_t id_aa64dfr0;
37
uint64_t id_aa64dfr1;
38
} isar;
39
- uint32_t midr;
40
+ uint64_t midr;
41
uint32_t revidr;
42
uint32_t reset_fpsid;
43
uint32_t ctr;
44
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
21
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
45
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/cpu.c
23
--- a/target/arm/cpu.c
47
+++ b/target/arm/cpu.c
24
+++ b/target/arm/cpu.c
48
@@ -XXX,XX +XXX,XX @@ static const ARMCPUInfo arm_cpus[] = {
25
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(DeviceState *dev)
49
static Property arm_cpu_properties[] = {
26
arm_rebuild_hflags(env);
50
DEFINE_PROP_BOOL("start-powered-off", ARMCPU, start_powered_off, false),
27
}
51
DEFINE_PROP_UINT32("psci-conduit", ARMCPU, psci_conduit, 0),
28
52
- DEFINE_PROP_UINT32("midr", ARMCPU, midr, 0),
29
-#ifndef CONFIG_USER_ONLY
53
+ DEFINE_PROP_UINT64("midr", ARMCPU, midr, 0),
30
+#if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
54
DEFINE_PROP_UINT64("mp-affinity", ARMCPU,
31
55
mp_affinity, ARM64_AFFINITY_INVALID),
32
static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
56
DEFINE_PROP_INT32("node-id", ARMCPU, node_id, CPU_UNSET_NUMA_NODE_ID),
33
unsigned int target_el,
34
@@ -XXX,XX +XXX,XX @@ static bool arm_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
35
cc->tcg_ops->do_interrupt(cs);
36
return true;
37
}
38
-#endif /* !CONFIG_USER_ONLY */
39
+
40
+#endif /* CONFIG_TCG && !CONFIG_USER_ONLY */
41
42
void arm_cpu_update_virq(ARMCPU *cpu)
43
{
57
--
44
--
58
2.20.1
45
2.25.1
59
46
60
47
diff view generated by jsdifflib
Deleted patch
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
1
3
Remove inclusion of arm_gicv3_common.h, this already gets
4
included via xlnx-versal.h.
5
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
9
Message-id: 20200427181649.26851-2-edgar.iglesias@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/xlnx-versal.c | 1 -
13
1 file changed, 1 deletion(-)
14
15
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/xlnx-versal.c
18
+++ b/hw/arm/xlnx-versal.c
19
@@ -XXX,XX +XXX,XX @@
20
#include "hw/arm/boot.h"
21
#include "kvm_arm.h"
22
#include "hw/misc/unimp.h"
23
-#include "hw/intc/arm_gicv3_common.h"
24
#include "hw/arm/xlnx-versal.h"
25
#include "hw/char/pl011.h"
26
27
--
28
2.20.1
29
30
diff view generated by jsdifflib
Deleted patch
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
1
3
Move misplaced comment.
4
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
9
Message-id: 20200427181649.26851-3-edgar.iglesias@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/xlnx-versal.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/xlnx-versal.c
18
+++ b/hw/arm/xlnx-versal.c
19
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
20
21
obj = object_new(XLNX_VERSAL_ACPU_TYPE);
22
if (!obj) {
23
- /* Secondary CPUs start in PSCI powered-down state */
24
error_report("Unable to create apu.cpu[%d] of type %s",
25
i, XLNX_VERSAL_ACPU_TYPE);
26
exit(EXIT_FAILURE);
27
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
28
object_property_set_int(obj, s->cfg.psci_conduit,
29
"psci-conduit", &error_abort);
30
if (i) {
31
+ /* Secondary CPUs start in PSCI powered-down state */
32
object_property_set_bool(obj, true,
33
"start-powered-off", &error_abort);
34
}
35
--
36
2.20.1
37
38
diff view generated by jsdifflib
Deleted patch
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
1
3
Fix typo xlnx-ve -> xlnx-versal.
4
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
9
Message-id: 20200427181649.26851-4-edgar.iglesias@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/xlnx-versal-virt.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/xlnx-versal-virt.c
18
+++ b/hw/arm/xlnx-versal-virt.c
19
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
20
psci_conduit = QEMU_PSCI_CONDUIT_SMC;
21
}
22
23
- sysbus_init_child_obj(OBJECT(machine), "xlnx-ve", &s->soc,
24
+ sysbus_init_child_obj(OBJECT(machine), "xlnx-versal", &s->soc,
25
sizeof(s->soc), TYPE_XLNX_VERSAL);
26
object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
27
"ddr", &error_abort);
28
--
29
2.20.1
30
31
diff view generated by jsdifflib
Deleted patch
1
Somewhere along theline we accidentally added a duplicate
2
"using D16-D31 when they don't exist" check to do_vfm_dp()
3
(probably an artifact of a patchseries rebase). Remove it.
4
1
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20200430181003.21682-2-peter.maydell@linaro.org
9
---
10
target/arm/translate-vfp.inc.c | 6 ------
11
1 file changed, 6 deletions(-)
12
13
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-vfp.inc.c
16
+++ b/target/arm/translate-vfp.inc.c
17
@@ -XXX,XX +XXX,XX @@ static bool do_vfm_dp(DisasContext *s, arg_VFMA_dp *a, bool neg_n, bool neg_d)
18
return false;
19
}
20
21
- /* UNDEF accesses to D16-D31 if they don't exist. */
22
- if (!dc_isar_feature(aa32_simd_r32, s) &&
23
- ((a->vd | a->vn | a->vm) & 0x10)) {
24
- return false;
25
- }
26
-
27
if (!vfp_access_check(s)) {
28
return true;
29
}
30
--
31
2.20.1
32
33
diff view generated by jsdifflib
Deleted patch
1
We were accidentally permitting decode of Thumb Neon insns even if
2
the CPU didn't have the FEATURE_NEON bit set, because the feature
3
check was being done before the call to disas_neon_data_insn() and
4
disas_neon_ls_insn() in the Arm decoder but was omitted from the
5
Thumb decoder. Push the feature bit check down into the called
6
functions so it is done for both Arm and Thumb encodings.
7
1
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20200430181003.21682-3-peter.maydell@linaro.org
12
---
13
target/arm/translate.c | 16 ++++++++--------
14
1 file changed, 8 insertions(+), 8 deletions(-)
15
16
diff --git a/target/arm/translate.c b/target/arm/translate.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate.c
19
+++ b/target/arm/translate.c
20
@@ -XXX,XX +XXX,XX @@ static int disas_neon_ls_insn(DisasContext *s, uint32_t insn)
21
TCGv_i32 tmp2;
22
TCGv_i64 tmp64;
23
24
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
25
+ return 1;
26
+ }
27
+
28
/* FIXME: this access check should not take precedence over UNDEF
29
* for invalid encodings; we will generate incorrect syndrome information
30
* for attempts to execute invalid vfp/neon encodings with FP disabled.
31
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
32
TCGv_ptr ptr1, ptr2, ptr3;
33
TCGv_i64 tmp64;
34
35
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
36
+ return 1;
37
+ }
38
+
39
/* FIXME: this access check should not take precedence over UNDEF
40
* for invalid encodings; we will generate incorrect syndrome information
41
* for attempts to execute invalid vfp/neon encodings with FP disabled.
42
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
43
44
if (((insn >> 25) & 7) == 1) {
45
/* NEON Data processing. */
46
- if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
47
- goto illegal_op;
48
- }
49
-
50
if (disas_neon_data_insn(s, insn)) {
51
goto illegal_op;
52
}
53
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
54
}
55
if ((insn & 0x0f100000) == 0x04000000) {
56
/* NEON load/store. */
57
- if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
58
- goto illegal_op;
59
- }
60
-
61
if (disas_neon_ls_insn(s, insn)) {
62
goto illegal_op;
63
}
64
--
65
2.20.1
66
67
diff view generated by jsdifflib
Deleted patch
1
Add the infrastructure for building and invoking a decodetree decoder
2
for the AArch32 Neon encodings. At the moment the new decoder covers
3
nothing, so we always fall back to the existing hand-written decode.
4
1
5
We follow the same pattern we did for the VFP decodetree conversion
6
(commit 78e138bc1f672c145ef6ace74617d and following): code that deals
7
with Neon will be moving gradually out to translate-neon.vfp.inc,
8
which we #include into translate.c.
9
10
In order to share the decode files between A32 and T32, we
11
split Neon into 3 parts:
12
* data-processing
13
* load-store
14
* 'shared' encodings
15
16
The first two groups of instructions have similar but not identical
17
A32 and T32 encodings, so we need to manually transform the T32
18
encoding into the A32 one before calling the decoder; the third group
19
covers the Neon instructions which are identical in A32 and T32.
20
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
23
Message-id: 20200430181003.21682-4-peter.maydell@linaro.org
24
---
25
target/arm/neon-dp.decode | 29 ++++++++++++++++++++++++++
26
target/arm/neon-ls.decode | 29 ++++++++++++++++++++++++++
27
target/arm/neon-shared.decode | 27 +++++++++++++++++++++++++
28
target/arm/translate-neon.inc.c | 32 +++++++++++++++++++++++++++++
29
target/arm/translate.c | 36 +++++++++++++++++++++++++++++++--
30
target/arm/Makefile.objs | 18 +++++++++++++++++
31
6 files changed, 169 insertions(+), 2 deletions(-)
32
create mode 100644 target/arm/neon-dp.decode
33
create mode 100644 target/arm/neon-ls.decode
34
create mode 100644 target/arm/neon-shared.decode
35
create mode 100644 target/arm/translate-neon.inc.c
36
37
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
38
new file mode 100644
39
index XXXXXXX..XXXXXXX
40
--- /dev/null
41
+++ b/target/arm/neon-dp.decode
42
@@ -XXX,XX +XXX,XX @@
43
+# AArch32 Neon data-processing instruction descriptions
44
+#
45
+# Copyright (c) 2020 Linaro, Ltd
46
+#
47
+# This library is free software; you can redistribute it and/or
48
+# modify it under the terms of the GNU Lesser General Public
49
+# License as published by the Free Software Foundation; either
50
+# version 2 of the License, or (at your option) any later version.
51
+#
52
+# This library is distributed in the hope that it will be useful,
53
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
54
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
55
+# Lesser General Public License for more details.
56
+#
57
+# You should have received a copy of the GNU Lesser General Public
58
+# License along with this library; if not, see <http://www.gnu.org/licenses/>.
59
+
60
+#
61
+# This file is processed by scripts/decodetree.py
62
+#
63
+
64
+# Encodings for Neon data processing instructions where the T32 encoding
65
+# is a simple transformation of the A32 encoding.
66
+# More specifically, this file covers instructions where the A32 encoding is
67
+# 0b1111_001p_qqqq_qqqq_qqqq_qqqq_qqqq_qqqq
68
+# and the T32 encoding is
69
+# 0b111p_1111_qqqq_qqqq_qqqq_qqqq_qqqq_qqqq
70
+# This file works on the A32 encoding only; calling code for T32 has to
71
+# transform the insn into the A32 version first.
72
diff --git a/target/arm/neon-ls.decode b/target/arm/neon-ls.decode
73
new file mode 100644
74
index XXXXXXX..XXXXXXX
75
--- /dev/null
76
+++ b/target/arm/neon-ls.decode
77
@@ -XXX,XX +XXX,XX @@
78
+# AArch32 Neon load/store instruction descriptions
79
+#
80
+# Copyright (c) 2020 Linaro, Ltd
81
+#
82
+# This library is free software; you can redistribute it and/or
83
+# modify it under the terms of the GNU Lesser General Public
84
+# License as published by the Free Software Foundation; either
85
+# version 2 of the License, or (at your option) any later version.
86
+#
87
+# This library is distributed in the hope that it will be useful,
88
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
89
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
90
+# Lesser General Public License for more details.
91
+#
92
+# You should have received a copy of the GNU Lesser General Public
93
+# License along with this library; if not, see <http://www.gnu.org/licenses/>.
94
+
95
+#
96
+# This file is processed by scripts/decodetree.py
97
+#
98
+
99
+# Encodings for Neon load/store instructions where the T32 encoding
100
+# is a simple transformation of the A32 encoding.
101
+# More specifically, this file covers instructions where the A32 encoding is
102
+# 0b1111_0100_xxx0_xxxx_xxxx_xxxx_xxxx_xxxx
103
+# and the T32 encoding is
104
+# 0b1111_1001_xxx0_xxxx_xxxx_xxxx_xxxx_xxxx
105
+# This file works on the A32 encoding only; calling code for T32 has to
106
+# transform the insn into the A32 version first.
107
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
108
new file mode 100644
109
index XXXXXXX..XXXXXXX
110
--- /dev/null
111
+++ b/target/arm/neon-shared.decode
112
@@ -XXX,XX +XXX,XX @@
113
+# AArch32 Neon instruction descriptions
114
+#
115
+# Copyright (c) 2020 Linaro, Ltd
116
+#
117
+# This library is free software; you can redistribute it and/or
118
+# modify it under the terms of the GNU Lesser General Public
119
+# License as published by the Free Software Foundation; either
120
+# version 2 of the License, or (at your option) any later version.
121
+#
122
+# This library is distributed in the hope that it will be useful,
123
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
124
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
125
+# Lesser General Public License for more details.
126
+#
127
+# You should have received a copy of the GNU Lesser General Public
128
+# License along with this library; if not, see <http://www.gnu.org/licenses/>.
129
+
130
+#
131
+# This file is processed by scripts/decodetree.py
132
+#
133
+
134
+# Encodings for Neon instructions whose encoding is the same for
135
+# both A32 and T32.
136
+
137
+# More specifically, this covers:
138
+# 2reg scalar ext: 0b1111_1110_xxxx_xxxx_xxxx_1x0x_xxxx_xxxx
139
+# 3same ext: 0b1111_110x_xxxx_xxxx_xxxx_1x0x_xxxx_xxxx
140
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
141
new file mode 100644
142
index XXXXXXX..XXXXXXX
143
--- /dev/null
144
+++ b/target/arm/translate-neon.inc.c
145
@@ -XXX,XX +XXX,XX @@
146
+/*
147
+ * ARM translation: AArch32 Neon instructions
148
+ *
149
+ * Copyright (c) 2003 Fabrice Bellard
150
+ * Copyright (c) 2005-2007 CodeSourcery
151
+ * Copyright (c) 2007 OpenedHand, Ltd.
152
+ * Copyright (c) 2020 Linaro, Ltd.
153
+ *
154
+ * This library is free software; you can redistribute it and/or
155
+ * modify it under the terms of the GNU Lesser General Public
156
+ * License as published by the Free Software Foundation; either
157
+ * version 2 of the License, or (at your option) any later version.
158
+ *
159
+ * This library is distributed in the hope that it will be useful,
160
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
161
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
162
+ * Lesser General Public License for more details.
163
+ *
164
+ * You should have received a copy of the GNU Lesser General Public
165
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
166
+ */
167
+
168
+/*
169
+ * This file is intended to be included from translate.c; it uses
170
+ * some macros and definitions provided by that file.
171
+ * It might be possible to convert it to a standalone .c file eventually.
172
+ */
173
+
174
+/* Include the generated Neon decoder */
175
+#include "decode-neon-dp.inc.c"
176
+#include "decode-neon-ls.inc.c"
177
+#include "decode-neon-shared.inc.c"
178
diff --git a/target/arm/translate.c b/target/arm/translate.c
179
index XXXXXXX..XXXXXXX 100644
180
--- a/target/arm/translate.c
181
+++ b/target/arm/translate.c
182
@@ -XXX,XX +XXX,XX @@ static TCGv_ptr vfp_reg_ptr(bool dp, int reg)
183
184
#define ARM_CP_RW_BIT (1 << 20)
185
186
-/* Include the VFP decoder */
187
+/* Include the VFP and Neon decoders */
188
#include "translate-vfp.inc.c"
189
+#include "translate-neon.inc.c"
190
191
static inline void iwmmxt_load_reg(TCGv_i64 var, int reg)
192
{
193
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
194
/* Unconditional instructions. */
195
/* TODO: Perhaps merge these into one decodetree output file. */
196
if (disas_a32_uncond(s, insn) ||
197
- disas_vfp_uncond(s, insn)) {
198
+ disas_vfp_uncond(s, insn) ||
199
+ disas_neon_dp(s, insn) ||
200
+ disas_neon_ls(s, insn) ||
201
+ disas_neon_shared(s, insn)) {
202
return;
203
}
204
/* fall back to legacy decoder */
205
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
206
ARCH(6T2);
207
}
208
209
+ if ((insn & 0xef000000) == 0xef000000) {
210
+ /*
211
+ * T32 encodings 0b111p_1111_qqqq_qqqq_qqqq_qqqq_qqqq_qqqq
212
+ * transform into
213
+ * A32 encodings 0b1111_001p_qqqq_qqqq_qqqq_qqqq_qqqq_qqqq
214
+ */
215
+ uint32_t a32_insn = (insn & 0xe2ffffff) |
216
+ ((insn & (1 << 28)) >> 4) | (1 << 28);
217
+
218
+ if (disas_neon_dp(s, a32_insn)) {
219
+ return;
220
+ }
221
+ }
222
+
223
+ if ((insn & 0xff100000) == 0xf9000000) {
224
+ /*
225
+ * T32 encodings 0b1111_1001_ppp0_qqqq_qqqq_qqqq_qqqq_qqqq
226
+ * transform into
227
+ * A32 encodings 0b1111_0100_ppp0_qqqq_qqqq_qqqq_qqqq_qqqq
228
+ */
229
+ uint32_t a32_insn = (insn & 0x00ffffff) | 0xf4000000;
230
+
231
+ if (disas_neon_ls(s, a32_insn)) {
232
+ return;
233
+ }
234
+ }
235
+
236
/*
237
* TODO: Perhaps merge these into one decodetree output file.
238
* Note disas_vfp is written for a32 with cond field in the
239
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
240
*/
241
if (disas_t32(s, insn) ||
242
disas_vfp_uncond(s, insn) ||
243
+ disas_neon_shared(s, insn) ||
244
((insn >> 28) == 0xe && disas_vfp(s, insn))) {
245
return;
246
}
247
diff --git a/target/arm/Makefile.objs b/target/arm/Makefile.objs
248
index XXXXXXX..XXXXXXX 100644
249
--- a/target/arm/Makefile.objs
250
+++ b/target/arm/Makefile.objs
251
@@ -XXX,XX +XXX,XX @@ target/arm/decode-sve.inc.c: $(SRC_PATH)/target/arm/sve.decode $(DECODETREE)
252
     $(PYTHON) $(DECODETREE) --decode disas_sve -o $@ $<,\
253
     "GEN", $(TARGET_DIR)$@)
254
255
+target/arm/decode-neon-shared.inc.c: $(SRC_PATH)/target/arm/neon-shared.decode $(DECODETREE)
256
+    $(call quiet-command,\
257
+     $(PYTHON) $(DECODETREE) --static-decode disas_neon_shared -o $@ $<,\
258
+     "GEN", $(TARGET_DIR)$@)
259
+
260
+target/arm/decode-neon-dp.inc.c: $(SRC_PATH)/target/arm/neon-dp.decode $(DECODETREE)
261
+    $(call quiet-command,\
262
+     $(PYTHON) $(DECODETREE) --static-decode disas_neon_dp -o $@ $<,\
263
+     "GEN", $(TARGET_DIR)$@)
264
+
265
+target/arm/decode-neon-ls.inc.c: $(SRC_PATH)/target/arm/neon-ls.decode $(DECODETREE)
266
+    $(call quiet-command,\
267
+     $(PYTHON) $(DECODETREE) --static-decode disas_neon_ls -o $@ $<,\
268
+     "GEN", $(TARGET_DIR)$@)
269
+
270
target/arm/decode-vfp.inc.c: $(SRC_PATH)/target/arm/vfp.decode $(DECODETREE)
271
    $(call quiet-command,\
272
     $(PYTHON) $(DECODETREE) --static-decode disas_vfp -o $@ $<,\
273
@@ -XXX,XX +XXX,XX @@ target/arm/decode-t16.inc.c: $(SRC_PATH)/target/arm/t16.decode $(DECODETREE)
274
     "GEN", $(TARGET_DIR)$@)
275
276
target/arm/translate-sve.o: target/arm/decode-sve.inc.c
277
+target/arm/translate.o: target/arm/decode-neon-shared.inc.c
278
+target/arm/translate.o: target/arm/decode-neon-dp.inc.c
279
+target/arm/translate.o: target/arm/decode-neon-ls.inc.c
280
target/arm/translate.o: target/arm/decode-vfp.inc.c
281
target/arm/translate.o: target/arm/decode-vfp-uncond.inc.c
282
target/arm/translate.o: target/arm/decode-a32.inc.c
283
--
284
2.20.1
285
286
diff view generated by jsdifflib
Deleted patch
1
Convert the VCMLA (vector) insns in the 3same extension group to
2
decodetree.
3
1
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20200430181003.21682-5-peter.maydell@linaro.org
7
---
8
target/arm/neon-shared.decode | 11 ++++++++++
9
target/arm/translate-neon.inc.c | 37 +++++++++++++++++++++++++++++++++
10
target/arm/translate.c | 11 +---------
11
3 files changed, 49 insertions(+), 10 deletions(-)
12
13
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-shared.decode
16
+++ b/target/arm/neon-shared.decode
17
@@ -XXX,XX +XXX,XX @@
18
# More specifically, this covers:
19
# 2reg scalar ext: 0b1111_1110_xxxx_xxxx_xxxx_1x0x_xxxx_xxxx
20
# 3same ext: 0b1111_110x_xxxx_xxxx_xxxx_1x0x_xxxx_xxxx
21
+
22
+# VFP/Neon register fields; same as vfp.decode
23
+%vm_dp 5:1 0:4
24
+%vm_sp 0:4 5:1
25
+%vn_dp 7:1 16:4
26
+%vn_sp 16:4 7:1
27
+%vd_dp 22:1 12:4
28
+%vd_sp 12:4 22:1
29
+
30
+VCMLA 1111 110 rot:2 . 1 size:1 .... .... 1000 . q:1 . 0 .... \
31
+ vm=%vm_dp vn=%vn_dp vd=%vd_dp
32
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/translate-neon.inc.c
35
+++ b/target/arm/translate-neon.inc.c
36
@@ -XXX,XX +XXX,XX @@
37
#include "decode-neon-dp.inc.c"
38
#include "decode-neon-ls.inc.c"
39
#include "decode-neon-shared.inc.c"
40
+
41
+static bool trans_VCMLA(DisasContext *s, arg_VCMLA *a)
42
+{
43
+ int opr_sz;
44
+ TCGv_ptr fpst;
45
+ gen_helper_gvec_3_ptr *fn_gvec_ptr;
46
+
47
+ if (!dc_isar_feature(aa32_vcma, s)
48
+ || (!a->size && !dc_isar_feature(aa32_fp16_arith, s))) {
49
+ return false;
50
+ }
51
+
52
+ /* UNDEF accesses to D16-D31 if they don't exist. */
53
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
54
+ ((a->vd | a->vn | a->vm) & 0x10)) {
55
+ return false;
56
+ }
57
+
58
+ if ((a->vn | a->vm | a->vd) & a->q) {
59
+ return false;
60
+ }
61
+
62
+ if (!vfp_access_check(s)) {
63
+ return true;
64
+ }
65
+
66
+ opr_sz = (1 + a->q) * 8;
67
+ fpst = get_fpstatus_ptr(1);
68
+ fn_gvec_ptr = a->size ? gen_helper_gvec_fcmlas : gen_helper_gvec_fcmlah;
69
+ tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
70
+ vfp_reg_offset(1, a->vn),
71
+ vfp_reg_offset(1, a->vm),
72
+ fpst, opr_sz, opr_sz, a->rot,
73
+ fn_gvec_ptr);
74
+ tcg_temp_free_ptr(fpst);
75
+ return true;
76
+}
77
diff --git a/target/arm/translate.c b/target/arm/translate.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/target/arm/translate.c
80
+++ b/target/arm/translate.c
81
@@ -XXX,XX +XXX,XX @@ static int disas_neon_insn_3same_ext(DisasContext *s, uint32_t insn)
82
bool is_long = false, q = extract32(insn, 6, 1);
83
bool ptr_is_env = false;
84
85
- if ((insn & 0xfe200f10) == 0xfc200800) {
86
- /* VCMLA -- 1111 110R R.1S .... .... 1000 ...0 .... */
87
- int size = extract32(insn, 20, 1);
88
- data = extract32(insn, 23, 2); /* rot */
89
- if (!dc_isar_feature(aa32_vcma, s)
90
- || (!size && !dc_isar_feature(aa32_fp16_arith, s))) {
91
- return 1;
92
- }
93
- fn_gvec_ptr = size ? gen_helper_gvec_fcmlas : gen_helper_gvec_fcmlah;
94
- } else if ((insn & 0xfea00f10) == 0xfc800800) {
95
+ if ((insn & 0xfea00f10) == 0xfc800800) {
96
/* VCADD -- 1111 110R 1.0S .... .... 1000 ...0 .... */
97
int size = extract32(insn, 20, 1);
98
data = extract32(insn, 24, 1); /* rot */
99
--
100
2.20.1
101
102
diff view generated by jsdifflib
Deleted patch
1
Convert the VCADD (vector) insns to decodetree.
2
1
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20200430181003.21682-6-peter.maydell@linaro.org
6
---
7
target/arm/neon-shared.decode | 3 +++
8
target/arm/translate-neon.inc.c | 37 +++++++++++++++++++++++++++++++++
9
target/arm/translate.c | 11 +---------
10
3 files changed, 41 insertions(+), 10 deletions(-)
11
12
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-shared.decode
15
+++ b/target/arm/neon-shared.decode
16
@@ -XXX,XX +XXX,XX @@
17
18
VCMLA 1111 110 rot:2 . 1 size:1 .... .... 1000 . q:1 . 0 .... \
19
vm=%vm_dp vn=%vn_dp vd=%vd_dp
20
+
21
+VCADD 1111 110 rot:1 1 . 0 size:1 .... .... 1000 . q:1 . 0 .... \
22
+ vm=%vm_dp vn=%vn_dp vd=%vd_dp
23
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
24
index XXXXXXX..XXXXXXX 100644
25
--- a/target/arm/translate-neon.inc.c
26
+++ b/target/arm/translate-neon.inc.c
27
@@ -XXX,XX +XXX,XX @@ static bool trans_VCMLA(DisasContext *s, arg_VCMLA *a)
28
tcg_temp_free_ptr(fpst);
29
return true;
30
}
31
+
32
+static bool trans_VCADD(DisasContext *s, arg_VCADD *a)
33
+{
34
+ int opr_sz;
35
+ TCGv_ptr fpst;
36
+ gen_helper_gvec_3_ptr *fn_gvec_ptr;
37
+
38
+ if (!dc_isar_feature(aa32_vcma, s)
39
+ || (!a->size && !dc_isar_feature(aa32_fp16_arith, s))) {
40
+ return false;
41
+ }
42
+
43
+ /* UNDEF accesses to D16-D31 if they don't exist. */
44
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
45
+ ((a->vd | a->vn | a->vm) & 0x10)) {
46
+ return false;
47
+ }
48
+
49
+ if ((a->vn | a->vm | a->vd) & a->q) {
50
+ return false;
51
+ }
52
+
53
+ if (!vfp_access_check(s)) {
54
+ return true;
55
+ }
56
+
57
+ opr_sz = (1 + a->q) * 8;
58
+ fpst = get_fpstatus_ptr(1);
59
+ fn_gvec_ptr = a->size ? gen_helper_gvec_fcadds : gen_helper_gvec_fcaddh;
60
+ tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
61
+ vfp_reg_offset(1, a->vn),
62
+ vfp_reg_offset(1, a->vm),
63
+ fpst, opr_sz, opr_sz, a->rot,
64
+ fn_gvec_ptr);
65
+ tcg_temp_free_ptr(fpst);
66
+ return true;
67
+}
68
diff --git a/target/arm/translate.c b/target/arm/translate.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/target/arm/translate.c
71
+++ b/target/arm/translate.c
72
@@ -XXX,XX +XXX,XX @@ static int disas_neon_insn_3same_ext(DisasContext *s, uint32_t insn)
73
bool is_long = false, q = extract32(insn, 6, 1);
74
bool ptr_is_env = false;
75
76
- if ((insn & 0xfea00f10) == 0xfc800800) {
77
- /* VCADD -- 1111 110R 1.0S .... .... 1000 ...0 .... */
78
- int size = extract32(insn, 20, 1);
79
- data = extract32(insn, 24, 1); /* rot */
80
- if (!dc_isar_feature(aa32_vcma, s)
81
- || (!size && !dc_isar_feature(aa32_fp16_arith, s))) {
82
- return 1;
83
- }
84
- fn_gvec_ptr = size ? gen_helper_gvec_fcadds : gen_helper_gvec_fcaddh;
85
- } else if ((insn & 0xfeb00f00) == 0xfc200d00) {
86
+ if ((insn & 0xfeb00f00) == 0xfc200d00) {
87
/* V[US]DOT -- 1111 1100 0.10 .... .... 1101 .Q.U .... */
88
bool u = extract32(insn, 4, 1);
89
if (!dc_isar_feature(aa32_dp, s)) {
90
--
91
2.20.1
92
93
diff view generated by jsdifflib
Deleted patch
1
Convert the V[US]DOT (vector) insns to decodetree.
2
1
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20200430181003.21682-7-peter.maydell@linaro.org
6
---
7
target/arm/neon-shared.decode | 4 ++++
8
target/arm/translate-neon.inc.c | 32 ++++++++++++++++++++++++++++++++
9
target/arm/translate.c | 9 +--------
10
3 files changed, 37 insertions(+), 8 deletions(-)
11
12
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-shared.decode
15
+++ b/target/arm/neon-shared.decode
16
@@ -XXX,XX +XXX,XX @@ VCMLA 1111 110 rot:2 . 1 size:1 .... .... 1000 . q:1 . 0 .... \
17
18
VCADD 1111 110 rot:1 1 . 0 size:1 .... .... 1000 . q:1 . 0 .... \
19
vm=%vm_dp vn=%vn_dp vd=%vd_dp
20
+
21
+# VUDOT and VSDOT
22
+VDOT 1111 110 00 . 10 .... .... 1101 . q:1 . u:1 .... \
23
+ vm=%vm_dp vn=%vn_dp vd=%vd_dp
24
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/target/arm/translate-neon.inc.c
27
+++ b/target/arm/translate-neon.inc.c
28
@@ -XXX,XX +XXX,XX @@ static bool trans_VCADD(DisasContext *s, arg_VCADD *a)
29
tcg_temp_free_ptr(fpst);
30
return true;
31
}
32
+
33
+static bool trans_VDOT(DisasContext *s, arg_VDOT *a)
34
+{
35
+ int opr_sz;
36
+ gen_helper_gvec_3 *fn_gvec;
37
+
38
+ if (!dc_isar_feature(aa32_dp, s)) {
39
+ return false;
40
+ }
41
+
42
+ /* UNDEF accesses to D16-D31 if they don't exist. */
43
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
44
+ ((a->vd | a->vn | a->vm) & 0x10)) {
45
+ return false;
46
+ }
47
+
48
+ if ((a->vn | a->vm | a->vd) & a->q) {
49
+ return false;
50
+ }
51
+
52
+ if (!vfp_access_check(s)) {
53
+ return true;
54
+ }
55
+
56
+ opr_sz = (1 + a->q) * 8;
57
+ fn_gvec = a->u ? gen_helper_gvec_udot_b : gen_helper_gvec_sdot_b;
58
+ tcg_gen_gvec_3_ool(vfp_reg_offset(1, a->vd),
59
+ vfp_reg_offset(1, a->vn),
60
+ vfp_reg_offset(1, a->vm),
61
+ opr_sz, opr_sz, 0, fn_gvec);
62
+ return true;
63
+}
64
diff --git a/target/arm/translate.c b/target/arm/translate.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/target/arm/translate.c
67
+++ b/target/arm/translate.c
68
@@ -XXX,XX +XXX,XX @@ static int disas_neon_insn_3same_ext(DisasContext *s, uint32_t insn)
69
bool is_long = false, q = extract32(insn, 6, 1);
70
bool ptr_is_env = false;
71
72
- if ((insn & 0xfeb00f00) == 0xfc200d00) {
73
- /* V[US]DOT -- 1111 1100 0.10 .... .... 1101 .Q.U .... */
74
- bool u = extract32(insn, 4, 1);
75
- if (!dc_isar_feature(aa32_dp, s)) {
76
- return 1;
77
- }
78
- fn_gvec = u ? gen_helper_gvec_udot_b : gen_helper_gvec_sdot_b;
79
- } else if ((insn & 0xff300f10) == 0xfc200810) {
80
+ if ((insn & 0xff300f10) == 0xfc200810) {
81
/* VFM[AS]L -- 1111 1100 S.10 .... .... 1000 .Q.1 .... */
82
int is_s = extract32(insn, 23, 1);
83
if (!dc_isar_feature(aa32_fhm, s)) {
84
--
85
2.20.1
86
87
diff view generated by jsdifflib
Deleted patch
1
Convert the V[US]DOT (scalar) insns in the 2reg-scalar-ext group
2
to decodetree.
3
1
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20200430181003.21682-10-peter.maydell@linaro.org
7
---
8
target/arm/neon-shared.decode | 3 +++
9
target/arm/translate-neon.inc.c | 35 +++++++++++++++++++++++++++++++++
10
target/arm/translate.c | 13 +-----------
11
3 files changed, 39 insertions(+), 12 deletions(-)
12
13
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-shared.decode
16
+++ b/target/arm/neon-shared.decode
17
@@ -XXX,XX +XXX,XX @@ VCMLA_scalar 1111 1110 0 . rot:2 .... .... 1000 . q:1 index:1 0 vm:4 \
18
vn=%vn_dp vd=%vd_dp size=0
19
VCMLA_scalar 1111 1110 1 . rot:2 .... .... 1000 . q:1 . 0 .... \
20
vm=%vm_dp vn=%vn_dp vd=%vd_dp size=1 index=0
21
+
22
+VDOT_scalar 1111 1110 0 . 10 .... .... 1101 . q:1 index:1 u:1 rm:4 \
23
+ vm=%vm_dp vn=%vn_dp vd=%vd_dp
24
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/target/arm/translate-neon.inc.c
27
+++ b/target/arm/translate-neon.inc.c
28
@@ -XXX,XX +XXX,XX @@ static bool trans_VCMLA_scalar(DisasContext *s, arg_VCMLA_scalar *a)
29
tcg_temp_free_ptr(fpst);
30
return true;
31
}
32
+
33
+static bool trans_VDOT_scalar(DisasContext *s, arg_VDOT_scalar *a)
34
+{
35
+ gen_helper_gvec_3 *fn_gvec;
36
+ int opr_sz;
37
+ TCGv_ptr fpst;
38
+
39
+ if (!dc_isar_feature(aa32_dp, s)) {
40
+ return false;
41
+ }
42
+
43
+ /* UNDEF accesses to D16-D31 if they don't exist. */
44
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
45
+ ((a->vd | a->vn) & 0x10)) {
46
+ return false;
47
+ }
48
+
49
+ if ((a->vd | a->vn) & a->q) {
50
+ return false;
51
+ }
52
+
53
+ if (!vfp_access_check(s)) {
54
+ return true;
55
+ }
56
+
57
+ fn_gvec = a->u ? gen_helper_gvec_udot_idx_b : gen_helper_gvec_sdot_idx_b;
58
+ opr_sz = (1 + a->q) * 8;
59
+ fpst = get_fpstatus_ptr(1);
60
+ tcg_gen_gvec_3_ool(vfp_reg_offset(1, a->vd),
61
+ vfp_reg_offset(1, a->vn),
62
+ vfp_reg_offset(1, a->rm),
63
+ opr_sz, opr_sz, a->index, fn_gvec);
64
+ tcg_temp_free_ptr(fpst);
65
+ return true;
66
+}
67
diff --git a/target/arm/translate.c b/target/arm/translate.c
68
index XXXXXXX..XXXXXXX 100644
69
--- a/target/arm/translate.c
70
+++ b/target/arm/translate.c
71
@@ -XXX,XX +XXX,XX @@ static int disas_neon_insn_2reg_scalar_ext(DisasContext *s, uint32_t insn)
72
bool is_long = false, q = extract32(insn, 6, 1);
73
bool ptr_is_env = false;
74
75
- if ((insn & 0xffb00f00) == 0xfe200d00) {
76
- /* V[US]DOT -- 1111 1110 0.10 .... .... 1101 .Q.U .... */
77
- int u = extract32(insn, 4, 1);
78
-
79
- if (!dc_isar_feature(aa32_dp, s)) {
80
- return 1;
81
- }
82
- fn_gvec = u ? gen_helper_gvec_udot_idx_b : gen_helper_gvec_sdot_idx_b;
83
- /* rm is just Vm, and index is M. */
84
- data = extract32(insn, 5, 1); /* index */
85
- rm = extract32(insn, 0, 4);
86
- } else if ((insn & 0xffa00f10) == 0xfe000810) {
87
+ if ((insn & 0xffa00f10) == 0xfe000810) {
88
/* VFM[AS]L -- 1111 1110 0.0S .... .... 1000 .Q.1 .... */
89
int is_s = extract32(insn, 20, 1);
90
int vm20 = extract32(insn, 0, 3);
91
--
92
2.20.1
93
94
diff view generated by jsdifflib