1
Most of this is the Neon decodetree patches, followed by Edgar's versal cleanups.
1
I might squeeze in another pullreq before softfreeze, but the
2
queue was already big enough that I wanted to send this lot out now.
2
3
3
thanks
4
-- PMM
4
-- PMM
5
5
6
The following changes since commit 4abf70a661a5df3886ac9d7c19c3617fa92b922a:
6
7
7
The following changes since commit 2ef486e76d64436be90f7359a3071fb2a56ce835:
8
Merge remote-tracking branch 'remotes/maxreitz/tags/pull-block-2020-06-24' into staging (2020-07-03 15:34:45 +0100)
8
9
Merge remote-tracking branch 'remotes/marcel/tags/rdma-pull-request' into staging (2020-05-03 14:12:56 +0100)
10
9
11
are available in the Git repository at:
10
are available in the Git repository at:
12
11
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200504
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200703
14
13
15
for you to fetch changes up to 9aefc6cf9b73f66062d2f914a0136756e7a28211:
14
for you to fetch changes up to 0f10bf84a9d489259a5b11c6aa1b05c1175b76ea:
16
15
17
target/arm: Move gen_ function typedefs to translate.h (2020-05-04 12:59:26 +0100)
16
Deprecate TileGX port (2020-07-03 16:59:46 +0100)
18
17
19
----------------------------------------------------------------
18
----------------------------------------------------------------
20
target-arm queue:
19
target-arm queue:
21
* Start of conversion of Neon insns to decodetree
20
* i.MX6UL EVK board: put PHYs in the correct places
22
* versal board: support SD and RTC
21
* hw/arm/virt: Let the virtio-iommu bypass MSIs
23
* Implement ARMv8.2-TTS2UXN
22
* target/arm: kvm: Handle DABT with no valid ISS
24
* Make VQDMULL undefined when U=1
23
* hw/arm/virt-acpi-build: Only expose flash on older machine types
25
* Some minor code cleanups
24
* target/arm: Fix temp double-free in sve ldr/str
25
* hw/display/bcm2835_fb.c: Initialize all fields of struct
26
* hw/arm/spitz: Code cleanup to fix Coverity-detected memory leak
27
* Deprecate TileGX port
26
28
27
----------------------------------------------------------------
29
----------------------------------------------------------------
28
Edgar E. Iglesias (11):
30
Andrew Jones (4):
29
hw/arm: versal: Remove inclusion of arm_gicv3_common.h
31
tests/acpi: remove stale allowed tables
30
hw/arm: versal: Move misplaced comment
32
tests/acpi: virt: allow DSDT acpi table changes
31
hw/arm: versal-virt: Fix typo xlnx-ve -> xlnx-versal
33
hw/arm/virt-acpi-build: Only expose flash on older machine types
32
hw/arm: versal: Embed the UARTs into the SoC type
34
tests/acpi: virt: update golden masters for DSDT
33
hw/arm: versal: Embed the GEMs into the SoC type
34
hw/arm: versal: Embed the ADMAs into the SoC type
35
hw/arm: versal: Embed the APUs into the SoC type
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
35
41
Fredrik Strupe (1):
36
Beata Michalska (2):
42
target/arm: Make VQDMULL undefined when U=1
37
target/arm: kvm: Handle DABT with no valid ISS
38
target/arm: kvm: Handle misconfigured dabt injection
43
39
44
Peter Maydell (25):
40
Eric Auger (5):
45
target/arm: Don't use a TLB for ARMMMUIdx_Stage2
41
qdev: Introduce DEFINE_PROP_RESERVED_REGION
46
target/arm: Use enum constant in get_phys_addr_lpae() call
42
virtio-iommu: Implement RESV_MEM probe request
47
target/arm: Add new 's1_is_el0' argument to get_phys_addr_lpae()
43
virtio-iommu: Handle reserved regions in the translation process
48
target/arm: Implement ARMv8.2-TTS2UXN
44
virtio-iommu-pci: Add array of Interval properties
49
target/arm: Use correct variable for setting 'max' cpu's ID_AA64DFR0
45
hw/arm/virt: Let the virtio-iommu bypass MSIs
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
46
71
Philippe Mathieu-Daudé (2):
47
Jean-Christophe Dubois (3):
72
hw/arm/mps2-tz: Use TYPE_IOTKIT instead of hardcoded string
48
Add a phy-num property to the i.MX FEC emulator
73
target/arm: Use uint64_t for midr field in CPU state struct
49
Add the ability to select a different PHY for each i.MX6UL FEC interface
50
Select MDIO device 2 and 1 as PHY devices for i.MX6UL EVK board.
74
51
75
include/hw/arm/xlnx-versal.h | 31 +-
52
Peter Maydell (19):
76
target/arm/cpu-param.h | 2 +-
53
hw/display/bcm2835_fb.c: Initialize all fields of struct
77
target/arm/cpu.h | 38 ++-
54
hw/arm/spitz: Detabify
78
target/arm/translate-a64.h | 9 -
55
hw/arm/spitz: Create SpitzMachineClass abstract base class
79
target/arm/translate.h | 26 ++
56
hw/arm/spitz: Keep pointers to MPU and SSI devices in SpitzMachineState
80
target/arm/neon-dp.decode | 86 +++++
57
hw/arm/spitz: Keep pointers to scp0, scp1 in SpitzMachineState
81
target/arm/neon-ls.decode | 52 +++
58
hw/arm/spitz: Implement inbound GPIO lines for bit5 and power signals
82
target/arm/neon-shared.decode | 66 ++++
59
hw/misc/max111x: provide QOM properties for setting initial values
83
hw/arm/mps2-tz.c | 2 +-
60
hw/misc/max111x: Don't use vmstate_register()
84
hw/arm/xlnx-versal-virt.c | 74 ++++-
61
ssi: Add ssi_realize_and_unref()
85
hw/arm/xlnx-versal.c | 115 +++++--
62
hw/arm/spitz: Use max111x properties to set initial values
86
target/arm/cpu.c | 3 +-
63
hw/misc/max111x: Use GPIO lines rather than max111x_set_input()
87
target/arm/cpu64.c | 8 +-
64
hw/misc/max111x: Create header file for documentation, TYPE_ macros
88
target/arm/helper.c | 183 ++++------
65
hw/arm/spitz: Encapsulate misc GPIO handling in a device
89
target/arm/translate-a64.c | 17 -
66
hw/gpio/zaurus.c: Use LOG_GUEST_ERROR for bad guest register accesses
90
target/arm/translate-neon.inc.c | 714 +++++++++++++++++++++++++++++++++++++++
67
hw/arm/spitz: Use LOG_GUEST_ERROR for bad guest register accesses
91
target/arm/translate-vfp.inc.c | 6 -
68
hw/arm/pxa2xx_pic: Use LOG_GUEST_ERROR for bad guest register accesses
92
target/arm/translate.c | 716 +++-------------------------------------
69
hw/arm/spitz: Provide usual QOM macros for corgi-ssp and spitz-lcdtg
93
target/arm/Makefile.objs | 18 +
70
Replace uses of FROM_SSI_SLAVE() macro with QOM casts
94
19 files changed, 1302 insertions(+), 864 deletions(-)
71
Deprecate TileGX port
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
72
73
Richard Henderson (1):
74
target/arm: Fix temp double-free in sve ldr/str
75
76
docs/system/deprecated.rst | 11 +
77
include/exec/memory.h | 6 +
78
include/hw/arm/fsl-imx6ul.h | 2 +
79
include/hw/arm/pxa.h | 1 -
80
include/hw/arm/sharpsl.h | 3 -
81
include/hw/arm/virt.h | 8 +
82
include/hw/misc/max111x.h | 56 +++
83
include/hw/net/imx_fec.h | 1 +
84
include/hw/qdev-properties.h | 3 +
85
include/hw/ssi/ssi.h | 31 +-
86
include/hw/virtio/virtio-iommu.h | 2 +
87
include/qemu/typedefs.h | 1 +
88
target/arm/cpu.h | 2 +
89
target/arm/kvm_arm.h | 10 +
90
target/arm/translate-a64.h | 1 +
91
tests/qtest/bios-tables-test-allowed-diff.h | 18 -
92
hw/arm/fsl-imx6ul.c | 10 +
93
hw/arm/mcimx6ul-evk.c | 2 +
94
hw/arm/pxa2xx_pic.c | 9 +-
95
hw/arm/spitz.c | 507 ++++++++++++++++------------
96
hw/arm/virt-acpi-build.c | 5 +-
97
hw/arm/virt.c | 33 ++
98
hw/arm/z2.c | 11 +-
99
hw/core/qdev-properties.c | 89 +++++
100
hw/display/ads7846.c | 9 +-
101
hw/display/bcm2835_fb.c | 4 +
102
hw/display/ssd0323.c | 10 +-
103
hw/gpio/zaurus.c | 12 +-
104
hw/misc/max111x.c | 86 +++--
105
hw/net/imx_fec.c | 24 +-
106
hw/sd/ssi-sd.c | 4 +-
107
hw/ssi/ssi.c | 7 +-
108
hw/virtio/virtio-iommu-pci.c | 11 +
109
hw/virtio/virtio-iommu.c | 114 ++++++-
110
target/arm/kvm.c | 80 +++++
111
target/arm/kvm32.c | 34 ++
112
target/arm/kvm64.c | 49 +++
113
target/arm/translate-a64.c | 6 +
114
target/arm/translate-sve.c | 8 +-
115
MAINTAINERS | 1 +
116
hw/net/trace-events | 4 +-
117
hw/virtio/trace-events | 1 +
118
tests/data/acpi/virt/DSDT | Bin 5307 -> 5205 bytes
119
tests/data/acpi/virt/DSDT.memhp | Bin 6668 -> 6566 bytes
120
tests/data/acpi/virt/DSDT.numamem | Bin 5307 -> 5205 bytes
121
45 files changed, 974 insertions(+), 312 deletions(-)
122
create mode 100644 include/hw/misc/max111x.h
123
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
By using the TYPE_* definitions for devices, we can:
3
We need a solution to use an Ethernet PHY that is not the first device
4
- quickly find where devices are used with 'git-grep'
4
on the MDIO bus (device 0 on MDIO bus).
5
- easily rename a device (one-line change).
6
5
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
As an example with the i.MX6UL the NXP SOC has 2 Ethernet devices but
8
Message-id: 20200428154650.21991-1-f4bug@amsat.org
7
only one MDIO bus on which the 2 related PHY are connected but at unique
8
addresses.
9
10
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
11
Message-id: a1a5c0e139d1c763194b8020573dcb6025daeefa.1593296112.git.jcd@tribudubois.net
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
14
---
12
hw/arm/mps2-tz.c | 2 +-
15
include/hw/net/imx_fec.h | 1 +
13
1 file changed, 1 insertion(+), 1 deletion(-)
16
hw/net/imx_fec.c | 24 +++++++++++++++++-------
17
hw/net/trace-events | 4 ++--
18
3 files changed, 20 insertions(+), 9 deletions(-)
14
19
15
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
20
diff --git a/include/hw/net/imx_fec.h b/include/hw/net/imx_fec.h
16
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/mps2-tz.c
22
--- a/include/hw/net/imx_fec.h
18
+++ b/hw/arm/mps2-tz.c
23
+++ b/include/hw/net/imx_fec.h
19
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
24
@@ -XXX,XX +XXX,XX @@ typedef struct IMXFECState {
20
exit(EXIT_FAILURE);
25
uint32_t phy_advertise;
26
uint32_t phy_int;
27
uint32_t phy_int_mask;
28
+ uint32_t phy_num;
29
30
bool is_fec;
31
32
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/net/imx_fec.c
35
+++ b/hw/net/imx_fec.c
36
@@ -XXX,XX +XXX,XX @@ static void imx_phy_reset(IMXFECState *s)
37
static uint32_t imx_phy_read(IMXFECState *s, int reg)
38
{
39
uint32_t val;
40
+ uint32_t phy = reg / 32;
41
42
- if (reg > 31) {
43
- /* we only advertise one phy */
44
+ if (phy != s->phy_num) {
45
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s.phy]%s: Bad phy num %u\n",
46
+ TYPE_IMX_FEC, __func__, phy);
47
return 0;
21
}
48
}
22
49
23
- sysbus_init_child_obj(OBJECT(machine), "iotkit", &mms->iotkit,
50
+ reg %= 32;
24
+ sysbus_init_child_obj(OBJECT(machine), TYPE_IOTKIT, &mms->iotkit,
51
+
25
sizeof(mms->iotkit), mmc->armsse_type);
52
switch (reg) {
26
iotkitdev = DEVICE(&mms->iotkit);
53
case 0: /* Basic Control */
27
object_property_set_link(OBJECT(&mms->iotkit), OBJECT(system_memory),
54
val = s->phy_control;
55
@@ -XXX,XX +XXX,XX @@ static uint32_t imx_phy_read(IMXFECState *s, int reg)
56
break;
57
}
58
59
- trace_imx_phy_read(val, reg);
60
+ trace_imx_phy_read(val, phy, reg);
61
62
return val;
63
}
64
65
static void imx_phy_write(IMXFECState *s, int reg, uint32_t val)
66
{
67
- trace_imx_phy_write(val, reg);
68
+ uint32_t phy = reg / 32;
69
70
- if (reg > 31) {
71
- /* we only advertise one phy */
72
+ if (phy != s->phy_num) {
73
+ qemu_log_mask(LOG_GUEST_ERROR, "[%s.phy]%s: Bad phy num %u\n",
74
+ TYPE_IMX_FEC, __func__, phy);
75
return;
76
}
77
78
+ reg %= 32;
79
+
80
+ trace_imx_phy_write(val, phy, reg);
81
+
82
switch (reg) {
83
case 0: /* Basic Control */
84
if (val & 0x8000) {
85
@@ -XXX,XX +XXX,XX @@ static void imx_eth_write(void *opaque, hwaddr offset, uint64_t value,
86
extract32(value,
87
18, 10)));
88
} else {
89
- /* This a write operation */
90
+ /* This is a write operation */
91
imx_phy_write(s, extract32(value, 18, 10), extract32(value, 0, 16));
92
}
93
/* raise the interrupt as the PHY operation is done */
94
@@ -XXX,XX +XXX,XX @@ static void imx_eth_realize(DeviceState *dev, Error **errp)
95
static Property imx_eth_properties[] = {
96
DEFINE_NIC_PROPERTIES(IMXFECState, conf),
97
DEFINE_PROP_UINT32("tx-ring-num", IMXFECState, tx_ring_num, 1),
98
+ DEFINE_PROP_UINT32("phy-num", IMXFECState, phy_num, 0),
99
DEFINE_PROP_END_OF_LIST(),
100
};
101
102
diff --git a/hw/net/trace-events b/hw/net/trace-events
103
index XXXXXXX..XXXXXXX 100644
104
--- a/hw/net/trace-events
105
+++ b/hw/net/trace-events
106
@@ -XXX,XX +XXX,XX @@ i82596_set_multicast(uint16_t count) "Added %d multicast entries"
107
i82596_channel_attention(void *s) "%p: Received CHANNEL ATTENTION"
108
109
# imx_fec.c
110
-imx_phy_read(uint32_t val, int reg) "0x%04"PRIx32" <= reg[%d]"
111
-imx_phy_write(uint32_t val, int reg) "0x%04"PRIx32" => reg[%d]"
112
+imx_phy_read(uint32_t val, int phy, int reg) "0x%04"PRIx32" <= phy[%d].reg[%d]"
113
+imx_phy_write(uint32_t val, int phy, int reg) "0x%04"PRIx32" => phy[%d].reg[%d]"
114
imx_phy_update_link(const char *s) "%s"
115
imx_phy_reset(void) ""
116
imx_fec_read_bd(uint64_t addr, int flags, int len, int data) "tx_bd 0x%"PRIx64" flags 0x%04x len %d data 0x%08x"
28
--
117
--
29
2.20.1
118
2.20.1
30
119
31
120
diff view generated by jsdifflib
1
We're going to want at least some of the NeonGen* typedefs
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
for the refactored 32-bit Neon decoder, so move them all
3
to translate.h since it makes more sense to keep them in
4
one group.
5
2
3
Add properties to the i.MX6UL processor to be able to select a
4
particular PHY on the MDIO bus for each FEC device.
5
6
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
7
Message-id: ea1d604198b6b73ea6521676e45bacfc597aba53.1593296112.git.jcd@tribudubois.net
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20200430181003.21682-23-peter.maydell@linaro.org
9
---
10
---
10
target/arm/translate.h | 17 +++++++++++++++++
11
include/hw/arm/fsl-imx6ul.h | 2 ++
11
target/arm/translate-a64.c | 17 -----------------
12
hw/arm/fsl-imx6ul.c | 10 ++++++++++
12
2 files changed, 17 insertions(+), 17 deletions(-)
13
2 files changed, 12 insertions(+)
13
14
14
diff --git a/target/arm/translate.h b/target/arm/translate.h
15
diff --git a/include/hw/arm/fsl-imx6ul.h b/include/hw/arm/fsl-imx6ul.h
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate.h
17
--- a/include/hw/arm/fsl-imx6ul.h
17
+++ b/target/arm/translate.h
18
+++ b/include/hw/arm/fsl-imx6ul.h
18
@@ -XXX,XX +XXX,XX @@ typedef void GVecGen3Fn(unsigned, uint32_t, uint32_t,
19
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6ULState {
19
typedef void GVecGen4Fn(unsigned, uint32_t, uint32_t, uint32_t,
20
MemoryRegion caam;
20
uint32_t, uint32_t, uint32_t);
21
MemoryRegion ocram;
21
22
MemoryRegion ocram_alias;
22
+/* Function prototype for gen_ functions for calling Neon helpers */
23
+typedef void NeonGenOneOpEnvFn(TCGv_i32, TCGv_ptr, TCGv_i32);
24
+typedef void NeonGenTwoOpFn(TCGv_i32, TCGv_i32, TCGv_i32);
25
+typedef void NeonGenTwoOpEnvFn(TCGv_i32, TCGv_ptr, TCGv_i32, TCGv_i32);
26
+typedef void NeonGenTwo64OpFn(TCGv_i64, TCGv_i64, TCGv_i64);
27
+typedef void NeonGenTwo64OpEnvFn(TCGv_i64, TCGv_ptr, TCGv_i64, TCGv_i64);
28
+typedef void NeonGenNarrowFn(TCGv_i32, TCGv_i64);
29
+typedef void NeonGenNarrowEnvFn(TCGv_i32, TCGv_ptr, TCGv_i64);
30
+typedef void NeonGenWidenFn(TCGv_i64, TCGv_i32);
31
+typedef void NeonGenTwoSingleOPFn(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr);
32
+typedef void NeonGenTwoDoubleOPFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_ptr);
33
+typedef void NeonGenOneOpFn(TCGv_i64, TCGv_i64);
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
+
23
+
39
#endif /* TARGET_ARM_TRANSLATE_H */
24
+ uint32_t phy_num[FSL_IMX6UL_NUM_ETHS];
40
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
25
} FslIMX6ULState;
26
27
enum FslIMX6ULMemoryMap {
28
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
41
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/translate-a64.c
30
--- a/hw/arm/fsl-imx6ul.c
43
+++ b/target/arm/translate-a64.c
31
+++ b/hw/arm/fsl-imx6ul.c
44
@@ -XXX,XX +XXX,XX @@ typedef struct AArch64DecodeTable {
32
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
45
AArch64DecodeFn *disas_fn;
33
FSL_IMX6UL_ENET2_TIMER_IRQ,
46
} AArch64DecodeTable;
34
};
47
35
48
-/* Function prototype for gen_ functions for calling Neon helpers */
36
+ object_property_set_uint(OBJECT(&s->eth[i]),
49
-typedef void NeonGenOneOpEnvFn(TCGv_i32, TCGv_ptr, TCGv_i32);
37
+ s->phy_num[i],
50
-typedef void NeonGenTwoOpFn(TCGv_i32, TCGv_i32, TCGv_i32);
38
+ "phy-num", &error_abort);
51
-typedef void NeonGenTwoOpEnvFn(TCGv_i32, TCGv_ptr, TCGv_i32, TCGv_i32);
39
object_property_set_uint(OBJECT(&s->eth[i]),
52
-typedef void NeonGenTwo64OpFn(TCGv_i64, TCGv_i64, TCGv_i64);
40
FSL_IMX6UL_ETH_NUM_TX_RINGS,
53
-typedef void NeonGenTwo64OpEnvFn(TCGv_i64, TCGv_ptr, TCGv_i64, TCGv_i64);
41
"tx-ring-num", &error_abort);
54
-typedef void NeonGenNarrowFn(TCGv_i32, TCGv_i64);
42
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
55
-typedef void NeonGenNarrowEnvFn(TCGv_i32, TCGv_ptr, TCGv_i64);
43
FSL_IMX6UL_OCRAM_ALIAS_ADDR, &s->ocram_alias);
56
-typedef void NeonGenWidenFn(TCGv_i64, TCGv_i32);
44
}
57
-typedef void NeonGenTwoSingleOPFn(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr);
45
58
-typedef void NeonGenTwoDoubleOPFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_ptr);
46
+static Property fsl_imx6ul_properties[] = {
59
-typedef void NeonGenOneOpFn(TCGv_i64, TCGv_i64);
47
+ DEFINE_PROP_UINT32("fec1-phy-num", FslIMX6ULState, phy_num[0], 0),
60
-typedef void CryptoTwoOpFn(TCGv_ptr, TCGv_ptr);
48
+ DEFINE_PROP_UINT32("fec2-phy-num", FslIMX6ULState, phy_num[1], 1),
61
-typedef void CryptoThreeOpIntFn(TCGv_ptr, TCGv_ptr, TCGv_i32);
49
+ DEFINE_PROP_END_OF_LIST(),
62
-typedef void CryptoThreeOpFn(TCGv_ptr, TCGv_ptr, TCGv_ptr);
50
+};
63
-typedef void AtomicThreeOpFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGArg, MemOp);
51
+
64
-
52
static void fsl_imx6ul_class_init(ObjectClass *oc, void *data)
65
/* initialize TCG globals. */
66
void a64_translate_init(void)
67
{
53
{
54
DeviceClass *dc = DEVICE_CLASS(oc);
55
56
+ device_class_set_props(dc, fsl_imx6ul_properties);
57
dc->realize = fsl_imx6ul_realize;
58
dc->desc = "i.MX6UL SOC";
59
/* Reason: Uses serial_hds and nd_table in realize() directly */
68
--
60
--
69
2.20.1
61
2.20.1
70
62
71
63
diff view generated by jsdifflib
1
From: Fredrik Strupe <fredrik@strupe.net>
1
From: Jean-Christophe Dubois <jcd@tribudubois.net>
2
2
3
According to Arm ARM, VQDMULL is only valid when U=0, while having
3
The i.MX6UL EVK 14x14 board uses:
4
U=1 is unallocated.
4
- PHY 2 for FEC 1
5
- PHY 1 for FEC 2
5
6
6
Signed-off-by: Fredrik Strupe <fredrik@strupe.net>
7
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
7
Fixes: 695272dcb976 ("target-arm: Handle UNDEF cases for Neon 3-regs-different-widths")
8
Message-id: fb41992126c091a71d76ab3d1898959091f60583.1593296112.git.jcd@tribudubois.net
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
target/arm/translate.c | 2 +-
12
hw/arm/mcimx6ul-evk.c | 2 ++
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
1 file changed, 2 insertions(+)
13
14
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
15
diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate.c
17
--- a/hw/arm/mcimx6ul-evk.c
17
+++ b/target/arm/translate.c
18
+++ b/hw/arm/mcimx6ul-evk.c
18
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
19
@@ -XXX,XX +XXX,XX @@ static void mcimx6ul_evk_init(MachineState *machine)
19
{0, 0, 0, 0}, /* VMLSL */
20
20
{0, 0, 0, 9}, /* VQDMLSL */
21
s = FSL_IMX6UL(object_new(TYPE_FSL_IMX6UL));
21
{0, 0, 0, 0}, /* Integer VMULL */
22
object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
22
- {0, 0, 0, 1}, /* VQDMULL */
23
+ object_property_set_uint(OBJECT(s), 2, "fec1-phy-num", &error_fatal);
23
+ {0, 0, 0, 9}, /* VQDMULL */
24
+ object_property_set_uint(OBJECT(s), 1, "fec2-phy-num", &error_fatal);
24
{0, 0, 0, 0xa}, /* Polynomial VMULL */
25
qdev_realize(DEVICE(s), NULL, &error_fatal);
25
{0, 0, 0, 7}, /* Reserved: always UNDEF */
26
26
};
27
memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_MMDC_ADDR,
27
--
28
--
28
2.20.1
29
2.20.1
29
30
30
31
diff view generated by jsdifflib
1
Convert the Neon "load single structure to all lanes" insns to
1
From: Eric Auger <eric.auger@redhat.com>
2
decodetree.
3
2
3
Introduce a new property defining a reserved region:
4
<low address>:<high address>:<type>.
5
6
This will be used to encode reserved IOVA regions.
7
8
For instance, in virtio-iommu use case, reserved IOVA regions
9
will be passed by the machine code to the virtio-iommu-pci
10
device (an array of those). The type of the reserved region
11
will match the virtio_iommu_probe_resv_mem subtype value:
12
- VIRTIO_IOMMU_RESV_MEM_T_RESERVED (0)
13
- VIRTIO_IOMMU_RESV_MEM_T_MSI (1)
14
15
on PC/Q35 machine, this will be used to inform the
16
virtio-iommu-pci device it should bypass the MSI region.
17
The reserved region will be: 0xfee00000:0xfeefffff:1.
18
19
On ARM, we can declare the ITS MSI doorbell as an MSI
20
region to prevent MSIs from being mapped on guest side.
21
22
Signed-off-by: Eric Auger <eric.auger@redhat.com>
23
Reviewed-by: Markus Armbruster <armbru@redhat.com>
24
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
25
Message-id: 20200629070404.10969-2-eric.auger@redhat.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
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
---
27
---
8
target/arm/neon-ls.decode | 5 +++
28
include/exec/memory.h | 6 +++
9
target/arm/translate-neon.inc.c | 73 +++++++++++++++++++++++++++++++++
29
include/hw/qdev-properties.h | 3 ++
10
target/arm/translate.c | 55 +------------------------
30
include/qemu/typedefs.h | 1 +
11
3 files changed, 80 insertions(+), 53 deletions(-)
31
hw/core/qdev-properties.c | 89 ++++++++++++++++++++++++++++++++++++
32
4 files changed, 99 insertions(+)
12
33
13
diff --git a/target/arm/neon-ls.decode b/target/arm/neon-ls.decode
34
diff --git a/include/exec/memory.h b/include/exec/memory.h
14
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-ls.decode
36
--- a/include/exec/memory.h
16
+++ b/target/arm/neon-ls.decode
37
+++ b/include/exec/memory.h
38
@@ -XXX,XX +XXX,XX @@ extern bool global_dirty_log;
39
40
typedef struct MemoryRegionOps MemoryRegionOps;
41
42
+struct ReservedRegion {
43
+ hwaddr low;
44
+ hwaddr high;
45
+ unsigned type;
46
+};
47
+
48
typedef struct IOMMUTLBEntry IOMMUTLBEntry;
49
50
/* See address_space_translate: bit 0 is read, bit 1 is write. */
51
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
52
index XXXXXXX..XXXXXXX 100644
53
--- a/include/hw/qdev-properties.h
54
+++ b/include/hw/qdev-properties.h
55
@@ -XXX,XX +XXX,XX @@ extern const PropertyInfo qdev_prop_string;
56
extern const PropertyInfo qdev_prop_chr;
57
extern const PropertyInfo qdev_prop_tpm;
58
extern const PropertyInfo qdev_prop_macaddr;
59
+extern const PropertyInfo qdev_prop_reserved_region;
60
extern const PropertyInfo qdev_prop_on_off_auto;
61
extern const PropertyInfo qdev_prop_multifd_compression;
62
extern const PropertyInfo qdev_prop_losttickpolicy;
63
@@ -XXX,XX +XXX,XX @@ extern const PropertyInfo qdev_prop_pcie_link_width;
64
DEFINE_PROP(_n, _s, _f, qdev_prop_drive_iothread, BlockBackend *)
65
#define DEFINE_PROP_MACADDR(_n, _s, _f) \
66
DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr)
67
+#define DEFINE_PROP_RESERVED_REGION(_n, _s, _f) \
68
+ DEFINE_PROP(_n, _s, _f, qdev_prop_reserved_region, ReservedRegion)
69
#define DEFINE_PROP_ON_OFF_AUTO(_n, _s, _f, _d) \
70
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_on_off_auto, OnOffAuto)
71
#define DEFINE_PROP_MULTIFD_COMPRESSION(_n, _s, _f, _d) \
72
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
73
index XXXXXXX..XXXXXXX 100644
74
--- a/include/qemu/typedefs.h
75
+++ b/include/qemu/typedefs.h
76
@@ -XXX,XX +XXX,XX @@ typedef struct ISABus ISABus;
77
typedef struct ISADevice ISADevice;
78
typedef struct IsaDma IsaDma;
79
typedef struct MACAddr MACAddr;
80
+typedef struct ReservedRegion ReservedRegion;
81
typedef struct MachineClass MachineClass;
82
typedef struct MachineState MachineState;
83
typedef struct MemoryListener MemoryListener;
84
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/hw/core/qdev-properties.c
87
+++ b/hw/core/qdev-properties.c
17
@@ -XXX,XX +XXX,XX @@
88
@@ -XXX,XX +XXX,XX @@
18
89
#include "chardev/char.h"
19
VLDST_multiple 1111 0100 0 . l:1 0 rn:4 .... itype:4 size:2 align:2 rm:4 \
90
#include "qemu/uuid.h"
20
vd=%vd_dp
91
#include "qemu/units.h"
92
+#include "qemu/cutils.h"
93
94
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
95
Error **errp)
96
@@ -XXX,XX +XXX,XX @@ const PropertyInfo qdev_prop_macaddr = {
97
.set = set_mac,
98
};
99
100
+/* --- Reserved Region --- */
21
+
101
+
22
+# Neon load single element to all lanes
102
+/*
103
+ * Accepted syntax:
104
+ * <low address>:<high address>:<type>
105
+ * where low/high addresses are uint64_t in hexadecimal
106
+ * and type is a non-negative decimal integer
107
+ */
108
+static void get_reserved_region(Object *obj, Visitor *v, const char *name,
109
+ void *opaque, Error **errp)
110
+{
111
+ DeviceState *dev = DEVICE(obj);
112
+ Property *prop = opaque;
113
+ ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);
114
+ char buffer[64];
115
+ char *p = buffer;
116
+ int rc;
23
+
117
+
24
+VLD_all_lanes 1111 0100 1 . 1 0 rn:4 .... 11 n:2 size:2 t:1 a:1 rm:4 \
118
+ rc = snprintf(buffer, sizeof(buffer), "0x%"PRIx64":0x%"PRIx64":%u",
25
+ vd=%vd_dp
119
+ rr->low, rr->high, rr->type);
26
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
120
+ assert(rc < sizeof(buffer));
27
index XXXXXXX..XXXXXXX 100644
28
--- a/target/arm/translate-neon.inc.c
29
+++ b/target/arm/translate-neon.inc.c
30
@@ -XXX,XX +XXX,XX @@ static bool trans_VLDST_multiple(DisasContext *s, arg_VLDST_multiple *a)
31
gen_neon_ldst_base_update(s, a->rm, a->rn, nregs * interleave * 8);
32
return true;
33
}
34
+
121
+
35
+static bool trans_VLD_all_lanes(DisasContext *s, arg_VLD_all_lanes *a)
122
+ visit_type_str(v, name, &p, errp);
123
+}
124
+
125
+static void set_reserved_region(Object *obj, Visitor *v, const char *name,
126
+ void *opaque, Error **errp)
36
+{
127
+{
37
+ /* Neon load single structure to all lanes */
128
+ DeviceState *dev = DEVICE(obj);
38
+ int reg, stride, vec_size;
129
+ Property *prop = opaque;
39
+ int vd = a->vd;
130
+ ReservedRegion *rr = qdev_get_prop_ptr(dev, prop);
40
+ int size = a->size;
131
+ Error *local_err = NULL;
41
+ int nregs = a->n + 1;
132
+ const char *endptr;
42
+ TCGv_i32 addr, tmp;
133
+ char *str;
134
+ int ret;
43
+
135
+
44
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
136
+ if (dev->realized) {
45
+ return false;
137
+ qdev_prop_set_after_realize(dev, name, errp);
138
+ return;
46
+ }
139
+ }
47
+
140
+
48
+ /* UNDEF accesses to D16-D31 if they don't exist */
141
+ visit_type_str(v, name, &str, &local_err);
49
+ if (!dc_isar_feature(aa32_simd_r32, s) && (a->vd & 0x10)) {
142
+ if (local_err) {
50
+ return false;
143
+ error_propagate(errp, local_err);
144
+ return;
51
+ }
145
+ }
52
+
146
+
53
+ if (size == 3) {
147
+ ret = qemu_strtou64(str, &endptr, 16, &rr->low);
54
+ if (nregs != 4 || a->a == 0) {
148
+ if (ret) {
55
+ return false;
149
+ error_setg(errp, "start address of '%s'"
56
+ }
150
+ " must be a hexadecimal integer", name);
57
+ /* For VLD4 size == 3 a == 1 means 32 bits at 16 byte alignment */
151
+ goto out;
58
+ size = 2;
59
+ }
152
+ }
60
+ if (nregs == 1 && a->a == 1 && size == 0) {
153
+ if (*endptr != ':') {
61
+ return false;
154
+ goto separator_error;
62
+ }
63
+ if (nregs == 3 && a->a == 1) {
64
+ return false;
65
+ }
155
+ }
66
+
156
+
67
+ if (!vfp_access_check(s)) {
157
+ ret = qemu_strtou64(endptr + 1, &endptr, 16, &rr->high);
68
+ return true;
158
+ if (ret) {
159
+ error_setg(errp, "end address of '%s'"
160
+ " must be a hexadecimal integer", name);
161
+ goto out;
162
+ }
163
+ if (*endptr != ':') {
164
+ goto separator_error;
69
+ }
165
+ }
70
+
166
+
71
+ /*
167
+ ret = qemu_strtoui(endptr + 1, &endptr, 10, &rr->type);
72
+ * VLD1 to all lanes: T bit indicates how many Dregs to write.
168
+ if (ret) {
73
+ * VLD2/3/4 to all lanes: T bit indicates register stride.
169
+ error_setg(errp, "type of '%s'"
74
+ */
170
+ " must be a non-negative decimal integer", name);
75
+ stride = a->t ? 2 : 1;
171
+ }
76
+ vec_size = nregs == 1 ? stride * 8 : 8;
172
+ goto out;
77
+
173
+
78
+ tmp = tcg_temp_new_i32();
174
+separator_error:
79
+ addr = tcg_temp_new_i32();
175
+ error_setg(errp, "reserved region fields must be separated with ':'");
80
+ load_reg_var(s, addr, a->rn);
176
+out:
81
+ for (reg = 0; reg < nregs; reg++) {
177
+ g_free(str);
82
+ gen_aa32_ld_i32(s, tmp, addr, get_mem_index(s),
178
+ return;
83
+ s->be_data | size);
179
+}
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
+
180
+
103
+ gen_neon_ldst_base_update(s, a->rm, a->rn, (1 << size) * nregs);
181
+const PropertyInfo qdev_prop_reserved_region = {
182
+ .name = "reserved_region",
183
+ .description = "Reserved Region, example: 0xFEE00000:0xFEEFFFFF:0",
184
+ .get = get_reserved_region,
185
+ .set = set_reserved_region,
186
+};
104
+
187
+
105
+ return true;
188
/* --- on/off/auto --- */
106
+}
189
107
diff --git a/target/arm/translate.c b/target/arm/translate.c
190
const PropertyInfo qdev_prop_on_off_auto = {
108
index XXXXXXX..XXXXXXX 100644
109
--- a/target/arm/translate.c
110
+++ b/target/arm/translate.c
111
@@ -XXX,XX +XXX,XX @@ static int disas_neon_ls_insn(DisasContext *s, uint32_t insn)
112
int size;
113
int reg;
114
int load;
115
- int vec_size;
116
TCGv_i32 addr;
117
TCGv_i32 tmp;
118
119
@@ -XXX,XX +XXX,XX @@ static int disas_neon_ls_insn(DisasContext *s, uint32_t insn)
120
} else {
121
size = (insn >> 10) & 3;
122
if (size == 3) {
123
- /* Load single element to all lanes. */
124
- int a = (insn >> 4) & 1;
125
- if (!load) {
126
- return 1;
127
- }
128
- size = (insn >> 6) & 3;
129
- nregs = ((insn >> 8) & 3) + 1;
130
-
131
- if (size == 3) {
132
- if (nregs != 4 || a == 0) {
133
- return 1;
134
- }
135
- /* For VLD4 size==3 a == 1 means 32 bits at 16 byte alignment */
136
- size = 2;
137
- }
138
- if (nregs == 1 && a == 1 && size == 0) {
139
- return 1;
140
- }
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
--
191
--
181
2.20.1
192
2.20.1
182
193
183
194
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Add support for SD.
3
This patch implements the PROBE request. At the moment,
4
4
only THE RESV_MEM property is handled. The first goal is
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
5
to report iommu wide reserved regions such as the MSI regions
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
set by the machine code. On x86 this will be the IOAPIC MSI
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
region, [0xFEE00000 - 0xFEEFFFFF], on ARM this may be the ITS
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
8
doorbell.
9
Message-id: 20200427181649.26851-9-edgar.iglesias@gmail.com
9
10
In the future we may introduce per device reserved regions.
11
This will be useful when protecting host assigned devices
12
which may expose their own reserved regions
13
14
Signed-off-by: Eric Auger <eric.auger@redhat.com>
15
Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
16
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
17
Message-id: 20200629070404.10969-3-eric.auger@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
19
---
12
include/hw/arm/xlnx-versal.h | 12 ++++++++++++
20
include/hw/virtio/virtio-iommu.h | 2 +
13
hw/arm/xlnx-versal.c | 31 +++++++++++++++++++++++++++++++
21
hw/virtio/virtio-iommu.c | 94 ++++++++++++++++++++++++++++++--
14
2 files changed, 43 insertions(+)
22
hw/virtio/trace-events | 1 +
15
23
3 files changed, 93 insertions(+), 4 deletions(-)
16
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
24
25
diff --git a/include/hw/virtio/virtio-iommu.h b/include/hw/virtio/virtio-iommu.h
17
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/xlnx-versal.h
27
--- a/include/hw/virtio/virtio-iommu.h
19
+++ b/include/hw/arm/xlnx-versal.h
28
+++ b/include/hw/virtio/virtio-iommu.h
29
@@ -XXX,XX +XXX,XX @@ typedef struct VirtIOIOMMU {
30
GHashTable *as_by_busptr;
31
IOMMUPciBus *iommu_pcibus_by_bus_num[PCI_BUS_MAX];
32
PCIBus *primary_bus;
33
+ ReservedRegion *reserved_regions;
34
+ uint32_t nb_reserved_regions;
35
GTree *domains;
36
QemuMutex mutex;
37
GTree *endpoints;
38
diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/virtio/virtio-iommu.c
41
+++ b/hw/virtio/virtio-iommu.c
20
@@ -XXX,XX +XXX,XX @@
42
@@ -XXX,XX +XXX,XX @@
21
43
22
#include "hw/sysbus.h"
44
/* Max size */
23
#include "hw/arm/boot.h"
45
#define VIOMMU_DEFAULT_QUEUE_SIZE 256
24
+#include "hw/sd/sdhci.h"
46
+#define VIOMMU_PROBE_SIZE 512
25
#include "hw/intc/arm_gicv3.h"
47
26
#include "hw/char/pl011.h"
48
typedef struct VirtIOIOMMUDomain {
27
#include "hw/dma/xlnx-zdma.h"
49
uint32_t id;
28
@@ -XXX,XX +XXX,XX @@
50
@@ -XXX,XX +XXX,XX @@ static int virtio_iommu_unmap(VirtIOIOMMU *s,
29
#define XLNX_VERSAL_NR_UARTS 2
51
return ret;
30
#define XLNX_VERSAL_NR_GEMS 2
52
}
31
#define XLNX_VERSAL_NR_ADMAS 8
53
32
+#define XLNX_VERSAL_NR_SDS 2
54
+static ssize_t virtio_iommu_fill_resv_mem_prop(VirtIOIOMMU *s, uint32_t ep,
33
#define XLNX_VERSAL_NR_IRQS 192
55
+ uint8_t *buf, size_t free)
34
56
+{
35
typedef struct Versal {
57
+ struct virtio_iommu_probe_resv_mem prop = {};
36
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
58
+ size_t size = sizeof(prop), length = size - sizeof(prop.head), total;
37
} iou;
59
+ int i;
38
} lpd;
60
+
39
61
+ total = size * s->nb_reserved_regions;
40
+ /* The Platform Management Controller subsystem. */
62
+
41
+ struct {
63
+ if (total > free) {
42
+ struct {
64
+ return -ENOSPC;
43
+ SDHCIState sd[XLNX_VERSAL_NR_SDS];
65
+ }
44
+ } iou;
66
+
45
+ } pmc;
67
+ for (i = 0; i < s->nb_reserved_regions; i++) {
46
+
68
+ unsigned subtype = s->reserved_regions[i].type;
47
struct {
69
+
48
MemoryRegion *mr_ddr;
70
+ assert(subtype == VIRTIO_IOMMU_RESV_MEM_T_RESERVED ||
49
uint32_t psci_conduit;
71
+ subtype == VIRTIO_IOMMU_RESV_MEM_T_MSI);
50
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
72
+ prop.head.type = cpu_to_le16(VIRTIO_IOMMU_PROBE_T_RESV_MEM);
51
#define VERSAL_GEM1_IRQ_0 58
73
+ prop.head.length = cpu_to_le16(length);
52
#define VERSAL_GEM1_WAKE_IRQ_0 59
74
+ prop.subtype = subtype;
53
#define VERSAL_ADMA_IRQ_0 60
75
+ prop.start = cpu_to_le64(s->reserved_regions[i].low);
54
+#define VERSAL_SD0_IRQ_0 126
76
+ prop.end = cpu_to_le64(s->reserved_regions[i].high);
55
77
+
56
/* Architecturally reserved IRQs suitable for virtualization. */
78
+ memcpy(buf, &prop, size);
57
#define VERSAL_RSVD_IRQ_FIRST 111
79
+
58
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
80
+ trace_virtio_iommu_fill_resv_property(ep, prop.subtype,
59
#define MM_FPD_CRF 0xfd1a0000U
81
+ prop.start, prop.end);
60
#define MM_FPD_CRF_SIZE 0x140000
82
+ buf += size;
61
83
+ }
62
+#define MM_PMC_SD0 0xf1040000U
84
+ return total;
63
+#define MM_PMC_SD0_SIZE 0x10000
85
+}
64
#define MM_PMC_CRP 0xf1260000U
86
+
65
#define MM_PMC_CRP_SIZE 0x10000
87
+/**
66
#endif
88
+ * virtio_iommu_probe - Fill the probe request buffer with
67
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
89
+ * the properties the device is able to return
68
index XXXXXXX..XXXXXXX 100644
90
+ */
69
--- a/hw/arm/xlnx-versal.c
91
+static int virtio_iommu_probe(VirtIOIOMMU *s,
70
+++ b/hw/arm/xlnx-versal.c
92
+ struct virtio_iommu_req_probe *req,
71
@@ -XXX,XX +XXX,XX @@ static void versal_create_admas(Versal *s, qemu_irq *pic)
93
+ uint8_t *buf)
94
+{
95
+ uint32_t ep_id = le32_to_cpu(req->endpoint);
96
+ size_t free = VIOMMU_PROBE_SIZE;
97
+ ssize_t count;
98
+
99
+ if (!virtio_iommu_mr(s, ep_id)) {
100
+ return VIRTIO_IOMMU_S_NOENT;
101
+ }
102
+
103
+ count = virtio_iommu_fill_resv_mem_prop(s, ep_id, buf, free);
104
+ if (count < 0) {
105
+ return VIRTIO_IOMMU_S_INVAL;
106
+ }
107
+ buf += count;
108
+ free -= count;
109
+
110
+ return VIRTIO_IOMMU_S_OK;
111
+}
112
+
113
static int virtio_iommu_iov_to_req(struct iovec *iov,
114
unsigned int iov_cnt,
115
void *req, size_t req_sz)
116
@@ -XXX,XX +XXX,XX @@ virtio_iommu_handle_req(detach)
117
virtio_iommu_handle_req(map)
118
virtio_iommu_handle_req(unmap)
119
120
+static int virtio_iommu_handle_probe(VirtIOIOMMU *s,
121
+ struct iovec *iov,
122
+ unsigned int iov_cnt,
123
+ uint8_t *buf)
124
+{
125
+ struct virtio_iommu_req_probe req;
126
+ int ret = virtio_iommu_iov_to_req(iov, iov_cnt, &req, sizeof(req));
127
+
128
+ return ret ? ret : virtio_iommu_probe(s, &req, buf);
129
+}
130
+
131
static void virtio_iommu_handle_command(VirtIODevice *vdev, VirtQueue *vq)
132
{
133
VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
134
struct virtio_iommu_req_head head;
135
struct virtio_iommu_req_tail tail = {};
136
+ size_t output_size = sizeof(tail), sz;
137
VirtQueueElement *elem;
138
unsigned int iov_cnt;
139
struct iovec *iov;
140
- size_t sz;
141
+ void *buf = NULL;
142
143
for (;;) {
144
elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
145
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_handle_command(VirtIODevice *vdev, VirtQueue *vq)
146
case VIRTIO_IOMMU_T_UNMAP:
147
tail.status = virtio_iommu_handle_unmap(s, iov, iov_cnt);
148
break;
149
+ case VIRTIO_IOMMU_T_PROBE:
150
+ {
151
+ struct virtio_iommu_req_tail *ptail;
152
+
153
+ output_size = s->config.probe_size + sizeof(tail);
154
+ buf = g_malloc0(output_size);
155
+
156
+ ptail = (struct virtio_iommu_req_tail *)
157
+ (buf + s->config.probe_size);
158
+ ptail->status = virtio_iommu_handle_probe(s, iov, iov_cnt, buf);
159
+ }
160
default:
161
tail.status = VIRTIO_IOMMU_S_UNSUPP;
162
}
163
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_handle_command(VirtIODevice *vdev, VirtQueue *vq)
164
165
out:
166
sz = iov_from_buf(elem->in_sg, elem->in_num, 0,
167
- &tail, sizeof(tail));
168
- assert(sz == sizeof(tail));
169
+ buf ? buf : &tail, output_size);
170
+ assert(sz == output_size);
171
172
- virtqueue_push(vq, elem, sizeof(tail));
173
+ virtqueue_push(vq, elem, sz);
174
virtio_notify(vdev, vq);
175
g_free(elem);
176
+ g_free(buf);
72
}
177
}
73
}
178
}
74
179
75
+#define SDHCI_CAPABILITIES 0x280737ec6481 /* Same as on ZynqMP. */
180
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_device_realize(DeviceState *dev, Error **errp)
76
+static void versal_create_sds(Versal *s, qemu_irq *pic)
181
s->config.page_size_mask = TARGET_PAGE_MASK;
77
+{
182
s->config.input_range.end = -1UL;
78
+ int i;
183
s->config.domain_range.end = 32;
79
+
184
+ s->config.probe_size = VIOMMU_PROBE_SIZE;
80
+ for (i = 0; i < ARRAY_SIZE(s->pmc.iou.sd); i++) {
185
81
+ DeviceState *dev;
186
virtio_add_feature(&s->features, VIRTIO_RING_F_EVENT_IDX);
82
+ MemoryRegion *mr;
187
virtio_add_feature(&s->features, VIRTIO_RING_F_INDIRECT_DESC);
83
+
188
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_device_realize(DeviceState *dev, Error **errp)
84
+ sysbus_init_child_obj(OBJECT(s), "sd[*]",
189
virtio_add_feature(&s->features, VIRTIO_IOMMU_F_MAP_UNMAP);
85
+ &s->pmc.iou.sd[i], sizeof(s->pmc.iou.sd[i]),
190
virtio_add_feature(&s->features, VIRTIO_IOMMU_F_BYPASS);
86
+ TYPE_SYSBUS_SDHCI);
191
virtio_add_feature(&s->features, VIRTIO_IOMMU_F_MMIO);
87
+ dev = DEVICE(&s->pmc.iou.sd[i]);
192
+ virtio_add_feature(&s->features, VIRTIO_IOMMU_F_PROBE);
88
+
193
89
+ object_property_set_uint(OBJECT(dev),
194
qemu_mutex_init(&s->mutex);
90
+ 3, "sd-spec-version", &error_fatal);
195
91
+ object_property_set_uint(OBJECT(dev), SDHCI_CAPABILITIES, "capareg",
196
diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events
92
+ &error_fatal);
197
index XXXXXXX..XXXXXXX 100644
93
+ object_property_set_uint(OBJECT(dev), UHS_I, "uhs", &error_fatal);
198
--- a/hw/virtio/trace-events
94
+ qdev_init_nofail(dev);
199
+++ b/hw/virtio/trace-events
95
+
200
@@ -XXX,XX +XXX,XX @@ virtio_iommu_get_domain(uint32_t domain_id) "Alloc domain=%d"
96
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
201
virtio_iommu_put_domain(uint32_t domain_id) "Free domain=%d"
97
+ memory_region_add_subregion(&s->mr_ps,
202
virtio_iommu_translate_out(uint64_t virt_addr, uint64_t phys_addr, uint32_t sid) "0x%"PRIx64" -> 0x%"PRIx64 " for sid=%d"
98
+ MM_PMC_SD0 + i * MM_PMC_SD0_SIZE, mr);
203
virtio_iommu_report_fault(uint8_t reason, uint32_t flags, uint32_t endpoint, uint64_t addr) "FAULT reason=%d flags=%d endpoint=%d address =0x%"PRIx64
99
+
204
+virtio_iommu_fill_resv_property(uint32_t devid, uint8_t subtype, uint64_t start, uint64_t end) "dev= %d, type=%d start=0x%"PRIx64" end=0x%"PRIx64
100
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
101
+ pic[VERSAL_SD0_IRQ_0 + i * 2]);
102
+ }
103
+}
104
+
105
/* This takes the board allocated linear DDR memory and creates aliases
106
* for each split DDR range/aperture on the Versal address map.
107
*/
108
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
109
versal_create_uarts(s, pic);
110
versal_create_gems(s, pic);
111
versal_create_admas(s, pic);
112
+ versal_create_sds(s, pic);
113
versal_map_ddr(s);
114
versal_unimp(s);
115
116
--
205
--
117
2.20.1
206
2.20.1
118
207
119
208
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Fix typo xlnx-ve -> xlnx-versal.
3
When translating an address we need to check if it belongs to
4
a reserved virtual address range. If it does, there are 2 cases:
4
5
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
- it belongs to a RESERVED region: the guest should neither use
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
this address in a MAP not instruct the end-point to DMA on
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
them. We report an error
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
9
9
Message-id: 20200427181649.26851-4-edgar.iglesias@gmail.com
10
- It belongs to an MSI region: we bypass the translation.
11
12
Signed-off-by: Eric Auger <eric.auger@redhat.com>
13
Reviewed-by: Peter Xu <peterx@redhat.com>
14
Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
15
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
16
Message-id: 20200629070404.10969-4-eric.auger@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
18
---
12
hw/arm/xlnx-versal-virt.c | 2 +-
19
hw/virtio/virtio-iommu.c | 20 ++++++++++++++++++++
13
1 file changed, 1 insertion(+), 1 deletion(-)
20
1 file changed, 20 insertions(+)
14
21
15
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
22
diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
16
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/xlnx-versal-virt.c
24
--- a/hw/virtio/virtio-iommu.c
18
+++ b/hw/arm/xlnx-versal-virt.c
25
+++ b/hw/virtio/virtio-iommu.c
19
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
26
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry virtio_iommu_translate(IOMMUMemoryRegion *mr, hwaddr addr,
20
psci_conduit = QEMU_PSCI_CONDUIT_SMC;
27
uint32_t sid, flags;
28
bool bypass_allowed;
29
bool found;
30
+ int i;
31
32
interval.low = addr;
33
interval.high = addr + 1;
34
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry virtio_iommu_translate(IOMMUMemoryRegion *mr, hwaddr addr,
35
goto unlock;
21
}
36
}
22
37
23
- sysbus_init_child_obj(OBJECT(machine), "xlnx-ve", &s->soc,
38
+ for (i = 0; i < s->nb_reserved_regions; i++) {
24
+ sysbus_init_child_obj(OBJECT(machine), "xlnx-versal", &s->soc,
39
+ ReservedRegion *reg = &s->reserved_regions[i];
25
sizeof(s->soc), TYPE_XLNX_VERSAL);
40
+
26
object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
41
+ if (addr >= reg->low && addr <= reg->high) {
27
"ddr", &error_abort);
42
+ switch (reg->type) {
43
+ case VIRTIO_IOMMU_RESV_MEM_T_MSI:
44
+ entry.perm = flag;
45
+ break;
46
+ case VIRTIO_IOMMU_RESV_MEM_T_RESERVED:
47
+ default:
48
+ virtio_iommu_report_fault(s, VIRTIO_IOMMU_FAULT_R_MAPPING,
49
+ VIRTIO_IOMMU_FAULT_F_ADDRESS,
50
+ sid, addr);
51
+ break;
52
+ }
53
+ goto unlock;
54
+ }
55
+ }
56
+
57
if (!ep->domain) {
58
if (!bypass_allowed) {
59
error_report_once("%s %02x:%02x.%01x not attached to any domain",
28
--
60
--
29
2.20.1
61
2.20.1
30
62
31
63
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Embed the GEMs into the SoC type.
3
The machine may need to pass reserved regions to the
4
virtio-iommu-pci device (such as the MSI window on x86
5
or the MSI doorbells on ARM).
4
6
5
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
7
So let's add an array of Interval properties.
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Note: if some reserved regions are already set by the
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
machine code - which should be the case in general -,
9
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
11
the length of the property array is already set and
10
Message-id: 20200427181649.26851-6-edgar.iglesias@gmail.com
12
prevents the end-user from modifying them. For example,
13
attempting to use:
14
15
-device virtio-iommu-pci,\
16
len-reserved-regions=1,reserved-regions[0]=0xfee00000:0xfeefffff:1
17
18
would result in the following error message:
19
20
qemu-system-aarch64: -device virtio-iommu-pci,addr=0xa,
21
len-reserved-regions=1,reserved-regions[0]=0xfee00000:0xfeefffff:1:
22
array size property len-reserved-regions may not be set more than once
23
24
Otherwise, for example, adding two reserved regions is achieved
25
using the following options:
26
27
-device virtio-iommu-pci,addr=0xa,len-reserved-regions=2,\
28
reserved-regions[0]=0xfee00000:0xfeefffff:1,\
29
reserved-regions[1]=0x1000000:100ffff:1
30
31
Signed-off-by: Eric Auger <eric.auger@redhat.com>
32
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
33
Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
34
Reviewed-by: Peter Xu <peterx@redhat.com>
35
Message-id: 20200629070404.10969-5-eric.auger@redhat.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
36
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
37
---
13
include/hw/arm/xlnx-versal.h | 3 ++-
38
hw/virtio/virtio-iommu-pci.c | 11 +++++++++++
14
hw/arm/xlnx-versal.c | 15 ++++++++-------
39
1 file changed, 11 insertions(+)
15
2 files changed, 10 insertions(+), 8 deletions(-)
16
40
17
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
41
diff --git a/hw/virtio/virtio-iommu-pci.c b/hw/virtio/virtio-iommu-pci.c
18
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/xlnx-versal.h
43
--- a/hw/virtio/virtio-iommu-pci.c
20
+++ b/include/hw/arm/xlnx-versal.h
44
+++ b/hw/virtio/virtio-iommu-pci.c
21
@@ -XXX,XX +XXX,XX @@
45
@@ -XXX,XX +XXX,XX @@ struct VirtIOIOMMUPCI {
22
#include "hw/arm/boot.h"
46
23
#include "hw/intc/arm_gicv3.h"
47
static Property virtio_iommu_pci_properties[] = {
24
#include "hw/char/pl011.h"
48
DEFINE_PROP_UINT32("class", VirtIOPCIProxy, class_code, 0),
25
+#include "hw/net/cadence_gem.h"
49
+ DEFINE_PROP_ARRAY("reserved-regions", VirtIOIOMMUPCI,
26
50
+ vdev.nb_reserved_regions, vdev.reserved_regions,
27
#define TYPE_XLNX_VERSAL "xlnx-versal"
51
+ qdev_prop_reserved_region, ReservedRegion),
28
#define XLNX_VERSAL(obj) OBJECT_CHECK(Versal, (obj), TYPE_XLNX_VERSAL)
52
DEFINE_PROP_END_OF_LIST(),
29
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
53
};
30
54
31
struct {
55
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
32
PL011State uart[XLNX_VERSAL_NR_UARTS];
56
{
33
- SysBusDevice *gem[XLNX_VERSAL_NR_GEMS];
57
VirtIOIOMMUPCI *dev = VIRTIO_IOMMU_PCI(vpci_dev);
34
+ CadenceGEMState gem[XLNX_VERSAL_NR_GEMS];
58
DeviceState *vdev = DEVICE(&dev->vdev);
35
SysBusDevice *adma[XLNX_VERSAL_NR_ADMAS];
59
+ VirtIOIOMMU *s = VIRTIO_IOMMU(vdev);
36
} iou;
60
37
} lpd;
61
if (!qdev_get_machine_hotplug_handler(DEVICE(vpci_dev))) {
38
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
62
MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
39
index XXXXXXX..XXXXXXX 100644
63
@@ -XXX,XX +XXX,XX @@ static void virtio_iommu_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
40
--- a/hw/arm/xlnx-versal.c
64
"-no-acpi\n");
41
+++ b/hw/arm/xlnx-versal.c
65
return;
42
@@ -XXX,XX +XXX,XX @@ static void versal_create_gems(Versal *s, qemu_irq *pic)
43
DeviceState *dev;
44
MemoryRegion *mr;
45
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
}
66
}
75
}
67
+ for (int i = 0; i < s->nb_reserved_regions; i++) {
68
+ if (s->reserved_regions[i].type != VIRTIO_IOMMU_RESV_MEM_T_RESERVED &&
69
+ s->reserved_regions[i].type != VIRTIO_IOMMU_RESV_MEM_T_MSI) {
70
+ error_setg(errp, "reserved region %d has an invalid type", i);
71
+ error_append_hint(errp, "Valid values are 0 and 1\n");
72
+ }
73
+ }
74
object_property_set_link(OBJECT(dev),
75
OBJECT(pci_get_bus(&vpci_dev->pci_dev)),
76
"primary-bus", &error_abort);
76
--
77
--
77
2.20.1
78
2.20.1
78
79
79
80
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Eric Auger <eric.auger@redhat.com>
2
2
3
Embed the APUs into the SoC type.
3
At the moment the virtio-iommu translates MSI transactions.
4
This behavior is inherited from ARM SMMU. The virt machine
5
code knows where the guest MSI doorbells are so we can easily
6
declare those regions as VIRTIO_IOMMU_RESV_MEM_T_MSI. With that
7
setting the guest will not map MSIs through the IOMMU and those
8
transactions will be simply bypassed.
4
9
5
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
10
Depending on which MSI controller is in use (ITS or GICV2M),
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
11
we declare either:
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
- the ITS interrupt translation space (ITS_base + 0x10000),
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
containing the GITS_TRANSLATOR or
9
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
14
- The GICV2M single frame, containing the MSI_SETSP_NS register.
10
Message-id: 20200427181649.26851-8-edgar.iglesias@gmail.com
15
16
Signed-off-by: Eric Auger <eric.auger@redhat.com>
17
Message-id: 20200629070404.10969-6-eric.auger@redhat.com
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
20
---
13
include/hw/arm/xlnx-versal.h | 2 +-
21
include/hw/arm/virt.h | 7 +++++++
14
hw/arm/xlnx-versal-virt.c | 4 ++--
22
hw/arm/virt.c | 30 ++++++++++++++++++++++++++++++
15
hw/arm/xlnx-versal.c | 19 +++++--------------
23
2 files changed, 37 insertions(+)
16
3 files changed, 8 insertions(+), 17 deletions(-)
17
24
18
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
25
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
19
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/arm/xlnx-versal.h
27
--- a/include/hw/arm/virt.h
21
+++ b/include/hw/arm/xlnx-versal.h
28
+++ b/include/hw/arm/virt.h
22
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
29
@@ -XXX,XX +XXX,XX @@ typedef enum VirtIOMMUType {
23
struct {
30
VIRT_IOMMU_VIRTIO,
24
struct {
31
} VirtIOMMUType;
25
MemoryRegion mr;
32
26
- ARMCPU *cpu[XLNX_VERSAL_NR_ACPUS];
33
+typedef enum VirtMSIControllerType {
27
+ ARMCPU cpu[XLNX_VERSAL_NR_ACPUS];
34
+ VIRT_MSI_CTRL_NONE,
28
GICv3State gic;
35
+ VIRT_MSI_CTRL_GICV2M,
29
} apu;
36
+ VIRT_MSI_CTRL_ITS,
30
} fpd;
37
+} VirtMSIControllerType;
31
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
38
+
39
typedef enum VirtGICType {
40
VIRT_GIC_VERSION_MAX,
41
VIRT_GIC_VERSION_HOST,
42
@@ -XXX,XX +XXX,XX @@ typedef struct {
43
OnOffAuto acpi;
44
VirtGICType gic_version;
45
VirtIOMMUType iommu;
46
+ VirtMSIControllerType msi_controller;
47
uint16_t virtio_iommu_bdf;
48
struct arm_boot_info bootinfo;
49
MemMapEntry *memmap;
50
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
32
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/arm/xlnx-versal-virt.c
52
--- a/hw/arm/virt.c
34
+++ b/hw/arm/xlnx-versal-virt.c
53
+++ b/hw/arm/virt.c
35
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
54
@@ -XXX,XX +XXX,XX @@ static void create_its(VirtMachineState *vms)
36
s->binfo.get_dtb = versal_virt_get_dtb;
55
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_GIC_ITS].base);
37
s->binfo.modify_dtb = versal_virt_modify_dtb;
56
38
if (machine->kernel_filename) {
57
fdt_add_its_gic_node(vms);
39
- arm_load_kernel(s->soc.fpd.apu.cpu[0], machine, &s->binfo);
58
+ vms->msi_controller = VIRT_MSI_CTRL_ITS;
40
+ arm_load_kernel(&s->soc.fpd.apu.cpu[0], machine, &s->binfo);
59
}
41
} else {
60
42
- AddressSpace *as = arm_boot_address_space(s->soc.fpd.apu.cpu[0],
61
static void create_v2m(VirtMachineState *vms)
43
+ AddressSpace *as = arm_boot_address_space(&s->soc.fpd.apu.cpu[0],
62
@@ -XXX,XX +XXX,XX @@ static void create_v2m(VirtMachineState *vms)
44
&s->binfo);
63
}
45
/* Some boot-loaders (e.g u-boot) don't like blobs at address 0 (NULL).
64
46
* Offset things by 4K. */
65
fdt_add_v2m_gic_node(vms);
47
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
66
+ vms->msi_controller = VIRT_MSI_CTRL_GICV2M;
48
index XXXXXXX..XXXXXXX 100644
67
}
49
--- a/hw/arm/xlnx-versal.c
68
50
+++ b/hw/arm/xlnx-versal.c
69
static void create_gic(VirtMachineState *vms)
51
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
70
@@ -XXX,XX +XXX,XX @@ out:
52
71
static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
53
for (i = 0; i < ARRAY_SIZE(s->fpd.apu.cpu); i++) {
72
DeviceState *dev, Error **errp)
54
Object *obj;
73
{
55
- char *name;
74
+ VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
56
-
75
+
57
- obj = object_new(XLNX_VERSAL_ACPU_TYPE);
76
if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
58
- if (!obj) {
77
virt_memory_pre_plug(hotplug_dev, dev, errp);
59
- error_report("Unable to create apu.cpu[%d] of type %s",
78
+ } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
60
- i, XLNX_VERSAL_ACPU_TYPE);
79
+ hwaddr db_start = 0, db_end = 0;
61
- exit(EXIT_FAILURE);
80
+ char *resv_prop_str;
62
- }
81
+
63
-
82
+ switch (vms->msi_controller) {
64
- name = g_strdup_printf("apu-cpu[%d]", i);
83
+ case VIRT_MSI_CTRL_NONE:
65
- object_property_add_child(OBJECT(s), name, obj, &error_fatal);
84
+ return;
66
- g_free(name);
85
+ case VIRT_MSI_CTRL_ITS:
67
86
+ /* GITS_TRANSLATER page */
68
+ object_initialize_child(OBJECT(s), "apu-cpu[*]",
87
+ db_start = base_memmap[VIRT_GIC_ITS].base + 0x10000;
69
+ &s->fpd.apu.cpu[i], sizeof(s->fpd.apu.cpu[i]),
88
+ db_end = base_memmap[VIRT_GIC_ITS].base +
70
+ XLNX_VERSAL_ACPU_TYPE, &error_abort, NULL);
89
+ base_memmap[VIRT_GIC_ITS].size - 1;
71
+ obj = OBJECT(&s->fpd.apu.cpu[i]);
90
+ break;
72
object_property_set_int(obj, s->cfg.psci_conduit,
91
+ case VIRT_MSI_CTRL_GICV2M:
73
"psci-conduit", &error_abort);
92
+ /* MSI_SETSPI_NS page */
74
if (i) {
93
+ db_start = base_memmap[VIRT_GIC_V2M].base;
75
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
94
+ db_end = db_start + base_memmap[VIRT_GIC_V2M].size - 1;
76
object_property_set_link(obj, OBJECT(&s->fpd.apu.mr), "memory",
95
+ break;
77
&error_abort);
96
+ }
78
object_property_set_bool(obj, true, "realized", &error_fatal);
97
+ resv_prop_str = g_strdup_printf("0x%"PRIx64":0x%"PRIx64":%u",
79
- s->fpd.apu.cpu[i] = ARM_CPU(obj);
98
+ db_start, db_end,
99
+ VIRTIO_IOMMU_RESV_MEM_T_MSI);
100
+
101
+ qdev_prop_set_uint32(dev, "len-reserved-regions", 1);
102
+ qdev_prop_set_string(dev, "reserved-regions[0]", resv_prop_str);
103
+ g_free(resv_prop_str);
80
}
104
}
81
}
105
}
82
106
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
--
107
--
93
2.20.1
108
2.20.1
94
109
95
110
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Beata Michalska <beata.michalska@linaro.org>
2
2
3
Add support for the RTC.
3
On ARMv7 & ARMv8 some load/store instructions might trigger a data abort
4
exception with no valid ISS info to be decoded. The lack of decode info
5
makes it at least tricky to emulate those instruction which is one of the
6
(many) reasons why KVM will not even try to do so.
4
7
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Add support for handling those by requesting KVM to inject external
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
dabt into the quest.
7
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
10
8
Message-id: 20200427181649.26851-12-edgar.iglesias@gmail.com
11
Signed-off-by: Beata Michalska <beata.michalska@linaro.org>
12
Reviewed-by: Andrew Jones <drjones@redhat.com>
13
Message-id: 20200629114110.30723-2-beata.michalska@linaro.org
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
target/arm/kvm.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++
12
1 file changed, 22 insertions(+)
17
1 file changed, 52 insertions(+)
13
18
14
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
19
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
15
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/xlnx-versal-virt.c
21
--- a/target/arm/kvm.c
17
+++ b/hw/arm/xlnx-versal-virt.c
22
+++ b/target/arm/kvm.c
18
@@ -XXX,XX +XXX,XX @@ static void fdt_add_sd_nodes(VersalVirt *s)
23
@@ -XXX,XX +XXX,XX @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
24
25
static bool cap_has_mp_state;
26
static bool cap_has_inject_serror_esr;
27
+static bool cap_has_inject_ext_dabt;
28
29
static ARMHostCPUFeatures arm_host_cpu_features;
30
31
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init(MachineState *ms, KVMState *s)
32
ret = -EINVAL;
33
}
34
35
+ if (kvm_check_extension(s, KVM_CAP_ARM_NISV_TO_USER)) {
36
+ if (kvm_vm_enable_cap(s, KVM_CAP_ARM_NISV_TO_USER, 0)) {
37
+ error_report("Failed to enable KVM_CAP_ARM_NISV_TO_USER cap");
38
+ } else {
39
+ /* Set status for supporting the external dabt injection */
40
+ cap_has_inject_ext_dabt = kvm_check_extension(s,
41
+ KVM_CAP_ARM_INJECT_EXT_DABT);
42
+ }
43
+ }
44
+
45
return ret;
46
}
47
48
@@ -XXX,XX +XXX,XX @@ void kvm_arm_vm_state_change(void *opaque, int running, RunState state)
19
}
49
}
20
}
50
}
21
51
22
+static void fdt_add_rtc_node(VersalVirt *s)
52
+/**
53
+ * kvm_arm_handle_dabt_nisv:
54
+ * @cs: CPUState
55
+ * @esr_iss: ISS encoding (limited) for the exception from Data Abort
56
+ * ISV bit set to '0b0' -> no valid instruction syndrome
57
+ * @fault_ipa: faulting address for the synchronous data abort
58
+ *
59
+ * Returns: 0 if the exception has been handled, < 0 otherwise
60
+ */
61
+static int kvm_arm_handle_dabt_nisv(CPUState *cs, uint64_t esr_iss,
62
+ uint64_t fault_ipa)
23
+{
63
+{
24
+ const char compat[] = "xlnx,zynqmp-rtc";
64
+ /*
25
+ const char interrupt_names[] = "alarm\0sec";
65
+ * Request KVM to inject the external data abort into the guest
26
+ char *name = g_strdup_printf("/rtc@%x", MM_PMC_RTC);
66
+ */
27
+
67
+ if (cap_has_inject_ext_dabt) {
28
+ qemu_fdt_add_subnode(s->fdt, name);
68
+ struct kvm_vcpu_events events = { };
29
+
69
+ /*
30
+ qemu_fdt_setprop_cells(s->fdt, name, "interrupts",
70
+ * The external data abort event will be handled immediately by KVM
31
+ GIC_FDT_IRQ_TYPE_SPI, VERSAL_RTC_ALARM_IRQ,
71
+ * using the address fault that triggered the exit on given VCPU.
32
+ GIC_FDT_IRQ_FLAGS_LEVEL_HI,
72
+ * Requesting injection of the external data abort does not rely
33
+ GIC_FDT_IRQ_TYPE_SPI, VERSAL_RTC_SECONDS_IRQ,
73
+ * on any other VCPU state. Therefore, in this particular case, the VCPU
34
+ GIC_FDT_IRQ_FLAGS_LEVEL_HI);
74
+ * synchronization can be exceptionally skipped.
35
+ qemu_fdt_setprop(s->fdt, name, "interrupt-names",
75
+ */
36
+ interrupt_names, sizeof(interrupt_names));
76
+ events.exception.ext_dabt_pending = 1;
37
+ qemu_fdt_setprop_sized_cells(s->fdt, name, "reg",
77
+ /* KVM_CAP_ARM_INJECT_EXT_DABT implies KVM_CAP_VCPU_EVENTS */
38
+ 2, MM_PMC_RTC, 2, MM_PMC_RTC_SIZE);
78
+ return kvm_vcpu_ioctl(cs, KVM_SET_VCPU_EVENTS, &events);
39
+ qemu_fdt_setprop(s->fdt, name, "compatible", compat, sizeof(compat));
79
+ } else {
40
+ g_free(name);
80
+ error_report("Data abort exception triggered by guest memory access "
81
+ "at physical address: 0x" TARGET_FMT_lx,
82
+ (target_ulong)fault_ipa);
83
+ error_printf("KVM unable to emulate faulting instruction.\n");
84
+ }
85
+ return -1;
41
+}
86
+}
42
+
87
+
43
static void fdt_nop_memory_nodes(void *fdt, Error **errp)
88
int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
44
{
89
{
45
Error *err = NULL;
90
int ret = 0;
46
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
91
@@ -XXX,XX +XXX,XX @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
47
fdt_add_timer_nodes(s);
92
ret = EXCP_DEBUG;
48
fdt_add_zdma_nodes(s);
93
} /* otherwise return to guest */
49
fdt_add_sd_nodes(s);
94
break;
50
+ fdt_add_rtc_node(s);
95
+ case KVM_EXIT_ARM_NISV:
51
fdt_add_cpu_nodes(s, psci_conduit);
96
+ /* External DABT with no valid iss to decode */
52
fdt_add_clk_node(s, "/clk125", 125000000, s->phandle.clk_125Mhz);
97
+ ret = kvm_arm_handle_dabt_nisv(cs, run->arm_nisv.esr_iss,
53
fdt_add_clk_node(s, "/clk25", 25000000, s->phandle.clk_25Mhz);
98
+ run->arm_nisv.fault_ipa);
99
+ break;
100
default:
101
qemu_log_mask(LOG_UNIMP, "%s: un-handled exit reason %d\n",
102
__func__, run->exit_reason);
54
--
103
--
55
2.20.1
104
2.20.1
56
105
57
106
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Beata Michalska <beata.michalska@linaro.org>
2
2
3
MIDR_EL1 is a 64-bit system register with the top 32-bit being RES0.
3
Injecting external data abort through KVM might trigger
4
Represent it in QEMU's ARMCPU struct with a uint64_t, not a
4
an issue on kernels that do not get updated to include the KVM fix.
5
uint32_t.
5
For those and aarch32 guests, the injected abort gets misconfigured
6
6
to be an implementation defined exception. This leads to the guest
7
This fixes an error when compiling with -Werror=conversion
7
repeatedly re-running the faulting instruction.
8
because we were manipulating the register value using a
8
9
local uint64_t variable:
9
Add support for handling that case.
10
10
11
target/arm/cpu64.c: In function ‘aarch64_max_initfn’:
11
[
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]
12
Fixed-by: 018f22f95e8a
13
628 | cpu->midr = t;
13
    ('KVM: arm: Fix DFSR setting for non-LPAE aarch32 guests')
14
| ^
14
Fixed-by: 21aecdbd7f3a
15
15
    ('KVM: arm: Make inject_abt32() inject an external abort instead')
16
and future-proofs us against a possible future architecture
16
]
17
change using some of the top 32 bits.
17
18
18
Signed-off-by: Beata Michalska <beata.michalska@linaro.org>
19
Suggested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
19
Acked-by: Andrew Jones <drjones@redhat.com>
20
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
20
Message-id: 20200629114110.30723-3-beata.michalska@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>
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
---
23
---
27
target/arm/cpu.h | 2 +-
24
target/arm/cpu.h | 2 ++
28
target/arm/cpu.c | 2 +-
25
target/arm/kvm_arm.h | 10 +++++++++
29
2 files changed, 2 insertions(+), 2 deletions(-)
26
target/arm/kvm.c | 30 ++++++++++++++++++++++++++-
27
target/arm/kvm32.c | 34 ++++++++++++++++++++++++++++++
28
target/arm/kvm64.c | 49 ++++++++++++++++++++++++++++++++++++++++++++
29
5 files changed, 124 insertions(+), 1 deletion(-)
30
30
31
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
31
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
32
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/cpu.h
33
--- a/target/arm/cpu.h
34
+++ b/target/arm/cpu.h
34
+++ b/target/arm/cpu.h
35
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
35
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
36
uint64_t id_aa64dfr0;
36
uint64_t esr;
37
uint64_t id_aa64dfr1;
37
} serror;
38
} isar;
38
39
- uint32_t midr;
39
+ uint8_t ext_dabt_raised; /* Tracking/verifying injection of ext DABT */
40
+ uint64_t midr;
40
+
41
uint32_t revidr;
41
/* State of our input IRQ/FIQ/VIRQ/VFIQ lines */
42
uint32_t reset_fpsid;
42
uint32_t irq_line_state;
43
uint32_t ctr;
43
44
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
44
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
45
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/cpu.c
46
--- a/target/arm/kvm_arm.h
47
+++ b/target/arm/cpu.c
47
+++ b/target/arm/kvm_arm.h
48
@@ -XXX,XX +XXX,XX @@ static const ARMCPUInfo arm_cpus[] = {
48
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_hw_debug_active(CPUState *cs);
49
static Property arm_cpu_properties[] = {
49
struct kvm_guest_debug_arch;
50
DEFINE_PROP_BOOL("start-powered-off", ARMCPU, start_powered_off, false),
50
void kvm_arm_copy_hw_debug_data(struct kvm_guest_debug_arch *ptr);
51
DEFINE_PROP_UINT32("psci-conduit", ARMCPU, psci_conduit, 0),
51
52
- DEFINE_PROP_UINT32("midr", ARMCPU, midr, 0),
52
+/**
53
+ DEFINE_PROP_UINT64("midr", ARMCPU, midr, 0),
53
+ * kvm_arm_verify_ext_dabt_pending:
54
DEFINE_PROP_UINT64("mp-affinity", ARMCPU,
54
+ * @cs: CPUState
55
mp_affinity, ARM64_AFFINITY_INVALID),
55
+ *
56
DEFINE_PROP_INT32("node-id", ARMCPU, node_id, CPU_UNSET_NUMA_NODE_ID),
56
+ * Verify the fault status code wrt the Ext DABT injection
57
+ *
58
+ * Returns: true if the fault status code is as expected, false otherwise
59
+ */
60
+bool kvm_arm_verify_ext_dabt_pending(CPUState *cs);
61
+
62
/**
63
* its_class_name:
64
*
65
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/target/arm/kvm.c
68
+++ b/target/arm/kvm.c
69
@@ -XXX,XX +XXX,XX @@ int kvm_get_vcpu_events(ARMCPU *cpu)
70
71
void kvm_arch_pre_run(CPUState *cs, struct kvm_run *run)
72
{
73
+ ARMCPU *cpu = ARM_CPU(cs);
74
+ CPUARMState *env = &cpu->env;
75
+
76
+ if (unlikely(env->ext_dabt_raised)) {
77
+ /*
78
+ * Verifying that the ext DABT has been properly injected,
79
+ * otherwise risking indefinitely re-running the faulting instruction
80
+ * Covering a very narrow case for kernels 5.5..5.5.4
81
+ * when injected abort was misconfigured to be
82
+ * an IMPLEMENTATION DEFINED exception (for 32-bit EL1)
83
+ */
84
+ if (!arm_feature(env, ARM_FEATURE_AARCH64) &&
85
+ unlikely(!kvm_arm_verify_ext_dabt_pending(cs))) {
86
+
87
+ error_report("Data abort exception with no valid ISS generated by "
88
+ "guest memory access. KVM unable to emulate faulting "
89
+ "instruction. Failed to inject an external data abort "
90
+ "into the guest.");
91
+ abort();
92
+ }
93
+ /* Clear the status */
94
+ env->ext_dabt_raised = 0;
95
+ }
96
}
97
98
MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run)
99
@@ -XXX,XX +XXX,XX @@ void kvm_arm_vm_state_change(void *opaque, int running, RunState state)
100
static int kvm_arm_handle_dabt_nisv(CPUState *cs, uint64_t esr_iss,
101
uint64_t fault_ipa)
102
{
103
+ ARMCPU *cpu = ARM_CPU(cs);
104
+ CPUARMState *env = &cpu->env;
105
/*
106
* Request KVM to inject the external data abort into the guest
107
*/
108
@@ -XXX,XX +XXX,XX @@ static int kvm_arm_handle_dabt_nisv(CPUState *cs, uint64_t esr_iss,
109
*/
110
events.exception.ext_dabt_pending = 1;
111
/* KVM_CAP_ARM_INJECT_EXT_DABT implies KVM_CAP_VCPU_EVENTS */
112
- return kvm_vcpu_ioctl(cs, KVM_SET_VCPU_EVENTS, &events);
113
+ if (!kvm_vcpu_ioctl(cs, KVM_SET_VCPU_EVENTS, &events)) {
114
+ env->ext_dabt_raised = 1;
115
+ return 0;
116
+ }
117
} else {
118
error_report("Data abort exception triggered by guest memory access "
119
"at physical address: 0x" TARGET_FMT_lx,
120
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
121
index XXXXXXX..XXXXXXX 100644
122
--- a/target/arm/kvm32.c
123
+++ b/target/arm/kvm32.c
124
@@ -XXX,XX +XXX,XX @@ void kvm_arm_pmu_init(CPUState *cs)
125
{
126
qemu_log_mask(LOG_UNIMP, "%s: not implemented\n", __func__);
127
}
128
+
129
+#define ARM_REG_DFSR ARM_CP15_REG32(0, 5, 0, 0)
130
+#define ARM_REG_TTBCR ARM_CP15_REG32(0, 2, 0, 2)
131
+/*
132
+ *DFSR:
133
+ * TTBCR.EAE == 0
134
+ * FS[4] - DFSR[10]
135
+ * FS[3:0] - DFSR[3:0]
136
+ * TTBCR.EAE == 1
137
+ * FS, bits [5:0]
138
+ */
139
+#define DFSR_FSC(lpae, v) \
140
+ ((lpae) ? ((v) & 0x3F) : (((v) >> 6) | ((v) & 0x1F)))
141
+
142
+#define DFSC_EXTABT(lpae) ((lpae) ? 0x10 : 0x08)
143
+
144
+bool kvm_arm_verify_ext_dabt_pending(CPUState *cs)
145
+{
146
+ uint32_t dfsr_val;
147
+
148
+ if (!kvm_get_one_reg(cs, ARM_REG_DFSR, &dfsr_val)) {
149
+ ARMCPU *cpu = ARM_CPU(cs);
150
+ CPUARMState *env = &cpu->env;
151
+ uint32_t ttbcr;
152
+ int lpae = 0;
153
+
154
+ if (!kvm_get_one_reg(cs, ARM_REG_TTBCR, &ttbcr)) {
155
+ lpae = arm_feature(env, ARM_FEATURE_LPAE) && (ttbcr & TTBCR_EAE);
156
+ }
157
+ /* The verification is based on FS filed of the DFSR reg only*/
158
+ return (DFSR_FSC(lpae, dfsr_val) == DFSC_EXTABT(lpae));
159
+ }
160
+ return false;
161
+}
162
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
163
index XXXXXXX..XXXXXXX 100644
164
--- a/target/arm/kvm64.c
165
+++ b/target/arm/kvm64.c
166
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_handle_debug(CPUState *cs, struct kvm_debug_exit_arch *debug_exit)
167
168
return false;
169
}
170
+
171
+#define ARM64_REG_ESR_EL1 ARM64_SYS_REG(3, 0, 5, 2, 0)
172
+#define ARM64_REG_TCR_EL1 ARM64_SYS_REG(3, 0, 2, 0, 2)
173
+
174
+/*
175
+ * ESR_EL1
176
+ * ISS encoding
177
+ * AARCH64: DFSC, bits [5:0]
178
+ * AARCH32:
179
+ * TTBCR.EAE == 0
180
+ * FS[4] - DFSR[10]
181
+ * FS[3:0] - DFSR[3:0]
182
+ * TTBCR.EAE == 1
183
+ * FS, bits [5:0]
184
+ */
185
+#define ESR_DFSC(aarch64, lpae, v) \
186
+ ((aarch64 || (lpae)) ? ((v) & 0x3F) \
187
+ : (((v) >> 6) | ((v) & 0x1F)))
188
+
189
+#define ESR_DFSC_EXTABT(aarch64, lpae) \
190
+ ((aarch64) ? 0x10 : (lpae) ? 0x10 : 0x8)
191
+
192
+bool kvm_arm_verify_ext_dabt_pending(CPUState *cs)
193
+{
194
+ uint64_t dfsr_val;
195
+
196
+ if (!kvm_get_one_reg(cs, ARM64_REG_ESR_EL1, &dfsr_val)) {
197
+ ARMCPU *cpu = ARM_CPU(cs);
198
+ CPUARMState *env = &cpu->env;
199
+ int aarch64_mode = arm_feature(env, ARM_FEATURE_AARCH64);
200
+ int lpae = 0;
201
+
202
+ if (!aarch64_mode) {
203
+ uint64_t ttbcr;
204
+
205
+ if (!kvm_get_one_reg(cs, ARM64_REG_TCR_EL1, &ttbcr)) {
206
+ lpae = arm_feature(env, ARM_FEATURE_LPAE)
207
+ && (ttbcr & TTBCR_EAE);
208
+ }
209
+ }
210
+ /*
211
+ * The verification here is based on the DFSC bits
212
+ * of the ESR_EL1 reg only
213
+ */
214
+ return (ESR_DFSC(aarch64_mode, lpae, dfsr_val) ==
215
+ ESR_DFSC_EXTABT(aarch64_mode, lpae));
216
+ }
217
+ return false;
218
+}
57
--
219
--
58
2.20.1
220
2.20.1
59
221
60
222
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
Embed the UARTs into the SoC type.
3
Fixes: 93dd625f8bf7 ("tests/acpi: update expected data files")
4
4
Signed-off-by: Andrew Jones <drjones@redhat.com>
5
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Reviewed-by: Eric Auger <eric.auger@redhat.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 20200629140938.17566-2-drjones@redhat.com
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
10
Message-id: 20200427181649.26851-5-edgar.iglesias@gmail.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
9
---
13
include/hw/arm/xlnx-versal.h | 3 ++-
10
tests/qtest/bios-tables-test-allowed-diff.h | 18 ------------------
14
hw/arm/xlnx-versal.c | 12 ++++++------
11
1 file changed, 18 deletions(-)
15
2 files changed, 8 insertions(+), 7 deletions(-)
16
12
17
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
13
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
18
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/xlnx-versal.h
15
--- a/tests/qtest/bios-tables-test-allowed-diff.h
20
+++ b/include/hw/arm/xlnx-versal.h
16
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
21
@@ -XXX,XX +XXX,XX @@
17
@@ -1,19 +1 @@
22
#include "hw/sysbus.h"
18
/* List of comma-separated changed AML files to ignore */
23
#include "hw/arm/boot.h"
19
-"tests/data/acpi/pc/DSDT",
24
#include "hw/intc/arm_gicv3.h"
20
-"tests/data/acpi/pc/DSDT.acpihmat",
25
+#include "hw/char/pl011.h"
21
-"tests/data/acpi/pc/DSDT.bridge",
26
22
-"tests/data/acpi/pc/DSDT.cphp",
27
#define TYPE_XLNX_VERSAL "xlnx-versal"
23
-"tests/data/acpi/pc/DSDT.dimmpxm",
28
#define XLNX_VERSAL(obj) OBJECT_CHECK(Versal, (obj), TYPE_XLNX_VERSAL)
24
-"tests/data/acpi/pc/DSDT.ipmikcs",
29
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
25
-"tests/data/acpi/pc/DSDT.memhp",
30
MemoryRegion mr_ocm;
26
-"tests/data/acpi/pc/DSDT.numamem",
31
27
-"tests/data/acpi/q35/DSDT",
32
struct {
28
-"tests/data/acpi/q35/DSDT.acpihmat",
33
- SysBusDevice *uart[XLNX_VERSAL_NR_UARTS];
29
-"tests/data/acpi/q35/DSDT.bridge",
34
+ PL011State uart[XLNX_VERSAL_NR_UARTS];
30
-"tests/data/acpi/q35/DSDT.cphp",
35
SysBusDevice *gem[XLNX_VERSAL_NR_GEMS];
31
-"tests/data/acpi/q35/DSDT.dimmpxm",
36
SysBusDevice *adma[XLNX_VERSAL_NR_ADMAS];
32
-"tests/data/acpi/q35/DSDT.ipmibt",
37
} iou;
33
-"tests/data/acpi/q35/DSDT.memhp",
38
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
34
-"tests/data/acpi/q35/DSDT.mmio64",
39
index XXXXXXX..XXXXXXX 100644
35
-"tests/data/acpi/q35/DSDT.numamem",
40
--- a/hw/arm/xlnx-versal.c
36
-"tests/data/acpi/q35/DSDT.tis",
41
+++ b/hw/arm/xlnx-versal.c
42
@@ -XXX,XX +XXX,XX @@
43
#include "kvm_arm.h"
44
#include "hw/misc/unimp.h"
45
#include "hw/arm/xlnx-versal.h"
46
-#include "hw/char/pl011.h"
47
48
#define XLNX_VERSAL_ACPU_TYPE ARM_CPU_TYPE_NAME("cortex-a72")
49
#define GEM_REVISION 0x40070106
50
@@ -XXX,XX +XXX,XX @@ static void versal_create_uarts(Versal *s, qemu_irq *pic)
51
DeviceState *dev;
52
MemoryRegion *mr;
53
54
- dev = qdev_create(NULL, TYPE_PL011);
55
- s->lpd.iou.uart[i] = SYS_BUS_DEVICE(dev);
56
+ sysbus_init_child_obj(OBJECT(s), name,
57
+ &s->lpd.iou.uart[i], sizeof(s->lpd.iou.uart[i]),
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
}
72
}
73
--
37
--
74
2.20.1
38
2.20.1
75
39
76
40
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
Embed the ADMAs into the SoC type.
3
Signed-off-by: Andrew Jones <drjones@redhat.com>
4
4
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
5
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Eric Auger <eric.auger@redhat.com>
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Message-id: 20200629140938.17566-3-drjones@redhat.com
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
10
Message-id: 20200427181649.26851-7-edgar.iglesias@gmail.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
8
---
13
include/hw/arm/xlnx-versal.h | 3 ++-
9
tests/qtest/bios-tables-test-allowed-diff.h | 3 +++
14
hw/arm/xlnx-versal.c | 14 +++++++-------
10
1 file changed, 3 insertions(+)
15
2 files changed, 9 insertions(+), 8 deletions(-)
16
11
17
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
12
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
18
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/arm/xlnx-versal.h
14
--- a/tests/qtest/bios-tables-test-allowed-diff.h
20
+++ b/include/hw/arm/xlnx-versal.h
15
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
21
@@ -XXX,XX +XXX,XX @@
16
@@ -1 +1,4 @@
22
#include "hw/arm/boot.h"
17
/* List of comma-separated changed AML files to ignore */
23
#include "hw/intc/arm_gicv3.h"
18
+"tests/data/acpi/virt/DSDT",
24
#include "hw/char/pl011.h"
19
+"tests/data/acpi/virt/DSDT.memhp",
25
+#include "hw/dma/xlnx-zdma.h"
20
+"tests/data/acpi/virt/DSDT.numamem",
26
#include "hw/net/cadence_gem.h"
27
28
#define TYPE_XLNX_VERSAL "xlnx-versal"
29
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
30
struct {
31
PL011State uart[XLNX_VERSAL_NR_UARTS];
32
CadenceGEMState gem[XLNX_VERSAL_NR_GEMS];
33
- SysBusDevice *adma[XLNX_VERSAL_NR_ADMAS];
34
+ XlnxZDMA adma[XLNX_VERSAL_NR_ADMAS];
35
} iou;
36
} lpd;
37
38
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/arm/xlnx-versal.c
41
+++ b/hw/arm/xlnx-versal.c
42
@@ -XXX,XX +XXX,XX @@ static void versal_create_admas(Versal *s, qemu_irq *pic)
43
DeviceState *dev;
44
MemoryRegion *mr;
45
46
- dev = qdev_create(NULL, "xlnx.zdma");
47
- s->lpd.iou.adma[i] = SYS_BUS_DEVICE(dev);
48
- object_property_set_int(OBJECT(s->lpd.iou.adma[i]), 128, "bus-width",
49
- &error_abort);
50
- object_property_add_child(OBJECT(s), name, OBJECT(dev), &error_fatal);
51
+ sysbus_init_child_obj(OBJECT(s), name,
52
+ &s->lpd.iou.adma[i], sizeof(s->lpd.iou.adma[i]),
53
+ TYPE_XLNX_ZDMA);
54
+ dev = DEVICE(&s->lpd.iou.adma[i]);
55
+ object_property_set_int(OBJECT(dev), 128, "bus-width", &error_abort);
56
qdev_init_nofail(dev);
57
58
- mr = sysbus_mmio_get_region(s->lpd.iou.adma[i], 0);
59
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
60
memory_region_add_subregion(&s->mr_ps,
61
MM_ADMA_CH0 + i * MM_ADMA_CH0_SIZE, mr);
62
63
- sysbus_connect_irq(s->lpd.iou.adma[i], 0, pic[VERSAL_ADMA_IRQ_0 + i]);
64
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[VERSAL_ADMA_IRQ_0 + i]);
65
g_free(name);
66
}
67
}
68
--
21
--
69
2.20.1
22
2.20.1
70
23
71
24
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
Remove inclusion of arm_gicv3_common.h, this already gets
3
The flash device is exclusively for the host-controlled firmware, so
4
included via xlnx-versal.h.
4
we should not expose it to the OS. Exposing it risks the OS messing
5
with it, which could break firmware runtime services and surprise the
6
OS when all its changes disappear after reboot.
5
7
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
As firmware needs the device and uses DT, we leave the device exposed
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
there. It's up to firmware to remove the nodes from DT before sending
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
10
it on to the OS. However, there's no need to force firmware to remove
9
Message-id: 20200427181649.26851-2-edgar.iglesias@gmail.com
11
tables from ACPI (which it doesn't know how to do anyway), so we
12
simply don't add the tables in the first place. But, as we've been
13
adding the tables for quite some time and don't want to change the
14
default hardware exposed to versioned machines, then we only stop
15
exposing the flash device tables for 5.1 and later machine types.
16
17
Suggested-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
18
Suggested-by: Laszlo Ersek <lersek@redhat.com>
19
Signed-off-by: Andrew Jones <drjones@redhat.com>
20
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
21
Reviewed-by: Eric Auger <eric.auger@redhat.com>
22
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
23
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
24
Message-id: 20200629140938.17566-4-drjones@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
26
---
12
hw/arm/xlnx-versal.c | 1 -
27
include/hw/arm/virt.h | 1 +
13
1 file changed, 1 deletion(-)
28
hw/arm/virt-acpi-build.c | 5 ++++-
29
hw/arm/virt.c | 3 +++
30
3 files changed, 8 insertions(+), 1 deletion(-)
14
31
15
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
32
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
16
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/xlnx-versal.c
34
--- a/include/hw/arm/virt.h
18
+++ b/hw/arm/xlnx-versal.c
35
+++ b/include/hw/arm/virt.h
19
@@ -XXX,XX +XXX,XX @@
36
@@ -XXX,XX +XXX,XX @@ typedef struct {
20
#include "hw/arm/boot.h"
37
bool no_highmem_ecam;
21
#include "kvm_arm.h"
38
bool no_ged; /* Machines < 4.2 has no support for ACPI GED device */
22
#include "hw/misc/unimp.h"
39
bool kvm_no_adjvtime;
23
-#include "hw/intc/arm_gicv3_common.h"
40
+ bool acpi_expose_flash;
24
#include "hw/arm/xlnx-versal.h"
41
} VirtMachineClass;
25
#include "hw/char/pl011.h"
42
43
typedef struct {
44
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/arm/virt-acpi-build.c
47
+++ b/hw/arm/virt-acpi-build.c
48
@@ -XXX,XX +XXX,XX @@ static void build_fadt_rev5(GArray *table_data, BIOSLinker *linker,
49
static void
50
build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
51
{
52
+ VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
53
Aml *scope, *dsdt;
54
MachineState *ms = MACHINE(vms);
55
const MemMapEntry *memmap = vms->memmap;
56
@@ -XXX,XX +XXX,XX @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
57
acpi_dsdt_add_cpus(scope, vms->smp_cpus);
58
acpi_dsdt_add_uart(scope, &memmap[VIRT_UART],
59
(irqmap[VIRT_UART] + ARM_SPI_BASE));
60
- acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]);
61
+ if (vmc->acpi_expose_flash) {
62
+ acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]);
63
+ }
64
acpi_dsdt_add_fw_cfg(scope, &memmap[VIRT_FW_CFG]);
65
acpi_dsdt_add_virtio(scope, &memmap[VIRT_MMIO],
66
(irqmap[VIRT_MMIO] + ARM_SPI_BASE), NUM_VIRTIO_TRANSPORTS);
67
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
68
index XXXXXXX..XXXXXXX 100644
69
--- a/hw/arm/virt.c
70
+++ b/hw/arm/virt.c
71
@@ -XXX,XX +XXX,XX @@ DEFINE_VIRT_MACHINE_AS_LATEST(5, 1)
72
73
static void virt_machine_5_0_options(MachineClass *mc)
74
{
75
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
76
+
77
virt_machine_5_1_options(mc);
78
compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len);
79
mc->numa_mem_supported = true;
80
+ vmc->acpi_expose_flash = true;
81
}
82
DEFINE_VIRT_MACHINE(5, 0)
26
83
27
--
84
--
28
2.20.1
85
2.20.1
29
86
30
87
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
Move misplaced comment.
3
Differences between disassembled ASL files for DSDT:
4
4
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
5
@@ -XXX,XX +XXX,XX @@
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
*
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
* Disassembling to symbolic ASL+ operators
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
8
*
9
Message-id: 20200427181649.26851-3-edgar.iglesias@gmail.com
9
- * Disassembly of a, Mon Jun 29 09:50:01 2020
10
+ * Disassembly of b, Mon Jun 29 09:50:03 2020
11
*
12
* Original Table Header:
13
* Signature "DSDT"
14
- * Length 0x000014BB (5307)
15
+ * Length 0x00001455 (5205)
16
* Revision 0x02
17
- * Checksum 0xD1
18
+ * Checksum 0xE1
19
* OEM ID "BOCHS "
20
* OEM Table ID "BXPCDSDT"
21
* OEM Revision 0x00000001 (1)
22
@@ -XXX,XX +XXX,XX @@
23
})
24
}
25
26
- Device (FLS0)
27
- {
28
- Name (_HID, "LNRO0015") // _HID: Hardware ID
29
- Name (_UID, Zero) // _UID: Unique ID
30
- Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
31
- {
32
- Memory32Fixed (ReadWrite,
33
- 0x00000000, // Address Base
34
- 0x04000000, // Address Length
35
- )
36
- })
37
- }
38
-
39
- Device (FLS1)
40
- {
41
- Name (_HID, "LNRO0015") // _HID: Hardware ID
42
- Name (_UID, One) // _UID: Unique ID
43
- Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
44
- {
45
- Memory32Fixed (ReadWrite,
46
- 0x04000000, // Address Base
47
- 0x04000000, // Address Length
48
- )
49
- })
50
- }
51
-
52
Device (FWCF)
53
{
54
Name (_HID, "QEMU0002") // _HID: Hardware ID
55
56
The other two binaries have the same changes (the removal of the
57
flash devices).
58
59
Signed-off-by: Andrew Jones <drjones@redhat.com>
60
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
61
Reviewed-by: Eric Auger <eric.auger@redhat.com>
62
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
63
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
64
Message-id: 20200629140938.17566-5-drjones@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
65
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
66
---
12
hw/arm/xlnx-versal.c | 2 +-
67
tests/qtest/bios-tables-test-allowed-diff.h | 3 ---
13
1 file changed, 1 insertion(+), 1 deletion(-)
68
tests/data/acpi/virt/DSDT | Bin 5307 -> 5205 bytes
69
tests/data/acpi/virt/DSDT.memhp | Bin 6668 -> 6566 bytes
70
tests/data/acpi/virt/DSDT.numamem | Bin 5307 -> 5205 bytes
71
4 files changed, 3 deletions(-)
14
72
15
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
73
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
16
index XXXXXXX..XXXXXXX 100644
74
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/xlnx-versal.c
75
--- a/tests/qtest/bios-tables-test-allowed-diff.h
18
+++ b/hw/arm/xlnx-versal.c
76
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
19
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
77
@@ -1,4 +1 @@
20
78
/* List of comma-separated changed AML files to ignore */
21
obj = object_new(XLNX_VERSAL_ACPU_TYPE);
79
-"tests/data/acpi/virt/DSDT",
22
if (!obj) {
80
-"tests/data/acpi/virt/DSDT.memhp",
23
- /* Secondary CPUs start in PSCI powered-down state */
81
-"tests/data/acpi/virt/DSDT.numamem",
24
error_report("Unable to create apu.cpu[%d] of type %s",
82
diff --git a/tests/data/acpi/virt/DSDT b/tests/data/acpi/virt/DSDT
25
i, XLNX_VERSAL_ACPU_TYPE);
83
index XXXXXXX..XXXXXXX 100644
26
exit(EXIT_FAILURE);
84
GIT binary patch
27
@@ -XXX,XX +XXX,XX @@ static void versal_create_apu_cpus(Versal *s)
85
delta 28
28
object_property_set_int(obj, s->cfg.psci_conduit,
86
kcmdn3c~yhUCD<h-RD^+n>ET2!X{H9}iRuX(-<}f&0DgxFc>n+a
29
"psci-conduit", &error_abort);
87
30
if (i) {
88
delta 156
31
+ /* Secondary CPUs start in PSCI powered-down state */
89
zcmcbrv0IbNCD<iow+I6R)5VEg(oAih6V(&y4c&Z#4LIUGJY9Hw{DS-q3=B;fIO0P+
32
object_property_set_bool(obj, true,
90
zU4W!>P_UpN7hfAE10w?juv9WcH-WSmV$;Hiu7w4t3#`S$E!^1+q9xGPH`KtuzzAr5
33
"start-powered-off", &error_abort);
91
LaERl^1zUvy_;n(J
34
}
92
93
diff --git a/tests/data/acpi/virt/DSDT.memhp b/tests/data/acpi/virt/DSDT.memhp
94
index XXXXXXX..XXXXXXX 100644
95
GIT binary patch
96
delta 28
97
kcmeA%S!T@T66_MPOp<|tiD@F2G*jb@iRuX(-^xn@0CHUjRR910
98
99
delta 156
100
zcmZ2x++)J!66_MfBgMeL^l>7WG*kP$iRuaUhHgH=1|0Doo-VvTenI{Q28N~#9Py!^
101
zE<n;bC|FRCi?5B7fsp|MSSlH!n?PC&v1wsM*TMqS1=eEW7Vhi@(GuwD8){%+U<5Qj
102
LIK*+|0yaqism~!^
103
104
diff --git a/tests/data/acpi/virt/DSDT.numamem b/tests/data/acpi/virt/DSDT.numamem
105
index XXXXXXX..XXXXXXX 100644
106
GIT binary patch
107
delta 28
108
kcmdn3c~yhUCD<h-RD^+n>ET2!X{H9}iRuX(-<}f&0DgxFc>n+a
109
110
delta 156
111
zcmcbrv0IbNCD<iow+I6R)5VEg(oAih6V(&y4c&Z#4LIUGJY9Hw{DS-q3=B;fIO0P+
112
zU4W!>P_UpN7hfAE10w?juv9WcH-WSmV$;Hiu7w4t3#`S$E!^1+q9xGPH`KtuzzAr5
113
LaERl^1zUvy_;n(J
114
35
--
115
--
36
2.20.1
116
2.20.1
37
117
38
118
diff view generated by jsdifflib
1
Convert the Neon 3-reg-same VADD and VSUB insns to decodetree.
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Note that we don't need the neon_3r_sizes[op] check here because all
3
The temp that gets assigned to clean_addr has been allocated with
4
size values are OK for VADD and VSUB; we'll add this when we convert
4
new_tmp_a64, which means that it will be freed at the end of the
5
the first insn that has size restrictions.
5
instruction. Freeing it earlier leads to assertion failure.
6
6
7
For this we need one of the GVecGen*Fn typedefs currently in
7
The loop creates a complication, in which we allocate a new local
8
translate-a64.h; move them all to translate.h as a block so they
8
temp, which does need freeing, and the final code path is shared
9
are visible to the 32-bit decoder.
9
between the loop and non-loop.
10
10
11
Fix this complication by adding new_tmp_a64_local so that the new
12
local temp is freed at the end, and can be treated exactly like
13
the non-loop path.
14
15
Fixes: bba87d0a0f4
16
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20200702175605.1987125-1-richard.henderson@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20200430181003.21682-15-peter.maydell@linaro.org
14
---
20
---
15
target/arm/translate-a64.h | 9 --------
21
target/arm/translate-a64.h | 1 +
16
target/arm/translate.h | 9 ++++++++
22
target/arm/translate-a64.c | 6 ++++++
17
target/arm/neon-dp.decode | 17 +++++++++++++++
23
target/arm/translate-sve.c | 8 ++------
18
target/arm/translate-neon.inc.c | 38 +++++++++++++++++++++++++++++++++
24
3 files changed, 9 insertions(+), 6 deletions(-)
19
target/arm/translate.c | 14 ++++--------
20
5 files changed, 68 insertions(+), 19 deletions(-)
21
25
22
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
26
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
23
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
24
--- a/target/arm/translate-a64.h
28
--- a/target/arm/translate-a64.h
25
+++ b/target/arm/translate-a64.h
29
+++ b/target/arm/translate-a64.h
26
@@ -XXX,XX +XXX,XX @@ static inline int vec_full_reg_size(DisasContext *s)
30
@@ -XXX,XX +XXX,XX @@ void unallocated_encoding(DisasContext *s);
27
31
} while (0)
28
bool disas_sve(DisasContext *, uint32_t);
32
29
33
TCGv_i64 new_tmp_a64(DisasContext *s);
30
-/* Note that the gvec expanders operate on offsets + sizes. */
34
+TCGv_i64 new_tmp_a64_local(DisasContext *s);
31
-typedef void GVecGen2Fn(unsigned, uint32_t, uint32_t, uint32_t, uint32_t);
35
TCGv_i64 new_tmp_a64_zero(DisasContext *s);
32
-typedef void GVecGen2iFn(unsigned, uint32_t, uint32_t, int64_t,
36
TCGv_i64 cpu_reg(DisasContext *s, int reg);
33
- uint32_t, uint32_t);
37
TCGv_i64 cpu_reg_sp(DisasContext *s, int reg);
34
-typedef void GVecGen3Fn(unsigned, uint32_t, uint32_t,
38
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
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
39
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/translate.h
40
--- a/target/arm/translate-a64.c
43
+++ b/target/arm/translate.h
41
+++ b/target/arm/translate-a64.c
44
@@ -XXX,XX +XXX,XX @@ void gen_sshl_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b);
42
@@ -XXX,XX +XXX,XX @@ TCGv_i64 new_tmp_a64(DisasContext *s)
45
#define dc_isar_feature(name, ctx) \
43
return s->tmp_a64[s->tmp_a64_count++] = tcg_temp_new_i64();
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
}
44
}
98
+
45
99
+static bool do_3same(DisasContext *s, arg_3same *a, GVecGen3Fn fn)
46
+TCGv_i64 new_tmp_a64_local(DisasContext *s)
100
+{
47
+{
101
+ int vec_size = a->q ? 16 : 8;
48
+ assert(s->tmp_a64_count < TMP_A64_MAX);
102
+ int rd_ofs = neon_reg_offset(a->vd, 0);
49
+ return s->tmp_a64[s->tmp_a64_count++] = tcg_temp_local_new_i64();
103
+ int rn_ofs = neon_reg_offset(a->vn, 0);
104
+ int rm_ofs = neon_reg_offset(a->vm, 0);
105
+
106
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
107
+ return false;
108
+ }
109
+
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
+}
50
+}
127
+
51
+
128
+#define DO_3SAME(INSN, FUNC) \
52
TCGv_i64 new_tmp_a64_zero(DisasContext *s)
129
+ static bool trans_##INSN##_3s(DisasContext *s, arg_3same *a) \
53
{
130
+ { \
54
TCGv_i64 t = new_tmp_a64(s);
131
+ return do_3same(s, a, FUNC); \
55
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
132
+ }
133
+
134
+DO_3SAME(VADD, tcg_gen_gvec_add)
135
+DO_3SAME(VSUB, tcg_gen_gvec_sub)
136
diff --git a/target/arm/translate.c b/target/arm/translate.c
137
index XXXXXXX..XXXXXXX 100644
56
index XXXXXXX..XXXXXXX 100644
138
--- a/target/arm/translate.c
57
--- a/target/arm/translate-sve.c
139
+++ b/target/arm/translate.c
58
+++ b/target/arm/translate-sve.c
140
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
59
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
141
}
60
142
return 0;
61
/* Copy the clean address into a local temp, live across the loop. */
143
62
t0 = clean_addr;
144
- case NEON_3R_VADD_VSUB:
63
- clean_addr = tcg_temp_local_new_i64();
145
- if (u) {
64
+ clean_addr = new_tmp_a64_local(s);
146
- tcg_gen_gvec_sub(size, rd_ofs, rn_ofs, rm_ofs,
65
tcg_gen_mov_i64(clean_addr, t0);
147
- vec_size, vec_size);
66
- tcg_temp_free_i64(t0);
148
- } else {
67
149
- tcg_gen_gvec_add(size, rd_ofs, rn_ofs, rm_ofs,
68
gen_set_label(loop);
150
- vec_size, vec_size);
69
151
- }
70
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
152
- return 0;
71
tcg_gen_st_i64(t0, cpu_env, vofs + len_align);
153
-
72
tcg_temp_free_i64(t0);
154
case NEON_3R_VQADD:
73
}
155
tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
74
- tcg_temp_free_i64(clean_addr);
156
rn_ofs, rm_ofs, vec_size, vec_size,
75
}
157
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
76
158
tcg_gen_gvec_3(rd_ofs, rm_ofs, rn_ofs, vec_size, vec_size,
77
/* Similarly for stores. */
159
u ? &ushl_op[size] : &sshl_op[size]);
78
@@ -XXX,XX +XXX,XX @@ static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
160
return 0;
79
161
+
80
/* Copy the clean address into a local temp, live across the loop. */
162
+ case NEON_3R_VADD_VSUB:
81
t0 = clean_addr;
163
+ /* Already handled by decodetree */
82
- clean_addr = tcg_temp_local_new_i64();
164
+ return 1;
83
+ clean_addr = new_tmp_a64_local(s);
84
tcg_gen_mov_i64(clean_addr, t0);
85
- tcg_temp_free_i64(t0);
86
87
gen_set_label(loop);
88
89
@@ -XXX,XX +XXX,XX @@ static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
165
}
90
}
166
91
tcg_temp_free_i64(t0);
167
if (size == 3) {
92
}
93
- tcg_temp_free_i64(clean_addr);
94
}
95
96
static bool trans_LDR_zri(DisasContext *s, arg_rri *a)
168
--
97
--
169
2.20.1
98
2.20.1
170
99
171
100
diff view generated by jsdifflib
1
Convert the Neon VQADD/VQSUB insns in the 3-reg-same grouping
1
In bcm2835_fb_mbox_push(), Coverity complains (CID 1429989) that we
2
to decodetree.
2
pass a pointer to a local struct to another function without
3
initializing all its fields. This is a real bug:
4
bcm2835_fb_reconfigure() copies the whole of our new BCM2385FBConfig
5
struct into s->config, so any fields we don't initialize will corrupt
6
the state of the device.
3
7
8
Copy the two fields which we don't want to update (pixo and alpha)
9
from the existing config so we don't accidentally change them.
10
11
Fixes: cfb7ba983857e40e88
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200430181003.21682-19-peter.maydell@linaro.org
14
Message-id: 20200628195436.27582-1-peter.maydell@linaro.org
7
---
15
---
8
target/arm/neon-dp.decode | 6 ++++++
16
hw/display/bcm2835_fb.c | 4 ++++
9
target/arm/translate-neon.inc.c | 15 +++++++++++++++
17
1 file changed, 4 insertions(+)
10
target/arm/translate.c | 14 ++------------
11
3 files changed, 23 insertions(+), 12 deletions(-)
12
18
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
19
diff --git a/hw/display/bcm2835_fb.c b/hw/display/bcm2835_fb.c
14
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
21
--- a/hw/display/bcm2835_fb.c
16
+++ b/target/arm/neon-dp.decode
22
+++ b/hw/display/bcm2835_fb.c
17
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ static void bcm2835_fb_mbox_push(BCM2835FBState *s, uint32_t value)
18
@3same .... ... . . . size:2 .... .... .... . q:1 . . .... \
24
newconf.base = s->vcram_base | (value & 0xc0000000);
19
&3same vm=%vm_dp vn=%vn_dp vd=%vd_dp
25
newconf.base += BCM2835_FB_OFFSET;
20
26
21
+VQADD_S_3s 1111 001 0 0 . .. .... .... 0000 . . . 1 .... @3same
27
+ /* Copy fields which we don't want to change from the existing config */
22
+VQADD_U_3s 1111 001 1 0 . .. .... .... 0000 . . . 1 .... @3same
28
+ newconf.pixo = s->config.pixo;
29
+ newconf.alpha = s->config.alpha;
23
+
30
+
24
@3same_logic .... ... . . . .. .... .... .... . q:1 .. .... \
31
bcm2835_fb_validate_config(&newconf);
25
&3same vm=%vm_dp vn=%vn_dp vd=%vd_dp size=0
32
26
33
pitch = bcm2835_fb_get_pitch(&newconf);
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
39
--- a/target/arm/translate-neon.inc.c
40
+++ b/target/arm/translate-neon.inc.c
41
@@ -XXX,XX +XXX,XX @@ static void gen_VTST_3s(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
42
tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs, oprsz, maxsz, &cmtst_op[vece]);
43
}
44
DO_3SAME_NO_SZ_3(VTST, gen_VTST_3s)
45
+
46
+#define DO_3SAME_GVEC4(INSN, OPARRAY) \
47
+ static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
48
+ uint32_t rn_ofs, uint32_t rm_ofs, \
49
+ uint32_t oprsz, uint32_t maxsz) \
50
+ { \
51
+ tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc), \
52
+ rn_ofs, rm_ofs, oprsz, maxsz, &OPARRAY[vece]); \
53
+ } \
54
+ DO_3SAME(INSN, gen_##INSN##_3s)
55
+
56
+DO_3SAME_GVEC4(VQADD_S, sqadd_op)
57
+DO_3SAME_GVEC4(VQADD_U, uqadd_op)
58
+DO_3SAME_GVEC4(VQSUB_S, sqsub_op)
59
+DO_3SAME_GVEC4(VQSUB_U, uqsub_op)
60
diff --git a/target/arm/translate.c b/target/arm/translate.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/target/arm/translate.c
63
+++ b/target/arm/translate.c
64
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
65
}
66
return 1;
67
68
- case NEON_3R_VQADD:
69
- tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
70
- rn_ofs, rm_ofs, vec_size, vec_size,
71
- (u ? uqadd_op : sqadd_op) + size);
72
- return 0;
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
--
34
--
93
2.20.1
35
2.20.1
94
36
95
37
diff view generated by jsdifflib
1
We define ARMMMUIdx_Stage2 as being an MMU index which uses a QEMU
1
The spitz board has been around a long time, and still has a fair number
2
TLB. However we never actually use the TLB -- all stage 2 lookups
2
of hard-coded tab characters in it. We're about to do some work on
3
are done by direct calls to get_phys_addr_lpae() followed by a
3
this source file, so start out by expanding out the tabs.
4
physical address load via address_space_ld*().
4
5
5
This commit is a pure whitespace only change.
6
Remove Stage2 from the list of ARM MMU indexes which correspond to
7
real core MMU indexes, and instead put it in the set of "NOTLB" ARM
8
MMU indexes.
9
10
This allows us to drop NB_MMU_MODES to 11. It also means we can
11
safely add support for the ARMv8.3-TTS2UXN extension, which adds
12
permission bits to the stage 2 descriptors which define execute
13
permission separatel for EL0 and EL1; supporting that while keeping
14
Stage2 in a QEMU TLB would require us to use separate TLBs for
15
"Stage2 for an EL0 access" and "Stage2 for an EL1 access", which is a
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
6
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
26
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
27
Message-id: 20200330210400.11724-2-peter.maydell@linaro.org
10
Message-id: 20200628142429.17111-2-peter.maydell@linaro.org
28
---
11
---
29
target/arm/cpu-param.h | 2 +-
12
hw/arm/spitz.c | 156 ++++++++++++++++++++++++-------------------------
30
target/arm/cpu.h | 21 +++++---
13
1 file changed, 78 insertions(+), 78 deletions(-)
31
target/arm/helper.c | 112 ++++-------------------------------------
14
32
3 files changed, 27 insertions(+), 108 deletions(-)
15
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
33
34
diff --git a/target/arm/cpu-param.h b/target/arm/cpu-param.h
35
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/cpu-param.h
17
--- a/hw/arm/spitz.c
37
+++ b/target/arm/cpu-param.h
18
+++ b/hw/arm/spitz.c
38
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
39
# define TARGET_PAGE_BITS_MIN 10
20
#include "cpu.h"
40
#endif
21
41
22
#undef REG_FMT
42
-#define NB_MMU_MODES 12
23
-#define REG_FMT            "0x%02lx"
43
+#define NB_MMU_MODES 11
24
+#define REG_FMT "0x%02lx"
44
25
45
#endif
26
/* Spitz Flash */
46
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
27
-#define FLASH_BASE        0x0c000000
47
index XXXXXXX..XXXXXXX 100644
28
-#define FLASH_ECCLPLB        0x00    /* Line parity 7 - 0 bit */
48
--- a/target/arm/cpu.h
29
-#define FLASH_ECCLPUB        0x04    /* Line parity 15 - 8 bit */
49
+++ b/target/arm/cpu.h
30
-#define FLASH_ECCCP        0x08    /* Column parity 5 - 0 bit */
50
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync);
31
-#define FLASH_ECCCNTR        0x0c    /* ECC byte counter */
51
* handling via the TLB. The only way to do a stage 1 translation without
32
-#define FLASH_ECCCLRR        0x10    /* Clear ECC */
52
* the immediate stage 2 translation is via the ATS or AT system insns,
33
-#define FLASH_FLASHIO        0x14    /* Flash I/O */
53
* which can be slow-pathed and always do a page table walk.
34
-#define FLASH_FLASHCTL        0x18    /* Flash Control */
54
+ * The only use of stage 2 translations is either as part of an s1+2
35
+#define FLASH_BASE 0x0c000000
55
+ * lookup or when loading the descriptors during a stage 1 page table walk,
36
+#define FLASH_ECCLPLB 0x00 /* Line parity 7 - 0 bit */
56
+ * and in both those cases we don't use the TLB.
37
+#define FLASH_ECCLPUB 0x04 /* Line parity 15 - 8 bit */
57
* 4. we can also safely fold together the "32 bit EL3" and "64 bit EL3"
38
+#define FLASH_ECCCP 0x08 /* Column parity 5 - 0 bit */
58
* translation regimes, because they map reasonably well to each other
39
+#define FLASH_ECCCNTR 0x0c /* ECC byte counter */
59
* and they can't both be active at the same time.
40
+#define FLASH_ECCCLRR 0x10 /* Clear ECC */
60
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync);
41
+#define FLASH_FLASHIO 0x14 /* Flash I/O */
61
* NS EL1 EL1&0 stage 1+2 (aka NS PL1)
42
+#define FLASH_FLASHCTL 0x18 /* Flash Control */
62
* NS EL1 EL1&0 stage 1+2 +PAN
43
63
* NS EL0 EL2&0
44
-#define FLASHCTL_CE0        (1 << 0)
64
+ * NS EL2 EL2&0
45
-#define FLASHCTL_CLE        (1 << 1)
65
* NS EL2 EL2&0 +PAN
46
-#define FLASHCTL_ALE        (1 << 2)
66
* NS EL2 (aka NS PL2)
47
-#define FLASHCTL_WP        (1 << 3)
67
* S EL0 EL1&0 (aka S PL0)
48
-#define FLASHCTL_CE1        (1 << 4)
68
* S EL1 EL1&0 (not used if EL3 is 32 bit)
49
-#define FLASHCTL_RYBY        (1 << 5)
69
* S EL1 EL1&0 +PAN
50
-#define FLASHCTL_NCE        (FLASHCTL_CE0 | FLASHCTL_CE1)
70
* S EL3 (aka S PL1)
51
+#define FLASHCTL_CE0 (1 << 0)
71
- * NS EL1&0 stage 2
52
+#define FLASHCTL_CLE (1 << 1)
72
*
53
+#define FLASHCTL_ALE (1 << 2)
73
- * for a total of 12 different mmu_idx.
54
+#define FLASHCTL_WP (1 << 3)
74
+ * for a total of 11 different mmu_idx.
55
+#define FLASHCTL_CE1 (1 << 4)
75
*
56
+#define FLASHCTL_RYBY (1 << 5)
76
* R profile CPUs have an MPU, but can use the same set of MMU indexes
57
+#define FLASHCTL_NCE (FLASHCTL_CE0 | FLASHCTL_CE1)
77
* as A profile. They only need to distinguish NS EL0 and NS EL1 (and
58
78
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync);
59
#define TYPE_SL_NAND "sl-nand"
79
* are not quite the same -- different CPU types (most notably M profile
60
#define SL_NAND(obj) OBJECT_CHECK(SLNANDState, (obj), TYPE_SL_NAND)
80
* vs A/R profile) would like to use MMU indexes with different semantics,
61
@@ -XXX,XX +XXX,XX @@ static uint64_t sl_read(void *opaque, hwaddr addr, unsigned size)
81
* but since we don't ever need to use all of those in a single CPU we
62
int ryby;
82
- * can avoid setting NB_MMU_MODES to more than 8. The lower bits of
63
83
+ * can avoid having to set NB_MMU_MODES to "total number of A profile MMU
64
switch (addr) {
84
+ * modes + total number of M profile MMU modes". The lower bits of
65
-#define BSHR(byte, from, to)    ((s->ecc.lp[byte] >> (from - to)) & (1 << to))
85
* ARMMMUIdx are the core TLB mmu index, and the higher bits are always
66
+#define BSHR(byte, from, to) ((s->ecc.lp[byte] >> (from - to)) & (1 << to))
86
* the same for any particular CPU.
67
case FLASH_ECCLPLB:
87
* Variables of type ARMMUIdx are always full values, and the core
68
return BSHR(0, 4, 0) | BSHR(0, 5, 2) | BSHR(0, 6, 4) | BSHR(0, 7, 6) |
88
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdx {
69
BSHR(1, 4, 1) | BSHR(1, 5, 3) | BSHR(1, 6, 5) | BSHR(1, 7, 7);
89
ARMMMUIdx_SE10_1_PAN = 9 | ARM_MMU_IDX_A,
70
90
ARMMMUIdx_SE3 = 10 | ARM_MMU_IDX_A,
71
-#define BSHL(byte, from, to)    ((s->ecc.lp[byte] << (to - from)) & (1 << to))
91
72
+#define BSHL(byte, from, to) ((s->ecc.lp[byte] << (to - from)) & (1 << to))
92
- ARMMMUIdx_Stage2 = 11 | ARM_MMU_IDX_A,
73
case FLASH_ECCLPUB:
93
-
74
return BSHL(0, 0, 0) | BSHL(0, 1, 2) | BSHL(0, 2, 4) | BSHL(0, 3, 6) |
94
/*
75
BSHL(1, 0, 1) | BSHL(1, 1, 3) | BSHL(1, 2, 5) | BSHL(1, 3, 7);
95
* These are not allocated TLBs and are used only for AT system
76
@@ -XXX,XX +XXX,XX @@ static void sl_nand_realize(DeviceState *dev, Error **errp)
96
* instructions or for the first stage of an S12 page table walk.
77
97
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdx {
78
/* Spitz Keyboard */
98
ARMMMUIdx_Stage1_E0 = 0 | ARM_MMU_IDX_NOTLB,
79
99
ARMMMUIdx_Stage1_E1 = 1 | ARM_MMU_IDX_NOTLB,
80
-#define SPITZ_KEY_STROBE_NUM    11
100
ARMMMUIdx_Stage1_E1_PAN = 2 | ARM_MMU_IDX_NOTLB,
81
-#define SPITZ_KEY_SENSE_NUM    7
101
+ /*
82
+#define SPITZ_KEY_STROBE_NUM 11
102
+ * Not allocated a TLB: used only for second stage of an S12 page
83
+#define SPITZ_KEY_SENSE_NUM 7
103
+ * table walk, or for descriptor loads during first stage of an S1
84
104
+ * page table walk. Note that if we ever want to have a TLB for this
85
static const int spitz_gpio_key_sense[SPITZ_KEY_SENSE_NUM] = {
105
+ * then various TLB flush insns which currently are no-ops or flush
86
12, 17, 91, 34, 36, 38, 39
106
+ * only stage 1 MMU indexes will need to change to flush stage 2.
87
@@ -XXX,XX +XXX,XX @@ static int spitz_keymap[SPITZ_KEY_SENSE_NUM + 1][SPITZ_KEY_STROBE_NUM] = {
107
+ */
88
{ 0x52, 0x43, 0x01, 0x47, 0x49, -1 , -1 , -1 , -1 , -1 , -1 },
108
+ ARMMMUIdx_Stage2 = 3 | ARM_MMU_IDX_NOTLB,
89
};
109
90
110
/*
91
-#define SPITZ_GPIO_AK_INT    13    /* Remote control */
111
* M-profile.
92
-#define SPITZ_GPIO_SYNC        16    /* Sync button */
112
@@ -XXX,XX +XXX,XX @@ typedef enum ARMMMUIdxBit {
93
-#define SPITZ_GPIO_ON_KEY    95    /* Power button */
113
TO_CORE_BIT(SE10_1),
94
-#define SPITZ_GPIO_SWA        97    /* Lid */
114
TO_CORE_BIT(SE10_1_PAN),
95
-#define SPITZ_GPIO_SWB        96    /* Tablet mode */
115
TO_CORE_BIT(SE3),
96
+#define SPITZ_GPIO_AK_INT 13 /* Remote control */
116
- TO_CORE_BIT(Stage2),
97
+#define SPITZ_GPIO_SYNC 16 /* Sync button */
117
98
+#define SPITZ_GPIO_ON_KEY 95 /* Power button */
118
TO_CORE_BIT(MUser),
99
+#define SPITZ_GPIO_SWA 97 /* Lid */
119
TO_CORE_BIT(MPriv),
100
+#define SPITZ_GPIO_SWB 96 /* Tablet mode */
120
diff --git a/target/arm/helper.c b/target/arm/helper.c
101
121
index XXXXXXX..XXXXXXX 100644
102
/* The special buttons are mapped to unused keys */
122
--- a/target/arm/helper.c
103
static const int spitz_gpiomap[5] = {
123
+++ b/target/arm/helper.c
104
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_keydown(SpitzKeyboardState *s, int keycode)
124
@@ -XXX,XX +XXX,XX @@ static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
105
#define SPITZ_MOD_CTRL (1 << 8)
125
tlb_flush_by_mmuidx(cs,
106
#define SPITZ_MOD_FN (1 << 9)
126
ARMMMUIdxBit_E10_1 |
107
127
ARMMMUIdxBit_E10_1_PAN |
108
-#define QUEUE_KEY(c)    s->fifo[(s->fifopos + s->fifolen ++) & 0xf] = c
128
- ARMMMUIdxBit_E10_0 |
109
+#define QUEUE_KEY(c) s->fifo[(s->fifopos + s->fifolen ++) & 0xf] = c
129
- ARMMMUIdxBit_Stage2);
110
130
+ ARMMMUIdxBit_E10_0);
111
static void spitz_keyboard_handler(void *opaque, int keycode)
112
{
113
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_handler(void *opaque, int keycode)
114
uint16_t code;
115
int mapcode;
116
switch (keycode) {
117
- case 0x2a:    /* Left Shift */
118
+ case 0x2a: /* Left Shift */
119
s->modifiers |= 1;
120
break;
121
case 0xaa:
122
s->modifiers &= ~1;
123
break;
124
- case 0x36:    /* Right Shift */
125
+ case 0x36: /* Right Shift */
126
s->modifiers |= 2;
127
break;
128
case 0xb6:
129
s->modifiers &= ~2;
130
break;
131
- case 0x1d:    /* Control */
132
+ case 0x1d: /* Control */
133
s->modifiers |= 4;
134
break;
135
case 0x9d:
136
s->modifiers &= ~4;
137
break;
138
- case 0x38:    /* Alt */
139
+ case 0x38: /* Alt */
140
s->modifiers |= 8;
141
break;
142
case 0xb8:
143
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_realize(DeviceState *dev, Error **errp)
144
145
/* LCD backlight controller */
146
147
-#define LCDTG_RESCTL    0x00
148
-#define LCDTG_PHACTRL    0x01
149
-#define LCDTG_DUTYCTRL    0x02
150
-#define LCDTG_POWERREG0    0x03
151
-#define LCDTG_POWERREG1    0x04
152
-#define LCDTG_GPOR3    0x05
153
-#define LCDTG_PICTRL    0x06
154
-#define LCDTG_POLCTRL    0x07
155
+#define LCDTG_RESCTL 0x00
156
+#define LCDTG_PHACTRL 0x01
157
+#define LCDTG_DUTYCTRL 0x02
158
+#define LCDTG_POWERREG0 0x03
159
+#define LCDTG_POWERREG1 0x04
160
+#define LCDTG_GPOR3 0x05
161
+#define LCDTG_PICTRL 0x06
162
+#define LCDTG_POLCTRL 0x07
163
164
typedef struct {
165
SSISlave ssidev;
166
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_realize(SSISlave *dev, Error **errp)
167
168
/* SSP devices */
169
170
-#define CORGI_SSP_PORT        2
171
+#define CORGI_SSP_PORT 2
172
173
-#define SPITZ_GPIO_LCDCON_CS    53
174
-#define SPITZ_GPIO_ADS7846_CS    14
175
-#define SPITZ_GPIO_MAX1111_CS    20
176
-#define SPITZ_GPIO_TP_INT    11
177
+#define SPITZ_GPIO_LCDCON_CS 53
178
+#define SPITZ_GPIO_ADS7846_CS 14
179
+#define SPITZ_GPIO_MAX1111_CS 20
180
+#define SPITZ_GPIO_TP_INT 11
181
182
static DeviceState *max1111;
183
184
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
185
s->enable[line] = !level;
131
}
186
}
132
187
133
static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
188
-#define MAX1111_BATT_VOLT    1
134
@@ -XXX,XX +XXX,XX @@ static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
189
-#define MAX1111_BATT_TEMP    2
135
tlb_flush_by_mmuidx_all_cpus_synced(cs,
190
-#define MAX1111_ACIN_VOLT    3
136
ARMMMUIdxBit_E10_1 |
191
+#define MAX1111_BATT_VOLT 1
137
ARMMMUIdxBit_E10_1_PAN |
192
+#define MAX1111_BATT_TEMP 2
138
- ARMMMUIdxBit_E10_0 |
193
+#define MAX1111_ACIN_VOLT 3
139
- ARMMMUIdxBit_Stage2);
194
140
+ ARMMMUIdxBit_E10_0);
195
-#define SPITZ_BATTERY_TEMP    0xe0    /* About 2.9V */
141
}
196
-#define SPITZ_BATTERY_VOLT    0xd0    /* About 4.0V */
142
197
-#define SPITZ_CHARGEON_ACIN    0x80    /* About 5.0V */
143
-static void tlbiipas2_write(CPUARMState *env, const ARMCPRegInfo *ri,
198
+#define SPITZ_BATTERY_TEMP 0xe0 /* About 2.9V */
144
- uint64_t value)
199
+#define SPITZ_BATTERY_VOLT 0xd0 /* About 4.0V */
145
-{
200
+#define SPITZ_CHARGEON_ACIN 0x80 /* About 5.0V */
146
- /* Invalidate by IPA. This has to invalidate any structures that
201
147
- * contain only stage 2 translation information, but does not need
202
static void spitz_adc_temp_on(void *opaque, int line, int level)
148
- * to apply to structures that contain combined stage 1 and stage 2
203
{
149
- * translation information.
204
@@ -XXX,XX +XXX,XX @@ static void spitz_microdrive_attach(PXA2xxState *cpu, int slot)
150
- * This must NOP if EL2 isn't implemented or SCR_EL3.NS is zero.
205
151
- */
206
/* Wm8750 and Max7310 on I2C */
152
- CPUState *cs = env_cpu(env);
207
153
- uint64_t pageaddr;
208
-#define AKITA_MAX_ADDR    0x18
154
-
209
-#define SPITZ_WM_ADDRL    0x1b
155
- if (!arm_feature(env, ARM_FEATURE_EL2) || !(env->cp15.scr_el3 & SCR_NS)) {
210
-#define SPITZ_WM_ADDRH    0x1a
156
- return;
211
+#define AKITA_MAX_ADDR 0x18
157
- }
212
+#define SPITZ_WM_ADDRL 0x1b
158
-
213
+#define SPITZ_WM_ADDRH 0x1a
159
- pageaddr = sextract64(value << 12, 0, 40);
214
160
-
215
-#define SPITZ_GPIO_WM    5
161
- tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2);
216
+#define SPITZ_GPIO_WM 5
162
-}
217
163
-
218
static void spitz_wm8750_addr(void *opaque, int line, int level)
164
-static void tlbiipas2_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
219
{
165
- uint64_t value)
220
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
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
}
221
}
191
}
222
}
192
@@ -XXX,XX +XXX,XX @@ static int alle1_tlbmask(CPUARMState *env)
223
193
return ARMMMUIdxBit_SE10_1 |
224
-#define SPITZ_SCP_LED_GREEN        1
194
ARMMMUIdxBit_SE10_1_PAN |
225
-#define SPITZ_SCP_JK_B            2
195
ARMMMUIdxBit_SE10_0;
226
-#define SPITZ_SCP_CHRG_ON        3
196
- } else if (arm_feature(env, ARM_FEATURE_EL2)) {
227
-#define SPITZ_SCP_MUTE_L        4
197
- return ARMMMUIdxBit_E10_1 |
228
-#define SPITZ_SCP_MUTE_R        5
198
- ARMMMUIdxBit_E10_1_PAN |
229
-#define SPITZ_SCP_CF_POWER        6
199
- ARMMMUIdxBit_E10_0 |
230
-#define SPITZ_SCP_LED_ORANGE        7
200
- ARMMMUIdxBit_Stage2;
231
-#define SPITZ_SCP_JK_A            8
201
} else {
232
-#define SPITZ_SCP_ADC_TEMP_ON        9
202
return ARMMMUIdxBit_E10_1 |
233
-#define SPITZ_SCP2_IR_ON        1
203
ARMMMUIdxBit_E10_1_PAN |
234
-#define SPITZ_SCP2_AKIN_PULLUP        2
204
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
235
-#define SPITZ_SCP2_BACKLIGHT_CONT    7
205
ARMMMUIdxBit_SE3);
236
-#define SPITZ_SCP2_BACKLIGHT_ON        8
237
-#define SPITZ_SCP2_MIC_BIAS        9
238
+#define SPITZ_SCP_LED_GREEN 1
239
+#define SPITZ_SCP_JK_B 2
240
+#define SPITZ_SCP_CHRG_ON 3
241
+#define SPITZ_SCP_MUTE_L 4
242
+#define SPITZ_SCP_MUTE_R 5
243
+#define SPITZ_SCP_CF_POWER 6
244
+#define SPITZ_SCP_LED_ORANGE 7
245
+#define SPITZ_SCP_JK_A 8
246
+#define SPITZ_SCP_ADC_TEMP_ON 9
247
+#define SPITZ_SCP2_IR_ON 1
248
+#define SPITZ_SCP2_AKIN_PULLUP 2
249
+#define SPITZ_SCP2_BACKLIGHT_CONT 7
250
+#define SPITZ_SCP2_BACKLIGHT_ON 8
251
+#define SPITZ_SCP2_MIC_BIAS 9
252
253
static void spitz_scoop_gpio_setup(PXA2xxState *cpu,
254
DeviceState *scp0, DeviceState *scp1)
255
@@ -XXX,XX +XXX,XX @@ static void spitz_scoop_gpio_setup(PXA2xxState *cpu,
256
qdev_connect_gpio_out(scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
206
}
257
}
207
258
208
-static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
259
-#define SPITZ_GPIO_HSYNC        22
209
- uint64_t value)
260
-#define SPITZ_GPIO_SD_DETECT        9
210
-{
261
-#define SPITZ_GPIO_SD_WP        81
211
- /* Invalidate by IPA. This has to invalidate any structures that
262
-#define SPITZ_GPIO_ON_RESET        89
212
- * contain only stage 2 translation information, but does not need
263
-#define SPITZ_GPIO_BAT_COVER        90
213
- * to apply to structures that contain combined stage 1 and stage 2
264
-#define SPITZ_GPIO_CF1_IRQ        105
214
- * translation information.
265
-#define SPITZ_GPIO_CF1_CD        94
215
- * This must NOP if EL2 isn't implemented or SCR_EL3.NS is zero.
266
-#define SPITZ_GPIO_CF2_IRQ        106
216
- */
267
-#define SPITZ_GPIO_CF2_CD        93
217
- ARMCPU *cpu = env_archcpu(env);
268
+#define SPITZ_GPIO_HSYNC 22
218
- CPUState *cs = CPU(cpu);
269
+#define SPITZ_GPIO_SD_DETECT 9
219
- uint64_t pageaddr;
270
+#define SPITZ_GPIO_SD_WP 81
220
-
271
+#define SPITZ_GPIO_ON_RESET 89
221
- if (!arm_feature(env, ARM_FEATURE_EL2) || !(env->cp15.scr_el3 & SCR_NS)) {
272
+#define SPITZ_GPIO_BAT_COVER 90
222
- return;
273
+#define SPITZ_GPIO_CF1_IRQ 105
223
- }
274
+#define SPITZ_GPIO_CF1_CD 94
224
-
275
+#define SPITZ_GPIO_CF2_IRQ 106
225
- pageaddr = sextract64(value << 12, 0, 48);
276
+#define SPITZ_GPIO_CF2_CD 93
226
-
277
227
- tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2);
278
static int spitz_hsync;
228
-}
279
229
-
280
@@ -XXX,XX +XXX,XX @@ static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
230
-static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
281
/* Board init. */
231
- uint64_t value)
282
enum spitz_model_e { spitz, akita, borzoi, terrier };
232
-{
283
233
- CPUState *cs = env_cpu(env);
284
-#define SPITZ_RAM    0x04000000
234
- uint64_t pageaddr;
285
-#define SPITZ_ROM    0x00800000
235
-
286
+#define SPITZ_RAM 0x04000000
236
- if (!arm_feature(env, ARM_FEATURE_EL2) || !(env->cp15.scr_el3 & SCR_NS)) {
287
+#define SPITZ_ROM 0x00800000
237
- return;
288
238
- }
289
static struct arm_boot_info spitz_binfo = {
239
-
290
.loader_start = PXA2XX_SDRAM_BASE,
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[] = {
250
.writefn = tlbi_aa64_vae1_write },
251
{ .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
252
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
253
- .access = PL2_W, .type = ARM_CP_NO_RAW,
254
- .writefn = tlbi_aa64_ipas2e1is_write },
255
+ .access = PL2_W, .type = ARM_CP_NOP },
256
{ .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64,
257
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
258
- .access = PL2_W, .type = ARM_CP_NO_RAW,
259
- .writefn = tlbi_aa64_ipas2e1is_write },
260
+ .access = PL2_W, .type = ARM_CP_NOP },
261
{ .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64,
262
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
263
.access = PL2_W, .type = ARM_CP_NO_RAW,
264
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
265
.writefn = tlbi_aa64_alle1is_write },
266
{ .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64,
267
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
268
- .access = PL2_W, .type = ARM_CP_NO_RAW,
269
- .writefn = tlbi_aa64_ipas2e1_write },
270
+ .access = PL2_W, .type = ARM_CP_NOP },
271
{ .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64,
272
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
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[] = {
280
.writefn = tlbimva_hyp_is_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 */
302
{ .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 },
304
--
291
--
305
2.20.1
292
2.20.1
306
293
307
294
diff view generated by jsdifflib
Deleted patch
1
The access_type argument to get_phys_addr_lpae() is an MMUAccessType;
2
use the enum constant MMU_DATA_LOAD rather than a literal 0 when we
3
call it in S1_ptw_translate().
4
1
5
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
---
10
target/arm/helper.c | 5 +++--
11
1 file changed, 3 insertions(+), 2 deletions(-)
12
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
16
+++ b/target/arm/helper.c
17
@@ -XXX,XX +XXX,XX @@ static hwaddr S1_ptw_translate(CPUARMState *env, ARMMMUIdx mmu_idx,
18
pcacheattrs = &cacheattrs;
19
}
20
21
- ret = get_phys_addr_lpae(env, addr, 0, ARMMMUIdx_Stage2, &s2pa,
22
- &txattrs, &s2prot, &s2size, fi, pcacheattrs);
23
+ ret = get_phys_addr_lpae(env, addr, MMU_DATA_LOAD, ARMMMUIdx_Stage2,
24
+ &s2pa, &txattrs, &s2prot, &s2size, fi,
25
+ pcacheattrs);
26
if (ret) {
27
assert(fi->type != ARMFault_None);
28
fi->s2addr = addr;
29
--
30
2.20.1
31
32
diff view generated by jsdifflib
1
Convert the Neon comparison ops in the 3-reg-same grouping
1
For the four Spitz-family machines (akita, borzoi, spitz, terrier)
2
to decodetree.
2
create a proper abstract class SpitzMachineClass which encapsulates
3
the common behaviour, rather than having them all derive directly
4
from TYPE_MACHINE:
5
* instead of each machine class setting mc->init to a wrapper
6
function which calls spitz_common_init() with parameters,
7
put that data in the SpitzMachineClass and make spitz_common_init
8
the SpitzMachineClass machine-init function
9
* move the settings of mc->block_default_type and
10
mc->ignore_memory_transaction_failures into the SpitzMachineClass
11
class init rather than repeating them in each machine's class init
12
13
(The motivation is that we're going to want to keep some state in
14
the SpitzMachineState so we can connect GPIOs between devices created
15
in one sub-function of the machine init to devices created in a
16
different sub-function.)
3
17
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200430181003.21682-18-peter.maydell@linaro.org
20
Message-id: 20200628142429.17111-3-peter.maydell@linaro.org
7
---
21
---
8
target/arm/neon-dp.decode | 8 ++++++++
22
hw/arm/spitz.c | 91 ++++++++++++++++++++++++++++++--------------------
9
target/arm/translate-neon.inc.c | 22 ++++++++++++++++++++++
23
1 file changed, 55 insertions(+), 36 deletions(-)
10
target/arm/translate.c | 23 +++--------------------
24
11
3 files changed, 33 insertions(+), 20 deletions(-)
25
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
12
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
14
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
27
--- a/hw/arm/spitz.c
16
+++ b/target/arm/neon-dp.decode
28
+++ b/hw/arm/spitz.c
17
@@ -XXX,XX +XXX,XX @@ VBSL_3s 1111 001 1 0 . 01 .... .... 0001 ... 1 .... @3same_logic
29
@@ -XXX,XX +XXX,XX @@
18
VBIT_3s 1111 001 1 0 . 10 .... .... 0001 ... 1 .... @3same_logic
30
#include "exec/address-spaces.h"
19
VBIF_3s 1111 001 1 0 . 11 .... .... 0001 ... 1 .... @3same_logic
31
#include "cpu.h"
20
32
21
+VCGT_S_3s 1111 001 0 0 . .. .... .... 0011 . . . 0 .... @3same
33
+enum spitz_model_e { spitz, akita, borzoi, terrier };
22
+VCGT_U_3s 1111 001 1 0 . .. .... .... 0011 . . . 0 .... @3same
34
+
23
+VCGE_S_3s 1111 001 0 0 . .. .... .... 0011 . . . 1 .... @3same
35
+typedef struct {
24
+VCGE_U_3s 1111 001 1 0 . .. .... .... 0011 . . . 1 .... @3same
36
+ MachineClass parent;
25
+
37
+ enum spitz_model_e model;
26
VMAX_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 0 .... @3same
38
+ int arm_id;
27
VMAX_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 0 .... @3same
39
+} SpitzMachineClass;
28
VMIN_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 1 .... @3same
40
+
29
@@ -XXX,XX +XXX,XX @@ VMIN_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 1 .... @3same
41
+typedef struct {
30
42
+ MachineState parent;
31
VADD_3s 1111 001 0 0 . .. .... .... 1000 . . . 0 .... @3same
43
+} SpitzMachineState;
32
VSUB_3s 1111 001 1 0 . .. .... .... 1000 . . . 0 .... @3same
44
+
33
+
45
+#define TYPE_SPITZ_MACHINE "spitz-common"
34
+VTST_3s 1111 001 0 0 . .. .... .... 1000 . . . 1 .... @3same
46
+#define SPITZ_MACHINE(obj) \
35
+VCEQ_3s 1111 001 1 0 . .. .... .... 1000 . . . 1 .... @3same
47
+ OBJECT_CHECK(SpitzMachineState, obj, TYPE_SPITZ_MACHINE)
36
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
48
+#define SPITZ_MACHINE_GET_CLASS(obj) \
37
index XXXXXXX..XXXXXXX 100644
49
+ OBJECT_GET_CLASS(SpitzMachineClass, obj, TYPE_SPITZ_MACHINE)
38
--- a/target/arm/translate-neon.inc.c
50
+#define SPITZ_MACHINE_CLASS(klass) \
39
+++ b/target/arm/translate-neon.inc.c
51
+ OBJECT_CLASS_CHECK(SpitzMachineClass, klass, TYPE_SPITZ_MACHINE)
40
@@ -XXX,XX +XXX,XX @@ DO_3SAME_NO_SZ_3(VMAX_S, tcg_gen_gvec_smax)
52
+
41
DO_3SAME_NO_SZ_3(VMAX_U, tcg_gen_gvec_umax)
53
#undef REG_FMT
42
DO_3SAME_NO_SZ_3(VMIN_S, tcg_gen_gvec_smin)
54
#define REG_FMT "0x%02lx"
43
DO_3SAME_NO_SZ_3(VMIN_U, tcg_gen_gvec_umin)
55
44
+
56
@@ -XXX,XX +XXX,XX @@ static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
45
+#define DO_3SAME_CMP(INSN, COND) \
57
}
46
+ static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
58
47
+ uint32_t rn_ofs, uint32_t rm_ofs, \
59
/* Board init. */
48
+ uint32_t oprsz, uint32_t maxsz) \
60
-enum spitz_model_e { spitz, akita, borzoi, terrier };
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
-
61
-
84
- case NEON_3R_VCGT:
62
#define SPITZ_RAM 0x04000000
85
- tcg_gen_gvec_cmp(u ? TCG_COND_GTU : TCG_COND_GT, size,
63
#define SPITZ_ROM 0x00800000
86
- rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
64
87
- return 0;
65
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info spitz_binfo = {
66
.ram_size = 0x04000000,
67
};
68
69
-static void spitz_common_init(MachineState *machine,
70
- enum spitz_model_e model, int arm_id)
71
+static void spitz_common_init(MachineState *machine)
72
{
73
+ SpitzMachineClass *smc = SPITZ_MACHINE_GET_CLASS(machine);
74
+ enum spitz_model_e model = smc->model;
75
PXA2xxState *mpu;
76
DeviceState *scp0, *scp1 = NULL;
77
MemoryRegion *address_space_mem = get_system_memory();
78
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine,
79
/* A 4.0 GB microdrive is permanently sitting in CF slot 0. */
80
spitz_microdrive_attach(mpu, 0);
81
82
- spitz_binfo.board_id = arm_id;
83
+ spitz_binfo.board_id = smc->arm_id;
84
arm_load_kernel(mpu->cpu, machine, &spitz_binfo);
85
sl_bootparam_write(SL_PXA_PARAM_BASE);
86
}
87
88
-static void spitz_init(MachineState *machine)
89
+static void spitz_common_class_init(ObjectClass *oc, void *data)
90
{
91
- spitz_common_init(machine, spitz, 0x2c9);
92
+ MachineClass *mc = MACHINE_CLASS(oc);
93
+
94
+ mc->block_default_type = IF_IDE;
95
+ mc->ignore_memory_transaction_failures = true;
96
+ mc->init = spitz_common_init;
97
}
98
99
-static void borzoi_init(MachineState *machine)
100
-{
101
- spitz_common_init(machine, borzoi, 0x33f);
102
-}
88
-
103
-
89
- case NEON_3R_VCGE:
104
-static void akita_init(MachineState *machine)
90
- tcg_gen_gvec_cmp(u ? TCG_COND_GEU : TCG_COND_GE, size,
105
-{
91
- rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
106
- spitz_common_init(machine, akita, 0x2e8);
92
- return 0;
107
-}
93
-
108
-
94
case NEON_3R_VSHL:
109
-static void terrier_init(MachineState *machine)
95
/* Note the operation is vshl vd,vm,vn */
110
-{
96
tcg_gen_gvec_3(rd_ofs, rm_ofs, rn_ofs, vec_size, vec_size,
111
- spitz_common_init(machine, terrier, 0x33f);
97
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
112
-}
98
case NEON_3R_LOGIC:
113
+static const TypeInfo spitz_common_info = {
99
case NEON_3R_VMAX:
114
+ .name = TYPE_SPITZ_MACHINE,
100
case NEON_3R_VMIN:
115
+ .parent = TYPE_MACHINE,
101
+ case NEON_3R_VTST_VCEQ:
116
+ .abstract = true,
102
+ case NEON_3R_VCGT:
117
+ .instance_size = sizeof(SpitzMachineState),
103
+ case NEON_3R_VCGE:
118
+ .class_size = sizeof(SpitzMachineClass),
104
/* Already handled by decodetree */
119
+ .class_init = spitz_common_class_init,
105
return 1;
120
+};
106
}
121
122
static void akitapda_class_init(ObjectClass *oc, void *data)
123
{
124
MachineClass *mc = MACHINE_CLASS(oc);
125
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
126
127
mc->desc = "Sharp SL-C1000 (Akita) PDA (PXA270)";
128
- mc->init = akita_init;
129
- mc->ignore_memory_transaction_failures = true;
130
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0");
131
+ smc->model = akita;
132
+ smc->arm_id = 0x2e8;
133
}
134
135
static const TypeInfo akitapda_type = {
136
.name = MACHINE_TYPE_NAME("akita"),
137
- .parent = TYPE_MACHINE,
138
+ .parent = TYPE_SPITZ_MACHINE,
139
.class_init = akitapda_class_init,
140
};
141
142
static void spitzpda_class_init(ObjectClass *oc, void *data)
143
{
144
MachineClass *mc = MACHINE_CLASS(oc);
145
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
146
147
mc->desc = "Sharp SL-C3000 (Spitz) PDA (PXA270)";
148
- mc->init = spitz_init;
149
- mc->block_default_type = IF_IDE;
150
- mc->ignore_memory_transaction_failures = true;
151
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0");
152
+ smc->model = spitz;
153
+ smc->arm_id = 0x2c9;
154
}
155
156
static const TypeInfo spitzpda_type = {
157
.name = MACHINE_TYPE_NAME("spitz"),
158
- .parent = TYPE_MACHINE,
159
+ .parent = TYPE_SPITZ_MACHINE,
160
.class_init = spitzpda_class_init,
161
};
162
163
static void borzoipda_class_init(ObjectClass *oc, void *data)
164
{
165
MachineClass *mc = MACHINE_CLASS(oc);
166
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
167
168
mc->desc = "Sharp SL-C3100 (Borzoi) PDA (PXA270)";
169
- mc->init = borzoi_init;
170
- mc->block_default_type = IF_IDE;
171
- mc->ignore_memory_transaction_failures = true;
172
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0");
173
+ smc->model = borzoi;
174
+ smc->arm_id = 0x33f;
175
}
176
177
static const TypeInfo borzoipda_type = {
178
.name = MACHINE_TYPE_NAME("borzoi"),
179
- .parent = TYPE_MACHINE,
180
+ .parent = TYPE_SPITZ_MACHINE,
181
.class_init = borzoipda_class_init,
182
};
183
184
static void terrierpda_class_init(ObjectClass *oc, void *data)
185
{
186
MachineClass *mc = MACHINE_CLASS(oc);
187
+ SpitzMachineClass *smc = SPITZ_MACHINE_CLASS(oc);
188
189
mc->desc = "Sharp SL-C3200 (Terrier) PDA (PXA270)";
190
- mc->init = terrier_init;
191
- mc->block_default_type = IF_IDE;
192
- mc->ignore_memory_transaction_failures = true;
193
mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c5");
194
+ smc->model = terrier;
195
+ smc->arm_id = 0x33f;
196
}
197
198
static const TypeInfo terrierpda_type = {
199
.name = MACHINE_TYPE_NAME("terrier"),
200
- .parent = TYPE_MACHINE,
201
+ .parent = TYPE_SPITZ_MACHINE,
202
.class_init = terrierpda_class_init,
203
};
204
205
static void spitz_machine_init(void)
206
{
207
+ type_register_static(&spitz_common_info);
208
type_register_static(&akitapda_type);
209
type_register_static(&spitzpda_type);
210
type_register_static(&borzoipda_type);
107
--
211
--
108
2.20.1
212
2.20.1
109
213
110
214
diff view generated by jsdifflib
1
Convert the Neon 3-reg-same VMAX and VMIN insns to decodetree.
1
Keep pointers to the MPU and the SSI devices in SpitzMachineState.
2
We're going to want to make GPIO connections between some of the
3
SSI devices and the SCPs, so we want to keep hold of a pointer to
4
those; putting the MPU into the struct allows us to pass just
5
one thing to spitz_ssp_attach() rather than two.
6
7
We have to retain the setting of the global "max1111" variable
8
for the moment as it is used in spitz_adc_temp_on(); later in
9
this series of commits we will be able to remove it.
2
10
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Message-id: 20200430181003.21682-17-peter.maydell@linaro.org
13
Message-id: 20200628142429.17111-4-peter.maydell@linaro.org
6
---
14
---
7
target/arm/neon-dp.decode | 5 +++++
15
hw/arm/spitz.c | 50 ++++++++++++++++++++++++++++----------------------
8
target/arm/translate-neon.inc.c | 14 ++++++++++++++
16
1 file changed, 28 insertions(+), 22 deletions(-)
9
target/arm/translate.c | 21 ++-------------------
10
3 files changed, 21 insertions(+), 19 deletions(-)
11
17
12
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
18
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
13
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-dp.decode
20
--- a/hw/arm/spitz.c
15
+++ b/target/arm/neon-dp.decode
21
+++ b/hw/arm/spitz.c
16
@@ -XXX,XX +XXX,XX @@ VBSL_3s 1111 001 1 0 . 01 .... .... 0001 ... 1 .... @3same_logic
22
@@ -XXX,XX +XXX,XX @@ typedef struct {
17
VBIT_3s 1111 001 1 0 . 10 .... .... 0001 ... 1 .... @3same_logic
23
18
VBIF_3s 1111 001 1 0 . 11 .... .... 0001 ... 1 .... @3same_logic
24
typedef struct {
19
25
MachineState parent;
20
+VMAX_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 0 .... @3same
26
+ PXA2xxState *mpu;
21
+VMAX_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 0 .... @3same
27
+ DeviceState *mux;
22
+VMIN_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 1 .... @3same
28
+ DeviceState *lcdtg;
23
+VMIN_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 1 .... @3same
29
+ DeviceState *ads7846;
24
+
30
+ DeviceState *max1111;
25
VADD_3s 1111 001 0 0 . .. .... .... 1000 . . . 0 .... @3same
31
} SpitzMachineState;
26
VSUB_3s 1111 001 1 0 . .. .... .... 1000 . . . 0 .... @3same
32
27
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
33
#define TYPE_SPITZ_MACHINE "spitz-common"
28
index XXXXXXX..XXXXXXX 100644
34
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_realize(SSISlave *d, Error **errp)
29
--- a/target/arm/translate-neon.inc.c
35
s->bus[2] = ssi_create_bus(dev, "ssi2");
30
+++ b/target/arm/translate-neon.inc.c
36
}
31
@@ -XXX,XX +XXX,XX @@ DO_3SAME(VEOR, tcg_gen_gvec_xor)
37
32
DO_3SAME_BITSEL(VBSL, rd_ofs, rn_ofs, rm_ofs)
38
-static void spitz_ssp_attach(PXA2xxState *cpu)
33
DO_3SAME_BITSEL(VBIT, rm_ofs, rn_ofs, rd_ofs)
39
+static void spitz_ssp_attach(SpitzMachineState *sms)
34
DO_3SAME_BITSEL(VBIF, rm_ofs, rd_ofs, rn_ofs)
40
{
35
+
41
- DeviceState *mux;
36
+#define DO_3SAME_NO_SZ_3(INSN, FUNC) \
42
- DeviceState *dev;
37
+ static bool trans_##INSN##_3s(DisasContext *s, arg_3same *a) \
43
void *bus;
38
+ { \
44
39
+ if (a->size == 3) { \
45
- mux = ssi_create_slave(cpu->ssp[CORGI_SSP_PORT - 1], "corgi-ssp");
40
+ return false; \
46
+ sms->mux = ssi_create_slave(sms->mpu->ssp[CORGI_SSP_PORT - 1], "corgi-ssp");
41
+ } \
47
42
+ return do_3same(s, a, FUNC); \
48
- bus = qdev_get_child_bus(mux, "ssi0");
43
+ }
49
- ssi_create_slave(bus, "spitz-lcdtg");
44
+
50
+ bus = qdev_get_child_bus(sms->mux, "ssi0");
45
+DO_3SAME_NO_SZ_3(VMAX_S, tcg_gen_gvec_smax)
51
+ sms->lcdtg = ssi_create_slave(bus, "spitz-lcdtg");
46
+DO_3SAME_NO_SZ_3(VMAX_U, tcg_gen_gvec_umax)
52
47
+DO_3SAME_NO_SZ_3(VMIN_S, tcg_gen_gvec_smin)
53
- bus = qdev_get_child_bus(mux, "ssi1");
48
+DO_3SAME_NO_SZ_3(VMIN_U, tcg_gen_gvec_umin)
54
- dev = ssi_create_slave(bus, "ads7846");
49
diff --git a/target/arm/translate.c b/target/arm/translate.c
55
- qdev_connect_gpio_out(dev, 0,
50
index XXXXXXX..XXXXXXX 100644
56
- qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_TP_INT));
51
--- a/target/arm/translate.c
57
+ bus = qdev_get_child_bus(sms->mux, "ssi1");
52
+++ b/target/arm/translate.c
58
+ sms->ads7846 = ssi_create_slave(bus, "ads7846");
53
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
59
+ qdev_connect_gpio_out(sms->ads7846, 0,
54
rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
60
+ qdev_get_gpio_in(sms->mpu->gpio, SPITZ_GPIO_TP_INT));
55
return 0;
61
56
62
- bus = qdev_get_child_bus(mux, "ssi2");
57
- case NEON_3R_VMAX:
63
- max1111 = ssi_create_slave(bus, "max1111");
58
- if (u) {
64
- max111x_set_input(max1111, MAX1111_BATT_VOLT, SPITZ_BATTERY_VOLT);
59
- tcg_gen_gvec_umax(size, rd_ofs, rn_ofs, rm_ofs,
65
- max111x_set_input(max1111, MAX1111_BATT_TEMP, 0);
60
- vec_size, vec_size);
66
- max111x_set_input(max1111, MAX1111_ACIN_VOLT, SPITZ_CHARGEON_ACIN);
61
- } else {
67
+ bus = qdev_get_child_bus(sms->mux, "ssi2");
62
- tcg_gen_gvec_smax(size, rd_ofs, rn_ofs, rm_ofs,
68
+ sms->max1111 = ssi_create_slave(bus, "max1111");
63
- vec_size, vec_size);
69
+ max1111 = sms->max1111;
64
- }
70
+ max111x_set_input(sms->max1111, MAX1111_BATT_VOLT, SPITZ_BATTERY_VOLT);
65
- return 0;
71
+ max111x_set_input(sms->max1111, MAX1111_BATT_TEMP, 0);
66
- case NEON_3R_VMIN:
72
+ max111x_set_input(sms->max1111, MAX1111_ACIN_VOLT, SPITZ_CHARGEON_ACIN);
67
- if (u) {
73
68
- tcg_gen_gvec_umin(size, rd_ofs, rn_ofs, rm_ofs,
74
- qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_LCDCON_CS,
69
- vec_size, vec_size);
75
- qdev_get_gpio_in(mux, 0));
70
- } else {
76
- qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_ADS7846_CS,
71
- tcg_gen_gvec_smin(size, rd_ofs, rn_ofs, rm_ofs,
77
- qdev_get_gpio_in(mux, 1));
72
- vec_size, vec_size);
78
- qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_MAX1111_CS,
73
- }
79
- qdev_get_gpio_in(mux, 2));
74
- return 0;
80
+ qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_LCDCON_CS,
75
-
81
+ qdev_get_gpio_in(sms->mux, 0));
76
case NEON_3R_VSHL:
82
+ qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_ADS7846_CS,
77
/* Note the operation is vshl vd,vm,vn */
83
+ qdev_get_gpio_in(sms->mux, 1));
78
tcg_gen_gvec_3(rd_ofs, rm_ofs, rn_ofs, vec_size, vec_size,
84
+ qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_MAX1111_CS,
79
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
85
+ qdev_get_gpio_in(sms->mux, 2));
80
86
}
81
case NEON_3R_VADD_VSUB:
87
82
case NEON_3R_LOGIC:
88
/* CF Microdrive */
83
+ case NEON_3R_VMAX:
89
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info spitz_binfo = {
84
+ case NEON_3R_VMIN:
90
static void spitz_common_init(MachineState *machine)
85
/* Already handled by decodetree */
91
{
86
return 1;
92
SpitzMachineClass *smc = SPITZ_MACHINE_GET_CLASS(machine);
87
}
93
+ SpitzMachineState *sms = SPITZ_MACHINE(machine);
94
enum spitz_model_e model = smc->model;
95
PXA2xxState *mpu;
96
DeviceState *scp0, *scp1 = NULL;
97
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
98
/* Setup CPU & memory */
99
mpu = pxa270_init(address_space_mem, spitz_binfo.ram_size,
100
machine->cpu_type);
101
+ sms->mpu = mpu;
102
103
sl_flash_register(mpu, (model == spitz) ? FLASH_128M : FLASH_1024M);
104
105
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
106
/* Setup peripherals */
107
spitz_keyboard_register(mpu);
108
109
- spitz_ssp_attach(mpu);
110
+ spitz_ssp_attach(sms);
111
112
scp0 = sysbus_create_simple("scoop", 0x10800000, NULL);
113
if (model != akita) {
88
--
114
--
89
2.20.1
115
2.20.1
90
116
91
117
diff view generated by jsdifflib
1
For ARMv8.2-TTS2UXN, the stage 2 page table walk wants to know
1
Keep pointers to scp0, scp1 in SpitzMachineState, and just pass
2
whether the stage 1 access is for EL0 or not, because whether
2
that to spitz_scoop_gpio_setup().
3
exec permission is given can depend on whether this is an EL0
4
or EL1 access. Add a new argument to get_phys_addr_lpae() so
5
the call sites can pass this information in.
6
3
7
Since get_phys_addr_lpae() doesn't already have a doc comment,
4
(We'll want to use some of the other fields in SpitzMachineState
8
add one so we have a place to put the documentation of the
5
in that function in the next commit.)
9
semantics of the new s1_is_el0 argument.
10
6
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20200628142429.17111-5-peter.maydell@linaro.org
14
Message-id: 20200330210400.11724-4-peter.maydell@linaro.org
15
---
10
---
16
target/arm/helper.c | 29 ++++++++++++++++++++++++++++-
11
hw/arm/spitz.c | 34 +++++++++++++++++++---------------
17
1 file changed, 28 insertions(+), 1 deletion(-)
12
1 file changed, 19 insertions(+), 15 deletions(-)
18
13
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
20
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/helper.c
16
--- a/hw/arm/spitz.c
22
+++ b/target/arm/helper.c
17
+++ b/hw/arm/spitz.c
23
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ typedef struct {
24
19
DeviceState *lcdtg;
25
static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
20
DeviceState *ads7846;
26
MMUAccessType access_type, ARMMMUIdx mmu_idx,
21
DeviceState *max1111;
27
+ bool s1_is_el0,
22
+ DeviceState *scp0;
28
hwaddr *phys_ptr, MemTxAttrs *txattrs, int *prot,
23
+ DeviceState *scp1;
29
target_ulong *page_size_ptr,
24
} SpitzMachineState;
30
ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs);
25
31
@@ -XXX,XX +XXX,XX @@ static hwaddr S1_ptw_translate(CPUARMState *env, ARMMMUIdx mmu_idx,
26
#define TYPE_SPITZ_MACHINE "spitz-common"
32
}
27
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
33
28
#define SPITZ_SCP2_BACKLIGHT_ON 8
34
ret = get_phys_addr_lpae(env, addr, MMU_DATA_LOAD, ARMMMUIdx_Stage2,
29
#define SPITZ_SCP2_MIC_BIAS 9
35
+ false,
30
36
&s2pa, &txattrs, &s2prot, &s2size, fi,
31
-static void spitz_scoop_gpio_setup(PXA2xxState *cpu,
37
pcacheattrs);
32
- DeviceState *scp0, DeviceState *scp1)
38
if (ret) {
33
+static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
39
@@ -XXX,XX +XXX,XX @@ static ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
34
{
40
};
35
- qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, cpu, 8);
36
+ qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, sms->mpu, 8);
37
38
- qdev_connect_gpio_out(scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
39
- qdev_connect_gpio_out(scp0, SPITZ_SCP_JK_B, outsignals[1]);
40
- qdev_connect_gpio_out(scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
41
- qdev_connect_gpio_out(scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
42
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
43
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_JK_B, outsignals[1]);
44
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
45
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
46
47
- if (scp1) {
48
- qdev_connect_gpio_out(scp1, SPITZ_SCP2_BACKLIGHT_CONT, outsignals[4]);
49
- qdev_connect_gpio_out(scp1, SPITZ_SCP2_BACKLIGHT_ON, outsignals[5]);
50
+ if (sms->scp1) {
51
+ qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_CONT,
52
+ outsignals[4]);
53
+ qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_ON,
54
+ outsignals[5]);
55
}
56
57
- qdev_connect_gpio_out(scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
58
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
41
}
59
}
42
60
43
+/**
61
#define SPITZ_GPIO_HSYNC 22
44
+ * get_phys_addr_lpae: perform one stage of page table walk, LPAE format
62
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
45
+ *
63
SpitzMachineState *sms = SPITZ_MACHINE(machine);
46
+ * Returns false if the translation was successful. Otherwise, phys_ptr, attrs,
64
enum spitz_model_e model = smc->model;
47
+ * prot and page_size may not be filled in, and the populated fsr value provides
65
PXA2xxState *mpu;
48
+ * information on why the translation aborted, in the format of a long-format
66
- DeviceState *scp0, *scp1 = NULL;
49
+ * DFSR/IFSR fault register, with the following caveats:
67
MemoryRegion *address_space_mem = get_system_memory();
50
+ * * the WnR bit is never set (the caller must do this).
68
MemoryRegion *rom = g_new(MemoryRegion, 1);
51
+ *
69
52
+ * @env: CPUARMState
70
@@ -XXX,XX +XXX,XX @@ static void spitz_common_init(MachineState *machine)
53
+ * @address: virtual address to get physical address for
71
54
+ * @access_type: MMU_DATA_LOAD, MMU_DATA_STORE or MMU_INST_FETCH
72
spitz_ssp_attach(sms);
55
+ * @mmu_idx: MMU index indicating required translation regime
73
56
+ * @s1_is_el0: if @mmu_idx is ARMMMUIdx_Stage2 (so this is a stage 2 page table
74
- scp0 = sysbus_create_simple("scoop", 0x10800000, NULL);
57
+ * walk), must be true if this is stage 2 of a stage 1+2 walk for an
75
+ sms->scp0 = sysbus_create_simple("scoop", 0x10800000, NULL);
58
+ * EL0 access). If @mmu_idx is anything else, @s1_is_el0 is ignored.
76
if (model != akita) {
59
+ * @phys_ptr: set to the physical address corresponding to the virtual address
77
- scp1 = sysbus_create_simple("scoop", 0x08800040, NULL);
60
+ * @attrs: set to the memory transaction attributes to use
78
+ sms->scp1 = sysbus_create_simple("scoop", 0x08800040, NULL);
61
+ * @prot: set to the permissions for the page containing phys_ptr
79
+ } else {
62
+ * @page_size_ptr: set to the size of the page containing phys_ptr
80
+ sms->scp1 = NULL;
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
}
81
}
82
82
83
if (regime_using_lpae_format(env, mmu_idx)) {
83
- spitz_scoop_gpio_setup(mpu, scp0, scp1);
84
- return get_phys_addr_lpae(env, address, access_type, mmu_idx,
84
+ spitz_scoop_gpio_setup(sms);
85
+ return get_phys_addr_lpae(env, address, access_type, mmu_idx, false,
85
86
phys_ptr, attrs, prot, page_size,
86
spitz_gpio_setup(mpu, (model == akita) ? 1 : 2);
87
fi, cacheattrs);
87
88
} else if (regime_sctlr(env, mmu_idx) & SCTLR_XP) {
89
--
88
--
90
2.20.1
89
2.20.1
91
90
92
91
diff view generated by jsdifflib
1
Convert the VFM[AS]L (scalar) insns in the 2reg-scalar-ext group
1
Currently the Spitz board uses a nasty hack for the GPIO lines
2
to decodetree. These are the last ones in the group so we can remove
2
that pass "bit5" and "power" information to the LCD controller:
3
all the legacy decode for the group.
3
the lcdtg realize function sets a global variable to point to
4
the instance it just realized, and then the functions spitz_bl_power()
5
and spitz_bl_bit5() use that to find the device they are changing
6
the internal state of. There is a comment reading:
7
FIXME: Implement GPIO properly and remove this hack.
8
which was added in 2009.
4
9
5
Note that in disas_thumb2_insn() the parts of this encoding space
10
Implement GPIO properly and remove this hack.
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
11
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-id: 20200430181003.21682-11-peter.maydell@linaro.org
14
Message-id: 20200628142429.17111-6-peter.maydell@linaro.org
13
---
15
---
14
target/arm/neon-shared.decode | 7 +++
16
hw/arm/spitz.c | 28 ++++++++++++----------------
15
target/arm/translate-neon.inc.c | 32 ++++++++++
17
1 file changed, 12 insertions(+), 16 deletions(-)
16
target/arm/translate.c | 107 +-------------------------------
17
3 files changed, 40 insertions(+), 106 deletions(-)
18
18
19
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
19
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
20
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/neon-shared.decode
21
--- a/hw/arm/spitz.c
22
+++ b/target/arm/neon-shared.decode
22
+++ b/hw/arm/spitz.c
23
@@ -XXX,XX +XXX,XX @@ VCMLA_scalar 1111 1110 1 . rot:2 .... .... 1000 . q:1 . 0 .... \
23
@@ -XXX,XX +XXX,XX @@ static void spitz_bl_update(SpitzLCDTG *s)
24
24
zaurus_printf("LCD Backlight now off\n");
25
VDOT_scalar 1111 1110 0 . 10 .... .... 1101 . q:1 index:1 u:1 rm:4 \
26
vm=%vm_dp vn=%vn_dp vd=%vd_dp
27
+
28
+%vfml_scalar_q0_rm 0:3 5:1
29
+%vfml_scalar_q1_index 5:1 3:1
30
+VFML_scalar 1111 1110 0 . 0 s:1 .... .... 1000 . 0 . 1 index:1 ... \
31
+ rm=%vfml_scalar_q0_rm vn=%vn_sp vd=%vd_dp q=0
32
+VFML_scalar 1111 1110 0 . 0 s:1 .... .... 1000 . 1 . 1 . rm:3 \
33
+ index=%vfml_scalar_q1_index vn=%vn_dp vd=%vd_dp q=1
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
}
25
}
42
+
26
43
+static bool trans_VFML_scalar(DisasContext *s, arg_VFML_scalar *a)
27
-/* FIXME: Implement GPIO properly and remove this hack. */
44
+{
28
-static SpitzLCDTG *spitz_lcdtg;
45
+ int opr_sz;
29
-
46
+
30
static inline void spitz_bl_bit5(void *opaque, int line, int level)
47
+ if (!dc_isar_feature(aa32_fhm, s)) {
31
{
48
+ return false;
32
- SpitzLCDTG *s = spitz_lcdtg;
49
+ }
33
+ SpitzLCDTG *s = opaque;
50
+
34
int prev = s->bl_intensity;
51
+ /* UNDEF accesses to D16-D31 if they don't exist. */
35
52
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
36
if (level)
53
+ ((a->vd & 0x10) || (a->q && (a->vn & 0x10)))) {
37
@@ -XXX,XX +XXX,XX @@ static inline void spitz_bl_bit5(void *opaque, int line, int level)
54
+ return false;
38
55
+ }
39
static inline void spitz_bl_power(void *opaque, int line, int level)
56
+
40
{
57
+ if (a->vd & a->q) {
41
- SpitzLCDTG *s = spitz_lcdtg;
58
+ return false;
42
+ SpitzLCDTG *s = opaque;
59
+ }
43
s->bl_power = !!level;
60
+
44
spitz_bl_update(s);
61
+ if (!vfp_access_check(s)) {
62
+ return true;
63
+ }
64
+
65
+ opr_sz = (1 + a->q) * 8;
66
+ tcg_gen_gvec_3_ptr(vfp_reg_offset(1, a->vd),
67
+ vfp_reg_offset(a->q, a->vn),
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
}
45
}
80
46
@@ -XXX,XX +XXX,XX @@ static uint32_t spitz_lcdtg_transfer(SSISlave *dev, uint32_t value)
81
#define VFP_REG_SHR(x, n) (((n) > 0) ? (x) >> (n) : (x) << -(n))
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;
47
return 0;
101
}
48
}
102
49
103
-/* Advanced SIMD two registers and a scalar extension.
50
-static void spitz_lcdtg_realize(SSISlave *dev, Error **errp)
104
- * 31 24 23 22 20 16 12 11 10 9 8 3 0
51
+static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
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
{
52
{
193
int cpnum, is64, crn, crm, opc1, opc2, isread, rt, rt2;
53
- SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, dev);
194
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
54
+ SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, ssi);
195
}
55
+ DeviceState *dev = DEVICE(s);
196
}
56
197
}
57
- spitz_lcdtg = s;
198
- } else if ((insn & 0x0f000a00) == 0x0e000800
58
s->bl_power = 0;
199
- && arm_dc_feature(s, ARM_FEATURE_V8)) {
59
s->bl_intensity = 0x20;
200
- if (disas_neon_insn_2reg_scalar_ext(s, insn)) {
60
+
201
- goto illegal_op;
61
+ qdev_init_gpio_in_named(dev, spitz_bl_bit5, "bl_bit5", 1);
202
- }
62
+ qdev_init_gpio_in_named(dev, spitz_bl_power, "bl_power", 1);
203
- return;
63
}
204
}
64
205
goto illegal_op;
65
/* SSP devices */
66
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
67
case 3:
68
zaurus_printf("Orange LED %s.\n", level ? "on" : "off");
69
break;
70
- case 4:
71
- spitz_bl_bit5(opaque, line, level);
72
- break;
73
- case 5:
74
- spitz_bl_power(opaque, line, level);
75
- break;
76
case 6:
77
spitz_adc_temp_on(opaque, line, level);
78
break;
79
+ default:
80
+ g_assert_not_reached();
206
}
81
}
207
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
82
}
208
}
83
209
break;
84
@@ -XXX,XX +XXX,XX @@ static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
210
}
85
211
- if ((insn & 0xff000a00) == 0xfe000800
86
if (sms->scp1) {
212
- && arm_dc_feature(s, ARM_FEATURE_V8)) {
87
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_CONT,
213
- /* The Thumb2 and ARM encodings are identical. */
88
- outsignals[4]);
214
- if (disas_neon_insn_2reg_scalar_ext(s, insn)) {
89
+ qdev_get_gpio_in_named(sms->lcdtg, "bl_bit5", 0));
215
- goto illegal_op;
90
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_ON,
216
- }
91
- outsignals[5]);
217
- } else if (((insn >> 24) & 3) == 3) {
92
+ qdev_get_gpio_in_named(sms->lcdtg, "bl_power", 0));
218
+ if (((insn >> 24) & 3) == 3) {
93
}
219
/* Translate into the equivalent ARM encoding. */
94
220
insn = (insn & 0xe2ffffff) | ((insn & (1 << 28)) >> 4) | (1 << 28);
95
qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
221
if (disas_neon_data_insn(s, insn)) {
222
--
96
--
223
2.20.1
97
2.20.1
224
98
225
99
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
Add some QOM properties to the max111x ADC device to allow the
2
initial values to be configured. Currently this is done by
3
board code calling max111x_set_input() after it creates the
4
device, which doesn't work on system reset.
2
5
3
Add support for SD.
6
This requires us to implement a reset method for this device,
7
so while we're doing that make sure we reset the other parts
8
of the device state.
4
9
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
13
Message-id: 20200628142429.17111-7-peter.maydell@linaro.org
8
Message-id: 20200427181649.26851-11-edgar.iglesias@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
14
---
11
hw/arm/xlnx-versal-virt.c | 46 +++++++++++++++++++++++++++++++++++++++
15
hw/misc/max111x.c | 57 ++++++++++++++++++++++++++++++++++++++---------
12
1 file changed, 46 insertions(+)
16
1 file changed, 47 insertions(+), 10 deletions(-)
13
17
14
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
18
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
15
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/xlnx-versal-virt.c
20
--- a/hw/misc/max111x.c
17
+++ b/hw/arm/xlnx-versal-virt.c
21
+++ b/hw/misc/max111x.c
18
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
19
#include "hw/arm/sysbus-fdt.h"
23
#include "hw/ssi/ssi.h"
20
#include "hw/arm/fdt.h"
24
#include "migration/vmstate.h"
21
#include "cpu.h"
25
#include "qemu/module.h"
22
+#include "hw/qdev-properties.h"
26
+#include "hw/qdev-properties.h"
23
#include "hw/arm/xlnx-versal.h"
27
24
28
typedef struct {
25
#define TYPE_XLNX_VERSAL_VIRT_MACHINE MACHINE_TYPE_NAME("xlnx-versal-virt")
29
SSISlave parent_obj;
26
@@ -XXX,XX +XXX,XX @@ static void fdt_add_zdma_nodes(VersalVirt *s)
30
27
}
31
qemu_irq interrupt;
32
+ /* Values of inputs at system reset (settable by QOM property) */
33
+ uint8_t reset_input[8];
34
+
35
uint8_t tb1, rb2, rb3;
36
int cycle;
37
38
@@ -XXX,XX +XXX,XX @@ static int max111x_init(SSISlave *d, int inputs)
39
qdev_init_gpio_out(dev, &s->interrupt, 1);
40
41
s->inputs = inputs;
42
- /* TODO: add a user interface for setting these */
43
- s->input[0] = 0xf0;
44
- s->input[1] = 0xe0;
45
- s->input[2] = 0xd0;
46
- s->input[3] = 0xc0;
47
- s->input[4] = 0xb0;
48
- s->input[5] = 0xa0;
49
- s->input[6] = 0x90;
50
- s->input[7] = 0x80;
51
- s->com = 0;
52
53
vmstate_register(VMSTATE_IF(dev), VMSTATE_INSTANCE_ID_ANY,
54
&vmstate_max111x, s);
55
@@ -XXX,XX +XXX,XX @@ void max111x_set_input(DeviceState *dev, int line, uint8_t value)
56
s->input[line] = value;
28
}
57
}
29
58
30
+static void fdt_add_sd_nodes(VersalVirt *s)
59
+static void max111x_reset(DeviceState *dev)
31
+{
60
+{
32
+ const char clocknames[] = "clk_xin\0clk_ahb";
61
+ MAX111xState *s = MAX_111X(dev);
33
+ const char compat[] = "arasan,sdhci-8.9a";
34
+ int i;
62
+ int i;
35
+
63
+
36
+ for (i = ARRAY_SIZE(s->soc.pmc.iou.sd) - 1; i >= 0; i--) {
64
+ for (i = 0; i < s->inputs; i++) {
37
+ uint64_t addr = MM_PMC_SD0 + MM_PMC_SD0_SIZE * i;
65
+ s->input[i] = s->reset_input[i];
38
+ char *name = g_strdup_printf("/sdhci@%" PRIx64, addr);
39
+
40
+ qemu_fdt_add_subnode(s->fdt, name);
41
+
42
+ qemu_fdt_setprop_cells(s->fdt, name, "clocks",
43
+ s->phandle.clk_25Mhz, s->phandle.clk_25Mhz);
44
+ qemu_fdt_setprop(s->fdt, name, "clock-names",
45
+ clocknames, sizeof(clocknames));
46
+ qemu_fdt_setprop_cells(s->fdt, name, "interrupts",
47
+ GIC_FDT_IRQ_TYPE_SPI, VERSAL_SD0_IRQ_0 + i * 2,
48
+ GIC_FDT_IRQ_FLAGS_LEVEL_HI);
49
+ qemu_fdt_setprop_sized_cells(s->fdt, name, "reg",
50
+ 2, addr, 2, MM_PMC_SD0_SIZE);
51
+ qemu_fdt_setprop(s->fdt, name, "compatible", compat, sizeof(compat));
52
+ g_free(name);
53
+ }
66
+ }
67
+ s->com = 0;
68
+ s->tb1 = 0;
69
+ s->rb2 = 0;
70
+ s->rb3 = 0;
71
+ s->cycle = 0;
54
+}
72
+}
55
+
73
+
56
static void fdt_nop_memory_nodes(void *fdt, Error **errp)
74
+static Property max1110_properties[] = {
75
+ /* Reset values for ADC inputs */
76
+ DEFINE_PROP_UINT8("input0", MAX111xState, reset_input[0], 0xf0),
77
+ DEFINE_PROP_UINT8("input1", MAX111xState, reset_input[1], 0xe0),
78
+ DEFINE_PROP_UINT8("input2", MAX111xState, reset_input[2], 0xd0),
79
+ DEFINE_PROP_UINT8("input3", MAX111xState, reset_input[3], 0xc0),
80
+ DEFINE_PROP_END_OF_LIST(),
81
+};
82
+
83
+static Property max1111_properties[] = {
84
+ /* Reset values for ADC inputs */
85
+ DEFINE_PROP_UINT8("input0", MAX111xState, reset_input[0], 0xf0),
86
+ DEFINE_PROP_UINT8("input1", MAX111xState, reset_input[1], 0xe0),
87
+ DEFINE_PROP_UINT8("input2", MAX111xState, reset_input[2], 0xd0),
88
+ DEFINE_PROP_UINT8("input3", MAX111xState, reset_input[3], 0xc0),
89
+ DEFINE_PROP_UINT8("input4", MAX111xState, reset_input[4], 0xb0),
90
+ DEFINE_PROP_UINT8("input5", MAX111xState, reset_input[5], 0xa0),
91
+ DEFINE_PROP_UINT8("input6", MAX111xState, reset_input[6], 0x90),
92
+ DEFINE_PROP_UINT8("input7", MAX111xState, reset_input[7], 0x80),
93
+ DEFINE_PROP_END_OF_LIST(),
94
+};
95
+
96
static void max111x_class_init(ObjectClass *klass, void *data)
57
{
97
{
58
Error *err = NULL;
98
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
59
@@ -XXX,XX +XXX,XX @@ static void create_virtio_regions(VersalVirt *s)
99
+ DeviceClass *dc = DEVICE_CLASS(klass);
60
}
100
101
k->transfer = max111x_transfer;
102
+ dc->reset = max111x_reset;
61
}
103
}
62
104
63
+static void sd_plugin_card(SDHCIState *sd, DriveInfo *di)
105
static const TypeInfo max111x_info = {
64
+{
106
@@ -XXX,XX +XXX,XX @@ static const TypeInfo max111x_info = {
65
+ BlockBackend *blk = di ? blk_by_legacy_dinfo(di) : NULL;
107
static void max1110_class_init(ObjectClass *klass, void *data)
66
+ DeviceState *card;
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
{
108
{
77
VersalVirt *s = XLNX_VERSAL_VIRT_MACHINE(machine);
109
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
78
int psci_conduit = QEMU_PSCI_CONDUIT_DISABLED;
110
+ DeviceClass *dc = DEVICE_CLASS(klass);
79
+ int i;
111
80
112
k->realize = max1110_realize;
81
/*
113
+ device_class_set_props(dc, max1110_properties);
82
* If the user provides an Operating System to be loaded, we expect them
114
}
83
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
115
84
fdt_add_gic_nodes(s);
116
static const TypeInfo max1110_info = {
85
fdt_add_timer_nodes(s);
117
@@ -XXX,XX +XXX,XX @@ static const TypeInfo max1110_info = {
86
fdt_add_zdma_nodes(s);
118
static void max1111_class_init(ObjectClass *klass, void *data)
87
+ fdt_add_sd_nodes(s);
119
{
88
fdt_add_cpu_nodes(s, psci_conduit);
120
SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
89
fdt_add_clk_node(s, "/clk125", 125000000, s->phandle.clk_125Mhz);
121
+ DeviceClass *dc = DEVICE_CLASS(klass);
90
fdt_add_clk_node(s, "/clk25", 25000000, s->phandle.clk_25Mhz);
122
91
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
123
k->realize = max1111_realize;
92
memory_region_add_subregion_overlap(get_system_memory(),
124
+ device_class_set_props(dc, max1111_properties);
93
0, &s->soc.fpd.apu.mr, 0);
125
}
94
126
95
+ /* Plugin SD cards. */
127
static const TypeInfo max1111_info = {
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
--
128
--
104
2.20.1
129
2.20.1
105
130
106
131
diff view generated by jsdifflib
1
Convert the VFM[AS]L (vector) insns to decodetree. This is the last
1
The max111x is a proper qdev device; we can use dc->vmsd rather than
2
insn in the legacy decoder for the 3same_ext group, so we can
2
directly calling vmstate_register().
3
delete the legacy decoder function for the group entirely.
4
3
5
Note that in disas_thumb2_insn() the parts of this encoding space
4
It's possible that this is a migration compat break, but the only
6
where the decodetree decoder returns false will correctly be directed
5
boards that use this device are the spitz-family ('akita', 'borzoi',
7
to illegal_op by the "(insn & (1 << 28))" check so they won't fall
6
'spitz', 'terrier').
8
into disas_coproc_insn() by mistake.
9
7
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20200430181003.21682-8-peter.maydell@linaro.org
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-id: 20200628142429.17111-8-peter.maydell@linaro.org
13
---
12
---
14
target/arm/neon-shared.decode | 6 +++
13
hw/misc/max111x.c | 3 +--
15
target/arm/translate-neon.inc.c | 31 +++++++++++
14
1 file changed, 1 insertion(+), 2 deletions(-)
16
target/arm/translate.c | 92 +--------------------------------
17
3 files changed, 38 insertions(+), 91 deletions(-)
18
15
19
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
16
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
20
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/neon-shared.decode
18
--- a/hw/misc/max111x.c
22
+++ b/target/arm/neon-shared.decode
19
+++ b/hw/misc/max111x.c
23
@@ -XXX,XX +XXX,XX @@ VCADD 1111 110 rot:1 1 . 0 size:1 .... .... 1000 . q:1 . 0 .... \
20
@@ -XXX,XX +XXX,XX @@ static int max111x_init(SSISlave *d, int inputs)
24
# VUDOT and VSDOT
21
25
VDOT 1111 110 00 . 10 .... .... 1101 . q:1 . u:1 .... \
22
s->inputs = inputs;
26
vm=%vm_dp vn=%vn_dp vd=%vd_dp
23
27
+
24
- vmstate_register(VMSTATE_IF(dev), VMSTATE_INSTANCE_ID_ANY,
28
+# VFM[AS]L
25
- &vmstate_max111x, s);
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
}
41
+
42
+static bool trans_VFML(DisasContext *s, arg_VFML *a)
43
+{
44
+ int opr_sz;
45
+
46
+ if (!dc_isar_feature(aa32_fhm, s)) {
47
+ return false;
48
+ }
49
+
50
+ /* UNDEF accesses to D16-D31 if they don't exist. */
51
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
52
+ (a->vd & 0x10)) {
53
+ return false;
54
+ }
55
+
56
+ if (a->vd & a->q) {
57
+ return false;
58
+ }
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;
26
return 0;
78
}
27
}
79
28
80
-/* Advanced SIMD three registers of the same length extension.
29
@@ -XXX,XX +XXX,XX @@ static void max111x_class_init(ObjectClass *klass, void *data)
81
- * 31 25 23 22 20 16 12 11 10 9 8 3 0
30
82
- * +---------------+-----+---+-----+----+----+---+----+---+----+---------+----+
31
k->transfer = max111x_transfer;
83
- * | 1 1 1 1 1 1 0 | op1 | D | op2 | Vn | Vd | 1 | o3 | 0 | o4 | N Q M U | Vm |
32
dc->reset = max111x_reset;
84
- * +---------------+-----+---+-----+----+----+---+----+---+----+---------+----+
33
+ dc->vmsd = &vmstate_max111x;
85
- */
34
}
86
-static int disas_neon_insn_3same_ext(DisasContext *s, uint32_t insn)
35
87
-{
36
static const TypeInfo max111x_info = {
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
--
37
--
192
2.20.1
38
2.20.1
193
39
194
40
diff view generated by jsdifflib
1
Convert the Neon "load/store multiple structures" insns to decodetree.
1
Add an ssi_realize_and_unref(), for the benefit of callers
2
who want to be able to create an SSI device, set QOM properties
3
on it, and then do the realize-and-unref afterwards.
4
5
The API works on the same principle as the recently added
6
qdev_realize_and_undef(), sysbus_realize_and_undef(), etc.
2
7
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Message-id: 20200430181003.21682-12-peter.maydell@linaro.org
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-id: 20200628142429.17111-9-peter.maydell@linaro.org
6
---
12
---
7
target/arm/neon-ls.decode | 7 ++
13
include/hw/ssi/ssi.h | 26 ++++++++++++++++++++++++++
8
target/arm/translate-neon.inc.c | 124 ++++++++++++++++++++++++++++++++
14
hw/ssi/ssi.c | 7 ++++++-
9
target/arm/translate.c | 91 +----------------------
15
2 files changed, 32 insertions(+), 1 deletion(-)
10
3 files changed, 133 insertions(+), 89 deletions(-)
11
16
12
diff --git a/target/arm/neon-ls.decode b/target/arm/neon-ls.decode
17
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
13
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-ls.decode
19
--- a/include/hw/ssi/ssi.h
15
+++ b/target/arm/neon-ls.decode
20
+++ b/include/hw/ssi/ssi.h
16
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ extern const VMStateDescription vmstate_ssi_slave;
17
# 0b1111_1001_xxx0_xxxx_xxxx_xxxx_xxxx_xxxx
22
}
18
# This file works on the A32 encoding only; calling code for T32 has to
23
19
# transform the insn into the A32 version first.
24
DeviceState *ssi_create_slave(SSIBus *bus, const char *name);
20
+
25
+/**
21
+%vd_dp 22:1 12:4
26
+ * ssi_realize_and_unref: realize and unref an SSI slave device
22
+
27
+ * @dev: SSI slave device to realize
23
+# Neon load/store multiple structures
28
+ * @bus: SSI bus to put it on
24
+
29
+ * @errp: error pointer
25
+VLDST_multiple 1111 0100 0 . l:1 0 rn:4 .... itype:4 size:2 align:2 rm:4 \
30
+ *
26
+ vd=%vd_dp
31
+ * Call 'realize' on @dev, put it on the specified @bus, and drop the
27
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
32
+ * reference to it. Errors are reported via @errp and by returning
33
+ * false.
34
+ *
35
+ * This function is useful if you have created @dev via qdev_new()
36
+ * (which takes a reference to the device it returns to you), so that
37
+ * you can set properties on it before realizing it. If you don't need
38
+ * to set properties then ssi_create_slave() is probably better (as it
39
+ * does the create, init and realize in one step).
40
+ *
41
+ * If you are embedding the SSI slave into another QOM device and
42
+ * initialized it via some variant on object_initialize_child() then
43
+ * do not use this function, because that family of functions arrange
44
+ * for the only reference to the child device to be held by the parent
45
+ * via the child<> property, and so the reference-count-drop done here
46
+ * would be incorrect. (Instead you would want ssi_realize(), which
47
+ * doesn't currently exist but would be trivial to create if we had
48
+ * any code that wanted it.)
49
+ */
50
+bool ssi_realize_and_unref(DeviceState *dev, SSIBus *bus, Error **errp);
51
52
/* Master interface. */
53
SSIBus *ssi_create_bus(DeviceState *parent, const char *name);
54
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
28
index XXXXXXX..XXXXXXX 100644
55
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/translate-neon.inc.c
56
--- a/hw/ssi/ssi.c
30
+++ b/target/arm/translate-neon.inc.c
57
+++ b/hw/ssi/ssi.c
31
@@ -XXX,XX +XXX,XX @@ static bool trans_VFML_scalar(DisasContext *s, arg_VFML_scalar *a)
58
@@ -XXX,XX +XXX,XX @@ static const TypeInfo ssi_slave_info = {
32
gen_helper_gvec_fmlal_idx_a32);
59
.abstract = true,
33
return true;
60
};
34
}
61
35
+
62
+bool ssi_realize_and_unref(DeviceState *dev, SSIBus *bus, Error **errp)
36
+static struct {
37
+ int nregs;
38
+ int interleave;
39
+ int spacing;
40
+} const neon_ls_element_type[11] = {
41
+ {1, 4, 1},
42
+ {1, 4, 2},
43
+ {4, 1, 1},
44
+ {2, 2, 2},
45
+ {1, 3, 1},
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
+{
63
+{
57
+ if (rm != 15) {
64
+ return qdev_realize_and_unref(dev, &bus->parent_obj, errp);
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
+ }
71
+}
65
+}
72
+
66
+
73
+static bool trans_VLDST_multiple(DisasContext *s, arg_VLDST_multiple *a)
67
DeviceState *ssi_create_slave(SSIBus *bus, const char *name)
74
+{
68
{
75
+ /* Neon load/store multiple structures */
69
DeviceState *dev = qdev_new(name);
76
+ int nregs, interleave, spacing, reg, n;
70
77
+ MemOp endian = s->be_data;
71
- qdev_realize_and_unref(dev, &bus->parent_obj, &error_fatal);
78
+ int mmu_idx = get_mem_index(s);
72
+ ssi_realize_and_unref(dev, bus, &error_fatal);
79
+ int size = a->size;
73
return dev;
80
+ TCGv_i64 tmp64;
81
+ TCGv_i32 addr, tmp;
82
+
83
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
84
+ return false;
85
+ }
86
+
87
+ /* UNDEF accesses to D16-D31 if they don't exist */
88
+ if (!dc_isar_feature(aa32_simd_r32, s) && (a->vd & 0x10)) {
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
}
74
}
165
75
166
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
--
76
--
283
2.20.1
77
2.20.1
284
78
285
79
diff view generated by jsdifflib
1
Convert the Neon logic ops in the 3-reg-same grouping to decodetree.
1
Use the new max111x qdev properties to set the initial input
2
Note that for the logic ops the 'size' field forms part of their
2
values rather than calling max111x_set_input(); this means that
3
decode and the actual operations are always bitwise.
3
on system reset the inputs will correctly return to their initial
4
values.
4
5
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
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>
7
Message-id: 20200430181003.21682-16-peter.maydell@linaro.org
8
Message-id: 20200628142429.17111-10-peter.maydell@linaro.org
8
---
9
---
9
target/arm/neon-dp.decode | 12 +++++++++++
10
hw/arm/spitz.c | 11 +++++++----
10
target/arm/translate-neon.inc.c | 19 +++++++++++++++++
11
1 file changed, 7 insertions(+), 4 deletions(-)
11
target/arm/translate.c | 38 +--------------------------------
12
3 files changed, 32 insertions(+), 37 deletions(-)
13
12
14
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
13
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/neon-dp.decode
15
--- a/hw/arm/spitz.c
17
+++ b/target/arm/neon-dp.decode
16
+++ b/hw/arm/spitz.c
18
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
19
@3same .... ... . . . size:2 .... .... .... . q:1 . . .... \
18
qdev_get_gpio_in(sms->mpu->gpio, SPITZ_GPIO_TP_INT));
20
&3same vm=%vm_dp vn=%vn_dp vd=%vd_dp
19
21
20
bus = qdev_get_child_bus(sms->mux, "ssi2");
22
+@3same_logic .... ... . . . .. .... .... .... . q:1 .. .... \
21
- sms->max1111 = ssi_create_slave(bus, "max1111");
23
+ &3same vm=%vm_dp vn=%vn_dp vd=%vd_dp size=0
22
+ sms->max1111 = qdev_new("max1111");
24
+
23
max1111 = sms->max1111;
25
+VAND_3s 1111 001 0 0 . 00 .... .... 0001 ... 1 .... @3same_logic
24
- max111x_set_input(sms->max1111, MAX1111_BATT_VOLT, SPITZ_BATTERY_VOLT);
26
+VBIC_3s 1111 001 0 0 . 01 .... .... 0001 ... 1 .... @3same_logic
25
- max111x_set_input(sms->max1111, MAX1111_BATT_TEMP, 0);
27
+VORR_3s 1111 001 0 0 . 10 .... .... 0001 ... 1 .... @3same_logic
26
- max111x_set_input(sms->max1111, MAX1111_ACIN_VOLT, SPITZ_CHARGEON_ACIN);
28
+VORN_3s 1111 001 0 0 . 11 .... .... 0001 ... 1 .... @3same_logic
27
+ qdev_prop_set_uint8(sms->max1111, "input1" /* BATT_VOLT */,
29
+VEOR_3s 1111 001 1 0 . 00 .... .... 0001 ... 1 .... @3same_logic
28
+ SPITZ_BATTERY_VOLT);
30
+VBSL_3s 1111 001 1 0 . 01 .... .... 0001 ... 1 .... @3same_logic
29
+ qdev_prop_set_uint8(sms->max1111, "input2" /* BATT_TEMP */, 0);
31
+VBIT_3s 1111 001 1 0 . 10 .... .... 0001 ... 1 .... @3same_logic
30
+ qdev_prop_set_uint8(sms->max1111, "input3" /* ACIN_VOLT */,
32
+VBIF_3s 1111 001 1 0 . 11 .... .... 0001 ... 1 .... @3same_logic
31
+ SPITZ_CHARGEON_ACIN);
33
+
32
+ ssi_realize_and_unref(sms->max1111, bus, &error_fatal);
34
VADD_3s 1111 001 0 0 . .. .... .... 1000 . . . 0 .... @3same
33
35
VSUB_3s 1111 001 1 0 . .. .... .... 1000 . . . 0 .... @3same
34
qdev_connect_gpio_out(sms->mpu->gpio, SPITZ_GPIO_LCDCON_CS,
36
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
35
qdev_get_gpio_in(sms->mux, 0));
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/translate-neon.inc.c
39
+++ b/target/arm/translate-neon.inc.c
40
@@ -XXX,XX +XXX,XX @@ static bool do_3same(DisasContext *s, arg_3same *a, GVecGen3Fn fn)
41
42
DO_3SAME(VADD, tcg_gen_gvec_add)
43
DO_3SAME(VSUB, tcg_gen_gvec_sub)
44
+DO_3SAME(VAND, tcg_gen_gvec_and)
45
+DO_3SAME(VBIC, tcg_gen_gvec_andc)
46
+DO_3SAME(VORR, tcg_gen_gvec_or)
47
+DO_3SAME(VORN, tcg_gen_gvec_orc)
48
+DO_3SAME(VEOR, tcg_gen_gvec_xor)
49
+
50
+/* These insns are all gvec_bitsel but with the inputs in various orders. */
51
+#define DO_3SAME_BITSEL(INSN, O1, O2, O3) \
52
+ static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
53
+ uint32_t rn_ofs, uint32_t rm_ofs, \
54
+ uint32_t oprsz, uint32_t maxsz) \
55
+ { \
56
+ tcg_gen_gvec_bitsel(vece, rd_ofs, O1, O2, O3, oprsz, maxsz); \
57
+ } \
58
+ DO_3SAME(INSN, gen_##INSN##_3s)
59
+
60
+DO_3SAME_BITSEL(VBSL, rd_ofs, rn_ofs, rm_ofs)
61
+DO_3SAME_BITSEL(VBIT, rm_ofs, rn_ofs, rd_ofs)
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
--
36
--
120
2.20.1
37
2.20.1
121
38
122
39
diff view generated by jsdifflib
1
Convert the Neon "load/store single structure to one lane" insns to
1
The max111x ADC device model allows other code to set the level on
2
decodetree.
2
the 8 ADC inputs using the max111x_set_input() function. Replace
3
this with generic qdev GPIO inputs, which also allow inputs to be set
4
to arbitrary values.
3
5
4
As this is the last set of insns in the neon load/store group,
6
Using GPIO lines will make it easier for board code to wire things
5
we can remove the whole disas_neon_ls_insn() function.
7
up, so that if device A wants to set the ADC input it doesn't need to
8
have a direct pointer to the max111x but can just set that value on
9
its output GPIO, which is then wired up by the board to the
10
appropriate max111x input.
6
11
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20200430181003.21682-14-peter.maydell@linaro.org
14
Message-id: 20200628142429.17111-11-peter.maydell@linaro.org
10
---
15
---
11
target/arm/neon-ls.decode | 11 +++
16
include/hw/ssi/ssi.h | 3 ---
12
target/arm/translate-neon.inc.c | 89 +++++++++++++++++++
17
hw/arm/spitz.c | 9 +++++----
13
target/arm/translate.c | 147 --------------------------------
18
hw/misc/max111x.c | 16 +++++++++-------
14
3 files changed, 100 insertions(+), 147 deletions(-)
19
3 files changed, 14 insertions(+), 14 deletions(-)
15
20
16
diff --git a/target/arm/neon-ls.decode b/target/arm/neon-ls.decode
21
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
17
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/neon-ls.decode
23
--- a/include/hw/ssi/ssi.h
19
+++ b/target/arm/neon-ls.decode
24
+++ b/include/hw/ssi/ssi.h
20
@@ -XXX,XX +XXX,XX @@ VLDST_multiple 1111 0100 0 . l:1 0 rn:4 .... itype:4 size:2 align:2 rm:4 \
25
@@ -XXX,XX +XXX,XX @@ SSIBus *ssi_create_bus(DeviceState *parent, const char *name);
21
26
22
VLD_all_lanes 1111 0100 1 . 1 0 rn:4 .... 11 n:2 size:2 t:1 a:1 rm:4 \
27
uint32_t ssi_transfer(SSIBus *bus, uint32_t val);
23
vd=%vd_dp
28
29
-/* max111x.c */
30
-void max111x_set_input(DeviceState *dev, int line, uint8_t value);
31
-
32
#endif
33
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/spitz.c
36
+++ b/hw/arm/spitz.c
37
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
38
39
static void spitz_adc_temp_on(void *opaque, int line, int level)
40
{
41
+ int batt_temp;
24
+
42
+
25
+# Neon load/store single structure to one lane
43
if (!max1111)
26
+%imm1_5_p1 5:1 !function=plus1
44
return;
27
+%imm1_6_p1 6:1 !function=plus1
45
46
- if (level)
47
- max111x_set_input(max1111, MAX1111_BATT_TEMP, SPITZ_BATTERY_TEMP);
48
- else
49
- max111x_set_input(max1111, MAX1111_BATT_TEMP, 0);
50
+ batt_temp = level ? SPITZ_BATTERY_TEMP : 0;
28
+
51
+
29
+VLDST_single 1111 0100 1 . l:1 0 rn:4 .... 00 n:2 reg_idx:3 align:1 rm:4 \
52
+ qemu_set_irq(qdev_get_gpio_in(max1111, MAX1111_BATT_TEMP), batt_temp);
30
+ vd=%vd_dp size=0 stride=1
53
}
31
+VLDST_single 1111 0100 1 . l:1 0 rn:4 .... 01 n:2 reg_idx:2 align:2 rm:4 \
54
32
+ vd=%vd_dp size=1 stride=%imm1_5_p1
55
static void corgi_ssp_realize(SSISlave *d, Error **errp)
33
+VLDST_single 1111 0100 1 . l:1 0 rn:4 .... 10 n:2 reg_idx:1 align:3 rm:4 \
56
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
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
57
index XXXXXXX..XXXXXXX 100644
37
--- a/target/arm/translate-neon.inc.c
58
--- a/hw/misc/max111x.c
38
+++ b/target/arm/translate-neon.inc.c
59
+++ b/hw/misc/max111x.c
39
@@ -XXX,XX +XXX,XX @@
60
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_max111x = {
40
* It might be possible to convert it to a standalone .c file eventually.
61
}
41
*/
62
};
42
63
43
+static inline int plus1(DisasContext *s, int x)
64
+static void max111x_input_set(void *opaque, int line, int value)
44
+{
65
+{
45
+ return x + 1;
66
+ MAX111xState *s = MAX_111X(opaque);
67
+
68
+ assert(line >= 0 && line < s->inputs);
69
+ s->input[line] = value;
46
+}
70
+}
47
+
71
+
48
/* Include the generated Neon decoder */
72
static int max111x_init(SSISlave *d, int inputs)
49
#include "decode-neon-dp.inc.c"
73
{
50
#include "decode-neon-ls.inc.c"
74
DeviceState *dev = DEVICE(d);
51
@@ -XXX,XX +XXX,XX @@ static bool trans_VLD_all_lanes(DisasContext *s, arg_VLD_all_lanes *a)
75
MAX111xState *s = MAX_111X(dev);
52
76
53
return true;
77
qdev_init_gpio_out(dev, &s->interrupt, 1);
78
+ qdev_init_gpio_in(dev, max111x_input_set, inputs);
79
80
s->inputs = inputs;
81
82
@@ -XXX,XX +XXX,XX @@ static void max1111_realize(SSISlave *dev, Error **errp)
83
max111x_init(dev, 4);
54
}
84
}
55
+
85
56
+static bool trans_VLDST_single(DisasContext *s, arg_VLDST_single *a)
86
-void max111x_set_input(DeviceState *dev, int line, uint8_t value)
57
+{
58
+ /* Neon load/store single structure to one lane */
59
+ int reg;
60
+ int nregs = a->n + 1;
61
+ int vd = a->vd;
62
+ TCGv_i32 addr, tmp;
63
+
64
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
65
+ return false;
66
+ }
67
+
68
+ /* UNDEF accesses to D16-D31 if they don't exist */
69
+ if (!dc_isar_feature(aa32_simd_r32, s) && (a->vd & 0x10)) {
70
+ return false;
71
+ }
72
+
73
+ /* Catch the UNDEF cases. This is unavoidably a bit messy. */
74
+ switch (nregs) {
75
+ case 1:
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
}
146
147
-
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
-{
87
-{
152
- int rd, rn, rm;
88
- MAX111xState *s = MAX_111X(dev);
153
- int nregs;
89
- assert(line >= 0 && line < s->inputs);
154
- int stride;
90
- s->input[line] = value;
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
-}
91
-}
280
-
92
-
281
static inline void gen_neon_narrow(int size, TCGv_i32 dest, TCGv_i64 src)
93
static void max111x_reset(DeviceState *dev)
282
{
94
{
283
switch (size) {
95
MAX111xState *s = MAX_111X(dev);
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
--
96
--
312
2.20.1
97
2.20.1
313
98
314
99
diff view generated by jsdifflib
1
Add the infrastructure for building and invoking a decodetree decoder
1
Create a header file for the hw/misc/max111x device, in the
2
for the AArch32 Neon encodings. At the moment the new decoder covers
2
usual modern style for QOM devices:
3
nothing, so we always fall back to the existing hand-written decode.
3
* definition of the TYPE_ constants and macros
4
* definition of the device's state struct so that it can
5
be embedded in other structs if desired
6
* documentation of the interface
4
7
5
We follow the same pattern we did for the VFP decodetree conversion
8
This allows us to use TYPE_MAX_1111 in the spitz.c code rather
6
(commit 78e138bc1f672c145ef6ace74617d and following): code that deals
9
than the string "max1111".
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
10
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
23
Message-id: 20200430181003.21682-4-peter.maydell@linaro.org
13
Message-id: 20200628142429.17111-12-peter.maydell@linaro.org
24
---
14
---
25
target/arm/neon-dp.decode | 29 ++++++++++++++++++++++++++
15
include/hw/misc/max111x.h | 56 +++++++++++++++++++++++++++++++++++++++
26
target/arm/neon-ls.decode | 29 ++++++++++++++++++++++++++
16
hw/arm/spitz.c | 3 ++-
27
target/arm/neon-shared.decode | 27 +++++++++++++++++++++++++
17
hw/misc/max111x.c | 24 +----------------
28
target/arm/translate-neon.inc.c | 32 +++++++++++++++++++++++++++++
18
MAINTAINERS | 1 +
29
target/arm/translate.c | 36 +++++++++++++++++++++++++++++++--
19
4 files changed, 60 insertions(+), 24 deletions(-)
30
target/arm/Makefile.objs | 18 +++++++++++++++++
20
create mode 100644 include/hw/misc/max111x.h
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
21
37
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
22
diff --git a/include/hw/misc/max111x.h b/include/hw/misc/max111x.h
38
new file mode 100644
23
new file mode 100644
39
index XXXXXXX..XXXXXXX
24
index XXXXXXX..XXXXXXX
40
--- /dev/null
25
--- /dev/null
41
+++ b/target/arm/neon-dp.decode
26
+++ b/include/hw/misc/max111x.h
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 @@
27
@@ -XXX,XX +XXX,XX @@
146
+/*
28
+/*
147
+ * ARM translation: AArch32 Neon instructions
29
+ * Maxim MAX1110/1111 ADC chip emulation.
148
+ *
30
+ *
149
+ * Copyright (c) 2003 Fabrice Bellard
31
+ * Copyright (c) 2006 Openedhand Ltd.
150
+ * Copyright (c) 2005-2007 CodeSourcery
32
+ * Written by Andrzej Zaborowski <balrog@zabor.org>
151
+ * Copyright (c) 2007 OpenedHand, Ltd.
152
+ * Copyright (c) 2020 Linaro, Ltd.
153
+ *
33
+ *
154
+ * This library is free software; you can redistribute it and/or
34
+ * This code is licensed under the GNU GPLv2.
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
+ *
35
+ *
159
+ * This library is distributed in the hope that it will be useful,
36
+ * Contributions after 2012-01-13 are licensed under the terms of the
160
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
37
+ * GNU GPL, version 2 or (at your option) any later version.
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
+ */
38
+ */
167
+
39
+
40
+#ifndef HW_MISC_MAX111X_H
41
+#define HW_MISC_MAX111X_H
42
+
43
+#include "hw/ssi/ssi.h"
44
+
168
+/*
45
+/*
169
+ * This file is intended to be included from translate.c; it uses
46
+ * This is a model of the Maxim MAX1110/1111 ADC chip, which for QEMU
170
+ * some macros and definitions provided by that file.
47
+ * is an SSI slave device. It has either 4 (max1110) or 8 (max1111)
171
+ * It might be possible to convert it to a standalone .c file eventually.
48
+ * 8-bit ADC channels.
49
+ *
50
+ * QEMU interface:
51
+ * + GPIO inputs 0..3 (for max1110) or 0..7 (for max1111): set the value
52
+ * of each ADC input, as an unsigned 8-bit value
53
+ * + GPIO output 0: interrupt line
54
+ * + Properties "input0" to "input3" (max1110) or "input0" to "input7"
55
+ * (max1111): initial reset values for ADC inputs.
56
+ *
57
+ * Known bugs:
58
+ * + the interrupt line is not correctly implemented, and will never
59
+ * be lowered once it has been asserted.
172
+ */
60
+ */
61
+typedef struct {
62
+ SSISlave parent_obj;
173
+
63
+
174
+/* Include the generated Neon decoder */
64
+ qemu_irq interrupt;
175
+#include "decode-neon-dp.inc.c"
65
+ /* Values of inputs at system reset (settable by QOM property) */
176
+#include "decode-neon-ls.inc.c"
66
+ uint8_t reset_input[8];
177
+#include "decode-neon-shared.inc.c"
67
+
178
diff --git a/target/arm/translate.c b/target/arm/translate.c
68
+ uint8_t tb1, rb2, rb3;
69
+ int cycle;
70
+
71
+ uint8_t input[8];
72
+ int inputs, com;
73
+} MAX111xState;
74
+
75
+#define TYPE_MAX_111X "max111x"
76
+
77
+#define MAX_111X(obj) \
78
+ OBJECT_CHECK(MAX111xState, (obj), TYPE_MAX_111X)
79
+
80
+#define TYPE_MAX_1110 "max1110"
81
+#define TYPE_MAX_1111 "max1111"
82
+
83
+#endif
84
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
179
index XXXXXXX..XXXXXXX 100644
85
index XXXXXXX..XXXXXXX 100644
180
--- a/target/arm/translate.c
86
--- a/hw/arm/spitz.c
181
+++ b/target/arm/translate.c
87
+++ b/hw/arm/spitz.c
182
@@ -XXX,XX +XXX,XX @@ static TCGv_ptr vfp_reg_ptr(bool dp, int reg)
88
@@ -XXX,XX +XXX,XX @@
183
89
#include "audio/audio.h"
184
#define ARM_CP_RW_BIT (1 << 20)
90
#include "hw/boards.h"
185
91
#include "hw/sysbus.h"
186
-/* Include the VFP decoder */
92
+#include "hw/misc/max111x.h"
187
+/* Include the VFP and Neon decoders */
93
#include "migration/vmstate.h"
188
#include "translate-vfp.inc.c"
94
#include "exec/address-spaces.h"
189
+#include "translate-neon.inc.c"
95
#include "cpu.h"
190
96
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
191
static inline void iwmmxt_load_reg(TCGv_i64 var, int reg)
97
qdev_get_gpio_in(sms->mpu->gpio, SPITZ_GPIO_TP_INT));
192
{
98
193
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
99
bus = qdev_get_child_bus(sms->mux, "ssi2");
194
/* Unconditional instructions. */
100
- sms->max1111 = qdev_new("max1111");
195
/* TODO: Perhaps merge these into one decodetree output file. */
101
+ sms->max1111 = qdev_new(TYPE_MAX_1111);
196
if (disas_a32_uncond(s, insn) ||
102
max1111 = sms->max1111;
197
- disas_vfp_uncond(s, insn)) {
103
qdev_prop_set_uint8(sms->max1111, "input1" /* BATT_VOLT */,
198
+ disas_vfp_uncond(s, insn) ||
104
SPITZ_BATTERY_VOLT);
199
+ disas_neon_dp(s, insn) ||
105
diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
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
106
index XXXXXXX..XXXXXXX 100644
249
--- a/target/arm/Makefile.objs
107
--- a/hw/misc/max111x.c
250
+++ b/target/arm/Makefile.objs
108
+++ b/hw/misc/max111x.c
251
@@ -XXX,XX +XXX,XX @@ target/arm/decode-sve.inc.c: $(SRC_PATH)/target/arm/sve.decode $(DECODETREE)
109
@@ -XXX,XX +XXX,XX @@
252
     $(PYTHON) $(DECODETREE) --decode disas_sve -o $@ $<,\
110
*/
253
     "GEN", $(TARGET_DIR)$@)
111
254
112
#include "qemu/osdep.h"
255
+target/arm/decode-neon-shared.inc.c: $(SRC_PATH)/target/arm/neon-shared.decode $(DECODETREE)
113
+#include "hw/misc/max111x.h"
256
+    $(call quiet-command,\
114
#include "hw/irq.h"
257
+     $(PYTHON) $(DECODETREE) --static-decode disas_neon_shared -o $@ $<,\
115
-#include "hw/ssi/ssi.h"
258
+     "GEN", $(TARGET_DIR)$@)
116
#include "migration/vmstate.h"
259
+
117
#include "qemu/module.h"
260
+target/arm/decode-neon-dp.inc.c: $(SRC_PATH)/target/arm/neon-dp.decode $(DECODETREE)
118
#include "hw/qdev-properties.h"
261
+    $(call quiet-command,\
119
262
+     $(PYTHON) $(DECODETREE) --static-decode disas_neon_dp -o $@ $<,\
120
-typedef struct {
263
+     "GEN", $(TARGET_DIR)$@)
121
- SSISlave parent_obj;
264
+
122
-
265
+target/arm/decode-neon-ls.inc.c: $(SRC_PATH)/target/arm/neon-ls.decode $(DECODETREE)
123
- qemu_irq interrupt;
266
+    $(call quiet-command,\
124
- /* Values of inputs at system reset (settable by QOM property) */
267
+     $(PYTHON) $(DECODETREE) --static-decode disas_neon_ls -o $@ $<,\
125
- uint8_t reset_input[8];
268
+     "GEN", $(TARGET_DIR)$@)
126
-
269
+
127
- uint8_t tb1, rb2, rb3;
270
target/arm/decode-vfp.inc.c: $(SRC_PATH)/target/arm/vfp.decode $(DECODETREE)
128
- int cycle;
271
    $(call quiet-command,\
129
-
272
     $(PYTHON) $(DECODETREE) --static-decode disas_vfp -o $@ $<,\
130
- uint8_t input[8];
273
@@ -XXX,XX +XXX,XX @@ target/arm/decode-t16.inc.c: $(SRC_PATH)/target/arm/t16.decode $(DECODETREE)
131
- int inputs, com;
274
     "GEN", $(TARGET_DIR)$@)
132
-} MAX111xState;
275
133
-
276
target/arm/translate-sve.o: target/arm/decode-sve.inc.c
134
-#define TYPE_MAX_111X "max111x"
277
+target/arm/translate.o: target/arm/decode-neon-shared.inc.c
135
-
278
+target/arm/translate.o: target/arm/decode-neon-dp.inc.c
136
-#define MAX_111X(obj) \
279
+target/arm/translate.o: target/arm/decode-neon-ls.inc.c
137
- OBJECT_CHECK(MAX111xState, (obj), TYPE_MAX_111X)
280
target/arm/translate.o: target/arm/decode-vfp.inc.c
138
-
281
target/arm/translate.o: target/arm/decode-vfp-uncond.inc.c
139
-#define TYPE_MAX_1110 "max1110"
282
target/arm/translate.o: target/arm/decode-a32.inc.c
140
-#define TYPE_MAX_1111 "max1111"
141
-
142
/* Control-byte bitfields */
143
#define CB_PD0        (1 << 0)
144
#define CB_PD1        (1 << 1)
145
diff --git a/MAINTAINERS b/MAINTAINERS
146
index XXXXXXX..XXXXXXX 100644
147
--- a/MAINTAINERS
148
+++ b/MAINTAINERS
149
@@ -XXX,XX +XXX,XX @@ F: hw/gpio/max7310.c
150
F: hw/gpio/zaurus.c
151
F: hw/misc/mst_fpga.c
152
F: hw/misc/max111x.c
153
+F: include/hw/misc/max111x.h
154
F: include/hw/arm/pxa.h
155
F: include/hw/arm/sharpsl.h
156
F: include/hw/display/tc6393xb.h
283
--
157
--
284
2.20.1
158
2.20.1
285
159
286
160
diff view generated by jsdifflib
1
The ARMv8.2-TTS2UXN feature extends the XN field in stage 2
1
Currently we have a free-floating set of IRQs and a function
2
translation table descriptors from just bit [54] to bits [54:53],
2
spitz_out_switch() which handle some miscellaneous GPIO lines for the
3
allowing stage 2 to control execution permissions separately for EL0
3
spitz board. Encapsulate this behaviour in a simple QOM device.
4
and EL1. Implement the new semantics of the XN field and enable
4
5
the feature for our 'max' CPU.
5
At this point we can finally remove the 'max1111' global, because the
6
ADC battery-temperature value is now handled by the misc-gpio device
7
writing the value to its outbound "adc-temp" GPIO, which the board
8
code wires up to the appropriate inbound GPIO line on the max1111.
9
10
This commit also fixes Coverity issue CID 1421913 (which pointed out
11
that the 'outsignals' in spitz_scoop_gpio_setup() were leaked),
12
because it removes the use of the qemu_allocate_irqs() API from this
13
code entirely.
6
14
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
16
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20200330210400.11724-5-peter.maydell@linaro.org
18
Message-id: 20200628142429.17111-13-peter.maydell@linaro.org
11
---
19
---
12
target/arm/cpu.h | 15 +++++++++++++++
20
hw/arm/spitz.c | 129 +++++++++++++++++++++++++++++++++----------------
13
target/arm/cpu.c | 1 +
21
1 file changed, 87 insertions(+), 42 deletions(-)
14
target/arm/cpu64.c | 2 ++
22
15
target/arm/helper.c | 37 +++++++++++++++++++++++++++++++------
23
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
16
4 files changed, 49 insertions(+), 6 deletions(-)
17
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.h
25
--- a/hw/arm/spitz.c
21
+++ b/target/arm/cpu.h
26
+++ b/hw/arm/spitz.c
22
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa32_ccidx(const ARMISARegisters *id)
27
@@ -XXX,XX +XXX,XX @@ typedef struct {
23
return FIELD_EX32(id->id_mmfr4, ID_MMFR4, CCIDX) != 0;
28
DeviceState *max1111;
29
DeviceState *scp0;
30
DeviceState *scp1;
31
+ DeviceState *misc_gpio;
32
} SpitzMachineState;
33
34
#define TYPE_SPITZ_MACHINE "spitz-common"
35
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
36
#define SPITZ_GPIO_MAX1111_CS 20
37
#define SPITZ_GPIO_TP_INT 11
38
39
-static DeviceState *max1111;
40
-
41
/* "Demux" the signal based on current chipselect */
42
typedef struct {
43
SSISlave ssidev;
44
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
45
#define SPITZ_BATTERY_VOLT 0xd0 /* About 4.0V */
46
#define SPITZ_CHARGEON_ACIN 0x80 /* About 5.0V */
47
48
-static void spitz_adc_temp_on(void *opaque, int line, int level)
49
-{
50
- int batt_temp;
51
-
52
- if (!max1111)
53
- return;
54
-
55
- batt_temp = level ? SPITZ_BATTERY_TEMP : 0;
56
-
57
- qemu_set_irq(qdev_get_gpio_in(max1111, MAX1111_BATT_TEMP), batt_temp);
58
-}
59
-
60
static void corgi_ssp_realize(SSISlave *d, Error **errp)
61
{
62
DeviceState *dev = DEVICE(d);
63
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
64
65
bus = qdev_get_child_bus(sms->mux, "ssi2");
66
sms->max1111 = qdev_new(TYPE_MAX_1111);
67
- max1111 = sms->max1111;
68
qdev_prop_set_uint8(sms->max1111, "input1" /* BATT_VOLT */,
69
SPITZ_BATTERY_VOLT);
70
qdev_prop_set_uint8(sms->max1111, "input2" /* BATT_TEMP */, 0);
71
@@ -XXX,XX +XXX,XX @@ static void spitz_akita_i2c_setup(PXA2xxState *cpu)
72
73
/* Other peripherals */
74
75
-static void spitz_out_switch(void *opaque, int line, int level)
76
+/*
77
+ * Encapsulation of some miscellaneous GPIO line behaviour for the Spitz boards.
78
+ *
79
+ * QEMU interface:
80
+ * + named GPIO inputs "green-led", "orange-led", "charging", "discharging":
81
+ * these currently just print messages that the line has been signalled
82
+ * + named GPIO input "adc-temp-on": set to cause the battery-temperature
83
+ * value to be passed to the max111x ADC
84
+ * + named GPIO output "adc-temp": the ADC value, to be wired up to the max111x
85
+ */
86
+#define TYPE_SPITZ_MISC_GPIO "spitz-misc-gpio"
87
+#define SPITZ_MISC_GPIO(obj) \
88
+ OBJECT_CHECK(SpitzMiscGPIOState, (obj), TYPE_SPITZ_MISC_GPIO)
89
+
90
+typedef struct SpitzMiscGPIOState {
91
+ SysBusDevice parent_obj;
92
+
93
+ qemu_irq adc_value;
94
+} SpitzMiscGPIOState;
95
+
96
+static void spitz_misc_charging(void *opaque, int n, int level)
97
{
98
- switch (line) {
99
- case 0:
100
- zaurus_printf("Charging %s.\n", level ? "off" : "on");
101
- break;
102
- case 1:
103
- zaurus_printf("Discharging %s.\n", level ? "on" : "off");
104
- break;
105
- case 2:
106
- zaurus_printf("Green LED %s.\n", level ? "on" : "off");
107
- break;
108
- case 3:
109
- zaurus_printf("Orange LED %s.\n", level ? "on" : "off");
110
- break;
111
- case 6:
112
- spitz_adc_temp_on(opaque, line, level);
113
- break;
114
- default:
115
- g_assert_not_reached();
116
- }
117
+ zaurus_printf("Charging %s.\n", level ? "off" : "on");
118
+}
119
+
120
+static void spitz_misc_discharging(void *opaque, int n, int level)
121
+{
122
+ zaurus_printf("Discharging %s.\n", level ? "off" : "on");
123
+}
124
+
125
+static void spitz_misc_green_led(void *opaque, int n, int level)
126
+{
127
+ zaurus_printf("Green LED %s.\n", level ? "off" : "on");
128
+}
129
+
130
+static void spitz_misc_orange_led(void *opaque, int n, int level)
131
+{
132
+ zaurus_printf("Orange LED %s.\n", level ? "off" : "on");
133
+}
134
+
135
+static void spitz_misc_adc_temp(void *opaque, int n, int level)
136
+{
137
+ SpitzMiscGPIOState *s = SPITZ_MISC_GPIO(opaque);
138
+ int batt_temp = level ? SPITZ_BATTERY_TEMP : 0;
139
+
140
+ qemu_set_irq(s->adc_value, batt_temp);
141
+}
142
+
143
+static void spitz_misc_gpio_init(Object *obj)
144
+{
145
+ SpitzMiscGPIOState *s = SPITZ_MISC_GPIO(obj);
146
+ DeviceState *dev = DEVICE(obj);
147
+
148
+ qdev_init_gpio_in_named(dev, spitz_misc_charging, "charging", 1);
149
+ qdev_init_gpio_in_named(dev, spitz_misc_discharging, "discharging", 1);
150
+ qdev_init_gpio_in_named(dev, spitz_misc_green_led, "green-led", 1);
151
+ qdev_init_gpio_in_named(dev, spitz_misc_orange_led, "orange-led", 1);
152
+ qdev_init_gpio_in_named(dev, spitz_misc_adc_temp, "adc-temp-on", 1);
153
+
154
+ qdev_init_gpio_out_named(dev, &s->adc_value, "adc-temp", 1);
24
}
155
}
25
156
26
+static inline bool isar_feature_aa32_tts2uxn(const ARMISARegisters *id)
157
#define SPITZ_SCP_LED_GREEN 1
27
+{
158
@@ -XXX,XX +XXX,XX @@ static void spitz_out_switch(void *opaque, int line, int level)
28
+ return FIELD_EX32(id->id_mmfr4, ID_MMFR4, XNX) != 0;
159
29
+}
160
static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
30
+
161
{
31
/*
162
- qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, sms->mpu, 8);
32
* 64-bit feature tests via id registers.
163
+ DeviceState *miscdev = sysbus_create_simple(TYPE_SPITZ_MISC_GPIO, -1, NULL);
33
*/
164
34
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_ccidx(const ARMISARegisters *id)
165
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
35
return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, CCIDX) != 0;
166
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_JK_B, outsignals[1]);
167
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
168
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
169
+ sms->misc_gpio = miscdev;
170
+
171
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_CHRG_ON,
172
+ qdev_get_gpio_in_named(miscdev, "charging", 0));
173
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_JK_B,
174
+ qdev_get_gpio_in_named(miscdev, "discharging", 0));
175
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_GREEN,
176
+ qdev_get_gpio_in_named(miscdev, "green-led", 0));
177
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_LED_ORANGE,
178
+ qdev_get_gpio_in_named(miscdev, "orange-led", 0));
179
+ qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON,
180
+ qdev_get_gpio_in_named(miscdev, "adc-temp-on", 0));
181
+ qdev_connect_gpio_out_named(miscdev, "adc-temp", 0,
182
+ qdev_get_gpio_in(sms->max1111, MAX1111_BATT_TEMP));
183
184
if (sms->scp1) {
185
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_CONT,
186
@@ -XXX,XX +XXX,XX @@ static void spitz_scoop_gpio_setup(SpitzMachineState *sms)
187
qdev_connect_gpio_out(sms->scp1, SPITZ_SCP2_BACKLIGHT_ON,
188
qdev_get_gpio_in_named(sms->lcdtg, "bl_power", 0));
189
}
190
-
191
- qdev_connect_gpio_out(sms->scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
36
}
192
}
37
193
38
+static inline bool isar_feature_aa64_tts2uxn(const ARMISARegisters *id)
194
#define SPITZ_GPIO_HSYNC 22
39
+{
195
@@ -XXX,XX +XXX,XX @@ static const TypeInfo spitz_lcdtg_info = {
40
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, XNX) != 0;
196
.class_init = spitz_lcdtg_class_init,
41
+}
197
};
42
+
198
43
/*
199
+static const TypeInfo spitz_misc_gpio_info = {
44
* Feature tests for "does this exist in either 32-bit or 64-bit?"
200
+ .name = TYPE_SPITZ_MISC_GPIO,
45
*/
201
+ .parent = TYPE_SYS_BUS_DEVICE,
46
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_any_ccidx(const ARMISARegisters *id)
202
+ .instance_size = sizeof(SpitzMiscGPIOState),
47
return isar_feature_aa64_ccidx(id) || isar_feature_aa32_ccidx(id);
203
+ .instance_init = spitz_misc_gpio_init,
204
+ /*
205
+ * No class_init required: device has no internal state so does not
206
+ * need to set up reset or vmstate, and does not have a realize method.
207
+ */
208
+};
209
+
210
static void spitz_register_types(void)
211
{
212
type_register_static(&corgi_ssp_info);
213
type_register_static(&spitz_lcdtg_info);
214
type_register_static(&spitz_keyboard_info);
215
type_register_static(&sl_nand_info);
216
+ type_register_static(&spitz_misc_gpio_info);
48
}
217
}
49
218
50
+static inline bool isar_feature_any_tts2uxn(const ARMISARegisters *id)
219
type_init(spitz_register_types)
51
+{
52
+ return isar_feature_aa64_tts2uxn(id) || isar_feature_aa32_tts2uxn(id);
53
+}
54
+
55
/*
56
* Forward to the above feature tests given an ARMCPU pointer.
57
*/
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
91
index XXXXXXX..XXXXXXX 100644
92
--- a/target/arm/helper.c
93
+++ b/target/arm/helper.c
94
@@ -XXX,XX +XXX,XX @@ simple_ap_to_rw_prot(CPUARMState *env, ARMMMUIdx mmu_idx, int ap)
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
}
140
}
141
return prot;
142
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
143
}
144
145
ap = extract32(attrs, 4, 2);
146
- xn = extract32(attrs, 12, 1);
147
148
if (mmu_idx == ARMMMUIdx_Stage2) {
149
ns = true;
150
- *prot = get_S2prot(env, ap, xn);
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
--
220
--
160
2.20.1
221
2.20.1
161
222
162
223
diff view generated by jsdifflib
Deleted patch
1
In aarch64_max_initfn() we update both 32-bit and 64-bit ID
2
registers. The intended pattern is that for 64-bit ID registers we
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
1
10
Use the right-sized variable.
11
12
Fixes: 3bec78447a958d481991
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
15
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Message-id: 20200423110915.10527-1-peter.maydell@linaro.org
17
---
18
target/arm/cpu64.c | 6 +++---
19
1 file changed, 3 insertions(+), 3 deletions(-)
20
21
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/cpu64.c
24
+++ b/target/arm/cpu64.c
25
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
26
u = FIELD_DP32(u, ID_MMFR4, XNX, 1); /* TTS2UXN */
27
cpu->isar.id_mmfr4 = u;
28
29
- u = cpu->isar.id_aa64dfr0;
30
- u = FIELD_DP64(u, ID_AA64DFR0, PMUVER, 5); /* v8.4-PMU */
31
- cpu->isar.id_aa64dfr0 = u;
32
+ t = cpu->isar.id_aa64dfr0;
33
+ t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 5); /* v8.4-PMU */
34
+ cpu->isar.id_aa64dfr0 = t;
35
36
u = cpu->isar.id_dfr0;
37
u = FIELD_DP32(u, ID_DFR0, PERFMON, 5); /* v8.4-PMU */
38
--
39
2.20.1
40
41
diff view generated by jsdifflib
1
Convert the VCADD (vector) insns to decodetree.
1
Instead of logging guest accesses to invalid register offsets in this
2
device using zaurus_printf() (which just prints to stderr), use the
3
usual qemu_log_mask(LOG_GUEST_ERROR,...).
4
5
Since this was the only use of the zaurus_printf() macro outside
6
spitz.c, we can move the definition of that macro from sharpsl.h
7
to spitz.c.
2
8
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Message-id: 20200430181003.21682-6-peter.maydell@linaro.org
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-id: 20200628142429.17111-14-peter.maydell@linaro.org
6
---
13
---
7
target/arm/neon-shared.decode | 3 +++
14
include/hw/arm/sharpsl.h | 3 ---
8
target/arm/translate-neon.inc.c | 37 +++++++++++++++++++++++++++++++++
15
hw/arm/spitz.c | 3 +++
9
target/arm/translate.c | 11 +---------
16
hw/gpio/zaurus.c | 12 +++++++-----
10
3 files changed, 41 insertions(+), 10 deletions(-)
17
3 files changed, 10 insertions(+), 8 deletions(-)
11
18
12
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
19
diff --git a/include/hw/arm/sharpsl.h b/include/hw/arm/sharpsl.h
13
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-shared.decode
21
--- a/include/hw/arm/sharpsl.h
15
+++ b/target/arm/neon-shared.decode
22
+++ b/include/hw/arm/sharpsl.h
16
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@
17
24
18
VCMLA 1111 110 rot:2 . 1 size:1 .... .... 1000 . q:1 . 0 .... \
25
#include "exec/hwaddr.h"
19
vm=%vm_dp vn=%vn_dp vd=%vd_dp
26
27
-#define zaurus_printf(format, ...)    \
28
- fprintf(stderr, "%s: " format, __func__, ##__VA_ARGS__)
29
-
30
/* zaurus.c */
31
32
#define SL_PXA_PARAM_BASE    0xa0000a00
33
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/spitz.c
36
+++ b/hw/arm/spitz.c
37
@@ -XXX,XX +XXX,XX @@ typedef struct {
38
#define SPITZ_MACHINE_CLASS(klass) \
39
OBJECT_CLASS_CHECK(SpitzMachineClass, klass, TYPE_SPITZ_MACHINE)
40
41
+#define zaurus_printf(format, ...) \
42
+ fprintf(stderr, "%s: " format, __func__, ##__VA_ARGS__)
20
+
43
+
21
+VCADD 1111 110 rot:1 1 . 0 size:1 .... .... 1000 . q:1 . 0 .... \
44
#undef REG_FMT
22
+ vm=%vm_dp vn=%vn_dp vd=%vd_dp
45
#define REG_FMT "0x%02lx"
23
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
46
47
diff --git a/hw/gpio/zaurus.c b/hw/gpio/zaurus.c
24
index XXXXXXX..XXXXXXX 100644
48
index XXXXXXX..XXXXXXX 100644
25
--- a/target/arm/translate-neon.inc.c
49
--- a/hw/gpio/zaurus.c
26
+++ b/target/arm/translate-neon.inc.c
50
+++ b/hw/gpio/zaurus.c
27
@@ -XXX,XX +XXX,XX @@ static bool trans_VCMLA(DisasContext *s, arg_VCMLA *a)
51
@@ -XXX,XX +XXX,XX @@
28
tcg_temp_free_ptr(fpst);
52
#include "hw/sysbus.h"
29
return true;
53
#include "migration/vmstate.h"
54
#include "qemu/module.h"
55
-
56
-#undef REG_FMT
57
-#define REG_FMT            "0x%02lx"
58
+#include "qemu/log.h"
59
60
/* SCOOP devices */
61
62
@@ -XXX,XX +XXX,XX @@ static uint64_t scoop_read(void *opaque, hwaddr addr,
63
case SCOOP_GPRR:
64
return s->gpio_level;
65
default:
66
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
67
+ qemu_log_mask(LOG_GUEST_ERROR,
68
+ "scoop_read: bad register offset 0x%02" HWADDR_PRIx "\n",
69
+ addr);
70
}
71
72
return 0;
73
@@ -XXX,XX +XXX,XX @@ static void scoop_write(void *opaque, hwaddr addr,
74
scoop_gpio_handler_update(s);
75
break;
76
default:
77
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
78
+ qemu_log_mask(LOG_GUEST_ERROR,
79
+ "scoop_write: bad register offset 0x%02" HWADDR_PRIx "\n",
80
+ addr);
81
}
30
}
82
}
31
+
83
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
--
84
--
91
2.20.1
85
2.20.1
92
86
93
87
diff view generated by jsdifflib
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
Instead of logging guest accesses to invalid register offsets in the
2
Spitz flash device with zaurus_printf() (which just prints to stderr),
3
use the usual qemu_log_mask(LOG_GUEST_ERROR,...).
2
4
3
hw/arm: versal: Add support for the RTC.
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
8
Message-id: 20200628142429.17111-15-peter.maydell@linaro.org
9
Message-id: 20200427181649.26851-10-edgar.iglesias@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
9
---
12
include/hw/arm/xlnx-versal.h | 8 ++++++++
10
hw/arm/spitz.c | 12 +++++++-----
13
hw/arm/xlnx-versal.c | 21 +++++++++++++++++++++
11
1 file changed, 7 insertions(+), 5 deletions(-)
14
2 files changed, 29 insertions(+)
15
12
16
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
13
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
17
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/xlnx-versal.h
15
--- a/hw/arm/spitz.c
19
+++ b/include/hw/arm/xlnx-versal.h
16
+++ b/hw/arm/spitz.c
20
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@
21
#include "hw/char/pl011.h"
18
#include "hw/ssi/ssi.h"
22
#include "hw/dma/xlnx-zdma.h"
19
#include "hw/block/flash.h"
23
#include "hw/net/cadence_gem.h"
20
#include "qemu/timer.h"
24
+#include "hw/rtc/xlnx-zynqmp-rtc.h"
21
+#include "qemu/log.h"
25
22
#include "hw/arm/sharpsl.h"
26
#define TYPE_XLNX_VERSAL "xlnx-versal"
23
#include "ui/console.h"
27
#define XLNX_VERSAL(obj) OBJECT_CHECK(Versal, (obj), TYPE_XLNX_VERSAL)
24
#include "hw/audio/wm8750.h"
28
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
25
@@ -XXX,XX +XXX,XX @@ typedef struct {
29
struct {
26
#define zaurus_printf(format, ...) \
30
SDHCIState sd[XLNX_VERSAL_NR_SDS];
27
fprintf(stderr, "%s: " format, __func__, ##__VA_ARGS__)
31
} iou;
28
32
+
29
-#undef REG_FMT
33
+ XlnxZynqMPRTC rtc;
30
-#define REG_FMT "0x%02lx"
34
} pmc;
31
-
35
32
/* Spitz Flash */
36
struct {
33
#define FLASH_BASE 0x0c000000
37
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
34
#define FLASH_ECCLPLB 0x00 /* Line parity 7 - 0 bit */
38
#define VERSAL_GEM1_IRQ_0 58
35
@@ -XXX,XX +XXX,XX @@ static uint64_t sl_read(void *opaque, hwaddr addr, unsigned size)
39
#define VERSAL_GEM1_WAKE_IRQ_0 59
36
return ecc_digest(&s->ecc, nand_getio(s->nand));
40
#define VERSAL_ADMA_IRQ_0 60
37
41
+#define VERSAL_RTC_APB_ERR_IRQ 121
38
default:
42
#define VERSAL_SD0_IRQ_0 126
39
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
43
+#define VERSAL_RTC_ALARM_IRQ 142
40
+ qemu_log_mask(LOG_GUEST_ERROR,
44
+#define VERSAL_RTC_SECONDS_IRQ 143
41
+ "sl_read: bad register offset 0x%02" HWADDR_PRIx "\n",
45
42
+ addr);
46
/* Architecturally reserved IRQs suitable for virtualization. */
43
}
47
#define VERSAL_RSVD_IRQ_FIRST 111
44
return 0;
48
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
45
}
49
#define MM_PMC_SD0_SIZE 0x10000
46
@@ -XXX,XX +XXX,XX @@ static void sl_write(void *opaque, hwaddr addr,
50
#define MM_PMC_CRP 0xf1260000U
47
break;
51
#define MM_PMC_CRP_SIZE 0x10000
48
52
+#define MM_PMC_RTC 0xf12a0000
49
default:
53
+#define MM_PMC_RTC_SIZE 0x10000
50
- zaurus_printf("Bad register offset " REG_FMT "\n", (unsigned long)addr);
54
#endif
51
+ qemu_log_mask(LOG_GUEST_ERROR,
55
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
52
+ "sl_write: bad register offset 0x%02" HWADDR_PRIx "\n",
56
index XXXXXXX..XXXXXXX 100644
53
+ addr);
57
--- a/hw/arm/xlnx-versal.c
58
+++ b/hw/arm/xlnx-versal.c
59
@@ -XXX,XX +XXX,XX @@ static void versal_create_sds(Versal *s, qemu_irq *pic)
60
}
54
}
61
}
55
}
62
63
+static void versal_create_rtc(Versal *s, qemu_irq *pic)
64
+{
65
+ SysBusDevice *sbd;
66
+ MemoryRegion *mr;
67
+
68
+ sysbus_init_child_obj(OBJECT(s), "rtc", &s->pmc.rtc, sizeof(s->pmc.rtc),
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
+}
82
+
83
/* This takes the board allocated linear DDR memory and creates aliases
84
* for each split DDR range/aperture on the Versal address map.
85
*/
86
@@ -XXX,XX +XXX,XX @@ static void versal_realize(DeviceState *dev, Error **errp)
87
versal_create_gems(s, pic);
88
versal_create_admas(s, pic);
89
versal_create_sds(s, pic);
90
+ versal_create_rtc(s, pic);
91
versal_map_ddr(s);
92
versal_unimp(s);
93
56
94
--
57
--
95
2.20.1
58
2.20.1
96
59
97
60
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
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
1
Convert the V[US]DOT (scalar) insns in the 2reg-scalar-ext group
1
Instead of using printf() for logging guest accesses to invalid
2
to decodetree.
2
register offsets in the pxa2xx PIC device, use the usual
3
qemu_log_mask(LOG_GUEST_ERROR,...).
4
5
This was the only user of the REG_FMT macro in pxa.h, so we can
6
remove that.
3
7
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200430181003.21682-10-peter.maydell@linaro.org
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-id: 20200628142429.17111-16-peter.maydell@linaro.org
7
---
12
---
8
target/arm/neon-shared.decode | 3 +++
13
include/hw/arm/pxa.h | 1 -
9
target/arm/translate-neon.inc.c | 35 +++++++++++++++++++++++++++++++++
14
hw/arm/pxa2xx_pic.c | 9 +++++++--
10
target/arm/translate.c | 13 +-----------
15
2 files changed, 7 insertions(+), 3 deletions(-)
11
3 files changed, 39 insertions(+), 12 deletions(-)
12
16
13
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
17
diff --git a/include/hw/arm/pxa.h b/include/hw/arm/pxa.h
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-shared.decode
19
--- a/include/hw/arm/pxa.h
16
+++ b/target/arm/neon-shared.decode
20
+++ b/include/hw/arm/pxa.h
17
@@ -XXX,XX +XXX,XX @@ VCMLA_scalar 1111 1110 0 . rot:2 .... .... 1000 . q:1 index:1 0 vm:4 \
21
@@ -XXX,XX +XXX,XX @@ struct PXA2xxI2SState {
18
vn=%vn_dp vd=%vd_dp size=0
22
};
19
VCMLA_scalar 1111 1110 1 . rot:2 .... .... 1000 . q:1 . 0 .... \
23
20
vm=%vm_dp vn=%vn_dp vd=%vd_dp size=1 index=0
24
# define PA_FMT            "0x%08lx"
21
+
25
-# define REG_FMT        "0x" TARGET_FMT_plx
22
+VDOT_scalar 1111 1110 0 . 10 .... .... 1101 . q:1 index:1 u:1 rm:4 \
26
23
+ vm=%vm_dp vn=%vn_dp vd=%vd_dp
27
PXA2xxState *pxa270_init(MemoryRegion *address_space, unsigned int sdram_size,
24
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
28
const char *revision);
29
diff --git a/hw/arm/pxa2xx_pic.c b/hw/arm/pxa2xx_pic.c
25
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
26
--- a/target/arm/translate-neon.inc.c
31
--- a/hw/arm/pxa2xx_pic.c
27
+++ b/target/arm/translate-neon.inc.c
32
+++ b/hw/arm/pxa2xx_pic.c
28
@@ -XXX,XX +XXX,XX @@ static bool trans_VCMLA_scalar(DisasContext *s, arg_VCMLA_scalar *a)
33
@@ -XXX,XX +XXX,XX @@
29
tcg_temp_free_ptr(fpst);
34
#include "qemu/osdep.h"
30
return true;
35
#include "qapi/error.h"
36
#include "qemu/module.h"
37
+#include "qemu/log.h"
38
#include "cpu.h"
39
#include "hw/arm/pxa.h"
40
#include "hw/sysbus.h"
41
@@ -XXX,XX +XXX,XX @@ static uint64_t pxa2xx_pic_mem_read(void *opaque, hwaddr offset,
42
case ICHP:    /* Highest Priority register */
43
return pxa2xx_pic_highest(s);
44
default:
45
- printf("%s: Bad register offset " REG_FMT "\n", __func__, offset);
46
+ qemu_log_mask(LOG_GUEST_ERROR,
47
+ "pxa2xx_pic_mem_read: bad register offset 0x%" HWADDR_PRIx
48
+ "\n", offset);
49
return 0;
50
}
31
}
51
}
32
+
52
@@ -XXX,XX +XXX,XX @@ static void pxa2xx_pic_mem_write(void *opaque, hwaddr offset,
33
+static bool trans_VDOT_scalar(DisasContext *s, arg_VDOT_scalar *a)
53
s->priority[32 + ((offset - IPR32) >> 2)] = value & 0x8000003f;
34
+{
54
break;
35
+ gen_helper_gvec_3 *fn_gvec;
55
default:
36
+ int opr_sz;
56
- printf("%s: Bad register offset " REG_FMT "\n", __func__, offset);
37
+ TCGv_ptr fpst;
57
+ qemu_log_mask(LOG_GUEST_ERROR,
38
+
58
+ "pxa2xx_pic_mem_write: bad register offset 0x%"
39
+ if (!dc_isar_feature(aa32_dp, s)) {
59
+ HWADDR_PRIx "\n", offset);
40
+ return false;
60
return;
41
+ }
61
}
42
+
62
pxa2xx_pic_update(opaque);
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
--
63
--
92
2.20.1
64
2.20.1
93
65
94
66
diff view generated by jsdifflib
1
Convert the V[US]DOT (vector) insns to decodetree.
1
The QOM types "spitz-lcdtg" and "corgi-ssp" are missing the
2
usual QOM TYPE and casting macros; provide and use them.
3
4
In particular, we can safely use the QOM cast macros instead of
5
FROM_SSI_SLAVE() because in both cases the 'ssidev' field of
6
the instance state struct is the first field in it.
2
7
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Message-id: 20200430181003.21682-7-peter.maydell@linaro.org
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-id: 20200628142429.17111-17-peter.maydell@linaro.org
6
---
12
---
7
target/arm/neon-shared.decode | 4 ++++
13
hw/arm/spitz.c | 23 +++++++++++++++--------
8
target/arm/translate-neon.inc.c | 32 ++++++++++++++++++++++++++++++++
14
1 file changed, 15 insertions(+), 8 deletions(-)
9
target/arm/translate.c | 9 +--------
10
3 files changed, 37 insertions(+), 8 deletions(-)
11
15
12
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
16
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
13
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-shared.decode
18
--- a/hw/arm/spitz.c
15
+++ b/target/arm/neon-shared.decode
19
+++ b/hw/arm/spitz.c
16
@@ -XXX,XX +XXX,XX @@ VCMLA 1111 110 rot:2 . 1 size:1 .... .... 1000 . q:1 . 0 .... \
20
@@ -XXX,XX +XXX,XX @@ static void spitz_keyboard_realize(DeviceState *dev, Error **errp)
17
21
#define LCDTG_PICTRL 0x06
18
VCADD 1111 110 rot:1 1 . 0 size:1 .... .... 1000 . q:1 . 0 .... \
22
#define LCDTG_POLCTRL 0x07
19
vm=%vm_dp vn=%vn_dp vd=%vd_dp
23
24
+#define TYPE_SPITZ_LCDTG "spitz-lcdtg"
25
+#define SPITZ_LCDTG(obj) OBJECT_CHECK(SpitzLCDTG, (obj), TYPE_SPITZ_LCDTG)
20
+
26
+
21
+# VUDOT and VSDOT
27
typedef struct {
22
+VDOT 1111 110 00 . 10 .... .... 1101 . q:1 . u:1 .... \
28
SSISlave ssidev;
23
+ vm=%vm_dp vn=%vn_dp vd=%vd_dp
29
uint32_t bl_intensity;
24
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
30
@@ -XXX,XX +XXX,XX @@ static inline void spitz_bl_power(void *opaque, int line, int level)
25
index XXXXXXX..XXXXXXX 100644
31
26
--- a/target/arm/translate-neon.inc.c
32
static uint32_t spitz_lcdtg_transfer(SSISlave *dev, uint32_t value)
27
+++ b/target/arm/translate-neon.inc.c
33
{
28
@@ -XXX,XX +XXX,XX @@ static bool trans_VCADD(DisasContext *s, arg_VCADD *a)
34
- SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, dev);
29
tcg_temp_free_ptr(fpst);
35
+ SpitzLCDTG *s = SPITZ_LCDTG(dev);
30
return true;
36
int addr;
37
addr = value >> 5;
38
value &= 0x1f;
39
@@ -XXX,XX +XXX,XX @@ static uint32_t spitz_lcdtg_transfer(SSISlave *dev, uint32_t value)
40
41
static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
42
{
43
- SpitzLCDTG *s = FROM_SSI_SLAVE(SpitzLCDTG, ssi);
44
+ SpitzLCDTG *s = SPITZ_LCDTG(ssi);
45
DeviceState *dev = DEVICE(s);
46
47
s->bl_power = 0;
48
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_realize(SSISlave *ssi, Error **errp)
49
#define SPITZ_GPIO_MAX1111_CS 20
50
#define SPITZ_GPIO_TP_INT 11
51
52
+#define TYPE_CORGI_SSP "corgi-ssp"
53
+#define CORGI_SSP(obj) OBJECT_CHECK(CorgiSSPState, (obj), TYPE_CORGI_SSP)
54
+
55
/* "Demux" the signal based on current chipselect */
56
typedef struct {
57
SSISlave ssidev;
58
@@ -XXX,XX +XXX,XX @@ typedef struct {
59
60
static uint32_t corgi_ssp_transfer(SSISlave *dev, uint32_t value)
61
{
62
- CorgiSSPState *s = FROM_SSI_SLAVE(CorgiSSPState, dev);
63
+ CorgiSSPState *s = CORGI_SSP(dev);
64
int i;
65
66
for (i = 0; i < 3; i++) {
67
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
68
static void corgi_ssp_realize(SSISlave *d, Error **errp)
69
{
70
DeviceState *dev = DEVICE(d);
71
- CorgiSSPState *s = FROM_SSI_SLAVE(CorgiSSPState, d);
72
+ CorgiSSPState *s = CORGI_SSP(d);
73
74
qdev_init_gpio_in(dev, corgi_ssp_gpio_cs, 3);
75
s->bus[0] = ssi_create_bus(dev, "ssi0");
76
@@ -XXX,XX +XXX,XX @@ static void spitz_ssp_attach(SpitzMachineState *sms)
77
{
78
void *bus;
79
80
- sms->mux = ssi_create_slave(sms->mpu->ssp[CORGI_SSP_PORT - 1], "corgi-ssp");
81
+ sms->mux = ssi_create_slave(sms->mpu->ssp[CORGI_SSP_PORT - 1],
82
+ TYPE_CORGI_SSP);
83
84
bus = qdev_get_child_bus(sms->mux, "ssi0");
85
- sms->lcdtg = ssi_create_slave(bus, "spitz-lcdtg");
86
+ sms->lcdtg = ssi_create_slave(bus, TYPE_SPITZ_LCDTG);
87
88
bus = qdev_get_child_bus(sms->mux, "ssi1");
89
sms->ads7846 = ssi_create_slave(bus, "ads7846");
90
@@ -XXX,XX +XXX,XX @@ static void corgi_ssp_class_init(ObjectClass *klass, void *data)
31
}
91
}
32
+
92
33
+static bool trans_VDOT(DisasContext *s, arg_VDOT *a)
93
static const TypeInfo corgi_ssp_info = {
34
+{
94
- .name = "corgi-ssp",
35
+ int opr_sz;
95
+ .name = TYPE_CORGI_SSP,
36
+ gen_helper_gvec_3 *fn_gvec;
96
.parent = TYPE_SSI_SLAVE,
37
+
97
.instance_size = sizeof(CorgiSSPState),
38
+ if (!dc_isar_feature(aa32_dp, s)) {
98
.class_init = corgi_ssp_class_init,
39
+ return false;
99
@@ -XXX,XX +XXX,XX @@ static void spitz_lcdtg_class_init(ObjectClass *klass, void *data)
40
+ }
100
}
41
+
101
42
+ /* UNDEF accesses to D16-D31 if they don't exist. */
102
static const TypeInfo spitz_lcdtg_info = {
43
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
103
- .name = "spitz-lcdtg",
44
+ ((a->vd | a->vn | a->vm) & 0x10)) {
104
+ .name = TYPE_SPITZ_LCDTG,
45
+ return false;
105
.parent = TYPE_SSI_SLAVE,
46
+ }
106
.instance_size = sizeof(SpitzLCDTG),
47
+
107
.class_init = spitz_lcdtg_class_init,
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
--
108
--
85
2.20.1
109
2.20.1
86
110
87
111
diff view generated by jsdifflib
1
Convert the Neon VMUL, VMLA, VMLS and VSHL insns in the
1
The FROM_SSI_SLAVE() macro predates QOM and is used as a typesafe way
2
3-reg-same grouping to decodetree.
2
to cast from an SSISlave* to the instance struct of a subtype of
3
TYPE_SSI_SLAVE. Switch to using the QOM cast macros instead, which
4
have the same effect (by writing the QOM macros if the types were
5
previously missing them.)
6
7
(The FROM_SSI_SLAVE() macro allows the SSISlave member of the
8
subtype's struct to be anywhere as long as it is named "ssidev",
9
whereas a QOM cast macro insists that it is the first thing in the
10
subtype's struct. This is true for all the types we convert here.)
11
12
This removes all the uses of FROM_SSI_SLAVE() so we can delete the
13
definition.
3
14
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200430181003.21682-20-peter.maydell@linaro.org
17
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
18
Message-id: 20200628142429.17111-18-peter.maydell@linaro.org
7
---
19
---
8
target/arm/neon-dp.decode | 9 +++++++
20
include/hw/ssi/ssi.h | 2 --
9
target/arm/translate-neon.inc.c | 44 +++++++++++++++++++++++++++++++++
21
hw/arm/z2.c | 11 +++++++----
10
target/arm/translate.c | 28 +++------------------
22
hw/display/ads7846.c | 9 ++++++---
11
3 files changed, 56 insertions(+), 25 deletions(-)
23
hw/display/ssd0323.c | 10 +++++++---
24
hw/sd/ssi-sd.c | 4 ++--
25
5 files changed, 22 insertions(+), 14 deletions(-)
12
26
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
27
diff --git a/include/hw/ssi/ssi.h b/include/hw/ssi/ssi.h
14
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
29
--- a/include/hw/ssi/ssi.h
16
+++ b/target/arm/neon-dp.decode
30
+++ b/include/hw/ssi/ssi.h
17
@@ -XXX,XX +XXX,XX @@ VCGT_U_3s 1111 001 1 0 . .. .... .... 0011 . . . 0 .... @3same
31
@@ -XXX,XX +XXX,XX @@ struct SSISlave {
18
VCGE_S_3s 1111 001 0 0 . .. .... .... 0011 . . . 1 .... @3same
32
bool cs;
19
VCGE_U_3s 1111 001 1 0 . .. .... .... 0011 . . . 1 .... @3same
33
};
20
34
21
+VSHL_S_3s 1111 001 0 0 . .. .... .... 0100 . . . 0 .... @3same
35
-#define FROM_SSI_SLAVE(type, dev) DO_UPCAST(type, ssidev, dev)
22
+VSHL_U_3s 1111 001 1 0 . .. .... .... 0100 . . . 0 .... @3same
36
-
37
extern const VMStateDescription vmstate_ssi_slave;
38
39
#define VMSTATE_SSI_SLAVE(_field, _state) { \
40
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/arm/z2.c
43
+++ b/hw/arm/z2.c
44
@@ -XXX,XX +XXX,XX @@ typedef struct {
45
int pos;
46
} ZipitLCD;
47
48
+#define TYPE_ZIPIT_LCD "zipit-lcd"
49
+#define ZIPIT_LCD(obj) OBJECT_CHECK(ZipitLCD, (obj), TYPE_ZIPIT_LCD)
23
+
50
+
24
VMAX_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 0 .... @3same
51
static uint32_t zipit_lcd_transfer(SSISlave *dev, uint32_t value)
25
VMAX_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 0 .... @3same
52
{
26
VMIN_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 1 .... @3same
53
- ZipitLCD *z = FROM_SSI_SLAVE(ZipitLCD, dev);
27
@@ -XXX,XX +XXX,XX @@ VSUB_3s 1111 001 1 0 . .. .... .... 1000 . . . 0 .... @3same
54
+ ZipitLCD *z = ZIPIT_LCD(dev);
28
55
uint16_t val;
29
VTST_3s 1111 001 0 0 . .. .... .... 1000 . . . 1 .... @3same
56
if (z->selected) {
30
VCEQ_3s 1111 001 1 0 . .. .... .... 1000 . . . 1 .... @3same
57
z->buf[z->pos] = value & 0xff;
58
@@ -XXX,XX +XXX,XX @@ static void z2_lcd_cs(void *opaque, int line, int level)
59
60
static void zipit_lcd_realize(SSISlave *dev, Error **errp)
61
{
62
- ZipitLCD *z = FROM_SSI_SLAVE(ZipitLCD, dev);
63
+ ZipitLCD *z = ZIPIT_LCD(dev);
64
z->selected = 0;
65
z->enabled = 0;
66
z->pos = 0;
67
@@ -XXX,XX +XXX,XX @@ static void zipit_lcd_class_init(ObjectClass *klass, void *data)
68
}
69
70
static const TypeInfo zipit_lcd_info = {
71
- .name = "zipit-lcd",
72
+ .name = TYPE_ZIPIT_LCD,
73
.parent = TYPE_SSI_SLAVE,
74
.instance_size = sizeof(ZipitLCD),
75
.class_init = zipit_lcd_class_init,
76
@@ -XXX,XX +XXX,XX @@ static void z2_init(MachineState *machine)
77
78
type_register_static(&zipit_lcd_info);
79
type_register_static(&aer915_info);
80
- z2_lcd = ssi_create_slave(mpu->ssp[1], "zipit-lcd");
81
+ z2_lcd = ssi_create_slave(mpu->ssp[1], TYPE_ZIPIT_LCD);
82
bus = pxa2xx_i2c_bus(mpu->i2c[0]);
83
i2c_create_slave(bus, TYPE_AER915, 0x55);
84
wm = i2c_create_slave(bus, TYPE_WM8750, 0x1b);
85
diff --git a/hw/display/ads7846.c b/hw/display/ads7846.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/hw/display/ads7846.c
88
+++ b/hw/display/ads7846.c
89
@@ -XXX,XX +XXX,XX @@ typedef struct {
90
int output;
91
} ADS7846State;
92
93
+#define TYPE_ADS7846 "ads7846"
94
+#define ADS7846(obj) OBJECT_CHECK(ADS7846State, (obj), TYPE_ADS7846)
31
+
95
+
32
+VMLA_3s 1111 001 0 0 . .. .... .... 1001 . . . 0 .... @3same
96
/* Control-byte bitfields */
33
+VMLS_3s 1111 001 1 0 . .. .... .... 1001 . . . 0 .... @3same
97
#define CB_PD0        (1 << 0)
34
+
98
#define CB_PD1        (1 << 1)
35
+VMUL_3s 1111 001 0 0 . .. .... .... 1001 . . . 1 .... @3same
99
@@ -XXX,XX +XXX,XX @@ static void ads7846_int_update(ADS7846State *s)
36
+VMUL_p_3s 1111 001 1 0 . .. .... .... 1001 . . . 1 .... @3same
100
37
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
101
static uint32_t ads7846_transfer(SSISlave *dev, uint32_t value)
102
{
103
- ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, dev);
104
+ ADS7846State *s = ADS7846(dev);
105
106
switch (s->cycle ++) {
107
case 0:
108
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_ads7846 = {
109
static void ads7846_realize(SSISlave *d, Error **errp)
110
{
111
DeviceState *dev = DEVICE(d);
112
- ADS7846State *s = FROM_SSI_SLAVE(ADS7846State, d);
113
+ ADS7846State *s = ADS7846(d);
114
115
qdev_init_gpio_out(dev, &s->interrupt, 1);
116
117
@@ -XXX,XX +XXX,XX @@ static void ads7846_class_init(ObjectClass *klass, void *data)
118
}
119
120
static const TypeInfo ads7846_info = {
121
- .name = "ads7846",
122
+ .name = TYPE_ADS7846,
123
.parent = TYPE_SSI_SLAVE,
124
.instance_size = sizeof(ADS7846State),
125
.class_init = ads7846_class_init,
126
diff --git a/hw/display/ssd0323.c b/hw/display/ssd0323.c
38
index XXXXXXX..XXXXXXX 100644
127
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/translate-neon.inc.c
128
--- a/hw/display/ssd0323.c
40
+++ b/target/arm/translate-neon.inc.c
129
+++ b/hw/display/ssd0323.c
41
@@ -XXX,XX +XXX,XX @@ DO_3SAME_NO_SZ_3(VMAX_S, tcg_gen_gvec_smax)
130
@@ -XXX,XX +XXX,XX @@ typedef struct {
42
DO_3SAME_NO_SZ_3(VMAX_U, tcg_gen_gvec_umax)
131
uint8_t framebuffer[128 * 80 / 2];
43
DO_3SAME_NO_SZ_3(VMIN_S, tcg_gen_gvec_smin)
132
} ssd0323_state;
44
DO_3SAME_NO_SZ_3(VMIN_U, tcg_gen_gvec_umin)
133
45
+DO_3SAME_NO_SZ_3(VMUL, tcg_gen_gvec_mul)
134
+#define TYPE_SSD0323 "ssd0323"
46
135
+#define SSD0323(obj) OBJECT_CHECK(ssd0323_state, (obj), TYPE_SSD0323)
47
#define DO_3SAME_CMP(INSN, COND) \
48
static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
49
@@ -XXX,XX +XXX,XX @@ DO_3SAME_GVEC4(VQADD_S, sqadd_op)
50
DO_3SAME_GVEC4(VQADD_U, uqadd_op)
51
DO_3SAME_GVEC4(VQSUB_S, sqsub_op)
52
DO_3SAME_GVEC4(VQSUB_U, uqsub_op)
53
+
54
+static void gen_VMUL_p_3s(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
55
+ uint32_t rm_ofs, uint32_t oprsz, uint32_t maxsz)
56
+{
57
+ tcg_gen_gvec_3_ool(rd_ofs, rn_ofs, rm_ofs, oprsz, maxsz,
58
+ 0, gen_helper_gvec_pmul_b);
59
+}
60
+
61
+static bool trans_VMUL_p_3s(DisasContext *s, arg_3same *a)
62
+{
63
+ if (a->size != 0) {
64
+ return false;
65
+ }
66
+ return do_3same(s, a, gen_VMUL_p_3s);
67
+}
68
+
69
+#define DO_3SAME_GVEC3_NO_SZ_3(INSN, OPARRAY) \
70
+ static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
71
+ uint32_t rn_ofs, uint32_t rm_ofs, \
72
+ uint32_t oprsz, uint32_t maxsz) \
73
+ { \
74
+ tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs, \
75
+ oprsz, maxsz, &OPARRAY[vece]); \
76
+ } \
77
+ DO_3SAME_NO_SZ_3(INSN, gen_##INSN##_3s)
78
+
136
+
79
+
137
+
80
+DO_3SAME_GVEC3_NO_SZ_3(VMLA, mla_op)
138
static uint32_t ssd0323_transfer(SSISlave *dev, uint32_t data)
81
+DO_3SAME_GVEC3_NO_SZ_3(VMLS, mls_op)
139
{
82
+
140
- ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, dev);
83
+#define DO_3SAME_GVEC3_SHIFT(INSN, OPARRAY) \
141
+ ssd0323_state *s = SSD0323(dev);
84
+ static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
142
85
+ uint32_t rn_ofs, uint32_t rm_ofs, \
143
switch (s->mode) {
86
+ uint32_t oprsz, uint32_t maxsz) \
144
case SSD0323_DATA:
87
+ { \
145
@@ -XXX,XX +XXX,XX @@ static const GraphicHwOps ssd0323_ops = {
88
+ /* Note the operation is vshl vd,vm,vn */ \
146
static void ssd0323_realize(SSISlave *d, Error **errp)
89
+ tcg_gen_gvec_3(rd_ofs, rm_ofs, rn_ofs, \
147
{
90
+ oprsz, maxsz, &OPARRAY[vece]); \
148
DeviceState *dev = DEVICE(d);
91
+ } \
149
- ssd0323_state *s = FROM_SSI_SLAVE(ssd0323_state, d);
92
+ DO_3SAME(INSN, gen_##INSN##_3s)
150
+ ssd0323_state *s = SSD0323(d);
93
+
151
94
+DO_3SAME_GVEC3_SHIFT(VSHL_S, sshl_op)
152
s->col_end = 63;
95
+DO_3SAME_GVEC3_SHIFT(VSHL_U, ushl_op)
153
s->row_end = 79;
96
diff --git a/target/arm/translate.c b/target/arm/translate.c
154
@@ -XXX,XX +XXX,XX @@ static void ssd0323_class_init(ObjectClass *klass, void *data)
155
}
156
157
static const TypeInfo ssd0323_info = {
158
- .name = "ssd0323",
159
+ .name = TYPE_SSD0323,
160
.parent = TYPE_SSI_SLAVE,
161
.instance_size = sizeof(ssd0323_state),
162
.class_init = ssd0323_class_init,
163
diff --git a/hw/sd/ssi-sd.c b/hw/sd/ssi-sd.c
97
index XXXXXXX..XXXXXXX 100644
164
index XXXXXXX..XXXXXXX 100644
98
--- a/target/arm/translate.c
165
--- a/hw/sd/ssi-sd.c
99
+++ b/target/arm/translate.c
166
+++ b/hw/sd/ssi-sd.c
100
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
167
@@ -XXX,XX +XXX,XX @@ typedef struct {
101
}
168
102
return 1;
169
static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
103
170
{
104
- case NEON_3R_VMUL: /* VMUL */
171
- ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, dev);
105
- if (u) {
172
+ ssi_sd_state *s = SSI_SD(dev);
106
- /* Polynomial case allows only P8. */
173
107
- if (size != 0) {
174
/* Special case: allow CMD12 (STOP TRANSMISSION) while reading data. */
108
- return 1;
175
if (s->mode == SSI_SD_DATA_READ && val == 0x4d) {
109
- }
176
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_ssi_sd = {
110
- tcg_gen_gvec_3_ool(rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size,
177
111
- 0, gen_helper_gvec_pmul_b);
178
static void ssi_sd_realize(SSISlave *d, Error **errp)
112
- } else {
179
{
113
- tcg_gen_gvec_mul(size, rd_ofs, rn_ofs, rm_ofs,
180
- ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, d);
114
- vec_size, vec_size);
181
+ ssi_sd_state *s = SSI_SD(d);
115
- }
182
DeviceState *carddev;
116
- return 0;
183
DriveInfo *dinfo;
117
-
184
Error *err = NULL;
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
--
185
--
143
2.20.1
186
2.20.1
144
187
145
188
diff view generated by jsdifflib
1
Convert VCMLA (scalar) in the 2reg-scalar-ext group to decodetree.
1
Deprecate our TileGX target support:
2
* we have no active maintainer for it
3
* it has had essentially no contributions (other than tree-wide cleanups
4
and similar) since it was first added
5
* the Linux kernel dropped support in 2018, as has glibc
6
7
Note the deprecation in the manual, but don't try to print a warning
8
when QEMU runs -- printing unsuppressable messages is more obtrusive
9
for linux-user mode than it would be for system-emulation mode, and
10
it doesn't seem worth trying to invent a new suppressible-error
11
system for linux-user just for this.
2
12
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
5
Message-id: 20200430181003.21682-9-peter.maydell@linaro.org
15
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Reviewed-by: Thomas Huth <thuth@redhat.com>
17
Message-id: 20200619154831.26319-1-peter.maydell@linaro.org
6
---
18
---
7
target/arm/neon-shared.decode | 5 +++++
19
docs/system/deprecated.rst | 11 +++++++++++
8
target/arm/translate-neon.inc.c | 40 +++++++++++++++++++++++++++++++++
20
1 file changed, 11 insertions(+)
9
target/arm/translate.c | 26 +--------------------
10
3 files changed, 46 insertions(+), 25 deletions(-)
11
21
12
diff --git a/target/arm/neon-shared.decode b/target/arm/neon-shared.decode
22
diff --git a/docs/system/deprecated.rst b/docs/system/deprecated.rst
13
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-shared.decode
24
--- a/docs/system/deprecated.rst
15
+++ b/target/arm/neon-shared.decode
25
+++ b/docs/system/deprecated.rst
16
@@ -XXX,XX +XXX,XX @@ VFML 1111 110 0 s:1 . 10 .... .... 1000 . 0 . 1 .... \
26
@@ -XXX,XX +XXX,XX @@ The above, converted to the current supported format::
17
vm=%vm_sp vn=%vn_sp vd=%vd_dp q=0
27
18
VFML 1111 110 0 s:1 . 10 .... .... 1000 . 1 . 1 .... \
28
json:{"file.driver":"rbd", "file.pool":"rbd", "file.image":"name"}
19
vm=%vm_dp vn=%vn_dp vd=%vd_dp q=1
29
30
+linux-user mode CPUs
31
+--------------------
20
+
32
+
21
+VCMLA_scalar 1111 1110 0 . rot:2 .... .... 1000 . q:1 index:1 0 vm:4 \
33
+``tilegx`` CPUs (since 5.1.0)
22
+ vn=%vn_dp vd=%vd_dp size=0
34
+'''''''''''''''''''''''''''''
23
+VCMLA_scalar 1111 1110 1 . rot:2 .... .... 1000 . q:1 . 0 .... \
24
+ vm=%vm_dp vn=%vn_dp vd=%vd_dp size=1 index=0
25
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
26
index XXXXXXX..XXXXXXX 100644
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
}
33
+
35
+
34
+static bool trans_VCMLA_scalar(DisasContext *s, arg_VCMLA_scalar *a)
36
+The ``tilegx`` guest CPU support (which was only implemented in
35
+{
37
+linux-user mode) is deprecated and will be removed in a future version
36
+ gen_helper_gvec_3_ptr *fn_gvec_ptr;
38
+of QEMU. Support for this CPU was removed from the upstream Linux
37
+ int opr_sz;
39
+kernel in 2018, and has also been dropped from glibc.
38
+ TCGv_ptr fpst;
39
+
40
+
40
+ if (!dc_isar_feature(aa32_vcma, s)) {
41
Related binaries
41
+ return false;
42
----------------
42
+ }
43
+ if (a->size == 0 && !dc_isar_feature(aa32_fp16_arith, s)) {
44
+ return false;
45
+ }
46
+
47
+ /* UNDEF accesses to D16-D31 if they don't exist. */
48
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
49
+ ((a->vd | a->vn | a->vm) & 0x10)) {
50
+ return false;
51
+ }
52
+
53
+ if ((a->vd | a->vn) & a->q) {
54
+ return false;
55
+ }
56
+
57
+ if (!vfp_access_check(s)) {
58
+ return true;
59
+ }
60
+
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
43
110
--
44
--
111
2.20.1
45
2.20.1
112
46
113
47
diff view generated by jsdifflib