1
As promised, more Arm patches. The big thing in here is the
1
Massive pullreq but almost all of that is RTH's SVE
2
MPS2-AN521 board model.
2
refactoring patchset. The other interesting thing here is
3
the fix for compiling on aarch64 macos.
3
4
4
thanks
5
thanks
5
-- PMM
6
-- PMM
6
7
7
The following changes since commit cfe6c547690b06fbce54a6d0f7b05dd7f18e36ea:
8
The following changes since commit f7a1ea403e0282a7f57edd4298c4f65f24165da5:
8
9
9
Merge remote-tracking branch 'remotes/xanclic/tags/pull-block-2019-01-31' into staging (2019-01-31 19:26:09 +0000)
10
Merge tag 'misc-pull-request' of gitlab.com:marcandre.lureau/qemu into staging (2022-05-29 16:34:56 -0700)
10
11
11
are available in the Git repository at:
12
are available in the Git repository at:
12
13
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190201
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220530
14
15
15
for you to fetch changes up to 7743b70ffe7a8ce168adce2cf50ad156b1fefb8c:
16
for you to fetch changes up to b1071174d2a2ab371082b7d4b5f19e98edc61ac6:
16
17
17
tests/microbit-test: Add tests for nRF51 NVMC (2019-02-01 15:32:17 +0000)
18
target/arm: Remove aa64_sve check from before disas_sve (2022-05-30 17:05:12 +0100)
18
19
19
----------------------------------------------------------------
20
----------------------------------------------------------------
20
target-arm queue:
21
target-arm queue:
21
* New machine mps2-an521 -- this is a model of the AN521 FPGA image for the MPS2 devboard
22
* docs/system/arm: Add FEAT_HCX to list of emulated features
22
* Fix various places where we failed to UNDEF invalid A64 instructions
23
* target/arm/hvf: Include missing "cpregs.h"
23
* Don't UNDEF a valid FCMLA on 32-bit inputs
24
* hw/sd/allwinner-sdhost: report FIFO water level as 1 when data ready
24
* Fix some bugs in the newly-added PAuth implementation
25
* SVE: refactor to use TRANS/TRANS_FEAT macros and push
25
* microbit: Implement NVMC non-volatile memory controller
26
SVE feature check down to individual insn level
26
27
27
----------------------------------------------------------------
28
----------------------------------------------------------------
28
Aaron Lindsay OS (2):
29
Icenowy Zheng (1):
29
target/arm: Send interrupts on PMU counter overflow
30
hw/sd/allwinner-sdhost: report FIFO water level as 1 when data ready
30
target/arm: Add a timer to predict PMU counter overflow
31
31
32
Julia Suvorova (1):
32
Peter Maydell (1):
33
arm: Clarify the logic of set_pc()
33
docs/system/arm: Add FEAT_HCX to list of emulated features
34
34
35
Peter Maydell (33):
35
Philippe Mathieu-Daudé (1):
36
armv7m: Don't assume the NVIC's CPU is CPU 0
36
target/arm/hvf: Include missing "cpregs.h"
37
armv7m: Make cpu object a child of the armv7m container
38
armv7m: Pass through start-powered-off CPU property
39
hw/arm/iotkit: Rename IoTKit to ARMSSE
40
hw/arm/iotkit: Refactor into abstract base class and subclass
41
hw/arm/iotkit: Rename 'iotkit' local variables and functions
42
hw/arm/iotkit: Rename files to hw/arm/armsse.[ch]
43
hw/misc/iotkit-secctl: Support 4 internal MPCs
44
hw/arm/armsse: Make number of SRAM banks parameterised
45
hw/arm/armsse: Make SRAM bank size configurable
46
hw/arm/armsse: Support dual-CPU configuration
47
hw/arm/armsse: Give each CPU its own view of memory
48
hw/arm/armsse: Put each CPU in its own cluster object
49
iotkit-sysinfo: Make SYS_VERSION and SYS_CONFIG configurable
50
hw/arm/armsse: Add unimplemented-device stubs for MHUs
51
hw/arm/armsse: Add unimplemented-device stubs for PPUs
52
hw/arm/armsse: Add unimplemented-device stub for cache control registers
53
hw/arm/armsse: Add unimplemented-device stub for CPU local control registers
54
hw/misc/armsse-cpuid: Implement SSE-200 CPU_IDENTITY register block
55
hw/arm/armsse: Add CPU_IDENTITY block to SSE-200
56
hw/arm/armsse: Add SSE-200 model
57
hw/arm/mps2-tz: Add IRQ infrastructure to support SSE-200
58
hw/arm/mps2-tz: Add mps2-an521 model
59
target/arm/translate-a64: Don't underdecode system instructions
60
target/arm/translate-a64: Don't underdecode PRFM
61
target/arm/translate-a64: Don't underdecode SIMD ld/st multiple
62
target/arm/translate-a64: Don't underdecode SIMD ld/st single
63
target/arm/translate-a64: Don't underdecode add/sub extended register
64
target/arm/translate-a64: Don't underdecode FP insns
65
target/arm/translate-a64: Don't underdecode SDOT and UDOT
66
exec.c: Don't reallocate IOMMUNotifiers that are in use
67
target/arm/translate-a64: Fix FCMLA decoding error
68
target/arm/translate-a64: Fix mishandling of size in FCMLA decode
69
37
70
Remi Denis-Courmont (2):
38
Richard Henderson (114):
71
target/arm: fix AArch64 virtual address space size
39
target/arm: Introduce TRANS, TRANS_FEAT
72
target/arm: fix decoding of B{,L}RA{A,B}
40
target/arm: Move null function and sve check into gen_gvec_ool_zz
41
target/arm: Use TRANS_FEAT for gen_gvec_ool_zz
42
target/arm: Move null function and sve check into gen_gvec_ool_zzz
43
target/arm: Introduce gen_gvec_ool_arg_zzz
44
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zzz
45
target/arm: Use TRANS_FEAT for do_sve2_zzz_ool
46
target/arm: Move null function and sve check into gen_gvec_ool_zzzz
47
target/arm: Use TRANS_FEAT for gen_gvec_ool_zzzz
48
target/arm: Introduce gen_gvec_ool_arg_zzzz
49
target/arm: Use TRANS_FEAT for do_sve2_zzzz_ool
50
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zzzz
51
target/arm: Rename do_zzxz_ool to gen_gvec_ool_arg_zzxz
52
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zzxz
53
target/arm: Use TRANS_FEAT for do_sve2_zzz_data
54
target/arm: Use TRANS_FEAT for do_sve2_zzzz_data
55
target/arm: Use TRANS_FEAT for do_sve2_zzw_data
56
target/arm: Use TRANS_FEAT for USDOT_zzzz
57
target/arm: Move null function and sve check into gen_gvec_ool_zzp
58
target/arm: Introduce gen_gvec_ool_arg_zpz
59
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zpz
60
target/arm: Use TRANS_FEAT for do_sve2_zpz_data
61
target/arm: Rename do_zpzi_ool to gen_gvec_ool_arg_zpzi
62
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zpzi
63
target/arm: Move null function and sve check into gen_gvec_ool_zzzp
64
target/arm: Introduce gen_gvec_ool_arg_zpzz
65
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zpzz
66
target/arm: Use TRANS_FEAT for do_sve2_zpzz_ool
67
target/arm: Merge gen_gvec_fn_zz into do_mov_z
68
target/arm: Move null function and sve check into gen_gvec_fn_zzz
69
target/arm: Rename do_zzz_fn to gen_gvec_fn_arg_zzz
70
target/arm: More use of gen_gvec_fn_arg_zzz
71
target/arm: Use TRANS_FEAT for gen_gvec_fn_arg_zzz
72
target/arm: Use TRANS_FEAT for do_sve2_fn_zzz
73
target/arm: Use TRANS_FEAT for RAX1
74
target/arm: Introduce gen_gvec_fn_arg_zzzz
75
target/arm: Use TRANS_FEAT for do_sve2_zzzz_fn
76
target/arm: Introduce gen_gvec_fn_zzi
77
target/arm: Use TRANS_FEAT for do_zz_dbm
78
target/arm: Hoist sve access check through do_sel_z
79
target/arm: Introduce gen_gvec_fn_arg_zzi
80
target/arm: Use TRANS_FEAT for do_sve2_fn2i
81
target/arm: Use TRANS_FEAT for do_vpz_ool
82
target/arm: Use TRANS_FEAT for do_shift_imm
83
target/arm: Introduce do_shift_zpzi
84
target/arm: Use TRANS_FEAT for do_shift_zpzi
85
target/arm: Use TRANS_FEAT for do_zpzzz_ool
86
target/arm: Move sve check into do_index
87
target/arm: Use TRANS_FEAT for do_index
88
target/arm: Use TRANS_FEAT for do_adr
89
target/arm: Use TRANS_FEAT for do_predset
90
target/arm: Use TRANS_FEAT for RDFFR, WRFFR
91
target/arm: Use TRANS_FEAT for do_pfirst_pnext
92
target/arm: Use TRANS_FEAT for do_EXT
93
target/arm: Use TRANS_FEAT for do_perm_pred3
94
target/arm: Use TRANS_FEAT for do_perm_pred2
95
target/arm: Move sve zip high_ofs into simd_data
96
target/arm: Use gen_gvec_ool_arg_zzz for do_zip, do_zip_q
97
target/arm: Use TRANS_FEAT for do_zip, do_zip_q
98
target/arm: Use TRANS_FEAT for do_clast_vector
99
target/arm: Use TRANS_FEAT for do_clast_fp
100
target/arm: Use TRANS_FEAT for do_clast_general
101
target/arm: Use TRANS_FEAT for do_last_fp
102
target/arm: Use TRANS_FEAT for do_last_general
103
target/arm: Use TRANS_FEAT for SPLICE
104
target/arm: Use TRANS_FEAT for do_ppzz_flags
105
target/arm: Use TRANS_FEAT for do_sve2_ppzz_flags
106
target/arm: Use TRANS_FEAT for do_ppzi_flags
107
target/arm: Use TRANS_FEAT for do_brk2, do_brk3
108
target/arm: Use TRANS_FEAT for MUL_zzi
109
target/arm: Reject dup_i w/ shifted byte early
110
target/arm: Reject add/sub w/ shifted byte early
111
target/arm: Reject copy w/ shifted byte early
112
target/arm: Use TRANS_FEAT for ADD_zzi
113
target/arm: Use TRANS_FEAT for do_zzi_sat
114
target/arm: Use TRANS_FEAT for do_zzi_ool
115
target/arm: Introduce gen_gvec_{ptr,fpst}_zzzz
116
target/arm: Use TRANS_FEAT for FMMLA
117
target/arm: Move sve check into gen_gvec_fn_ppp
118
target/arm: Implement NOT (prediates) alias
119
target/arm: Use TRANS_FEAT for SEL_zpzz
120
target/arm: Use TRANS_FEAT for MOVPRFX
121
target/arm: Use TRANS_FEAT for FMLA
122
target/arm: Use TRANS_FEAT for BFMLA
123
target/arm: Rename do_zzz_fp to gen_gvec_ool_fpst_arg_zzz
124
target/arm: Use TRANS_FEAT for DO_FP3
125
target/arm: Use TRANS_FEAT for FMUL_zzx
126
target/arm: Use TRANS_FEAT for FTMAD
127
target/arm: Move null function and sve check into do_reduce
128
target/arm: Use TRANS_FEAT for do_reduce
129
target/arm: Use TRANS_FEAT for FRECPE, FRSQRTE
130
target/arm: Expand frint_fns for MO_8
131
target/arm: Rename do_zpz_ptr to gen_gvec_ool_fpst_arg_zpz
132
target/arm: Move null function and sve check into do_frint_mode
133
target/arm: Use TRANS_FEAT for do_frint_mode
134
target/arm: Use TRANS_FEAT for FLOGB
135
target/arm: Use TRANS_FEAT for do_ppz_fp
136
target/arm: Rename do_zpzz_ptr to gen_gvec_fpst_arg_zpzz
137
target/arm: Use TRANS_FEAT for gen_gvec_fpst_arg_zpzz
138
target/arm: Use TRANS_FEAT for FCADD
139
target/arm: Introduce gen_gvec_fpst_zzzzp
140
target/arm: Use TRANS_FEAT for gen_gvec_fpst_zzzzp
141
target/arm: Move null function and sve check into do_fp_imm
142
target/arm: Use TRANS_FEAT for DO_FP_IMM
143
target/arm: Use TRANS_FEAT for DO_FPCMP
144
target/arm: Remove assert in trans_FCMLA_zzxz
145
target/arm: Use TRANS_FEAT for FCMLA_zzxz
146
target/arm: Use TRANS_FEAT for do_narrow_extract
147
target/arm: Use TRANS_FEAT for do_shll_tb
148
target/arm: Use TRANS_FEAT for do_shr_narrow
149
target/arm: Use TRANS_FEAT for do_FMLAL_zzzw
150
target/arm: Use TRANS_FEAT for do_FMLAL_zzxw
151
target/arm: Add sve feature check for remaining trans_* functions
152
target/arm: Remove aa64_sve check from before disas_sve
73
153
74
Richard Henderson (5):
154
docs/system/arm/emulation.rst | 1 +
75
target/arm: Enable API, APK bits in SCR, HCR
155
target/arm/translate.h | 11 +
76
target/arm: Always enable pac keys for user-only
156
target/arm/sve.decode | 57 +-
77
aarch64-linux-user: Update HWCAP bits from linux 5.0-rc1
157
hw/sd/allwinner-sdhost.c | 7 +
78
aarch64-linux-user: Enable HWCAP bits for PAuth
158
target/arm/hvf/hvf.c | 1 +
79
linux-user: Initialize aarch64 pac keys
159
target/arm/sve_helper.c | 6 +-
160
target/arm/translate-a64.c | 2 +-
161
target/arm/translate-sve.c | 5367 +++++++++++++++--------------------------
162
8 files changed, 2067 insertions(+), 3385 deletions(-)
80
163
81
Steffen Görtz (3):
82
hw/nvram/nrf51_nvm: Add nRF51 non-volatile memories
83
arm: Instantiate NRF51 special NVM's and NVMC
84
tests/microbit-test: Add tests for nRF51 NVMC
85
86
kumar sourav (1):
87
hw/arm/nrf51_soc: set object owner in memory_region_init_ram
88
89
hw/arm/Makefile.objs | 2 +-
90
hw/misc/Makefile.objs | 1 +
91
hw/nvram/Makefile.objs | 1 +
92
include/hw/arm/{iotkit.h => armsse.h} | 113 ++-
93
include/hw/arm/armv7m.h | 1 +
94
include/hw/arm/nrf51_soc.h | 2 +
95
include/hw/misc/armsse-cpuid.h | 41 ++
96
include/hw/misc/iotkit-secctl.h | 6 +-
97
include/hw/misc/iotkit-sysinfo.h | 6 +
98
include/hw/nvram/nrf51_nvm.h | 64 ++
99
include/qom/cpu.h | 16 +-
100
linux-user/aarch64/target_syscall.h | 2 +
101
target/arm/cpu.h | 12 +-
102
exec.c | 10 +-
103
hw/arm/armsse.c | 1241 +++++++++++++++++++++++++++++++++
104
hw/arm/armv7m.c | 23 +-
105
hw/arm/boot.c | 4 -
106
hw/arm/iotkit.c | 759 --------------------
107
hw/arm/mps2-tz.c | 121 +++-
108
hw/arm/nrf51_soc.c | 44 +-
109
hw/intc/armv7m_nvic.c | 3 +-
110
hw/misc/armsse-cpuid.c | 134 ++++
111
hw/misc/iotkit-secctl.c | 5 +-
112
hw/misc/iotkit-sysinfo.c | 15 +-
113
hw/nvram/nrf51_nvm.c | 388 +++++++++++
114
linux-user/aarch64/cpu_loop.c | 31 +-
115
linux-user/elfload.c | 10 +
116
target/arm/arm-powerctl.c | 3 -
117
target/arm/cpu.c | 41 +-
118
target/arm/cpu64.c | 75 --
119
target/arm/helper.c | 139 +++-
120
target/arm/translate-a64.c | 59 +-
121
tests/microbit-test.c | 108 +++
122
MAINTAINERS | 6 +-
123
default-configs/arm-softmmu.mak | 3 +-
124
hw/misc/trace-events | 4 +
125
36 files changed, 2552 insertions(+), 941 deletions(-)
126
rename include/hw/arm/{iotkit.h => armsse.h} (53%)
127
create mode 100644 include/hw/misc/armsse-cpuid.h
128
create mode 100644 include/hw/nvram/nrf51_nvm.h
129
create mode 100644 hw/arm/armsse.c
130
delete mode 100644 hw/arm/iotkit.c
131
create mode 100644 hw/misc/armsse-cpuid.c
132
create mode 100644 hw/nvram/nrf51_nvm.c
133
diff view generated by jsdifflib
1
Add a model of the SSE-200, now we have put in all
1
In commit 5814d587fe861fe9 we added support for emulating
2
the code that lets us make it different from the IoTKit.
2
FEAT_HCX (Support for the HCRX_EL2 register). However we
3
forgot to add it to the list in emulated.rst. Correct the
4
omission.
3
5
6
Fixes: 5814d587fe861fe9 ("target/arm: Enable FEAT_HCX for -cpu max")
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20190121185118.18550-22-peter.maydell@linaro.org
9
Message-id: 20220520084320.424166-1-peter.maydell@linaro.org
7
---
10
---
8
include/hw/arm/armsse.h | 19 ++++++++++++++++---
11
docs/system/arm/emulation.rst | 1 +
9
hw/arm/armsse.c | 12 ++++++++++++
12
1 file changed, 1 insertion(+)
10
2 files changed, 28 insertions(+), 3 deletions(-)
11
13
12
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
14
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/include/hw/arm/armsse.h
16
--- a/docs/system/arm/emulation.rst
15
+++ b/include/hw/arm/armsse.h
17
+++ b/docs/system/arm/emulation.rst
16
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
17
/*
19
- FEAT_FRINTTS (Floating-point to integer instructions)
18
- * ARM SSE (Subsystems for Embedded): IoTKit
20
- FEAT_FlagM (Flag manipulation instructions v2)
19
+ * ARM SSE (Subsystems for Embedded): IoTKit, SSE-200
21
- FEAT_FlagM2 (Enhancements to flag manipulation instructions)
20
*
22
+- FEAT_HCX (Support for the HCRX_EL2 register)
21
* Copyright (c) 2018 Linaro Limited
23
- FEAT_HPDS (Hierarchical permission disables)
22
* Written by Peter Maydell
24
- FEAT_I8MM (AArch64 Int8 matrix multiplication instructions)
23
@@ -XXX,XX +XXX,XX @@
25
- FEAT_IDST (ID space trap handling)
24
/*
25
* This is a model of the Arm "Subsystems for Embedded" family of
26
* hardware, which include the IoT Kit and the SSE-050, SSE-100 and
27
- * SSE-200. Currently we model only the Arm IoT Kit which is documented in
28
+ * SSE-200. Currently we model:
29
+ * - the Arm IoT Kit which is documented in
30
* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ecm0601256/index.html
31
- * It contains:
32
+ * - the SSE-200 which is documented in
33
+ * http://infocenter.arm.com/help/topic/com.arm.doc.101104_0100_00_en/corelink_sse200_subsystem_for_embedded_technical_reference_manual_101104_0100_00_en.pdf
34
+ *
35
+ * The IoTKit contains:
36
* a Cortex-M33
37
* the IDAU
38
* some timers and watchdogs
39
@@ -XXX,XX +XXX,XX @@
40
* a security controller
41
* a bus fabric which arranges that some parts of the address
42
* space are secure and non-secure aliases of each other
43
+ * The SSE-200 additionally contains:
44
+ * a second Cortex-M33
45
+ * two Message Handling Units (MHUs)
46
+ * an optional CryptoCell (which we do not model)
47
+ * more SRAM banks with associated MPCs
48
+ * multiple Power Policy Units (PPUs)
49
+ * a control interface for an icache for each CPU
50
+ * per-CPU identity and control register blocks
51
*
52
* QEMU interface:
53
* + QOM property "memory" is a MemoryRegion containing the devices provided
54
@@ -XXX,XX +XXX,XX @@
55
* them via the ARMSSE base class, so they have no IOTKIT() etc macros.
56
*/
57
#define TYPE_IOTKIT "iotkit"
58
+#define TYPE_SSE200 "sse-200"
59
60
/* We have an IRQ splitter and an OR gate input for each external PPC
61
* and the 2 internal PPCs
62
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
63
index XXXXXXX..XXXXXXX 100644
64
--- a/hw/arm/armsse.c
65
+++ b/hw/arm/armsse.c
66
@@ -XXX,XX +XXX,XX @@ static const ARMSSEInfo armsse_variants[] = {
67
.has_cpusecctrl = false,
68
.has_cpuid = false,
69
},
70
+ {
71
+ .name = TYPE_SSE200,
72
+ .sram_banks = 4,
73
+ .num_cpus = 2,
74
+ .sys_version = 0x22041743,
75
+ .sys_config_format = SSE200Format,
76
+ .has_mhus = true,
77
+ .has_ppus = true,
78
+ .has_cachectrl = true,
79
+ .has_cpusecctrl = true,
80
+ .has_cpuid = true,
81
+ },
82
};
83
84
static uint32_t armsse_sys_config_value(ARMSSE *s, const ARMSSEInfo *info)
85
--
26
--
86
2.20.1
27
2.25.1
87
88
diff view generated by jsdifflib
1
Instantiate a copy of the CPU_IDENTITY register block for each CPU
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
in an SSE-200.
3
2
3
Fix when building HVF on macOS Aarch64:
4
5
target/arm/hvf/hvf.c:586:15: error: unknown type name 'ARMCPRegInfo'; did you mean 'ARMCPUInfo'?
6
const ARMCPRegInfo *ri;
7
^~~~~~~~~~~~
8
ARMCPUInfo
9
target/arm/cpu-qom.h:38:3: note: 'ARMCPUInfo' declared here
10
} ARMCPUInfo;
11
^
12
target/arm/hvf/hvf.c:589:14: error: implicit declaration of function 'get_arm_cp_reginfo' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
13
ri = get_arm_cp_reginfo(arm_cpu->cp_regs, key);
14
^
15
target/arm/hvf/hvf.c:589:12: warning: incompatible integer to pointer conversion assigning to 'const ARMCPUInfo *' (aka 'const struct ARMCPUInfo *') from 'int' [-Wint-conversion]
16
ri = get_arm_cp_reginfo(arm_cpu->cp_regs, key);
17
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18
target/arm/hvf/hvf.c:591:26: error: no member named 'type' in 'struct ARMCPUInfo'
19
assert(!(ri->type & ARM_CP_NO_RAW));
20
~~ ^
21
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/assert.h:99:25: note: expanded from macro 'assert'
22
(__builtin_expect(!(e), 0) ? __assert_rtn(__func__, __ASSERT_FILE_NAME, __LINE__, #e) : (void)0)
23
^
24
target/arm/hvf/hvf.c:591:33: error: use of undeclared identifier 'ARM_CP_NO_RAW'
25
assert(!(ri->type & ARM_CP_NO_RAW));
26
^
27
1 warning and 4 errors generated.
28
29
Fixes: cf7c6d1004 ("target/arm: Split out cpregs.h")
30
Reported-by: Duncan Bayne <duncan@bayne.id.au>
31
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
32
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
33
Message-id: 20220525161926.34233-1-philmd@fungible.com
34
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1029
35
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
36
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20190121185118.18550-21-peter.maydell@linaro.org
7
---
37
---
8
include/hw/arm/armsse.h | 3 +++
38
target/arm/hvf/hvf.c | 1 +
9
hw/arm/armsse.c | 28 ++++++++++++++++++++++++++++
39
1 file changed, 1 insertion(+)
10
2 files changed, 31 insertions(+)
11
40
12
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
41
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
13
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
14
--- a/include/hw/arm/armsse.h
43
--- a/target/arm/hvf/hvf.c
15
+++ b/include/hw/arm/armsse.h
44
+++ b/target/arm/hvf/hvf.c
16
@@ -XXX,XX +XXX,XX @@
45
@@ -XXX,XX +XXX,XX @@
17
#include "hw/watchdog/cmsdk-apb-watchdog.h"
46
#include "sysemu/hvf_int.h"
18
#include "hw/misc/iotkit-sysctl.h"
47
#include "sysemu/hw_accel.h"
19
#include "hw/misc/iotkit-sysinfo.h"
48
#include "hvf_arm.h"
20
+#include "hw/misc/armsse-cpuid.h"
49
+#include "cpregs.h"
21
#include "hw/misc/unimp.h"
50
22
#include "hw/or-irq.h"
51
#include <mach/mach_time.h>
23
#include "hw/core/split-irq.h"
52
24
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
25
UnimplementedDeviceState cachectrl[SSE_MAX_CPUS];
26
UnimplementedDeviceState cpusecctrl[SSE_MAX_CPUS];
27
28
+ ARMSSECPUID cpuid[SSE_MAX_CPUS];
29
+
30
/*
31
* 'container' holds all devices seen by all CPUs.
32
* 'cpu_container[i]' is the view that CPU i has: this has the
33
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/armsse.c
36
+++ b/hw/arm/armsse.c
37
@@ -XXX,XX +XXX,XX @@ struct ARMSSEInfo {
38
bool has_ppus;
39
bool has_cachectrl;
40
bool has_cpusecctrl;
41
+ bool has_cpuid;
42
};
43
44
static const ARMSSEInfo armsse_variants[] = {
45
@@ -XXX,XX +XXX,XX @@ static const ARMSSEInfo armsse_variants[] = {
46
.has_ppus = false,
47
.has_cachectrl = false,
48
.has_cpusecctrl = false,
49
+ .has_cpuid = false,
50
},
51
};
52
53
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
54
g_free(name);
55
}
56
}
57
+ if (info->has_cpuid) {
58
+ for (i = 0; i < info->num_cpus; i++) {
59
+ char *name = g_strdup_printf("cpuid%d", i);
60
+
61
+ sysbus_init_child_obj(obj, name, &s->cpuid[i],
62
+ sizeof(s->cpuid[i]),
63
+ TYPE_ARMSSE_CPUID);
64
+ g_free(name);
65
+ }
66
+ }
67
object_initialize_child(obj, "nmi-orgate", &s->nmi_orgate,
68
sizeof(s->nmi_orgate), TYPE_OR_IRQ,
69
&error_abort, NULL);
70
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
71
memory_region_add_subregion(&s->cpu_container[i], 0x50011000, mr);
72
}
73
}
74
+ if (info->has_cpuid) {
75
+ for (i = 0; i < info->num_cpus; i++) {
76
+ MemoryRegion *mr;
77
+
78
+ qdev_prop_set_uint32(DEVICE(&s->cpuid[i]), "CPUID", i);
79
+ object_property_set_bool(OBJECT(&s->cpuid[i]), true,
80
+ "realized", &err);
81
+ if (err) {
82
+ error_propagate(errp, err);
83
+ return;
84
+ }
85
+
86
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->cpuid[i]), 0);
87
+ memory_region_add_subregion(&s->cpu_container[i], 0x4001F000, mr);
88
+ }
89
+ }
90
91
/* 0x40020000 .. 0x4002ffff : ARMSSE system control peripheral region */
92
/* Devices behind APB PPC1:
93
--
53
--
94
2.20.1
54
2.25.1
95
55
96
56
diff view generated by jsdifflib
1
The SSE-200 has a "CPU local security control" register bank; add an
1
From: Icenowy Zheng <uwu@icenowy.me>
2
unimplemented-device stub for it. (The register bank has only one
3
interesting register, which allows the guest to lock down changes
4
to various CPU registers so they cannot be modified further. We
5
don't support that in our Cortex-M33 model anyway.)
6
2
3
U-Boot queries the FIFO water level to reduce checking status register
4
when doing PIO SD card operation.
5
6
Report a FIFO water level of 1 when data is ready, to prevent the code
7
from trying to read 0 words from the FIFO each time.
8
9
Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
10
Message-id: 20220520124200.2112699-1-uwu@icenowy.me
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
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>
9
Message-id: 20190121185118.18550-19-peter.maydell@linaro.org
10
---
13
---
11
include/hw/arm/armsse.h | 1 +
14
hw/sd/allwinner-sdhost.c | 7 +++++++
12
hw/arm/armsse.c | 31 +++++++++++++++++++++++++++++++
15
1 file changed, 7 insertions(+)
13
2 files changed, 32 insertions(+)
14
16
15
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
17
diff --git a/hw/sd/allwinner-sdhost.c b/hw/sd/allwinner-sdhost.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/armsse.h
19
--- a/hw/sd/allwinner-sdhost.c
18
+++ b/include/hw/arm/armsse.h
20
+++ b/hw/sd/allwinner-sdhost.c
19
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
21
@@ -XXX,XX +XXX,XX @@ enum {
20
UnimplementedDeviceState mhu[2];
21
UnimplementedDeviceState ppu[NUM_PPUS];
22
UnimplementedDeviceState cachectrl[SSE_MAX_CPUS];
23
+ UnimplementedDeviceState cpusecctrl[SSE_MAX_CPUS];
24
25
/*
26
* 'container' holds all devices seen by all CPUs.
27
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/armsse.c
30
+++ b/hw/arm/armsse.c
31
@@ -XXX,XX +XXX,XX @@ struct ARMSSEInfo {
32
bool has_mhus;
33
bool has_ppus;
34
bool has_cachectrl;
35
+ bool has_cpusecctrl;
36
};
22
};
37
23
38
static const ARMSSEInfo armsse_variants[] = {
24
enum {
39
@@ -XXX,XX +XXX,XX @@ static const ARMSSEInfo armsse_variants[] = {
25
+ SD_STAR_FIFO_EMPTY = (1 << 2),
40
.has_mhus = false,
26
SD_STAR_CARD_PRESENT = (1 << 8),
41
.has_ppus = false,
27
+ SD_STAR_FIFO_LEVEL_1 = (1 << 17),
42
.has_cachectrl = false,
43
+ .has_cpusecctrl = false,
44
},
45
};
28
};
46
29
47
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
30
enum {
48
g_free(name);
31
@@ -XXX,XX +XXX,XX @@ static uint64_t allwinner_sdhost_read(void *opaque, hwaddr offset,
49
}
32
break;
50
}
33
case REG_SD_STAR: /* Status */
51
+ if (info->has_cpusecctrl) {
34
res = s->status;
52
+ for (i = 0; i < info->num_cpus; i++) {
35
+ if (sdbus_data_ready(&s->sdbus)) {
53
+ char *name = g_strdup_printf("cpusecctrl%d", i);
36
+ res |= SD_STAR_FIFO_LEVEL_1;
54
+
37
+ } else {
55
+ sysbus_init_child_obj(obj, name, &s->cpusecctrl[i],
38
+ res |= SD_STAR_FIFO_EMPTY;
56
+ sizeof(s->cpusecctrl[i]),
57
+ TYPE_UNIMPLEMENTED_DEVICE);
58
+ g_free(name);
59
+ }
39
+ }
60
+ }
40
break;
61
object_initialize_child(obj, "nmi-orgate", &s->nmi_orgate,
41
case REG_SD_FWLR: /* FIFO Water Level */
62
sizeof(s->nmi_orgate), TYPE_OR_IRQ,
42
res = s->fifo_wlevel;
63
&error_abort, NULL);
64
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
65
memory_region_add_subregion(&s->cpu_container[i], 0x50010000, mr);
66
}
67
}
68
+ if (info->has_cpusecctrl) {
69
+ for (i = 0; i < info->num_cpus; i++) {
70
+ char *name = g_strdup_printf("CPUSECCTRL%d", i);
71
+ MemoryRegion *mr;
72
+
73
+ qdev_prop_set_string(DEVICE(&s->cpusecctrl[i]), "name", name);
74
+ g_free(name);
75
+ qdev_prop_set_uint64(DEVICE(&s->cpusecctrl[i]), "size", 0x1000);
76
+ object_property_set_bool(OBJECT(&s->cpusecctrl[i]), true,
77
+ "realized", &err);
78
+ if (err) {
79
+ error_propagate(errp, err);
80
+ return;
81
+ }
82
+
83
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->cpusecctrl[i]), 0);
84
+ memory_region_add_subregion(&s->cpu_container[i], 0x50011000, mr);
85
+ }
86
+ }
87
88
/* 0x40020000 .. 0x4002ffff : ARMSSE system control peripheral region */
89
/* Devices behind APB PPC1:
90
--
43
--
91
2.20.1
44
2.25.1
92
93
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Steal the idea for these leaf function expanders from PowerPC.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-2-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate.h | 11 +++++++++++
11
1 file changed, 11 insertions(+)
12
13
diff --git a/target/arm/translate.h b/target/arm/translate.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate.h
16
+++ b/target/arm/translate.h
17
@@ -XXX,XX +XXX,XX @@ static inline MemOp finalize_memop(DisasContext *s, MemOp opc)
18
*/
19
uint64_t asimd_imm_const(uint32_t imm, int cmode, int op);
20
21
+/*
22
+ * Helpers for implementing sets of trans_* functions.
23
+ * Defer the implementation of NAME to FUNC, with optional extra arguments.
24
+ */
25
+#define TRANS(NAME, FUNC, ...) \
26
+ static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
27
+ { return FUNC(s, __VA_ARGS__); }
28
+#define TRANS_FEAT(NAME, FEAT, FUNC, ...) \
29
+ static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
30
+ { return dc_isar_feature(FEAT, s) && FUNC(s, __VA_ARGS__); }
31
+
32
#endif /* TARGET_ARM_TRANSLATE_H */
33
--
34
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-3-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 36 +++++++++++++++---------------------
9
1 file changed, 15 insertions(+), 21 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static int pred_gvec_reg_size(DisasContext *s)
16
}
17
18
/* Invoke an out-of-line helper on 2 Zregs. */
19
-static void gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
20
+static bool gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
21
int rd, int rn, int data)
22
{
23
- unsigned vsz = vec_full_reg_size(s);
24
- tcg_gen_gvec_2_ool(vec_full_reg_offset(s, rd),
25
- vec_full_reg_offset(s, rn),
26
- vsz, vsz, data, fn);
27
+ if (fn == NULL) {
28
+ return false;
29
+ }
30
+ if (sve_access_check(s)) {
31
+ unsigned vsz = vec_full_reg_size(s);
32
+ tcg_gen_gvec_2_ool(vec_full_reg_offset(s, rd),
33
+ vec_full_reg_offset(s, rn),
34
+ vsz, vsz, data, fn);
35
+ }
36
+ return true;
37
}
38
39
/* Invoke an out-of-line helper on 3 Zregs. */
40
@@ -XXX,XX +XXX,XX @@ static bool trans_FEXPA(DisasContext *s, arg_rr_esz *a)
41
gen_helper_sve_fexpa_s,
42
gen_helper_sve_fexpa_d,
43
};
44
- if (a->esz == 0) {
45
- return false;
46
- }
47
- if (sve_access_check(s)) {
48
- gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
49
- }
50
- return true;
51
+ return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
52
}
53
54
static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
55
@@ -XXX,XX +XXX,XX @@ static bool trans_REV_v(DisasContext *s, arg_rr_esz *a)
56
gen_helper_sve_rev_b, gen_helper_sve_rev_h,
57
gen_helper_sve_rev_s, gen_helper_sve_rev_d
58
};
59
-
60
- if (sve_access_check(s)) {
61
- gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
62
- }
63
- return true;
64
+ return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
65
}
66
67
static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
68
@@ -XXX,XX +XXX,XX @@ static bool trans_AESMC(DisasContext *s, arg_AESMC *a)
69
if (!dc_isar_feature(aa64_sve2_aes, s)) {
70
return false;
71
}
72
- if (sve_access_check(s)) {
73
- gen_gvec_ool_zz(s, gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt);
74
- }
75
- return true;
76
+ return gen_gvec_ool_zz(s, gen_helper_crypto_aesmc,
77
+ a->rd, a->rd, a->decrypt);
78
}
79
80
static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
81
--
82
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions using gen_gvec_ool_zz to TRANS_FEAT.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-4-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate-sve.c | 39 +++++++++++++-------------------------
11
1 file changed, 13 insertions(+), 26 deletions(-)
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static bool trans_ADR_u32(DisasContext *s, arg_rrri *a)
18
*** SVE Integer Misc - Unpredicated Group
19
*/
20
21
-static bool trans_FEXPA(DisasContext *s, arg_rr_esz *a)
22
-{
23
- static gen_helper_gvec_2 * const fns[4] = {
24
- NULL,
25
- gen_helper_sve_fexpa_h,
26
- gen_helper_sve_fexpa_s,
27
- gen_helper_sve_fexpa_d,
28
- };
29
- return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
30
-}
31
+static gen_helper_gvec_2 * const fexpa_fns[4] = {
32
+ NULL, gen_helper_sve_fexpa_h,
33
+ gen_helper_sve_fexpa_s, gen_helper_sve_fexpa_d,
34
+};
35
+TRANS_FEAT(FEXPA, aa64_sve, gen_gvec_ool_zz,
36
+ fexpa_fns[a->esz], a->rd, a->rn, 0)
37
38
static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
39
{
40
@@ -XXX,XX +XXX,XX @@ static bool trans_INSR_r(DisasContext *s, arg_rrr_esz *a)
41
return true;
42
}
43
44
-static bool trans_REV_v(DisasContext *s, arg_rr_esz *a)
45
-{
46
- static gen_helper_gvec_2 * const fns[4] = {
47
- gen_helper_sve_rev_b, gen_helper_sve_rev_h,
48
- gen_helper_sve_rev_s, gen_helper_sve_rev_d
49
- };
50
- return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
51
-}
52
+static gen_helper_gvec_2 * const rev_fns[4] = {
53
+ gen_helper_sve_rev_b, gen_helper_sve_rev_h,
54
+ gen_helper_sve_rev_s, gen_helper_sve_rev_d
55
+};
56
+TRANS_FEAT(REV_v, aa64_sve, gen_gvec_ool_zz, rev_fns[a->esz], a->rd, a->rn, 0)
57
58
static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
59
{
60
@@ -XXX,XX +XXX,XX @@ static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
61
return true;
62
}
63
64
-static bool trans_AESMC(DisasContext *s, arg_AESMC *a)
65
-{
66
- if (!dc_isar_feature(aa64_sve2_aes, s)) {
67
- return false;
68
- }
69
- return gen_gvec_ool_zz(s, gen_helper_crypto_aesmc,
70
- a->rd, a->rd, a->decrypt);
71
-}
72
+TRANS_FEAT(AESMC, aa64_sve2_aes, gen_gvec_ool_zz,
73
+ gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt)
74
75
static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
76
{
77
--
78
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-5-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 74 ++++++++++++--------------------------
9
1 file changed, 23 insertions(+), 51 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
16
}
17
18
/* Invoke an out-of-line helper on 3 Zregs. */
19
-static void gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
20
+static bool gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
21
int rd, int rn, int rm, int data)
22
{
23
- unsigned vsz = vec_full_reg_size(s);
24
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
25
- vec_full_reg_offset(s, rn),
26
- vec_full_reg_offset(s, rm),
27
- vsz, vsz, data, fn);
28
+ if (fn == NULL) {
29
+ return false;
30
+ }
31
+ if (sve_access_check(s)) {
32
+ unsigned vsz = vec_full_reg_size(s);
33
+ tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
34
+ vec_full_reg_offset(s, rn),
35
+ vec_full_reg_offset(s, rm),
36
+ vsz, vsz, data, fn);
37
+ }
38
+ return true;
39
}
40
41
/* Invoke an out-of-line helper on 4 Zregs. */
42
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zzi(DisasContext *s, arg_rri_esz *a)
43
44
static bool do_zzw_ool(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
45
{
46
- if (fn == NULL) {
47
- return false;
48
- }
49
- if (sve_access_check(s)) {
50
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
51
- }
52
- return true;
53
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
54
}
55
56
#define DO_ZZW(NAME, name) \
57
@@ -XXX,XX +XXX,XX @@ static bool trans_RDVL(DisasContext *s, arg_RDVL *a)
58
59
static bool do_adr(DisasContext *s, arg_rrri *a, gen_helper_gvec_3 *fn)
60
{
61
- if (sve_access_check(s)) {
62
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, a->imm);
63
- }
64
- return true;
65
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, a->imm);
66
}
67
68
static bool trans_ADR_p32(DisasContext *s, arg_rrri *a)
69
@@ -XXX,XX +XXX,XX @@ static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
70
gen_helper_sve_ftssel_s,
71
gen_helper_sve_ftssel_d,
72
};
73
- if (a->esz == 0) {
74
- return false;
75
- }
76
- if (sve_access_check(s)) {
77
- gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
78
- }
79
- return true;
80
+ return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
81
}
82
83
/*
84
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
85
gen_helper_sve_tbl_b, gen_helper_sve_tbl_h,
86
gen_helper_sve_tbl_s, gen_helper_sve_tbl_d
87
};
88
-
89
- if (sve_access_check(s)) {
90
- gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
91
- }
92
- return true;
93
+ return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
94
}
95
96
static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
97
@@ -XXX,XX +XXX,XX @@ static bool trans_TBX(DisasContext *s, arg_rrr_esz *a)
98
if (!dc_isar_feature(aa64_sve2, s)) {
99
return false;
100
}
101
- if (sve_access_check(s)) {
102
- gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
103
- }
104
- return true;
105
+ return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
106
}
107
108
static bool trans_UNPK(DisasContext *s, arg_UNPK *a)
109
@@ -XXX,XX +XXX,XX @@ static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
110
static bool do_zzz_data_ool(DisasContext *s, arg_rrr_esz *a, int data,
111
gen_helper_gvec_3 *fn)
112
{
113
- if (sve_access_check(s)) {
114
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
115
- }
116
- return true;
117
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
118
}
119
120
static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
121
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
122
static bool do_sve2_zzz_ool(DisasContext *s, arg_rrr_esz *a,
123
gen_helper_gvec_3 *fn)
124
{
125
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
126
+ if (!dc_isar_feature(aa64_sve2, s)) {
127
return false;
128
}
129
- if (sve_access_check(s)) {
130
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
131
- }
132
- return true;
133
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
134
}
135
136
static bool trans_SMULH_zzz(DisasContext *s, arg_rrr_esz *a)
137
@@ -XXX,XX +XXX,XX @@ static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
138
if (!dc_isar_feature(aa64_sve2_aes, s)) {
139
return false;
140
}
141
- if (sve_access_check(s)) {
142
- gen_gvec_ool_zzz(s, gen_helper_crypto_aese,
143
- a->rd, a->rn, a->rm, decrypt);
144
- }
145
- return true;
146
+ return gen_gvec_ool_zzz(s, gen_helper_crypto_aese,
147
+ a->rd, a->rn, a->rm, decrypt);
148
}
149
150
static bool trans_AESE(DisasContext *s, arg_rrr_esz *a)
151
@@ -XXX,XX +XXX,XX @@ static bool do_sm4(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
152
if (!dc_isar_feature(aa64_sve2_sm4, s)) {
153
return false;
154
}
155
- if (sve_access_check(s)) {
156
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
157
- }
158
- return true;
159
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
160
}
161
162
static bool trans_SM4E(DisasContext *s, arg_rrr_esz *a)
163
--
164
2.25.1
diff view generated by jsdifflib
1
From: Aaron Lindsay OS <aaron@os.amperecomputing.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Whenever we notice that a counter overflow has occurred, send an
3
Use gen_gvec_ool_arg_zzz instead of gen_gvec_ool_zzz
4
interrupt. This is made more reliable with the addition of a timer in a
4
when the arguments come from arg_rrr_esz.
5
follow-on commit.
5
Replaces do_zzw_ool and do_zzz_data_ool.
6
6
7
Signed-off-by: Aaron Lindsay <aaron@os.amperecomputing.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-6-richard.henderson@linaro.org
9
Message-id: 20190124162401.5111-2-aaron@os.amperecomputing.com
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
11
---
12
target/arm/helper.c | 61 +++++++++++++++++++++++++++++++++++++--------
12
target/arm/translate-sve.c | 48 +++++++++++++++++---------------------
13
1 file changed, 51 insertions(+), 10 deletions(-)
13
1 file changed, 21 insertions(+), 27 deletions(-)
14
14
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.c
17
--- a/target/arm/translate-sve.c
18
+++ b/target/arm/helper.c
18
+++ b/target/arm/translate-sve.c
19
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
20
/* Definitions for the PMU registers */
20
return true;
21
#define PMCRN_MASK 0xf800
22
#define PMCRN_SHIFT 11
23
+#define PMCRLC 0x40
24
#define PMCRDP 0x10
25
#define PMCRD 0x8
26
#define PMCRC 0x4
27
@@ -XXX,XX +XXX,XX @@ static bool pmu_counter_enabled(CPUARMState *env, uint8_t counter)
28
return enabled && !prohibited && !filtered;
29
}
21
}
30
22
31
+static void pmu_update_irq(CPUARMState *env)
23
+static bool gen_gvec_ool_arg_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
24
+ arg_rrr_esz *a, int data)
32
+{
25
+{
33
+ ARMCPU *cpu = arm_env_get_cpu(env);
26
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
34
+ qemu_set_irq(cpu->pmu_interrupt, (env->cp15.c9_pmcr & PMCRE) &&
35
+ (env->cp15.c9_pminten & env->cp15.c9_pmovsr));
36
+}
27
+}
37
+
28
+
29
/* Invoke an out-of-line helper on 4 Zregs. */
30
static void gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
31
int rd, int rn, int rm, int ra, int data)
32
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zzi(DisasContext *s, arg_rri_esz *a)
33
return do_shift_imm(s, a, false, tcg_gen_gvec_shli);
34
}
35
36
-static bool do_zzw_ool(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
37
-{
38
- return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
39
-}
40
-
41
#define DO_ZZW(NAME, name) \
42
static bool trans_##NAME##_zzw(DisasContext *s, arg_rrr_esz *a) \
43
{ \
44
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME##_zzw(DisasContext *s, arg_rrr_esz *a) \
45
gen_helper_sve_##name##_zzw_b, gen_helper_sve_##name##_zzw_h, \
46
gen_helper_sve_##name##_zzw_s, NULL \
47
}; \
48
- return do_zzw_ool(s, a, fns[a->esz]); \
49
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0); \
50
}
51
52
DO_ZZW(ASR, asr)
53
@@ -XXX,XX +XXX,XX @@ static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
54
gen_helper_sve_ftssel_s,
55
gen_helper_sve_ftssel_d,
56
};
57
- return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
58
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
59
}
60
38
/*
61
/*
39
* Ensure c15_ccnt is the guest-visible count so that operations such as
62
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
40
* enabling/disabling the counter or filtering, modifying the count itself,
63
gen_helper_sve_tbl_b, gen_helper_sve_tbl_h,
41
@@ -XXX,XX +XXX,XX @@ void pmccntr_op_start(CPUARMState *env)
64
gen_helper_sve_tbl_s, gen_helper_sve_tbl_d
42
eff_cycles /= 64;
65
};
43
}
66
- return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
44
67
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
45
- env->cp15.c15_ccnt = eff_cycles - env->cp15.c15_ccnt_delta;
68
}
46
+ uint64_t new_pmccntr = eff_cycles - env->cp15.c15_ccnt_delta;
69
47
+
70
static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
48
+ uint64_t overflow_mask = env->cp15.c9_pmcr & PMCRLC ? \
71
@@ -XXX,XX +XXX,XX @@ static bool trans_TBX(DisasContext *s, arg_rrr_esz *a)
49
+ 1ull << 63 : 1ull << 31;
72
if (!dc_isar_feature(aa64_sve2, s)) {
50
+ if (env->cp15.c15_ccnt & ~new_pmccntr & overflow_mask) {
73
return false;
51
+ env->cp15.c9_pmovsr |= (1 << 31);
52
+ pmu_update_irq(env);
53
+ }
54
+
55
+ env->cp15.c15_ccnt = new_pmccntr;
56
}
74
}
57
env->cp15.c15_ccnt_delta = cycles;
75
- return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
76
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
58
}
77
}
59
@@ -XXX,XX +XXX,XX @@ static void pmevcntr_op_start(CPUARMState *env, uint8_t counter)
78
79
static bool trans_UNPK(DisasContext *s, arg_UNPK *a)
80
@@ -XXX,XX +XXX,XX @@ static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
81
return true;
82
}
83
84
-static bool do_zzz_data_ool(DisasContext *s, arg_rrr_esz *a, int data,
85
- gen_helper_gvec_3 *fn)
86
-{
87
- return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
88
-}
89
-
90
static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
91
{
92
return do_zip(s, a, false);
93
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const uzp_fns[4] = {
94
95
static bool trans_UZP1_z(DisasContext *s, arg_rrr_esz *a)
96
{
97
- return do_zzz_data_ool(s, a, 0, uzp_fns[a->esz]);
98
+ return gen_gvec_ool_arg_zzz(s, uzp_fns[a->esz], a, 0);
99
}
100
101
static bool trans_UZP2_z(DisasContext *s, arg_rrr_esz *a)
102
{
103
- return do_zzz_data_ool(s, a, 1 << a->esz, uzp_fns[a->esz]);
104
+ return gen_gvec_ool_arg_zzz(s, uzp_fns[a->esz], a, 1 << a->esz);
105
}
106
107
static bool trans_UZP1_q(DisasContext *s, arg_rrr_esz *a)
108
@@ -XXX,XX +XXX,XX @@ static bool trans_UZP1_q(DisasContext *s, arg_rrr_esz *a)
109
if (!dc_isar_feature(aa64_sve_f64mm, s)) {
110
return false;
60
}
111
}
61
112
- return do_zzz_data_ool(s, a, 0, gen_helper_sve2_uzp_q);
62
if (pmu_counter_enabled(env, counter)) {
113
+ return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_uzp_q, a, 0);
63
- env->cp15.c14_pmevcntr[counter] =
114
}
64
- count - env->cp15.c14_pmevcntr_delta[counter];
115
65
+ uint32_t new_pmevcntr = count - env->cp15.c14_pmevcntr_delta[counter];
116
static bool trans_UZP2_q(DisasContext *s, arg_rrr_esz *a)
66
+
117
@@ -XXX,XX +XXX,XX @@ static bool trans_UZP2_q(DisasContext *s, arg_rrr_esz *a)
67
+ if (env->cp15.c14_pmevcntr[counter] & ~new_pmevcntr & INT32_MIN) {
118
if (!dc_isar_feature(aa64_sve_f64mm, s)) {
68
+ env->cp15.c9_pmovsr |= (1 << counter);
119
return false;
69
+ pmu_update_irq(env);
70
+ }
71
+ env->cp15.c14_pmevcntr[counter] = new_pmevcntr;
72
}
120
}
73
env->cp15.c14_pmevcntr_delta[counter] = count;
121
- return do_zzz_data_ool(s, a, 16, gen_helper_sve2_uzp_q);
122
+ return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_uzp_q, a, 16);
74
}
123
}
75
@@ -XXX,XX +XXX,XX @@ static void pmswinc_write(CPUARMState *env, const ARMCPRegInfo *ri,
124
76
/* counter is SW_INCR */
125
static gen_helper_gvec_3 * const trn_fns[4] = {
77
(env->cp15.c14_pmevtyper[i] & PMXEVTYPER_EVTCOUNT) == 0x0) {
126
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const trn_fns[4] = {
78
pmevcntr_op_start(env, i);
127
79
- env->cp15.c14_pmevcntr[i]++;
128
static bool trans_TRN1_z(DisasContext *s, arg_rrr_esz *a)
80
+
129
{
81
+ /*
130
- return do_zzz_data_ool(s, a, 0, trn_fns[a->esz]);
82
+ * Detect if this write causes an overflow since we can't predict
131
+ return gen_gvec_ool_arg_zzz(s, trn_fns[a->esz], a, 0);
83
+ * PMSWINC overflows like we can for other events
132
}
84
+ */
133
85
+ uint32_t new_pmswinc = env->cp15.c14_pmevcntr[i] + 1;
134
static bool trans_TRN2_z(DisasContext *s, arg_rrr_esz *a)
86
+
135
{
87
+ if (env->cp15.c14_pmevcntr[i] & ~new_pmswinc & INT32_MIN) {
136
- return do_zzz_data_ool(s, a, 1 << a->esz, trn_fns[a->esz]);
88
+ env->cp15.c9_pmovsr |= (1 << i);
137
+ return gen_gvec_ool_arg_zzz(s, trn_fns[a->esz], a, 1 << a->esz);
89
+ pmu_update_irq(env);
138
}
90
+ }
139
91
+
140
static bool trans_TRN1_q(DisasContext *s, arg_rrr_esz *a)
92
+ env->cp15.c14_pmevcntr[i] = new_pmswinc;
141
@@ -XXX,XX +XXX,XX @@ static bool trans_TRN1_q(DisasContext *s, arg_rrr_esz *a)
93
+
142
if (!dc_isar_feature(aa64_sve_f64mm, s)) {
94
pmevcntr_op_finish(env, i);
143
return false;
95
}
96
}
144
}
97
@@ -XXX,XX +XXX,XX @@ static void pmovsr_write(CPUARMState *env, const ARMCPRegInfo *ri,
145
- return do_zzz_data_ool(s, a, 0, gen_helper_sve2_trn_q);
98
{
146
+ return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_trn_q, a, 0);
99
value &= pmu_counter_mask(env);
100
env->cp15.c9_pmovsr &= ~value;
101
+ pmu_update_irq(env);
102
}
147
}
103
148
104
static void pmovsset_write(CPUARMState *env, const ARMCPRegInfo *ri,
149
static bool trans_TRN2_q(DisasContext *s, arg_rrr_esz *a)
105
@@ -XXX,XX +XXX,XX @@ static void pmovsset_write(CPUARMState *env, const ARMCPRegInfo *ri,
150
@@ -XXX,XX +XXX,XX @@ static bool trans_TRN2_q(DisasContext *s, arg_rrr_esz *a)
106
{
151
if (!dc_isar_feature(aa64_sve_f64mm, s)) {
107
value &= pmu_counter_mask(env);
152
return false;
108
env->cp15.c9_pmovsr |= value;
153
}
109
+ pmu_update_irq(env);
154
- return do_zzz_data_ool(s, a, 16, gen_helper_sve2_trn_q);
155
+ return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_trn_q, a, 16);
110
}
156
}
111
157
112
static void pmevtyper_write(CPUARMState *env, const ARMCPRegInfo *ri,
158
/*
113
@@ -XXX,XX +XXX,XX @@ static void pmintenset_write(CPUARMState *env, const ARMCPRegInfo *ri,
159
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zzz_ool(DisasContext *s, arg_rrr_esz *a,
114
/* We have no event counters so only the C bit can be changed */
160
if (!dc_isar_feature(aa64_sve2, s)) {
115
value &= pmu_counter_mask(env);
161
return false;
116
env->cp15.c9_pminten |= value;
162
}
117
+ pmu_update_irq(env);
163
- return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
164
+ return gen_gvec_ool_arg_zzz(s, fn, a, 0);
118
}
165
}
119
166
120
static void pmintenclr_write(CPUARMState *env, const ARMCPRegInfo *ri,
167
static bool trans_SMULH_zzz(DisasContext *s, arg_rrr_esz *a)
121
@@ -XXX,XX +XXX,XX @@ static void pmintenclr_write(CPUARMState *env, const ARMCPRegInfo *ri,
168
@@ -XXX,XX +XXX,XX @@ static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
122
{
169
if (!dc_isar_feature(aa64_sve2_aes, s)) {
123
value &= pmu_counter_mask(env);
170
return false;
124
env->cp15.c9_pminten &= ~value;
171
}
125
+ pmu_update_irq(env);
172
- return gen_gvec_ool_zzz(s, gen_helper_crypto_aese,
173
- a->rd, a->rn, a->rm, decrypt);
174
+ return gen_gvec_ool_arg_zzz(s, gen_helper_crypto_aese, a, decrypt);
126
}
175
}
127
176
128
static void vbar_write(CPUARMState *env, const ARMCPRegInfo *ri,
177
static bool trans_AESE(DisasContext *s, arg_rrr_esz *a)
129
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
178
@@ -XXX,XX +XXX,XX @@ static bool do_sm4(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
130
.fieldoffset = offsetof(CPUARMState, cp15.c9_pmcnten),
179
if (!dc_isar_feature(aa64_sve2_sm4, s)) {
131
.writefn = pmcntenclr_write },
180
return false;
132
{ .name = "PMOVSR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 3,
181
}
133
- .access = PL0_RW,
182
- return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
134
+ .access = PL0_RW, .type = ARM_CP_IO,
183
+ return gen_gvec_ool_arg_zzz(s, fn, a, 0);
135
.fieldoffset = offsetoflow32(CPUARMState, cp15.c9_pmovsr),
184
}
136
.accessfn = pmreg_access,
185
137
.writefn = pmovsr_write,
186
static bool trans_SM4E(DisasContext *s, arg_rrr_esz *a)
138
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
139
{ .name = "PMOVSCLR_EL0", .state = ARM_CP_STATE_AA64,
140
.opc0 = 3, .opc1 = 3, .crn = 9, .crm = 12, .opc2 = 3,
141
.access = PL0_RW, .accessfn = pmreg_access,
142
- .type = ARM_CP_ALIAS,
143
+ .type = ARM_CP_ALIAS | ARM_CP_IO,
144
.fieldoffset = offsetof(CPUARMState, cp15.c9_pmovsr),
145
.writefn = pmovsr_write,
146
.raw_writefn = raw_write },
147
{ .name = "PMSWINC", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 4,
148
- .access = PL0_W, .accessfn = pmreg_access_swinc, .type = ARM_CP_NO_RAW,
149
+ .access = PL0_W, .accessfn = pmreg_access_swinc,
150
+ .type = ARM_CP_NO_RAW | ARM_CP_IO,
151
.writefn = pmswinc_write },
152
{ .name = "PMSWINC_EL0", .state = ARM_CP_STATE_AA64,
153
.opc0 = 3, .opc1 = 3, .crn = 9, .crm = 12, .opc2 = 4,
154
- .access = PL0_W, .accessfn = pmreg_access_swinc, .type = ARM_CP_NO_RAW,
155
+ .access = PL0_W, .accessfn = pmreg_access_swinc,
156
+ .type = ARM_CP_NO_RAW | ARM_CP_IO,
157
.writefn = pmswinc_write },
158
{ .name = "PMSELR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 5,
159
.access = PL0_RW, .type = ARM_CP_ALIAS,
160
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo pmovsset_cp_reginfo[] = {
161
/* PMOVSSET is not implemented in v7 before v7ve */
162
{ .name = "PMOVSSET", .cp = 15, .opc1 = 0, .crn = 9, .crm = 14, .opc2 = 3,
163
.access = PL0_RW, .accessfn = pmreg_access,
164
- .type = ARM_CP_ALIAS,
165
+ .type = ARM_CP_ALIAS | ARM_CP_IO,
166
.fieldoffset = offsetoflow32(CPUARMState, cp15.c9_pmovsr),
167
.writefn = pmovsset_write,
168
.raw_writefn = raw_write },
169
{ .name = "PMOVSSET_EL0", .state = ARM_CP_STATE_AA64,
170
.opc0 = 3, .opc1 = 3, .crn = 9, .crm = 14, .opc2 = 3,
171
.access = PL0_RW, .accessfn = pmreg_access,
172
- .type = ARM_CP_ALIAS,
173
+ .type = ARM_CP_ALIAS | ARM_CP_IO,
174
.fieldoffset = offsetof(CPUARMState, cp15.c9_pmovsr),
175
.writefn = pmovsset_write,
176
.raw_writefn = raw_write },
177
--
187
--
178
2.20.1
188
2.25.1
179
180
diff view generated by jsdifflib
1
The SSE-200 has two Message Handling Units (MHUs), which sit behind
1
From: Richard Henderson <richard.henderson@linaro.org>
2
the APB PPC0. Wire up some unimplemented-device stubs for these,
2
3
since we don't yet implement a real model of this device.
3
Convert SVE translation functions using
4
4
gen_gvec_ool_arg_zzz to TRANS_FEAT.
5
6
Remove trivial wrappers do_aese, do_sm4.
7
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20220527181907.189259-7-richard.henderson@linaro.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20190121185118.18550-16-peter.maydell@linaro.org
8
---
12
---
9
include/hw/arm/armsse.h | 3 +++
13
target/arm/translate-sve.c | 165 ++++++++++---------------------------
10
hw/arm/armsse.c | 41 +++++++++++++++++++++++++++++++++++++++++
14
1 file changed, 45 insertions(+), 120 deletions(-)
11
2 files changed, 44 insertions(+)
15
12
16
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
14
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/arm/armsse.h
18
--- a/target/arm/translate-sve.c
16
+++ b/include/hw/arm/armsse.h
19
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zzi(DisasContext *s, arg_rri_esz *a)
18
#include "hw/watchdog/cmsdk-apb-watchdog.h"
21
}
19
#include "hw/misc/iotkit-sysctl.h"
22
20
#include "hw/misc/iotkit-sysinfo.h"
23
#define DO_ZZW(NAME, name) \
21
+#include "hw/misc/unimp.h"
24
-static bool trans_##NAME##_zzw(DisasContext *s, arg_rrr_esz *a) \
22
#include "hw/or-irq.h"
25
-{ \
23
#include "hw/core/split-irq.h"
26
- static gen_helper_gvec_3 * const fns[4] = { \
24
#include "hw/cpu/cluster.h"
27
+ static gen_helper_gvec_3 * const name##_zzw_fns[4] = { \
25
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
28
gen_helper_sve_##name##_zzw_b, gen_helper_sve_##name##_zzw_h, \
26
IoTKitSysCtl sysctl;
29
gen_helper_sve_##name##_zzw_s, NULL \
27
IoTKitSysCtl sysinfo;
30
}; \
28
31
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0); \
29
+ UnimplementedDeviceState mhu[2];
32
-}
30
+
33
+ TRANS_FEAT(NAME, aa64_sve, gen_gvec_ool_arg_zzz, \
31
/*
34
+ name##_zzw_fns[a->esz], a, 0)
32
* 'container' holds all devices seen by all CPUs.
35
33
* 'cpu_container[i]' is the view that CPU i has: this has the
36
-DO_ZZW(ASR, asr)
34
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
37
-DO_ZZW(LSR, lsr)
35
index XXXXXXX..XXXXXXX 100644
38
-DO_ZZW(LSL, lsl)
36
--- a/hw/arm/armsse.c
39
+DO_ZZW(ASR_zzw, asr)
37
+++ b/hw/arm/armsse.c
40
+DO_ZZW(LSR_zzw, lsr)
38
@@ -XXX,XX +XXX,XX @@ struct ARMSSEInfo {
41
+DO_ZZW(LSL_zzw, lsl)
39
int num_cpus;
42
40
uint32_t sys_version;
43
#undef DO_ZZW
41
SysConfigFormat sys_config_format;
44
42
+ bool has_mhus;
45
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2 * const fexpa_fns[4] = {
46
TRANS_FEAT(FEXPA, aa64_sve, gen_gvec_ool_zz,
47
fexpa_fns[a->esz], a->rd, a->rn, 0)
48
49
-static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
50
-{
51
- static gen_helper_gvec_3 * const fns[4] = {
52
- NULL,
53
- gen_helper_sve_ftssel_h,
54
- gen_helper_sve_ftssel_s,
55
- gen_helper_sve_ftssel_d,
56
- };
57
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
58
-}
59
+static gen_helper_gvec_3 * const ftssel_fns[4] = {
60
+ NULL, gen_helper_sve_ftssel_h,
61
+ gen_helper_sve_ftssel_s, gen_helper_sve_ftssel_d,
62
+};
63
+TRANS_FEAT(FTSSEL, aa64_sve, gen_gvec_ool_arg_zzz, ftssel_fns[a->esz], a, 0)
64
65
/*
66
*** SVE Predicate Logical Operations Group
67
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2 * const rev_fns[4] = {
43
};
68
};
44
69
TRANS_FEAT(REV_v, aa64_sve, gen_gvec_ool_zz, rev_fns[a->esz], a->rd, a->rn, 0)
45
static const ARMSSEInfo armsse_variants[] = {
70
46
@@ -XXX,XX +XXX,XX @@ static const ARMSSEInfo armsse_variants[] = {
71
-static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
47
.num_cpus = 1,
72
-{
48
.sys_version = 0x41743,
73
- static gen_helper_gvec_3 * const fns[4] = {
49
.sys_config_format = IoTKitFormat,
74
- gen_helper_sve_tbl_b, gen_helper_sve_tbl_h,
50
+ .has_mhus = false,
75
- gen_helper_sve_tbl_s, gen_helper_sve_tbl_d
51
},
76
- };
77
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
78
-}
79
+static gen_helper_gvec_3 * const sve_tbl_fns[4] = {
80
+ gen_helper_sve_tbl_b, gen_helper_sve_tbl_h,
81
+ gen_helper_sve_tbl_s, gen_helper_sve_tbl_d
82
+};
83
+TRANS_FEAT(TBL, aa64_sve, gen_gvec_ool_arg_zzz, sve_tbl_fns[a->esz], a, 0)
84
85
static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
86
{
87
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
88
return true;
89
}
90
91
-static bool trans_TBX(DisasContext *s, arg_rrr_esz *a)
92
-{
93
- static gen_helper_gvec_3 * const fns[4] = {
94
- gen_helper_sve2_tbx_b, gen_helper_sve2_tbx_h,
95
- gen_helper_sve2_tbx_s, gen_helper_sve2_tbx_d
96
- };
97
-
98
- if (!dc_isar_feature(aa64_sve2, s)) {
99
- return false;
100
- }
101
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
102
-}
103
+static gen_helper_gvec_3 * const tbx_fns[4] = {
104
+ gen_helper_sve2_tbx_b, gen_helper_sve2_tbx_h,
105
+ gen_helper_sve2_tbx_s, gen_helper_sve2_tbx_d
106
+};
107
+TRANS_FEAT(TBX, aa64_sve2, gen_gvec_ool_arg_zzz, tbx_fns[a->esz], a, 0)
108
109
static bool trans_UNPK(DisasContext *s, arg_UNPK *a)
110
{
111
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const uzp_fns[4] = {
112
gen_helper_sve_uzp_s, gen_helper_sve_uzp_d,
52
};
113
};
53
114
54
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
115
-static bool trans_UZP1_z(DisasContext *s, arg_rrr_esz *a)
55
sizeof(s->sysctl), TYPE_IOTKIT_SYSCTL);
116
-{
56
sysbus_init_child_obj(obj, "armsse-sysinfo", &s->sysinfo,
117
- return gen_gvec_ool_arg_zzz(s, uzp_fns[a->esz], a, 0);
57
sizeof(s->sysinfo), TYPE_IOTKIT_SYSINFO);
118
-}
58
+ if (info->has_mhus) {
119
+TRANS_FEAT(UZP1_z, aa64_sve, gen_gvec_ool_arg_zzz,
59
+ sysbus_init_child_obj(obj, "mhu0", &s->mhu[0], sizeof(s->mhu[0]),
120
+ uzp_fns[a->esz], a, 0)
60
+ TYPE_UNIMPLEMENTED_DEVICE);
121
+TRANS_FEAT(UZP2_z, aa64_sve, gen_gvec_ool_arg_zzz,
61
+ sysbus_init_child_obj(obj, "mhu1", &s->mhu[1], sizeof(s->mhu[1]),
122
+ uzp_fns[a->esz], a, 1 << a->esz)
62
+ TYPE_UNIMPLEMENTED_DEVICE);
123
63
+ }
124
-static bool trans_UZP2_z(DisasContext *s, arg_rrr_esz *a)
64
object_initialize_child(obj, "nmi-orgate", &s->nmi_orgate,
125
-{
65
sizeof(s->nmi_orgate), TYPE_OR_IRQ,
126
- return gen_gvec_ool_arg_zzz(s, uzp_fns[a->esz], a, 1 << a->esz);
66
&error_abort, NULL);
127
-}
67
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
128
-
68
* 0x40000000: timer0
129
-static bool trans_UZP1_q(DisasContext *s, arg_rrr_esz *a)
69
* 0x40001000: timer1
130
-{
70
* 0x40002000: dual timer
131
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
71
+ * 0x40003000: MHU0 (SSE-200 only)
132
- return false;
72
+ * 0x40004000: MHU1 (SSE-200 only)
133
- }
73
* We must configure and realize each downstream device and connect
134
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_uzp_q, a, 0);
74
* it to the appropriate PPC port; then we can realize the PPC and
135
-}
75
* map its upstream ends to the right place in the container.
136
-
76
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
137
-static bool trans_UZP2_q(DisasContext *s, arg_rrr_esz *a)
77
return;
138
-{
78
}
139
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
79
140
- return false;
80
+ if (info->has_mhus) {
141
- }
81
+ for (i = 0; i < ARRAY_SIZE(s->mhu); i++) {
142
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_uzp_q, a, 16);
82
+ char *name = g_strdup_printf("MHU%d", i);
143
-}
83
+ char *port = g_strdup_printf("port[%d]", i + 3);
144
+TRANS_FEAT(UZP1_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
84
+
145
+ gen_helper_sve2_uzp_q, a, 0)
85
+ qdev_prop_set_string(DEVICE(&s->mhu[i]), "name", name);
146
+TRANS_FEAT(UZP2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
86
+ qdev_prop_set_uint64(DEVICE(&s->mhu[i]), "size", 0x1000);
147
+ gen_helper_sve2_uzp_q, a, 16)
87
+ object_property_set_bool(OBJECT(&s->mhu[i]), true,
148
88
+ "realized", &err);
149
static gen_helper_gvec_3 * const trn_fns[4] = {
89
+ if (err) {
150
gen_helper_sve_trn_b, gen_helper_sve_trn_h,
90
+ error_propagate(errp, err);
151
gen_helper_sve_trn_s, gen_helper_sve_trn_d,
91
+ return;
152
};
92
+ }
153
93
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->mhu[i]), 0);
154
-static bool trans_TRN1_z(DisasContext *s, arg_rrr_esz *a)
94
+ object_property_set_link(OBJECT(&s->apb_ppc0), OBJECT(mr),
155
-{
95
+ port, &err);
156
- return gen_gvec_ool_arg_zzz(s, trn_fns[a->esz], a, 0);
96
+ if (err) {
157
-}
97
+ error_propagate(errp, err);
158
+TRANS_FEAT(TRN1_z, aa64_sve, gen_gvec_ool_arg_zzz,
98
+ return;
159
+ trn_fns[a->esz], a, 0)
99
+ }
160
+TRANS_FEAT(TRN2_z, aa64_sve, gen_gvec_ool_arg_zzz,
100
+ g_free(name);
161
+ trn_fns[a->esz], a, 1 << a->esz)
101
+ g_free(port);
162
102
+ }
163
-static bool trans_TRN2_z(DisasContext *s, arg_rrr_esz *a)
103
+ }
164
-{
104
+
165
- return gen_gvec_ool_arg_zzz(s, trn_fns[a->esz], a, 1 << a->esz);
105
object_property_set_bool(OBJECT(&s->apb_ppc0), true, "realized", &err);
166
-}
106
if (err) {
167
-
107
error_propagate(errp, err);
168
-static bool trans_TRN1_q(DisasContext *s, arg_rrr_esz *a)
108
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
169
-{
109
memory_region_add_subregion(&s->container, 0x40001000, mr);
170
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
110
mr = sysbus_mmio_get_region(sbd_apb_ppc0, 2);
171
- return false;
111
memory_region_add_subregion(&s->container, 0x40002000, mr);
172
- }
112
+ if (info->has_mhus) {
173
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_trn_q, a, 0);
113
+ mr = sysbus_mmio_get_region(sbd_apb_ppc0, 3);
174
-}
114
+ memory_region_add_subregion(&s->container, 0x40003000, mr);
175
-
115
+ mr = sysbus_mmio_get_region(sbd_apb_ppc0, 4);
176
-static bool trans_TRN2_q(DisasContext *s, arg_rrr_esz *a)
116
+ memory_region_add_subregion(&s->container, 0x40004000, mr);
177
-{
117
+ }
178
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
118
for (i = 0; i < IOTS_APB_PPC0_NUM_PORTS; i++) {
179
- return false;
119
qdev_connect_gpio_out_named(dev_secctl, "apb_ppc0_nonsec", i,
180
- }
120
qdev_get_gpio_in_named(dev_apb_ppc0,
181
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_trn_q, a, 16);
182
-}
183
+TRANS_FEAT(TRN1_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
184
+ gen_helper_sve2_trn_q, a, 0)
185
+TRANS_FEAT(TRN2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
186
+ gen_helper_sve2_trn_q, a, 16)
187
188
/*
189
*** SVE Permute Vector - Predicated Group
190
@@ -XXX,XX +XXX,XX @@ static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
191
TRANS_FEAT(AESMC, aa64_sve2_aes, gen_gvec_ool_zz,
192
gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt)
193
194
-static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
195
-{
196
- if (!dc_isar_feature(aa64_sve2_aes, s)) {
197
- return false;
198
- }
199
- return gen_gvec_ool_arg_zzz(s, gen_helper_crypto_aese, a, decrypt);
200
-}
201
+TRANS_FEAT(AESE, aa64_sve2_aes, gen_gvec_ool_arg_zzz,
202
+ gen_helper_crypto_aese, a, false)
203
+TRANS_FEAT(AESD, aa64_sve2_aes, gen_gvec_ool_arg_zzz,
204
+ gen_helper_crypto_aese, a, true)
205
206
-static bool trans_AESE(DisasContext *s, arg_rrr_esz *a)
207
-{
208
- return do_aese(s, a, false);
209
-}
210
-
211
-static bool trans_AESD(DisasContext *s, arg_rrr_esz *a)
212
-{
213
- return do_aese(s, a, true);
214
-}
215
-
216
-static bool do_sm4(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
217
-{
218
- if (!dc_isar_feature(aa64_sve2_sm4, s)) {
219
- return false;
220
- }
221
- return gen_gvec_ool_arg_zzz(s, fn, a, 0);
222
-}
223
-
224
-static bool trans_SM4E(DisasContext *s, arg_rrr_esz *a)
225
-{
226
- return do_sm4(s, a, gen_helper_crypto_sm4e);
227
-}
228
-
229
-static bool trans_SM4EKEY(DisasContext *s, arg_rrr_esz *a)
230
-{
231
- return do_sm4(s, a, gen_helper_crypto_sm4ekey);
232
-}
233
+TRANS_FEAT(SM4E, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
234
+ gen_helper_crypto_sm4e, a, 0)
235
+TRANS_FEAT(SM4EKEY, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
236
+ gen_helper_crypto_sm4ekey, a, 0)
237
238
static bool trans_RAX1(DisasContext *s, arg_rrr_esz *a)
239
{
121
--
240
--
122
2.20.1
241
2.25.1
123
124
diff view generated by jsdifflib
1
The Arm SSE-200 Subsystem for Embedded is a revised and
1
From: Richard Henderson <richard.henderson@linaro.org>
2
extended version of the older IoTKit SoC. Prepare for
3
adding a model of it by refactoring the IoTKit code into
4
an abstract base class which contains the functionality,
5
driven by a class data block specific to each subclass.
6
(This is the same approach used by the existing bcm283x
7
SoC family implementation.)
8
2
3
Convert SVE translation functions using do_sve2_zzz_ool
4
to use TRANS_FEAT and gen_gvec_ool_arg_zzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-8-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20190121185118.18550-6-peter.maydell@linaro.org
13
---
10
---
14
include/hw/arm/iotkit.h | 22 +++++++++++++++++-----
11
target/arm/translate-sve.c | 88 ++++++++++++++------------------------
15
hw/arm/iotkit.c | 34 +++++++++++++++++++++++++++++-----
12
1 file changed, 31 insertions(+), 57 deletions(-)
16
2 files changed, 46 insertions(+), 10 deletions(-)
17
13
18
diff --git a/include/hw/arm/iotkit.h b/include/hw/arm/iotkit.h
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/arm/iotkit.h
16
--- a/target/arm/translate-sve.c
21
+++ b/include/hw/arm/iotkit.h
17
+++ b/target/arm/translate-sve.c
22
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
23
#include "hw/or-irq.h"
19
return true;
24
#include "hw/core/split-irq.h"
20
}
25
21
26
-#define TYPE_ARMSSE "iotkit"
22
-static bool do_sve2_zzz_ool(DisasContext *s, arg_rrr_esz *a,
27
+#define TYPE_ARMSSE "arm-sse"
23
- gen_helper_gvec_3 *fn)
28
#define ARMSSE(obj) OBJECT_CHECK(ARMSSE, (obj), TYPE_ARMSSE)
24
-{
25
- if (!dc_isar_feature(aa64_sve2, s)) {
26
- return false;
27
- }
28
- return gen_gvec_ool_arg_zzz(s, fn, a, 0);
29
-}
30
+static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
31
+ gen_helper_gvec_smulh_b, gen_helper_gvec_smulh_h,
32
+ gen_helper_gvec_smulh_s, gen_helper_gvec_smulh_d,
33
+};
34
+TRANS_FEAT(SMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
35
+ smulh_zzz_fns[a->esz], a, 0)
36
37
-static bool trans_SMULH_zzz(DisasContext *s, arg_rrr_esz *a)
38
-{
39
- static gen_helper_gvec_3 * const fns[4] = {
40
- gen_helper_gvec_smulh_b, gen_helper_gvec_smulh_h,
41
- gen_helper_gvec_smulh_s, gen_helper_gvec_smulh_d,
42
- };
43
- return do_sve2_zzz_ool(s, a, fns[a->esz]);
44
-}
45
+static gen_helper_gvec_3 * const umulh_zzz_fns[4] = {
46
+ gen_helper_gvec_umulh_b, gen_helper_gvec_umulh_h,
47
+ gen_helper_gvec_umulh_s, gen_helper_gvec_umulh_d,
48
+};
49
+TRANS_FEAT(UMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
50
+ umulh_zzz_fns[a->esz], a, 0)
51
52
-static bool trans_UMULH_zzz(DisasContext *s, arg_rrr_esz *a)
53
-{
54
- static gen_helper_gvec_3 * const fns[4] = {
55
- gen_helper_gvec_umulh_b, gen_helper_gvec_umulh_h,
56
- gen_helper_gvec_umulh_s, gen_helper_gvec_umulh_d,
57
- };
58
- return do_sve2_zzz_ool(s, a, fns[a->esz]);
59
-}
60
+TRANS_FEAT(PMUL_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
61
+ gen_helper_gvec_pmul_b, a, 0)
62
63
-static bool trans_PMUL_zzz(DisasContext *s, arg_rrr_esz *a)
64
-{
65
- return do_sve2_zzz_ool(s, a, gen_helper_gvec_pmul_b);
66
-}
67
+static gen_helper_gvec_3 * const sqdmulh_zzz_fns[4] = {
68
+ gen_helper_sve2_sqdmulh_b, gen_helper_sve2_sqdmulh_h,
69
+ gen_helper_sve2_sqdmulh_s, gen_helper_sve2_sqdmulh_d,
70
+};
71
+TRANS_FEAT(SQDMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
72
+ sqdmulh_zzz_fns[a->esz], a, 0)
73
74
-static bool trans_SQDMULH_zzz(DisasContext *s, arg_rrr_esz *a)
75
-{
76
- static gen_helper_gvec_3 * const fns[4] = {
77
- gen_helper_sve2_sqdmulh_b, gen_helper_sve2_sqdmulh_h,
78
- gen_helper_sve2_sqdmulh_s, gen_helper_sve2_sqdmulh_d,
79
- };
80
- return do_sve2_zzz_ool(s, a, fns[a->esz]);
81
-}
82
-
83
-static bool trans_SQRDMULH_zzz(DisasContext *s, arg_rrr_esz *a)
84
-{
85
- static gen_helper_gvec_3 * const fns[4] = {
86
- gen_helper_sve2_sqrdmulh_b, gen_helper_sve2_sqrdmulh_h,
87
- gen_helper_sve2_sqrdmulh_s, gen_helper_sve2_sqrdmulh_d,
88
- };
89
- return do_sve2_zzz_ool(s, a, fns[a->esz]);
90
-}
91
+static gen_helper_gvec_3 * const sqrdmulh_zzz_fns[4] = {
92
+ gen_helper_sve2_sqrdmulh_b, gen_helper_sve2_sqrdmulh_h,
93
+ gen_helper_sve2_sqrdmulh_s, gen_helper_sve2_sqrdmulh_d,
94
+};
95
+TRANS_FEAT(SQRDMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
96
+ sqrdmulh_zzz_fns[a->esz], a, 0)
29
97
30
/*
98
/*
31
- * For the moment TYPE_IOTKIT is a synonym for TYPE_ARMSSE (and the
99
* SVE2 Integer - Predicated
32
- * latter's underlying name is left as "iotkit"); in a later
100
@@ -XXX,XX +XXX,XX @@ static bool trans_UQRSHRNT(DisasContext *s, arg_rri_esz *a)
33
- * commit it will become a subclass of TYPE_ARMSSE.
34
+ * These type names are for specific IoTKit subsystems; other than
35
+ * instantiating them, code using these devices should always handle
36
+ * them via the ARMSSE base class, so they have no IOTKIT() etc macros.
37
*/
38
-#define TYPE_IOTKIT TYPE_ARMSSE
39
+#define TYPE_IOTKIT "iotkit"
40
41
/* We have an IRQ splitter and an OR gate input for each external PPC
42
* and the 2 internal PPCs
43
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
44
uint32_t mainclk_frq;
45
} ARMSSE;
46
47
+typedef struct ARMSSEInfo ARMSSEInfo;
48
+
49
+typedef struct ARMSSEClass {
50
+ DeviceClass parent_class;
51
+ const ARMSSEInfo *info;
52
+} ARMSSEClass;
53
+
54
+#define ARMSSE_CLASS(klass) \
55
+ OBJECT_CLASS_CHECK(ARMSSEClass, (klass), TYPE_ARMSSE)
56
+#define ARMSSE_GET_CLASS(obj) \
57
+ OBJECT_GET_CLASS(ARMSSEClass, (obj), TYPE_ARMSSE)
58
+
59
#endif
60
diff --git a/hw/arm/iotkit.c b/hw/arm/iotkit.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/hw/arm/iotkit.c
63
+++ b/hw/arm/iotkit.c
64
@@ -XXX,XX +XXX,XX @@
65
#include "hw/arm/iotkit.h"
66
#include "hw/arm/arm.h"
67
68
+struct ARMSSEInfo {
69
+ const char *name;
70
+};
71
+
72
+static const ARMSSEInfo armsse_variants[] = {
73
+ {
74
+ .name = TYPE_IOTKIT,
75
+ },
76
+};
77
+
78
/* Clock frequency in HZ of the 32KHz "slow clock" */
79
#define S32KCLK (32 * 1000)
80
81
@@ -XXX,XX +XXX,XX @@ static void iotkit_class_init(ObjectClass *klass, void *data)
82
{
83
DeviceClass *dc = DEVICE_CLASS(klass);
84
IDAUInterfaceClass *iic = IDAU_INTERFACE_CLASS(klass);
85
+ ARMSSEClass *asc = ARMSSE_CLASS(klass);
86
87
dc->realize = iotkit_realize;
88
dc->vmsd = &iotkit_vmstate;
89
dc->props = iotkit_properties;
90
dc->reset = iotkit_reset;
91
iic->check = iotkit_idau_check;
92
+ asc->info = data;
93
}
101
}
94
102
95
-static const TypeInfo iotkit_info = {
103
#define DO_SVE2_ZZZ_NARROW(NAME, name) \
96
+static const TypeInfo armsse_info = {
104
-static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
97
.name = TYPE_ARMSSE,
105
-{ \
98
.parent = TYPE_SYS_BUS_DEVICE,
106
- static gen_helper_gvec_3 * const fns[4] = { \
99
.instance_size = sizeof(ARMSSE),
107
+ static gen_helper_gvec_3 * const name##_fns[4] = { \
100
.instance_init = iotkit_init,
108
NULL, gen_helper_sve2_##name##_h, \
101
- .class_init = iotkit_class_init,
109
gen_helper_sve2_##name##_s, gen_helper_sve2_##name##_d, \
102
+ .abstract = true,
110
}; \
103
.interfaces = (InterfaceInfo[]) {
111
- return do_sve2_zzz_ool(s, a, fns[a->esz]); \
104
{ TYPE_IDAU_INTERFACE },
112
-}
105
{ }
113
+ TRANS_FEAT(NAME, aa64_sve2, gen_gvec_ool_arg_zzz, \
106
}
114
+ name##_fns[a->esz], a, 0)
107
};
115
108
116
DO_SVE2_ZZZ_NARROW(ADDHNB, addhnb)
109
-static void iotkit_register_types(void)
117
DO_SVE2_ZZZ_NARROW(ADDHNT, addhnt)
110
+static void armsse_register_types(void)
118
@@ -XXX,XX +XXX,XX @@ static bool trans_HISTCNT(DisasContext *s, arg_rprr_esz *a)
111
{
119
return do_sve2_zpzz_ool(s, a, fns[a->esz - 2]);
112
- type_register_static(&iotkit_info);
113
+ int i;
114
+
115
+ type_register_static(&armsse_info);
116
+
117
+ for (i = 0; i < ARRAY_SIZE(armsse_variants); i++) {
118
+ TypeInfo ti = {
119
+ .name = armsse_variants[i].name,
120
+ .parent = TYPE_ARMSSE,
121
+ .class_init = iotkit_class_init,
122
+ .class_data = (void *)&armsse_variants[i],
123
+ };
124
+ type_register(&ti);
125
+ }
126
}
120
}
127
121
128
-type_init(iotkit_register_types);
122
-static bool trans_HISTSEG(DisasContext *s, arg_rrr_esz *a)
129
+type_init(armsse_register_types);
123
-{
124
- if (a->esz != 0) {
125
- return false;
126
- }
127
- return do_sve2_zzz_ool(s, a, gen_helper_sve2_histseg);
128
-}
129
+TRANS_FEAT(HISTSEG, aa64_sve2, gen_gvec_ool_arg_zzz,
130
+ a->esz == 0 ? gen_helper_sve2_histseg : NULL, a, 0)
131
132
static bool do_sve2_zpzz_fp(DisasContext *s, arg_rprr_esz *a,
133
gen_helper_gvec_4_ptr *fn)
130
--
134
--
131
2.20.1
135
2.25.1
132
133
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-9-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 102 ++++++++++++++-----------------------
9
1 file changed, 38 insertions(+), 64 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
16
}
17
18
/* Invoke an out-of-line helper on 4 Zregs. */
19
-static void gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
20
+static bool gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
21
int rd, int rn, int rm, int ra, int data)
22
{
23
- unsigned vsz = vec_full_reg_size(s);
24
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
25
- vec_full_reg_offset(s, rn),
26
- vec_full_reg_offset(s, rm),
27
- vec_full_reg_offset(s, ra),
28
- vsz, vsz, data, fn);
29
+ if (fn == NULL) {
30
+ return false;
31
+ }
32
+ if (sve_access_check(s)) {
33
+ unsigned vsz = vec_full_reg_size(s);
34
+ tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
35
+ vec_full_reg_offset(s, rn),
36
+ vec_full_reg_offset(s, rm),
37
+ vec_full_reg_offset(s, ra),
38
+ vsz, vsz, data, fn);
39
+ }
40
+ return true;
41
}
42
43
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
44
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
45
if (!dc_isar_feature(aa64_sve2, s)) {
46
return false;
47
}
48
- if (sve_access_check(s)) {
49
- gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
50
- (a->rn + 1) % 32, a->rm, 0);
51
- }
52
- return true;
53
+ return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
54
+ (a->rn + 1) % 32, a->rm, 0);
55
}
56
57
static gen_helper_gvec_3 * const tbx_fns[4] = {
58
@@ -XXX,XX +XXX,XX @@ static bool trans_DOT_zzzz(DisasContext *s, arg_DOT_zzzz *a)
59
{ gen_helper_gvec_sdot_b, gen_helper_gvec_sdot_h },
60
{ gen_helper_gvec_udot_b, gen_helper_gvec_udot_h }
61
};
62
-
63
- if (sve_access_check(s)) {
64
- gen_gvec_ool_zzzz(s, fns[a->u][a->sz], a->rd, a->rn, a->rm, a->ra, 0);
65
- }
66
- return true;
67
+ return gen_gvec_ool_zzzz(s, fns[a->u][a->sz],
68
+ a->rd, a->rn, a->rm, a->ra, 0);
69
}
70
71
/*
72
@@ -XXX,XX +XXX,XX @@ static bool trans_DOT_zzzz(DisasContext *s, arg_DOT_zzzz *a)
73
static bool do_zzxz_ool(DisasContext *s, arg_rrxr_esz *a,
74
gen_helper_gvec_4 *fn)
75
{
76
- if (fn == NULL) {
77
- return false;
78
- }
79
- if (sve_access_check(s)) {
80
- gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
81
- }
82
- return true;
83
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
84
}
85
86
#define DO_RRXR(NAME, FUNC) \
87
@@ -XXX,XX +XXX,XX @@ static bool trans_SQCADD_rot270(DisasContext *s, arg_rrr_esz *a)
88
static bool do_sve2_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
89
gen_helper_gvec_4 *fn, int data)
90
{
91
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
92
+ if (!dc_isar_feature(aa64_sve2, s)) {
93
return false;
94
}
95
- if (sve_access_check(s)) {
96
- gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
97
- }
98
- return true;
99
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
100
}
101
102
static bool do_abal(DisasContext *s, arg_rrrr_esz *a, bool uns, bool sel)
103
@@ -XXX,XX +XXX,XX @@ static bool trans_CMLA_zzzz(DisasContext *s, arg_CMLA_zzzz *a)
104
if (!dc_isar_feature(aa64_sve2, s)) {
105
return false;
106
}
107
- if (sve_access_check(s)) {
108
- gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot);
109
- }
110
- return true;
111
+ return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
112
+ a->rm, a->ra, a->rot);
113
}
114
115
static bool trans_CDOT_zzzz(DisasContext *s, arg_CMLA_zzzz *a)
116
{
117
- if (!dc_isar_feature(aa64_sve2, s) || a->esz < MO_32) {
118
+ static gen_helper_gvec_4 * const fns[] = {
119
+ NULL, NULL, gen_helper_sve2_cdot_zzzz_s, gen_helper_sve2_cdot_zzzz_d
120
+ };
121
+
122
+ if (!dc_isar_feature(aa64_sve2, s)) {
123
return false;
124
}
125
- if (sve_access_check(s)) {
126
- gen_helper_gvec_4 *fn = (a->esz == MO_32
127
- ? gen_helper_sve2_cdot_zzzz_s
128
- : gen_helper_sve2_cdot_zzzz_d);
129
- gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->rot);
130
- }
131
- return true;
132
+ return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
133
+ a->rm, a->ra, a->rot);
134
}
135
136
static bool trans_SQRDCMLAH_zzzz(DisasContext *s, arg_SQRDCMLAH_zzzz *a)
137
@@ -XXX,XX +XXX,XX @@ static bool trans_SQRDCMLAH_zzzz(DisasContext *s, arg_SQRDCMLAH_zzzz *a)
138
if (!dc_isar_feature(aa64_sve2, s)) {
139
return false;
140
}
141
- if (sve_access_check(s)) {
142
- gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot);
143
- }
144
- return true;
145
+ return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
146
+ a->rm, a->ra, a->rot);
147
}
148
149
static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
150
@@ -XXX,XX +XXX,XX @@ static bool do_i8mm_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
151
if (!dc_isar_feature(aa64_sve_i8mm, s)) {
152
return false;
153
}
154
- if (sve_access_check(s)) {
155
- gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
156
- }
157
- return true;
158
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
159
}
160
161
static bool trans_SMMLA(DisasContext *s, arg_rrrr_esz *a)
162
@@ -XXX,XX +XXX,XX @@ static bool trans_BFDOT_zzzz(DisasContext *s, arg_rrrr_esz *a)
163
if (!dc_isar_feature(aa64_sve_bf16, s)) {
164
return false;
165
}
166
- if (sve_access_check(s)) {
167
- gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot,
168
- a->rd, a->rn, a->rm, a->ra, 0);
169
- }
170
- return true;
171
+ return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot,
172
+ a->rd, a->rn, a->rm, a->ra, 0);
173
}
174
175
static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
176
@@ -XXX,XX +XXX,XX @@ static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
177
if (!dc_isar_feature(aa64_sve_bf16, s)) {
178
return false;
179
}
180
- if (sve_access_check(s)) {
181
- gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot_idx,
182
- a->rd, a->rn, a->rm, a->ra, a->index);
183
- }
184
- return true;
185
+ return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot_idx,
186
+ a->rd, a->rn, a->rm, a->ra, a->index);
187
}
188
189
static bool trans_BFMMLA(DisasContext *s, arg_rrrr_esz *a)
190
@@ -XXX,XX +XXX,XX @@ static bool trans_BFMMLA(DisasContext *s, arg_rrrr_esz *a)
191
if (!dc_isar_feature(aa64_sve_bf16, s)) {
192
return false;
193
}
194
- if (sve_access_check(s)) {
195
- gen_gvec_ool_zzzz(s, gen_helper_gvec_bfmmla,
196
- a->rd, a->rn, a->rm, a->ra, 0);
197
- }
198
- return true;
199
+ return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfmmla,
200
+ a->rd, a->rn, a->rm, a->ra, 0);
201
}
202
203
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
204
--
205
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions directly using
4
gen_gvec_ool_zzzz to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-10-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 89 +++++++++++++-------------------------
12
1 file changed, 29 insertions(+), 60 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const sve_tbl_fns[4] = {
19
};
20
TRANS_FEAT(TBL, aa64_sve, gen_gvec_ool_arg_zzz, sve_tbl_fns[a->esz], a, 0)
21
22
-static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
23
-{
24
- static gen_helper_gvec_4 * const fns[4] = {
25
- gen_helper_sve2_tbl_b, gen_helper_sve2_tbl_h,
26
- gen_helper_sve2_tbl_s, gen_helper_sve2_tbl_d
27
- };
28
-
29
- if (!dc_isar_feature(aa64_sve2, s)) {
30
- return false;
31
- }
32
- return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
33
- (a->rn + 1) % 32, a->rm, 0);
34
-}
35
+static gen_helper_gvec_4 * const sve2_tbl_fns[4] = {
36
+ gen_helper_sve2_tbl_b, gen_helper_sve2_tbl_h,
37
+ gen_helper_sve2_tbl_s, gen_helper_sve2_tbl_d
38
+};
39
+TRANS_FEAT(TBL_sve2, aa64_sve2, gen_gvec_ool_zzzz, sve2_tbl_fns[a->esz],
40
+ a->rd, a->rn, (a->rn + 1) % 32, a->rm, 0)
41
42
static gen_helper_gvec_3 * const tbx_fns[4] = {
43
gen_helper_sve2_tbx_b, gen_helper_sve2_tbx_h,
44
@@ -XXX,XX +XXX,XX @@ DO_ZZI(UMIN, umin)
45
46
#undef DO_ZZI
47
48
-static bool trans_DOT_zzzz(DisasContext *s, arg_DOT_zzzz *a)
49
-{
50
- static gen_helper_gvec_4 * const fns[2][2] = {
51
- { gen_helper_gvec_sdot_b, gen_helper_gvec_sdot_h },
52
- { gen_helper_gvec_udot_b, gen_helper_gvec_udot_h }
53
- };
54
- return gen_gvec_ool_zzzz(s, fns[a->u][a->sz],
55
- a->rd, a->rn, a->rm, a->ra, 0);
56
-}
57
+static gen_helper_gvec_4 * const dot_fns[2][2] = {
58
+ { gen_helper_gvec_sdot_b, gen_helper_gvec_sdot_h },
59
+ { gen_helper_gvec_udot_b, gen_helper_gvec_udot_h }
60
+};
61
+TRANS_FEAT(DOT_zzzz, aa64_sve, gen_gvec_ool_zzzz,
62
+ dot_fns[a->u][a->sz], a->rd, a->rn, a->rm, a->ra, 0)
63
64
/*
65
* SVE Multiply - Indexed
66
@@ -XXX,XX +XXX,XX @@ static bool trans_UMLSLT_zzzw(DisasContext *s, arg_rrrr_esz *a)
67
return do_umlsl_zzzw(s, a, true);
68
}
69
70
-static bool trans_CMLA_zzzz(DisasContext *s, arg_CMLA_zzzz *a)
71
-{
72
- static gen_helper_gvec_4 * const fns[] = {
73
- gen_helper_sve2_cmla_zzzz_b, gen_helper_sve2_cmla_zzzz_h,
74
- gen_helper_sve2_cmla_zzzz_s, gen_helper_sve2_cmla_zzzz_d,
75
- };
76
+static gen_helper_gvec_4 * const cmla_fns[] = {
77
+ gen_helper_sve2_cmla_zzzz_b, gen_helper_sve2_cmla_zzzz_h,
78
+ gen_helper_sve2_cmla_zzzz_s, gen_helper_sve2_cmla_zzzz_d,
79
+};
80
+TRANS_FEAT(CMLA_zzzz, aa64_sve2, gen_gvec_ool_zzzz,
81
+ cmla_fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot)
82
83
- if (!dc_isar_feature(aa64_sve2, s)) {
84
- return false;
85
- }
86
- return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
87
- a->rm, a->ra, a->rot);
88
-}
89
+static gen_helper_gvec_4 * const cdot_fns[] = {
90
+ NULL, NULL, gen_helper_sve2_cdot_zzzz_s, gen_helper_sve2_cdot_zzzz_d
91
+};
92
+TRANS_FEAT(CDOT_zzzz, aa64_sve2, gen_gvec_ool_zzzz,
93
+ cdot_fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot)
94
95
-static bool trans_CDOT_zzzz(DisasContext *s, arg_CMLA_zzzz *a)
96
-{
97
- static gen_helper_gvec_4 * const fns[] = {
98
- NULL, NULL, gen_helper_sve2_cdot_zzzz_s, gen_helper_sve2_cdot_zzzz_d
99
- };
100
-
101
- if (!dc_isar_feature(aa64_sve2, s)) {
102
- return false;
103
- }
104
- return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
105
- a->rm, a->ra, a->rot);
106
-}
107
-
108
-static bool trans_SQRDCMLAH_zzzz(DisasContext *s, arg_SQRDCMLAH_zzzz *a)
109
-{
110
- static gen_helper_gvec_4 * const fns[] = {
111
- gen_helper_sve2_sqrdcmlah_zzzz_b, gen_helper_sve2_sqrdcmlah_zzzz_h,
112
- gen_helper_sve2_sqrdcmlah_zzzz_s, gen_helper_sve2_sqrdcmlah_zzzz_d,
113
- };
114
-
115
- if (!dc_isar_feature(aa64_sve2, s)) {
116
- return false;
117
- }
118
- return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
119
- a->rm, a->ra, a->rot);
120
-}
121
+static gen_helper_gvec_4 * const sqrdcmlah_fns[] = {
122
+ gen_helper_sve2_sqrdcmlah_zzzz_b, gen_helper_sve2_sqrdcmlah_zzzz_h,
123
+ gen_helper_sve2_sqrdcmlah_zzzz_s, gen_helper_sve2_sqrdcmlah_zzzz_d,
124
+};
125
+TRANS_FEAT(SQRDCMLAH_zzzz, aa64_sve2, gen_gvec_ool_zzzz,
126
+ sqrdcmlah_fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot)
127
128
static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
129
{
130
--
131
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Use gen_gvec_ool_arg_zzzz instead of gen_gvec_ool_zzzz
4
when the arguments come from arg_rrrr_esz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-11-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 16 ++++++++++------
12
1 file changed, 10 insertions(+), 6 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
19
return true;
20
}
21
22
+static bool gen_gvec_ool_arg_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
23
+ arg_rrrr_esz *a, int data)
24
+{
25
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
26
+}
27
+
28
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
29
static void gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
30
int rd, int rn, int pg, int data)
31
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
32
if (!dc_isar_feature(aa64_sve2, s)) {
33
return false;
34
}
35
- return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
36
+ return gen_gvec_ool_arg_zzzz(s, fn, a, data);
37
}
38
39
static bool do_abal(DisasContext *s, arg_rrrr_esz *a, bool uns, bool sel)
40
@@ -XXX,XX +XXX,XX @@ static bool do_i8mm_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
41
if (!dc_isar_feature(aa64_sve_i8mm, s)) {
42
return false;
43
}
44
- return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
45
+ return gen_gvec_ool_arg_zzzz(s, fn, a, data);
46
}
47
48
static bool trans_SMMLA(DisasContext *s, arg_rrrr_esz *a)
49
@@ -XXX,XX +XXX,XX @@ static bool trans_BFDOT_zzzz(DisasContext *s, arg_rrrr_esz *a)
50
if (!dc_isar_feature(aa64_sve_bf16, s)) {
51
return false;
52
}
53
- return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot,
54
- a->rd, a->rn, a->rm, a->ra, 0);
55
+ return gen_gvec_ool_arg_zzzz(s, gen_helper_gvec_bfdot, a, 0);
56
}
57
58
static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
59
@@ -XXX,XX +XXX,XX @@ static bool trans_BFMMLA(DisasContext *s, arg_rrrr_esz *a)
60
if (!dc_isar_feature(aa64_sve_bf16, s)) {
61
return false;
62
}
63
- return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfmmla,
64
- a->rd, a->rn, a->rm, a->ra, 0);
65
+ return gen_gvec_ool_arg_zzzz(s, gen_helper_gvec_bfmmla, a, 0);
66
}
67
68
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
69
--
70
2.25.1
diff view generated by jsdifflib
1
Create a cluster object to hold each CPU in the SSE. They are
1
From: Richard Henderson <richard.henderson@linaro.org>
2
logically distinct and may be configured differently (for instance
3
one may not have an FPU where the other does).
4
2
3
Convert SVE translation functions using do_sve2_zzzz_ool
4
to use TRANS_FEAT and gen_gvec_ool_arg_zzzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-12-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20190121185118.18550-14-peter.maydell@linaro.org
8
---
10
---
9
include/hw/arm/armsse.h | 2 ++
11
target/arm/translate-sve.c | 263 +++++++++++--------------------------
10
hw/arm/armsse.c | 31 ++++++++++++++++++++++++++++---
12
1 file changed, 79 insertions(+), 184 deletions(-)
11
2 files changed, 30 insertions(+), 3 deletions(-)
12
13
13
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/arm/armsse.h
16
--- a/target/arm/translate-sve.c
16
+++ b/include/hw/arm/armsse.h
17
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ static bool trans_SQCADD_rot270(DisasContext *s, arg_rrr_esz *a)
18
#include "hw/misc/iotkit-sysinfo.h"
19
return do_cadd(s, a, true, true);
19
#include "hw/or-irq.h"
20
}
20
#include "hw/core/split-irq.h"
21
21
+#include "hw/cpu/cluster.h"
22
-static bool do_sve2_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
22
23
- gen_helper_gvec_4 *fn, int data)
23
#define TYPE_ARMSSE "arm-sse"
24
-{
24
#define ARMSSE(obj) OBJECT_CHECK(ARMSSE, (obj), TYPE_ARMSSE)
25
- if (!dc_isar_feature(aa64_sve2, s)) {
25
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
26
- return false;
26
27
- }
27
/*< public >*/
28
- return gen_gvec_ool_arg_zzzz(s, fn, a, data);
28
ARMv7MState armv7m[SSE_MAX_CPUS];
29
-}
29
+ CPUClusterState cluster[SSE_MAX_CPUS];
30
+static gen_helper_gvec_4 * const sabal_fns[4] = {
30
IoTKitSecCtl secctl;
31
+ NULL, gen_helper_sve2_sabal_h,
31
TZPPC apb_ppc0;
32
+ gen_helper_sve2_sabal_s, gen_helper_sve2_sabal_d,
32
TZPPC apb_ppc1;
33
+};
33
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
34
+TRANS_FEAT(SABALB, aa64_sve2, gen_gvec_ool_arg_zzzz, sabal_fns[a->esz], a, 0)
34
index XXXXXXX..XXXXXXX 100644
35
+TRANS_FEAT(SABALT, aa64_sve2, gen_gvec_ool_arg_zzzz, sabal_fns[a->esz], a, 1)
35
--- a/hw/arm/armsse.c
36
36
+++ b/hw/arm/armsse.c
37
-static bool do_abal(DisasContext *s, arg_rrrr_esz *a, bool uns, bool sel)
37
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
38
-{
38
memory_region_init(&s->container, obj, "armsse-container", UINT64_MAX);
39
- static gen_helper_gvec_4 * const fns[2][4] = {
39
40
- { NULL, gen_helper_sve2_sabal_h,
40
for (i = 0; i < info->num_cpus; i++) {
41
- gen_helper_sve2_sabal_s, gen_helper_sve2_sabal_d },
41
- char *name = g_strdup_printf("armv7m%d", i);
42
- { NULL, gen_helper_sve2_uabal_h,
42
- sysbus_init_child_obj(obj, name, &s->armv7m[i], sizeof(s->armv7m),
43
- gen_helper_sve2_uabal_s, gen_helper_sve2_uabal_d },
43
- TYPE_ARMV7M);
44
- };
44
+ /*
45
- return do_sve2_zzzz_ool(s, a, fns[uns][a->esz], sel);
45
+ * We put each CPU in its own cluster as they are logically
46
-}
46
+ * distinct and may be configured differently.
47
-
47
+ */
48
-static bool trans_SABALB(DisasContext *s, arg_rrrr_esz *a)
48
+ char *name;
49
-{
49
+
50
- return do_abal(s, a, false, false);
50
+ name = g_strdup_printf("cluster%d", i);
51
-}
51
+ object_initialize_child(obj, name, &s->cluster[i],
52
-
52
+ sizeof(s->cluster[i]), TYPE_CPU_CLUSTER,
53
-static bool trans_SABALT(DisasContext *s, arg_rrrr_esz *a)
53
+ &error_abort, NULL);
54
-{
54
+ qdev_prop_set_uint32(DEVICE(&s->cluster[i]), "cluster-id", i);
55
- return do_abal(s, a, false, true);
55
+ g_free(name);
56
-}
56
+
57
-
57
+ name = g_strdup_printf("armv7m%d", i);
58
-static bool trans_UABALB(DisasContext *s, arg_rrrr_esz *a)
58
+ sysbus_init_child_obj(OBJECT(&s->cluster[i]), name,
59
-{
59
+ &s->armv7m[i], sizeof(s->armv7m), TYPE_ARMV7M);
60
- return do_abal(s, a, true, false);
60
qdev_prop_set_string(DEVICE(&s->armv7m[i]), "cpu-type",
61
-}
61
ARM_CPU_TYPE_NAME("cortex-m33"));
62
-
62
g_free(name);
63
-static bool trans_UABALT(DisasContext *s, arg_rrrr_esz *a)
63
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
64
-{
64
error_propagate(errp, err);
65
- return do_abal(s, a, true, true);
65
return;
66
-}
66
}
67
+static gen_helper_gvec_4 * const uabal_fns[4] = {
67
+ /*
68
+ NULL, gen_helper_sve2_uabal_h,
68
+ * The cluster must be realized after the armv7m container, as
69
+ gen_helper_sve2_uabal_s, gen_helper_sve2_uabal_d,
69
+ * the container's CPU object is only created on realize, and the
70
+};
70
+ * CPU must exist and have been parented into the cluster before
71
+TRANS_FEAT(UABALB, aa64_sve2, gen_gvec_ool_arg_zzzz, uabal_fns[a->esz], a, 0)
71
+ * the cluster is realized.
72
+TRANS_FEAT(UABALT, aa64_sve2, gen_gvec_ool_arg_zzzz, uabal_fns[a->esz], a, 1)
72
+ */
73
73
+ object_property_set_bool(OBJECT(&s->cluster[i]),
74
static bool do_adcl(DisasContext *s, arg_rrrr_esz *a, bool sel)
74
+ true, "realized", &err);
75
{
75
+ if (err) {
76
@@ -XXX,XX +XXX,XX @@ static bool do_adcl(DisasContext *s, arg_rrrr_esz *a, bool sel)
76
+ error_propagate(errp, err);
77
* Note that in this case the ESZ field encodes both size and sign.
77
+ return;
78
* Split out 'subtract' into bit 1 of the data field for the helper.
78
+ }
79
*/
79
80
- return do_sve2_zzzz_ool(s, a, fns[a->esz & 1], (a->esz & 2) | sel);
80
/* Connect EXP_IRQ/EXP_CPUn_IRQ GPIOs to the NVIC's lines 32 and up */
81
+ return gen_gvec_ool_arg_zzzz(s, fns[a->esz & 1], a, (a->esz & 2) | sel);
81
s->exp_irqs[i] = g_new(qemu_irq, s->exp_numirq);
82
}
83
84
-static bool trans_ADCLB(DisasContext *s, arg_rrrr_esz *a)
85
-{
86
- return do_adcl(s, a, false);
87
-}
88
-
89
-static bool trans_ADCLT(DisasContext *s, arg_rrrr_esz *a)
90
-{
91
- return do_adcl(s, a, true);
92
-}
93
+TRANS_FEAT(ADCLB, aa64_sve2, do_adcl, a, false)
94
+TRANS_FEAT(ADCLT, aa64_sve2, do_adcl, a, true)
95
96
static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
97
{
98
@@ -XXX,XX +XXX,XX @@ static bool trans_FMMLA(DisasContext *s, arg_rrrr_esz *a)
99
return true;
100
}
101
102
-static bool do_sqdmlal_zzzw(DisasContext *s, arg_rrrr_esz *a,
103
- bool sel1, bool sel2)
104
-{
105
- static gen_helper_gvec_4 * const fns[] = {
106
- NULL, gen_helper_sve2_sqdmlal_zzzw_h,
107
- gen_helper_sve2_sqdmlal_zzzw_s, gen_helper_sve2_sqdmlal_zzzw_d,
108
- };
109
- return do_sve2_zzzz_ool(s, a, fns[a->esz], (sel2 << 1) | sel1);
110
-}
111
+static gen_helper_gvec_4 * const sqdmlal_zzzw_fns[] = {
112
+ NULL, gen_helper_sve2_sqdmlal_zzzw_h,
113
+ gen_helper_sve2_sqdmlal_zzzw_s, gen_helper_sve2_sqdmlal_zzzw_d,
114
+};
115
+TRANS_FEAT(SQDMLALB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
116
+ sqdmlal_zzzw_fns[a->esz], a, 0)
117
+TRANS_FEAT(SQDMLALT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
118
+ sqdmlal_zzzw_fns[a->esz], a, 3)
119
+TRANS_FEAT(SQDMLALBT, aa64_sve2, gen_gvec_ool_arg_zzzz,
120
+ sqdmlal_zzzw_fns[a->esz], a, 2)
121
122
-static bool do_sqdmlsl_zzzw(DisasContext *s, arg_rrrr_esz *a,
123
- bool sel1, bool sel2)
124
-{
125
- static gen_helper_gvec_4 * const fns[] = {
126
- NULL, gen_helper_sve2_sqdmlsl_zzzw_h,
127
- gen_helper_sve2_sqdmlsl_zzzw_s, gen_helper_sve2_sqdmlsl_zzzw_d,
128
- };
129
- return do_sve2_zzzz_ool(s, a, fns[a->esz], (sel2 << 1) | sel1);
130
-}
131
+static gen_helper_gvec_4 * const sqdmlsl_zzzw_fns[] = {
132
+ NULL, gen_helper_sve2_sqdmlsl_zzzw_h,
133
+ gen_helper_sve2_sqdmlsl_zzzw_s, gen_helper_sve2_sqdmlsl_zzzw_d,
134
+};
135
+TRANS_FEAT(SQDMLSLB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
136
+ sqdmlsl_zzzw_fns[a->esz], a, 0)
137
+TRANS_FEAT(SQDMLSLT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
138
+ sqdmlsl_zzzw_fns[a->esz], a, 3)
139
+TRANS_FEAT(SQDMLSLBT, aa64_sve2, gen_gvec_ool_arg_zzzz,
140
+ sqdmlsl_zzzw_fns[a->esz], a, 2)
141
142
-static bool trans_SQDMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
143
-{
144
- return do_sqdmlal_zzzw(s, a, false, false);
145
-}
146
+static gen_helper_gvec_4 * const sqrdmlah_fns[] = {
147
+ gen_helper_sve2_sqrdmlah_b, gen_helper_sve2_sqrdmlah_h,
148
+ gen_helper_sve2_sqrdmlah_s, gen_helper_sve2_sqrdmlah_d,
149
+};
150
+TRANS_FEAT(SQRDMLAH_zzzz, aa64_sve2, gen_gvec_ool_arg_zzzz,
151
+ sqrdmlah_fns[a->esz], a, 0)
152
153
-static bool trans_SQDMLALT_zzzw(DisasContext *s, arg_rrrr_esz *a)
154
-{
155
- return do_sqdmlal_zzzw(s, a, true, true);
156
-}
157
+static gen_helper_gvec_4 * const sqrdmlsh_fns[] = {
158
+ gen_helper_sve2_sqrdmlsh_b, gen_helper_sve2_sqrdmlsh_h,
159
+ gen_helper_sve2_sqrdmlsh_s, gen_helper_sve2_sqrdmlsh_d,
160
+};
161
+TRANS_FEAT(SQRDMLSH_zzzz, aa64_sve2, gen_gvec_ool_arg_zzzz,
162
+ sqrdmlsh_fns[a->esz], a, 0)
163
164
-static bool trans_SQDMLALBT(DisasContext *s, arg_rrrr_esz *a)
165
-{
166
- return do_sqdmlal_zzzw(s, a, false, true);
167
-}
168
+static gen_helper_gvec_4 * const smlal_zzzw_fns[] = {
169
+ NULL, gen_helper_sve2_smlal_zzzw_h,
170
+ gen_helper_sve2_smlal_zzzw_s, gen_helper_sve2_smlal_zzzw_d,
171
+};
172
+TRANS_FEAT(SMLALB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
173
+ smlal_zzzw_fns[a->esz], a, 0)
174
+TRANS_FEAT(SMLALT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
175
+ smlal_zzzw_fns[a->esz], a, 1)
176
177
-static bool trans_SQDMLSLB_zzzw(DisasContext *s, arg_rrrr_esz *a)
178
-{
179
- return do_sqdmlsl_zzzw(s, a, false, false);
180
-}
181
+static gen_helper_gvec_4 * const umlal_zzzw_fns[] = {
182
+ NULL, gen_helper_sve2_umlal_zzzw_h,
183
+ gen_helper_sve2_umlal_zzzw_s, gen_helper_sve2_umlal_zzzw_d,
184
+};
185
+TRANS_FEAT(UMLALB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
186
+ umlal_zzzw_fns[a->esz], a, 0)
187
+TRANS_FEAT(UMLALT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
188
+ umlal_zzzw_fns[a->esz], a, 1)
189
190
-static bool trans_SQDMLSLT_zzzw(DisasContext *s, arg_rrrr_esz *a)
191
-{
192
- return do_sqdmlsl_zzzw(s, a, true, true);
193
-}
194
+static gen_helper_gvec_4 * const smlsl_zzzw_fns[] = {
195
+ NULL, gen_helper_sve2_smlsl_zzzw_h,
196
+ gen_helper_sve2_smlsl_zzzw_s, gen_helper_sve2_smlsl_zzzw_d,
197
+};
198
+TRANS_FEAT(SMLSLB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
199
+ smlsl_zzzw_fns[a->esz], a, 0)
200
+TRANS_FEAT(SMLSLT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
201
+ smlsl_zzzw_fns[a->esz], a, 1)
202
203
-static bool trans_SQDMLSLBT(DisasContext *s, arg_rrrr_esz *a)
204
-{
205
- return do_sqdmlsl_zzzw(s, a, false, true);
206
-}
207
-
208
-static bool trans_SQRDMLAH_zzzz(DisasContext *s, arg_rrrr_esz *a)
209
-{
210
- static gen_helper_gvec_4 * const fns[] = {
211
- gen_helper_sve2_sqrdmlah_b, gen_helper_sve2_sqrdmlah_h,
212
- gen_helper_sve2_sqrdmlah_s, gen_helper_sve2_sqrdmlah_d,
213
- };
214
- return do_sve2_zzzz_ool(s, a, fns[a->esz], 0);
215
-}
216
-
217
-static bool trans_SQRDMLSH_zzzz(DisasContext *s, arg_rrrr_esz *a)
218
-{
219
- static gen_helper_gvec_4 * const fns[] = {
220
- gen_helper_sve2_sqrdmlsh_b, gen_helper_sve2_sqrdmlsh_h,
221
- gen_helper_sve2_sqrdmlsh_s, gen_helper_sve2_sqrdmlsh_d,
222
- };
223
- return do_sve2_zzzz_ool(s, a, fns[a->esz], 0);
224
-}
225
-
226
-static bool do_smlal_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
227
-{
228
- static gen_helper_gvec_4 * const fns[] = {
229
- NULL, gen_helper_sve2_smlal_zzzw_h,
230
- gen_helper_sve2_smlal_zzzw_s, gen_helper_sve2_smlal_zzzw_d,
231
- };
232
- return do_sve2_zzzz_ool(s, a, fns[a->esz], sel);
233
-}
234
-
235
-static bool trans_SMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
236
-{
237
- return do_smlal_zzzw(s, a, false);
238
-}
239
-
240
-static bool trans_SMLALT_zzzw(DisasContext *s, arg_rrrr_esz *a)
241
-{
242
- return do_smlal_zzzw(s, a, true);
243
-}
244
-
245
-static bool do_umlal_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
246
-{
247
- static gen_helper_gvec_4 * const fns[] = {
248
- NULL, gen_helper_sve2_umlal_zzzw_h,
249
- gen_helper_sve2_umlal_zzzw_s, gen_helper_sve2_umlal_zzzw_d,
250
- };
251
- return do_sve2_zzzz_ool(s, a, fns[a->esz], sel);
252
-}
253
-
254
-static bool trans_UMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
255
-{
256
- return do_umlal_zzzw(s, a, false);
257
-}
258
-
259
-static bool trans_UMLALT_zzzw(DisasContext *s, arg_rrrr_esz *a)
260
-{
261
- return do_umlal_zzzw(s, a, true);
262
-}
263
-
264
-static bool do_smlsl_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
265
-{
266
- static gen_helper_gvec_4 * const fns[] = {
267
- NULL, gen_helper_sve2_smlsl_zzzw_h,
268
- gen_helper_sve2_smlsl_zzzw_s, gen_helper_sve2_smlsl_zzzw_d,
269
- };
270
- return do_sve2_zzzz_ool(s, a, fns[a->esz], sel);
271
-}
272
-
273
-static bool trans_SMLSLB_zzzw(DisasContext *s, arg_rrrr_esz *a)
274
-{
275
- return do_smlsl_zzzw(s, a, false);
276
-}
277
-
278
-static bool trans_SMLSLT_zzzw(DisasContext *s, arg_rrrr_esz *a)
279
-{
280
- return do_smlsl_zzzw(s, a, true);
281
-}
282
-
283
-static bool do_umlsl_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
284
-{
285
- static gen_helper_gvec_4 * const fns[] = {
286
- NULL, gen_helper_sve2_umlsl_zzzw_h,
287
- gen_helper_sve2_umlsl_zzzw_s, gen_helper_sve2_umlsl_zzzw_d,
288
- };
289
- return do_sve2_zzzz_ool(s, a, fns[a->esz], sel);
290
-}
291
-
292
-static bool trans_UMLSLB_zzzw(DisasContext *s, arg_rrrr_esz *a)
293
-{
294
- return do_umlsl_zzzw(s, a, false);
295
-}
296
-
297
-static bool trans_UMLSLT_zzzw(DisasContext *s, arg_rrrr_esz *a)
298
-{
299
- return do_umlsl_zzzw(s, a, true);
300
-}
301
+static gen_helper_gvec_4 * const umlsl_zzzw_fns[] = {
302
+ NULL, gen_helper_sve2_umlsl_zzzw_h,
303
+ gen_helper_sve2_umlsl_zzzw_s, gen_helper_sve2_umlsl_zzzw_d,
304
+};
305
+TRANS_FEAT(UMLSLB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
306
+ umlsl_zzzw_fns[a->esz], a, 0)
307
+TRANS_FEAT(UMLSLT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
308
+ umlsl_zzzw_fns[a->esz], a, 1)
309
310
static gen_helper_gvec_4 * const cmla_fns[] = {
311
gen_helper_sve2_cmla_zzzz_b, gen_helper_sve2_cmla_zzzz_h,
82
--
312
--
83
2.20.1
313
2.25.1
84
85
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions directly using
4
gen_gvec_ool_arg_zzzz to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-13-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 47 ++++++++------------------------------
12
1 file changed, 10 insertions(+), 37 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_FMLSLT_zzxw(DisasContext *s, arg_rrxr_esz *a)
19
return do_FMLAL_zzxw(s, a, true, true);
20
}
21
22
-static bool do_i8mm_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
23
- gen_helper_gvec_4 *fn, int data)
24
-{
25
- if (!dc_isar_feature(aa64_sve_i8mm, s)) {
26
- return false;
27
- }
28
- return gen_gvec_ool_arg_zzzz(s, fn, a, data);
29
-}
30
+TRANS_FEAT(SMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
31
+ gen_helper_gvec_smmla_b, a, 0)
32
+TRANS_FEAT(USMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
33
+ gen_helper_gvec_usmmla_b, a, 0)
34
+TRANS_FEAT(UMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
35
+ gen_helper_gvec_ummla_b, a, 0)
36
37
-static bool trans_SMMLA(DisasContext *s, arg_rrrr_esz *a)
38
-{
39
- return do_i8mm_zzzz_ool(s, a, gen_helper_gvec_smmla_b, 0);
40
-}
41
-
42
-static bool trans_USMMLA(DisasContext *s, arg_rrrr_esz *a)
43
-{
44
- return do_i8mm_zzzz_ool(s, a, gen_helper_gvec_usmmla_b, 0);
45
-}
46
-
47
-static bool trans_UMMLA(DisasContext *s, arg_rrrr_esz *a)
48
-{
49
- return do_i8mm_zzzz_ool(s, a, gen_helper_gvec_ummla_b, 0);
50
-}
51
-
52
-static bool trans_BFDOT_zzzz(DisasContext *s, arg_rrrr_esz *a)
53
-{
54
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
55
- return false;
56
- }
57
- return gen_gvec_ool_arg_zzzz(s, gen_helper_gvec_bfdot, a, 0);
58
-}
59
+TRANS_FEAT(BFDOT_zzzz, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
60
+ gen_helper_gvec_bfdot, a, 0)
61
62
static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
63
{
64
@@ -XXX,XX +XXX,XX @@ static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
65
a->rd, a->rn, a->rm, a->ra, a->index);
66
}
67
68
-static bool trans_BFMMLA(DisasContext *s, arg_rrrr_esz *a)
69
-{
70
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
71
- return false;
72
- }
73
- return gen_gvec_ool_arg_zzzz(s, gen_helper_gvec_bfmmla, a, 0);
74
-}
75
+TRANS_FEAT(BFMMLA, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
76
+ gen_helper_gvec_bfmmla, a, 0)
77
78
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
79
{
80
--
81
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Rename the function to match gen_gvec_ool_arg_zzzz,
4
and move to be adjacent.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-14-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 18 +++++++++---------
12
1 file changed, 9 insertions(+), 9 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
19
return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
20
}
21
22
+static bool gen_gvec_ool_arg_zzxz(DisasContext *s, gen_helper_gvec_4 *fn,
23
+ arg_rrxr_esz *a)
24
+{
25
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
26
+}
27
+
28
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
29
static void gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
30
int rd, int rn, int pg, int data)
31
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(DOT_zzzz, aa64_sve, gen_gvec_ool_zzzz,
32
* SVE Multiply - Indexed
33
*/
34
35
-static bool do_zzxz_ool(DisasContext *s, arg_rrxr_esz *a,
36
- gen_helper_gvec_4 *fn)
37
-{
38
- return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
39
-}
40
-
41
#define DO_RRXR(NAME, FUNC) \
42
static bool NAME(DisasContext *s, arg_rrxr_esz *a) \
43
- { return do_zzxz_ool(s, a, FUNC); }
44
+ { return gen_gvec_ool_arg_zzxz(s, FUNC, a); }
45
46
DO_RRXR(trans_SDOT_zzxw_s, gen_helper_gvec_sdot_idx_b)
47
DO_RRXR(trans_SDOT_zzxw_d, gen_helper_gvec_sdot_idx_h)
48
@@ -XXX,XX +XXX,XX @@ static bool trans_SUDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
49
if (!dc_isar_feature(aa64_sve_i8mm, s)) {
50
return false;
51
}
52
- return do_zzxz_ool(s, a, gen_helper_gvec_sudot_idx_b);
53
+ return gen_gvec_ool_arg_zzxz(s, gen_helper_gvec_sudot_idx_b, a);
54
}
55
56
static bool trans_USDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
57
@@ -XXX,XX +XXX,XX @@ static bool trans_USDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
58
if (!dc_isar_feature(aa64_sve_i8mm, s)) {
59
return false;
60
}
61
- return do_zzxz_ool(s, a, gen_helper_gvec_usdot_idx_b);
62
+ return gen_gvec_ool_arg_zzxz(s, gen_helper_gvec_usdot_idx_b, a);
63
}
64
65
#undef DO_RRXR
66
--
67
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions directly using
4
gen_gvec_ool_arg_zzxz to TRANS_FEAT. Also include
5
BFDOT_zzxz, which was using gen_gvec_ool_zzzz.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-15-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/translate-sve.c | 48 +++++++++++---------------------------
13
1 file changed, 14 insertions(+), 34 deletions(-)
14
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
18
+++ b/target/arm/translate-sve.c
19
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(DOT_zzzz, aa64_sve, gen_gvec_ool_zzzz,
20
* SVE Multiply - Indexed
21
*/
22
23
-#define DO_RRXR(NAME, FUNC) \
24
- static bool NAME(DisasContext *s, arg_rrxr_esz *a) \
25
- { return gen_gvec_ool_arg_zzxz(s, FUNC, a); }
26
+TRANS_FEAT(SDOT_zzxw_s, aa64_sve, gen_gvec_ool_arg_zzxz,
27
+ gen_helper_gvec_sdot_idx_b, a)
28
+TRANS_FEAT(SDOT_zzxw_d, aa64_sve, gen_gvec_ool_arg_zzxz,
29
+ gen_helper_gvec_sdot_idx_h, a)
30
+TRANS_FEAT(UDOT_zzxw_s, aa64_sve, gen_gvec_ool_arg_zzxz,
31
+ gen_helper_gvec_udot_idx_b, a)
32
+TRANS_FEAT(UDOT_zzxw_d, aa64_sve, gen_gvec_ool_arg_zzxz,
33
+ gen_helper_gvec_udot_idx_h, a)
34
35
-DO_RRXR(trans_SDOT_zzxw_s, gen_helper_gvec_sdot_idx_b)
36
-DO_RRXR(trans_SDOT_zzxw_d, gen_helper_gvec_sdot_idx_h)
37
-DO_RRXR(trans_UDOT_zzxw_s, gen_helper_gvec_udot_idx_b)
38
-DO_RRXR(trans_UDOT_zzxw_d, gen_helper_gvec_udot_idx_h)
39
-
40
-static bool trans_SUDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
41
-{
42
- if (!dc_isar_feature(aa64_sve_i8mm, s)) {
43
- return false;
44
- }
45
- return gen_gvec_ool_arg_zzxz(s, gen_helper_gvec_sudot_idx_b, a);
46
-}
47
-
48
-static bool trans_USDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
49
-{
50
- if (!dc_isar_feature(aa64_sve_i8mm, s)) {
51
- return false;
52
- }
53
- return gen_gvec_ool_arg_zzxz(s, gen_helper_gvec_usdot_idx_b, a);
54
-}
55
-
56
-#undef DO_RRXR
57
+TRANS_FEAT(SUDOT_zzxw_s, aa64_sve_i8mm, gen_gvec_ool_arg_zzxz,
58
+ gen_helper_gvec_sudot_idx_b, a)
59
+TRANS_FEAT(USDOT_zzxw_s, aa64_sve_i8mm, gen_gvec_ool_arg_zzxz,
60
+ gen_helper_gvec_usdot_idx_b, a)
61
62
static bool do_sve2_zzz_data(DisasContext *s, int rd, int rn, int rm, int data,
63
gen_helper_gvec_3 *fn)
64
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(UMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
65
66
TRANS_FEAT(BFDOT_zzzz, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
67
gen_helper_gvec_bfdot, a, 0)
68
-
69
-static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
70
-{
71
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
72
- return false;
73
- }
74
- return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot_idx,
75
- a->rd, a->rn, a->rm, a->ra, a->index);
76
-}
77
+TRANS_FEAT(BFDOT_zzxz, aa64_sve_bf16, gen_gvec_ool_arg_zzxz,
78
+ gen_helper_gvec_bfdot_idx, a)
79
80
TRANS_FEAT(BFMMLA, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
81
gen_helper_gvec_bfmmla, a, 0)
82
--
83
2.25.1
diff view generated by jsdifflib
1
Expose "start-powered-off" as a property of the ARMv7M container,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
which we just pass through to the CPU object in the same way that we
3
do for "init-svtor" and "idau". (We want this for the SSE-200, which
4
powers up only the first CPU at reset and leaves the second powered
5
down.)
6
2
7
As with the other CPU properties here, we can't just use alias
3
Convert SVE translation functions using do_sve2_zzz_data
8
properties, because the CPU QOM object is not created until armv7m
4
to use TRANS_FEAT and gen_gvec_ool_zzz.
9
realize time.
10
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-16-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20190121185118.18550-4-peter.maydell@linaro.org
14
---
10
---
15
include/hw/arm/armv7m.h | 1 +
11
target/arm/translate-sve.c | 69 ++++++++++++++------------------------
16
hw/arm/armv7m.c | 10 ++++++++++
12
1 file changed, 25 insertions(+), 44 deletions(-)
17
2 files changed, 11 insertions(+)
18
13
19
diff --git a/include/hw/arm/armv7m.h b/include/hw/arm/armv7m.h
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
20
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/arm/armv7m.h
16
--- a/target/arm/translate-sve.c
22
+++ b/include/hw/arm/armv7m.h
17
+++ b/target/arm/translate-sve.c
23
@@ -XXX,XX +XXX,XX @@ typedef struct ARMv7MState {
18
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SUDOT_zzxw_s, aa64_sve_i8mm, gen_gvec_ool_arg_zzxz,
24
Object *idau;
19
TRANS_FEAT(USDOT_zzxw_s, aa64_sve_i8mm, gen_gvec_ool_arg_zzxz,
25
uint32_t init_svtor;
20
gen_helper_gvec_usdot_idx_b, a)
26
bool enable_bitband;
21
27
+ bool start_powered_off;
22
-static bool do_sve2_zzz_data(DisasContext *s, int rd, int rn, int rm, int data,
28
} ARMv7MState;
23
- gen_helper_gvec_3 *fn)
29
24
-{
30
#endif
25
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
31
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
26
- return false;
32
index XXXXXXX..XXXXXXX 100644
27
- }
33
--- a/hw/arm/armv7m.c
28
- if (sve_access_check(s)) {
34
+++ b/hw/arm/armv7m.c
29
- unsigned vsz = vec_full_reg_size(s);
35
@@ -XXX,XX +XXX,XX @@ static void armv7m_realize(DeviceState *dev, Error **errp)
30
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
36
return;
31
- vec_full_reg_offset(s, rn),
37
}
32
- vec_full_reg_offset(s, rm),
38
}
33
- vsz, vsz, data, fn);
39
+ if (object_property_find(OBJECT(s->cpu), "start-powered-off", NULL)) {
34
- }
40
+ object_property_set_bool(OBJECT(s->cpu), s->start_powered_off,
35
- return true;
41
+ "start-powered-off", &err);
36
-}
42
+ if (err != NULL) {
37
-
43
+ error_propagate(errp, err);
38
#define DO_SVE2_RRX(NAME, FUNC) \
44
+ return;
39
- static bool NAME(DisasContext *s, arg_rrx_esz *a) \
45
+ }
40
- { return do_sve2_zzz_data(s, a->rd, a->rn, a->rm, a->index, FUNC); }
46
+ }
41
+ TRANS_FEAT(NAME, aa64_sve, gen_gvec_ool_zzz, FUNC, \
47
42
+ a->rd, a->rn, a->rm, a->index)
48
/*
43
49
* Tell the CPU where the NVIC is; it will fail realize if it doesn't
44
-DO_SVE2_RRX(trans_MUL_zzx_h, gen_helper_gvec_mul_idx_h)
50
@@ -XXX,XX +XXX,XX @@ static Property armv7m_properties[] = {
45
-DO_SVE2_RRX(trans_MUL_zzx_s, gen_helper_gvec_mul_idx_s)
51
DEFINE_PROP_LINK("idau", ARMv7MState, idau, TYPE_IDAU_INTERFACE, Object *),
46
-DO_SVE2_RRX(trans_MUL_zzx_d, gen_helper_gvec_mul_idx_d)
52
DEFINE_PROP_UINT32("init-svtor", ARMv7MState, init_svtor, 0),
47
+DO_SVE2_RRX(MUL_zzx_h, gen_helper_gvec_mul_idx_h)
53
DEFINE_PROP_BOOL("enable-bitband", ARMv7MState, enable_bitband, false),
48
+DO_SVE2_RRX(MUL_zzx_s, gen_helper_gvec_mul_idx_s)
54
+ DEFINE_PROP_BOOL("start-powered-off", ARMv7MState, start_powered_off,
49
+DO_SVE2_RRX(MUL_zzx_d, gen_helper_gvec_mul_idx_d)
55
+ false),
50
56
DEFINE_PROP_END_OF_LIST(),
51
-DO_SVE2_RRX(trans_SQDMULH_zzx_h, gen_helper_sve2_sqdmulh_idx_h)
57
};
52
-DO_SVE2_RRX(trans_SQDMULH_zzx_s, gen_helper_sve2_sqdmulh_idx_s)
53
-DO_SVE2_RRX(trans_SQDMULH_zzx_d, gen_helper_sve2_sqdmulh_idx_d)
54
+DO_SVE2_RRX(SQDMULH_zzx_h, gen_helper_sve2_sqdmulh_idx_h)
55
+DO_SVE2_RRX(SQDMULH_zzx_s, gen_helper_sve2_sqdmulh_idx_s)
56
+DO_SVE2_RRX(SQDMULH_zzx_d, gen_helper_sve2_sqdmulh_idx_d)
57
58
-DO_SVE2_RRX(trans_SQRDMULH_zzx_h, gen_helper_sve2_sqrdmulh_idx_h)
59
-DO_SVE2_RRX(trans_SQRDMULH_zzx_s, gen_helper_sve2_sqrdmulh_idx_s)
60
-DO_SVE2_RRX(trans_SQRDMULH_zzx_d, gen_helper_sve2_sqrdmulh_idx_d)
61
+DO_SVE2_RRX(SQRDMULH_zzx_h, gen_helper_sve2_sqrdmulh_idx_h)
62
+DO_SVE2_RRX(SQRDMULH_zzx_s, gen_helper_sve2_sqrdmulh_idx_s)
63
+DO_SVE2_RRX(SQRDMULH_zzx_d, gen_helper_sve2_sqrdmulh_idx_d)
64
65
#undef DO_SVE2_RRX
66
67
#define DO_SVE2_RRX_TB(NAME, FUNC, TOP) \
68
- static bool NAME(DisasContext *s, arg_rrx_esz *a) \
69
- { \
70
- return do_sve2_zzz_data(s, a->rd, a->rn, a->rm, \
71
- (a->index << 1) | TOP, FUNC); \
72
- }
73
+ TRANS_FEAT(NAME, aa64_sve, gen_gvec_ool_zzz, FUNC, \
74
+ a->rd, a->rn, a->rm, (a->index << 1) | TOP)
75
76
-DO_SVE2_RRX_TB(trans_SQDMULLB_zzx_s, gen_helper_sve2_sqdmull_idx_s, false)
77
-DO_SVE2_RRX_TB(trans_SQDMULLB_zzx_d, gen_helper_sve2_sqdmull_idx_d, false)
78
-DO_SVE2_RRX_TB(trans_SQDMULLT_zzx_s, gen_helper_sve2_sqdmull_idx_s, true)
79
-DO_SVE2_RRX_TB(trans_SQDMULLT_zzx_d, gen_helper_sve2_sqdmull_idx_d, true)
80
+DO_SVE2_RRX_TB(SQDMULLB_zzx_s, gen_helper_sve2_sqdmull_idx_s, false)
81
+DO_SVE2_RRX_TB(SQDMULLB_zzx_d, gen_helper_sve2_sqdmull_idx_d, false)
82
+DO_SVE2_RRX_TB(SQDMULLT_zzx_s, gen_helper_sve2_sqdmull_idx_s, true)
83
+DO_SVE2_RRX_TB(SQDMULLT_zzx_d, gen_helper_sve2_sqdmull_idx_d, true)
84
85
-DO_SVE2_RRX_TB(trans_SMULLB_zzx_s, gen_helper_sve2_smull_idx_s, false)
86
-DO_SVE2_RRX_TB(trans_SMULLB_zzx_d, gen_helper_sve2_smull_idx_d, false)
87
-DO_SVE2_RRX_TB(trans_SMULLT_zzx_s, gen_helper_sve2_smull_idx_s, true)
88
-DO_SVE2_RRX_TB(trans_SMULLT_zzx_d, gen_helper_sve2_smull_idx_d, true)
89
+DO_SVE2_RRX_TB(SMULLB_zzx_s, gen_helper_sve2_smull_idx_s, false)
90
+DO_SVE2_RRX_TB(SMULLB_zzx_d, gen_helper_sve2_smull_idx_d, false)
91
+DO_SVE2_RRX_TB(SMULLT_zzx_s, gen_helper_sve2_smull_idx_s, true)
92
+DO_SVE2_RRX_TB(SMULLT_zzx_d, gen_helper_sve2_smull_idx_d, true)
93
94
-DO_SVE2_RRX_TB(trans_UMULLB_zzx_s, gen_helper_sve2_umull_idx_s, false)
95
-DO_SVE2_RRX_TB(trans_UMULLB_zzx_d, gen_helper_sve2_umull_idx_d, false)
96
-DO_SVE2_RRX_TB(trans_UMULLT_zzx_s, gen_helper_sve2_umull_idx_s, true)
97
-DO_SVE2_RRX_TB(trans_UMULLT_zzx_d, gen_helper_sve2_umull_idx_d, true)
98
+DO_SVE2_RRX_TB(UMULLB_zzx_s, gen_helper_sve2_umull_idx_s, false)
99
+DO_SVE2_RRX_TB(UMULLB_zzx_d, gen_helper_sve2_umull_idx_d, false)
100
+DO_SVE2_RRX_TB(UMULLT_zzx_s, gen_helper_sve2_umull_idx_s, true)
101
+DO_SVE2_RRX_TB(UMULLT_zzx_d, gen_helper_sve2_umull_idx_d, true)
102
103
#undef DO_SVE2_RRX_TB
58
104
59
--
105
--
60
2.20.1
106
2.25.1
61
62
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions using do_sve2_zzzz_data
4
to use TRANS_FEAT and gen_gvec_ool_{zzzz,zzxz}.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-17-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 106 ++++++++++++++-----------------------
12
1 file changed, 41 insertions(+), 65 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ DO_SVE2_RRX_TB(UMULLT_zzx_d, gen_helper_sve2_umull_idx_d, true)
19
20
#undef DO_SVE2_RRX_TB
21
22
-static bool do_sve2_zzzz_data(DisasContext *s, int rd, int rn, int rm, int ra,
23
- int data, gen_helper_gvec_4 *fn)
24
-{
25
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
26
- return false;
27
- }
28
- if (sve_access_check(s)) {
29
- unsigned vsz = vec_full_reg_size(s);
30
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
31
- vec_full_reg_offset(s, rn),
32
- vec_full_reg_offset(s, rm),
33
- vec_full_reg_offset(s, ra),
34
- vsz, vsz, data, fn);
35
- }
36
- return true;
37
-}
38
-
39
#define DO_SVE2_RRXR(NAME, FUNC) \
40
- static bool NAME(DisasContext *s, arg_rrxr_esz *a) \
41
- { return do_sve2_zzzz_data(s, a->rd, a->rn, a->rm, a->ra, a->index, FUNC); }
42
+ TRANS_FEAT(NAME, aa64_sve2, gen_gvec_ool_arg_zzxz, FUNC, a)
43
44
-DO_SVE2_RRXR(trans_MLA_zzxz_h, gen_helper_gvec_mla_idx_h)
45
-DO_SVE2_RRXR(trans_MLA_zzxz_s, gen_helper_gvec_mla_idx_s)
46
-DO_SVE2_RRXR(trans_MLA_zzxz_d, gen_helper_gvec_mla_idx_d)
47
+DO_SVE2_RRXR(MLA_zzxz_h, gen_helper_gvec_mla_idx_h)
48
+DO_SVE2_RRXR(MLA_zzxz_s, gen_helper_gvec_mla_idx_s)
49
+DO_SVE2_RRXR(MLA_zzxz_d, gen_helper_gvec_mla_idx_d)
50
51
-DO_SVE2_RRXR(trans_MLS_zzxz_h, gen_helper_gvec_mls_idx_h)
52
-DO_SVE2_RRXR(trans_MLS_zzxz_s, gen_helper_gvec_mls_idx_s)
53
-DO_SVE2_RRXR(trans_MLS_zzxz_d, gen_helper_gvec_mls_idx_d)
54
+DO_SVE2_RRXR(MLS_zzxz_h, gen_helper_gvec_mls_idx_h)
55
+DO_SVE2_RRXR(MLS_zzxz_s, gen_helper_gvec_mls_idx_s)
56
+DO_SVE2_RRXR(MLS_zzxz_d, gen_helper_gvec_mls_idx_d)
57
58
-DO_SVE2_RRXR(trans_SQRDMLAH_zzxz_h, gen_helper_sve2_sqrdmlah_idx_h)
59
-DO_SVE2_RRXR(trans_SQRDMLAH_zzxz_s, gen_helper_sve2_sqrdmlah_idx_s)
60
-DO_SVE2_RRXR(trans_SQRDMLAH_zzxz_d, gen_helper_sve2_sqrdmlah_idx_d)
61
+DO_SVE2_RRXR(SQRDMLAH_zzxz_h, gen_helper_sve2_sqrdmlah_idx_h)
62
+DO_SVE2_RRXR(SQRDMLAH_zzxz_s, gen_helper_sve2_sqrdmlah_idx_s)
63
+DO_SVE2_RRXR(SQRDMLAH_zzxz_d, gen_helper_sve2_sqrdmlah_idx_d)
64
65
-DO_SVE2_RRXR(trans_SQRDMLSH_zzxz_h, gen_helper_sve2_sqrdmlsh_idx_h)
66
-DO_SVE2_RRXR(trans_SQRDMLSH_zzxz_s, gen_helper_sve2_sqrdmlsh_idx_s)
67
-DO_SVE2_RRXR(trans_SQRDMLSH_zzxz_d, gen_helper_sve2_sqrdmlsh_idx_d)
68
+DO_SVE2_RRXR(SQRDMLSH_zzxz_h, gen_helper_sve2_sqrdmlsh_idx_h)
69
+DO_SVE2_RRXR(SQRDMLSH_zzxz_s, gen_helper_sve2_sqrdmlsh_idx_s)
70
+DO_SVE2_RRXR(SQRDMLSH_zzxz_d, gen_helper_sve2_sqrdmlsh_idx_d)
71
72
#undef DO_SVE2_RRXR
73
74
#define DO_SVE2_RRXR_TB(NAME, FUNC, TOP) \
75
- static bool NAME(DisasContext *s, arg_rrxr_esz *a) \
76
- { \
77
- return do_sve2_zzzz_data(s, a->rd, a->rn, a->rm, a->rd, \
78
- (a->index << 1) | TOP, FUNC); \
79
- }
80
+ TRANS_FEAT(NAME, aa64_sve2, gen_gvec_ool_zzzz, FUNC, \
81
+ a->rd, a->rn, a->rm, a->ra, (a->index << 1) | TOP)
82
83
-DO_SVE2_RRXR_TB(trans_SQDMLALB_zzxw_s, gen_helper_sve2_sqdmlal_idx_s, false)
84
-DO_SVE2_RRXR_TB(trans_SQDMLALB_zzxw_d, gen_helper_sve2_sqdmlal_idx_d, false)
85
-DO_SVE2_RRXR_TB(trans_SQDMLALT_zzxw_s, gen_helper_sve2_sqdmlal_idx_s, true)
86
-DO_SVE2_RRXR_TB(trans_SQDMLALT_zzxw_d, gen_helper_sve2_sqdmlal_idx_d, true)
87
+DO_SVE2_RRXR_TB(SQDMLALB_zzxw_s, gen_helper_sve2_sqdmlal_idx_s, false)
88
+DO_SVE2_RRXR_TB(SQDMLALB_zzxw_d, gen_helper_sve2_sqdmlal_idx_d, false)
89
+DO_SVE2_RRXR_TB(SQDMLALT_zzxw_s, gen_helper_sve2_sqdmlal_idx_s, true)
90
+DO_SVE2_RRXR_TB(SQDMLALT_zzxw_d, gen_helper_sve2_sqdmlal_idx_d, true)
91
92
-DO_SVE2_RRXR_TB(trans_SQDMLSLB_zzxw_s, gen_helper_sve2_sqdmlsl_idx_s, false)
93
-DO_SVE2_RRXR_TB(trans_SQDMLSLB_zzxw_d, gen_helper_sve2_sqdmlsl_idx_d, false)
94
-DO_SVE2_RRXR_TB(trans_SQDMLSLT_zzxw_s, gen_helper_sve2_sqdmlsl_idx_s, true)
95
-DO_SVE2_RRXR_TB(trans_SQDMLSLT_zzxw_d, gen_helper_sve2_sqdmlsl_idx_d, true)
96
+DO_SVE2_RRXR_TB(SQDMLSLB_zzxw_s, gen_helper_sve2_sqdmlsl_idx_s, false)
97
+DO_SVE2_RRXR_TB(SQDMLSLB_zzxw_d, gen_helper_sve2_sqdmlsl_idx_d, false)
98
+DO_SVE2_RRXR_TB(SQDMLSLT_zzxw_s, gen_helper_sve2_sqdmlsl_idx_s, true)
99
+DO_SVE2_RRXR_TB(SQDMLSLT_zzxw_d, gen_helper_sve2_sqdmlsl_idx_d, true)
100
101
-DO_SVE2_RRXR_TB(trans_SMLALB_zzxw_s, gen_helper_sve2_smlal_idx_s, false)
102
-DO_SVE2_RRXR_TB(trans_SMLALB_zzxw_d, gen_helper_sve2_smlal_idx_d, false)
103
-DO_SVE2_RRXR_TB(trans_SMLALT_zzxw_s, gen_helper_sve2_smlal_idx_s, true)
104
-DO_SVE2_RRXR_TB(trans_SMLALT_zzxw_d, gen_helper_sve2_smlal_idx_d, true)
105
+DO_SVE2_RRXR_TB(SMLALB_zzxw_s, gen_helper_sve2_smlal_idx_s, false)
106
+DO_SVE2_RRXR_TB(SMLALB_zzxw_d, gen_helper_sve2_smlal_idx_d, false)
107
+DO_SVE2_RRXR_TB(SMLALT_zzxw_s, gen_helper_sve2_smlal_idx_s, true)
108
+DO_SVE2_RRXR_TB(SMLALT_zzxw_d, gen_helper_sve2_smlal_idx_d, true)
109
110
-DO_SVE2_RRXR_TB(trans_UMLALB_zzxw_s, gen_helper_sve2_umlal_idx_s, false)
111
-DO_SVE2_RRXR_TB(trans_UMLALB_zzxw_d, gen_helper_sve2_umlal_idx_d, false)
112
-DO_SVE2_RRXR_TB(trans_UMLALT_zzxw_s, gen_helper_sve2_umlal_idx_s, true)
113
-DO_SVE2_RRXR_TB(trans_UMLALT_zzxw_d, gen_helper_sve2_umlal_idx_d, true)
114
+DO_SVE2_RRXR_TB(UMLALB_zzxw_s, gen_helper_sve2_umlal_idx_s, false)
115
+DO_SVE2_RRXR_TB(UMLALB_zzxw_d, gen_helper_sve2_umlal_idx_d, false)
116
+DO_SVE2_RRXR_TB(UMLALT_zzxw_s, gen_helper_sve2_umlal_idx_s, true)
117
+DO_SVE2_RRXR_TB(UMLALT_zzxw_d, gen_helper_sve2_umlal_idx_d, true)
118
119
-DO_SVE2_RRXR_TB(trans_SMLSLB_zzxw_s, gen_helper_sve2_smlsl_idx_s, false)
120
-DO_SVE2_RRXR_TB(trans_SMLSLB_zzxw_d, gen_helper_sve2_smlsl_idx_d, false)
121
-DO_SVE2_RRXR_TB(trans_SMLSLT_zzxw_s, gen_helper_sve2_smlsl_idx_s, true)
122
-DO_SVE2_RRXR_TB(trans_SMLSLT_zzxw_d, gen_helper_sve2_smlsl_idx_d, true)
123
+DO_SVE2_RRXR_TB(SMLSLB_zzxw_s, gen_helper_sve2_smlsl_idx_s, false)
124
+DO_SVE2_RRXR_TB(SMLSLB_zzxw_d, gen_helper_sve2_smlsl_idx_d, false)
125
+DO_SVE2_RRXR_TB(SMLSLT_zzxw_s, gen_helper_sve2_smlsl_idx_s, true)
126
+DO_SVE2_RRXR_TB(SMLSLT_zzxw_d, gen_helper_sve2_smlsl_idx_d, true)
127
128
-DO_SVE2_RRXR_TB(trans_UMLSLB_zzxw_s, gen_helper_sve2_umlsl_idx_s, false)
129
-DO_SVE2_RRXR_TB(trans_UMLSLB_zzxw_d, gen_helper_sve2_umlsl_idx_d, false)
130
-DO_SVE2_RRXR_TB(trans_UMLSLT_zzxw_s, gen_helper_sve2_umlsl_idx_s, true)
131
-DO_SVE2_RRXR_TB(trans_UMLSLT_zzxw_d, gen_helper_sve2_umlsl_idx_d, true)
132
+DO_SVE2_RRXR_TB(UMLSLB_zzxw_s, gen_helper_sve2_umlsl_idx_s, false)
133
+DO_SVE2_RRXR_TB(UMLSLB_zzxw_d, gen_helper_sve2_umlsl_idx_d, false)
134
+DO_SVE2_RRXR_TB(UMLSLT_zzxw_s, gen_helper_sve2_umlsl_idx_s, true)
135
+DO_SVE2_RRXR_TB(UMLSLT_zzxw_d, gen_helper_sve2_umlsl_idx_d, true)
136
137
#undef DO_SVE2_RRXR_TB
138
139
#define DO_SVE2_RRXR_ROT(NAME, FUNC) \
140
- static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
141
- { \
142
- return do_sve2_zzzz_data(s, a->rd, a->rn, a->rm, a->ra, \
143
- (a->index << 2) | a->rot, FUNC); \
144
- }
145
+ TRANS_FEAT(NAME, aa64_sve2, gen_gvec_ool_zzzz, FUNC, \
146
+ a->rd, a->rn, a->rm, a->ra, (a->index << 2) | a->rot)
147
148
DO_SVE2_RRXR_ROT(CMLA_zzxz_h, gen_helper_sve2_cmla_idx_h)
149
DO_SVE2_RRXR_ROT(CMLA_zzxz_s, gen_helper_sve2_cmla_idx_s)
150
--
151
2.25.1
diff view generated by jsdifflib
1
Give each CPU its own container memory region. This is necessary
1
From: Richard Henderson <richard.henderson@linaro.org>
2
for two reasons:
3
* some devices are instantiated one per CPU and the CPU sees only
4
its own device
5
* since a memory region can only be put into one container, we must
6
give each armv7m object a different MemoryRegion as its 'memory'
7
property, or a dual-CPU configuration will assert on realize when
8
the second armv7m object tries to put the MR into a container when
9
it is already in the first armv7m object's container
10
2
3
Convert SVE translation functions using do_sve2_zzw_data
4
to use TRANS_FEAT and gen_gvec_ool_arg_zzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-18-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20190121185118.18550-13-peter.maydell@linaro.org
14
---
10
---
15
include/hw/arm/armsse.h | 10 ++++++++++
11
target/arm/translate-sve.c | 297 ++++++++++++++++++-------------------
16
hw/arm/armsse.c | 22 ++++++++++++++++++++--
12
1 file changed, 145 insertions(+), 152 deletions(-)
17
2 files changed, 30 insertions(+), 2 deletions(-)
18
13
19
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
20
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/arm/armsse.h
16
--- a/target/arm/translate-sve.c
22
+++ b/include/hw/arm/armsse.h
17
+++ b/target/arm/translate-sve.c
23
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
18
@@ -XXX,XX +XXX,XX @@ DO_SVE2_ZPZZ(USQADD, usqadd)
24
IoTKitSysCtl sysctl;
19
* SVE2 Widening Integer Arithmetic
25
IoTKitSysCtl sysinfo;
20
*/
26
21
27
+ /*
22
-static bool do_sve2_zzw_ool(DisasContext *s, arg_rrr_esz *a,
28
+ * 'container' holds all devices seen by all CPUs.
23
- gen_helper_gvec_3 *fn, int data)
29
+ * 'cpu_container[i]' is the view that CPU i has: this has the
24
-{
30
+ * per-CPU devices of that CPU, plus as the background 'container'
25
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
31
+ * (or an alias of it, since we can only use it directly once).
26
- return false;
32
+ * container_alias[i] is the alias of 'container' used by CPU i+1;
27
- }
33
+ * CPU 0 can use 'container' directly.
28
- if (sve_access_check(s)) {
34
+ */
29
- unsigned vsz = vec_full_reg_size(s);
35
MemoryRegion container;
30
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
36
+ MemoryRegion container_alias[SSE_MAX_CPUS - 1];
31
- vec_full_reg_offset(s, a->rn),
37
+ MemoryRegion cpu_container[SSE_MAX_CPUS];
32
- vec_full_reg_offset(s, a->rm),
38
MemoryRegion alias1;
33
- vsz, vsz, data, fn);
39
MemoryRegion alias2;
34
- }
40
MemoryRegion alias3;
35
- return true;
41
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
36
-}
42
index XXXXXXX..XXXXXXX 100644
37
+static gen_helper_gvec_3 * const saddl_fns[4] = {
43
--- a/hw/arm/armsse.c
38
+ NULL, gen_helper_sve2_saddl_h,
44
+++ b/hw/arm/armsse.c
39
+ gen_helper_sve2_saddl_s, gen_helper_sve2_saddl_d,
45
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
40
+};
46
qdev_prop_set_string(DEVICE(&s->armv7m[i]), "cpu-type",
41
+TRANS_FEAT(SADDLB, aa64_sve2, gen_gvec_ool_arg_zzz,
47
ARM_CPU_TYPE_NAME("cortex-m33"));
42
+ saddl_fns[a->esz], a, 0)
48
g_free(name);
43
+TRANS_FEAT(SADDLT, aa64_sve2, gen_gvec_ool_arg_zzz,
49
+ name = g_strdup_printf("arm-sse-cpu-container%d", i);
44
+ saddl_fns[a->esz], a, 3)
50
+ memory_region_init(&s->cpu_container[i], obj, name, UINT64_MAX);
45
+TRANS_FEAT(SADDLBT, aa64_sve2, gen_gvec_ool_arg_zzz,
51
+ g_free(name);
46
+ saddl_fns[a->esz], a, 2)
52
+ if (i > 0) {
47
53
+ name = g_strdup_printf("arm-sse-container-alias%d", i);
48
-#define DO_SVE2_ZZZ_TB(NAME, name, SEL1, SEL2) \
54
+ memory_region_init_alias(&s->container_alias[i - 1], obj,
49
-static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
55
+ name, &s->container, 0, UINT64_MAX);
50
-{ \
56
+ g_free(name);
51
- static gen_helper_gvec_3 * const fns[4] = { \
57
+ }
52
- NULL, gen_helper_sve2_##name##_h, \
53
- gen_helper_sve2_##name##_s, gen_helper_sve2_##name##_d, \
54
- }; \
55
- return do_sve2_zzw_ool(s, a, fns[a->esz], (SEL2 << 1) | SEL1); \
56
-}
57
+static gen_helper_gvec_3 * const ssubl_fns[4] = {
58
+ NULL, gen_helper_sve2_ssubl_h,
59
+ gen_helper_sve2_ssubl_s, gen_helper_sve2_ssubl_d,
60
+};
61
+TRANS_FEAT(SSUBLB, aa64_sve2, gen_gvec_ool_arg_zzz,
62
+ ssubl_fns[a->esz], a, 0)
63
+TRANS_FEAT(SSUBLT, aa64_sve2, gen_gvec_ool_arg_zzz,
64
+ ssubl_fns[a->esz], a, 3)
65
+TRANS_FEAT(SSUBLBT, aa64_sve2, gen_gvec_ool_arg_zzz,
66
+ ssubl_fns[a->esz], a, 2)
67
+TRANS_FEAT(SSUBLTB, aa64_sve2, gen_gvec_ool_arg_zzz,
68
+ ssubl_fns[a->esz], a, 1)
69
70
-DO_SVE2_ZZZ_TB(SADDLB, saddl, false, false)
71
-DO_SVE2_ZZZ_TB(SSUBLB, ssubl, false, false)
72
-DO_SVE2_ZZZ_TB(SABDLB, sabdl, false, false)
73
+static gen_helper_gvec_3 * const sabdl_fns[4] = {
74
+ NULL, gen_helper_sve2_sabdl_h,
75
+ gen_helper_sve2_sabdl_s, gen_helper_sve2_sabdl_d,
76
+};
77
+TRANS_FEAT(SABDLB, aa64_sve2, gen_gvec_ool_arg_zzz,
78
+ sabdl_fns[a->esz], a, 0)
79
+TRANS_FEAT(SABDLT, aa64_sve2, gen_gvec_ool_arg_zzz,
80
+ sabdl_fns[a->esz], a, 3)
81
82
-DO_SVE2_ZZZ_TB(UADDLB, uaddl, false, false)
83
-DO_SVE2_ZZZ_TB(USUBLB, usubl, false, false)
84
-DO_SVE2_ZZZ_TB(UABDLB, uabdl, false, false)
85
+static gen_helper_gvec_3 * const uaddl_fns[4] = {
86
+ NULL, gen_helper_sve2_uaddl_h,
87
+ gen_helper_sve2_uaddl_s, gen_helper_sve2_uaddl_d,
88
+};
89
+TRANS_FEAT(UADDLB, aa64_sve2, gen_gvec_ool_arg_zzz,
90
+ uaddl_fns[a->esz], a, 0)
91
+TRANS_FEAT(UADDLT, aa64_sve2, gen_gvec_ool_arg_zzz,
92
+ uaddl_fns[a->esz], a, 3)
93
94
-DO_SVE2_ZZZ_TB(SADDLT, saddl, true, true)
95
-DO_SVE2_ZZZ_TB(SSUBLT, ssubl, true, true)
96
-DO_SVE2_ZZZ_TB(SABDLT, sabdl, true, true)
97
+static gen_helper_gvec_3 * const usubl_fns[4] = {
98
+ NULL, gen_helper_sve2_usubl_h,
99
+ gen_helper_sve2_usubl_s, gen_helper_sve2_usubl_d,
100
+};
101
+TRANS_FEAT(USUBLB, aa64_sve2, gen_gvec_ool_arg_zzz,
102
+ usubl_fns[a->esz], a, 0)
103
+TRANS_FEAT(USUBLT, aa64_sve2, gen_gvec_ool_arg_zzz,
104
+ usubl_fns[a->esz], a, 3)
105
106
-DO_SVE2_ZZZ_TB(UADDLT, uaddl, true, true)
107
-DO_SVE2_ZZZ_TB(USUBLT, usubl, true, true)
108
-DO_SVE2_ZZZ_TB(UABDLT, uabdl, true, true)
109
+static gen_helper_gvec_3 * const uabdl_fns[4] = {
110
+ NULL, gen_helper_sve2_uabdl_h,
111
+ gen_helper_sve2_uabdl_s, gen_helper_sve2_uabdl_d,
112
+};
113
+TRANS_FEAT(UABDLB, aa64_sve2, gen_gvec_ool_arg_zzz,
114
+ uabdl_fns[a->esz], a, 0)
115
+TRANS_FEAT(UABDLT, aa64_sve2, gen_gvec_ool_arg_zzz,
116
+ uabdl_fns[a->esz], a, 3)
117
118
-DO_SVE2_ZZZ_TB(SADDLBT, saddl, false, true)
119
-DO_SVE2_ZZZ_TB(SSUBLBT, ssubl, false, true)
120
-DO_SVE2_ZZZ_TB(SSUBLTB, ssubl, true, false)
121
+static gen_helper_gvec_3 * const sqdmull_fns[4] = {
122
+ NULL, gen_helper_sve2_sqdmull_zzz_h,
123
+ gen_helper_sve2_sqdmull_zzz_s, gen_helper_sve2_sqdmull_zzz_d,
124
+};
125
+TRANS_FEAT(SQDMULLB_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
126
+ sqdmull_fns[a->esz], a, 0)
127
+TRANS_FEAT(SQDMULLT_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
128
+ sqdmull_fns[a->esz], a, 3)
129
130
-DO_SVE2_ZZZ_TB(SQDMULLB_zzz, sqdmull_zzz, false, false)
131
-DO_SVE2_ZZZ_TB(SQDMULLT_zzz, sqdmull_zzz, true, true)
132
+static gen_helper_gvec_3 * const smull_fns[4] = {
133
+ NULL, gen_helper_sve2_smull_zzz_h,
134
+ gen_helper_sve2_smull_zzz_s, gen_helper_sve2_smull_zzz_d,
135
+};
136
+TRANS_FEAT(SMULLB_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
137
+ smull_fns[a->esz], a, 0)
138
+TRANS_FEAT(SMULLT_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
139
+ smull_fns[a->esz], a, 3)
140
141
-DO_SVE2_ZZZ_TB(SMULLB_zzz, smull_zzz, false, false)
142
-DO_SVE2_ZZZ_TB(SMULLT_zzz, smull_zzz, true, true)
143
+static gen_helper_gvec_3 * const umull_fns[4] = {
144
+ NULL, gen_helper_sve2_umull_zzz_h,
145
+ gen_helper_sve2_umull_zzz_s, gen_helper_sve2_umull_zzz_d,
146
+};
147
+TRANS_FEAT(UMULLB_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
148
+ umull_fns[a->esz], a, 0)
149
+TRANS_FEAT(UMULLT_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
150
+ umull_fns[a->esz], a, 3)
151
152
-DO_SVE2_ZZZ_TB(UMULLB_zzz, umull_zzz, false, false)
153
-DO_SVE2_ZZZ_TB(UMULLT_zzz, umull_zzz, true, true)
154
-
155
-static bool do_eor_tb(DisasContext *s, arg_rrr_esz *a, bool sel1)
156
-{
157
- static gen_helper_gvec_3 * const fns[4] = {
158
- gen_helper_sve2_eoril_b, gen_helper_sve2_eoril_h,
159
- gen_helper_sve2_eoril_s, gen_helper_sve2_eoril_d,
160
- };
161
- return do_sve2_zzw_ool(s, a, fns[a->esz], (!sel1 << 1) | sel1);
162
-}
163
-
164
-static bool trans_EORBT(DisasContext *s, arg_rrr_esz *a)
165
-{
166
- return do_eor_tb(s, a, false);
167
-}
168
-
169
-static bool trans_EORTB(DisasContext *s, arg_rrr_esz *a)
170
-{
171
- return do_eor_tb(s, a, true);
172
-}
173
+static gen_helper_gvec_3 * const eoril_fns[4] = {
174
+ gen_helper_sve2_eoril_b, gen_helper_sve2_eoril_h,
175
+ gen_helper_sve2_eoril_s, gen_helper_sve2_eoril_d,
176
+};
177
+TRANS_FEAT(EORBT, aa64_sve2, gen_gvec_ool_arg_zzz, eoril_fns[a->esz], a, 2)
178
+TRANS_FEAT(EORTB, aa64_sve2, gen_gvec_ool_arg_zzz, eoril_fns[a->esz], a, 1)
179
180
static bool do_trans_pmull(DisasContext *s, arg_rrr_esz *a, bool sel)
181
{
182
@@ -XXX,XX +XXX,XX @@ static bool do_trans_pmull(DisasContext *s, arg_rrr_esz *a, bool sel)
183
if (a->esz == 0 && !dc_isar_feature(aa64_sve2_pmull128, s)) {
184
return false;
58
}
185
}
59
186
- return do_sve2_zzw_ool(s, a, fns[a->esz], sel);
60
sysbus_init_child_obj(obj, "secctl", &s->secctl, sizeof(s->secctl),
187
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, sel);
61
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
188
}
62
* 0x50000000..0x5fffffff alias of 0x40000000..0x4fffffff
189
63
*/
190
-static bool trans_PMULLB(DisasContext *s, arg_rrr_esz *a)
64
191
-{
65
- memory_region_add_subregion_overlap(&s->container, 0, s->board_memory, -1);
192
- return do_trans_pmull(s, a, false);
66
+ memory_region_add_subregion_overlap(&s->container, 0, s->board_memory, -2);
193
-}
67
194
+TRANS_FEAT(PMULLB, aa64_sve2, do_trans_pmull, a, false)
68
for (i = 0; i < info->num_cpus; i++) {
195
+TRANS_FEAT(PMULLT, aa64_sve2, do_trans_pmull, a, true)
69
DeviceState *cpudev = DEVICE(&s->armv7m[i]);
196
70
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
197
-static bool trans_PMULLT(DisasContext *s, arg_rrr_esz *a)
71
return;
198
-{
72
}
199
- return do_trans_pmull(s, a, true);
73
}
200
-}
74
- object_property_set_link(cpuobj, OBJECT(&s->container), "memory", &err);
201
+static gen_helper_gvec_3 * const saddw_fns[4] = {
75
+
202
+ NULL, gen_helper_sve2_saddw_h,
76
+ if (i > 0) {
203
+ gen_helper_sve2_saddw_s, gen_helper_sve2_saddw_d,
77
+ memory_region_add_subregion_overlap(&s->cpu_container[i], 0,
204
+};
78
+ &s->container_alias[i - 1], -1);
205
+TRANS_FEAT(SADDWB, aa64_sve2, gen_gvec_ool_arg_zzz, saddw_fns[a->esz], a, 0)
79
+ } else {
206
+TRANS_FEAT(SADDWT, aa64_sve2, gen_gvec_ool_arg_zzz, saddw_fns[a->esz], a, 1)
80
+ memory_region_add_subregion_overlap(&s->cpu_container[i], 0,
207
81
+ &s->container, -1);
208
-#define DO_SVE2_ZZZ_WTB(NAME, name, SEL2) \
82
+ }
209
-static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
83
+ object_property_set_link(cpuobj, OBJECT(&s->cpu_container[i]),
210
-{ \
84
+ "memory", &err);
211
- static gen_helper_gvec_3 * const fns[4] = { \
85
if (err) {
212
- NULL, gen_helper_sve2_##name##_h, \
86
error_propagate(errp, err);
213
- gen_helper_sve2_##name##_s, gen_helper_sve2_##name##_d, \
87
return;
214
- }; \
215
- return do_sve2_zzw_ool(s, a, fns[a->esz], SEL2); \
216
-}
217
+static gen_helper_gvec_3 * const ssubw_fns[4] = {
218
+ NULL, gen_helper_sve2_ssubw_h,
219
+ gen_helper_sve2_ssubw_s, gen_helper_sve2_ssubw_d,
220
+};
221
+TRANS_FEAT(SSUBWB, aa64_sve2, gen_gvec_ool_arg_zzz, ssubw_fns[a->esz], a, 0)
222
+TRANS_FEAT(SSUBWT, aa64_sve2, gen_gvec_ool_arg_zzz, ssubw_fns[a->esz], a, 1)
223
224
-DO_SVE2_ZZZ_WTB(SADDWB, saddw, false)
225
-DO_SVE2_ZZZ_WTB(SADDWT, saddw, true)
226
-DO_SVE2_ZZZ_WTB(SSUBWB, ssubw, false)
227
-DO_SVE2_ZZZ_WTB(SSUBWT, ssubw, true)
228
+static gen_helper_gvec_3 * const uaddw_fns[4] = {
229
+ NULL, gen_helper_sve2_uaddw_h,
230
+ gen_helper_sve2_uaddw_s, gen_helper_sve2_uaddw_d,
231
+};
232
+TRANS_FEAT(UADDWB, aa64_sve2, gen_gvec_ool_arg_zzz, uaddw_fns[a->esz], a, 0)
233
+TRANS_FEAT(UADDWT, aa64_sve2, gen_gvec_ool_arg_zzz, uaddw_fns[a->esz], a, 1)
234
235
-DO_SVE2_ZZZ_WTB(UADDWB, uaddw, false)
236
-DO_SVE2_ZZZ_WTB(UADDWT, uaddw, true)
237
-DO_SVE2_ZZZ_WTB(USUBWB, usubw, false)
238
-DO_SVE2_ZZZ_WTB(USUBWT, usubw, true)
239
+static gen_helper_gvec_3 * const usubw_fns[4] = {
240
+ NULL, gen_helper_sve2_usubw_h,
241
+ gen_helper_sve2_usubw_s, gen_helper_sve2_usubw_d,
242
+};
243
+TRANS_FEAT(USUBWB, aa64_sve2, gen_gvec_ool_arg_zzz, usubw_fns[a->esz], a, 0)
244
+TRANS_FEAT(USUBWT, aa64_sve2, gen_gvec_ool_arg_zzz, usubw_fns[a->esz], a, 1)
245
246
static void gen_sshll_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t imm)
247
{
248
@@ -XXX,XX +XXX,XX @@ static bool trans_USHLLT(DisasContext *s, arg_rri_esz *a)
249
return do_sve2_shll_tb(s, a, true, true);
250
}
251
252
-static bool trans_BEXT(DisasContext *s, arg_rrr_esz *a)
253
-{
254
- static gen_helper_gvec_3 * const fns[4] = {
255
- gen_helper_sve2_bext_b, gen_helper_sve2_bext_h,
256
- gen_helper_sve2_bext_s, gen_helper_sve2_bext_d,
257
- };
258
- if (!dc_isar_feature(aa64_sve2_bitperm, s)) {
259
- return false;
260
- }
261
- return do_sve2_zzw_ool(s, a, fns[a->esz], 0);
262
-}
263
+static gen_helper_gvec_3 * const bext_fns[4] = {
264
+ gen_helper_sve2_bext_b, gen_helper_sve2_bext_h,
265
+ gen_helper_sve2_bext_s, gen_helper_sve2_bext_d,
266
+};
267
+TRANS_FEAT(BEXT, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
268
+ bext_fns[a->esz], a, 0)
269
270
-static bool trans_BDEP(DisasContext *s, arg_rrr_esz *a)
271
-{
272
- static gen_helper_gvec_3 * const fns[4] = {
273
- gen_helper_sve2_bdep_b, gen_helper_sve2_bdep_h,
274
- gen_helper_sve2_bdep_s, gen_helper_sve2_bdep_d,
275
- };
276
- if (!dc_isar_feature(aa64_sve2_bitperm, s)) {
277
- return false;
278
- }
279
- return do_sve2_zzw_ool(s, a, fns[a->esz], 0);
280
-}
281
+static gen_helper_gvec_3 * const bdep_fns[4] = {
282
+ gen_helper_sve2_bdep_b, gen_helper_sve2_bdep_h,
283
+ gen_helper_sve2_bdep_s, gen_helper_sve2_bdep_d,
284
+};
285
+TRANS_FEAT(BDEP, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
286
+ bdep_fns[a->esz], a, 0)
287
288
-static bool trans_BGRP(DisasContext *s, arg_rrr_esz *a)
289
-{
290
- static gen_helper_gvec_3 * const fns[4] = {
291
- gen_helper_sve2_bgrp_b, gen_helper_sve2_bgrp_h,
292
- gen_helper_sve2_bgrp_s, gen_helper_sve2_bgrp_d,
293
- };
294
- if (!dc_isar_feature(aa64_sve2_bitperm, s)) {
295
- return false;
296
- }
297
- return do_sve2_zzw_ool(s, a, fns[a->esz], 0);
298
-}
299
+static gen_helper_gvec_3 * const bgrp_fns[4] = {
300
+ gen_helper_sve2_bgrp_b, gen_helper_sve2_bgrp_h,
301
+ gen_helper_sve2_bgrp_s, gen_helper_sve2_bgrp_d,
302
+};
303
+TRANS_FEAT(BGRP, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
304
+ bgrp_fns[a->esz], a, 0)
305
306
-static bool do_cadd(DisasContext *s, arg_rrr_esz *a, bool sq, bool rot)
307
-{
308
- static gen_helper_gvec_3 * const fns[2][4] = {
309
- { gen_helper_sve2_cadd_b, gen_helper_sve2_cadd_h,
310
- gen_helper_sve2_cadd_s, gen_helper_sve2_cadd_d },
311
- { gen_helper_sve2_sqcadd_b, gen_helper_sve2_sqcadd_h,
312
- gen_helper_sve2_sqcadd_s, gen_helper_sve2_sqcadd_d },
313
- };
314
- return do_sve2_zzw_ool(s, a, fns[sq][a->esz], rot);
315
-}
316
+static gen_helper_gvec_3 * const cadd_fns[4] = {
317
+ gen_helper_sve2_cadd_b, gen_helper_sve2_cadd_h,
318
+ gen_helper_sve2_cadd_s, gen_helper_sve2_cadd_d,
319
+};
320
+TRANS_FEAT(CADD_rot90, aa64_sve2, gen_gvec_ool_arg_zzz,
321
+ cadd_fns[a->esz], a, 0)
322
+TRANS_FEAT(CADD_rot270, aa64_sve2, gen_gvec_ool_arg_zzz,
323
+ cadd_fns[a->esz], a, 1)
324
325
-static bool trans_CADD_rot90(DisasContext *s, arg_rrr_esz *a)
326
-{
327
- return do_cadd(s, a, false, false);
328
-}
329
-
330
-static bool trans_CADD_rot270(DisasContext *s, arg_rrr_esz *a)
331
-{
332
- return do_cadd(s, a, false, true);
333
-}
334
-
335
-static bool trans_SQCADD_rot90(DisasContext *s, arg_rrr_esz *a)
336
-{
337
- return do_cadd(s, a, true, false);
338
-}
339
-
340
-static bool trans_SQCADD_rot270(DisasContext *s, arg_rrr_esz *a)
341
-{
342
- return do_cadd(s, a, true, true);
343
-}
344
+static gen_helper_gvec_3 * const sqcadd_fns[4] = {
345
+ gen_helper_sve2_sqcadd_b, gen_helper_sve2_sqcadd_h,
346
+ gen_helper_sve2_sqcadd_s, gen_helper_sve2_sqcadd_d,
347
+};
348
+TRANS_FEAT(SQCADD_rot90, aa64_sve2, gen_gvec_ool_arg_zzz,
349
+ sqcadd_fns[a->esz], a, 0)
350
+TRANS_FEAT(SQCADD_rot270, aa64_sve2, gen_gvec_ool_arg_zzz,
351
+ sqcadd_fns[a->esz], a, 1)
352
353
static gen_helper_gvec_4 * const sabal_fns[4] = {
354
NULL, gen_helper_sve2_sabal_h,
88
--
355
--
89
2.20.1
356
2.25.1
90
91
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
This is the last direct user of tcg_gen_gvec_4_ool.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-19-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate-sve.c | 17 ++---------------
11
1 file changed, 2 insertions(+), 15 deletions(-)
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_4 * const sqrdcmlah_fns[] = {
18
TRANS_FEAT(SQRDCMLAH_zzzz, aa64_sve2, gen_gvec_ool_zzzz,
19
sqrdcmlah_fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot)
20
21
-static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
22
-{
23
- if (a->esz != 2 || !dc_isar_feature(aa64_sve_i8mm, s)) {
24
- return false;
25
- }
26
- if (sve_access_check(s)) {
27
- unsigned vsz = vec_full_reg_size(s);
28
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, a->rd),
29
- vec_full_reg_offset(s, a->rn),
30
- vec_full_reg_offset(s, a->rm),
31
- vec_full_reg_offset(s, a->ra),
32
- vsz, vsz, 0, gen_helper_gvec_usdot_b);
33
- }
34
- return true;
35
-}
36
+TRANS_FEAT(USDOT_zzzz, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
37
+ a->esz == 2 ? gen_helper_gvec_usdot_b : NULL, a, 0)
38
39
TRANS_FEAT(AESMC, aa64_sve2_aes, gen_gvec_ool_zz,
40
gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt)
41
--
42
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-20-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 37 +++++++++++++++----------------------
9
1 file changed, 15 insertions(+), 22 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzxz(DisasContext *s, gen_helper_gvec_4 *fn,
16
}
17
18
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
19
-static void gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
20
+static bool gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
21
int rd, int rn, int pg, int data)
22
{
23
- unsigned vsz = vec_full_reg_size(s);
24
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
25
- vec_full_reg_offset(s, rn),
26
- pred_full_reg_offset(s, pg),
27
- vsz, vsz, data, fn);
28
+ if (fn == NULL) {
29
+ return false;
30
+ }
31
+ if (sve_access_check(s)) {
32
+ unsigned vsz = vec_full_reg_size(s);
33
+ tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
34
+ vec_full_reg_offset(s, rn),
35
+ pred_full_reg_offset(s, pg),
36
+ vsz, vsz, data, fn);
37
+ }
38
+ return true;
39
}
40
41
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
42
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
43
44
static bool do_zpz_ool(DisasContext *s, arg_rpr_esz *a, gen_helper_gvec_3 *fn)
45
{
46
- if (fn == NULL) {
47
- return false;
48
- }
49
- if (sve_access_check(s)) {
50
- gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, 0);
51
- }
52
- return true;
53
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, 0);
54
}
55
56
#define DO_ZPZ(NAME, name) \
57
@@ -XXX,XX +XXX,XX @@ static bool do_movz_zpz(DisasContext *s, int rd, int rn, int pg,
58
gen_helper_sve_movz_b, gen_helper_sve_movz_h,
59
gen_helper_sve_movz_s, gen_helper_sve_movz_d,
60
};
61
-
62
- if (sve_access_check(s)) {
63
- gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
64
- }
65
- return true;
66
+ return gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
67
}
68
69
static bool do_zpzi_ool(DisasContext *s, arg_rpri_esz *a,
70
gen_helper_gvec_3 *fn)
71
{
72
- if (sve_access_check(s)) {
73
- gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
74
- }
75
- return true;
76
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
77
}
78
79
static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
80
--
81
2.25.1
diff view generated by jsdifflib
1
Add a model of the MPS2 FPGA image described in Application Note
1
From: Richard Henderson <richard.henderson@linaro.org>
2
AN521. This is identical to the AN505 image, except that it uses
3
the SSE-200 rather than the IoTKit and so has two Cortex-M33 CPUs.
4
2
3
Use gen_gvec_ool_arg_zpz instead of gen_gvec_ool_zzp
4
when the arguments come from arg_rpr_esz.
5
Replaces do_zpz_ool.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-21-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20190121185118.18550-24-peter.maydell@linaro.org
8
---
11
---
9
hw/arm/mps2-tz.c | 38 ++++++++++++++++++++++++++++++++++++--
12
target/arm/translate-sve.c | 45 +++++++++++++++++++++-----------------
10
1 file changed, 36 insertions(+), 2 deletions(-)
13
1 file changed, 25 insertions(+), 20 deletions(-)
11
14
12
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/arm/mps2-tz.c
17
--- a/target/arm/translate-sve.c
15
+++ b/hw/arm/mps2-tz.c
18
+++ b/target/arm/translate-sve.c
16
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
17
* as seen by the guest depend significantly on the FPGA image.
20
return true;
18
* This source file covers the following FPGA images, for TrustZone cores:
19
* "mps2-an505" -- Cortex-M33 as documented in ARM Application Note AN505
20
+ * "mps2-an521" -- Dual Cortex-M33 as documented in Application Note AN521
21
*
22
* Links to the TRM for the board itself and to the various Application
23
* Notes which document the FPGA images can be found here:
24
@@ -XXX,XX +XXX,XX @@
25
* http://infocenter.arm.com/help/topic/com.arm.doc.100112_0200_06_en/versatile_express_cortex_m_prototyping_systems_v2m_mps2_and_v2m_mps2plus_technical_reference_100112_0200_06_en.pdf
26
* Application Note AN505:
27
* http://infocenter.arm.com/help/topic/com.arm.doc.dai0505b/index.html
28
+ * Application Note AN521:
29
+ * http://infocenter.arm.com/help/topic/com.arm.doc.dai0521c/index.html
30
*
31
* The AN505 defers to the Cortex-M33 processor ARMv8M IoT Kit FVP User Guide
32
* (ARM ECM0601256) for the details of some of the device layout:
33
* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ecm0601256/index.html
34
+ * Similarly, the AN521 uses the SSE-200, and the SSE-200 TRM defines
35
+ * most of the device layout:
36
+ * http://infocenter.arm.com/help/topic/com.arm.doc.101104_0100_00_en/corelink_sse200_subsystem_for_embedded_technical_reference_manual_101104_0100_00_en.pdf
37
+ *
38
*/
39
40
#include "qemu/osdep.h"
41
@@ -XXX,XX +XXX,XX @@ typedef struct {
42
MachineClass parent;
43
MPS2TZFPGAType fpga_type;
44
uint32_t scc_id;
45
+ const char *armsse_type;
46
} MPS2TZMachineClass;
47
48
typedef struct {
49
@@ -XXX,XX +XXX,XX @@ typedef struct {
50
51
#define TYPE_MPS2TZ_MACHINE "mps2tz"
52
#define TYPE_MPS2TZ_AN505_MACHINE MACHINE_TYPE_NAME("mps2-an505")
53
+#define TYPE_MPS2TZ_AN521_MACHINE MACHINE_TYPE_NAME("mps2-an521")
54
55
#define MPS2TZ_MACHINE(obj) \
56
OBJECT_CHECK(MPS2TZMachineState, obj, TYPE_MPS2TZ_MACHINE)
57
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
58
}
59
60
sysbus_init_child_obj(OBJECT(machine), "iotkit", &mms->iotkit,
61
- sizeof(mms->iotkit), TYPE_IOTKIT);
62
+ sizeof(mms->iotkit), mmc->armsse_type);
63
iotkitdev = DEVICE(&mms->iotkit);
64
object_property_set_link(OBJECT(&mms->iotkit), OBJECT(system_memory),
65
"memory", &error_abort);
66
@@ -XXX,XX +XXX,XX @@ static void mps2tz_class_init(ObjectClass *oc, void *data)
67
IDAUInterfaceClass *iic = IDAU_INTERFACE_CLASS(oc);
68
69
mc->init = mps2tz_common_init;
70
- mc->max_cpus = 1;
71
iic->check = mps2_tz_idau_check;
72
}
21
}
73
22
74
@@ -XXX,XX +XXX,XX @@ static void mps2tz_an505_class_init(ObjectClass *oc, void *data)
23
+static bool gen_gvec_ool_arg_zpz(DisasContext *s, gen_helper_gvec_3 *fn,
75
MPS2TZMachineClass *mmc = MPS2TZ_MACHINE_CLASS(oc);
24
+ arg_rpr_esz *a, int data)
76
25
+{
77
mc->desc = "ARM MPS2 with AN505 FPGA image for Cortex-M33";
26
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, data);
78
+ mc->default_cpus = 1;
79
+ mc->min_cpus = mc->default_cpus;
80
+ mc->max_cpus = mc->default_cpus;
81
mmc->fpga_type = FPGA_AN505;
82
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m33");
83
mmc->scc_id = 0x41045050;
84
+ mmc->armsse_type = TYPE_IOTKIT;
85
+}
27
+}
86
+
28
+
87
+static void mps2tz_an521_class_init(ObjectClass *oc, void *data)
88
+{
89
+ MachineClass *mc = MACHINE_CLASS(oc);
90
+ MPS2TZMachineClass *mmc = MPS2TZ_MACHINE_CLASS(oc);
91
+
29
+
92
+ mc->desc = "ARM MPS2 with AN521 FPGA image for dual Cortex-M33";
30
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
93
+ mc->default_cpus = 2;
31
static void gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
94
+ mc->min_cpus = mc->default_cpus;
32
int rd, int rn, int rm, int pg, int data)
95
+ mc->max_cpus = mc->default_cpus;
33
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
96
+ mmc->fpga_type = FPGA_AN521;
34
*** SVE Integer Arithmetic - Unary Predicated Group
97
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m33");
35
*/
98
+ mmc->scc_id = 0x41045210;
36
99
+ mmc->armsse_type = TYPE_SSE200;
37
-static bool do_zpz_ool(DisasContext *s, arg_rpr_esz *a, gen_helper_gvec_3 *fn)
38
-{
39
- return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, 0);
40
-}
41
-
42
#define DO_ZPZ(NAME, name) \
43
static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
44
{ \
45
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
46
gen_helper_sve_##name##_b, gen_helper_sve_##name##_h, \
47
gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
48
}; \
49
- return do_zpz_ool(s, a, fns[a->esz]); \
50
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0); \
100
}
51
}
101
52
102
static const TypeInfo mps2tz_info = {
53
DO_ZPZ(CLS, cls)
103
@@ -XXX,XX +XXX,XX @@ static const TypeInfo mps2tz_an505_info = {
54
@@ -XXX,XX +XXX,XX @@ static bool trans_FABS(DisasContext *s, arg_rpr_esz *a)
104
.class_init = mps2tz_an505_class_init,
55
gen_helper_sve_fabs_s,
105
};
56
gen_helper_sve_fabs_d
106
57
};
107
+static const TypeInfo mps2tz_an521_info = {
58
- return do_zpz_ool(s, a, fns[a->esz]);
108
+ .name = TYPE_MPS2TZ_AN521_MACHINE,
59
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
109
+ .parent = TYPE_MPS2TZ_MACHINE,
60
}
110
+ .class_init = mps2tz_an521_class_init,
61
111
+};
62
static bool trans_FNEG(DisasContext *s, arg_rpr_esz *a)
112
+
63
@@ -XXX,XX +XXX,XX @@ static bool trans_FNEG(DisasContext *s, arg_rpr_esz *a)
113
static void mps2tz_machine_init(void)
64
gen_helper_sve_fneg_s,
65
gen_helper_sve_fneg_d
66
};
67
- return do_zpz_ool(s, a, fns[a->esz]);
68
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
69
}
70
71
static bool trans_SXTB(DisasContext *s, arg_rpr_esz *a)
72
@@ -XXX,XX +XXX,XX @@ static bool trans_SXTB(DisasContext *s, arg_rpr_esz *a)
73
gen_helper_sve_sxtb_s,
74
gen_helper_sve_sxtb_d
75
};
76
- return do_zpz_ool(s, a, fns[a->esz]);
77
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
78
}
79
80
static bool trans_UXTB(DisasContext *s, arg_rpr_esz *a)
81
@@ -XXX,XX +XXX,XX @@ static bool trans_UXTB(DisasContext *s, arg_rpr_esz *a)
82
gen_helper_sve_uxtb_s,
83
gen_helper_sve_uxtb_d
84
};
85
- return do_zpz_ool(s, a, fns[a->esz]);
86
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
87
}
88
89
static bool trans_SXTH(DisasContext *s, arg_rpr_esz *a)
90
@@ -XXX,XX +XXX,XX @@ static bool trans_SXTH(DisasContext *s, arg_rpr_esz *a)
91
gen_helper_sve_sxth_s,
92
gen_helper_sve_sxth_d
93
};
94
- return do_zpz_ool(s, a, fns[a->esz]);
95
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
96
}
97
98
static bool trans_UXTH(DisasContext *s, arg_rpr_esz *a)
99
@@ -XXX,XX +XXX,XX @@ static bool trans_UXTH(DisasContext *s, arg_rpr_esz *a)
100
gen_helper_sve_uxth_s,
101
gen_helper_sve_uxth_d
102
};
103
- return do_zpz_ool(s, a, fns[a->esz]);
104
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
105
}
106
107
static bool trans_SXTW(DisasContext *s, arg_rpr_esz *a)
114
{
108
{
115
type_register_static(&mps2tz_info);
109
- return do_zpz_ool(s, a, a->esz == 3 ? gen_helper_sve_sxtw_d : NULL);
116
type_register_static(&mps2tz_an505_info);
110
+ return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_sxtw_d
117
+ type_register_static(&mps2tz_an521_info);
111
+ : NULL, a, 0);
118
}
112
}
119
113
120
type_init(mps2tz_machine_init);
114
static bool trans_UXTW(DisasContext *s, arg_rpr_esz *a)
115
{
116
- return do_zpz_ool(s, a, a->esz == 3 ? gen_helper_sve_uxtw_d : NULL);
117
+ return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_uxtw_d
118
+ : NULL, a, 0);
119
}
120
121
#undef DO_ZPZ
122
@@ -XXX,XX +XXX,XX @@ static bool trans_COMPACT(DisasContext *s, arg_rpr_esz *a)
123
static gen_helper_gvec_3 * const fns[4] = {
124
NULL, NULL, gen_helper_sve_compact_s, gen_helper_sve_compact_d
125
};
126
- return do_zpz_ool(s, a, fns[a->esz]);
127
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
128
}
129
130
/* Call the helper that computes the ARM LastActiveElement pseudocode
131
@@ -XXX,XX +XXX,XX @@ static bool trans_REVB(DisasContext *s, arg_rpr_esz *a)
132
gen_helper_sve_revb_s,
133
gen_helper_sve_revb_d,
134
};
135
- return do_zpz_ool(s, a, fns[a->esz]);
136
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
137
}
138
139
static bool trans_REVH(DisasContext *s, arg_rpr_esz *a)
140
@@ -XXX,XX +XXX,XX @@ static bool trans_REVH(DisasContext *s, arg_rpr_esz *a)
141
gen_helper_sve_revh_s,
142
gen_helper_sve_revh_d,
143
};
144
- return do_zpz_ool(s, a, fns[a->esz]);
145
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
146
}
147
148
static bool trans_REVW(DisasContext *s, arg_rpr_esz *a)
149
{
150
- return do_zpz_ool(s, a, a->esz == 3 ? gen_helper_sve_revw_d : NULL);
151
+ return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_revw_d
152
+ : NULL, a, 0);
153
}
154
155
static bool trans_RBIT(DisasContext *s, arg_rpr_esz *a)
156
@@ -XXX,XX +XXX,XX @@ static bool trans_RBIT(DisasContext *s, arg_rpr_esz *a)
157
gen_helper_sve_rbit_s,
158
gen_helper_sve_rbit_d,
159
};
160
- return do_zpz_ool(s, a, fns[a->esz]);
161
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
162
}
163
164
static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
165
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zpz_ool(DisasContext *s, arg_rpr_esz *a,
166
if (!dc_isar_feature(aa64_sve2, s)) {
167
return false;
168
}
169
- return do_zpz_ool(s, a, fn);
170
+ return gen_gvec_ool_arg_zpz(s, fn, a, 0);
171
}
172
173
static bool trans_URECPE(DisasContext *s, arg_rpr_esz *a)
121
--
174
--
122
2.20.1
175
2.25.1
123
124
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions directly using
4
gen_gvec_ool_arg_zpz to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-22-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 189 ++++++++++++-------------------------
12
1 file changed, 60 insertions(+), 129 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
19
*** SVE Integer Arithmetic - Unary Predicated Group
20
*/
21
22
-#define DO_ZPZ(NAME, name) \
23
-static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
24
-{ \
25
- static gen_helper_gvec_3 * const fns[4] = { \
26
- gen_helper_sve_##name##_b, gen_helper_sve_##name##_h, \
27
- gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
28
+#define DO_ZPZ(NAME, FEAT, name) \
29
+ static gen_helper_gvec_3 * const name##_fns[4] = { \
30
+ gen_helper_##name##_b, gen_helper_##name##_h, \
31
+ gen_helper_##name##_s, gen_helper_##name##_d, \
32
}; \
33
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0); \
34
-}
35
+ TRANS_FEAT(NAME, FEAT, gen_gvec_ool_arg_zpz, name##_fns[a->esz], a, 0)
36
37
-DO_ZPZ(CLS, cls)
38
-DO_ZPZ(CLZ, clz)
39
-DO_ZPZ(CNT_zpz, cnt_zpz)
40
-DO_ZPZ(CNOT, cnot)
41
-DO_ZPZ(NOT_zpz, not_zpz)
42
-DO_ZPZ(ABS, abs)
43
-DO_ZPZ(NEG, neg)
44
+DO_ZPZ(CLS, aa64_sve, sve_cls)
45
+DO_ZPZ(CLZ, aa64_sve, sve_clz)
46
+DO_ZPZ(CNT_zpz, aa64_sve, sve_cnt_zpz)
47
+DO_ZPZ(CNOT, aa64_sve, sve_cnot)
48
+DO_ZPZ(NOT_zpz, aa64_sve, sve_not_zpz)
49
+DO_ZPZ(ABS, aa64_sve, sve_abs)
50
+DO_ZPZ(NEG, aa64_sve, sve_neg)
51
+DO_ZPZ(RBIT, aa64_sve, sve_rbit)
52
53
-static bool trans_FABS(DisasContext *s, arg_rpr_esz *a)
54
-{
55
- static gen_helper_gvec_3 * const fns[4] = {
56
- NULL,
57
- gen_helper_sve_fabs_h,
58
- gen_helper_sve_fabs_s,
59
- gen_helper_sve_fabs_d
60
- };
61
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
62
-}
63
+static gen_helper_gvec_3 * const fabs_fns[4] = {
64
+ NULL, gen_helper_sve_fabs_h,
65
+ gen_helper_sve_fabs_s, gen_helper_sve_fabs_d,
66
+};
67
+TRANS_FEAT(FABS, aa64_sve, gen_gvec_ool_arg_zpz, fabs_fns[a->esz], a, 0)
68
69
-static bool trans_FNEG(DisasContext *s, arg_rpr_esz *a)
70
-{
71
- static gen_helper_gvec_3 * const fns[4] = {
72
- NULL,
73
- gen_helper_sve_fneg_h,
74
- gen_helper_sve_fneg_s,
75
- gen_helper_sve_fneg_d
76
- };
77
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
78
-}
79
+static gen_helper_gvec_3 * const fneg_fns[4] = {
80
+ NULL, gen_helper_sve_fneg_h,
81
+ gen_helper_sve_fneg_s, gen_helper_sve_fneg_d,
82
+};
83
+TRANS_FEAT(FNEG, aa64_sve, gen_gvec_ool_arg_zpz, fneg_fns[a->esz], a, 0)
84
85
-static bool trans_SXTB(DisasContext *s, arg_rpr_esz *a)
86
-{
87
- static gen_helper_gvec_3 * const fns[4] = {
88
- NULL,
89
- gen_helper_sve_sxtb_h,
90
- gen_helper_sve_sxtb_s,
91
- gen_helper_sve_sxtb_d
92
- };
93
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
94
-}
95
+static gen_helper_gvec_3 * const sxtb_fns[4] = {
96
+ NULL, gen_helper_sve_sxtb_h,
97
+ gen_helper_sve_sxtb_s, gen_helper_sve_sxtb_d,
98
+};
99
+TRANS_FEAT(SXTB, aa64_sve, gen_gvec_ool_arg_zpz, sxtb_fns[a->esz], a, 0)
100
101
-static bool trans_UXTB(DisasContext *s, arg_rpr_esz *a)
102
-{
103
- static gen_helper_gvec_3 * const fns[4] = {
104
- NULL,
105
- gen_helper_sve_uxtb_h,
106
- gen_helper_sve_uxtb_s,
107
- gen_helper_sve_uxtb_d
108
- };
109
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
110
-}
111
+static gen_helper_gvec_3 * const uxtb_fns[4] = {
112
+ NULL, gen_helper_sve_uxtb_h,
113
+ gen_helper_sve_uxtb_s, gen_helper_sve_uxtb_d,
114
+};
115
+TRANS_FEAT(UXTB, aa64_sve, gen_gvec_ool_arg_zpz, uxtb_fns[a->esz], a, 0)
116
117
-static bool trans_SXTH(DisasContext *s, arg_rpr_esz *a)
118
-{
119
- static gen_helper_gvec_3 * const fns[4] = {
120
- NULL, NULL,
121
- gen_helper_sve_sxth_s,
122
- gen_helper_sve_sxth_d
123
- };
124
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
125
-}
126
+static gen_helper_gvec_3 * const sxth_fns[4] = {
127
+ NULL, NULL, gen_helper_sve_sxth_s, gen_helper_sve_sxth_d
128
+};
129
+TRANS_FEAT(SXTH, aa64_sve, gen_gvec_ool_arg_zpz, sxth_fns[a->esz], a, 0)
130
131
-static bool trans_UXTH(DisasContext *s, arg_rpr_esz *a)
132
-{
133
- static gen_helper_gvec_3 * const fns[4] = {
134
- NULL, NULL,
135
- gen_helper_sve_uxth_s,
136
- gen_helper_sve_uxth_d
137
- };
138
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
139
-}
140
+static gen_helper_gvec_3 * const uxth_fns[4] = {
141
+ NULL, NULL, gen_helper_sve_uxth_s, gen_helper_sve_uxth_d
142
+};
143
+TRANS_FEAT(UXTH, aa64_sve, gen_gvec_ool_arg_zpz, uxth_fns[a->esz], a, 0)
144
145
-static bool trans_SXTW(DisasContext *s, arg_rpr_esz *a)
146
-{
147
- return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_sxtw_d
148
- : NULL, a, 0);
149
-}
150
-
151
-static bool trans_UXTW(DisasContext *s, arg_rpr_esz *a)
152
-{
153
- return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_uxtw_d
154
- : NULL, a, 0);
155
-}
156
-
157
-#undef DO_ZPZ
158
+TRANS_FEAT(SXTW, aa64_sve, gen_gvec_ool_arg_zpz,
159
+ a->esz == 3 ? gen_helper_sve_sxtw_d : NULL, a, 0)
160
+TRANS_FEAT(UXTW, aa64_sve, gen_gvec_ool_arg_zpz,
161
+ a->esz == 3 ? gen_helper_sve_uxtw_d : NULL, a, 0)
162
163
/*
164
*** SVE Integer Reduction Group
165
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(TRN2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
166
*** SVE Permute Vector - Predicated Group
167
*/
168
169
-static bool trans_COMPACT(DisasContext *s, arg_rpr_esz *a)
170
-{
171
- static gen_helper_gvec_3 * const fns[4] = {
172
- NULL, NULL, gen_helper_sve_compact_s, gen_helper_sve_compact_d
173
- };
174
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
175
-}
176
+static gen_helper_gvec_3 * const compact_fns[4] = {
177
+ NULL, NULL, gen_helper_sve_compact_s, gen_helper_sve_compact_d
178
+};
179
+TRANS_FEAT(COMPACT, aa64_sve, gen_gvec_ool_arg_zpz, compact_fns[a->esz], a, 0)
180
181
/* Call the helper that computes the ARM LastActiveElement pseudocode
182
* function, scaled by the element size. This includes the not found
183
@@ -XXX,XX +XXX,XX @@ static bool trans_CPY_m_v(DisasContext *s, arg_rpr_esz *a)
184
return true;
185
}
186
187
-static bool trans_REVB(DisasContext *s, arg_rpr_esz *a)
188
-{
189
- static gen_helper_gvec_3 * const fns[4] = {
190
- NULL,
191
- gen_helper_sve_revb_h,
192
- gen_helper_sve_revb_s,
193
- gen_helper_sve_revb_d,
194
- };
195
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
196
-}
197
+static gen_helper_gvec_3 * const revb_fns[4] = {
198
+ NULL, gen_helper_sve_revb_h,
199
+ gen_helper_sve_revb_s, gen_helper_sve_revb_d,
200
+};
201
+TRANS_FEAT(REVB, aa64_sve, gen_gvec_ool_arg_zpz, revb_fns[a->esz], a, 0)
202
203
-static bool trans_REVH(DisasContext *s, arg_rpr_esz *a)
204
-{
205
- static gen_helper_gvec_3 * const fns[4] = {
206
- NULL,
207
- NULL,
208
- gen_helper_sve_revh_s,
209
- gen_helper_sve_revh_d,
210
- };
211
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
212
-}
213
+static gen_helper_gvec_3 * const revh_fns[4] = {
214
+ NULL, NULL, gen_helper_sve_revh_s, gen_helper_sve_revh_d,
215
+};
216
+TRANS_FEAT(REVH, aa64_sve, gen_gvec_ool_arg_zpz, revh_fns[a->esz], a, 0)
217
218
-static bool trans_REVW(DisasContext *s, arg_rpr_esz *a)
219
-{
220
- return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_revw_d
221
- : NULL, a, 0);
222
-}
223
-
224
-static bool trans_RBIT(DisasContext *s, arg_rpr_esz *a)
225
-{
226
- static gen_helper_gvec_3 * const fns[4] = {
227
- gen_helper_sve_rbit_b,
228
- gen_helper_sve_rbit_h,
229
- gen_helper_sve_rbit_s,
230
- gen_helper_sve_rbit_d,
231
- };
232
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
233
-}
234
+TRANS_FEAT(REVW, aa64_sve, gen_gvec_ool_arg_zpz,
235
+ a->esz == 3 ? gen_helper_sve_revw_d : NULL, a, 0)
236
237
static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
238
{
239
--
240
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions using do_sve2_zpz_data
4
to use TRANS_FEAT and gen_gvec_ool_arg_zpz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-23-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 53 ++++++++++----------------------------
12
1 file changed, 14 insertions(+), 39 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_UADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
19
* SVE2 integer unary operations (predicated)
20
*/
21
22
-static bool do_sve2_zpz_ool(DisasContext *s, arg_rpr_esz *a,
23
- gen_helper_gvec_3 *fn)
24
-{
25
- if (!dc_isar_feature(aa64_sve2, s)) {
26
- return false;
27
- }
28
- return gen_gvec_ool_arg_zpz(s, fn, a, 0);
29
-}
30
+TRANS_FEAT(URECPE, aa64_sve2, gen_gvec_ool_arg_zpz,
31
+ a->esz == 2 ? gen_helper_sve2_urecpe_s : NULL, a, 0)
32
33
-static bool trans_URECPE(DisasContext *s, arg_rpr_esz *a)
34
-{
35
- if (a->esz != 2) {
36
- return false;
37
- }
38
- return do_sve2_zpz_ool(s, a, gen_helper_sve2_urecpe_s);
39
-}
40
+TRANS_FEAT(URSQRTE, aa64_sve2, gen_gvec_ool_arg_zpz,
41
+ a->esz == 2 ? gen_helper_sve2_ursqrte_s : NULL, a, 0)
42
43
-static bool trans_URSQRTE(DisasContext *s, arg_rpr_esz *a)
44
-{
45
- if (a->esz != 2) {
46
- return false;
47
- }
48
- return do_sve2_zpz_ool(s, a, gen_helper_sve2_ursqrte_s);
49
-}
50
+static gen_helper_gvec_3 * const sqabs_fns[4] = {
51
+ gen_helper_sve2_sqabs_b, gen_helper_sve2_sqabs_h,
52
+ gen_helper_sve2_sqabs_s, gen_helper_sve2_sqabs_d,
53
+};
54
+TRANS_FEAT(SQABS, aa64_sve2, gen_gvec_ool_arg_zpz, sqabs_fns[a->esz], a, 0)
55
56
-static bool trans_SQABS(DisasContext *s, arg_rpr_esz *a)
57
-{
58
- static gen_helper_gvec_3 * const fns[4] = {
59
- gen_helper_sve2_sqabs_b, gen_helper_sve2_sqabs_h,
60
- gen_helper_sve2_sqabs_s, gen_helper_sve2_sqabs_d,
61
- };
62
- return do_sve2_zpz_ool(s, a, fns[a->esz]);
63
-}
64
-
65
-static bool trans_SQNEG(DisasContext *s, arg_rpr_esz *a)
66
-{
67
- static gen_helper_gvec_3 * const fns[4] = {
68
- gen_helper_sve2_sqneg_b, gen_helper_sve2_sqneg_h,
69
- gen_helper_sve2_sqneg_s, gen_helper_sve2_sqneg_d,
70
- };
71
- return do_sve2_zpz_ool(s, a, fns[a->esz]);
72
-}
73
+static gen_helper_gvec_3 * const sqneg_fns[4] = {
74
+ gen_helper_sve2_sqneg_b, gen_helper_sve2_sqneg_h,
75
+ gen_helper_sve2_sqneg_s, gen_helper_sve2_sqneg_d,
76
+};
77
+TRANS_FEAT(SQNEG, aa64_sve2, gen_gvec_ool_arg_zpz, sqneg_fns[a->esz], a, 0)
78
79
#define DO_SVE2_ZPZZ(NAME, name) \
80
static bool trans_##NAME(DisasContext *s, arg_rprr_esz *a) \
81
--
82
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Initialize the keys to a non-zero value on process start.
3
Rename the function to match gen_gvec_ool_arg_zpz,
4
and move to be adjacent.
4
5
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-24-richard.henderson@linaro.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
10
---
9
linux-user/aarch64/target_syscall.h | 2 ++
11
target/arm/translate-sve.c | 29 ++++++++++++++---------------
10
linux-user/aarch64/cpu_loop.c | 31 +++++++++++++++++++++++++++--
12
1 file changed, 14 insertions(+), 15 deletions(-)
11
2 files changed, 31 insertions(+), 2 deletions(-)
12
13
13
diff --git a/linux-user/aarch64/target_syscall.h b/linux-user/aarch64/target_syscall.h
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/linux-user/aarch64/target_syscall.h
16
--- a/target/arm/translate-sve.c
16
+++ b/linux-user/aarch64/target_syscall.h
17
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ struct target_pt_regs {
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpz(DisasContext *s, gen_helper_gvec_3 *fn,
18
#define TARGET_PR_SVE_SET_VL 50
19
return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, data);
19
#define TARGET_PR_SVE_GET_VL 51
20
}
20
21
21
+void arm_init_pauth_key(ARMPACKey *key);
22
+static bool gen_gvec_ool_arg_zpzi(DisasContext *s, gen_helper_gvec_3 *fn,
22
+
23
+ arg_rpri_esz *a)
23
#endif /* AARCH64_TARGET_SYSCALL_H */
24
+{
24
diff --git a/linux-user/aarch64/cpu_loop.c b/linux-user/aarch64/cpu_loop.c
25
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
25
index XXXXXXX..XXXXXXX 100644
26
+}
26
--- a/linux-user/aarch64/cpu_loop.c
27
27
+++ b/linux-user/aarch64/cpu_loop.c
28
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
28
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
29
static void gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
30
@@ -XXX,XX +XXX,XX @@ static bool do_movz_zpz(DisasContext *s, int rd, int rn, int pg,
31
return gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
32
}
33
34
-static bool do_zpzi_ool(DisasContext *s, arg_rpri_esz *a,
35
- gen_helper_gvec_3 *fn)
36
-{
37
- return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
38
-}
39
-
40
static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
41
{
42
static gen_helper_gvec_3 * const fns[4] = {
43
@@ -XXX,XX +XXX,XX @@ static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
44
/* Shift by element size is architecturally valid. For
45
arithmetic right-shift, it's the same as by one less. */
46
a->imm = MIN(a->imm, (8 << a->esz) - 1);
47
- return do_zpzi_ool(s, a, fns[a->esz]);
48
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
49
}
50
51
static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
52
@@ -XXX,XX +XXX,XX @@ static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
53
if (a->imm >= (8 << a->esz)) {
54
return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
55
} else {
56
- return do_zpzi_ool(s, a, fns[a->esz]);
57
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
29
}
58
}
30
}
59
}
31
60
32
+static uint64_t arm_rand64(void)
61
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
33
+{
62
if (a->imm >= (8 << a->esz)) {
34
+ int shift = 64 - clz64(RAND_MAX);
63
return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
35
+ int i, n = 64 / shift + (64 % shift != 0);
64
} else {
36
+ uint64_t ret = 0;
65
- return do_zpzi_ool(s, a, fns[a->esz]);
37
+
66
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
38
+ for (i = 0; i < n; i++) {
39
+ ret = (ret << shift) | rand();
40
+ }
41
+ return ret;
42
+}
43
+
44
+void arm_init_pauth_key(ARMPACKey *key)
45
+{
46
+ key->lo = arm_rand64();
47
+ key->hi = arm_rand64();
48
+}
49
+
50
void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs)
51
{
52
- CPUState *cpu = ENV_GET_CPU(env);
53
- TaskState *ts = cpu->opaque;
54
+ ARMCPU *cpu = arm_env_get_cpu(env);
55
+ CPUState *cs = CPU(cpu);
56
+ TaskState *ts = cs->opaque;
57
struct image_info *info = ts->info;
58
int i;
59
60
@@ -XXX,XX +XXX,XX @@ void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs)
61
}
67
}
62
#endif
68
}
63
69
64
+ if (cpu_isar_feature(aa64_pauth, cpu)) {
70
@@ -XXX,XX +XXX,XX @@ static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
65
+ arm_init_pauth_key(&env->apia_key);
71
if (a->imm >= (8 << a->esz)) {
66
+ arm_init_pauth_key(&env->apib_key);
72
return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
67
+ arm_init_pauth_key(&env->apda_key);
73
} else {
68
+ arm_init_pauth_key(&env->apdb_key);
74
- return do_zpzi_ool(s, a, fns[a->esz]);
69
+ arm_init_pauth_key(&env->apga_key);
75
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
70
+ }
76
}
71
+
77
}
72
ts->stack_base = info->start_stack;
78
73
ts->heap_base = info->brk;
79
@@ -XXX,XX +XXX,XX @@ static bool trans_SQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
74
/* This will be filled in on the first SYS_HEAPINFO call. */
80
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
81
return false;
82
}
83
- return do_zpzi_ool(s, a, fns[a->esz]);
84
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
85
}
86
87
static bool trans_UQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
88
@@ -XXX,XX +XXX,XX @@ static bool trans_UQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
89
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
90
return false;
91
}
92
- return do_zpzi_ool(s, a, fns[a->esz]);
93
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
94
}
95
96
static bool trans_SRSHR(DisasContext *s, arg_rpri_esz *a)
97
@@ -XXX,XX +XXX,XX @@ static bool trans_SRSHR(DisasContext *s, arg_rpri_esz *a)
98
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
99
return false;
100
}
101
- return do_zpzi_ool(s, a, fns[a->esz]);
102
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
103
}
104
105
static bool trans_URSHR(DisasContext *s, arg_rpri_esz *a)
106
@@ -XXX,XX +XXX,XX @@ static bool trans_URSHR(DisasContext *s, arg_rpri_esz *a)
107
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
108
return false;
109
}
110
- return do_zpzi_ool(s, a, fns[a->esz]);
111
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
112
}
113
114
static bool trans_SQSHLU(DisasContext *s, arg_rpri_esz *a)
115
@@ -XXX,XX +XXX,XX @@ static bool trans_SQSHLU(DisasContext *s, arg_rpri_esz *a)
116
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
117
return false;
118
}
119
- return do_zpzi_ool(s, a, fns[a->esz]);
120
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
121
}
122
123
/*
75
--
124
--
76
2.20.1
125
2.25.1
77
78
diff view generated by jsdifflib
1
Add unimplemented-device stubs for the various Power Policy Unit
1
From: Richard Henderson <richard.henderson@linaro.org>
2
devices that the SSE-200 has.
3
2
3
Convert some SVE translation functions using
4
gen_gvec_ool_arg_zpzi to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-25-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20190121185118.18550-17-peter.maydell@linaro.org
7
---
10
---
8
include/hw/arm/armsse.h | 11 ++++++++
11
target/arm/translate-sve.c | 85 ++++++++++++++------------------------
9
hw/arm/armsse.c | 58 +++++++++++++++++++++++++++++++++++++++++
12
1 file changed, 30 insertions(+), 55 deletions(-)
10
2 files changed, 69 insertions(+)
11
13
12
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/include/hw/arm/armsse.h
16
--- a/target/arm/translate-sve.c
15
+++ b/include/hw/arm/armsse.h
17
+++ b/target/arm/translate-sve.c
16
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
17
18
#define SSE_MAX_CPUS 2
19
20
+/* These define what each PPU in the ppu[] index is for */
21
+#define CPU0CORE_PPU 0
22
+#define CPU1CORE_PPU 1
23
+#define DBG_PPU 2
24
+#define RAM0_PPU 3
25
+#define RAM1_PPU 4
26
+#define RAM2_PPU 5
27
+#define RAM3_PPU 6
28
+#define NUM_PPUS 7
29
+
30
typedef struct ARMSSE {
31
/*< private >*/
32
SysBusDevice parent_obj;
33
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
34
IoTKitSysCtl sysinfo;
35
36
UnimplementedDeviceState mhu[2];
37
+ UnimplementedDeviceState ppu[NUM_PPUS];
38
39
/*
40
* 'container' holds all devices seen by all CPUs.
41
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
42
index XXXXXXX..XXXXXXX 100644
43
--- a/hw/arm/armsse.c
44
+++ b/hw/arm/armsse.c
45
@@ -XXX,XX +XXX,XX @@ struct ARMSSEInfo {
46
uint32_t sys_version;
47
SysConfigFormat sys_config_format;
48
bool has_mhus;
49
+ bool has_ppus;
50
};
51
52
static const ARMSSEInfo armsse_variants[] = {
53
@@ -XXX,XX +XXX,XX @@ static const ARMSSEInfo armsse_variants[] = {
54
.sys_version = 0x41743,
55
.sys_config_format = IoTKitFormat,
56
.has_mhus = false,
57
+ .has_ppus = false,
58
},
59
};
60
61
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
62
sysbus_init_child_obj(obj, "mhu1", &s->mhu[1], sizeof(s->mhu[1]),
63
TYPE_UNIMPLEMENTED_DEVICE);
64
}
65
+ if (info->has_ppus) {
66
+ for (i = 0; i < info->num_cpus; i++) {
67
+ char *name = g_strdup_printf("CPU%dCORE_PPU", i);
68
+ int ppuidx = CPU0CORE_PPU + i;
69
+
70
+ sysbus_init_child_obj(obj, name, &s->ppu[ppuidx],
71
+ sizeof(s->ppu[ppuidx]),
72
+ TYPE_UNIMPLEMENTED_DEVICE);
73
+ g_free(name);
74
+ }
75
+ sysbus_init_child_obj(obj, "DBG_PPU", &s->ppu[DBG_PPU],
76
+ sizeof(s->ppu[DBG_PPU]),
77
+ TYPE_UNIMPLEMENTED_DEVICE);
78
+ for (i = 0; i < info->sram_banks; i++) {
79
+ char *name = g_strdup_printf("RAM%d_PPU", i);
80
+ int ppuidx = RAM0_PPU + i;
81
+
82
+ sysbus_init_child_obj(obj, name, &s->ppu[ppuidx],
83
+ sizeof(s->ppu[ppuidx]),
84
+ TYPE_UNIMPLEMENTED_DEVICE);
85
+ g_free(name);
86
+ }
87
+ }
88
object_initialize_child(obj, "nmi-orgate", &s->nmi_orgate,
89
sizeof(s->nmi_orgate), TYPE_OR_IRQ,
90
&error_abort, NULL);
91
@@ -XXX,XX +XXX,XX @@ static qemu_irq armsse_get_common_irq_in(ARMSSE *s, int irqno)
92
}
19
}
93
}
20
}
94
21
95
+static void map_ppu(ARMSSE *s, int ppuidx, const char *name, hwaddr addr)
22
-static bool trans_SQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
96
+{
23
-{
97
+ /* Map a PPU unimplemented device stub */
24
- static gen_helper_gvec_3 * const fns[4] = {
98
+ DeviceState *dev = DEVICE(&s->ppu[ppuidx]);
25
- gen_helper_sve2_sqshl_zpzi_b, gen_helper_sve2_sqshl_zpzi_h,
99
+
26
- gen_helper_sve2_sqshl_zpzi_s, gen_helper_sve2_sqshl_zpzi_d,
100
+ qdev_prop_set_string(dev, "name", name);
27
- };
101
+ qdev_prop_set_uint64(dev, "size", 0x1000);
28
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
102
+ qdev_init_nofail(dev);
29
- return false;
103
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->ppu[ppuidx]), 0, addr);
30
- }
104
+}
31
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
105
+
32
-}
106
static void armsse_realize(DeviceState *dev, Error **errp)
33
+static gen_helper_gvec_3 * const sqshl_zpzi_fns[4] = {
107
{
34
+ gen_helper_sve2_sqshl_zpzi_b, gen_helper_sve2_sqshl_zpzi_h,
108
ARMSSE *s = ARMSSE(dev);
35
+ gen_helper_sve2_sqshl_zpzi_s, gen_helper_sve2_sqshl_zpzi_d,
109
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
36
+};
110
}
37
+TRANS_FEAT(SQSHL_zpzi, aa64_sve2, gen_gvec_ool_arg_zpzi,
111
sysbus_mmio_map(SYS_BUS_DEVICE(&s->sysctl), 0, 0x50021000);
38
+ a->esz < 0 ? NULL : sqshl_zpzi_fns[a->esz], a)
112
39
113
+ if (info->has_ppus) {
40
-static bool trans_UQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
114
+ /* CPUnCORE_PPU for each CPU */
41
-{
115
+ for (i = 0; i < info->num_cpus; i++) {
42
- static gen_helper_gvec_3 * const fns[4] = {
116
+ char *name = g_strdup_printf("CPU%dCORE_PPU", i);
43
- gen_helper_sve2_uqshl_zpzi_b, gen_helper_sve2_uqshl_zpzi_h,
117
+
44
- gen_helper_sve2_uqshl_zpzi_s, gen_helper_sve2_uqshl_zpzi_d,
118
+ map_ppu(s, CPU0CORE_PPU + i, name, 0x50023000 + i * 0x2000);
45
- };
119
+ /*
46
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
120
+ * We don't support CPU debug so don't create the
47
- return false;
121
+ * CPU0DEBUG_PPU at 0x50024000 and 0x50026000.
48
- }
122
+ */
49
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
123
+ g_free(name);
50
-}
124
+ }
51
+static gen_helper_gvec_3 * const uqshl_zpzi_fns[4] = {
125
+ map_ppu(s, DBG_PPU, "DBG_PPU", 0x50029000);
52
+ gen_helper_sve2_uqshl_zpzi_b, gen_helper_sve2_uqshl_zpzi_h,
126
+
53
+ gen_helper_sve2_uqshl_zpzi_s, gen_helper_sve2_uqshl_zpzi_d,
127
+ for (i = 0; i < info->sram_banks; i++) {
54
+};
128
+ char *name = g_strdup_printf("RAM%d_PPU", i);
55
+TRANS_FEAT(UQSHL_zpzi, aa64_sve2, gen_gvec_ool_arg_zpzi,
129
+
56
+ a->esz < 0 ? NULL : uqshl_zpzi_fns[a->esz], a)
130
+ map_ppu(s, RAM0_PPU + i, name, 0x5002a000 + i * 0x1000);
57
131
+ g_free(name);
58
-static bool trans_SRSHR(DisasContext *s, arg_rpri_esz *a)
132
+ }
59
-{
133
+ }
60
- static gen_helper_gvec_3 * const fns[4] = {
134
+
61
- gen_helper_sve2_srshr_b, gen_helper_sve2_srshr_h,
135
/* This OR gate wires together outputs from the secure watchdogs to NMI */
62
- gen_helper_sve2_srshr_s, gen_helper_sve2_srshr_d,
136
object_property_set_int(OBJECT(&s->nmi_orgate), 2, "num-lines", &err);
63
- };
137
if (err) {
64
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
65
- return false;
66
- }
67
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
68
-}
69
+static gen_helper_gvec_3 * const srshr_fns[4] = {
70
+ gen_helper_sve2_srshr_b, gen_helper_sve2_srshr_h,
71
+ gen_helper_sve2_srshr_s, gen_helper_sve2_srshr_d,
72
+};
73
+TRANS_FEAT(SRSHR, aa64_sve2, gen_gvec_ool_arg_zpzi,
74
+ a->esz < 0 ? NULL : srshr_fns[a->esz], a)
75
76
-static bool trans_URSHR(DisasContext *s, arg_rpri_esz *a)
77
-{
78
- static gen_helper_gvec_3 * const fns[4] = {
79
- gen_helper_sve2_urshr_b, gen_helper_sve2_urshr_h,
80
- gen_helper_sve2_urshr_s, gen_helper_sve2_urshr_d,
81
- };
82
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
83
- return false;
84
- }
85
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
86
-}
87
+static gen_helper_gvec_3 * const urshr_fns[4] = {
88
+ gen_helper_sve2_urshr_b, gen_helper_sve2_urshr_h,
89
+ gen_helper_sve2_urshr_s, gen_helper_sve2_urshr_d,
90
+};
91
+TRANS_FEAT(URSHR, aa64_sve2, gen_gvec_ool_arg_zpzi,
92
+ a->esz < 0 ? NULL : urshr_fns[a->esz], a)
93
94
-static bool trans_SQSHLU(DisasContext *s, arg_rpri_esz *a)
95
-{
96
- static gen_helper_gvec_3 * const fns[4] = {
97
- gen_helper_sve2_sqshlu_b, gen_helper_sve2_sqshlu_h,
98
- gen_helper_sve2_sqshlu_s, gen_helper_sve2_sqshlu_d,
99
- };
100
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
101
- return false;
102
- }
103
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
104
-}
105
+static gen_helper_gvec_3 * const sqshlu_fns[4] = {
106
+ gen_helper_sve2_sqshlu_b, gen_helper_sve2_sqshlu_h,
107
+ gen_helper_sve2_sqshlu_s, gen_helper_sve2_sqshlu_d,
108
+};
109
+TRANS_FEAT(SQSHLU, aa64_sve2, gen_gvec_ool_arg_zpzi,
110
+ a->esz < 0 ? NULL : sqshlu_fns[a->esz], a)
111
112
/*
113
*** SVE Bitwise Shift - Predicated Group
138
--
114
--
139
2.20.1
115
2.25.1
140
141
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-26-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 42 ++++++++++++++++----------------------
9
1 file changed, 18 insertions(+), 24 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzi(DisasContext *s, gen_helper_gvec_3 *fn,
16
}
17
18
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
19
-static void gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
20
+static bool gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
21
int rd, int rn, int rm, int pg, int data)
22
{
23
- unsigned vsz = vec_full_reg_size(s);
24
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
25
- vec_full_reg_offset(s, rn),
26
- vec_full_reg_offset(s, rm),
27
- pred_full_reg_offset(s, pg),
28
- vsz, vsz, data, fn);
29
+ if (fn == NULL) {
30
+ return false;
31
+ }
32
+ if (sve_access_check(s)) {
33
+ unsigned vsz = vec_full_reg_size(s);
34
+ tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
35
+ vec_full_reg_offset(s, rn),
36
+ vec_full_reg_offset(s, rm),
37
+ pred_full_reg_offset(s, pg),
38
+ vsz, vsz, data, fn);
39
+ }
40
+ return true;
41
}
42
43
/* Invoke a vector expander on two Zregs. */
44
@@ -XXX,XX +XXX,XX @@ static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
45
46
static bool do_zpzz_ool(DisasContext *s, arg_rprr_esz *a, gen_helper_gvec_4 *fn)
47
{
48
- if (fn == NULL) {
49
- return false;
50
- }
51
- if (sve_access_check(s)) {
52
- gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, 0);
53
- }
54
- return true;
55
+ return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, 0);
56
}
57
58
/* Select active elememnts from Zn and inactive elements from Zm,
59
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(REVW, aa64_sve, gen_gvec_ool_arg_zpz,
60
61
static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
62
{
63
- if (sve_access_check(s)) {
64
- gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
65
- a->rd, a->rn, a->rm, a->pg, a->esz);
66
- }
67
- return true;
68
+ return gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
69
+ a->rd, a->rn, a->rm, a->pg, a->esz);
70
}
71
72
static bool trans_SPLICE_sve2(DisasContext *s, arg_rpr_esz *a)
73
@@ -XXX,XX +XXX,XX @@ static bool trans_SPLICE_sve2(DisasContext *s, arg_rpr_esz *a)
74
if (!dc_isar_feature(aa64_sve2, s)) {
75
return false;
76
}
77
- if (sve_access_check(s)) {
78
- gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
79
- a->rd, a->rn, (a->rn + 1) % 32, a->pg, a->esz);
80
- }
81
- return true;
82
+ return gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
83
+ a->rd, a->rn, (a->rn + 1) % 32, a->pg, a->esz);
84
}
85
86
/*
87
--
88
2.25.1
diff view generated by jsdifflib
1
In preparation for adding support for the AN521 MPS2 image, we need
1
From: Richard Henderson <richard.henderson@linaro.org>
2
to handle wiring up the MPS2 device interrupt lines to both CPUs in
3
the SSE-200, rather than just the one that the IoTKit has.
4
2
5
Abstract out a "connect to the IoTKit interrupt line" function
3
Use gen_gvec_ool_arg_zpzz instead of gen_gvec_ool_zzzp
6
and make it connect to a splitter which feeds both sets of inputs
4
when the arguments come from arg_rprr_esz.
7
for the SSE-200 case.
5
Replaces do_zpzz_ool.
8
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-27-richard.henderson@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
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20190121185118.18550-23-peter.maydell@linaro.org
12
---
11
---
13
hw/arm/mps2-tz.c | 79 ++++++++++++++++++++++++++++++++++++------------
12
target/arm/translate-sve.c | 21 +++++++++++----------
14
1 file changed, 59 insertions(+), 20 deletions(-)
13
1 file changed, 11 insertions(+), 10 deletions(-)
15
14
16
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/mps2-tz.c
17
--- a/target/arm/translate-sve.c
19
+++ b/hw/arm/mps2-tz.c
18
+++ b/target/arm/translate-sve.c
20
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
21
#include "net/net.h"
20
return true;
22
#include "hw/core/split-irq.h"
23
24
+#define MPS2TZ_NUMIRQ 92
25
+
26
typedef enum MPS2TZFPGAType {
27
FPGA_AN505,
28
+ FPGA_AN521,
29
} MPS2TZFPGAType;
30
31
typedef struct {
32
@@ -XXX,XX +XXX,XX @@ typedef struct {
33
SplitIRQ sec_resp_splitter;
34
qemu_or_irq uart_irq_orgate;
35
DeviceState *lan9118;
36
+ SplitIRQ cpu_irq_splitter[MPS2TZ_NUMIRQ];
37
} MPS2TZMachineState;
38
39
#define TYPE_MPS2TZ_MACHINE "mps2tz"
40
@@ -XXX,XX +XXX,XX @@ static void make_ram_alias(MemoryRegion *mr, const char *name,
41
memory_region_add_subregion(get_system_memory(), base, mr);
42
}
21
}
43
22
44
+static qemu_irq get_sse_irq_in(MPS2TZMachineState *mms, int irqno)
23
+static bool gen_gvec_ool_arg_zpzz(DisasContext *s, gen_helper_gvec_4 *fn,
24
+ arg_rprr_esz *a, int data)
45
+{
25
+{
46
+ /* Return a qemu_irq which will signal IRQ n to all CPUs in the SSE. */
26
+ return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, data);
47
+ MPS2TZMachineClass *mmc = MPS2TZ_MACHINE_GET_CLASS(mms);
48
+
49
+ assert(irqno < MPS2TZ_NUMIRQ);
50
+
51
+ switch (mmc->fpga_type) {
52
+ case FPGA_AN505:
53
+ return qdev_get_gpio_in_named(DEVICE(&mms->iotkit), "EXP_IRQ", irqno);
54
+ case FPGA_AN521:
55
+ return qdev_get_gpio_in(DEVICE(&mms->cpu_irq_splitter[irqno]), 0);
56
+ default:
57
+ g_assert_not_reached();
58
+ }
59
+}
27
+}
60
+
28
+
61
/* Most of the devices in the AN505 FPGA image sit behind
29
/* Invoke a vector expander on two Zregs. */
62
* Peripheral Protection Controllers. These data structures
30
static void gen_gvec_fn_zz(DisasContext *s, GVecGen2Fn *gvec_fn,
63
* define the layout of which devices sit behind which PPCs.
31
int esz, int rd, int rn)
64
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_uart(MPS2TZMachineState *mms, void *opaque,
32
@@ -XXX,XX +XXX,XX @@ static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
65
int txirqno = i * 2 + 1;
33
*** SVE Integer Arithmetic - Binary Predicated Group
66
int combirqno = i + 10;
34
*/
67
SysBusDevice *s;
35
68
- DeviceState *iotkitdev = DEVICE(&mms->iotkit);
36
-static bool do_zpzz_ool(DisasContext *s, arg_rprr_esz *a, gen_helper_gvec_4 *fn)
69
DeviceState *orgate_dev = DEVICE(&mms->uart_irq_orgate);
37
-{
70
38
- return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, 0);
71
sysbus_init_child_obj(OBJECT(mms), name, uart, sizeof(mms->uart[0]),
39
-}
72
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_uart(MPS2TZMachineState *mms, void *opaque,
40
-
73
qdev_prop_set_uint32(DEVICE(uart), "pclk-frq", SYSCLK_FRQ);
41
/* Select active elememnts from Zn and inactive elements from Zm,
74
object_property_set_bool(OBJECT(uart), true, "realized", &error_fatal);
42
* storing the result in Zd.
75
s = SYS_BUS_DEVICE(uart);
43
*/
76
- sysbus_connect_irq(s, 0, qdev_get_gpio_in_named(iotkitdev,
44
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME##_zpzz(DisasContext *s, arg_rprr_esz *a) \
77
- "EXP_IRQ", txirqno));
45
gen_helper_sve_##name##_zpzz_b, gen_helper_sve_##name##_zpzz_h, \
78
- sysbus_connect_irq(s, 1, qdev_get_gpio_in_named(iotkitdev,
46
gen_helper_sve_##name##_zpzz_s, gen_helper_sve_##name##_zpzz_d, \
79
- "EXP_IRQ", rxirqno));
47
}; \
80
+ sysbus_connect_irq(s, 0, get_sse_irq_in(mms, txirqno));
48
- return do_zpzz_ool(s, a, fns[a->esz]); \
81
+ sysbus_connect_irq(s, 1, get_sse_irq_in(mms, rxirqno));
49
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0); \
82
sysbus_connect_irq(s, 2, qdev_get_gpio_in(orgate_dev, i * 2));
83
sysbus_connect_irq(s, 3, qdev_get_gpio_in(orgate_dev, i * 2 + 1));
84
- sysbus_connect_irq(s, 4, qdev_get_gpio_in_named(iotkitdev,
85
- "EXP_IRQ", combirqno));
86
+ sysbus_connect_irq(s, 4, get_sse_irq_in(mms, combirqno));
87
return sysbus_mmio_get_region(SYS_BUS_DEVICE(uart), 0);
88
}
50
}
89
51
90
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_eth_dev(MPS2TZMachineState *mms, void *opaque,
52
DO_ZPZZ(AND, and)
91
const char *name, hwaddr size)
53
@@ -XXX,XX +XXX,XX @@ static bool trans_SDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
92
{
54
static gen_helper_gvec_4 * const fns[4] = {
93
SysBusDevice *s;
55
NULL, NULL, gen_helper_sve_sdiv_zpzz_s, gen_helper_sve_sdiv_zpzz_d
94
- DeviceState *iotkitdev = DEVICE(&mms->iotkit);
56
};
95
NICInfo *nd = &nd_table[0];
57
- return do_zpzz_ool(s, a, fns[a->esz]);
96
58
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0);
97
/* In hardware this is a LAN9220; the LAN9118 is software compatible
98
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_eth_dev(MPS2TZMachineState *mms, void *opaque,
99
qdev_init_nofail(mms->lan9118);
100
101
s = SYS_BUS_DEVICE(mms->lan9118);
102
- sysbus_connect_irq(s, 0, qdev_get_gpio_in_named(iotkitdev, "EXP_IRQ", 16));
103
+ sysbus_connect_irq(s, 0, get_sse_irq_in(mms, 16));
104
return sysbus_mmio_get_region(s, 0);
105
}
59
}
106
60
107
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_dma(MPS2TZMachineState *mms, void *opaque,
61
static bool trans_UDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
108
62
@@ -XXX,XX +XXX,XX @@ static bool trans_UDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
109
s = SYS_BUS_DEVICE(dma);
63
static gen_helper_gvec_4 * const fns[4] = {
110
/* Wire up DMACINTR, DMACINTERR, DMACINTTC */
64
NULL, NULL, gen_helper_sve_udiv_zpzz_s, gen_helper_sve_udiv_zpzz_d
111
- sysbus_connect_irq(s, 0, qdev_get_gpio_in_named(iotkitdev,
65
};
112
- "EXP_IRQ", 58 + i * 3));
66
- return do_zpzz_ool(s, a, fns[a->esz]);
113
- sysbus_connect_irq(s, 1, qdev_get_gpio_in_named(iotkitdev,
67
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0);
114
- "EXP_IRQ", 56 + i * 3));
115
- sysbus_connect_irq(s, 2, qdev_get_gpio_in_named(iotkitdev,
116
- "EXP_IRQ", 57 + i * 3));
117
+ sysbus_connect_irq(s, 0, get_sse_irq_in(mms, 58 + i * 3));
118
+ sysbus_connect_irq(s, 1, get_sse_irq_in(mms, 56 + i * 3));
119
+ sysbus_connect_irq(s, 2, get_sse_irq_in(mms, 57 + i * 3));
120
121
g_free(mscname);
122
return sysbus_mmio_get_region(s, 0);
123
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_spi(MPS2TZMachineState *mms, void *opaque,
124
*/
125
PL022State *spi = opaque;
126
int i = spi - &mms->spi[0];
127
- DeviceState *iotkitdev = DEVICE(&mms->iotkit);
128
SysBusDevice *s;
129
130
sysbus_init_child_obj(OBJECT(mms), name, spi, sizeof(mms->spi[0]),
131
TYPE_PL022);
132
object_property_set_bool(OBJECT(spi), true, "realized", &error_fatal);
133
s = SYS_BUS_DEVICE(spi);
134
- sysbus_connect_irq(s, 0,
135
- qdev_get_gpio_in_named(iotkitdev, "EXP_IRQ", 51 + i));
136
+ sysbus_connect_irq(s, 0, get_sse_irq_in(mms, 51 + i));
137
return sysbus_mmio_get_region(s, 0);
138
}
68
}
139
69
140
static void mps2tz_common_init(MachineState *machine)
70
static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
141
{
71
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME##_zpzw(DisasContext *s, arg_rprr_esz *a) \
142
MPS2TZMachineState *mms = MPS2TZ_MACHINE(machine);
72
if (a->esz < 0 || a->esz >= 3) { \
143
+ MPS2TZMachineClass *mmc = MPS2TZ_MACHINE_GET_CLASS(mms);
73
return false; \
144
MachineClass *mc = MACHINE_GET_CLASS(machine);
74
} \
145
MemoryRegion *system_memory = get_system_memory();
75
- return do_zpzz_ool(s, a, fns[a->esz]); \
146
DeviceState *iotkitdev;
76
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0); \
147
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
77
}
148
iotkitdev = DEVICE(&mms->iotkit);
78
149
object_property_set_link(OBJECT(&mms->iotkit), OBJECT(system_memory),
79
DO_ZPZW(ASR, asr)
150
"memory", &error_abort);
80
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zpzz_ool(DisasContext *s, arg_rprr_esz *a,
151
- qdev_prop_set_uint32(iotkitdev, "EXP_NUMIRQ", 92);
81
if (!dc_isar_feature(aa64_sve2, s)) {
152
+ qdev_prop_set_uint32(iotkitdev, "EXP_NUMIRQ", MPS2TZ_NUMIRQ);
82
return false;
153
qdev_prop_set_uint32(iotkitdev, "MAINCLK", SYSCLK_FRQ);
83
}
154
object_property_set_bool(OBJECT(&mms->iotkit), true, "realized",
84
- return do_zpzz_ool(s, a, fn);
155
&error_fatal);
85
+ return gen_gvec_ool_arg_zpzz(s, fn, a, 0);
156
86
}
157
+ /*
87
158
+ * The AN521 needs us to create splitters to feed the IRQ inputs
88
static bool trans_SADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
159
+ * for each CPU in the SSE-200 from each device in the board.
160
+ */
161
+ if (mmc->fpga_type == FPGA_AN521) {
162
+ for (i = 0; i < MPS2TZ_NUMIRQ; i++) {
163
+ char *name = g_strdup_printf("mps2-irq-splitter%d", i);
164
+ SplitIRQ *splitter = &mms->cpu_irq_splitter[i];
165
+
166
+ object_initialize_child(OBJECT(machine), name,
167
+ splitter, sizeof(*splitter),
168
+ TYPE_SPLIT_IRQ, &error_fatal, NULL);
169
+ g_free(name);
170
+
171
+ object_property_set_int(OBJECT(splitter), 2, "num-lines",
172
+ &error_fatal);
173
+ object_property_set_bool(OBJECT(splitter), true, "realized",
174
+ &error_fatal);
175
+ qdev_connect_gpio_out(DEVICE(splitter), 0,
176
+ qdev_get_gpio_in_named(DEVICE(&mms->iotkit),
177
+ "EXP_IRQ", i));
178
+ qdev_connect_gpio_out(DEVICE(splitter), 1,
179
+ qdev_get_gpio_in_named(DEVICE(&mms->iotkit),
180
+ "EXP_CPU1_IRQ", i));
181
+ }
182
+ }
183
+
184
/* The sec_resp_cfg output from the IoTKit must be split into multiple
185
* lines, one for each of the PPCs we create here, plus one per MSC.
186
*/
187
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
188
object_property_set_bool(OBJECT(&mms->uart_irq_orgate), true,
189
"realized", &error_fatal);
190
qdev_connect_gpio_out(DEVICE(&mms->uart_irq_orgate), 0,
191
- qdev_get_gpio_in_named(iotkitdev, "EXP_IRQ", 15));
192
+ get_sse_irq_in(mms, 15));
193
194
/* Most of the devices in the FPGA are behind Peripheral Protection
195
* Controllers. The required order for initializing things is:
196
--
89
--
197
2.20.1
90
2.25.1
198
199
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions directly using
4
gen_gvec_ool_arg_zpzz to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-28-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 85 ++++++++++++++++----------------------
12
1 file changed, 36 insertions(+), 49 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static void do_sel_z(DisasContext *s, int rd, int rn, int rm, int pg, int esz)
19
gen_gvec_ool_zzzp(s, fns[esz], rd, rn, rm, pg, 0);
20
}
21
22
-#define DO_ZPZZ(NAME, name) \
23
-static bool trans_##NAME##_zpzz(DisasContext *s, arg_rprr_esz *a) \
24
-{ \
25
- static gen_helper_gvec_4 * const fns[4] = { \
26
- gen_helper_sve_##name##_zpzz_b, gen_helper_sve_##name##_zpzz_h, \
27
- gen_helper_sve_##name##_zpzz_s, gen_helper_sve_##name##_zpzz_d, \
28
+#define DO_ZPZZ(NAME, FEAT, name) \
29
+ static gen_helper_gvec_4 * const name##_zpzz_fns[4] = { \
30
+ gen_helper_##name##_zpzz_b, gen_helper_##name##_zpzz_h, \
31
+ gen_helper_##name##_zpzz_s, gen_helper_##name##_zpzz_d, \
32
}; \
33
- return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0); \
34
-}
35
+ TRANS_FEAT(NAME, FEAT, gen_gvec_ool_arg_zpzz, \
36
+ name##_zpzz_fns[a->esz], a, 0)
37
38
-DO_ZPZZ(AND, and)
39
-DO_ZPZZ(EOR, eor)
40
-DO_ZPZZ(ORR, orr)
41
-DO_ZPZZ(BIC, bic)
42
+DO_ZPZZ(AND_zpzz, aa64_sve, sve_and)
43
+DO_ZPZZ(EOR_zpzz, aa64_sve, sve_eor)
44
+DO_ZPZZ(ORR_zpzz, aa64_sve, sve_orr)
45
+DO_ZPZZ(BIC_zpzz, aa64_sve, sve_bic)
46
47
-DO_ZPZZ(ADD, add)
48
-DO_ZPZZ(SUB, sub)
49
+DO_ZPZZ(ADD_zpzz, aa64_sve, sve_add)
50
+DO_ZPZZ(SUB_zpzz, aa64_sve, sve_sub)
51
52
-DO_ZPZZ(SMAX, smax)
53
-DO_ZPZZ(UMAX, umax)
54
-DO_ZPZZ(SMIN, smin)
55
-DO_ZPZZ(UMIN, umin)
56
-DO_ZPZZ(SABD, sabd)
57
-DO_ZPZZ(UABD, uabd)
58
+DO_ZPZZ(SMAX_zpzz, aa64_sve, sve_smax)
59
+DO_ZPZZ(UMAX_zpzz, aa64_sve, sve_umax)
60
+DO_ZPZZ(SMIN_zpzz, aa64_sve, sve_smin)
61
+DO_ZPZZ(UMIN_zpzz, aa64_sve, sve_umin)
62
+DO_ZPZZ(SABD_zpzz, aa64_sve, sve_sabd)
63
+DO_ZPZZ(UABD_zpzz, aa64_sve, sve_uabd)
64
65
-DO_ZPZZ(MUL, mul)
66
-DO_ZPZZ(SMULH, smulh)
67
-DO_ZPZZ(UMULH, umulh)
68
+DO_ZPZZ(MUL_zpzz, aa64_sve, sve_mul)
69
+DO_ZPZZ(SMULH_zpzz, aa64_sve, sve_smulh)
70
+DO_ZPZZ(UMULH_zpzz, aa64_sve, sve_umulh)
71
72
-DO_ZPZZ(ASR, asr)
73
-DO_ZPZZ(LSR, lsr)
74
-DO_ZPZZ(LSL, lsl)
75
+DO_ZPZZ(ASR_zpzz, aa64_sve, sve_asr)
76
+DO_ZPZZ(LSR_zpzz, aa64_sve, sve_lsr)
77
+DO_ZPZZ(LSL_zpzz, aa64_sve, sve_lsl)
78
79
-static bool trans_SDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
80
-{
81
- static gen_helper_gvec_4 * const fns[4] = {
82
- NULL, NULL, gen_helper_sve_sdiv_zpzz_s, gen_helper_sve_sdiv_zpzz_d
83
- };
84
- return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0);
85
-}
86
+static gen_helper_gvec_4 * const sdiv_fns[4] = {
87
+ NULL, NULL, gen_helper_sve_sdiv_zpzz_s, gen_helper_sve_sdiv_zpzz_d
88
+};
89
+TRANS_FEAT(SDIV_zpzz, aa64_sve, gen_gvec_ool_arg_zpzz, sdiv_fns[a->esz], a, 0)
90
91
-static bool trans_UDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
92
-{
93
- static gen_helper_gvec_4 * const fns[4] = {
94
- NULL, NULL, gen_helper_sve_udiv_zpzz_s, gen_helper_sve_udiv_zpzz_d
95
- };
96
- return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0);
97
-}
98
+static gen_helper_gvec_4 * const udiv_fns[4] = {
99
+ NULL, NULL, gen_helper_sve_udiv_zpzz_s, gen_helper_sve_udiv_zpzz_d
100
+};
101
+TRANS_FEAT(UDIV_zpzz, aa64_sve, gen_gvec_ool_arg_zpzz, udiv_fns[a->esz], a, 0)
102
103
static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
104
{
105
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SQSHLU, aa64_sve2, gen_gvec_ool_arg_zpzi,
106
*/
107
108
#define DO_ZPZW(NAME, name) \
109
-static bool trans_##NAME##_zpzw(DisasContext *s, arg_rprr_esz *a) \
110
-{ \
111
- static gen_helper_gvec_4 * const fns[3] = { \
112
+ static gen_helper_gvec_4 * const name##_zpzw_fns[4] = { \
113
gen_helper_sve_##name##_zpzw_b, gen_helper_sve_##name##_zpzw_h, \
114
- gen_helper_sve_##name##_zpzw_s, \
115
+ gen_helper_sve_##name##_zpzw_s, NULL \
116
}; \
117
- if (a->esz < 0 || a->esz >= 3) { \
118
- return false; \
119
- } \
120
- return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0); \
121
-}
122
+ TRANS_FEAT(NAME##_zpzw, aa64_sve, gen_gvec_ool_arg_zpzz, \
123
+ a->esz < 0 ? NULL : name##_zpzw_fns[a->esz], a, 0)
124
125
DO_ZPZW(ASR, asr)
126
DO_ZPZW(LSR, lsr)
127
--
128
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions using do_sve2_zpzz_ool
4
to use TRANS_FEAT and gen_gvec_ool_arg_zpzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-29-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 118 +++++++++++++------------------------
12
1 file changed, 40 insertions(+), 78 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
19
return true;
20
}
21
22
-#undef DO_ZPZZ
23
-
24
/*
25
*** SVE Integer Arithmetic - Unary Predicated Group
26
*/
27
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SQRDMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
28
* SVE2 Integer - Predicated
29
*/
30
31
-static bool do_sve2_zpzz_ool(DisasContext *s, arg_rprr_esz *a,
32
- gen_helper_gvec_4 *fn)
33
-{
34
- if (!dc_isar_feature(aa64_sve2, s)) {
35
- return false;
36
- }
37
- return gen_gvec_ool_arg_zpzz(s, fn, a, 0);
38
-}
39
+static gen_helper_gvec_4 * const sadlp_fns[4] = {
40
+ NULL, gen_helper_sve2_sadalp_zpzz_h,
41
+ gen_helper_sve2_sadalp_zpzz_s, gen_helper_sve2_sadalp_zpzz_d,
42
+};
43
+TRANS_FEAT(SADALP_zpzz, aa64_sve2, gen_gvec_ool_arg_zpzz,
44
+ sadlp_fns[a->esz], a, 0)
45
46
-static bool trans_SADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
47
-{
48
- static gen_helper_gvec_4 * const fns[3] = {
49
- gen_helper_sve2_sadalp_zpzz_h,
50
- gen_helper_sve2_sadalp_zpzz_s,
51
- gen_helper_sve2_sadalp_zpzz_d,
52
- };
53
- if (a->esz == 0) {
54
- return false;
55
- }
56
- return do_sve2_zpzz_ool(s, a, fns[a->esz - 1]);
57
-}
58
-
59
-static bool trans_UADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
60
-{
61
- static gen_helper_gvec_4 * const fns[3] = {
62
- gen_helper_sve2_uadalp_zpzz_h,
63
- gen_helper_sve2_uadalp_zpzz_s,
64
- gen_helper_sve2_uadalp_zpzz_d,
65
- };
66
- if (a->esz == 0) {
67
- return false;
68
- }
69
- return do_sve2_zpzz_ool(s, a, fns[a->esz - 1]);
70
-}
71
+static gen_helper_gvec_4 * const uadlp_fns[4] = {
72
+ NULL, gen_helper_sve2_uadalp_zpzz_h,
73
+ gen_helper_sve2_uadalp_zpzz_s, gen_helper_sve2_uadalp_zpzz_d,
74
+};
75
+TRANS_FEAT(UADALP_zpzz, aa64_sve2, gen_gvec_ool_arg_zpzz,
76
+ uadlp_fns[a->esz], a, 0)
77
78
/*
79
* SVE2 integer unary operations (predicated)
80
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const sqneg_fns[4] = {
81
};
82
TRANS_FEAT(SQNEG, aa64_sve2, gen_gvec_ool_arg_zpz, sqneg_fns[a->esz], a, 0)
83
84
-#define DO_SVE2_ZPZZ(NAME, name) \
85
-static bool trans_##NAME(DisasContext *s, arg_rprr_esz *a) \
86
-{ \
87
- static gen_helper_gvec_4 * const fns[4] = { \
88
- gen_helper_sve2_##name##_zpzz_b, gen_helper_sve2_##name##_zpzz_h, \
89
- gen_helper_sve2_##name##_zpzz_s, gen_helper_sve2_##name##_zpzz_d, \
90
- }; \
91
- return do_sve2_zpzz_ool(s, a, fns[a->esz]); \
92
-}
93
+DO_ZPZZ(SQSHL, aa64_sve2, sve2_sqshl)
94
+DO_ZPZZ(SQRSHL, aa64_sve2, sve2_sqrshl)
95
+DO_ZPZZ(SRSHL, aa64_sve2, sve2_srshl)
96
97
-DO_SVE2_ZPZZ(SQSHL, sqshl)
98
-DO_SVE2_ZPZZ(SQRSHL, sqrshl)
99
-DO_SVE2_ZPZZ(SRSHL, srshl)
100
+DO_ZPZZ(UQSHL, aa64_sve2, sve2_uqshl)
101
+DO_ZPZZ(UQRSHL, aa64_sve2, sve2_uqrshl)
102
+DO_ZPZZ(URSHL, aa64_sve2, sve2_urshl)
103
104
-DO_SVE2_ZPZZ(UQSHL, uqshl)
105
-DO_SVE2_ZPZZ(UQRSHL, uqrshl)
106
-DO_SVE2_ZPZZ(URSHL, urshl)
107
+DO_ZPZZ(SHADD, aa64_sve2, sve2_shadd)
108
+DO_ZPZZ(SRHADD, aa64_sve2, sve2_srhadd)
109
+DO_ZPZZ(SHSUB, aa64_sve2, sve2_shsub)
110
111
-DO_SVE2_ZPZZ(SHADD, shadd)
112
-DO_SVE2_ZPZZ(SRHADD, srhadd)
113
-DO_SVE2_ZPZZ(SHSUB, shsub)
114
+DO_ZPZZ(UHADD, aa64_sve2, sve2_uhadd)
115
+DO_ZPZZ(URHADD, aa64_sve2, sve2_urhadd)
116
+DO_ZPZZ(UHSUB, aa64_sve2, sve2_uhsub)
117
118
-DO_SVE2_ZPZZ(UHADD, uhadd)
119
-DO_SVE2_ZPZZ(URHADD, urhadd)
120
-DO_SVE2_ZPZZ(UHSUB, uhsub)
121
+DO_ZPZZ(ADDP, aa64_sve2, sve2_addp)
122
+DO_ZPZZ(SMAXP, aa64_sve2, sve2_smaxp)
123
+DO_ZPZZ(UMAXP, aa64_sve2, sve2_umaxp)
124
+DO_ZPZZ(SMINP, aa64_sve2, sve2_sminp)
125
+DO_ZPZZ(UMINP, aa64_sve2, sve2_uminp)
126
127
-DO_SVE2_ZPZZ(ADDP, addp)
128
-DO_SVE2_ZPZZ(SMAXP, smaxp)
129
-DO_SVE2_ZPZZ(UMAXP, umaxp)
130
-DO_SVE2_ZPZZ(SMINP, sminp)
131
-DO_SVE2_ZPZZ(UMINP, uminp)
132
-
133
-DO_SVE2_ZPZZ(SQADD_zpzz, sqadd)
134
-DO_SVE2_ZPZZ(UQADD_zpzz, uqadd)
135
-DO_SVE2_ZPZZ(SQSUB_zpzz, sqsub)
136
-DO_SVE2_ZPZZ(UQSUB_zpzz, uqsub)
137
-DO_SVE2_ZPZZ(SUQADD, suqadd)
138
-DO_SVE2_ZPZZ(USQADD, usqadd)
139
+DO_ZPZZ(SQADD_zpzz, aa64_sve2, sve2_sqadd)
140
+DO_ZPZZ(UQADD_zpzz, aa64_sve2, sve2_uqadd)
141
+DO_ZPZZ(SQSUB_zpzz, aa64_sve2, sve2_sqsub)
142
+DO_ZPZZ(UQSUB_zpzz, aa64_sve2, sve2_uqsub)
143
+DO_ZPZZ(SUQADD, aa64_sve2, sve2_suqadd)
144
+DO_ZPZZ(USQADD, aa64_sve2, sve2_usqadd)
145
146
/*
147
* SVE2 Widening Integer Arithmetic
148
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rprr_esz *a) \
149
DO_SVE2_PPZZ_MATCH(MATCH, match)
150
DO_SVE2_PPZZ_MATCH(NMATCH, nmatch)
151
152
-static bool trans_HISTCNT(DisasContext *s, arg_rprr_esz *a)
153
-{
154
- static gen_helper_gvec_4 * const fns[2] = {
155
- gen_helper_sve2_histcnt_s, gen_helper_sve2_histcnt_d
156
- };
157
- if (a->esz < 2) {
158
- return false;
159
- }
160
- return do_sve2_zpzz_ool(s, a, fns[a->esz - 2]);
161
-}
162
+static gen_helper_gvec_4 * const histcnt_fns[4] = {
163
+ NULL, NULL, gen_helper_sve2_histcnt_s, gen_helper_sve2_histcnt_d
164
+};
165
+TRANS_FEAT(HISTCNT, aa64_sve2, gen_gvec_ool_arg_zpzz,
166
+ histcnt_fns[a->esz], a, 0)
167
168
TRANS_FEAT(HISTSEG, aa64_sve2, gen_gvec_ool_arg_zzz,
169
a->esz == 0 ? gen_helper_sve2_histseg : NULL, a, 0)
170
--
171
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
There is only one caller for gen_gvec_fn_zz; inline it.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-30-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate-sve.c | 13 +++----------
11
1 file changed, 3 insertions(+), 10 deletions(-)
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzz(DisasContext *s, gen_helper_gvec_4 *fn,
18
return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, data);
19
}
20
21
-/* Invoke a vector expander on two Zregs. */
22
-static void gen_gvec_fn_zz(DisasContext *s, GVecGen2Fn *gvec_fn,
23
- int esz, int rd, int rn)
24
-{
25
- unsigned vsz = vec_full_reg_size(s);
26
- gvec_fn(esz, vec_full_reg_offset(s, rd),
27
- vec_full_reg_offset(s, rn), vsz, vsz);
28
-}
29
-
30
/* Invoke a vector expander on three Zregs. */
31
static void gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
32
int esz, int rd, int rn, int rm)
33
@@ -XXX,XX +XXX,XX @@ static void gen_gvec_fn_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
34
static bool do_mov_z(DisasContext *s, int rd, int rn)
35
{
36
if (sve_access_check(s)) {
37
- gen_gvec_fn_zz(s, tcg_gen_gvec_mov, MO_8, rd, rn);
38
+ unsigned vsz = vec_full_reg_size(s);
39
+ tcg_gen_gvec_mov(MO_8, vec_full_reg_offset(s, rd),
40
+ vec_full_reg_offset(s, rn), vsz, vsz);
41
}
42
return true;
43
}
44
--
45
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-31-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 36 +++++++++++++++---------------------
9
1 file changed, 15 insertions(+), 21 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzz(DisasContext *s, gen_helper_gvec_4 *fn,
16
}
17
18
/* Invoke a vector expander on three Zregs. */
19
-static void gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
20
+static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
21
int esz, int rd, int rn, int rm)
22
{
23
- unsigned vsz = vec_full_reg_size(s);
24
- gvec_fn(esz, vec_full_reg_offset(s, rd),
25
- vec_full_reg_offset(s, rn),
26
- vec_full_reg_offset(s, rm), vsz, vsz);
27
+ if (gvec_fn == NULL) {
28
+ return false;
29
+ }
30
+ if (sve_access_check(s)) {
31
+ unsigned vsz = vec_full_reg_size(s);
32
+ gvec_fn(esz, vec_full_reg_offset(s, rd),
33
+ vec_full_reg_offset(s, rn),
34
+ vec_full_reg_offset(s, rm), vsz, vsz);
35
+ }
36
+ return true;
37
}
38
39
/* Invoke a vector expander on four Zregs. */
40
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
41
42
static bool do_zzz_fn(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *gvec_fn)
43
{
44
- if (sve_access_check(s)) {
45
- gen_gvec_fn_zzz(s, gvec_fn, a->esz, a->rd, a->rn, a->rm);
46
- }
47
- return true;
48
+ return gen_gvec_fn_zzz(s, gvec_fn, a->esz, a->rd, a->rn, a->rm);
49
}
50
51
static bool trans_AND_zzz(DisasContext *s, arg_rrr_esz *a)
52
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
53
if (!dc_isar_feature(aa64_sve2, s)) {
54
return false;
55
}
56
- if (sve_access_check(s)) {
57
- gen_gvec_fn_zzz(s, tcg_gen_gvec_mul, a->esz, a->rd, a->rn, a->rm);
58
- }
59
- return true;
60
+ return gen_gvec_fn_zzz(s, tcg_gen_gvec_mul, a->esz, a->rd, a->rn, a->rm);
61
}
62
63
static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
64
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_fn_zzz(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *fn)
65
if (!dc_isar_feature(aa64_sve2, s)) {
66
return false;
67
}
68
- if (sve_access_check(s)) {
69
- gen_gvec_fn_zzz(s, fn, a->esz, a->rd, a->rn, a->rm);
70
- }
71
- return true;
72
+ return gen_gvec_fn_zzz(s, fn, a->esz, a->rd, a->rn, a->rm);
73
}
74
75
static bool trans_SABA(DisasContext *s, arg_rrr_esz *a)
76
@@ -XXX,XX +XXX,XX @@ static bool trans_RAX1(DisasContext *s, arg_rrr_esz *a)
77
if (!dc_isar_feature(aa64_sve2_sha3, s)) {
78
return false;
79
}
80
- if (sve_access_check(s)) {
81
- gen_gvec_fn_zzz(s, gen_gvec_rax1, MO_64, a->rd, a->rn, a->rm);
82
- }
83
- return true;
84
+ return gen_gvec_fn_zzz(s, gen_gvec_rax1, MO_64, a->rd, a->rn, a->rm);
85
}
86
87
static bool trans_FCVTNT_sh(DisasContext *s, arg_rpr_esz *a)
88
--
89
2.25.1
diff view generated by jsdifflib
1
Rename various internal uses of 'iotkit' in hw/arm/iotkit.c to
1
From: Richard Henderson <richard.henderson@linaro.org>
2
'armsse', for consistency. The remaining occurences are:
3
* related to the devices TYPE_IOTKIT_SYSCTL, TYPE_IOTKIT_SYSINFO,
4
etc, which this refactor is not touching
5
* references that apply specifically to the IoTKit (like
6
the lack of a private CPU region)
7
* the vmstate, which keeps its old "iotkit" name for
8
migration compatibility reasons
9
2
3
Rename the function to match gen_gvec_fn_zzz,
4
and move to be adjacent.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-32-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20190121185118.18550-7-peter.maydell@linaro.org
14
---
10
---
15
hw/arm/iotkit.c | 68 ++++++++++++++++++++++++-------------------------
11
target/arm/translate-sve.c | 31 ++++++++++++++++---------------
16
1 file changed, 34 insertions(+), 34 deletions(-)
12
1 file changed, 16 insertions(+), 15 deletions(-)
17
13
18
diff --git a/hw/arm/iotkit.c b/hw/arm/iotkit.c
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/iotkit.c
16
--- a/target/arm/translate-sve.c
21
+++ b/hw/arm/iotkit.c
17
+++ b/target/arm/translate-sve.c
22
@@ -XXX,XX +XXX,XX @@ static void nsccfg_handler(void *opaque, int n, int level)
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
23
s->nsccfg = level;
19
return true;
24
}
20
}
25
21
26
-static void iotkit_forward_ppc(ARMSSE *s, const char *ppcname, int ppcnum)
22
+static bool gen_gvec_fn_arg_zzz(DisasContext *s, GVecGen3Fn *fn,
27
+static void armsse_forward_ppc(ARMSSE *s, const char *ppcname, int ppcnum)
23
+ arg_rrr_esz *a)
24
+{
25
+ return gen_gvec_fn_zzz(s, fn, a->esz, a->rd, a->rn, a->rm);
26
+}
27
+
28
/* Invoke a vector expander on four Zregs. */
29
static void gen_gvec_fn_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
30
int esz, int rd, int rn, int rm, int ra)
31
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
32
*** SVE Logical - Unpredicated Group
33
*/
34
35
-static bool do_zzz_fn(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *gvec_fn)
36
-{
37
- return gen_gvec_fn_zzz(s, gvec_fn, a->esz, a->rd, a->rn, a->rm);
38
-}
39
-
40
static bool trans_AND_zzz(DisasContext *s, arg_rrr_esz *a)
28
{
41
{
29
/* Each of the 4 AHB and 4 APB PPCs that might be present in a
42
- return do_zzz_fn(s, a, tcg_gen_gvec_and);
30
* system using the ARMSSE has a collection of control lines which
43
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_and, a);
31
@@ -XXX,XX +XXX,XX @@ static void iotkit_forward_ppc(ARMSSE *s, const char *ppcname, int ppcnum)
32
* code using the ARMSSE can wire them up to the PPCs.
33
*/
34
SplitIRQ *splitter = &s->ppc_irq_splitter[ppcnum];
35
- DeviceState *iotkitdev = DEVICE(s);
36
+ DeviceState *armssedev = DEVICE(s);
37
DeviceState *dev_secctl = DEVICE(&s->secctl);
38
DeviceState *dev_splitter = DEVICE(splitter);
39
char *name;
40
41
name = g_strdup_printf("%s_nonsec", ppcname);
42
- qdev_pass_gpios(dev_secctl, iotkitdev, name);
43
+ qdev_pass_gpios(dev_secctl, armssedev, name);
44
g_free(name);
45
name = g_strdup_printf("%s_ap", ppcname);
46
- qdev_pass_gpios(dev_secctl, iotkitdev, name);
47
+ qdev_pass_gpios(dev_secctl, armssedev, name);
48
g_free(name);
49
name = g_strdup_printf("%s_irq_enable", ppcname);
50
- qdev_pass_gpios(dev_secctl, iotkitdev, name);
51
+ qdev_pass_gpios(dev_secctl, armssedev, name);
52
g_free(name);
53
name = g_strdup_printf("%s_irq_clear", ppcname);
54
- qdev_pass_gpios(dev_secctl, iotkitdev, name);
55
+ qdev_pass_gpios(dev_secctl, armssedev, name);
56
g_free(name);
57
58
/* irq_status is a little more tricky, because we need to
59
@@ -XXX,XX +XXX,XX @@ static void iotkit_forward_ppc(ARMSSE *s, const char *ppcname, int ppcnum)
60
qdev_connect_gpio_out(dev_splitter, 1,
61
qdev_get_gpio_in(DEVICE(&s->ppc_irq_orgate), ppcnum));
62
s->irq_status_in[ppcnum] = qdev_get_gpio_in(dev_splitter, 0);
63
- qdev_init_gpio_in_named_with_opaque(iotkitdev, irq_status_forwarder,
64
+ qdev_init_gpio_in_named_with_opaque(armssedev, irq_status_forwarder,
65
s->irq_status_in[ppcnum], name, 1);
66
g_free(name);
67
}
44
}
68
45
69
-static void iotkit_forward_sec_resp_cfg(ARMSSE *s)
46
static bool trans_ORR_zzz(DisasContext *s, arg_rrr_esz *a)
70
+static void armsse_forward_sec_resp_cfg(ARMSSE *s)
71
{
47
{
72
/* Forward the 3rd output from the splitter device as a
48
- return do_zzz_fn(s, a, tcg_gen_gvec_or);
73
- * named GPIO output of the iotkit object.
49
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_or, a);
74
+ * named GPIO output of the armsse object.
75
*/
76
DeviceState *dev = DEVICE(s);
77
DeviceState *dev_splitter = DEVICE(&s->sec_resp_splitter);
78
@@ -XXX,XX +XXX,XX @@ static void iotkit_forward_sec_resp_cfg(ARMSSE *s)
79
qdev_connect_gpio_out(dev_splitter, 2, s->sec_resp_cfg_in);
80
}
50
}
81
51
82
-static void iotkit_init(Object *obj)
52
static bool trans_EOR_zzz(DisasContext *s, arg_rrr_esz *a)
83
+static void armsse_init(Object *obj)
84
{
53
{
85
ARMSSE *s = ARMSSE(obj);
54
- return do_zzz_fn(s, a, tcg_gen_gvec_xor);
86
int i;
55
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_xor, a);
87
88
- memory_region_init(&s->container, obj, "iotkit-container", UINT64_MAX);
89
+ memory_region_init(&s->container, obj, "armsse-container", UINT64_MAX);
90
91
sysbus_init_child_obj(obj, "armv7m", &s->armv7m, sizeof(s->armv7m),
92
TYPE_ARMV7M);
93
@@ -XXX,XX +XXX,XX @@ static void iotkit_init(Object *obj)
94
sizeof(s->nswatchdog), TYPE_CMSDK_APB_WATCHDOG);
95
sysbus_init_child_obj(obj, "swatchdog", &s->swatchdog,
96
sizeof(s->swatchdog), TYPE_CMSDK_APB_WATCHDOG);
97
- sysbus_init_child_obj(obj, "iotkit-sysctl", &s->sysctl,
98
+ sysbus_init_child_obj(obj, "armsse-sysctl", &s->sysctl,
99
sizeof(s->sysctl), TYPE_IOTKIT_SYSCTL);
100
- sysbus_init_child_obj(obj, "iotkit-sysinfo", &s->sysinfo,
101
+ sysbus_init_child_obj(obj, "armsse-sysinfo", &s->sysinfo,
102
sizeof(s->sysinfo), TYPE_IOTKIT_SYSINFO);
103
object_initialize_child(obj, "nmi-orgate", &s->nmi_orgate,
104
sizeof(s->nmi_orgate), TYPE_OR_IRQ,
105
@@ -XXX,XX +XXX,XX @@ static void iotkit_init(Object *obj)
106
}
107
}
56
}
108
57
109
-static void iotkit_exp_irq(void *opaque, int n, int level)
58
static bool trans_BIC_zzz(DisasContext *s, arg_rrr_esz *a)
110
+static void armsse_exp_irq(void *opaque, int n, int level)
111
{
59
{
112
ARMSSE *s = ARMSSE(opaque);
60
- return do_zzz_fn(s, a, tcg_gen_gvec_andc);
113
61
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_andc, a);
114
qemu_set_irq(s->exp_irqs[n], level);
115
}
62
}
116
63
117
-static void iotkit_mpcexp_status(void *opaque, int n, int level)
64
static void gen_xar8_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, int64_t sh)
118
+static void armsse_mpcexp_status(void *opaque, int n, int level)
65
@@ -XXX,XX +XXX,XX @@ static bool trans_NBSL(DisasContext *s, arg_rrrr_esz *a)
66
67
static bool trans_ADD_zzz(DisasContext *s, arg_rrr_esz *a)
119
{
68
{
120
ARMSSE *s = ARMSSE(opaque);
69
- return do_zzz_fn(s, a, tcg_gen_gvec_add);
121
qemu_set_irq(s->mpcexp_status_in[n], level);
70
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_add, a);
122
}
71
}
123
72
124
-static void iotkit_realize(DeviceState *dev, Error **errp)
73
static bool trans_SUB_zzz(DisasContext *s, arg_rrr_esz *a)
125
+static void armsse_realize(DeviceState *dev, Error **errp)
126
{
74
{
127
ARMSSE *s = ARMSSE(dev);
75
- return do_zzz_fn(s, a, tcg_gen_gvec_sub);
128
int i;
76
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_sub, a);
129
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
130
for (i = 0; i < s->exp_numirq; i++) {
131
s->exp_irqs[i] = qdev_get_gpio_in(DEVICE(&s->armv7m), i + 32);
132
}
133
- qdev_init_gpio_in_named(dev, iotkit_exp_irq, "EXP_IRQ", s->exp_numirq);
134
+ qdev_init_gpio_in_named(dev, armsse_exp_irq, "EXP_IRQ", s->exp_numirq);
135
136
/* Set up the big aliases first */
137
make_alias(s, &s->alias1, "alias 1", 0x10000000, 0x10000000, 0x00000000);
138
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
139
qdev_get_gpio_in(dev_splitter, 0));
140
141
/* This RAM lives behind the Memory Protection Controller */
142
- memory_region_init_ram(&s->sram0, NULL, "iotkit.sram0", 0x00008000, &err);
143
+ memory_region_init_ram(&s->sram0, NULL, "armsse.sram0", 0x00008000, &err);
144
if (err) {
145
error_propagate(errp, err);
146
return;
147
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
148
for (i = 0; i < IOTS_NUM_AHB_EXP_PPC; i++) {
149
char *ppcname = g_strdup_printf("ahb_ppcexp%d", i);
150
151
- iotkit_forward_ppc(s, ppcname, i);
152
+ armsse_forward_ppc(s, ppcname, i);
153
g_free(ppcname);
154
}
155
156
for (i = 0; i < IOTS_NUM_APB_EXP_PPC; i++) {
157
char *ppcname = g_strdup_printf("apb_ppcexp%d", i);
158
159
- iotkit_forward_ppc(s, ppcname, i + IOTS_NUM_AHB_EXP_PPC);
160
+ armsse_forward_ppc(s, ppcname, i + IOTS_NUM_AHB_EXP_PPC);
161
g_free(ppcname);
162
}
163
164
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
165
/* Create GPIO inputs which will pass the line state for our
166
* mpcexp_irq inputs to the correct splitter devices.
167
*/
168
- qdev_init_gpio_in_named(dev, iotkit_mpcexp_status, "mpcexp_status",
169
+ qdev_init_gpio_in_named(dev, armsse_mpcexp_status, "mpcexp_status",
170
IOTS_NUM_EXP_MPC);
171
172
- iotkit_forward_sec_resp_cfg(s);
173
+ armsse_forward_sec_resp_cfg(s);
174
175
/* Forward the MSC related signals */
176
qdev_pass_gpios(dev_secctl, dev, "mscexp_status");
177
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
178
system_clock_scale = NANOSECONDS_PER_SECOND / s->mainclk_frq;
179
}
77
}
180
78
181
-static void iotkit_idau_check(IDAUInterface *ii, uint32_t address,
79
static bool trans_SQADD_zzz(DisasContext *s, arg_rrr_esz *a)
182
+static void armsse_idau_check(IDAUInterface *ii, uint32_t address,
183
int *iregion, bool *exempt, bool *ns, bool *nsc)
184
{
80
{
185
/*
81
- return do_zzz_fn(s, a, tcg_gen_gvec_ssadd);
186
@@ -XXX,XX +XXX,XX @@ static void iotkit_idau_check(IDAUInterface *ii, uint32_t address,
82
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_ssadd, a);
187
*iregion = region;
188
}
83
}
189
84
190
-static const VMStateDescription iotkit_vmstate = {
85
static bool trans_SQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
191
+static const VMStateDescription armsse_vmstate = {
192
.name = "iotkit",
193
.version_id = 1,
194
.minimum_version_id = 1,
195
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription iotkit_vmstate = {
196
}
197
};
198
199
-static Property iotkit_properties[] = {
200
+static Property armsse_properties[] = {
201
DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
202
MemoryRegion *),
203
DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
204
@@ -XXX,XX +XXX,XX @@ static Property iotkit_properties[] = {
205
DEFINE_PROP_END_OF_LIST()
206
};
207
208
-static void iotkit_reset(DeviceState *dev)
209
+static void armsse_reset(DeviceState *dev)
210
{
86
{
211
ARMSSE *s = ARMSSE(dev);
87
- return do_zzz_fn(s, a, tcg_gen_gvec_sssub);
212
88
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_sssub, a);
213
s->nsccfg = 0;
214
}
89
}
215
90
216
-static void iotkit_class_init(ObjectClass *klass, void *data)
91
static bool trans_UQADD_zzz(DisasContext *s, arg_rrr_esz *a)
217
+static void armsse_class_init(ObjectClass *klass, void *data)
218
{
92
{
219
DeviceClass *dc = DEVICE_CLASS(klass);
93
- return do_zzz_fn(s, a, tcg_gen_gvec_usadd);
220
IDAUInterfaceClass *iic = IDAU_INTERFACE_CLASS(klass);
94
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_usadd, a);
221
ARMSSEClass *asc = ARMSSE_CLASS(klass);
222
223
- dc->realize = iotkit_realize;
224
- dc->vmsd = &iotkit_vmstate;
225
- dc->props = iotkit_properties;
226
- dc->reset = iotkit_reset;
227
- iic->check = iotkit_idau_check;
228
+ dc->realize = armsse_realize;
229
+ dc->vmsd = &armsse_vmstate;
230
+ dc->props = armsse_properties;
231
+ dc->reset = armsse_reset;
232
+ iic->check = armsse_idau_check;
233
asc->info = data;
234
}
95
}
235
96
236
@@ -XXX,XX +XXX,XX @@ static const TypeInfo armsse_info = {
97
static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
237
.name = TYPE_ARMSSE,
98
{
238
.parent = TYPE_SYS_BUS_DEVICE,
99
- return do_zzz_fn(s, a, tcg_gen_gvec_ussub);
239
.instance_size = sizeof(ARMSSE),
100
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_ussub, a);
240
- .instance_init = iotkit_init,
101
}
241
+ .instance_init = armsse_init,
102
242
.abstract = true,
103
/*
243
.interfaces = (InterfaceInfo[]) {
244
{ TYPE_IDAU_INTERFACE },
245
@@ -XXX,XX +XXX,XX @@ static void armsse_register_types(void)
246
TypeInfo ti = {
247
.name = armsse_variants[i].name,
248
.parent = TYPE_ARMSSE,
249
- .class_init = iotkit_class_init,
250
+ .class_init = armsse_class_init,
251
.class_data = (void *)&armsse_variants[i],
252
};
253
type_register(&ti);
254
--
104
--
255
2.20.1
105
2.25.1
256
257
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Two uses of gen_gvec_fn_zzz can pass on arg_rrr_esz instead.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-33-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate-sve.c | 4 ++--
11
1 file changed, 2 insertions(+), 2 deletions(-)
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
18
if (!dc_isar_feature(aa64_sve2, s)) {
19
return false;
20
}
21
- return gen_gvec_fn_zzz(s, tcg_gen_gvec_mul, a->esz, a->rd, a->rn, a->rm);
22
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_mul, a);
23
}
24
25
static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
26
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_fn_zzz(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *fn)
27
if (!dc_isar_feature(aa64_sve2, s)) {
28
return false;
29
}
30
- return gen_gvec_fn_zzz(s, fn, a->esz, a->rd, a->rn, a->rm);
31
+ return gen_gvec_fn_arg_zzz(s, fn, a);
32
}
33
34
static bool trans_SABA(DisasContext *s, arg_rrr_esz *a)
35
--
36
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions directly using
4
gen_gvec_fn_arg_zzz to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-34-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 66 +++++++-------------------------------
12
1 file changed, 11 insertions(+), 55 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
19
*** SVE Logical - Unpredicated Group
20
*/
21
22
-static bool trans_AND_zzz(DisasContext *s, arg_rrr_esz *a)
23
-{
24
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_and, a);
25
-}
26
-
27
-static bool trans_ORR_zzz(DisasContext *s, arg_rrr_esz *a)
28
-{
29
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_or, a);
30
-}
31
-
32
-static bool trans_EOR_zzz(DisasContext *s, arg_rrr_esz *a)
33
-{
34
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_xor, a);
35
-}
36
-
37
-static bool trans_BIC_zzz(DisasContext *s, arg_rrr_esz *a)
38
-{
39
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_andc, a);
40
-}
41
+TRANS_FEAT(AND_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_and, a)
42
+TRANS_FEAT(ORR_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_or, a)
43
+TRANS_FEAT(EOR_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_xor, a)
44
+TRANS_FEAT(BIC_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_andc, a)
45
46
static void gen_xar8_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, int64_t sh)
47
{
48
@@ -XXX,XX +XXX,XX @@ static bool trans_NBSL(DisasContext *s, arg_rrrr_esz *a)
49
*** SVE Integer Arithmetic - Unpredicated Group
50
*/
51
52
-static bool trans_ADD_zzz(DisasContext *s, arg_rrr_esz *a)
53
-{
54
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_add, a);
55
-}
56
-
57
-static bool trans_SUB_zzz(DisasContext *s, arg_rrr_esz *a)
58
-{
59
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_sub, a);
60
-}
61
-
62
-static bool trans_SQADD_zzz(DisasContext *s, arg_rrr_esz *a)
63
-{
64
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_ssadd, a);
65
-}
66
-
67
-static bool trans_SQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
68
-{
69
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_sssub, a);
70
-}
71
-
72
-static bool trans_UQADD_zzz(DisasContext *s, arg_rrr_esz *a)
73
-{
74
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_usadd, a);
75
-}
76
-
77
-static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
78
-{
79
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_ussub, a);
80
-}
81
+TRANS_FEAT(ADD_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_add, a)
82
+TRANS_FEAT(SUB_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_sub, a)
83
+TRANS_FEAT(SQADD_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_ssadd, a)
84
+TRANS_FEAT(SQSUB_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_sssub, a)
85
+TRANS_FEAT(UQADD_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_usadd, a)
86
+TRANS_FEAT(UQSUB_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_ussub, a)
87
88
/*
89
*** SVE Integer Arithmetic - Binary Predicated Group
90
@@ -XXX,XX +XXX,XX @@ static bool trans_MOVPRFX_z(DisasContext *s, arg_rpr_esz *a)
91
* SVE2 Integer Multiply - Unpredicated
92
*/
93
94
-static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
95
-{
96
- if (!dc_isar_feature(aa64_sve2, s)) {
97
- return false;
98
- }
99
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_mul, a);
100
-}
101
+TRANS_FEAT(MUL_zzz, aa64_sve2, gen_gvec_fn_arg_zzz, tcg_gen_gvec_mul, a)
102
103
static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
104
gen_helper_gvec_smulh_b, gen_helper_gvec_smulh_h,
105
--
106
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions using do_sve2_fn_zzz
4
to use TRANS_FEAT and gen_gvec_fn_arg_zzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-35-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 19 ++-----------------
12
1 file changed, 2 insertions(+), 17 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_SLI(DisasContext *s, arg_rri_esz *a)
19
return do_sve2_fn2i(s, a, gen_gvec_sli);
20
}
21
22
-static bool do_sve2_fn_zzz(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *fn)
23
-{
24
- if (!dc_isar_feature(aa64_sve2, s)) {
25
- return false;
26
- }
27
- return gen_gvec_fn_arg_zzz(s, fn, a);
28
-}
29
-
30
-static bool trans_SABA(DisasContext *s, arg_rrr_esz *a)
31
-{
32
- return do_sve2_fn_zzz(s, a, gen_gvec_saba);
33
-}
34
-
35
-static bool trans_UABA(DisasContext *s, arg_rrr_esz *a)
36
-{
37
- return do_sve2_fn_zzz(s, a, gen_gvec_uaba);
38
-}
39
+TRANS_FEAT(SABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_saba, a)
40
+TRANS_FEAT(UABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_uaba, a)
41
42
static bool do_sve2_narrow_extract(DisasContext *s, arg_rri_esz *a,
43
const GVecGen2 ops[3])
44
--
45
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
The decode for RAX1 sets esz to MO_8, because that's what
4
we use by default for "no esz present". We changed that
5
to MO_64 during translation because it is more logical for
6
the operation. However, the esz argument to gen_gvec_rax1
7
is unused and forces MO_64 within that function, so there
8
is no need to do it here as well.
9
10
Simplify to use gen_gvec_fn_arg_zzz and TRANS_FEAT.
11
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20220527181907.189259-36-richard.henderson@linaro.org
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
target/arm/translate-sve.c | 8 +-------
18
1 file changed, 1 insertion(+), 7 deletions(-)
19
20
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/translate-sve.c
23
+++ b/target/arm/translate-sve.c
24
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SM4E, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
25
TRANS_FEAT(SM4EKEY, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
26
gen_helper_crypto_sm4ekey, a, 0)
27
28
-static bool trans_RAX1(DisasContext *s, arg_rrr_esz *a)
29
-{
30
- if (!dc_isar_feature(aa64_sve2_sha3, s)) {
31
- return false;
32
- }
33
- return gen_gvec_fn_zzz(s, gen_gvec_rax1, MO_64, a->rd, a->rn, a->rm);
34
-}
35
+TRANS_FEAT(RAX1, aa64_sve2_sha3, gen_gvec_fn_arg_zzz, gen_gvec_rax1, a)
36
37
static bool trans_FCVTNT_sh(DisasContext *s, arg_rpr_esz *a)
38
{
39
--
40
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Merge gen_gvec_fn_zzzz with the sve access check and the
4
dereference of arg_rrrr_esz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-37-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 25 ++++++++++++++-----------
12
1 file changed, 14 insertions(+), 11 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fn_arg_zzz(DisasContext *s, GVecGen3Fn *fn,
19
}
20
21
/* Invoke a vector expander on four Zregs. */
22
-static void gen_gvec_fn_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
23
- int esz, int rd, int rn, int rm, int ra)
24
+static bool gen_gvec_fn_arg_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
25
+ arg_rrrr_esz *a)
26
{
27
- unsigned vsz = vec_full_reg_size(s);
28
- gvec_fn(esz, vec_full_reg_offset(s, rd),
29
- vec_full_reg_offset(s, rn),
30
- vec_full_reg_offset(s, rm),
31
- vec_full_reg_offset(s, ra), vsz, vsz);
32
+ if (gvec_fn == NULL) {
33
+ return false;
34
+ }
35
+ if (sve_access_check(s)) {
36
+ unsigned vsz = vec_full_reg_size(s);
37
+ gvec_fn(a->esz, vec_full_reg_offset(s, a->rd),
38
+ vec_full_reg_offset(s, a->rn),
39
+ vec_full_reg_offset(s, a->rm),
40
+ vec_full_reg_offset(s, a->ra), vsz, vsz);
41
+ }
42
+ return true;
43
}
44
45
/* Invoke a vector move on two Zregs. */
46
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zzzz_fn(DisasContext *s, arg_rrrr_esz *a, GVecGen4Fn *fn)
47
if (!dc_isar_feature(aa64_sve2, s)) {
48
return false;
49
}
50
- if (sve_access_check(s)) {
51
- gen_gvec_fn_zzzz(s, fn, a->esz, a->rd, a->rn, a->rm, a->ra);
52
- }
53
- return true;
54
+ return gen_gvec_fn_arg_zzzz(s, fn, a);
55
}
56
57
static void gen_eor3_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
58
--
59
2.25.1
diff view generated by jsdifflib
1
The SSE-200 has two Cortex-M33 CPUs. These see the same view
1
From: Richard Henderson <richard.henderson@linaro.org>
2
of memory, with the exception of the "private CPU region" which
3
has per-CPU devices. Internal device interrupts for SSE-200
4
devices are mostly wired up to both CPUs, with the exception of
5
a few per-CPU devices. External GPIO inputs on the SSE-200
6
device are provided for the second CPU's interrupts above 32,
7
as is already the case for the first CPU.
8
2
9
Refactor the code to support creation of multiple CPUs.
3
Convert SVE translation functions using do_sve2_zzzz_fn
10
For the moment we leave all CPUs with the same view of
4
to use TRANS_FEAT and gen_gvec_fn_arg_zzzz.
11
memory: this will not work in the multiple-CPU case, but
12
we will fix this in the following commit.
13
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-38-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Message-id: 20190121185118.18550-12-peter.maydell@linaro.org
17
---
10
---
18
include/hw/arm/armsse.h | 21 +++-
11
target/arm/translate-sve.c | 38 ++++++--------------------------------
19
hw/arm/armsse.c | 206 ++++++++++++++++++++++++++++++++--------
12
1 file changed, 6 insertions(+), 32 deletions(-)
20
2 files changed, 180 insertions(+), 47 deletions(-)
21
13
22
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
23
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/armsse.h
16
--- a/target/arm/translate-sve.c
25
+++ b/include/hw/arm/armsse.h
17
+++ b/target/arm/translate-sve.c
26
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ static bool trans_XAR(DisasContext *s, arg_rrri_esz *a)
27
* + QOM property "memory" is a MemoryRegion containing the devices provided
19
return true;
28
* by the board model.
29
* + QOM property "MAINCLK" is the frequency of the main system clock
30
- * + QOM property "EXP_NUMIRQ" sets the number of expansion interrupts
31
- * + Named GPIO inputs "EXP_IRQ" 0..n are the expansion interrupts, which
32
- * are wired to the NVIC lines 32 .. n+32
33
+ * + QOM property "EXP_NUMIRQ" sets the number of expansion interrupts.
34
+ * (In hardware, the SSE-200 permits the number of expansion interrupts
35
+ * for the two CPUs to be configured separately, but we restrict it to
36
+ * being the same for both, to avoid having to have separate Property
37
+ * lists for different variants. This restriction can be relaxed later
38
+ * if necessary.)
39
+ * + Named GPIO inputs "EXP_IRQ" 0..n are the expansion interrupts for CPU 0,
40
+ * which are wired to its NVIC lines 32 .. n+32
41
+ * + Named GPIO inputs "EXP_CPU1_IRQ" 0..n are the expansion interrupts for
42
+ * CPU 1, which are wired to its NVIC lines 32 .. n+32
43
* + sysbus MMIO region 0 is the "AHB Slave Expansion" which allows
44
* bus master devices in the board model to make transactions into
45
* all the devices and memory areas in the IoTKit
46
@@ -XXX,XX +XXX,XX @@
47
#error Too many SRAM banks
48
#endif
49
50
+#define SSE_MAX_CPUS 2
51
+
52
typedef struct ARMSSE {
53
/*< private >*/
54
SysBusDevice parent_obj;
55
56
/*< public >*/
57
- ARMv7MState armv7m;
58
+ ARMv7MState armv7m[SSE_MAX_CPUS];
59
IoTKitSecCtl secctl;
60
TZPPC apb_ppc0;
61
TZPPC apb_ppc1;
62
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
63
qemu_or_irq mpc_irq_orgate;
64
qemu_or_irq nmi_orgate;
65
66
+ SplitIRQ cpu_irq_splitter[32];
67
+
68
CMSDKAPBDualTimer dualtimer;
69
70
CMSDKAPBWatchdog s32kwatchdog;
71
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
72
MemoryRegion alias3;
73
MemoryRegion sram[MAX_SRAM_BANKS];
74
75
- qemu_irq *exp_irqs;
76
+ qemu_irq *exp_irqs[SSE_MAX_CPUS];
77
qemu_irq ppc0_irq;
78
qemu_irq ppc1_irq;
79
qemu_irq sec_resp_cfg;
80
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
81
index XXXXXXX..XXXXXXX 100644
82
--- a/hw/arm/armsse.c
83
+++ b/hw/arm/armsse.c
84
@@ -XXX,XX +XXX,XX @@
85
struct ARMSSEInfo {
86
const char *name;
87
int sram_banks;
88
+ int num_cpus;
89
};
90
91
static const ARMSSEInfo armsse_variants[] = {
92
{
93
.name = TYPE_IOTKIT,
94
.sram_banks = 1,
95
+ .num_cpus = 1,
96
},
97
};
98
99
/* Clock frequency in HZ of the 32KHz "slow clock" */
100
#define S32KCLK (32 * 1000)
101
102
+/* Is internal IRQ n shared between CPUs in a multi-core SSE ? */
103
+static bool irq_is_common[32] = {
104
+ [0 ... 5] = true,
105
+ /* 6, 7: per-CPU MHU interrupts */
106
+ [8 ... 12] = true,
107
+ /* 13: per-CPU icache interrupt */
108
+ /* 14: reserved */
109
+ [15 ... 20] = true,
110
+ /* 21: reserved */
111
+ [22 ... 26] = true,
112
+ /* 27: reserved */
113
+ /* 28, 29: per-CPU CTI interrupts */
114
+ /* 30, 31: reserved */
115
+};
116
+
117
/* Create an alias region of @size bytes starting at @base
118
* which mirrors the memory starting at @orig.
119
*/
120
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
121
int i;
122
123
assert(info->sram_banks <= MAX_SRAM_BANKS);
124
+ assert(info->num_cpus <= SSE_MAX_CPUS);
125
126
memory_region_init(&s->container, obj, "armsse-container", UINT64_MAX);
127
128
- sysbus_init_child_obj(obj, "armv7m", &s->armv7m, sizeof(s->armv7m),
129
- TYPE_ARMV7M);
130
- qdev_prop_set_string(DEVICE(&s->armv7m), "cpu-type",
131
- ARM_CPU_TYPE_NAME("cortex-m33"));
132
+ for (i = 0; i < info->num_cpus; i++) {
133
+ char *name = g_strdup_printf("armv7m%d", i);
134
+ sysbus_init_child_obj(obj, name, &s->armv7m[i], sizeof(s->armv7m),
135
+ TYPE_ARMV7M);
136
+ qdev_prop_set_string(DEVICE(&s->armv7m[i]), "cpu-type",
137
+ ARM_CPU_TYPE_NAME("cortex-m33"));
138
+ g_free(name);
139
+ }
140
141
sysbus_init_child_obj(obj, "secctl", &s->secctl, sizeof(s->secctl),
142
TYPE_IOTKIT_SECCTL);
143
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
144
TYPE_SPLIT_IRQ, &error_abort, NULL);
145
g_free(name);
146
}
147
+ if (info->num_cpus > 1) {
148
+ for (i = 0; i < ARRAY_SIZE(s->cpu_irq_splitter); i++) {
149
+ if (irq_is_common[i]) {
150
+ char *name = g_strdup_printf("cpu-irq-splitter%d", i);
151
+ SplitIRQ *splitter = &s->cpu_irq_splitter[i];
152
+
153
+ object_initialize_child(obj, name, splitter, sizeof(*splitter),
154
+ TYPE_SPLIT_IRQ, &error_abort, NULL);
155
+ g_free(name);
156
+ }
157
+ }
158
+ }
159
}
20
}
160
21
161
static void armsse_exp_irq(void *opaque, int n, int level)
22
-static bool do_sve2_zzzz_fn(DisasContext *s, arg_rrrr_esz *a, GVecGen4Fn *fn)
23
-{
24
- if (!dc_isar_feature(aa64_sve2, s)) {
25
- return false;
26
- }
27
- return gen_gvec_fn_arg_zzzz(s, fn, a);
28
-}
29
-
30
static void gen_eor3_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
162
{
31
{
163
- ARMSSE *s = ARMSSE(opaque);
32
tcg_gen_xor_i64(d, n, m);
164
+ qemu_irq *irqarray = opaque;
33
@@ -XXX,XX +XXX,XX @@ static void gen_eor3(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
165
34
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
166
- qemu_set_irq(s->exp_irqs[n], level);
167
+ qemu_set_irq(irqarray[n], level);
168
}
35
}
169
36
170
static void armsse_mpcexp_status(void *opaque, int n, int level)
37
-static bool trans_EOR3(DisasContext *s, arg_rrrr_esz *a)
171
@@ -XXX,XX +XXX,XX @@ static void armsse_mpcexp_status(void *opaque, int n, int level)
38
-{
172
qemu_set_irq(s->mpcexp_status_in[n], level);
39
- return do_sve2_zzzz_fn(s, a, gen_eor3);
40
-}
41
+TRANS_FEAT(EOR3, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_eor3, a)
42
43
static void gen_bcax_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
44
{
45
@@ -XXX,XX +XXX,XX @@ static void gen_bcax(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
46
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
173
}
47
}
174
48
175
+static qemu_irq armsse_get_common_irq_in(ARMSSE *s, int irqno)
49
-static bool trans_BCAX(DisasContext *s, arg_rrrr_esz *a)
176
+{
50
-{
177
+ /*
51
- return do_sve2_zzzz_fn(s, a, gen_bcax);
178
+ * Return a qemu_irq which can be used to signal IRQ n to
52
-}
179
+ * all CPUs in the SSE.
53
+TRANS_FEAT(BCAX, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_bcax, a)
180
+ */
54
181
+ ARMSSEClass *asc = ARMSSE_GET_CLASS(s);
55
static void gen_bsl(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
182
+ const ARMSSEInfo *info = asc->info;
56
uint32_t a, uint32_t oprsz, uint32_t maxsz)
183
+
57
@@ -XXX,XX +XXX,XX @@ static void gen_bsl(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
184
+ assert(irq_is_common[irqno]);
58
tcg_gen_gvec_bitsel(vece, d, a, n, m, oprsz, maxsz);
185
+
59
}
186
+ if (info->num_cpus == 1) {
60
187
+ /* Only one CPU -- just connect directly to it */
61
-static bool trans_BSL(DisasContext *s, arg_rrrr_esz *a)
188
+ return qdev_get_gpio_in(DEVICE(&s->armv7m[0]), irqno);
62
-{
189
+ } else {
63
- return do_sve2_zzzz_fn(s, a, gen_bsl);
190
+ /* Connect to the splitter which feeds all CPUs */
64
-}
191
+ return qdev_get_gpio_in(DEVICE(&s->cpu_irq_splitter[irqno]), 0);
65
+TRANS_FEAT(BSL, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_bsl, a)
192
+ }
66
193
+}
67
static void gen_bsl1n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
194
+
195
static void armsse_realize(DeviceState *dev, Error **errp)
196
{
68
{
197
ARMSSE *s = ARMSSE(dev);
69
@@ -XXX,XX +XXX,XX @@ static void gen_bsl1n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
198
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
70
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
199
71
}
200
memory_region_add_subregion_overlap(&s->container, 0, s->board_memory, -1);
72
201
73
-static bool trans_BSL1N(DisasContext *s, arg_rrrr_esz *a)
202
- qdev_prop_set_uint32(DEVICE(&s->armv7m), "num-irq", s->exp_numirq + 32);
74
-{
203
- /* In real hardware the initial Secure VTOR is set from the INITSVTOR0
75
- return do_sve2_zzzz_fn(s, a, gen_bsl1n);
204
- * register in the IoT Kit System Control Register block, and the
76
-}
205
- * initial value of that is in turn specifiable by the FPGA that
77
+TRANS_FEAT(BSL1N, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_bsl1n, a)
206
- * instantiates the IoT Kit. In QEMU we don't implement this wrinkle,
78
207
- * and simply set the CPU's init-svtor to the IoT Kit default value.
79
static void gen_bsl2n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
208
- */
80
{
209
- qdev_prop_set_uint32(DEVICE(&s->armv7m), "init-svtor", 0x10000000);
81
@@ -XXX,XX +XXX,XX @@ static void gen_bsl2n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
210
- object_property_set_link(OBJECT(&s->armv7m), OBJECT(&s->container),
82
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
211
- "memory", &err);
83
}
212
- if (err) {
84
213
- error_propagate(errp, err);
85
-static bool trans_BSL2N(DisasContext *s, arg_rrrr_esz *a)
214
- return;
86
-{
215
- }
87
- return do_sve2_zzzz_fn(s, a, gen_bsl2n);
216
- object_property_set_link(OBJECT(&s->armv7m), OBJECT(s), "idau", &err);
88
-}
217
- if (err) {
89
+TRANS_FEAT(BSL2N, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_bsl2n, a)
218
- error_propagate(errp, err);
90
219
- return;
91
static void gen_nbsl_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
220
- }
92
{
221
- object_property_set_bool(OBJECT(&s->armv7m), true, "realized", &err);
93
@@ -XXX,XX +XXX,XX @@ static void gen_nbsl(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
222
- if (err) {
94
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
223
- error_propagate(errp, err);
95
}
224
- return;
96
225
+ for (i = 0; i < info->num_cpus; i++) {
97
-static bool trans_NBSL(DisasContext *s, arg_rrrr_esz *a)
226
+ DeviceState *cpudev = DEVICE(&s->armv7m[i]);
98
-{
227
+ Object *cpuobj = OBJECT(&s->armv7m[i]);
99
- return do_sve2_zzzz_fn(s, a, gen_nbsl);
228
+ int j;
100
-}
229
+ char *gpioname;
101
+TRANS_FEAT(NBSL, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_nbsl, a)
230
+
102
231
+ qdev_prop_set_uint32(cpudev, "num-irq", s->exp_numirq + 32);
103
/*
232
+ /*
104
*** SVE Integer Arithmetic - Unpredicated Group
233
+ * In real hardware the initial Secure VTOR is set from the INITSVTOR0
234
+ * register in the IoT Kit System Control Register block, and the
235
+ * initial value of that is in turn specifiable by the FPGA that
236
+ * instantiates the IoT Kit. In QEMU we don't implement this wrinkle,
237
+ * and simply set the CPU's init-svtor to the IoT Kit default value.
238
+ * In SSE-200 the situation is similar, except that the default value
239
+ * is a reset-time signal input. Typically a board using the SSE-200
240
+ * will have a system control processor whose boot firmware initializes
241
+ * the INITSVTOR* registers before powering up the CPUs in any case,
242
+ * so the hardware's default value doesn't matter. QEMU doesn't emulate
243
+ * the control processor, so instead we behave in the way that the
244
+ * firmware does. All boards currently known about have firmware that
245
+ * sets the INITSVTOR0 and INITSVTOR1 registers to 0x10000000, like the
246
+ * IoTKit default. We can make this more configurable if necessary.
247
+ */
248
+ qdev_prop_set_uint32(cpudev, "init-svtor", 0x10000000);
249
+ /*
250
+ * Start all CPUs except CPU0 powered down. In real hardware it is
251
+ * a configurable property of the SSE-200 which CPUs start powered up
252
+ * (via the CPUWAIT0_RST and CPUWAIT1_RST parameters), but since all
253
+ * the boards we care about start CPU0 and leave CPU1 powered off,
254
+ * we hard-code that for now. We can add QOM properties for this
255
+ * later if necessary.
256
+ */
257
+ if (i > 0) {
258
+ object_property_set_bool(cpuobj, true, "start-powered-off", &err);
259
+ if (err) {
260
+ error_propagate(errp, err);
261
+ return;
262
+ }
263
+ }
264
+ object_property_set_link(cpuobj, OBJECT(&s->container), "memory", &err);
265
+ if (err) {
266
+ error_propagate(errp, err);
267
+ return;
268
+ }
269
+ object_property_set_link(cpuobj, OBJECT(s), "idau", &err);
270
+ if (err) {
271
+ error_propagate(errp, err);
272
+ return;
273
+ }
274
+ object_property_set_bool(cpuobj, true, "realized", &err);
275
+ if (err) {
276
+ error_propagate(errp, err);
277
+ return;
278
+ }
279
+
280
+ /* Connect EXP_IRQ/EXP_CPUn_IRQ GPIOs to the NVIC's lines 32 and up */
281
+ s->exp_irqs[i] = g_new(qemu_irq, s->exp_numirq);
282
+ for (j = 0; j < s->exp_numirq; j++) {
283
+ s->exp_irqs[i][j] = qdev_get_gpio_in(cpudev, i + 32);
284
+ }
285
+ if (i == 0) {
286
+ gpioname = g_strdup("EXP_IRQ");
287
+ } else {
288
+ gpioname = g_strdup_printf("EXP_CPU%d_IRQ", i);
289
+ }
290
+ qdev_init_gpio_in_named_with_opaque(dev, armsse_exp_irq,
291
+ s->exp_irqs[i],
292
+ gpioname, s->exp_numirq);
293
+ g_free(gpioname);
294
}
295
296
- /* Connect our EXP_IRQ GPIOs to the NVIC's lines 32 and up. */
297
- s->exp_irqs = g_new(qemu_irq, s->exp_numirq);
298
- for (i = 0; i < s->exp_numirq; i++) {
299
- s->exp_irqs[i] = qdev_get_gpio_in(DEVICE(&s->armv7m), i + 32);
300
+ /* Wire up the splitters that connect common IRQs to all CPUs */
301
+ if (info->num_cpus > 1) {
302
+ for (i = 0; i < ARRAY_SIZE(s->cpu_irq_splitter); i++) {
303
+ if (irq_is_common[i]) {
304
+ Object *splitter = OBJECT(&s->cpu_irq_splitter[i]);
305
+ DeviceState *devs = DEVICE(splitter);
306
+ int cpunum;
307
+
308
+ object_property_set_int(splitter, info->num_cpus,
309
+ "num-lines", &err);
310
+ if (err) {
311
+ error_propagate(errp, err);
312
+ return;
313
+ }
314
+ object_property_set_bool(splitter, true, "realized", &err);
315
+ if (err) {
316
+ error_propagate(errp, err);
317
+ return;
318
+ }
319
+ for (cpunum = 0; cpunum < info->num_cpus; cpunum++) {
320
+ DeviceState *cpudev = DEVICE(&s->armv7m[cpunum]);
321
+
322
+ qdev_connect_gpio_out(devs, cpunum,
323
+ qdev_get_gpio_in(cpudev, i));
324
+ }
325
+ }
326
+ }
327
}
328
- qdev_init_gpio_in_named(dev, armsse_exp_irq, "EXP_IRQ", s->exp_numirq);
329
330
/* Set up the big aliases first */
331
make_alias(s, &s->alias1, "alias 1", 0x10000000, 0x10000000, 0x00000000);
332
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
333
return;
334
}
335
qdev_connect_gpio_out(DEVICE(&s->mpc_irq_orgate), 0,
336
- qdev_get_gpio_in(DEVICE(&s->armv7m), 9));
337
+ armsse_get_common_irq_in(s, 9));
338
339
/* Devices behind APB PPC0:
340
* 0x40000000: timer0
341
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
342
return;
343
}
344
sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer0), 0,
345
- qdev_get_gpio_in(DEVICE(&s->armv7m), 3));
346
+ armsse_get_common_irq_in(s, 3));
347
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->timer0), 0);
348
object_property_set_link(OBJECT(&s->apb_ppc0), OBJECT(mr), "port[0]", &err);
349
if (err) {
350
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
351
return;
352
}
353
sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer1), 0,
354
- qdev_get_gpio_in(DEVICE(&s->armv7m), 4));
355
+ armsse_get_common_irq_in(s, 4));
356
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->timer1), 0);
357
object_property_set_link(OBJECT(&s->apb_ppc0), OBJECT(mr), "port[1]", &err);
358
if (err) {
359
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
360
return;
361
}
362
sysbus_connect_irq(SYS_BUS_DEVICE(&s->dualtimer), 0,
363
- qdev_get_gpio_in(DEVICE(&s->armv7m), 5));
364
+ armsse_get_common_irq_in(s, 5));
365
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->dualtimer), 0);
366
object_property_set_link(OBJECT(&s->apb_ppc0), OBJECT(mr), "port[2]", &err);
367
if (err) {
368
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
369
return;
370
}
371
qdev_connect_gpio_out(DEVICE(&s->ppc_irq_orgate), 0,
372
- qdev_get_gpio_in(DEVICE(&s->armv7m), 10));
373
+ armsse_get_common_irq_in(s, 10));
374
375
/* 0x40010000 .. 0x4001ffff: private CPU region: unused in IoTKit */
376
377
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
378
return;
379
}
380
sysbus_connect_irq(SYS_BUS_DEVICE(&s->s32ktimer), 0,
381
- qdev_get_gpio_in(DEVICE(&s->armv7m), 2));
382
+ armsse_get_common_irq_in(s, 2));
383
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->s32ktimer), 0);
384
object_property_set_link(OBJECT(&s->apb_ppc1), OBJECT(mr), "port[0]", &err);
385
if (err) {
386
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
387
return;
388
}
389
sysbus_connect_irq(SYS_BUS_DEVICE(&s->nswatchdog), 0,
390
- qdev_get_gpio_in(DEVICE(&s->armv7m), 1));
391
+ armsse_get_common_irq_in(s, 1));
392
sysbus_mmio_map(SYS_BUS_DEVICE(&s->nswatchdog), 0, 0x40081000);
393
394
qdev_prop_set_uint32(DEVICE(&s->swatchdog), "wdogclk-frq", s->mainclk_frq);
395
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
396
qdev_pass_gpios(dev_secctl, dev, "mscexp_clear");
397
qdev_pass_gpios(dev_secctl, dev, "mscexp_ns");
398
qdev_connect_gpio_out_named(dev_secctl, "msc_irq", 0,
399
- qdev_get_gpio_in(DEVICE(&s->armv7m), 11));
400
+ armsse_get_common_irq_in(s, 11));
401
402
/*
403
* Expose our container region to the board model; this corresponds
404
--
105
--
405
2.20.1
106
2.25.1
406
407
diff view generated by jsdifflib
1
The SYS_VERSION and SYS_CONFIG register values differ between the
1
From: Richard Henderson <richard.henderson@linaro.org>
2
IoTKit and SSE-200. Make them configurable via QOM properties rather
3
than hard-coded, and set them appropriately in the ARMSSE code that
4
instantiates the IOTKIT_SYSINFO device.
5
2
3
We have two places that perform this particular operation.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-39-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20190121185118.18550-15-peter.maydell@linaro.org
9
---
9
---
10
include/hw/misc/iotkit-sysinfo.h | 6 ++++
10
target/arm/translate-sve.c | 30 +++++++++++++++++-------------
11
hw/arm/armsse.c | 51 ++++++++++++++++++++++++++++++++
11
1 file changed, 17 insertions(+), 13 deletions(-)
12
hw/misc/iotkit-sysinfo.c | 15 ++++++++--
13
3 files changed, 70 insertions(+), 2 deletions(-)
14
12
15
diff --git a/include/hw/misc/iotkit-sysinfo.h b/include/hw/misc/iotkit-sysinfo.h
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/misc/iotkit-sysinfo.h
15
--- a/target/arm/translate-sve.c
18
+++ b/include/hw/misc/iotkit-sysinfo.h
16
+++ b/target/arm/translate-sve.c
19
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzz(DisasContext *s, gen_helper_gvec_4 *fn,
20
* Arm IoTKit and documented in
18
return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, data);
21
* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ecm0601256/index.html
19
}
22
* QEMU interface:
20
23
+ * + QOM property "SYS_VERSION": value to use for SYS_VERSION register
21
+/* Invoke a vector expander on two Zregs and an immediate. */
24
+ * + QOM property "SYS_CONFIG": value to use for SYS_CONFIG register
22
+static bool gen_gvec_fn_zzi(DisasContext *s, GVecGen2iFn *gvec_fn,
25
* + sysbus MMIO region 0: the system information register bank
23
+ int esz, int rd, int rn, uint64_t imm)
26
*/
27
28
@@ -XXX,XX +XXX,XX @@ typedef struct IoTKitSysInfo {
29
30
/*< public >*/
31
MemoryRegion iomem;
32
+
33
+ /* Properties */
34
+ uint32_t sys_version;
35
+ uint32_t sys_config;
36
} IoTKitSysInfo;
37
38
#endif
39
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/hw/arm/armsse.c
42
+++ b/hw/arm/armsse.c
43
@@ -XXX,XX +XXX,XX @@
44
#include "hw/arm/armsse.h"
45
#include "hw/arm/arm.h"
46
47
+/* Format of the System Information block SYS_CONFIG register */
48
+typedef enum SysConfigFormat {
49
+ IoTKitFormat,
50
+ SSE200Format,
51
+} SysConfigFormat;
52
+
53
struct ARMSSEInfo {
54
const char *name;
55
int sram_banks;
56
int num_cpus;
57
+ uint32_t sys_version;
58
+ SysConfigFormat sys_config_format;
59
};
60
61
static const ARMSSEInfo armsse_variants[] = {
62
@@ -XXX,XX +XXX,XX @@ static const ARMSSEInfo armsse_variants[] = {
63
.name = TYPE_IOTKIT,
64
.sram_banks = 1,
65
.num_cpus = 1,
66
+ .sys_version = 0x41743,
67
+ .sys_config_format = IoTKitFormat,
68
},
69
};
70
71
+static uint32_t armsse_sys_config_value(ARMSSE *s, const ARMSSEInfo *info)
72
+{
24
+{
73
+ /* Return the SYS_CONFIG value for this SSE */
25
+ if (gvec_fn == NULL) {
74
+ uint32_t sys_config;
26
+ return false;
75
+
76
+ switch (info->sys_config_format) {
77
+ case IoTKitFormat:
78
+ sys_config = 0;
79
+ sys_config = deposit32(sys_config, 0, 4, info->sram_banks);
80
+ sys_config = deposit32(sys_config, 4, 4, s->sram_addr_width - 12);
81
+ break;
82
+ case SSE200Format:
83
+ sys_config = 0;
84
+ sys_config = deposit32(sys_config, 0, 4, info->sram_banks);
85
+ sys_config = deposit32(sys_config, 4, 5, s->sram_addr_width);
86
+ sys_config = deposit32(sys_config, 24, 4, 2);
87
+ if (info->num_cpus > 1) {
88
+ sys_config = deposit32(sys_config, 10, 1, 1);
89
+ sys_config = deposit32(sys_config, 20, 4, info->sram_banks - 1);
90
+ sys_config = deposit32(sys_config, 28, 4, 2);
91
+ }
92
+ break;
93
+ default:
94
+ g_assert_not_reached();
95
+ }
27
+ }
96
+ return sys_config;
28
+ if (sve_access_check(s)) {
29
+ unsigned vsz = vec_full_reg_size(s);
30
+ gvec_fn(esz, vec_full_reg_offset(s, rd),
31
+ vec_full_reg_offset(s, rn), imm, vsz, vsz);
32
+ }
33
+ return true;
97
+}
34
+}
98
+
35
+
99
/* Clock frequency in HZ of the 32KHz "slow clock" */
36
/* Invoke a vector expander on three Zregs. */
100
#define S32KCLK (32 * 1000)
37
static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
101
38
int esz, int rd, int rn, int rm)
102
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
39
@@ -XXX,XX +XXX,XX @@ static bool do_zz_dbm(DisasContext *s, arg_rr_dbm *a, GVecGen2iFn *gvec_fn)
103
qdev_get_gpio_in_named(dev_apb_ppc1,
40
extract32(a->dbm, 6, 6))) {
104
"cfg_sec_resp", 0));
41
return false;
105
42
}
106
+ object_property_set_int(OBJECT(&s->sysinfo), info->sys_version,
43
- if (sve_access_check(s)) {
107
+ "SYS_VERSION", &err);
44
- unsigned vsz = vec_full_reg_size(s);
108
+ if (err) {
45
- gvec_fn(MO_64, vec_full_reg_offset(s, a->rd),
109
+ error_propagate(errp, err);
46
- vec_full_reg_offset(s, a->rn), imm, vsz, vsz);
110
+ return;
47
- }
111
+ }
48
- return true;
112
+ object_property_set_int(OBJECT(&s->sysinfo),
49
+ return gen_gvec_fn_zzi(s, gvec_fn, MO_64, a->rd, a->rn, imm);
113
+ armsse_sys_config_value(s, info),
114
+ "SYS_CONFIG", &err);
115
+ if (err) {
116
+ error_propagate(errp, err);
117
+ return;
118
+ }
119
object_property_set_bool(OBJECT(&s->sysinfo), true, "realized", &err);
120
if (err) {
121
error_propagate(errp, err);
122
diff --git a/hw/misc/iotkit-sysinfo.c b/hw/misc/iotkit-sysinfo.c
123
index XXXXXXX..XXXXXXX 100644
124
--- a/hw/misc/iotkit-sysinfo.c
125
+++ b/hw/misc/iotkit-sysinfo.c
126
@@ -XXX,XX +XXX,XX @@ static const int sysinfo_id[] = {
127
static uint64_t iotkit_sysinfo_read(void *opaque, hwaddr offset,
128
unsigned size)
129
{
130
+ IoTKitSysInfo *s = IOTKIT_SYSINFO(opaque);
131
uint64_t r;
132
133
switch (offset) {
134
case A_SYS_VERSION:
135
- r = 0x41743;
136
+ r = s->sys_version;
137
break;
138
139
case A_SYS_CONFIG:
140
- r = 0x31;
141
+ r = s->sys_config;
142
break;
143
case A_PID4 ... A_CID3:
144
r = sysinfo_id[(offset - A_PID4) / 4];
145
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps iotkit_sysinfo_ops = {
146
.valid.max_access_size = 4,
147
};
148
149
+static Property iotkit_sysinfo_props[] = {
150
+ DEFINE_PROP_UINT32("SYS_VERSION", IoTKitSysInfo, sys_version, 0),
151
+ DEFINE_PROP_UINT32("SYS_CONFIG", IoTKitSysInfo, sys_config, 0),
152
+ DEFINE_PROP_END_OF_LIST()
153
+};
154
+
155
static void iotkit_sysinfo_init(Object *obj)
156
{
157
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
158
@@ -XXX,XX +XXX,XX @@ static void iotkit_sysinfo_init(Object *obj)
159
160
static void iotkit_sysinfo_class_init(ObjectClass *klass, void *data)
161
{
162
+ DeviceClass *dc = DEVICE_CLASS(klass);
163
+
164
/*
165
* This device has no guest-modifiable state and so it
166
* does not need a reset function or VMState.
167
*/
168
+
169
+ dc->props = iotkit_sysinfo_props;
170
}
50
}
171
51
172
static const TypeInfo iotkit_sysinfo_info = {
52
static bool trans_AND_zzi(DisasContext *s, arg_rr_dbm *a)
53
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
54
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
55
return false;
56
}
57
- if (sve_access_check(s)) {
58
- unsigned vsz = vec_full_reg_size(s);
59
- unsigned rd_ofs = vec_full_reg_offset(s, a->rd);
60
- unsigned rn_ofs = vec_full_reg_offset(s, a->rn);
61
- fn(a->esz, rd_ofs, rn_ofs, a->imm, vsz, vsz);
62
- }
63
- return true;
64
+ return gen_gvec_fn_zzi(s, fn, a->esz, a->rd, a->rn, a->imm);
65
}
66
67
static bool trans_SSRA(DisasContext *s, arg_rri_esz *a)
173
--
68
--
174
2.20.1
69
2.25.1
175
176
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-40-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 17 +++--------------
9
1 file changed, 3 insertions(+), 14 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_zz_dbm(DisasContext *s, arg_rr_dbm *a, GVecGen2iFn *gvec_fn)
16
return gen_gvec_fn_zzi(s, gvec_fn, MO_64, a->rd, a->rn, imm);
17
}
18
19
-static bool trans_AND_zzi(DisasContext *s, arg_rr_dbm *a)
20
-{
21
- return do_zz_dbm(s, a, tcg_gen_gvec_andi);
22
-}
23
-
24
-static bool trans_ORR_zzi(DisasContext *s, arg_rr_dbm *a)
25
-{
26
- return do_zz_dbm(s, a, tcg_gen_gvec_ori);
27
-}
28
-
29
-static bool trans_EOR_zzi(DisasContext *s, arg_rr_dbm *a)
30
-{
31
- return do_zz_dbm(s, a, tcg_gen_gvec_xori);
32
-}
33
+TRANS_FEAT(AND_zzi, aa64_sve, do_zz_dbm, a, tcg_gen_gvec_andi)
34
+TRANS_FEAT(ORR_zzi, aa64_sve, do_zz_dbm, a, tcg_gen_gvec_ori)
35
+TRANS_FEAT(EOR_zzi, aa64_sve, do_zz_dbm, a, tcg_gen_gvec_xori)
36
37
static bool trans_DUPM(DisasContext *s, arg_DUPM *a)
38
{
39
--
40
2.25.1
diff view generated by jsdifflib
1
From: Aaron Lindsay OS <aaron@os.amperecomputing.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Make PMU overflow interrupts more accurate by using a timer to predict
3
The check is already done in gen_gvec_ool_zzzp,
4
when they will overflow rather than waiting for an event to occur which
4
which is called by do_sel_z; remove from callers.
5
allows us to otherwise check them.
6
5
7
Signed-off-by: Aaron Lindsay <aaron@os.amperecomputing.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-41-richard.henderson@linaro.org
9
Message-id: 20190124162401.5111-3-aaron@os.amperecomputing.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
target/arm/cpu.h | 10 +++++++
11
target/arm/translate-sve.c | 14 ++++----------
13
target/arm/cpu.c | 12 ++++++++
12
1 file changed, 4 insertions(+), 10 deletions(-)
14
target/arm/helper.c | 72 +++++++++++++++++++++++++++++++++++++++++++--
15
3 files changed, 92 insertions(+), 2 deletions(-)
16
13
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
16
--- a/target/arm/translate-sve.c
20
+++ b/target/arm/cpu.h
17
+++ b/target/arm/translate-sve.c
21
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
18
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(UQSUB_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_ussub, a)
22
19
/* Select active elememnts from Zn and inactive elements from Zm,
23
/* Timers used by the generic (architected) timer */
20
* storing the result in Zd.
24
QEMUTimer *gt_timer[NUM_GTIMERS];
25
+ /*
26
+ * Timer used by the PMU. Its state is restored after migration by
27
+ * pmu_op_finish() - it does not need other handling during migration
28
+ */
29
+ QEMUTimer *pmu_timer;
30
/* GPIO outputs for generic timer */
31
qemu_irq gt_timer_outputs[NUM_GTIMERS];
32
/* GPIO output for GICv3 maintenance interrupt signal */
33
@@ -XXX,XX +XXX,XX @@ void pmccntr_op_finish(CPUARMState *env);
34
void pmu_op_start(CPUARMState *env);
35
void pmu_op_finish(CPUARMState *env);
36
37
+/*
38
+ * Called when a PMU counter is due to overflow
39
+ */
40
+void arm_pmu_timer_cb(void *opaque);
41
+
42
/**
43
* Functions to register as EL change hooks for PMU mode filtering
44
*/
21
*/
45
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
22
-static void do_sel_z(DisasContext *s, int rd, int rn, int rm, int pg, int esz)
46
index XXXXXXX..XXXXXXX 100644
23
+static bool do_sel_z(DisasContext *s, int rd, int rn, int rm, int pg, int esz)
47
--- a/target/arm/cpu.c
24
{
48
+++ b/target/arm/cpu.c
25
static gen_helper_gvec_4 * const fns[4] = {
49
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_finalizefn(Object *obj)
26
gen_helper_sve_sel_zpzz_b, gen_helper_sve_sel_zpzz_h,
50
QLIST_REMOVE(hook, node);
27
gen_helper_sve_sel_zpzz_s, gen_helper_sve_sel_zpzz_d
51
g_free(hook);
28
};
52
}
29
- gen_gvec_ool_zzzp(s, fns[esz], rd, rn, rm, pg, 0);
53
+#ifndef CONFIG_USER_ONLY
30
+ return gen_gvec_ool_zzzp(s, fns[esz], rd, rn, rm, pg, 0);
54
+ if (cpu->pmu_timer) {
55
+ timer_del(cpu->pmu_timer);
56
+ timer_deinit(cpu->pmu_timer);
57
+ timer_free(cpu->pmu_timer);
58
+ }
59
+#endif
60
}
31
}
61
32
62
static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
33
#define DO_ZPZZ(NAME, FEAT, name) \
63
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
34
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(UDIV_zpzz, aa64_sve, gen_gvec_ool_arg_zpzz, udiv_fns[a->esz], a, 0)
64
arm_register_pre_el_change_hook(cpu, &pmu_pre_el_change, 0);
35
65
arm_register_el_change_hook(cpu, &pmu_post_el_change, 0);
36
static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
66
}
37
{
67
+
38
- if (sve_access_check(s)) {
68
+#ifndef CONFIG_USER_ONLY
39
- do_sel_z(s, a->rd, a->rn, a->rm, a->pg, a->esz);
69
+ cpu->pmu_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, arm_pmu_timer_cb,
40
- }
70
+ cpu);
41
- return true;
71
+#endif
42
+ return do_sel_z(s, a->rd, a->rn, a->rm, a->pg, a->esz);
72
} else {
73
cpu->id_aa64dfr0 &= ~0xf00;
74
cpu->pmceid0 = 0;
75
diff --git a/target/arm/helper.c b/target/arm/helper.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/arm/helper.c
78
+++ b/target/arm/helper.c
79
@@ -XXX,XX +XXX,XX @@ typedef struct pm_event {
80
* counters hold a difference from the return value from this function
81
*/
82
uint64_t (*get_count)(CPUARMState *);
83
+ /*
84
+ * Return how many nanoseconds it will take (at a minimum) for count events
85
+ * to occur. A negative value indicates the counter will never overflow, or
86
+ * that the counter has otherwise arranged for the overflow bit to be set
87
+ * and the PMU interrupt to be raised on overflow.
88
+ */
89
+ int64_t (*ns_per_count)(uint64_t);
90
} pm_event;
91
92
static bool event_always_supported(CPUARMState *env)
93
@@ -XXX,XX +XXX,XX @@ static uint64_t swinc_get_count(CPUARMState *env)
94
return 0;
95
}
43
}
96
44
97
+static int64_t swinc_ns_per(uint64_t ignored)
98
+{
99
+ return -1;
100
+}
101
+
102
/*
45
/*
103
* Return the underlying cycle count for the PMU cycle counters. If we're in
46
@@ -XXX,XX +XXX,XX @@ static bool trans_MOVPRFX(DisasContext *s, arg_MOVPRFX *a)
104
* usermode, simply return 0.
47
105
@@ -XXX,XX +XXX,XX @@ static uint64_t cycles_get_count(CPUARMState *env)
48
static bool trans_MOVPRFX_m(DisasContext *s, arg_rpr_esz *a)
49
{
50
- if (sve_access_check(s)) {
51
- do_sel_z(s, a->rd, a->rn, a->rd, a->pg, a->esz);
52
- }
53
- return true;
54
+ return do_sel_z(s, a->rd, a->rn, a->rd, a->pg, a->esz);
106
}
55
}
107
56
108
#ifndef CONFIG_USER_ONLY
57
static bool trans_MOVPRFX_z(DisasContext *s, arg_rpr_esz *a)
109
+static int64_t cycles_ns_per(uint64_t cycles)
110
+{
111
+ return (ARM_CPU_FREQ / NANOSECONDS_PER_SECOND) * cycles;
112
+}
113
+
114
static bool instructions_supported(CPUARMState *env)
115
{
116
return use_icount == 1 /* Precise instruction counting */;
117
@@ -XXX,XX +XXX,XX @@ static uint64_t instructions_get_count(CPUARMState *env)
118
{
119
return (uint64_t)cpu_get_icount_raw();
120
}
121
+
122
+static int64_t instructions_ns_per(uint64_t icount)
123
+{
124
+ return cpu_icount_to_ns((int64_t)icount);
125
+}
126
#endif
127
128
static const pm_event pm_events[] = {
129
{ .number = 0x000, /* SW_INCR */
130
.supported = event_always_supported,
131
.get_count = swinc_get_count,
132
+ .ns_per_count = swinc_ns_per,
133
},
134
#ifndef CONFIG_USER_ONLY
135
{ .number = 0x008, /* INST_RETIRED, Instruction architecturally executed */
136
.supported = instructions_supported,
137
.get_count = instructions_get_count,
138
+ .ns_per_count = instructions_ns_per,
139
},
140
{ .number = 0x011, /* CPU_CYCLES, Cycle */
141
.supported = event_always_supported,
142
.get_count = cycles_get_count,
143
+ .ns_per_count = cycles_ns_per,
144
}
145
#endif
146
};
147
@@ -XXX,XX +XXX,XX @@ void pmccntr_op_start(CPUARMState *env)
148
void pmccntr_op_finish(CPUARMState *env)
149
{
150
if (pmu_counter_enabled(env, 31)) {
151
- uint64_t prev_cycles = env->cp15.c15_ccnt_delta;
152
+#ifndef CONFIG_USER_ONLY
153
+ /* Calculate when the counter will next overflow */
154
+ uint64_t remaining_cycles = -env->cp15.c15_ccnt;
155
+ if (!(env->cp15.c9_pmcr & PMCRLC)) {
156
+ remaining_cycles = (uint32_t)remaining_cycles;
157
+ }
158
+ int64_t overflow_in = cycles_ns_per(remaining_cycles);
159
160
+ if (overflow_in > 0) {
161
+ int64_t overflow_at = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
162
+ overflow_in;
163
+ ARMCPU *cpu = arm_env_get_cpu(env);
164
+ timer_mod_anticipate_ns(cpu->pmu_timer, overflow_at);
165
+ }
166
+#endif
167
+
168
+ uint64_t prev_cycles = env->cp15.c15_ccnt_delta;
169
if (env->cp15.c9_pmcr & PMCRD) {
170
/* Increment once every 64 processor clock cycles */
171
prev_cycles /= 64;
172
}
173
-
174
env->cp15.c15_ccnt_delta = prev_cycles - env->cp15.c15_ccnt;
175
}
176
}
177
@@ -XXX,XX +XXX,XX @@ static void pmevcntr_op_start(CPUARMState *env, uint8_t counter)
178
static void pmevcntr_op_finish(CPUARMState *env, uint8_t counter)
179
{
180
if (pmu_counter_enabled(env, counter)) {
181
+#ifndef CONFIG_USER_ONLY
182
+ uint16_t event = env->cp15.c14_pmevtyper[counter] & PMXEVTYPER_EVTCOUNT;
183
+ uint16_t event_idx = supported_event_map[event];
184
+ uint64_t delta = UINT32_MAX -
185
+ (uint32_t)env->cp15.c14_pmevcntr[counter] + 1;
186
+ int64_t overflow_in = pm_events[event_idx].ns_per_count(delta);
187
+
188
+ if (overflow_in > 0) {
189
+ int64_t overflow_at = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
190
+ overflow_in;
191
+ ARMCPU *cpu = arm_env_get_cpu(env);
192
+ timer_mod_anticipate_ns(cpu->pmu_timer, overflow_at);
193
+ }
194
+#endif
195
+
196
env->cp15.c14_pmevcntr_delta[counter] -=
197
env->cp15.c14_pmevcntr[counter];
198
}
199
@@ -XXX,XX +XXX,XX @@ void pmu_post_el_change(ARMCPU *cpu, void *ignored)
200
pmu_op_finish(&cpu->env);
201
}
202
203
+void arm_pmu_timer_cb(void *opaque)
204
+{
205
+ ARMCPU *cpu = opaque;
206
+
207
+ /*
208
+ * Update all the counter values based on the current underlying counts,
209
+ * triggering interrupts to be raised, if necessary. pmu_op_finish() also
210
+ * has the effect of setting the cpu->pmu_timer to the next earliest time a
211
+ * counter may expire.
212
+ */
213
+ pmu_op_start(&cpu->env);
214
+ pmu_op_finish(&cpu->env);
215
+}
216
+
217
static void pmcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
218
uint64_t value)
219
{
220
--
58
--
221
2.20.1
59
2.25.1
222
223
diff view generated by jsdifflib
1
From: Julia Suvorova <jusual@mail.ru>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Until now, the set_pc logic was unclear, which raised questions about
3
We have two places that perform this particular operation.
4
whether it should be used directly, applying a value to PC or adding
5
additional checks, for example, set the Thumb bit in Arm cpu. Let's set
6
the set_pc logic for “Configure the PC, as was done in the ELF file”
7
and implement synchronize_with_tb hook for preserving PC to cpu_tb_exec.
8
4
9
Signed-off-by: Julia Suvorova <jusual@mail.ru>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
6
Message-id: 20220527181907.189259-42-richard.henderson@linaro.org
11
Message-id: 20190129121817.7109-1-jusual@mail.ru
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
9
---
15
include/qom/cpu.h | 16 ++++++++++++++--
10
target/arm/translate-sve.c | 21 +++++++++++++--------
16
hw/arm/boot.c | 4 ----
11
1 file changed, 13 insertions(+), 8 deletions(-)
17
target/arm/arm-powerctl.c | 3 ---
18
target/arm/cpu.c | 26 +++++++++++++++++++++++++-
19
target/arm/cpu64.c | 15 ---------------
20
5 files changed, 39 insertions(+), 25 deletions(-)
21
12
22
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
23
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
24
--- a/include/qom/cpu.h
15
--- a/target/arm/translate-sve.c
25
+++ b/include/qom/cpu.h
16
+++ b/target/arm/translate-sve.c
26
@@ -XXX,XX +XXX,XX @@ struct TranslationBlock;
17
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fn_zzi(DisasContext *s, GVecGen2iFn *gvec_fn,
27
* @get_arch_id: Callback for getting architecture-dependent CPU ID.
18
return true;
28
* @get_paging_enabled: Callback for inquiring whether paging is enabled.
19
}
29
* @get_memory_mapping: Callback for obtaining the memory mappings.
20
30
- * @set_pc: Callback for setting the Program Counter register.
21
+static bool gen_gvec_fn_arg_zzi(DisasContext *s, GVecGen2iFn *gvec_fn,
31
+ * @set_pc: Callback for setting the Program Counter register. This
22
+ arg_rri_esz *a)
32
+ * should have the semantics used by the target architecture when
23
+{
33
+ * setting the PC from a source such as an ELF file entry point;
24
+ if (a->esz < 0) {
34
+ * for example on Arm it will also set the Thumb mode bit based
25
+ /* Invalid tsz encoding -- see tszimm_esz. */
35
+ * on the least significant bit of the new PC value.
26
+ return false;
36
+ * If the target behaviour here is anything other than "set
37
+ * the PC register to the value passed in" then the target must
38
+ * also implement the synchronize_from_tb hook.
39
* @synchronize_from_tb: Callback for synchronizing state from a TCG
40
- * #TranslationBlock.
41
+ * #TranslationBlock. This is called when we abandon execution
42
+ * of a TB before starting it, and must set all parts of the CPU
43
+ * state which the previous TB in the chain may not have updated.
44
+ * This always includes at least the program counter; some targets
45
+ * will need to do more. If this hook is not implemented then the
46
+ * default is to call @set_pc(tb->pc).
47
* @handle_mmu_fault: Callback for handling an MMU fault.
48
* @get_phys_page_debug: Callback for obtaining a physical address.
49
* @get_phys_page_attrs_debug: Callback for obtaining a physical address and the
50
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/arm/boot.c
53
+++ b/hw/arm/boot.c
54
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
55
g_assert_not_reached();
56
}
57
58
- if (!env->aarch64) {
59
- env->thumb = info->entry & 1;
60
- entry &= 0xfffffffe;
61
- }
62
cpu_set_pc(cs, entry);
63
} else {
64
/* If we are booting Linux then we need to check whether we are
65
diff --git a/target/arm/arm-powerctl.c b/target/arm/arm-powerctl.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/target/arm/arm-powerctl.c
68
+++ b/target/arm/arm-powerctl.c
69
@@ -XXX,XX +XXX,XX @@ static void arm_set_cpu_on_async_work(CPUState *target_cpu_state,
70
71
if (info->target_aa64) {
72
target_cpu->env.xregs[0] = info->context_id;
73
- target_cpu->env.thumb = false;
74
} else {
75
target_cpu->env.regs[0] = info->context_id;
76
- target_cpu->env.thumb = info->entry & 1;
77
- info->entry &= 0xfffffffe;
78
}
79
80
/* Start the new CPU at the requested address */
81
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
82
index XXXXXXX..XXXXXXX 100644
83
--- a/target/arm/cpu.c
84
+++ b/target/arm/cpu.c
85
@@ -XXX,XX +XXX,XX @@
86
static void arm_cpu_set_pc(CPUState *cs, vaddr value)
87
{
88
ARMCPU *cpu = ARM_CPU(cs);
89
+ CPUARMState *env = &cpu->env;
90
91
- cpu->env.regs[15] = value;
92
+ if (is_a64(env)) {
93
+ env->pc = value;
94
+ env->thumb = 0;
95
+ } else {
96
+ env->regs[15] = value & ~1;
97
+ env->thumb = value & 1;
98
+ }
27
+ }
28
+ return gen_gvec_fn_zzi(s, gvec_fn, a->esz, a->rd, a->rn, a->imm);
99
+}
29
+}
100
+
30
+
101
+static void arm_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb)
31
/* Invoke a vector expander on three Zregs. */
102
+{
32
static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
103
+ ARMCPU *cpu = ARM_CPU(cs);
33
int esz, int rd, int rn, int rm)
104
+ CPUARMState *env = &cpu->env;
34
@@ -XXX,XX +XXX,XX @@ static bool trans_ADD_zzi(DisasContext *s, arg_rri_esz *a)
105
+
35
if (a->esz == 0 && extract32(s->insn, 13, 1)) {
106
+ /*
36
return false;
107
+ * It's OK to look at env for the current mode here, because it's
37
}
108
+ * never possible for an AArch64 TB to chain to an AArch32 TB.
38
- if (sve_access_check(s)) {
109
+ */
39
- unsigned vsz = vec_full_reg_size(s);
110
+ if (is_a64(env)) {
40
- tcg_gen_gvec_addi(a->esz, vec_full_reg_offset(s, a->rd),
111
+ env->pc = tb->pc;
41
- vec_full_reg_offset(s, a->rn), a->imm, vsz, vsz);
112
+ } else {
42
- }
113
+ env->regs[15] = tb->pc;
43
- return true;
114
+ }
44
+ return gen_gvec_fn_arg_zzi(s, tcg_gen_gvec_addi, a);
115
}
45
}
116
46
117
static bool arm_cpu_has_work(CPUState *cs)
47
static bool trans_SUB_zzi(DisasContext *s, arg_rri_esz *a)
118
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
48
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(ADCLT, aa64_sve2, do_adcl, a, true)
119
cc->cpu_exec_interrupt = arm_cpu_exec_interrupt;
49
120
cc->dump_state = arm_cpu_dump_state;
50
static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
121
cc->set_pc = arm_cpu_set_pc;
122
+ cc->synchronize_from_tb = arm_cpu_synchronize_from_tb;
123
cc->gdb_read_register = arm_cpu_gdb_read_register;
124
cc->gdb_write_register = arm_cpu_gdb_write_register;
125
#ifdef CONFIG_USER_ONLY
126
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
127
index XXXXXXX..XXXXXXX 100644
128
--- a/target/arm/cpu64.c
129
+++ b/target/arm/cpu64.c
130
@@ -XXX,XX +XXX,XX @@ static void aarch64_cpu_finalizefn(Object *obj)
131
{
51
{
52
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
53
+ if (!dc_isar_feature(aa64_sve2, s)) {
54
return false;
55
}
56
- return gen_gvec_fn_zzi(s, fn, a->esz, a->rd, a->rn, a->imm);
57
+ return gen_gvec_fn_arg_zzi(s, fn, a);
132
}
58
}
133
59
134
-static void aarch64_cpu_set_pc(CPUState *cs, vaddr value)
60
static bool trans_SSRA(DisasContext *s, arg_rri_esz *a)
135
-{
136
- ARMCPU *cpu = ARM_CPU(cs);
137
- /* It's OK to look at env for the current mode here, because it's
138
- * never possible for an AArch64 TB to chain to an AArch32 TB.
139
- * (Otherwise we would need to use synchronize_from_tb instead.)
140
- */
141
- if (is_a64(&cpu->env)) {
142
- cpu->env.pc = value;
143
- } else {
144
- cpu->env.regs[15] = value;
145
- }
146
-}
147
-
148
static gchar *aarch64_gdb_arch_name(CPUState *cs)
149
{
150
return g_strdup("aarch64");
151
@@ -XXX,XX +XXX,XX @@ static void aarch64_cpu_class_init(ObjectClass *oc, void *data)
152
CPUClass *cc = CPU_CLASS(oc);
153
154
cc->cpu_exec_interrupt = arm_cpu_exec_interrupt;
155
- cc->set_pc = aarch64_cpu_set_pc;
156
cc->gdb_read_register = aarch64_cpu_gdb_read_register;
157
cc->gdb_write_register = aarch64_cpu_gdb_write_register;
158
cc->gdb_num_core_regs = 34;
159
--
61
--
160
2.20.1
62
2.25.1
161
162
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions using do_sve2_fn2i
4
to use TRANS_FEAT and gen_gvec_fn_arg_zzi.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-43-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 43 ++++++--------------------------------
12
1 file changed, 6 insertions(+), 37 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool do_adcl(DisasContext *s, arg_rrrr_esz *a, bool sel)
19
TRANS_FEAT(ADCLB, aa64_sve2, do_adcl, a, false)
20
TRANS_FEAT(ADCLT, aa64_sve2, do_adcl, a, true)
21
22
-static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
23
-{
24
- if (!dc_isar_feature(aa64_sve2, s)) {
25
- return false;
26
- }
27
- return gen_gvec_fn_arg_zzi(s, fn, a);
28
-}
29
-
30
-static bool trans_SSRA(DisasContext *s, arg_rri_esz *a)
31
-{
32
- return do_sve2_fn2i(s, a, gen_gvec_ssra);
33
-}
34
-
35
-static bool trans_USRA(DisasContext *s, arg_rri_esz *a)
36
-{
37
- return do_sve2_fn2i(s, a, gen_gvec_usra);
38
-}
39
-
40
-static bool trans_SRSRA(DisasContext *s, arg_rri_esz *a)
41
-{
42
- return do_sve2_fn2i(s, a, gen_gvec_srsra);
43
-}
44
-
45
-static bool trans_URSRA(DisasContext *s, arg_rri_esz *a)
46
-{
47
- return do_sve2_fn2i(s, a, gen_gvec_ursra);
48
-}
49
-
50
-static bool trans_SRI(DisasContext *s, arg_rri_esz *a)
51
-{
52
- return do_sve2_fn2i(s, a, gen_gvec_sri);
53
-}
54
-
55
-static bool trans_SLI(DisasContext *s, arg_rri_esz *a)
56
-{
57
- return do_sve2_fn2i(s, a, gen_gvec_sli);
58
-}
59
+TRANS_FEAT(SSRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_ssra, a)
60
+TRANS_FEAT(USRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_usra, a)
61
+TRANS_FEAT(SRSRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_srsra, a)
62
+TRANS_FEAT(URSRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_ursra, a)
63
+TRANS_FEAT(SRI, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_sri, a)
64
+TRANS_FEAT(SLI, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_sli, a)
65
66
TRANS_FEAT(SABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_saba, a)
67
TRANS_FEAT(UABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_uaba, a)
68
--
69
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-44-richard.henderson@linaro.org
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
---
7
---
7
linux-user/elfload.c | 1 +
8
target/arm/translate-sve.c | 20 +++++++-------------
8
1 file changed, 1 insertion(+)
9
1 file changed, 7 insertions(+), 13 deletions(-)
9
10
10
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
11
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
12
--- a/linux-user/elfload.c
13
--- a/target/arm/translate-sve.c
13
+++ b/linux-user/elfload.c
14
+++ b/target/arm/translate-sve.c
14
@@ -XXX,XX +XXX,XX @@ static uint32_t get_elf_hwcap(void)
15
@@ -XXX,XX +XXX,XX @@ static bool do_vpz_ool(DisasContext *s, arg_rpr_esz *a,
15
GET_FEATURE_ID(aa64_dp, ARM_HWCAP_A64_ASIMDDP);
16
}
16
GET_FEATURE_ID(aa64_fcma, ARM_HWCAP_A64_FCMA);
17
17
GET_FEATURE_ID(aa64_sve, ARM_HWCAP_A64_SVE);
18
#define DO_VPZ(NAME, name) \
18
+ GET_FEATURE_ID(aa64_pauth, ARM_HWCAP_A64_PACA | ARM_HWCAP_A64_PACG);
19
-static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
19
20
-{ \
20
#undef GET_FEATURE_ID
21
- static gen_helper_gvec_reduc * const fns[4] = { \
22
+ static gen_helper_gvec_reduc * const name##_fns[4] = { \
23
gen_helper_sve_##name##_b, gen_helper_sve_##name##_h, \
24
gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
25
}; \
26
- return do_vpz_ool(s, a, fns[a->esz]); \
27
-}
28
+ TRANS_FEAT(NAME, aa64_sve, do_vpz_ool, a, name##_fns[a->esz])
29
30
DO_VPZ(ORV, orv)
31
DO_VPZ(ANDV, andv)
32
@@ -XXX,XX +XXX,XX @@ DO_VPZ(UMAXV, umaxv)
33
DO_VPZ(SMINV, sminv)
34
DO_VPZ(UMINV, uminv)
35
36
-static bool trans_SADDV(DisasContext *s, arg_rpr_esz *a)
37
-{
38
- static gen_helper_gvec_reduc * const fns[4] = {
39
- gen_helper_sve_saddv_b, gen_helper_sve_saddv_h,
40
- gen_helper_sve_saddv_s, NULL
41
- };
42
- return do_vpz_ool(s, a, fns[a->esz]);
43
-}
44
+static gen_helper_gvec_reduc * const saddv_fns[4] = {
45
+ gen_helper_sve_saddv_b, gen_helper_sve_saddv_h,
46
+ gen_helper_sve_saddv_s, NULL
47
+};
48
+TRANS_FEAT(SADDV, aa64_sve, do_vpz_ool, a, saddv_fns[a->esz])
49
50
#undef DO_VPZ
21
51
22
--
52
--
23
2.20.1
53
2.25.1
24
25
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-45-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 17 +++--------------
9
1 file changed, 3 insertions(+), 14 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_shift_imm(DisasContext *s, arg_rri_esz *a, bool asr,
16
return true;
17
}
18
19
-static bool trans_ASR_zzi(DisasContext *s, arg_rri_esz *a)
20
-{
21
- return do_shift_imm(s, a, true, tcg_gen_gvec_sari);
22
-}
23
-
24
-static bool trans_LSR_zzi(DisasContext *s, arg_rri_esz *a)
25
-{
26
- return do_shift_imm(s, a, false, tcg_gen_gvec_shri);
27
-}
28
-
29
-static bool trans_LSL_zzi(DisasContext *s, arg_rri_esz *a)
30
-{
31
- return do_shift_imm(s, a, false, tcg_gen_gvec_shli);
32
-}
33
+TRANS_FEAT(ASR_zzi, aa64_sve, do_shift_imm, a, true, tcg_gen_gvec_sari)
34
+TRANS_FEAT(LSR_zzi, aa64_sve, do_shift_imm, a, false, tcg_gen_gvec_shri)
35
+TRANS_FEAT(LSL_zzi, aa64_sve, do_shift_imm, a, false, tcg_gen_gvec_shli)
36
37
#define DO_ZZW(NAME, name) \
38
static gen_helper_gvec_3 * const name##_zzw_fns[4] = { \
39
--
40
2.25.1
diff view generated by jsdifflib
1
In the AdvSIMD load/store single structure encodings, the
1
From: Richard Henderson <richard.henderson@linaro.org>
2
non-post-indexed case should have zeroes in [20:16] (which is the
3
Rm field for the post-indexed case). Bit 31 must also be zero
4
(a check we got right in ldst_multiple but not here). Correctly
5
UNDEF these unallocated encodings.
6
2
7
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
3
Share code between the various shifts using arg_rpri_esz.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-46-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Message-id: 20190125182626.9221-5-peter.maydell@linaro.org
11
---
9
---
12
target/arm/translate-a64.c | 11 ++++++++++-
10
target/arm/translate-sve.c | 68 +++++++++++++++++---------------------
13
1 file changed, 10 insertions(+), 1 deletion(-)
11
1 file changed, 30 insertions(+), 38 deletions(-)
14
12
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
15
--- a/target/arm/translate-sve.c
18
+++ b/target/arm/translate-a64.c
16
+++ b/target/arm/translate-sve.c
19
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn)
17
@@ -XXX,XX +XXX,XX @@ static bool do_movz_zpz(DisasContext *s, int rd, int rn, int pg,
20
{
18
return gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
21
int rt = extract32(insn, 0, 5);
19
}
22
int rn = extract32(insn, 5, 5);
20
23
+ int rm = extract32(insn, 16, 5);
21
+static bool do_shift_zpzi(DisasContext *s, arg_rpri_esz *a, bool asr,
24
int size = extract32(insn, 10, 2);
22
+ gen_helper_gvec_3 * const fns[4])
25
int S = extract32(insn, 12, 1);
23
+{
26
int opc = extract32(insn, 13, 3);
24
+ int max;
27
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn)
25
+
28
int ebytes, xs;
26
+ if (a->esz < 0) {
29
TCGv_i64 tcg_addr, tcg_rn, tcg_ebytes;
27
+ /* Invalid tsz encoding -- see tszimm_esz. */
30
28
+ return false;
31
+ if (extract32(insn, 31, 1)) {
32
+ unallocated_encoding(s);
33
+ return;
34
+ }
35
+ if (!is_postidx && rm != 0) {
36
+ unallocated_encoding(s);
37
+ return;
38
+ }
29
+ }
39
+
30
+
40
switch (scale) {
31
+ /*
41
case 3:
32
+ * Shift by element size is architecturally valid.
42
if (!is_load || S) {
33
+ * For arithmetic right-shift, it's the same as by one less.
43
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn)
34
+ * For logical shifts and ASRD, it is a zeroing operation.
44
}
35
+ */
45
36
+ max = 8 << a->esz;
46
if (is_postidx) {
37
+ if (a->imm >= max) {
47
- int rm = extract32(insn, 16, 5);
38
+ if (asr) {
48
if (rm == 31) {
39
+ a->imm = max - 1;
49
tcg_gen_mov_i64(tcg_rn, tcg_addr);
40
+ } else {
50
} else {
41
+ return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
42
+ }
43
+ }
44
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
45
+}
46
+
47
static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
48
{
49
static gen_helper_gvec_3 * const fns[4] = {
50
gen_helper_sve_asr_zpzi_b, gen_helper_sve_asr_zpzi_h,
51
gen_helper_sve_asr_zpzi_s, gen_helper_sve_asr_zpzi_d,
52
};
53
- if (a->esz < 0) {
54
- /* Invalid tsz encoding -- see tszimm_esz. */
55
- return false;
56
- }
57
- /* Shift by element size is architecturally valid. For
58
- arithmetic right-shift, it's the same as by one less. */
59
- a->imm = MIN(a->imm, (8 << a->esz) - 1);
60
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
61
+ return do_shift_zpzi(s, a, true, fns);
62
}
63
64
static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
65
@@ -XXX,XX +XXX,XX @@ static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
66
gen_helper_sve_lsr_zpzi_b, gen_helper_sve_lsr_zpzi_h,
67
gen_helper_sve_lsr_zpzi_s, gen_helper_sve_lsr_zpzi_d,
68
};
69
- if (a->esz < 0) {
70
- return false;
71
- }
72
- /* Shift by element size is architecturally valid.
73
- For logical shifts, it is a zeroing operation. */
74
- if (a->imm >= (8 << a->esz)) {
75
- return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
76
- } else {
77
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
78
- }
79
+ return do_shift_zpzi(s, a, false, fns);
80
}
81
82
static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
83
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
84
gen_helper_sve_lsl_zpzi_b, gen_helper_sve_lsl_zpzi_h,
85
gen_helper_sve_lsl_zpzi_s, gen_helper_sve_lsl_zpzi_d,
86
};
87
- if (a->esz < 0) {
88
- return false;
89
- }
90
- /* Shift by element size is architecturally valid.
91
- For logical shifts, it is a zeroing operation. */
92
- if (a->imm >= (8 << a->esz)) {
93
- return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
94
- } else {
95
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
96
- }
97
+ return do_shift_zpzi(s, a, false, fns);
98
}
99
100
static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
101
@@ -XXX,XX +XXX,XX @@ static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
102
gen_helper_sve_asrd_b, gen_helper_sve_asrd_h,
103
gen_helper_sve_asrd_s, gen_helper_sve_asrd_d,
104
};
105
- if (a->esz < 0) {
106
- return false;
107
- }
108
- /* Shift by element size is architecturally valid. For arithmetic
109
- right shift for division, it is a zeroing operation. */
110
- if (a->imm >= (8 << a->esz)) {
111
- return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
112
- } else {
113
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
114
- }
115
+ return do_shift_zpzi(s, a, false, fns);
116
}
117
118
static gen_helper_gvec_3 * const sqshl_zpzi_fns[4] = {
51
--
119
--
52
2.20.1
120
2.25.1
53
54
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-47-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 52 +++++++++++++++-----------------------
9
1 file changed, 20 insertions(+), 32 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_shift_zpzi(DisasContext *s, arg_rpri_esz *a, bool asr,
16
return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
17
}
18
19
-static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
20
-{
21
- static gen_helper_gvec_3 * const fns[4] = {
22
- gen_helper_sve_asr_zpzi_b, gen_helper_sve_asr_zpzi_h,
23
- gen_helper_sve_asr_zpzi_s, gen_helper_sve_asr_zpzi_d,
24
- };
25
- return do_shift_zpzi(s, a, true, fns);
26
-}
27
+static gen_helper_gvec_3 * const asr_zpzi_fns[4] = {
28
+ gen_helper_sve_asr_zpzi_b, gen_helper_sve_asr_zpzi_h,
29
+ gen_helper_sve_asr_zpzi_s, gen_helper_sve_asr_zpzi_d,
30
+};
31
+TRANS_FEAT(ASR_zpzi, aa64_sve, do_shift_zpzi, a, true, asr_zpzi_fns)
32
33
-static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
34
-{
35
- static gen_helper_gvec_3 * const fns[4] = {
36
- gen_helper_sve_lsr_zpzi_b, gen_helper_sve_lsr_zpzi_h,
37
- gen_helper_sve_lsr_zpzi_s, gen_helper_sve_lsr_zpzi_d,
38
- };
39
- return do_shift_zpzi(s, a, false, fns);
40
-}
41
+static gen_helper_gvec_3 * const lsr_zpzi_fns[4] = {
42
+ gen_helper_sve_lsr_zpzi_b, gen_helper_sve_lsr_zpzi_h,
43
+ gen_helper_sve_lsr_zpzi_s, gen_helper_sve_lsr_zpzi_d,
44
+};
45
+TRANS_FEAT(LSR_zpzi, aa64_sve, do_shift_zpzi, a, false, lsr_zpzi_fns)
46
47
-static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
48
-{
49
- static gen_helper_gvec_3 * const fns[4] = {
50
- gen_helper_sve_lsl_zpzi_b, gen_helper_sve_lsl_zpzi_h,
51
- gen_helper_sve_lsl_zpzi_s, gen_helper_sve_lsl_zpzi_d,
52
- };
53
- return do_shift_zpzi(s, a, false, fns);
54
-}
55
+static gen_helper_gvec_3 * const lsl_zpzi_fns[4] = {
56
+ gen_helper_sve_lsl_zpzi_b, gen_helper_sve_lsl_zpzi_h,
57
+ gen_helper_sve_lsl_zpzi_s, gen_helper_sve_lsl_zpzi_d,
58
+};
59
+TRANS_FEAT(LSL_zpzi, aa64_sve, do_shift_zpzi, a, false, lsl_zpzi_fns)
60
61
-static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
62
-{
63
- static gen_helper_gvec_3 * const fns[4] = {
64
- gen_helper_sve_asrd_b, gen_helper_sve_asrd_h,
65
- gen_helper_sve_asrd_s, gen_helper_sve_asrd_d,
66
- };
67
- return do_shift_zpzi(s, a, false, fns);
68
-}
69
+static gen_helper_gvec_3 * const asrd_fns[4] = {
70
+ gen_helper_sve_asrd_b, gen_helper_sve_asrd_h,
71
+ gen_helper_sve_asrd_s, gen_helper_sve_asrd_d,
72
+};
73
+TRANS_FEAT(ASRD, aa64_sve, do_shift_zpzi, a, false, asrd_fns)
74
75
static gen_helper_gvec_3 * const sqshl_zpzi_fns[4] = {
76
gen_helper_sve2_sqshl_zpzi_b, gen_helper_sve2_sqshl_zpzi_h,
77
--
78
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Remove the DO_ZPZZZ macro, as it had just the two uses.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-48-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate-sve.c | 23 ++++++++++-------------
11
1 file changed, 10 insertions(+), 13 deletions(-)
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static bool do_zpzzz_ool(DisasContext *s, arg_rprrr_esz *a,
18
return true;
19
}
20
21
-#define DO_ZPZZZ(NAME, name) \
22
-static bool trans_##NAME(DisasContext *s, arg_rprrr_esz *a) \
23
-{ \
24
- static gen_helper_gvec_5 * const fns[4] = { \
25
- gen_helper_sve_##name##_b, gen_helper_sve_##name##_h, \
26
- gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
27
- }; \
28
- return do_zpzzz_ool(s, a, fns[a->esz]); \
29
-}
30
+static gen_helper_gvec_5 * const mla_fns[4] = {
31
+ gen_helper_sve_mla_b, gen_helper_sve_mla_h,
32
+ gen_helper_sve_mla_s, gen_helper_sve_mla_d,
33
+};
34
+TRANS_FEAT(MLA, aa64_sve, do_zpzzz_ool, a, mla_fns[a->esz])
35
36
-DO_ZPZZZ(MLA, mla)
37
-DO_ZPZZZ(MLS, mls)
38
-
39
-#undef DO_ZPZZZ
40
+static gen_helper_gvec_5 * const mls_fns[4] = {
41
+ gen_helper_sve_mls_b, gen_helper_sve_mls_h,
42
+ gen_helper_sve_mls_s, gen_helper_sve_mls_d,
43
+};
44
+TRANS_FEAT(MLS, aa64_sve, do_zpzzz_ool, a, mls_fns[a->esz])
45
46
/*
47
*** SVE Index Generation Group
48
--
49
2.25.1
diff view generated by jsdifflib
1
In the encoding groups
1
From: Richard Henderson <richard.henderson@linaro.org>
2
* floating-point data-processing (1 source)
3
* floating-point data-processing (2 source)
4
* floating-point data-processing (3 source)
5
* floating-point immediate
6
* floating-point compare
7
* floating-ponit conditional compare
8
* floating-point conditional select
9
2
10
bit 31 is M and bit 29 is S (and bit 30 is 0, already checked at
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
this point in the decode). None of these groups allocate any
4
Message-id: 20220527181907.189259-49-richard.henderson@linaro.org
12
encoding for M=1 or S=1. We checked this in disas_fp_compare(),
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
disas_fp_ccomp() and disas_fp_csel(), but missed it in disas_fp_1src(),
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
disas_fp_2src(), disas_fp_3src() and disas_fp_imm().
7
---
8
target/arm/translate-sve.c | 53 ++++++++++++++++++--------------------
9
1 file changed, 25 insertions(+), 28 deletions(-)
15
10
16
We also missed that in the fp immediate encoding the imm5 field
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
17
must be all zeroes.
18
19
Correctly UNDEF the unallocated encodings here.
20
21
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
24
Message-id: 20190125182626.9221-7-peter.maydell@linaro.org
25
---
26
target/arm/translate-a64.c | 22 +++++++++++++++++++++-
27
1 file changed, 21 insertions(+), 1 deletion(-)
28
29
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
30
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/translate-a64.c
13
--- a/target/arm/translate-sve.c
32
+++ b/target/arm/translate-a64.c
14
+++ b/target/arm/translate-sve.c
33
@@ -XXX,XX +XXX,XX @@ static void handle_fp_fcvt(DisasContext *s, int opcode,
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(MLS, aa64_sve, do_zpzzz_ool, a, mls_fns[a->esz])
16
*** SVE Index Generation Group
34
*/
17
*/
35
static void disas_fp_1src(DisasContext *s, uint32_t insn)
18
19
-static void do_index(DisasContext *s, int esz, int rd,
20
+static bool do_index(DisasContext *s, int esz, int rd,
21
TCGv_i64 start, TCGv_i64 incr)
36
{
22
{
37
+ int mos = extract32(insn, 29, 3);
23
- unsigned vsz = vec_full_reg_size(s);
38
int type = extract32(insn, 22, 2);
24
- TCGv_i32 desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
39
int opcode = extract32(insn, 15, 6);
25
- TCGv_ptr t_zd = tcg_temp_new_ptr();
40
int rn = extract32(insn, 5, 5);
26
+ unsigned vsz;
41
int rd = extract32(insn, 0, 5);
27
+ TCGv_i32 desc;
42
28
+ TCGv_ptr t_zd;
43
+ if (mos) {
29
+
44
+ unallocated_encoding(s);
30
+ if (!sve_access_check(s)) {
45
+ return;
31
+ return true;
46
+ }
32
+ }
47
+
33
+
48
switch (opcode) {
34
+ vsz = vec_full_reg_size(s);
49
case 0x4: case 0x5: case 0x7:
35
+ desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
50
{
36
+ t_zd = tcg_temp_new_ptr();
51
@@ -XXX,XX +XXX,XX @@ static void handle_fp_2src_half(DisasContext *s, int opcode,
37
52
*/
38
tcg_gen_addi_ptr(t_zd, cpu_env, vec_full_reg_offset(s, rd));
53
static void disas_fp_2src(DisasContext *s, uint32_t insn)
39
if (esz == 3) {
40
@@ -XXX,XX +XXX,XX @@ static void do_index(DisasContext *s, int esz, int rd,
41
tcg_temp_free_i32(i32);
42
}
43
tcg_temp_free_ptr(t_zd);
44
+ return true;
45
}
46
47
static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
54
{
48
{
55
+ int mos = extract32(insn, 29, 3);
49
- if (sve_access_check(s)) {
56
int type = extract32(insn, 22, 2);
50
- TCGv_i64 start = tcg_constant_i64(a->imm1);
57
int rd = extract32(insn, 0, 5);
51
- TCGv_i64 incr = tcg_constant_i64(a->imm2);
58
int rn = extract32(insn, 5, 5);
52
- do_index(s, a->esz, a->rd, start, incr);
59
int rm = extract32(insn, 16, 5);
53
- }
60
int opcode = extract32(insn, 12, 4);
54
- return true;
61
55
+ TCGv_i64 start = tcg_constant_i64(a->imm1);
62
- if (opcode > 8) {
56
+ TCGv_i64 incr = tcg_constant_i64(a->imm2);
63
+ if (opcode > 8 || mos) {
57
+ return do_index(s, a->esz, a->rd, start, incr);
64
unallocated_encoding(s);
58
}
65
return;
59
66
}
60
static bool trans_INDEX_ir(DisasContext *s, arg_INDEX_ir *a)
67
@@ -XXX,XX +XXX,XX @@ static void handle_fp_3src_half(DisasContext *s, bool o0, bool o1,
68
*/
69
static void disas_fp_3src(DisasContext *s, uint32_t insn)
70
{
61
{
71
+ int mos = extract32(insn, 29, 3);
62
- if (sve_access_check(s)) {
72
int type = extract32(insn, 22, 2);
63
- TCGv_i64 start = tcg_constant_i64(a->imm);
73
int rd = extract32(insn, 0, 5);
64
- TCGv_i64 incr = cpu_reg(s, a->rm);
74
int rn = extract32(insn, 5, 5);
65
- do_index(s, a->esz, a->rd, start, incr);
75
@@ -XXX,XX +XXX,XX @@ static void disas_fp_3src(DisasContext *s, uint32_t insn)
66
- }
76
bool o0 = extract32(insn, 15, 1);
67
- return true;
77
bool o1 = extract32(insn, 21, 1);
68
+ TCGv_i64 start = tcg_constant_i64(a->imm);
78
69
+ TCGv_i64 incr = cpu_reg(s, a->rm);
79
+ if (mos) {
70
+ return do_index(s, a->esz, a->rd, start, incr);
80
+ unallocated_encoding(s);
71
}
81
+ return;
72
82
+ }
73
static bool trans_INDEX_ri(DisasContext *s, arg_INDEX_ri *a)
83
+
84
switch (type) {
85
case 0:
86
if (!fp_access_check(s)) {
87
@@ -XXX,XX +XXX,XX @@ uint64_t vfp_expand_imm(int size, uint8_t imm8)
88
static void disas_fp_imm(DisasContext *s, uint32_t insn)
89
{
74
{
90
int rd = extract32(insn, 0, 5);
75
- if (sve_access_check(s)) {
91
+ int imm5 = extract32(insn, 5, 5);
76
- TCGv_i64 start = cpu_reg(s, a->rn);
92
int imm8 = extract32(insn, 13, 8);
77
- TCGv_i64 incr = tcg_constant_i64(a->imm);
93
int type = extract32(insn, 22, 2);
78
- do_index(s, a->esz, a->rd, start, incr);
94
+ int mos = extract32(insn, 29, 3);
79
- }
95
uint64_t imm;
80
- return true;
96
TCGv_i64 tcg_res;
81
+ TCGv_i64 start = cpu_reg(s, a->rn);
97
TCGMemOp sz;
82
+ TCGv_i64 incr = tcg_constant_i64(a->imm);
98
83
+ return do_index(s, a->esz, a->rd, start, incr);
99
+ if (mos || imm5) {
84
}
100
+ unallocated_encoding(s);
85
101
+ return;
86
static bool trans_INDEX_rr(DisasContext *s, arg_INDEX_rr *a)
102
+ }
87
{
103
+
88
- if (sve_access_check(s)) {
104
switch (type) {
89
- TCGv_i64 start = cpu_reg(s, a->rn);
105
case 0:
90
- TCGv_i64 incr = cpu_reg(s, a->rm);
106
sz = MO_32;
91
- do_index(s, a->esz, a->rd, start, incr);
92
- }
93
- return true;
94
+ TCGv_i64 start = cpu_reg(s, a->rn);
95
+ TCGv_i64 incr = cpu_reg(s, a->rm);
96
+ return do_index(s, a->esz, a->rd, start, incr);
97
}
98
99
/*
107
--
100
--
108
2.20.1
101
2.25.1
109
110
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-50-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 35 ++++++++---------------------------
9
1 file changed, 8 insertions(+), 27 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_index(DisasContext *s, int esz, int rd,
16
return true;
17
}
18
19
-static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
20
-{
21
- TCGv_i64 start = tcg_constant_i64(a->imm1);
22
- TCGv_i64 incr = tcg_constant_i64(a->imm2);
23
- return do_index(s, a->esz, a->rd, start, incr);
24
-}
25
-
26
-static bool trans_INDEX_ir(DisasContext *s, arg_INDEX_ir *a)
27
-{
28
- TCGv_i64 start = tcg_constant_i64(a->imm);
29
- TCGv_i64 incr = cpu_reg(s, a->rm);
30
- return do_index(s, a->esz, a->rd, start, incr);
31
-}
32
-
33
-static bool trans_INDEX_ri(DisasContext *s, arg_INDEX_ri *a)
34
-{
35
- TCGv_i64 start = cpu_reg(s, a->rn);
36
- TCGv_i64 incr = tcg_constant_i64(a->imm);
37
- return do_index(s, a->esz, a->rd, start, incr);
38
-}
39
-
40
-static bool trans_INDEX_rr(DisasContext *s, arg_INDEX_rr *a)
41
-{
42
- TCGv_i64 start = cpu_reg(s, a->rn);
43
- TCGv_i64 incr = cpu_reg(s, a->rm);
44
- return do_index(s, a->esz, a->rd, start, incr);
45
-}
46
+TRANS_FEAT(INDEX_ii, aa64_sve, do_index, a->esz, a->rd,
47
+ tcg_constant_i64(a->imm1), tcg_constant_i64(a->imm2))
48
+TRANS_FEAT(INDEX_ir, aa64_sve, do_index, a->esz, a->rd,
49
+ tcg_constant_i64(a->imm), cpu_reg(s, a->rm))
50
+TRANS_FEAT(INDEX_ri, aa64_sve, do_index, a->esz, a->rd,
51
+ cpu_reg(s, a->rn), tcg_constant_i64(a->imm))
52
+TRANS_FEAT(INDEX_rr, aa64_sve, do_index, a->esz, a->rd,
53
+ cpu_reg(s, a->rn), cpu_reg(s, a->rm))
54
55
/*
56
*** SVE Stack Allocation Group
57
--
58
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-51-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 23 ++++-------------------
9
1 file changed, 4 insertions(+), 19 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_adr(DisasContext *s, arg_rrri *a, gen_helper_gvec_3 *fn)
16
return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, a->imm);
17
}
18
19
-static bool trans_ADR_p32(DisasContext *s, arg_rrri *a)
20
-{
21
- return do_adr(s, a, gen_helper_sve_adr_p32);
22
-}
23
-
24
-static bool trans_ADR_p64(DisasContext *s, arg_rrri *a)
25
-{
26
- return do_adr(s, a, gen_helper_sve_adr_p64);
27
-}
28
-
29
-static bool trans_ADR_s32(DisasContext *s, arg_rrri *a)
30
-{
31
- return do_adr(s, a, gen_helper_sve_adr_s32);
32
-}
33
-
34
-static bool trans_ADR_u32(DisasContext *s, arg_rrri *a)
35
-{
36
- return do_adr(s, a, gen_helper_sve_adr_u32);
37
-}
38
+TRANS_FEAT(ADR_p32, aa64_sve, do_adr, a, gen_helper_sve_adr_p32)
39
+TRANS_FEAT(ADR_p64, aa64_sve, do_adr, a, gen_helper_sve_adr_p64)
40
+TRANS_FEAT(ADR_s32, aa64_sve, do_adr, a, gen_helper_sve_adr_s32)
41
+TRANS_FEAT(ADR_u32, aa64_sve, do_adr, a, gen_helper_sve_adr_u32)
42
43
/*
44
*** SVE Integer Misc - Unpredicated Group
45
--
46
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-52-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 19 +++++--------------
9
1 file changed, 5 insertions(+), 14 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_predset(DisasContext *s, int esz, int rd, int pat, bool setflag)
16
return true;
17
}
18
19
-static bool trans_PTRUE(DisasContext *s, arg_PTRUE *a)
20
-{
21
- return do_predset(s, a->esz, a->rd, a->pat, a->s);
22
-}
23
+TRANS_FEAT(PTRUE, aa64_sve, do_predset, a->esz, a->rd, a->pat, a->s)
24
25
-static bool trans_SETFFR(DisasContext *s, arg_SETFFR *a)
26
-{
27
- /* Note pat == 31 is #all, to set all elements. */
28
- return do_predset(s, 0, FFR_PRED_NUM, 31, false);
29
-}
30
+/* Note pat == 31 is #all, to set all elements. */
31
+TRANS_FEAT(SETFFR, aa64_sve, do_predset, 0, FFR_PRED_NUM, 31, false)
32
33
-static bool trans_PFALSE(DisasContext *s, arg_PFALSE *a)
34
-{
35
- /* Note pat == 32 is #unimp, to set no elements. */
36
- return do_predset(s, 0, a->rd, 32, false);
37
-}
38
+/* Note pat == 32 is #unimp, to set no elements. */
39
+TRANS_FEAT(PFALSE, aa64_sve, do_predset, 0, a->rd, 32, false)
40
41
static bool trans_RDFFR_p(DisasContext *s, arg_RDFFR_p *a)
42
{
43
--
44
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-53-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_RDFFR_p(DisasContext *s, arg_RDFFR_p *a)
16
return trans_AND_pppp(s, &alt_a);
17
}
18
19
-static bool trans_RDFFR(DisasContext *s, arg_RDFFR *a)
20
-{
21
- return do_mov_p(s, a->rd, FFR_PRED_NUM);
22
-}
23
-
24
-static bool trans_WRFFR(DisasContext *s, arg_WRFFR *a)
25
-{
26
- return do_mov_p(s, FFR_PRED_NUM, a->rn);
27
-}
28
+TRANS_FEAT(RDFFR, aa64_sve, do_mov_p, a->rd, FFR_PRED_NUM)
29
+TRANS_FEAT(WRFFR, aa64_sve, do_mov_p, FFR_PRED_NUM, a->rn)
30
31
static bool do_pfirst_pnext(DisasContext *s, arg_rr_esz *a,
32
void (*gen_fn)(TCGv_i32, TCGv_ptr,
33
--
34
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-54-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_pfirst_pnext(DisasContext *s, arg_rr_esz *a,
16
return true;
17
}
18
19
-static bool trans_PFIRST(DisasContext *s, arg_rr_esz *a)
20
-{
21
- return do_pfirst_pnext(s, a, gen_helper_sve_pfirst);
22
-}
23
-
24
-static bool trans_PNEXT(DisasContext *s, arg_rr_esz *a)
25
-{
26
- return do_pfirst_pnext(s, a, gen_helper_sve_pnext);
27
-}
28
+TRANS_FEAT(PFIRST, aa64_sve, do_pfirst_pnext, a, gen_helper_sve_pfirst)
29
+TRANS_FEAT(PNEXT, aa64_sve, do_pfirst_pnext, a, gen_helper_sve_pnext)
30
31
/*
32
*** SVE Element Count Group
33
--
34
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-55-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 14 ++------------
9
1 file changed, 2 insertions(+), 12 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_EXT(DisasContext *s, int rd, int rn, int rm, int imm)
16
return true;
17
}
18
19
-static bool trans_EXT(DisasContext *s, arg_EXT *a)
20
-{
21
- return do_EXT(s, a->rd, a->rn, a->rm, a->imm);
22
-}
23
-
24
-static bool trans_EXT_sve2(DisasContext *s, arg_rri *a)
25
-{
26
- if (!dc_isar_feature(aa64_sve2, s)) {
27
- return false;
28
- }
29
- return do_EXT(s, a->rd, a->rn, (a->rn + 1) % 32, a->imm);
30
-}
31
+TRANS_FEAT(EXT, aa64_sve, do_EXT, a->rd, a->rn, a->rm, a->imm)
32
+TRANS_FEAT(EXT_sve2, aa64_sve2, do_EXT, a->rd, a->rn, (a->rn + 1) % 32, a->imm)
33
34
/*
35
*** SVE Permute - Unpredicated Group
36
--
37
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-56-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 35 ++++++-----------------------------
9
1 file changed, 6 insertions(+), 29 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_perm_pred2(DisasContext *s, arg_rr_esz *a, bool high_odd,
16
return true;
17
}
18
19
-static bool trans_ZIP1_p(DisasContext *s, arg_rrr_esz *a)
20
-{
21
- return do_perm_pred3(s, a, 0, gen_helper_sve_zip_p);
22
-}
23
-
24
-static bool trans_ZIP2_p(DisasContext *s, arg_rrr_esz *a)
25
-{
26
- return do_perm_pred3(s, a, 1, gen_helper_sve_zip_p);
27
-}
28
-
29
-static bool trans_UZP1_p(DisasContext *s, arg_rrr_esz *a)
30
-{
31
- return do_perm_pred3(s, a, 0, gen_helper_sve_uzp_p);
32
-}
33
-
34
-static bool trans_UZP2_p(DisasContext *s, arg_rrr_esz *a)
35
-{
36
- return do_perm_pred3(s, a, 1, gen_helper_sve_uzp_p);
37
-}
38
-
39
-static bool trans_TRN1_p(DisasContext *s, arg_rrr_esz *a)
40
-{
41
- return do_perm_pred3(s, a, 0, gen_helper_sve_trn_p);
42
-}
43
-
44
-static bool trans_TRN2_p(DisasContext *s, arg_rrr_esz *a)
45
-{
46
- return do_perm_pred3(s, a, 1, gen_helper_sve_trn_p);
47
-}
48
+TRANS_FEAT(ZIP1_p, aa64_sve, do_perm_pred3, a, 0, gen_helper_sve_zip_p)
49
+TRANS_FEAT(ZIP2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_zip_p)
50
+TRANS_FEAT(UZP1_p, aa64_sve, do_perm_pred3, a, 0, gen_helper_sve_uzp_p)
51
+TRANS_FEAT(UZP2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_uzp_p)
52
+TRANS_FEAT(TRN1_p, aa64_sve, do_perm_pred3, a, 0, gen_helper_sve_trn_p)
53
+TRANS_FEAT(TRN2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_trn_p)
54
55
static bool trans_REV_p(DisasContext *s, arg_rr_esz *a)
56
{
57
--
58
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-57-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 17 +++--------------
9
1 file changed, 3 insertions(+), 14 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(UZP2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_uzp_p)
16
TRANS_FEAT(TRN1_p, aa64_sve, do_perm_pred3, a, 0, gen_helper_sve_trn_p)
17
TRANS_FEAT(TRN2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_trn_p)
18
19
-static bool trans_REV_p(DisasContext *s, arg_rr_esz *a)
20
-{
21
- return do_perm_pred2(s, a, 0, gen_helper_sve_rev_p);
22
-}
23
-
24
-static bool trans_PUNPKLO(DisasContext *s, arg_PUNPKLO *a)
25
-{
26
- return do_perm_pred2(s, a, 0, gen_helper_sve_punpk_p);
27
-}
28
-
29
-static bool trans_PUNPKHI(DisasContext *s, arg_PUNPKHI *a)
30
-{
31
- return do_perm_pred2(s, a, 1, gen_helper_sve_punpk_p);
32
-}
33
+TRANS_FEAT(REV_p, aa64_sve, do_perm_pred2, a, 0, gen_helper_sve_rev_p)
34
+TRANS_FEAT(PUNPKLO, aa64_sve, do_perm_pred2, a, 0, gen_helper_sve_punpk_p)
35
+TRANS_FEAT(PUNPKHI, aa64_sve, do_perm_pred2, a, 1, gen_helper_sve_punpk_p)
36
37
/*
38
*** SVE Permute - Interleaving Group
39
--
40
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
This is in line with how we treat uzp, and will
4
eliminate the special case code during translation.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-58-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/sve_helper.c | 6 ++++--
12
target/arm/translate-sve.c | 12 ++++++------
13
2 files changed, 10 insertions(+), 8 deletions(-)
14
15
diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sve_helper.c
18
+++ b/target/arm/sve_helper.c
19
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_punpk_p)(void *vd, void *vn, uint32_t pred_desc)
20
void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc) \
21
{ \
22
intptr_t oprsz = simd_oprsz(desc); \
23
+ intptr_t odd_ofs = simd_data(desc); \
24
intptr_t i, oprsz_2 = oprsz / 2; \
25
ARMVectorReg tmp_n, tmp_m; \
26
/* We produce output faster than we consume input. \
27
@@ -XXX,XX +XXX,XX @@ void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc) \
28
vm = memcpy(&tmp_m, vm, oprsz_2); \
29
} \
30
for (i = 0; i < oprsz_2; i += sizeof(TYPE)) { \
31
- *(TYPE *)(vd + H(2 * i + 0)) = *(TYPE *)(vn + H(i)); \
32
- *(TYPE *)(vd + H(2 * i + sizeof(TYPE))) = *(TYPE *)(vm + H(i)); \
33
+ *(TYPE *)(vd + H(2 * i + 0)) = *(TYPE *)(vn + odd_ofs + H(i)); \
34
+ *(TYPE *)(vd + H(2 * i + sizeof(TYPE))) = \
35
+ *(TYPE *)(vm + odd_ofs + H(i)); \
36
} \
37
if (sizeof(TYPE) == 16 && unlikely(oprsz & 16)) { \
38
memset(vd + oprsz - 16, 0, 16); \
39
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/translate-sve.c
42
+++ b/target/arm/translate-sve.c
43
@@ -XXX,XX +XXX,XX @@ static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
44
unsigned vsz = vec_full_reg_size(s);
45
unsigned high_ofs = high ? vsz / 2 : 0;
46
tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
47
- vec_full_reg_offset(s, a->rn) + high_ofs,
48
- vec_full_reg_offset(s, a->rm) + high_ofs,
49
- vsz, vsz, 0, fns[a->esz]);
50
+ vec_full_reg_offset(s, a->rn),
51
+ vec_full_reg_offset(s, a->rm),
52
+ vsz, vsz, high_ofs, fns[a->esz]);
53
}
54
return true;
55
}
56
@@ -XXX,XX +XXX,XX @@ static bool do_zip_q(DisasContext *s, arg_rrr_esz *a, bool high)
57
unsigned vsz = vec_full_reg_size(s);
58
unsigned high_ofs = high ? QEMU_ALIGN_DOWN(vsz, 32) / 2 : 0;
59
tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
60
- vec_full_reg_offset(s, a->rn) + high_ofs,
61
- vec_full_reg_offset(s, a->rm) + high_ofs,
62
- vsz, vsz, 0, gen_helper_sve2_zip_q);
63
+ vec_full_reg_offset(s, a->rn),
64
+ vec_full_reg_offset(s, a->rm),
65
+ vsz, vsz, high_ofs, gen_helper_sve2_zip_q);
66
}
67
return true;
68
}
69
--
70
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-59-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 25 +++++++------------------
9
1 file changed, 7 insertions(+), 18 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
16
gen_helper_sve_zip_b, gen_helper_sve_zip_h,
17
gen_helper_sve_zip_s, gen_helper_sve_zip_d,
18
};
19
+ unsigned vsz = vec_full_reg_size(s);
20
+ unsigned high_ofs = high ? vsz / 2 : 0;
21
22
- if (sve_access_check(s)) {
23
- unsigned vsz = vec_full_reg_size(s);
24
- unsigned high_ofs = high ? vsz / 2 : 0;
25
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
26
- vec_full_reg_offset(s, a->rn),
27
- vec_full_reg_offset(s, a->rm),
28
- vsz, vsz, high_ofs, fns[a->esz]);
29
- }
30
- return true;
31
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, high_ofs);
32
}
33
34
static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
35
@@ -XXX,XX +XXX,XX @@ static bool trans_ZIP2_z(DisasContext *s, arg_rrr_esz *a)
36
37
static bool do_zip_q(DisasContext *s, arg_rrr_esz *a, bool high)
38
{
39
+ unsigned vsz = vec_full_reg_size(s);
40
+ unsigned high_ofs = high ? QEMU_ALIGN_DOWN(vsz, 32) / 2 : 0;
41
+
42
if (!dc_isar_feature(aa64_sve_f64mm, s)) {
43
return false;
44
}
45
- if (sve_access_check(s)) {
46
- unsigned vsz = vec_full_reg_size(s);
47
- unsigned high_ofs = high ? QEMU_ALIGN_DOWN(vsz, 32) / 2 : 0;
48
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
49
- vec_full_reg_offset(s, a->rn),
50
- vec_full_reg_offset(s, a->rm),
51
- vsz, vsz, high_ofs, gen_helper_sve2_zip_q);
52
- }
53
- return true;
54
+ return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_zip_q, a, high_ofs);
55
}
56
57
static bool trans_ZIP1_q(DisasContext *s, arg_rrr_esz *a)
58
--
59
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Convert SVE translation functions using do_zip*
4
to use TRANS_FEAT and gen_gvec_ool_arg_zzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-60-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 54 +++++++++-----------------------------
12
1 file changed, 13 insertions(+), 41 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(PUNPKHI, aa64_sve, do_perm_pred2, a, 1, gen_helper_sve_punpk_p)
19
*** SVE Permute - Interleaving Group
20
*/
21
22
-static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
23
-{
24
- static gen_helper_gvec_3 * const fns[4] = {
25
- gen_helper_sve_zip_b, gen_helper_sve_zip_h,
26
- gen_helper_sve_zip_s, gen_helper_sve_zip_d,
27
- };
28
- unsigned vsz = vec_full_reg_size(s);
29
- unsigned high_ofs = high ? vsz / 2 : 0;
30
+static gen_helper_gvec_3 * const zip_fns[4] = {
31
+ gen_helper_sve_zip_b, gen_helper_sve_zip_h,
32
+ gen_helper_sve_zip_s, gen_helper_sve_zip_d,
33
+};
34
+TRANS_FEAT(ZIP1_z, aa64_sve, gen_gvec_ool_arg_zzz,
35
+ zip_fns[a->esz], a, 0)
36
+TRANS_FEAT(ZIP2_z, aa64_sve, gen_gvec_ool_arg_zzz,
37
+ zip_fns[a->esz], a, vec_full_reg_size(s) / 2)
38
39
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, high_ofs);
40
-}
41
-
42
-static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
43
-{
44
- return do_zip(s, a, false);
45
-}
46
-
47
-static bool trans_ZIP2_z(DisasContext *s, arg_rrr_esz *a)
48
-{
49
- return do_zip(s, a, true);
50
-}
51
-
52
-static bool do_zip_q(DisasContext *s, arg_rrr_esz *a, bool high)
53
-{
54
- unsigned vsz = vec_full_reg_size(s);
55
- unsigned high_ofs = high ? QEMU_ALIGN_DOWN(vsz, 32) / 2 : 0;
56
-
57
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
58
- return false;
59
- }
60
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_zip_q, a, high_ofs);
61
-}
62
-
63
-static bool trans_ZIP1_q(DisasContext *s, arg_rrr_esz *a)
64
-{
65
- return do_zip_q(s, a, false);
66
-}
67
-
68
-static bool trans_ZIP2_q(DisasContext *s, arg_rrr_esz *a)
69
-{
70
- return do_zip_q(s, a, true);
71
-}
72
+TRANS_FEAT(ZIP1_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
73
+ gen_helper_sve2_zip_q, a, 0)
74
+TRANS_FEAT(ZIP2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
75
+ gen_helper_sve2_zip_q, a,
76
+ QEMU_ALIGN_DOWN(vec_full_reg_size(s), 32) / 2)
77
78
static gen_helper_gvec_3 * const uzp_fns[4] = {
79
gen_helper_sve_uzp_b, gen_helper_sve_uzp_h,
80
--
81
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-61-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_clast_vector(DisasContext *s, arg_rprr_esz *a, bool before)
16
return true;
17
}
18
19
-static bool trans_CLASTA_z(DisasContext *s, arg_rprr_esz *a)
20
-{
21
- return do_clast_vector(s, a, false);
22
-}
23
-
24
-static bool trans_CLASTB_z(DisasContext *s, arg_rprr_esz *a)
25
-{
26
- return do_clast_vector(s, a, true);
27
-}
28
+TRANS_FEAT(CLASTA_z, aa64_sve, do_clast_vector, a, false)
29
+TRANS_FEAT(CLASTB_z, aa64_sve, do_clast_vector, a, true)
30
31
/* Compute CLAST for a scalar. */
32
static void do_clast_scalar(DisasContext *s, int esz, int pg, int rm,
33
--
34
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-62-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_clast_fp(DisasContext *s, arg_rpr_esz *a, bool before)
16
return true;
17
}
18
19
-static bool trans_CLASTA_v(DisasContext *s, arg_rpr_esz *a)
20
-{
21
- return do_clast_fp(s, a, false);
22
-}
23
-
24
-static bool trans_CLASTB_v(DisasContext *s, arg_rpr_esz *a)
25
-{
26
- return do_clast_fp(s, a, true);
27
-}
28
+TRANS_FEAT(CLASTA_v, aa64_sve, do_clast_fp, a, false)
29
+TRANS_FEAT(CLASTB_v, aa64_sve, do_clast_fp, a, true)
30
31
/* Compute CLAST for a Xreg. */
32
static bool do_clast_general(DisasContext *s, arg_rpr_esz *a, bool before)
33
--
34
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-63-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_clast_general(DisasContext *s, arg_rpr_esz *a, bool before)
16
return true;
17
}
18
19
-static bool trans_CLASTA_r(DisasContext *s, arg_rpr_esz *a)
20
-{
21
- return do_clast_general(s, a, false);
22
-}
23
-
24
-static bool trans_CLASTB_r(DisasContext *s, arg_rpr_esz *a)
25
-{
26
- return do_clast_general(s, a, true);
27
-}
28
+TRANS_FEAT(CLASTA_r, aa64_sve, do_clast_general, a, false)
29
+TRANS_FEAT(CLASTB_r, aa64_sve, do_clast_general, a, true)
30
31
/* Compute LAST for a scalar. */
32
static TCGv_i64 do_last_scalar(DisasContext *s, int esz,
33
--
34
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-64-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_last_fp(DisasContext *s, arg_rpr_esz *a, bool before)
16
return true;
17
}
18
19
-static bool trans_LASTA_v(DisasContext *s, arg_rpr_esz *a)
20
-{
21
- return do_last_fp(s, a, false);
22
-}
23
-
24
-static bool trans_LASTB_v(DisasContext *s, arg_rpr_esz *a)
25
-{
26
- return do_last_fp(s, a, true);
27
-}
28
+TRANS_FEAT(LASTA_v, aa64_sve, do_last_fp, a, false)
29
+TRANS_FEAT(LASTB_v, aa64_sve, do_last_fp, a, true)
30
31
/* Compute LAST for a Xreg. */
32
static bool do_last_general(DisasContext *s, arg_rpr_esz *a, bool before)
33
--
34
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-65-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_last_general(DisasContext *s, arg_rpr_esz *a, bool before)
16
return true;
17
}
18
19
-static bool trans_LASTA_r(DisasContext *s, arg_rpr_esz *a)
20
-{
21
- return do_last_general(s, a, false);
22
-}
23
-
24
-static bool trans_LASTB_r(DisasContext *s, arg_rpr_esz *a)
25
-{
26
- return do_last_general(s, a, true);
27
-}
28
+TRANS_FEAT(LASTA_r, aa64_sve, do_last_general, a, false)
29
+TRANS_FEAT(LASTB_r, aa64_sve, do_last_general, a, true)
30
31
static bool trans_CPY_m_r(DisasContext *s, arg_rpr_esz *a)
32
{
33
--
34
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-66-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 17 ++++-------------
9
1 file changed, 4 insertions(+), 13 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(REVH, aa64_sve, gen_gvec_ool_arg_zpz, revh_fns[a->esz], a, 0)
16
TRANS_FEAT(REVW, aa64_sve, gen_gvec_ool_arg_zpz,
17
a->esz == 3 ? gen_helper_sve_revw_d : NULL, a, 0)
18
19
-static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
20
-{
21
- return gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
22
- a->rd, a->rn, a->rm, a->pg, a->esz);
23
-}
24
+TRANS_FEAT(SPLICE, aa64_sve, gen_gvec_ool_arg_zpzz,
25
+ gen_helper_sve_splice, a, a->esz)
26
27
-static bool trans_SPLICE_sve2(DisasContext *s, arg_rpr_esz *a)
28
-{
29
- if (!dc_isar_feature(aa64_sve2, s)) {
30
- return false;
31
- }
32
- return gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
33
- a->rd, a->rn, (a->rn + 1) % 32, a->pg, a->esz);
34
-}
35
+TRANS_FEAT(SPLICE_sve2, aa64_sve2, gen_gvec_ool_zzzp, gen_helper_sve_splice,
36
+ a->rd, a->rn, (a->rn + 1) % 32, a->pg, a->esz)
37
38
/*
39
*** SVE Integer Compare - Vectors Group
40
--
41
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-67-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 28 ++++++++++++----------------
9
1 file changed, 12 insertions(+), 16 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_ppzz_flags(DisasContext *s, arg_rprr_esz *a,
16
}
17
18
#define DO_PPZZ(NAME, name) \
19
-static bool trans_##NAME##_ppzz(DisasContext *s, arg_rprr_esz *a) \
20
-{ \
21
- static gen_helper_gvec_flags_4 * const fns[4] = { \
22
- gen_helper_sve_##name##_ppzz_b, gen_helper_sve_##name##_ppzz_h, \
23
- gen_helper_sve_##name##_ppzz_s, gen_helper_sve_##name##_ppzz_d, \
24
- }; \
25
- return do_ppzz_flags(s, a, fns[a->esz]); \
26
-}
27
+ static gen_helper_gvec_flags_4 * const name##_ppzz_fns[4] = { \
28
+ gen_helper_sve_##name##_ppzz_b, gen_helper_sve_##name##_ppzz_h, \
29
+ gen_helper_sve_##name##_ppzz_s, gen_helper_sve_##name##_ppzz_d, \
30
+ }; \
31
+ TRANS_FEAT(NAME##_ppzz, aa64_sve, do_ppzz_flags, \
32
+ a, name##_ppzz_fns[a->esz])
33
34
DO_PPZZ(CMPEQ, cmpeq)
35
DO_PPZZ(CMPNE, cmpne)
36
@@ -XXX,XX +XXX,XX @@ DO_PPZZ(CMPHS, cmphs)
37
#undef DO_PPZZ
38
39
#define DO_PPZW(NAME, name) \
40
-static bool trans_##NAME##_ppzw(DisasContext *s, arg_rprr_esz *a) \
41
-{ \
42
- static gen_helper_gvec_flags_4 * const fns[4] = { \
43
- gen_helper_sve_##name##_ppzw_b, gen_helper_sve_##name##_ppzw_h, \
44
- gen_helper_sve_##name##_ppzw_s, NULL \
45
- }; \
46
- return do_ppzz_flags(s, a, fns[a->esz]); \
47
-}
48
+ static gen_helper_gvec_flags_4 * const name##_ppzw_fns[4] = { \
49
+ gen_helper_sve_##name##_ppzw_b, gen_helper_sve_##name##_ppzw_h, \
50
+ gen_helper_sve_##name##_ppzw_s, NULL \
51
+ }; \
52
+ TRANS_FEAT(NAME##_ppzw, aa64_sve, do_ppzz_flags, \
53
+ a, name##_ppzw_fns[a->esz])
54
55
DO_PPZW(CMPEQ, cmpeq)
56
DO_PPZW(CMPNE, cmpne)
57
--
58
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-68-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 28 ++++++++--------------------
9
1 file changed, 8 insertions(+), 20 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ DO_SVE2_ZZZ_NARROW(SUBHNT, subhnt)
16
DO_SVE2_ZZZ_NARROW(RSUBHNB, rsubhnb)
17
DO_SVE2_ZZZ_NARROW(RSUBHNT, rsubhnt)
18
19
-static bool do_sve2_ppzz_flags(DisasContext *s, arg_rprr_esz *a,
20
- gen_helper_gvec_flags_4 *fn)
21
-{
22
- if (!dc_isar_feature(aa64_sve2, s)) {
23
- return false;
24
- }
25
- return do_ppzz_flags(s, a, fn);
26
-}
27
+static gen_helper_gvec_flags_4 * const match_fns[4] = {
28
+ gen_helper_sve2_match_ppzz_b, gen_helper_sve2_match_ppzz_h, NULL, NULL
29
+};
30
+TRANS_FEAT(MATCH, aa64_sve2, do_ppzz_flags, a, match_fns[a->esz])
31
32
-#define DO_SVE2_PPZZ_MATCH(NAME, name) \
33
-static bool trans_##NAME(DisasContext *s, arg_rprr_esz *a) \
34
-{ \
35
- static gen_helper_gvec_flags_4 * const fns[4] = { \
36
- gen_helper_sve2_##name##_ppzz_b, gen_helper_sve2_##name##_ppzz_h, \
37
- NULL, NULL \
38
- }; \
39
- return do_sve2_ppzz_flags(s, a, fns[a->esz]); \
40
-}
41
-
42
-DO_SVE2_PPZZ_MATCH(MATCH, match)
43
-DO_SVE2_PPZZ_MATCH(NMATCH, nmatch)
44
+static gen_helper_gvec_flags_4 * const nmatch_fns[4] = {
45
+ gen_helper_sve2_nmatch_ppzz_b, gen_helper_sve2_nmatch_ppzz_h, NULL, NULL
46
+};
47
+TRANS_FEAT(NMATCH, aa64_sve2, do_ppzz_flags, a, nmatch_fns[a->esz])
48
49
static gen_helper_gvec_4 * const histcnt_fns[4] = {
50
NULL, NULL, gen_helper_sve2_histcnt_s, gen_helper_sve2_histcnt_d
51
--
52
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-69-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 8 +++-----
9
1 file changed, 3 insertions(+), 5 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_ppzi_flags(DisasContext *s, arg_rpri_esz *a,
16
}
17
18
#define DO_PPZI(NAME, name) \
19
-static bool trans_##NAME##_ppzi(DisasContext *s, arg_rpri_esz *a) \
20
-{ \
21
- static gen_helper_gvec_flags_3 * const fns[4] = { \
22
+ static gen_helper_gvec_flags_3 * const name##_ppzi_fns[4] = { \
23
gen_helper_sve_##name##_ppzi_b, gen_helper_sve_##name##_ppzi_h, \
24
gen_helper_sve_##name##_ppzi_s, gen_helper_sve_##name##_ppzi_d, \
25
}; \
26
- return do_ppzi_flags(s, a, fns[a->esz]); \
27
-}
28
+ TRANS_FEAT(NAME##_ppzi, aa64_sve, do_ppzi_flags, a, \
29
+ name##_ppzi_fns[a->esz])
30
31
DO_PPZI(CMPEQ, cmpeq)
32
DO_PPZI(CMPNE, cmpne)
33
--
34
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-70-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 45 ++++++++++++--------------------------
9
1 file changed, 14 insertions(+), 31 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_brk2(DisasContext *s, arg_rpr_s *a,
16
return true;
17
}
18
19
-static bool trans_BRKPA(DisasContext *s, arg_rprr_s *a)
20
-{
21
- return do_brk3(s, a, gen_helper_sve_brkpa, gen_helper_sve_brkpas);
22
-}
23
+TRANS_FEAT(BRKPA, aa64_sve, do_brk3, a,
24
+ gen_helper_sve_brkpa, gen_helper_sve_brkpas)
25
+TRANS_FEAT(BRKPB, aa64_sve, do_brk3, a,
26
+ gen_helper_sve_brkpb, gen_helper_sve_brkpbs)
27
28
-static bool trans_BRKPB(DisasContext *s, arg_rprr_s *a)
29
-{
30
- return do_brk3(s, a, gen_helper_sve_brkpb, gen_helper_sve_brkpbs);
31
-}
32
+TRANS_FEAT(BRKA_m, aa64_sve, do_brk2, a,
33
+ gen_helper_sve_brka_m, gen_helper_sve_brkas_m)
34
+TRANS_FEAT(BRKB_m, aa64_sve, do_brk2, a,
35
+ gen_helper_sve_brkb_m, gen_helper_sve_brkbs_m)
36
37
-static bool trans_BRKA_m(DisasContext *s, arg_rpr_s *a)
38
-{
39
- return do_brk2(s, a, gen_helper_sve_brka_m, gen_helper_sve_brkas_m);
40
-}
41
+TRANS_FEAT(BRKA_z, aa64_sve, do_brk2, a,
42
+ gen_helper_sve_brka_z, gen_helper_sve_brkas_z)
43
+TRANS_FEAT(BRKB_z, aa64_sve, do_brk2, a,
44
+ gen_helper_sve_brkb_z, gen_helper_sve_brkbs_z)
45
46
-static bool trans_BRKB_m(DisasContext *s, arg_rpr_s *a)
47
-{
48
- return do_brk2(s, a, gen_helper_sve_brkb_m, gen_helper_sve_brkbs_m);
49
-}
50
-
51
-static bool trans_BRKA_z(DisasContext *s, arg_rpr_s *a)
52
-{
53
- return do_brk2(s, a, gen_helper_sve_brka_z, gen_helper_sve_brkas_z);
54
-}
55
-
56
-static bool trans_BRKB_z(DisasContext *s, arg_rpr_s *a)
57
-{
58
- return do_brk2(s, a, gen_helper_sve_brkb_z, gen_helper_sve_brkbs_z);
59
-}
60
-
61
-static bool trans_BRKN(DisasContext *s, arg_rpr_s *a)
62
-{
63
- return do_brk2(s, a, gen_helper_sve_brkn, gen_helper_sve_brkns);
64
-}
65
+TRANS_FEAT(BRKN, aa64_sve, do_brk2, a,
66
+ gen_helper_sve_brkn, gen_helper_sve_brkns)
67
68
/*
69
*** SVE Predicate Count Group
70
--
71
2.25.1
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-71-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 10 +---------
9
1 file changed, 1 insertion(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_SUBR_zzi(DisasContext *s, arg_rri_esz *a)
16
return true;
17
}
18
19
-static bool trans_MUL_zzi(DisasContext *s, arg_rri_esz *a)
20
-{
21
- if (sve_access_check(s)) {
22
- unsigned vsz = vec_full_reg_size(s);
23
- tcg_gen_gvec_muli(a->esz, vec_full_reg_offset(s, a->rd),
24
- vec_full_reg_offset(s, a->rn), a->imm, vsz, vsz);
25
- }
26
- return true;
27
-}
28
+TRANS_FEAT(MUL_zzi, aa64_sve, gen_gvec_fn_arg_zzi, tcg_gen_gvec_muli, a)
29
30
static bool do_zzi_sat(DisasContext *s, arg_rri_esz *a, bool u, bool d)
31
{
32
--
33
2.25.1
diff view generated by jsdifflib
1
The SSE-200 gives each CPU a register bank to use to control its
1
From: Richard Henderson <richard.henderson@linaro.org>
2
L1 instruction cache. Put in an unimplemented-device stub for this.
3
2
3
Remove the unparsed extraction in trans_DUP_i,
4
which is intended to reject an 8-bit shift of
5
an 8-bit constant for 8-bit element.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-72-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20190121185118.18550-18-peter.maydell@linaro.org
7
---
11
---
8
include/hw/arm/armsse.h | 1 +
12
target/arm/sve.decode | 5 ++++-
9
hw/arm/armsse.c | 39 ++++++++++++++++++++++++++++++++++++++-
13
target/arm/translate-sve.c | 10 ++++++----
10
2 files changed, 39 insertions(+), 1 deletion(-)
14
2 files changed, 10 insertions(+), 5 deletions(-)
11
15
12
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
16
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
13
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
14
--- a/include/hw/arm/armsse.h
18
--- a/target/arm/sve.decode
15
+++ b/include/hw/arm/armsse.h
19
+++ b/target/arm/sve.decode
16
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
20
@@ -XXX,XX +XXX,XX @@ WHILE_ptr 00100101 esz:2 1 rm:5 001 100 rn:5 rw:1 rd:4
17
21
FDUP 00100101 esz:2 111 00 1110 imm:8 rd:5
18
UnimplementedDeviceState mhu[2];
22
19
UnimplementedDeviceState ppu[NUM_PPUS];
23
# SVE broadcast integer immediate (unpredicated)
20
+ UnimplementedDeviceState cachectrl[SSE_MAX_CPUS];
24
-DUP_i 00100101 esz:2 111 00 011 . ........ rd:5 imm=%sh8_i8s
21
25
+{
22
/*
26
+ INVALID 00100101 00 111 00 011 1 -------- -----
23
* 'container' holds all devices seen by all CPUs.
27
+ DUP_i 00100101 esz:2 111 00 011 . ........ rd:5 imm=%sh8_i8s
24
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
28
+}
29
30
# SVE integer add/subtract immediate (unpredicated)
31
ADD_zzi 00100101 .. 100 000 11 . ........ ..... @rdn_sh_i8u
32
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
25
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/armsse.c
34
--- a/target/arm/translate-sve.c
27
+++ b/hw/arm/armsse.c
35
+++ b/target/arm/translate-sve.c
28
@@ -XXX,XX +XXX,XX @@ struct ARMSSEInfo {
36
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
29
SysConfigFormat sys_config_format;
37
0x1111111111111111ull, 0x0101010101010101ull
30
bool has_mhus;
31
bool has_ppus;
32
+ bool has_cachectrl;
33
};
38
};
34
39
35
static const ARMSSEInfo armsse_variants[] = {
40
+static bool trans_INVALID(DisasContext *s, arg_INVALID *a)
36
@@ -XXX,XX +XXX,XX @@ static const ARMSSEInfo armsse_variants[] = {
41
+{
37
.sys_config_format = IoTKitFormat,
42
+ unallocated_encoding(s);
38
.has_mhus = false,
43
+ return true;
39
.has_ppus = false,
44
+}
40
+ .has_cachectrl = false,
45
+
41
},
46
/*
42
};
47
*** SVE Logical - Unpredicated Group
43
48
*/
44
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
49
@@ -XXX,XX +XXX,XX @@ static bool trans_FDUP(DisasContext *s, arg_FDUP *a)
45
g_free(name);
50
46
}
51
static bool trans_DUP_i(DisasContext *s, arg_DUP_i *a)
52
{
53
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
54
- return false;
55
- }
56
if (sve_access_check(s)) {
57
unsigned vsz = vec_full_reg_size(s);
58
int dofs = vec_full_reg_offset(s, a->rd);
59
-
60
tcg_gen_gvec_dup_imm(a->esz, dofs, vsz, vsz, a->imm);
47
}
61
}
48
+ if (info->has_cachectrl) {
62
return true;
49
+ for (i = 0; i < info->num_cpus; i++) {
50
+ char *name = g_strdup_printf("cachectrl%d", i);
51
+
52
+ sysbus_init_child_obj(obj, name, &s->cachectrl[i],
53
+ sizeof(s->cachectrl[i]),
54
+ TYPE_UNIMPLEMENTED_DEVICE);
55
+ g_free(name);
56
+ }
57
+ }
58
object_initialize_child(obj, "nmi-orgate", &s->nmi_orgate,
59
sizeof(s->nmi_orgate), TYPE_OR_IRQ,
60
&error_abort, NULL);
61
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
62
qdev_connect_gpio_out(DEVICE(&s->ppc_irq_orgate), 0,
63
armsse_get_common_irq_in(s, 10));
64
65
- /* 0x40010000 .. 0x4001ffff: private CPU region: unused in IoTKit */
66
+ /*
67
+ * 0x40010000 .. 0x4001ffff (and the 0x5001000... secure-only alias):
68
+ * private per-CPU region (all these devices are SSE-200 only):
69
+ * 0x50010000: L1 icache control registers
70
+ * 0x50011000: CPUSECCTRL (CPU local security control registers)
71
+ * 0x4001f000 and 0x5001f000: CPU_IDENTITY register block
72
+ */
73
+ if (info->has_cachectrl) {
74
+ for (i = 0; i < info->num_cpus; i++) {
75
+ char *name = g_strdup_printf("cachectrl%d", i);
76
+ MemoryRegion *mr;
77
+
78
+ qdev_prop_set_string(DEVICE(&s->cachectrl[i]), "name", name);
79
+ g_free(name);
80
+ qdev_prop_set_uint64(DEVICE(&s->cachectrl[i]), "size", 0x1000);
81
+ object_property_set_bool(OBJECT(&s->cachectrl[i]), true,
82
+ "realized", &err);
83
+ if (err) {
84
+ error_propagate(errp, err);
85
+ return;
86
+ }
87
+
88
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->cachectrl[i]), 0);
89
+ memory_region_add_subregion(&s->cpu_container[i], 0x50010000, mr);
90
+ }
91
+ }
92
93
/* 0x40020000 .. 0x4002ffff : ARMSSE system control peripheral region */
94
/* Devices behind APB PPC1:
95
--
63
--
96
2.20.1
64
2.25.1
97
98
diff view generated by jsdifflib
1
From: Remi Denis-Courmont <remi.denis.courmont@huawei.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
A flawed test lead to the instructions always being treated as
3
Remove the unparsed extractions in trans_ADD_zzi, trans_SUBR_zzi,
4
unallocated encodings.
4
and do_zzi_sat which are intended to reject an 8-bit shift of an
5
8-bit constant for 8-bit element.
5
6
6
Fixes: https://bugs.launchpad.net/bugs/1813460
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Remi Denis-Courmont <remi.denis.courmont@huawei.com>
8
Message-id: 20220527181907.189259-73-richard.henderson@linaro.org
8
Reviewed-by: Richard Henderson <richard.henderson@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-a64.c | 2 +-
12
target/arm/sve.decode | 35 ++++++++++++++++++++++++++++-------
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
target/arm/translate-sve.c | 9 ---------
14
2 files changed, 28 insertions(+), 16 deletions(-)
13
15
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-a64.c
18
--- a/target/arm/sve.decode
17
+++ b/target/arm/translate-a64.c
19
+++ b/target/arm/sve.decode
18
@@ -XXX,XX +XXX,XX @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn)
20
@@ -XXX,XX +XXX,XX @@ FDUP 00100101 esz:2 111 00 1110 imm:8 rd:5
19
if (!dc_isar_feature(aa64_pauth, s)) {
21
}
20
goto do_unallocated;
22
21
}
23
# SVE integer add/subtract immediate (unpredicated)
22
- if (op3 != 2 || op3 != 3) {
24
-ADD_zzi 00100101 .. 100 000 11 . ........ ..... @rdn_sh_i8u
23
+ if ((op3 & ~1) != 2) {
25
-SUB_zzi 00100101 .. 100 001 11 . ........ ..... @rdn_sh_i8u
24
goto do_unallocated;
26
-SUBR_zzi 00100101 .. 100 011 11 . ........ ..... @rdn_sh_i8u
25
}
27
-SQADD_zzi 00100101 .. 100 100 11 . ........ ..... @rdn_sh_i8u
26
if (s->pauth_active) {
28
-UQADD_zzi 00100101 .. 100 101 11 . ........ ..... @rdn_sh_i8u
29
-SQSUB_zzi 00100101 .. 100 110 11 . ........ ..... @rdn_sh_i8u
30
-UQSUB_zzi 00100101 .. 100 111 11 . ........ ..... @rdn_sh_i8u
31
+{
32
+ INVALID 00100101 00 100 000 11 1 -------- -----
33
+ ADD_zzi 00100101 .. 100 000 11 . ........ ..... @rdn_sh_i8u
34
+}
35
+{
36
+ INVALID 00100101 00 100 001 11 1 -------- -----
37
+ SUB_zzi 00100101 .. 100 001 11 . ........ ..... @rdn_sh_i8u
38
+}
39
+{
40
+ INVALID 00100101 00 100 011 11 1 -------- -----
41
+ SUBR_zzi 00100101 .. 100 011 11 . ........ ..... @rdn_sh_i8u
42
+}
43
+{
44
+ INVALID 00100101 00 100 100 11 1 -------- -----
45
+ SQADD_zzi 00100101 .. 100 100 11 . ........ ..... @rdn_sh_i8u
46
+}
47
+{
48
+ INVALID 00100101 00 100 101 11 1 -------- -----
49
+ UQADD_zzi 00100101 .. 100 101 11 . ........ ..... @rdn_sh_i8u
50
+}
51
+{
52
+ INVALID 00100101 00 100 110 11 1 -------- -----
53
+ SQSUB_zzi 00100101 .. 100 110 11 . ........ ..... @rdn_sh_i8u
54
+}
55
+{
56
+ INVALID 00100101 00 100 111 11 1 -------- -----
57
+ UQSUB_zzi 00100101 .. 100 111 11 . ........ ..... @rdn_sh_i8u
58
+}
59
60
# SVE integer min/max immediate (unpredicated)
61
SMAX_zzi 00100101 .. 101 000 110 ........ ..... @rdn_i8s
62
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
63
index XXXXXXX..XXXXXXX 100644
64
--- a/target/arm/translate-sve.c
65
+++ b/target/arm/translate-sve.c
66
@@ -XXX,XX +XXX,XX @@ static bool trans_DUP_i(DisasContext *s, arg_DUP_i *a)
67
68
static bool trans_ADD_zzi(DisasContext *s, arg_rri_esz *a)
69
{
70
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
71
- return false;
72
- }
73
return gen_gvec_fn_arg_zzi(s, tcg_gen_gvec_addi, a);
74
}
75
76
@@ -XXX,XX +XXX,XX @@ static bool trans_SUBR_zzi(DisasContext *s, arg_rri_esz *a)
77
.scalar_first = true }
78
};
79
80
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
81
- return false;
82
- }
83
if (sve_access_check(s)) {
84
unsigned vsz = vec_full_reg_size(s);
85
tcg_gen_gvec_2s(vec_full_reg_offset(s, a->rd),
86
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(MUL_zzi, aa64_sve, gen_gvec_fn_arg_zzi, tcg_gen_gvec_muli, a)
87
88
static bool do_zzi_sat(DisasContext *s, arg_rri_esz *a, bool u, bool d)
89
{
90
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
91
- return false;
92
- }
93
if (sve_access_check(s)) {
94
do_sat_addsub_vec(s, a->esz, a->rd, a->rn,
95
tcg_constant_i64(a->imm), u, d);
27
--
96
--
28
2.20.1
97
2.25.1
29
30
diff view generated by jsdifflib
1
From: Remi Denis-Courmont <remi.denis.courmont@huawei.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Since QEMU does not support the ARMv8.2-LVA, Large Virtual Address,
3
Remove the unparsed extractions in trans_CPY_{m,z}_i which are intended
4
extension (yet), the VA address space is 48-bits plus a sign bit. User
4
to reject an 8-bit shift of an 8-bit constant for 8-bit element.
5
mode can only handle the positive half of the address space, so that
6
makes a limit of 48 bits.
7
5
8
(With LVA, it would be 53 and 52 bits respectively.)
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
7
Message-id: 20220527181907.189259-74-richard.henderson@linaro.org
10
The incorrectly large address space conflicts with PAuth instructions,
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
which use bits 48-54 and 56-63 for the pointer authentication code. This
12
also conflicts with (as yet unsupported by QEMU) data tagging and with
13
the ARMv8.5-MTE extension.
14
15
Signed-off-by: Remi Denis-Courmont <remi.denis.courmont@huawei.com>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
10
---
19
target/arm/cpu.h | 2 +-
11
target/arm/sve.decode | 10 ++++++++--
20
1 file changed, 1 insertion(+), 1 deletion(-)
12
target/arm/translate-sve.c | 6 ------
13
2 files changed, 8 insertions(+), 8 deletions(-)
21
14
22
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
23
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
24
--- a/target/arm/cpu.h
17
--- a/target/arm/sve.decode
25
+++ b/target/arm/cpu.h
18
+++ b/target/arm/sve.decode
26
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu);
19
@@ -XXX,XX +XXX,XX @@ DUPM 00000101 11 0000 dbm:13 rd:5
27
20
FCPY 00000101 .. 01 .... 110 imm:8 ..... @rdn_pg4
28
#if defined(TARGET_AARCH64)
21
29
# define TARGET_PHYS_ADDR_SPACE_BITS 48
22
# SVE copy integer immediate (predicated)
30
-# define TARGET_VIRT_ADDR_SPACE_BITS 64
23
-CPY_m_i 00000101 .. 01 .... 01 . ........ ..... @rdn_pg4 imm=%sh8_i8s
31
+# define TARGET_VIRT_ADDR_SPACE_BITS 48
24
-CPY_z_i 00000101 .. 01 .... 00 . ........ ..... @rdn_pg4 imm=%sh8_i8s
32
#else
25
+{
33
# define TARGET_PHYS_ADDR_SPACE_BITS 40
26
+ INVALID 00000101 00 01 ---- 01 1 -------- -----
34
# define TARGET_VIRT_ADDR_SPACE_BITS 32
27
+ CPY_m_i 00000101 .. 01 .... 01 . ........ ..... @rdn_pg4 imm=%sh8_i8s
28
+}
29
+{
30
+ INVALID 00000101 00 01 ---- 00 1 -------- -----
31
+ CPY_z_i 00000101 .. 01 .... 00 . ........ ..... @rdn_pg4 imm=%sh8_i8s
32
+}
33
34
### SVE Permute - Extract Group
35
36
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/translate-sve.c
39
+++ b/target/arm/translate-sve.c
40
@@ -XXX,XX +XXX,XX @@ static bool trans_FCPY(DisasContext *s, arg_FCPY *a)
41
42
static bool trans_CPY_m_i(DisasContext *s, arg_rpri_esz *a)
43
{
44
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
45
- return false;
46
- }
47
if (sve_access_check(s)) {
48
do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, tcg_constant_i64(a->imm));
49
}
50
@@ -XXX,XX +XXX,XX @@ static bool trans_CPY_z_i(DisasContext *s, arg_CPY_z_i *a)
51
gen_helper_sve_cpy_z_s, gen_helper_sve_cpy_z_d,
52
};
53
54
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
55
- return false;
56
- }
57
if (sve_access_check(s)) {
58
unsigned vsz = vec_full_reg_size(s);
59
tcg_gen_gvec_2i_ool(vec_full_reg_offset(s, a->rd),
35
--
60
--
36
2.20.1
61
2.25.1
37
38
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
4
Message-id: 20220527181907.189259-75-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
---
7
---
7
linux-user/elfload.c | 9 +++++++++
8
target/arm/translate-sve.c | 5 +----
8
1 file changed, 9 insertions(+)
9
1 file changed, 1 insertion(+), 4 deletions(-)
9
10
10
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
11
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
12
--- a/linux-user/elfload.c
13
--- a/target/arm/translate-sve.c
13
+++ b/linux-user/elfload.c
14
+++ b/target/arm/translate-sve.c
14
@@ -XXX,XX +XXX,XX @@ enum {
15
@@ -XXX,XX +XXX,XX @@ static bool trans_DUP_i(DisasContext *s, arg_DUP_i *a)
15
ARM_HWCAP_A64_ASIMDDP = 1 << 20,
16
return true;
16
ARM_HWCAP_A64_SHA512 = 1 << 21,
17
}
17
ARM_HWCAP_A64_SVE = 1 << 22,
18
18
+ ARM_HWCAP_A64_ASIMDFHM = 1 << 23,
19
-static bool trans_ADD_zzi(DisasContext *s, arg_rri_esz *a)
19
+ ARM_HWCAP_A64_DIT = 1 << 24,
20
-{
20
+ ARM_HWCAP_A64_USCAT = 1 << 25,
21
- return gen_gvec_fn_arg_zzi(s, tcg_gen_gvec_addi, a);
21
+ ARM_HWCAP_A64_ILRCPC = 1 << 26,
22
-}
22
+ ARM_HWCAP_A64_FLAGM = 1 << 27,
23
+TRANS_FEAT(ADD_zzi, aa64_sve, gen_gvec_fn_arg_zzi, tcg_gen_gvec_addi, a)
23
+ ARM_HWCAP_A64_SSBS = 1 << 28,
24
24
+ ARM_HWCAP_A64_SB = 1 << 29,
25
static bool trans_SUB_zzi(DisasContext *s, arg_rri_esz *a)
25
+ ARM_HWCAP_A64_PACA = 1 << 30,
26
{
26
+ ARM_HWCAP_A64_PACG = 1UL << 31,
27
};
28
29
#define ELF_HWCAP get_elf_hwcap()
30
--
27
--
31
2.20.1
28
2.25.1
32
33
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Drop the pac properties. This approach cannot work as written
4
because the properties are applied before arm_cpu_reset, which
5
zeros SCTLR_EL1 (amongst everything else).
6
7
We can re-introduce the properties if they turn out to be useful.
8
But since linux 5.0 enables all of the keys, they may not be.
9
10
Fixes: 1ae9cfbd470
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-76-richard.henderson@linaro.org
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
7
---
15
target/arm/cpu.c | 3 +++
8
target/arm/translate-sve.c | 23 ++++-------------------
16
target/arm/cpu64.c | 60 ----------------------------------------------
9
1 file changed, 4 insertions(+), 19 deletions(-)
17
2 files changed, 3 insertions(+), 60 deletions(-)
18
10
19
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
20
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/cpu.c
13
--- a/target/arm/translate-sve.c
22
+++ b/target/arm/cpu.c
14
+++ b/target/arm/translate-sve.c
23
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
15
@@ -XXX,XX +XXX,XX @@ static bool do_zzi_sat(DisasContext *s, arg_rri_esz *a, bool u, bool d)
24
env->pstate = PSTATE_MODE_EL0t;
16
return true;
25
/* Userspace expects access to DC ZVA, CTL_EL0 and the cache ops */
26
env->cp15.sctlr_el[1] |= SCTLR_UCT | SCTLR_UCI | SCTLR_DZE;
27
+ /* Enable all PAC keys. */
28
+ env->cp15.sctlr_el[1] |= (SCTLR_EnIA | SCTLR_EnIB |
29
+ SCTLR_EnDA | SCTLR_EnDB);
30
/* Enable all PAC instructions */
31
env->cp15.hcr_el2 |= HCR_API;
32
env->cp15.scr_el3 |= SCR_API;
33
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/cpu64.c
36
+++ b/target/arm/cpu64.c
37
@@ -XXX,XX +XXX,XX @@ static void cpu_max_set_sve_vq(Object *obj, Visitor *v, const char *name,
38
error_propagate(errp, err);
39
}
17
}
40
18
41
-#ifdef CONFIG_USER_ONLY
19
-static bool trans_SQADD_zzi(DisasContext *s, arg_rri_esz *a)
42
-static void cpu_max_get_packey(Object *obj, Visitor *v, const char *name,
43
- void *opaque, Error **errp)
44
-{
20
-{
45
- ARMCPU *cpu = ARM_CPU(obj);
21
- return do_zzi_sat(s, a, false, false);
46
- const uint64_t *bit = opaque;
47
- bool enabled = (cpu->env.cp15.sctlr_el[1] & *bit) != 0;
48
-
49
- visit_type_bool(v, name, &enabled, errp);
50
-}
22
-}
51
-
23
-
52
-static void cpu_max_set_packey(Object *obj, Visitor *v, const char *name,
24
-static bool trans_UQADD_zzi(DisasContext *s, arg_rri_esz *a)
53
- void *opaque, Error **errp)
54
-{
25
-{
55
- ARMCPU *cpu = ARM_CPU(obj);
26
- return do_zzi_sat(s, a, true, false);
56
- Error *err = NULL;
27
-}
57
- const uint64_t *bit = opaque;
58
- bool enabled;
59
-
28
-
60
- visit_type_bool(v, name, &enabled, errp);
29
-static bool trans_SQSUB_zzi(DisasContext *s, arg_rri_esz *a)
30
-{
31
- return do_zzi_sat(s, a, false, true);
32
-}
61
-
33
-
62
- if (!err) {
34
-static bool trans_UQSUB_zzi(DisasContext *s, arg_rri_esz *a)
63
- if (enabled) {
35
-{
64
- cpu->env.cp15.sctlr_el[1] |= *bit;
36
- return do_zzi_sat(s, a, true, true);
65
- } else {
66
- cpu->env.cp15.sctlr_el[1] &= ~*bit;
67
- }
68
- }
69
- error_propagate(errp, err);
70
-}
37
-}
71
-#endif
38
+TRANS_FEAT(SQADD_zzi, aa64_sve, do_zzi_sat, a, false, false)
72
-
39
+TRANS_FEAT(UQADD_zzi, aa64_sve, do_zzi_sat, a, true, false)
73
/* -cpu max: if KVM is enabled, like -cpu host (best possible with this host);
40
+TRANS_FEAT(SQSUB_zzi, aa64_sve, do_zzi_sat, a, false, true)
74
* otherwise, a CPU with as many features enabled as our emulation supports.
41
+TRANS_FEAT(UQSUB_zzi, aa64_sve, do_zzi_sat, a, true, true)
75
* The version of '-cpu max' for qemu-system-arm is defined in cpu.c;
42
76
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
43
static bool do_zzi_ool(DisasContext *s, arg_rri_esz *a, gen_helper_gvec_2i *fn)
77
*/
44
{
78
cpu->ctr = 0x80038003; /* 32 byte I and D cacheline size, VIPT icache */
79
cpu->dcz_blocksize = 7; /* 512 bytes */
80
-
81
- /*
82
- * Note that Linux will enable enable all of the keys at once.
83
- * But doing it this way will allow experimentation beyond that.
84
- */
85
- {
86
- static const uint64_t apia_bit = SCTLR_EnIA;
87
- static const uint64_t apib_bit = SCTLR_EnIB;
88
- static const uint64_t apda_bit = SCTLR_EnDA;
89
- static const uint64_t apdb_bit = SCTLR_EnDB;
90
-
91
- object_property_add(obj, "apia", "bool", cpu_max_get_packey,
92
- cpu_max_set_packey, NULL,
93
- (void *)&apia_bit, &error_fatal);
94
- object_property_add(obj, "apib", "bool", cpu_max_get_packey,
95
- cpu_max_set_packey, NULL,
96
- (void *)&apib_bit, &error_fatal);
97
- object_property_add(obj, "apda", "bool", cpu_max_get_packey,
98
- cpu_max_set_packey, NULL,
99
- (void *)&apda_bit, &error_fatal);
100
- object_property_add(obj, "apdb", "bool", cpu_max_get_packey,
101
- cpu_max_set_packey, NULL,
102
- (void *)&apdb_bit, &error_fatal);
103
-
104
- /* Enable all PAC keys by default. */
105
- cpu->env.cp15.sctlr_el[1] |= SCTLR_EnIA | SCTLR_EnIB;
106
- cpu->env.cp15.sctlr_el[1] |= SCTLR_EnDA | SCTLR_EnDB;
107
- }
108
#endif
109
110
cpu->sve_max_vq = ARM_MAX_VQ;
111
--
45
--
112
2.20.1
46
2.25.1
113
114
diff view generated by jsdifflib
1
In disas_simd_indexed(), for the case of "complex fp", each indexable
1
From: Richard Henderson <richard.henderson@linaro.org>
2
element is a complex pair, so the total size is twice that indicated
3
in the 'size' field in the encoding. We were trying to do this
4
"double the size" operation with a left shift by 1, but this is
5
incorrect because the 'size' field is a MO_8/MO_16/MO_32/MO_64
6
value, and doubling the size should be done by a simple increment.
7
2
8
This meant we were mishandling FCMLA (by element) of values where
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
the real and imaginary parts are 32-bit floats, and would incorrectly
4
Message-id: 20220527181907.189259-77-richard.henderson@linaro.org
10
UNDEF this encoding. (No other insns take this code path, and for
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
16-bit floats it happens that 1 << 1 and 1 + 1 are both the same).
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 7 ++-----
9
1 file changed, 2 insertions(+), 5 deletions(-)
12
10
13
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
16
Message-id: 20190129140411.682-3-peter.maydell@linaro.org
17
---
18
target/arm/translate-a64.c | 2 +-
19
1 file changed, 1 insertion(+), 1 deletion(-)
20
21
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
22
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/translate-a64.c
13
--- a/target/arm/translate-sve.c
24
+++ b/target/arm/translate-a64.c
14
+++ b/target/arm/translate-sve.c
25
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
15
@@ -XXX,XX +XXX,XX @@ static bool do_zzi_ool(DisasContext *s, arg_rri_esz *a, gen_helper_gvec_2i *fn)
26
16
}
27
case 2: /* complex fp */
17
28
/* Each indexable element is a complex pair. */
18
#define DO_ZZI(NAME, name) \
29
- size <<= 1;
19
-static bool trans_##NAME##_zzi(DisasContext *s, arg_rri_esz *a) \
30
+ size += 1;
20
-{ \
31
switch (size) {
21
- static gen_helper_gvec_2i * const fns[4] = { \
32
case MO_32:
22
+ static gen_helper_gvec_2i * const name##i_fns[4] = { \
33
if (h && !is_q) {
23
gen_helper_sve_##name##i_b, gen_helper_sve_##name##i_h, \
24
gen_helper_sve_##name##i_s, gen_helper_sve_##name##i_d, \
25
}; \
26
- return do_zzi_ool(s, a, fns[a->esz]); \
27
-}
28
+ TRANS_FEAT(NAME##_zzi, aa64_sve, do_zzi_ool, a, name##i_fns[a->esz])
29
30
DO_ZZI(SMAX, smax)
31
DO_ZZI(UMAX, umax)
34
--
32
--
35
2.20.1
33
2.25.1
36
37
diff view generated by jsdifflib
1
From: Steffen Görtz <contrib@steffen-goertz.de>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The nRF51 contains three regions of non-volatile memory (NVM):
3
Use these for the several varieties of floating-point
4
- CODE (R/W): contains code
4
multiply-add instructions.
5
- FICR (R): Factory information like code size, chip id etc.
6
- UICR (R/W): Changeable configuration data. Lock bits, Code
7
protection configuration, Bootloader address, Nordic SoftRadio
8
configuration, Firmware configuration.
9
5
10
Read and write access to the memories is managed by the
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Non-volatile memory controller.
7
Message-id: 20220527181907.189259-78-richard.henderson@linaro.org
12
13
Memory schema:
14
[ CPU ] -+- [ NVM, either FICR, UICR or CODE ]
15
| |
16
\- [ NVMC ]
17
18
Signed-off-by: Steffen Görtz <contrib@steffen-goertz.de>
19
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
20
Tested-by: Joel Stanley <joel@jms.id.au>
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
22
Message-id: 20190201023357.22596-2-stefanha@redhat.com
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
10
---
25
hw/nvram/Makefile.objs | 1 +
11
target/arm/translate-sve.c | 140 ++++++++++++++-----------------------
26
include/hw/nvram/nrf51_nvm.h | 64 ++++++
12
1 file changed, 53 insertions(+), 87 deletions(-)
27
hw/nvram/nrf51_nvm.c | 388 +++++++++++++++++++++++++++++++++++
28
3 files changed, 453 insertions(+)
29
create mode 100644 include/hw/nvram/nrf51_nvm.h
30
create mode 100644 hw/nvram/nrf51_nvm.c
31
13
32
diff --git a/hw/nvram/Makefile.objs b/hw/nvram/Makefile.objs
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
33
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/nvram/Makefile.objs
16
--- a/target/arm/translate-sve.c
35
+++ b/hw/nvram/Makefile.objs
17
+++ b/target/arm/translate-sve.c
36
@@ -XXX,XX +XXX,XX @@ common-obj-y += fw_cfg.o
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzxz(DisasContext *s, gen_helper_gvec_4 *fn,
37
common-obj-y += chrp_nvram.o
19
return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
38
common-obj-$(CONFIG_MAC_NVRAM) += mac_nvram.o
20
}
39
obj-$(CONFIG_PSERIES) += spapr_nvram.o
21
40
+obj-$(CONFIG_NRF51_SOC) += nrf51_nvm.o
22
+/* Invoke an out-of-line helper on 4 Zregs, plus a pointer. */
41
diff --git a/include/hw/nvram/nrf51_nvm.h b/include/hw/nvram/nrf51_nvm.h
23
+static bool gen_gvec_ptr_zzzz(DisasContext *s, gen_helper_gvec_4_ptr *fn,
42
new file mode 100644
24
+ int rd, int rn, int rm, int ra,
43
index XXXXXXX..XXXXXXX
25
+ int data, TCGv_ptr ptr)
44
--- /dev/null
45
+++ b/include/hw/nvram/nrf51_nvm.h
46
@@ -XXX,XX +XXX,XX @@
47
+/*
48
+ * Nordic Semiconductor nRF51 non-volatile memory
49
+ *
50
+ * It provides an interface to erase regions in flash memory.
51
+ * Furthermore it provides the user and factory information registers.
52
+ *
53
+ * QEMU interface:
54
+ * + sysbus MMIO regions 0: NVMC peripheral registers
55
+ * + sysbus MMIO regions 1: FICR peripheral registers
56
+ * + sysbus MMIO regions 2: UICR peripheral registers
57
+ * + flash-size property: flash size in bytes.
58
+ *
59
+ * Accuracy of the peripheral model:
60
+ * + Code regions (MPU configuration) are disregarded.
61
+ *
62
+ * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de>
63
+ *
64
+ * This code is licensed under the GPL version 2 or later. See
65
+ * the COPYING file in the top-level directory.
66
+ *
67
+ */
68
+#ifndef NRF51_NVM_H
69
+#define NRF51_NVM_H
70
+
71
+#include "hw/sysbus.h"
72
+#define TYPE_NRF51_NVM "nrf51_soc.nvm"
73
+#define NRF51_NVM(obj) OBJECT_CHECK(NRF51NVMState, (obj), TYPE_NRF51_NVM)
74
+
75
+#define NRF51_UICR_FIXTURE_SIZE 64
76
+
77
+#define NRF51_NVMC_SIZE 0x1000
78
+
79
+#define NRF51_NVMC_READY 0x400
80
+#define NRF51_NVMC_READY_READY 0x01
81
+#define NRF51_NVMC_CONFIG 0x504
82
+#define NRF51_NVMC_CONFIG_MASK 0x03
83
+#define NRF51_NVMC_CONFIG_WEN 0x01
84
+#define NRF51_NVMC_CONFIG_EEN 0x02
85
+#define NRF51_NVMC_ERASEPCR1 0x508
86
+#define NRF51_NVMC_ERASEPCR0 0x510
87
+#define NRF51_NVMC_ERASEALL 0x50C
88
+#define NRF51_NVMC_ERASEUICR 0x514
89
+#define NRF51_NVMC_ERASE 0x01
90
+
91
+#define NRF51_UICR_SIZE 0x100
92
+
93
+typedef struct NRF51NVMState {
94
+ SysBusDevice parent_obj;
95
+
96
+ MemoryRegion mmio;
97
+ MemoryRegion ficr;
98
+ MemoryRegion uicr;
99
+ MemoryRegion flash;
100
+
101
+ uint32_t uicr_content[NRF51_UICR_FIXTURE_SIZE];
102
+ uint32_t flash_size;
103
+ uint8_t *storage;
104
+
105
+ uint32_t config;
106
+
107
+} NRF51NVMState;
108
+
109
+
110
+#endif
111
diff --git a/hw/nvram/nrf51_nvm.c b/hw/nvram/nrf51_nvm.c
112
new file mode 100644
113
index XXXXXXX..XXXXXXX
114
--- /dev/null
115
+++ b/hw/nvram/nrf51_nvm.c
116
@@ -XXX,XX +XXX,XX @@
117
+/*
118
+ * Nordic Semiconductor nRF51 non-volatile memory
119
+ *
120
+ * It provides an interface to erase regions in flash memory.
121
+ * Furthermore it provides the user and factory information registers.
122
+ *
123
+ * Reference Manual: http://infocenter.nordicsemi.com/pdf/nRF51_RM_v3.0.pdf
124
+ *
125
+ * See nRF51 reference manual and product sheet sections:
126
+ * + Non-Volatile Memory Controller (NVMC)
127
+ * + Factory Information Configuration Registers (FICR)
128
+ * + User Information Configuration Registers (UICR)
129
+ *
130
+ * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de>
131
+ *
132
+ * This code is licensed under the GPL version 2 or later. See
133
+ * the COPYING file in the top-level directory.
134
+ */
135
+
136
+#include "qemu/osdep.h"
137
+#include "qapi/error.h"
138
+#include "qemu/log.h"
139
+#include "exec/address-spaces.h"
140
+#include "hw/arm/nrf51.h"
141
+#include "hw/nvram/nrf51_nvm.h"
142
+
143
+/*
144
+ * FICR Registers Assignments
145
+ * CODEPAGESIZE 0x010
146
+ * CODESIZE 0x014
147
+ * CLENR0 0x028
148
+ * PPFC 0x02C
149
+ * NUMRAMBLOCK 0x034
150
+ * SIZERAMBLOCKS 0x038
151
+ * SIZERAMBLOCK[0] 0x038
152
+ * SIZERAMBLOCK[1] 0x03C
153
+ * SIZERAMBLOCK[2] 0x040
154
+ * SIZERAMBLOCK[3] 0x044
155
+ * CONFIGID 0x05C
156
+ * DEVICEID[0] 0x060
157
+ * DEVICEID[1] 0x064
158
+ * ER[0] 0x080
159
+ * ER[1] 0x084
160
+ * ER[2] 0x088
161
+ * ER[3] 0x08C
162
+ * IR[0] 0x090
163
+ * IR[1] 0x094
164
+ * IR[2] 0x098
165
+ * IR[3] 0x09C
166
+ * DEVICEADDRTYPE 0x0A0
167
+ * DEVICEADDR[0] 0x0A4
168
+ * DEVICEADDR[1] 0x0A8
169
+ * OVERRIDEEN 0x0AC
170
+ * NRF_1MBIT[0] 0x0B0
171
+ * NRF_1MBIT[1] 0x0B4
172
+ * NRF_1MBIT[2] 0x0B8
173
+ * NRF_1MBIT[3] 0x0BC
174
+ * NRF_1MBIT[4] 0x0C0
175
+ * BLE_1MBIT[0] 0x0EC
176
+ * BLE_1MBIT[1] 0x0F0
177
+ * BLE_1MBIT[2] 0x0F4
178
+ * BLE_1MBIT[3] 0x0F8
179
+ * BLE_1MBIT[4] 0x0FC
180
+ */
181
+static const uint32_t ficr_content[64] = {
182
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000400,
183
+ 0x00000100, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000002, 0x00002000,
184
+ 0x00002000, 0x00002000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
185
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
186
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000003,
187
+ 0x12345678, 0x9ABCDEF1, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
188
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
189
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
190
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
191
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
192
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
193
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
194
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
195
+};
196
+
197
+static uint64_t ficr_read(void *opaque, hwaddr offset, unsigned int size)
198
+{
26
+{
199
+ assert(offset < sizeof(ficr_content));
27
+ if (fn == NULL) {
200
+ return ficr_content[offset / 4];
28
+ return false;
29
+ }
30
+ if (sve_access_check(s)) {
31
+ unsigned vsz = vec_full_reg_size(s);
32
+ tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, rd),
33
+ vec_full_reg_offset(s, rn),
34
+ vec_full_reg_offset(s, rm),
35
+ vec_full_reg_offset(s, ra),
36
+ ptr, vsz, vsz, data, fn);
37
+ }
38
+ return true;
201
+}
39
+}
202
+
40
+
203
+static void ficr_write(void *opaque, hwaddr offset, uint64_t value,
41
+static bool gen_gvec_fpst_zzzz(DisasContext *s, gen_helper_gvec_4_ptr *fn,
204
+ unsigned int size)
42
+ int rd, int rn, int rm, int ra,
43
+ int data, ARMFPStatusFlavour flavour)
205
+{
44
+{
206
+ /* Intentionally do nothing */
45
+ TCGv_ptr status = fpstatus_ptr(flavour);
46
+ bool ret = gen_gvec_ptr_zzzz(s, fn, rd, rn, rm, ra, data, status);
47
+ tcg_temp_free_ptr(status);
48
+ return ret;
207
+}
49
+}
208
+
50
+
209
+static const MemoryRegionOps ficr_ops = {
51
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
210
+ .read = ficr_read,
52
static bool gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
211
+ .write = ficr_write,
53
int rd, int rn, int pg, int data)
212
+ .impl.min_access_size = 4,
54
@@ -XXX,XX +XXX,XX @@ DO_SVE2_RRXR_ROT(CDOT_zzxw_d, gen_helper_sve2_cdot_idx_d)
213
+ .impl.max_access_size = 4,
55
214
+ .endianness = DEVICE_LITTLE_ENDIAN
56
static bool do_FMLA_zzxz(DisasContext *s, arg_rrxr_esz *a, bool sub)
215
+};
57
{
58
- static gen_helper_gvec_4_ptr * const fns[3] = {
59
+ static gen_helper_gvec_4_ptr * const fns[4] = {
60
+ NULL,
61
gen_helper_gvec_fmla_idx_h,
62
gen_helper_gvec_fmla_idx_s,
63
gen_helper_gvec_fmla_idx_d,
64
};
65
-
66
- if (sve_access_check(s)) {
67
- unsigned vsz = vec_full_reg_size(s);
68
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
69
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
70
- vec_full_reg_offset(s, a->rn),
71
- vec_full_reg_offset(s, a->rm),
72
- vec_full_reg_offset(s, a->ra),
73
- status, vsz, vsz, (a->index << 1) | sub,
74
- fns[a->esz - 1]);
75
- tcg_temp_free_ptr(status);
76
- }
77
- return true;
78
+ return gen_gvec_fpst_zzzz(s, fns[a->esz], a->rd, a->rn, a->rm, a->ra,
79
+ (a->index << 1) | sub,
80
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
81
}
82
83
static bool trans_FMLA_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
84
@@ -XXX,XX +XXX,XX @@ static bool trans_FCMLA_zpzzz(DisasContext *s, arg_FCMLA_zpzzz *a)
85
86
static bool trans_FCMLA_zzxz(DisasContext *s, arg_FCMLA_zzxz *a)
87
{
88
- static gen_helper_gvec_4_ptr * const fns[2] = {
89
+ static gen_helper_gvec_4_ptr * const fns[4] = {
90
+ NULL,
91
gen_helper_gvec_fcmlah_idx,
92
gen_helper_gvec_fcmlas_idx,
93
+ NULL,
94
};
95
96
- tcg_debug_assert(a->esz == 1 || a->esz == 2);
97
tcg_debug_assert(a->rd == a->ra);
98
- if (sve_access_check(s)) {
99
- unsigned vsz = vec_full_reg_size(s);
100
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
101
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
102
- vec_full_reg_offset(s, a->rn),
103
- vec_full_reg_offset(s, a->rm),
104
- vec_full_reg_offset(s, a->ra),
105
- status, vsz, vsz,
106
- a->index * 4 + a->rot,
107
- fns[a->esz - 1]);
108
- tcg_temp_free_ptr(status);
109
- }
110
- return true;
216
+
111
+
217
+/*
112
+ return gen_gvec_fpst_zzzz(s, fns[a->esz], a->rd, a->rn, a->rm, a->ra,
218
+ * UICR Registers Assignments
113
+ a->index * 4 + a->rot,
219
+ * CLENR0 0x000
114
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
220
+ * RBPCONF 0x004
115
}
221
+ * XTALFREQ 0x008
116
222
+ * FWID 0x010
117
/*
223
+ * BOOTLOADERADDR 0x014
118
@@ -XXX,XX +XXX,XX @@ static bool trans_FMMLA(DisasContext *s, arg_rrrr_esz *a)
224
+ * NRFFW[0] 0x014
119
return false;
225
+ * NRFFW[1] 0x018
120
}
226
+ * NRFFW[2] 0x01C
121
227
+ * NRFFW[3] 0x020
122
- if (sve_access_check(s)) {
228
+ * NRFFW[4] 0x024
123
- unsigned vsz = vec_full_reg_size(s);
229
+ * NRFFW[5] 0x028
124
- TCGv_ptr status = fpstatus_ptr(FPST_FPCR);
230
+ * NRFFW[6] 0x02C
125
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
231
+ * NRFFW[7] 0x030
126
- vec_full_reg_offset(s, a->rn),
232
+ * NRFFW[8] 0x034
127
- vec_full_reg_offset(s, a->rm),
233
+ * NRFFW[9] 0x038
128
- vec_full_reg_offset(s, a->ra),
234
+ * NRFFW[10] 0x03C
129
- status, vsz, vsz, 0, fn);
235
+ * NRFFW[11] 0x040
130
- tcg_temp_free_ptr(status);
236
+ * NRFFW[12] 0x044
131
- }
237
+ * NRFFW[13] 0x048
132
- return true;
238
+ * NRFFW[14] 0x04C
133
+ return gen_gvec_fpst_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR);
239
+ * NRFHW[0] 0x050
134
}
240
+ * NRFHW[1] 0x054
135
241
+ * NRFHW[2] 0x058
136
static gen_helper_gvec_4 * const sqdmlal_zzzw_fns[] = {
242
+ * NRFHW[3] 0x05C
137
@@ -XXX,XX +XXX,XX @@ static bool do_FMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sub, bool sel)
243
+ * NRFHW[4] 0x060
138
if (!dc_isar_feature(aa64_sve2, s)) {
244
+ * NRFHW[5] 0x064
139
return false;
245
+ * NRFHW[6] 0x068
140
}
246
+ * NRFHW[7] 0x06C
141
- if (sve_access_check(s)) {
247
+ * NRFHW[8] 0x070
142
- unsigned vsz = vec_full_reg_size(s);
248
+ * NRFHW[9] 0x074
143
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
249
+ * NRFHW[10] 0x078
144
- vec_full_reg_offset(s, a->rn),
250
+ * NRFHW[11] 0x07C
145
- vec_full_reg_offset(s, a->rm),
251
+ * CUSTOMER[0] 0x080
146
- vec_full_reg_offset(s, a->ra),
252
+ * CUSTOMER[1] 0x084
147
- cpu_env, vsz, vsz, (sel << 1) | sub,
253
+ * CUSTOMER[2] 0x088
148
- gen_helper_sve2_fmlal_zzzw_s);
254
+ * CUSTOMER[3] 0x08C
149
- }
255
+ * CUSTOMER[4] 0x090
150
- return true;
256
+ * CUSTOMER[5] 0x094
151
+ return gen_gvec_ptr_zzzz(s, gen_helper_sve2_fmlal_zzzw_s,
257
+ * CUSTOMER[6] 0x098
152
+ a->rd, a->rn, a->rm, a->ra,
258
+ * CUSTOMER[7] 0x09C
153
+ (sel << 1) | sub, cpu_env);
259
+ * CUSTOMER[8] 0x0A0
154
}
260
+ * CUSTOMER[9] 0x0A4
155
261
+ * CUSTOMER[10] 0x0A8
156
static bool trans_FMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
262
+ * CUSTOMER[11] 0x0AC
157
@@ -XXX,XX +XXX,XX @@ static bool do_FMLAL_zzxw(DisasContext *s, arg_rrxr_esz *a, bool sub, bool sel)
263
+ * CUSTOMER[12] 0x0B0
158
if (!dc_isar_feature(aa64_sve2, s)) {
264
+ * CUSTOMER[13] 0x0B4
159
return false;
265
+ * CUSTOMER[14] 0x0B8
160
}
266
+ * CUSTOMER[15] 0x0BC
161
- if (sve_access_check(s)) {
267
+ * CUSTOMER[16] 0x0C0
162
- unsigned vsz = vec_full_reg_size(s);
268
+ * CUSTOMER[17] 0x0C4
163
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
269
+ * CUSTOMER[18] 0x0C8
164
- vec_full_reg_offset(s, a->rn),
270
+ * CUSTOMER[19] 0x0CC
165
- vec_full_reg_offset(s, a->rm),
271
+ * CUSTOMER[20] 0x0D0
166
- vec_full_reg_offset(s, a->ra),
272
+ * CUSTOMER[21] 0x0D4
167
- cpu_env, vsz, vsz,
273
+ * CUSTOMER[22] 0x0D8
168
- (a->index << 2) | (sel << 1) | sub,
274
+ * CUSTOMER[23] 0x0DC
169
- gen_helper_sve2_fmlal_zzxw_s);
275
+ * CUSTOMER[24] 0x0E0
170
- }
276
+ * CUSTOMER[25] 0x0E4
171
- return true;
277
+ * CUSTOMER[26] 0x0E8
172
+ return gen_gvec_ptr_zzzz(s, gen_helper_sve2_fmlal_zzxw_s,
278
+ * CUSTOMER[27] 0x0EC
173
+ a->rd, a->rn, a->rm, a->ra,
279
+ * CUSTOMER[28] 0x0F0
174
+ (a->index << 2) | (sel << 1) | sub, cpu_env);
280
+ * CUSTOMER[29] 0x0F4
175
}
281
+ * CUSTOMER[30] 0x0F8
176
282
+ * CUSTOMER[31] 0x0FC
177
static bool trans_FMLALB_zzxw(DisasContext *s, arg_rrxr_esz *a)
283
+ */
178
@@ -XXX,XX +XXX,XX @@ static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
284
+
179
if (!dc_isar_feature(aa64_sve_bf16, s)) {
285
+static uint64_t uicr_read(void *opaque, hwaddr offset, unsigned int size)
180
return false;
286
+{
181
}
287
+ NRF51NVMState *s = NRF51_NVM(opaque);
182
- if (sve_access_check(s)) {
288
+
183
- TCGv_ptr status = fpstatus_ptr(FPST_FPCR);
289
+ assert(offset < sizeof(s->uicr_content));
184
- unsigned vsz = vec_full_reg_size(s);
290
+ return s->uicr_content[offset / 4];
185
-
291
+}
186
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
292
+
187
- vec_full_reg_offset(s, a->rn),
293
+static void uicr_write(void *opaque, hwaddr offset, uint64_t value,
188
- vec_full_reg_offset(s, a->rm),
294
+ unsigned int size)
189
- vec_full_reg_offset(s, a->ra),
295
+{
190
- status, vsz, vsz, sel,
296
+ NRF51NVMState *s = NRF51_NVM(opaque);
191
- gen_helper_gvec_bfmlal);
297
+
192
- tcg_temp_free_ptr(status);
298
+ assert(offset < sizeof(s->uicr_content));
193
- }
299
+ s->uicr_content[offset / 4] = value;
194
- return true;
300
+}
195
+ return gen_gvec_fpst_zzzz(s, gen_helper_gvec_bfmlal,
301
+
196
+ a->rd, a->rn, a->rm, a->ra, sel, FPST_FPCR);
302
+static const MemoryRegionOps uicr_ops = {
197
}
303
+ .read = uicr_read,
198
304
+ .write = uicr_write,
199
static bool trans_BFMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
305
+ .impl.min_access_size = 4,
200
@@ -XXX,XX +XXX,XX @@ static bool do_BFMLAL_zzxw(DisasContext *s, arg_rrxr_esz *a, bool sel)
306
+ .impl.max_access_size = 4,
201
if (!dc_isar_feature(aa64_sve_bf16, s)) {
307
+ .endianness = DEVICE_LITTLE_ENDIAN
202
return false;
308
+};
203
}
309
+
204
- if (sve_access_check(s)) {
310
+
205
- TCGv_ptr status = fpstatus_ptr(FPST_FPCR);
311
+static uint64_t io_read(void *opaque, hwaddr offset, unsigned int size)
206
- unsigned vsz = vec_full_reg_size(s);
312
+{
207
-
313
+ NRF51NVMState *s = NRF51_NVM(opaque);
208
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
314
+ uint64_t r = 0;
209
- vec_full_reg_offset(s, a->rn),
315
+
210
- vec_full_reg_offset(s, a->rm),
316
+ switch (offset) {
211
- vec_full_reg_offset(s, a->ra),
317
+ case NRF51_NVMC_READY:
212
- status, vsz, vsz, (a->index << 1) | sel,
318
+ r = NRF51_NVMC_READY_READY;
213
- gen_helper_gvec_bfmlal_idx);
319
+ break;
214
- tcg_temp_free_ptr(status);
320
+ case NRF51_NVMC_CONFIG:
215
- }
321
+ r = s->config;
216
- return true;
322
+ break;
217
+ return gen_gvec_fpst_zzzz(s, gen_helper_gvec_bfmlal_idx,
323
+ default:
218
+ a->rd, a->rn, a->rm, a->ra,
324
+ qemu_log_mask(LOG_GUEST_ERROR,
219
+ (a->index << 1) | sel, FPST_FPCR);
325
+ "%s: bad read offset 0x%" HWADDR_PRIx "\n", __func__, offset);
220
}
326
+ break;
221
327
+ }
222
static bool trans_BFMLALB_zzxw(DisasContext *s, arg_rrxr_esz *a)
328
+
329
+ return r;
330
+}
331
+
332
+static void io_write(void *opaque, hwaddr offset, uint64_t value,
333
+ unsigned int size)
334
+{
335
+ NRF51NVMState *s = NRF51_NVM(opaque);
336
+
337
+ switch (offset) {
338
+ case NRF51_NVMC_CONFIG:
339
+ s->config = value & NRF51_NVMC_CONFIG_MASK;
340
+ break;
341
+ case NRF51_NVMC_ERASEPCR0:
342
+ case NRF51_NVMC_ERASEPCR1:
343
+ if (s->config & NRF51_NVMC_CONFIG_EEN) {
344
+ /* Mask in-page sub address */
345
+ value &= ~(NRF51_PAGE_SIZE - 1);
346
+ if (value <= (s->flash_size - NRF51_PAGE_SIZE)) {
347
+ memset(s->storage + value, 0xFF, NRF51_PAGE_SIZE);
348
+ memory_region_flush_rom_device(&s->flash, value,
349
+ NRF51_PAGE_SIZE);
350
+ }
351
+ } else {
352
+ qemu_log_mask(LOG_GUEST_ERROR,
353
+ "%s: Flash erase at 0x%" HWADDR_PRIx" while flash not erasable.\n",
354
+ __func__, offset);
355
+ }
356
+ break;
357
+ case NRF51_NVMC_ERASEALL:
358
+ if (value == NRF51_NVMC_ERASE) {
359
+ if (s->config & NRF51_NVMC_CONFIG_EEN) {
360
+ memset(s->storage, 0xFF, s->flash_size);
361
+ memory_region_flush_rom_device(&s->flash, 0, s->flash_size);
362
+ memset(s->uicr_content, 0xFF, sizeof(s->uicr_content));
363
+ } else {
364
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash not erasable.\n",
365
+ __func__);
366
+ }
367
+ }
368
+ break;
369
+ case NRF51_NVMC_ERASEUICR:
370
+ if (value == NRF51_NVMC_ERASE) {
371
+ memset(s->uicr_content, 0xFF, sizeof(s->uicr_content));
372
+ }
373
+ break;
374
+
375
+ default:
376
+ qemu_log_mask(LOG_GUEST_ERROR,
377
+ "%s: bad write offset 0x%" HWADDR_PRIx "\n", __func__, offset);
378
+ }
379
+}
380
+
381
+static const MemoryRegionOps io_ops = {
382
+ .read = io_read,
383
+ .write = io_write,
384
+ .impl.min_access_size = 4,
385
+ .impl.max_access_size = 4,
386
+ .endianness = DEVICE_LITTLE_ENDIAN,
387
+};
388
+
389
+
390
+static void flash_write(void *opaque, hwaddr offset, uint64_t value,
391
+ unsigned int size)
392
+{
393
+ NRF51NVMState *s = NRF51_NVM(opaque);
394
+
395
+ if (s->config & NRF51_NVMC_CONFIG_WEN) {
396
+ uint32_t oldval;
397
+
398
+ assert(offset + size <= s->flash_size);
399
+
400
+ /* NOR Flash only allows bits to be flipped from 1's to 0's on write */
401
+ oldval = ldl_le_p(s->storage + offset);
402
+ oldval &= value;
403
+ stl_le_p(s->storage + offset, oldval);
404
+
405
+ memory_region_flush_rom_device(&s->flash, offset, size);
406
+ } else {
407
+ qemu_log_mask(LOG_GUEST_ERROR,
408
+ "%s: Flash write 0x%" HWADDR_PRIx" while flash not writable.\n",
409
+ __func__, offset);
410
+ }
411
+}
412
+
413
+
414
+
415
+static const MemoryRegionOps flash_ops = {
416
+ .write = flash_write,
417
+ .valid.min_access_size = 4,
418
+ .valid.max_access_size = 4,
419
+ .endianness = DEVICE_LITTLE_ENDIAN,
420
+};
421
+
422
+static void nrf51_nvm_init(Object *obj)
423
+{
424
+ NRF51NVMState *s = NRF51_NVM(obj);
425
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
426
+
427
+ memory_region_init_io(&s->mmio, obj, &io_ops, s, "nrf51_soc.nvmc",
428
+ NRF51_NVMC_SIZE);
429
+ sysbus_init_mmio(sbd, &s->mmio);
430
+
431
+ memory_region_init_io(&s->ficr, obj, &ficr_ops, s, "nrf51_soc.ficr",
432
+ sizeof(ficr_content));
433
+ sysbus_init_mmio(sbd, &s->ficr);
434
+
435
+ memory_region_init_io(&s->uicr, obj, &uicr_ops, s, "nrf51_soc.uicr",
436
+ sizeof(s->uicr_content));
437
+ sysbus_init_mmio(sbd, &s->uicr);
438
+}
439
+
440
+static void nrf51_nvm_realize(DeviceState *dev, Error **errp)
441
+{
442
+ NRF51NVMState *s = NRF51_NVM(dev);
443
+ Error *err = NULL;
444
+
445
+ memory_region_init_rom_device(&s->flash, OBJECT(dev), &flash_ops, s,
446
+ "nrf51_soc.flash", s->flash_size, &err);
447
+ if (err) {
448
+ error_propagate(errp, err);
449
+ return;
450
+ }
451
+
452
+ s->storage = memory_region_get_ram_ptr(&s->flash);
453
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->flash);
454
+}
455
+
456
+static void nrf51_nvm_reset(DeviceState *dev)
457
+{
458
+ NRF51NVMState *s = NRF51_NVM(dev);
459
+
460
+ s->config = 0x00;
461
+ memset(s->uicr_content, 0xFF, sizeof(s->uicr_content));
462
+}
463
+
464
+static Property nrf51_nvm_properties[] = {
465
+ DEFINE_PROP_UINT32("flash-size", NRF51NVMState, flash_size, 0x40000),
466
+ DEFINE_PROP_END_OF_LIST(),
467
+};
468
+
469
+static const VMStateDescription vmstate_nvm = {
470
+ .name = "nrf51_soc.nvm",
471
+ .version_id = 1,
472
+ .minimum_version_id = 1,
473
+ .fields = (VMStateField[]) {
474
+ VMSTATE_UINT32_ARRAY(uicr_content, NRF51NVMState,
475
+ NRF51_UICR_FIXTURE_SIZE),
476
+ VMSTATE_UINT32(config, NRF51NVMState),
477
+ VMSTATE_END_OF_LIST()
478
+ }
479
+};
480
+
481
+static void nrf51_nvm_class_init(ObjectClass *klass, void *data)
482
+{
483
+ DeviceClass *dc = DEVICE_CLASS(klass);
484
+
485
+ dc->props = nrf51_nvm_properties;
486
+ dc->vmsd = &vmstate_nvm;
487
+ dc->realize = nrf51_nvm_realize;
488
+ dc->reset = nrf51_nvm_reset;
489
+}
490
+
491
+static const TypeInfo nrf51_nvm_info = {
492
+ .name = TYPE_NRF51_NVM,
493
+ .parent = TYPE_SYS_BUS_DEVICE,
494
+ .instance_size = sizeof(NRF51NVMState),
495
+ .instance_init = nrf51_nvm_init,
496
+ .class_init = nrf51_nvm_class_init
497
+};
498
+
499
+static void nrf51_nvm_register_types(void)
500
+{
501
+ type_register_static(&nrf51_nvm_info);
502
+}
503
+
504
+type_init(nrf51_nvm_register_types)
505
--
223
--
506
2.20.1
224
2.25.1
507
508
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
These bits become writable with the ARMv8.3-PAuth extension.
3
Being able to specify the feature predicate in TRANS_FEAT
4
makes it easier to split trans_FMMLA by element size,
5
which also happens to simplify the decode.
4
6
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20190129143511.12311-1-richard.henderson@linaro.org
8
Message-id: 20220527181907.189259-79-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
11
---
10
target/arm/helper.c | 6 ++++++
12
target/arm/sve.decode | 7 +++----
11
1 file changed, 6 insertions(+)
13
target/arm/translate-sve.c | 27 ++++-----------------------
14
2 files changed, 7 insertions(+), 27 deletions(-)
12
15
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
14
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
18
--- a/target/arm/sve.decode
16
+++ b/target/arm/helper.c
19
+++ b/target/arm/sve.decode
17
@@ -XXX,XX +XXX,XX @@ static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
20
@@ -XXX,XX +XXX,XX @@ SQRDCMLAH_zzzz 01000100 esz:2 0 rm:5 0011 rot:2 rn:5 rd:5 ra=%reg_movprfx
18
if (cpu_isar_feature(aa64_lor, cpu)) {
21
USDOT_zzzz 01000100 .. 0 ..... 011 110 ..... ..... @rda_rn_rm
19
valid_mask |= SCR_TLOR;
22
20
}
23
### SVE2 floating point matrix multiply accumulate
21
+ if (cpu_isar_feature(aa64_pauth, cpu)) {
24
-{
22
+ valid_mask |= SCR_API | SCR_APK;
25
- BFMMLA 01100100 01 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
23
+ }
26
- FMMLA 01100100 .. 1 ..... 111 001 ..... ..... @rda_rn_rm
24
27
-}
25
/* Clear all-context RES0 bits. */
28
+BFMMLA 01100100 01 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
26
value &= valid_mask;
29
+FMMLA_s 01100100 10 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
27
@@ -XXX,XX +XXX,XX @@ static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
30
+FMMLA_d 01100100 11 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
28
if (cpu_isar_feature(aa64_lor, cpu)) {
31
29
valid_mask |= HCR_TLOR;
32
### SVE2 Memory Gather Load Group
30
}
33
31
+ if (cpu_isar_feature(aa64_pauth, cpu)) {
34
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
32
+ valid_mask |= HCR_API | HCR_APK;
35
index XXXXXXX..XXXXXXX 100644
33
+ }
36
--- a/target/arm/translate-sve.c
34
37
+++ b/target/arm/translate-sve.c
35
/* Clear RES0 bits. */
38
@@ -XXX,XX +XXX,XX @@ DO_SVE2_ZPZZ_FP(FMINP, fminp)
36
value &= valid_mask;
39
* SVE Integer Multiply-Add (unpredicated)
40
*/
41
42
-static bool trans_FMMLA(DisasContext *s, arg_rrrr_esz *a)
43
-{
44
- gen_helper_gvec_4_ptr *fn;
45
-
46
- switch (a->esz) {
47
- case MO_32:
48
- if (!dc_isar_feature(aa64_sve_f32mm, s)) {
49
- return false;
50
- }
51
- fn = gen_helper_fmmla_s;
52
- break;
53
- case MO_64:
54
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
55
- return false;
56
- }
57
- fn = gen_helper_fmmla_d;
58
- break;
59
- default:
60
- return false;
61
- }
62
-
63
- return gen_gvec_fpst_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR);
64
-}
65
+TRANS_FEAT(FMMLA_s, aa64_sve_f32mm, gen_gvec_fpst_zzzz, gen_helper_fmmla_s,
66
+ a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR)
67
+TRANS_FEAT(FMMLA_d, aa64_sve_f64mm, gen_gvec_fpst_zzzz, gen_helper_fmmla_d,
68
+ a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR)
69
70
static gen_helper_gvec_4 * const sqdmlal_zzzw_fns[] = {
71
NULL, gen_helper_sve2_sqdmlal_zzzw_h,
37
--
72
--
38
2.20.1
73
2.25.1
39
40
diff view generated by jsdifflib
1
Currently the ARMv7M NVIC object's realize method assumes that the
1
From: Richard Henderson <richard.henderson@linaro.org>
2
CPU the NVIC is attached to is CPU 0, because it thinks there can
3
only ever be one CPU in the system. To allow a dual-Cortex-M33
4
setup we need to remove this assumption; instead the armv7m
5
wrapper object tells the NVIC its CPU, in the same way that it
6
already tells the CPU what the NVIC is.
7
2
3
Combined with the check already present in gen_mov_p,
4
we can simplify some special cases in trans_AND_pppp
5
and trans_BIC_pppp.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-80-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20190121185118.18550-2-peter.maydell@linaro.org
12
---
11
---
13
hw/arm/armv7m.c | 6 ++++--
12
target/arm/translate-sve.c | 30 ++++++++++++------------------
14
hw/intc/armv7m_nvic.c | 3 +--
13
1 file changed, 12 insertions(+), 18 deletions(-)
15
2 files changed, 5 insertions(+), 4 deletions(-)
16
14
17
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/armv7m.c
17
--- a/target/arm/translate-sve.c
20
+++ b/hw/arm/armv7m.c
18
+++ b/target/arm/translate-sve.c
21
@@ -XXX,XX +XXX,XX @@ static void armv7m_realize(DeviceState *dev, Error **errp)
19
@@ -XXX,XX +XXX,XX @@ static void do_dupi_z(DisasContext *s, int rd, uint64_t word)
20
}
21
22
/* Invoke a vector expander on three Pregs. */
23
-static void gen_gvec_fn_ppp(DisasContext *s, GVecGen3Fn *gvec_fn,
24
+static bool gen_gvec_fn_ppp(DisasContext *s, GVecGen3Fn *gvec_fn,
25
int rd, int rn, int rm)
26
{
27
- unsigned psz = pred_gvec_reg_size(s);
28
- gvec_fn(MO_64, pred_full_reg_offset(s, rd),
29
- pred_full_reg_offset(s, rn),
30
- pred_full_reg_offset(s, rm), psz, psz);
31
+ if (sve_access_check(s)) {
32
+ unsigned psz = pred_gvec_reg_size(s);
33
+ gvec_fn(MO_64, pred_full_reg_offset(s, rd),
34
+ pred_full_reg_offset(s, rn),
35
+ pred_full_reg_offset(s, rm), psz, psz);
36
+ }
37
+ return true;
38
}
39
40
/* Invoke a vector move on two Pregs. */
41
@@ -XXX,XX +XXX,XX @@ static bool trans_AND_pppp(DisasContext *s, arg_rprr_s *a)
42
};
43
44
if (!a->s) {
45
- if (!sve_access_check(s)) {
46
- return true;
47
- }
48
if (a->rn == a->rm) {
49
if (a->pg == a->rn) {
50
- do_mov_p(s, a->rd, a->rn);
51
- } else {
52
- gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->pg);
53
+ return do_mov_p(s, a->rd, a->rn);
54
}
55
- return true;
56
+ return gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->pg);
57
} else if (a->pg == a->rn || a->pg == a->rm) {
58
- gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->rm);
59
- return true;
60
+ return gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->rm);
22
}
61
}
23
}
62
}
24
63
return do_pppp_flags(s, a, &op);
25
- /* Tell the CPU where the NVIC is; it will fail realize if it doesn't
64
@@ -XXX,XX +XXX,XX @@ static bool trans_BIC_pppp(DisasContext *s, arg_rprr_s *a)
26
- * have one.
65
};
27
+ /*
66
28
+ * Tell the CPU where the NVIC is; it will fail realize if it doesn't
67
if (!a->s && a->pg == a->rn) {
29
+ * have one. Similarly, tell the NVIC where its CPU is.
68
- if (sve_access_check(s)) {
30
*/
69
- gen_gvec_fn_ppp(s, tcg_gen_gvec_andc, a->rd, a->rn, a->rm);
31
s->cpu->env.nvic = &s->nvic;
70
- }
32
+ s->nvic.cpu = s->cpu;
71
- return true;
33
72
+ return gen_gvec_fn_ppp(s, tcg_gen_gvec_andc, a->rd, a->rn, a->rm);
34
object_property_set_bool(OBJECT(s->cpu), true, "realized", &err);
73
}
35
if (err != NULL) {
74
return do_pppp_flags(s, a, &op);
36
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
75
}
37
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/intc/armv7m_nvic.c
39
+++ b/hw/intc/armv7m_nvic.c
40
@@ -XXX,XX +XXX,XX @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
41
Error *err = NULL;
42
int regionlen;
43
44
- s->cpu = ARM_CPU(qemu_get_cpu(0));
45
-
46
+ /* The armv7m container object will have set our CPU pointer */
47
if (!s->cpu || !arm_feature(&s->cpu->env, ARM_FEATURE_M)) {
48
error_setg(errp, "The NVIC can only be used with a Cortex-M CPU");
49
return;
50
--
76
--
51
2.20.1
77
2.25.1
52
53
diff view generated by jsdifflib
1
From: Steffen Görtz <contrib@steffen-goertz.de>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Instantiates UICR, FICR, FLASH and NVMC in nRF51 SOC.
3
This alias is defined on EOR (prediates). While the
4
same operation could be performed with NAND or NOR,
5
only bother with the official alias.
4
6
5
Signed-off-by: Steffen Görtz <contrib@steffen-goertz.de>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-81-richard.henderson@linaro.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9
Message-id: 20190201023357.22596-3-stefanha@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
11
---
12
include/hw/arm/nrf51_soc.h | 2 ++
12
target/arm/translate-sve.c | 5 +++++
13
hw/arm/nrf51_soc.c | 41 +++++++++++++++++++++++++++-----------
13
1 file changed, 5 insertions(+)
14
2 files changed, 31 insertions(+), 12 deletions(-)
15
14
16
diff --git a/include/hw/arm/nrf51_soc.h b/include/hw/arm/nrf51_soc.h
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/nrf51_soc.h
17
--- a/target/arm/translate-sve.c
19
+++ b/include/hw/arm/nrf51_soc.h
18
+++ b/target/arm/translate-sve.c
20
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static bool trans_EOR_pppp(DisasContext *s, arg_rprr_s *a)
21
#include "hw/char/nrf51_uart.h"
20
.fno = gen_helper_sve_eor_pppp,
22
#include "hw/misc/nrf51_rng.h"
21
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
23
#include "hw/gpio/nrf51_gpio.h"
22
};
24
+#include "hw/nvram/nrf51_nvm.h"
23
+
25
#include "hw/timer/nrf51_timer.h"
24
+ /* Alias NOT (predicate) is EOR Pd.B, Pg/Z, Pn.B, Pg.B */
26
25
+ if (!a->s && a->pg == a->rm) {
27
#define TYPE_NRF51_SOC "nrf51-soc"
26
+ return gen_gvec_fn_ppp(s, tcg_gen_gvec_andc, a->rd, a->pg, a->rn);
28
@@ -XXX,XX +XXX,XX @@ typedef struct NRF51State {
29
30
NRF51UARTState uart;
31
NRF51RNGState rng;
32
+ NRF51NVMState nvm;
33
NRF51GPIOState gpio;
34
NRF51TimerState timer[NRF51_NUM_TIMERS];
35
36
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/arm/nrf51_soc.c
39
+++ b/hw/arm/nrf51_soc.c
40
@@ -XXX,XX +XXX,XX @@
41
* are supported in the future, add a sub-class of NRF51SoC for
42
* the specific variants
43
*/
44
-#define NRF51822_FLASH_SIZE (256 * NRF51_PAGE_SIZE)
45
-#define NRF51822_SRAM_SIZE (16 * NRF51_PAGE_SIZE)
46
+#define NRF51822_FLASH_PAGES 256
47
+#define NRF51822_SRAM_PAGES 16
48
+#define NRF51822_FLASH_SIZE (NRF51822_FLASH_PAGES * NRF51_PAGE_SIZE)
49
+#define NRF51822_SRAM_SIZE (NRF51822_SRAM_PAGES * NRF51_PAGE_SIZE)
50
51
#define BASE_TO_IRQ(base) ((base >> 12) & 0x1F)
52
53
@@ -XXX,XX +XXX,XX @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
54
55
memory_region_add_subregion_overlap(&s->container, 0, s->board_memory, -1);
56
57
- memory_region_init_rom(&s->flash, OBJECT(s), "nrf51.flash", s->flash_size,
58
- &err);
59
- if (err) {
60
- error_propagate(errp, err);
61
- return;
62
- }
63
- memory_region_add_subregion(&s->container, NRF51_FLASH_BASE, &s->flash);
64
-
65
memory_region_init_ram(&s->sram, OBJECT(s), "nrf51.sram", s->sram_size,
66
&err);
67
if (err) {
68
@@ -XXX,XX +XXX,XX @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
69
qdev_get_gpio_in(DEVICE(&s->cpu),
70
BASE_TO_IRQ(NRF51_RNG_BASE)));
71
72
+ /* UICR, FICR, NVMC, FLASH */
73
+ object_property_set_uint(OBJECT(&s->nvm), s->flash_size, "flash-size",
74
+ &err);
75
+ if (err) {
76
+ error_propagate(errp, err);
77
+ return;
78
+ }
27
+ }
79
+
28
return do_pppp_flags(s, a, &op);
80
+ object_property_set_bool(OBJECT(&s->nvm), true, "realized", &err);
81
+ if (err) {
82
+ error_propagate(errp, err);
83
+ return;
84
+ }
85
+
86
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->nvm), 0);
87
+ memory_region_add_subregion_overlap(&s->container, NRF51_NVMC_BASE, mr, 0);
88
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->nvm), 1);
89
+ memory_region_add_subregion_overlap(&s->container, NRF51_FICR_BASE, mr, 0);
90
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->nvm), 2);
91
+ memory_region_add_subregion_overlap(&s->container, NRF51_UICR_BASE, mr, 0);
92
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->nvm), 3);
93
+ memory_region_add_subregion_overlap(&s->container, NRF51_FLASH_BASE, mr, 0);
94
+
95
/* GPIO */
96
object_property_set_bool(OBJECT(&s->gpio), true, "realized", &err);
97
if (err) {
98
@@ -XXX,XX +XXX,XX @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
99
100
create_unimplemented_device("nrf51_soc.io", NRF51_IOMEM_BASE,
101
NRF51_IOMEM_SIZE);
102
- create_unimplemented_device("nrf51_soc.ficr", NRF51_FICR_BASE,
103
- NRF51_FICR_SIZE);
104
create_unimplemented_device("nrf51_soc.private",
105
NRF51_PRIVATE_BASE, NRF51_PRIVATE_SIZE);
106
}
29
}
107
@@ -XXX,XX +XXX,XX @@ static void nrf51_soc_init(Object *obj)
108
sysbus_init_child_obj(obj, "rng", &s->rng, sizeof(s->rng),
109
TYPE_NRF51_RNG);
110
111
+ sysbus_init_child_obj(obj, "nvm", &s->nvm, sizeof(s->nvm), TYPE_NRF51_NVM);
112
+
113
sysbus_init_child_obj(obj, "gpio", &s->gpio, sizeof(s->gpio),
114
TYPE_NRF51_GPIO);
115
30
116
--
31
--
117
2.20.1
32
2.25.1
118
119
diff view generated by jsdifflib
1
The FCMLA (by element) instruction exists in the
1
From: Richard Henderson <richard.henderson@linaro.org>
2
"vector x indexed element" encoding group, but not in
3
the "scalar x indexed element" group. Correctly UNDEF
4
the unallocated encodings.
5
2
6
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-82-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
9
Message-id: 20190129140411.682-2-peter.maydell@linaro.org
10
---
7
---
11
target/arm/translate-a64.c | 2 +-
8
target/arm/translate-sve.c | 5 +----
12
1 file changed, 1 insertion(+), 1 deletion(-)
9
1 file changed, 1 insertion(+), 4 deletions(-)
13
10
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-a64.c
13
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-a64.c
14
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
15
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_4 * const udiv_fns[4] = {
19
case 0x13: /* FCMLA #90 */
16
};
20
case 0x15: /* FCMLA #180 */
17
TRANS_FEAT(UDIV_zpzz, aa64_sve, gen_gvec_ool_arg_zpzz, udiv_fns[a->esz], a, 0)
21
case 0x17: /* FCMLA #270 */
18
22
- if (!dc_isar_feature(aa64_fcma, s)) {
19
-static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
23
+ if (is_scalar || !dc_isar_feature(aa64_fcma, s)) {
20
-{
24
unallocated_encoding(s);
21
- return do_sel_z(s, a->rd, a->rn, a->rm, a->pg, a->esz);
25
return;
22
-}
26
}
23
+TRANS_FEAT(SEL_zpzz, aa64_sve, do_sel_z, a->rd, a->rn, a->rm, a->pg, a->esz)
24
25
/*
26
*** SVE Integer Arithmetic - Unary Predicated Group
27
--
27
--
28
2.20.1
28
2.25.1
29
30
diff view generated by jsdifflib
1
In the AdvSIMD scalar x indexed element and vector x indexed element
1
From: Richard Henderson <richard.henderson@linaro.org>
2
encoding group, the SDOT and UDOT instructions are vector only,
3
and their opcode is unallocated in the scalar group. Correctly
4
UNDEF this unallocated encoding.
5
2
6
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-83-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
9
Message-id: 20190125182626.9221-8-peter.maydell@linaro.org
10
---
7
---
11
target/arm/translate-a64.c | 2 +-
8
target/arm/translate-sve.c | 17 +++--------------
12
1 file changed, 1 insertion(+), 1 deletion(-)
9
1 file changed, 3 insertions(+), 14 deletions(-)
13
10
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-a64.c
13
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-a64.c
14
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
15
@@ -XXX,XX +XXX,XX @@ static bool trans_PRF_rr(DisasContext *s, arg_PRF_rr *a)
19
break;
16
* In the meantime, just emit the moves.
20
case 0x0e: /* SDOT */
17
*/
21
case 0x1e: /* UDOT */
18
22
- if (size != MO_32 || !dc_isar_feature(aa64_dp, s)) {
19
-static bool trans_MOVPRFX(DisasContext *s, arg_MOVPRFX *a)
23
+ if (is_scalar || size != MO_32 || !dc_isar_feature(aa64_dp, s)) {
20
-{
24
unallocated_encoding(s);
21
- return do_mov_z(s, a->rd, a->rn);
25
return;
22
-}
26
}
23
-
24
-static bool trans_MOVPRFX_m(DisasContext *s, arg_rpr_esz *a)
25
-{
26
- return do_sel_z(s, a->rd, a->rn, a->rd, a->pg, a->esz);
27
-}
28
-
29
-static bool trans_MOVPRFX_z(DisasContext *s, arg_rpr_esz *a)
30
-{
31
- return do_movz_zpz(s, a->rd, a->rn, a->pg, a->esz, false);
32
-}
33
+TRANS_FEAT(MOVPRFX, aa64_sve, do_mov_z, a->rd, a->rn)
34
+TRANS_FEAT(MOVPRFX_m, aa64_sve, do_sel_z, a->rd, a->rn, a->rd, a->pg, a->esz)
35
+TRANS_FEAT(MOVPRFX_z, aa64_sve, do_movz_zpz, a->rd, a->rn, a->pg, a->esz, false)
36
37
/*
38
* SVE2 Integer Multiply - Unpredicated
27
--
39
--
28
2.20.1
40
2.25.1
29
30
diff view generated by jsdifflib
1
In the "add/subtract (extended register)" encoding group, the "opt"
1
From: Richard Henderson <richard.henderson@linaro.org>
2
field in bits [23:22] must be zero. Correctly UNDEF the unallocated
3
encodings where this field is not zero.
4
2
5
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-84-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
8
Message-id: 20190125182626.9221-6-peter.maydell@linaro.org
9
---
7
---
10
target/arm/translate-a64.c | 3 ++-
8
target/arm/translate-sve.c | 11 ++---------
11
1 file changed, 2 insertions(+), 1 deletion(-)
9
1 file changed, 2 insertions(+), 9 deletions(-)
12
10
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-a64.c
13
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-a64.c
14
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static void disas_add_sub_ext_reg(DisasContext *s, uint32_t insn)
15
@@ -XXX,XX +XXX,XX @@ static bool do_FMLA_zzxz(DisasContext *s, arg_rrxr_esz *a, bool sub)
18
int imm3 = extract32(insn, 10, 3);
16
a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
19
int option = extract32(insn, 13, 3);
17
}
20
int rm = extract32(insn, 16, 5);
18
21
+ int opt = extract32(insn, 22, 2);
19
-static bool trans_FMLA_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
22
bool setflags = extract32(insn, 29, 1);
20
-{
23
bool sub_op = extract32(insn, 30, 1);
21
- return do_FMLA_zzxz(s, a, false);
24
bool sf = extract32(insn, 31, 1);
22
-}
25
@@ -XXX,XX +XXX,XX @@ static void disas_add_sub_ext_reg(DisasContext *s, uint32_t insn)
23
-
26
TCGv_i64 tcg_rd;
24
-static bool trans_FMLS_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
27
TCGv_i64 tcg_result;
25
-{
28
26
- return do_FMLA_zzxz(s, a, true);
29
- if (imm3 > 4) {
27
-}
30
+ if (imm3 > 4 || opt != 0) {
28
+TRANS_FEAT(FMLA_zzxz, aa64_sve, do_FMLA_zzxz, a, false)
31
unallocated_encoding(s);
29
+TRANS_FEAT(FMLS_zzxz, aa64_sve, do_FMLA_zzxz, a, true)
32
return;
30
33
}
31
/*
32
*** SVE Floating Point Multiply Indexed Group
34
--
33
--
35
2.20.1
34
2.25.1
36
37
diff view generated by jsdifflib
1
The tcg_register_iommu_notifier() code has a GArray of
1
From: Richard Henderson <richard.henderson@linaro.org>
2
TCGIOMMUNotifier structs which it has registered by passing
3
memory_region_register_iommu_notifier() a pointer to the embedded
4
IOMMUNotifier field. Unfortunately, if we need to enlarge the
5
array via g_array_set_size() this can cause a realloc(), which
6
invalidates the pointer that memory_region_register_iommu_notifier()
7
put into the MemoryRegion's iommu_notify list. This can result
8
in segfaults.
9
2
10
Switch the GArray to holding pointers to the TCGIOMMUNotifier
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
structs, so that we can individually allocate and free them.
4
Message-id: 20220527181907.189259-85-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 28 ++++------------------------
9
1 file changed, 4 insertions(+), 24 deletions(-)
12
10
13
Cc: qemu-stable@nongnu.org
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
Fixes: 1f871c5e6b0f30644a60a ("exec.c: Handle IOMMUs in address_space_translate_for_iotlb()")
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20190128174241.5860-1-peter.maydell@linaro.org
18
---
19
exec.c | 10 ++++++----
20
1 file changed, 6 insertions(+), 4 deletions(-)
21
22
diff --git a/exec.c b/exec.c
23
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
24
--- a/exec.c
13
--- a/target/arm/translate-sve.c
25
+++ b/exec.c
14
+++ b/target/arm/translate-sve.c
26
@@ -XXX,XX +XXX,XX @@ static void tcg_register_iommu_notifier(CPUState *cpu,
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(BFMMLA, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
27
int i;
16
28
17
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
29
for (i = 0; i < cpu->iommu_notifiers->len; i++) {
18
{
30
- notifier = &g_array_index(cpu->iommu_notifiers, TCGIOMMUNotifier, i);
19
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
31
+ notifier = g_array_index(cpu->iommu_notifiers, TCGIOMMUNotifier *, i);
20
- return false;
32
if (notifier->mr == mr && notifier->iommu_idx == iommu_idx) {
21
- }
33
break;
22
return gen_gvec_fpst_zzzz(s, gen_helper_gvec_bfmlal,
34
}
23
a->rd, a->rn, a->rm, a->ra, sel, FPST_FPCR);
35
@@ -XXX,XX +XXX,XX @@ static void tcg_register_iommu_notifier(CPUState *cpu,
36
if (i == cpu->iommu_notifiers->len) {
37
/* Not found, add a new entry at the end of the array */
38
cpu->iommu_notifiers = g_array_set_size(cpu->iommu_notifiers, i + 1);
39
- notifier = &g_array_index(cpu->iommu_notifiers, TCGIOMMUNotifier, i);
40
+ notifier = g_new0(TCGIOMMUNotifier, 1);
41
+ g_array_index(cpu->iommu_notifiers, TCGIOMMUNotifier *, i) = notifier;
42
43
notifier->mr = mr;
44
notifier->iommu_idx = iommu_idx;
45
@@ -XXX,XX +XXX,XX @@ static void tcg_iommu_free_notifier_list(CPUState *cpu)
46
TCGIOMMUNotifier *notifier;
47
48
for (i = 0; i < cpu->iommu_notifiers->len; i++) {
49
- notifier = &g_array_index(cpu->iommu_notifiers, TCGIOMMUNotifier, i);
50
+ notifier = g_array_index(cpu->iommu_notifiers, TCGIOMMUNotifier *, i);
51
memory_region_unregister_iommu_notifier(notifier->mr, &notifier->n);
52
+ g_free(notifier);
53
}
54
g_array_free(cpu->iommu_notifiers, true);
55
}
24
}
56
@@ -XXX,XX +XXX,XX @@ void cpu_exec_realizefn(CPUState *cpu, Error **errp)
25
57
vmstate_register(NULL, cpu->cpu_index, cc->vmsd, cpu);
26
-static bool trans_BFMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
58
}
27
-{
59
28
- return do_BFMLAL_zzzw(s, a, false);
60
- cpu->iommu_notifiers = g_array_new(false, true, sizeof(TCGIOMMUNotifier));
29
-}
61
+ cpu->iommu_notifiers = g_array_new(false, true, sizeof(TCGIOMMUNotifier *));
30
-
62
#endif
31
-static bool trans_BFMLALT_zzzw(DisasContext *s, arg_rrrr_esz *a)
32
-{
33
- return do_BFMLAL_zzzw(s, a, true);
34
-}
35
+TRANS_FEAT(BFMLALB_zzzw, aa64_sve_bf16, do_BFMLAL_zzzw, a, false)
36
+TRANS_FEAT(BFMLALT_zzzw, aa64_sve_bf16, do_BFMLAL_zzzw, a, true)
37
38
static bool do_BFMLAL_zzxw(DisasContext *s, arg_rrxr_esz *a, bool sel)
39
{
40
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
41
- return false;
42
- }
43
return gen_gvec_fpst_zzzz(s, gen_helper_gvec_bfmlal_idx,
44
a->rd, a->rn, a->rm, a->ra,
45
(a->index << 1) | sel, FPST_FPCR);
63
}
46
}
64
47
48
-static bool trans_BFMLALB_zzxw(DisasContext *s, arg_rrxr_esz *a)
49
-{
50
- return do_BFMLAL_zzxw(s, a, false);
51
-}
52
-
53
-static bool trans_BFMLALT_zzxw(DisasContext *s, arg_rrxr_esz *a)
54
-{
55
- return do_BFMLAL_zzxw(s, a, true);
56
-}
57
+TRANS_FEAT(BFMLALB_zzxw, aa64_sve_bf16, do_BFMLAL_zzxw, a, false)
58
+TRANS_FEAT(BFMLALT_zzxw, aa64_sve_bf16, do_BFMLAL_zzxw, a, true)
65
--
59
--
66
2.20.1
60
2.25.1
67
68
diff view generated by jsdifflib
1
From: Steffen Görtz <contrib@steffen-goertz.de>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Steffen Görtz <contrib@steffen-goertz.de>
3
Rename the function to match gen_gvec_ool_arg_zzz,
4
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
4
and move to be adjacent. Split out gen_gvec_fpst_zzz
5
Acked-by: Thomas Huth <thuth@redhat.com>
5
as a helper while we're at it.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-86-richard.henderson@linaro.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20190201023357.22596-4-stefanha@redhat.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
11
---
10
tests/microbit-test.c | 108 ++++++++++++++++++++++++++++++++++++++++++
12
target/arm/translate-sve.c | 50 +++++++++++++++++++++++---------------
11
1 file changed, 108 insertions(+)
13
1 file changed, 30 insertions(+), 20 deletions(-)
12
14
13
diff --git a/tests/microbit-test.c b/tests/microbit-test.c
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/microbit-test.c
17
--- a/target/arm/translate-sve.c
16
+++ b/tests/microbit-test.c
18
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
18
#include "hw/arm/nrf51.h"
20
return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
19
#include "hw/char/nrf51_uart.h"
20
#include "hw/gpio/nrf51_gpio.h"
21
+#include "hw/nvram/nrf51_nvm.h"
22
#include "hw/timer/nrf51_timer.h"
23
#include "hw/i2c/microbit_i2c.h"
24
25
@@ -XXX,XX +XXX,XX @@ static void test_microbit_i2c(void)
26
qtest_quit(qts);
27
}
21
}
28
22
29
+#define FLASH_SIZE (256 * NRF51_PAGE_SIZE)
23
+/* Invoke an out-of-line helper on 3 Zregs, plus float_status. */
24
+static bool gen_gvec_fpst_zzz(DisasContext *s, gen_helper_gvec_3_ptr *fn,
25
+ int rd, int rn, int rm,
26
+ int data, ARMFPStatusFlavour flavour)
27
+{
28
+ if (fn == NULL) {
29
+ return false;
30
+ }
31
+ if (sve_access_check(s)) {
32
+ unsigned vsz = vec_full_reg_size(s);
33
+ TCGv_ptr status = fpstatus_ptr(flavour);
30
+
34
+
31
+static void fill_and_erase(QTestState *qts, hwaddr base, hwaddr size,
35
+ tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
32
+ uint32_t address_reg)
36
+ vec_full_reg_offset(s, rn),
33
+{
37
+ vec_full_reg_offset(s, rm),
34
+ hwaddr i;
38
+ status, vsz, vsz, data, fn);
35
+
39
+
36
+ /* Erase Page */
40
+ tcg_temp_free_ptr(status);
37
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x02);
38
+ qtest_writel(qts, NRF51_NVMC_BASE + address_reg, base);
39
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
40
+
41
+ /* Check memory */
42
+ for (i = 0; i < size / 4; i++) {
43
+ g_assert_cmpuint(qtest_readl(qts, base + i * 4), ==, 0xFFFFFFFF);
44
+ }
41
+ }
45
+
42
+ return true;
46
+ /* Fill memory */
47
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x01);
48
+ for (i = 0; i < size / 4; i++) {
49
+ qtest_writel(qts, base + i * 4, i);
50
+ g_assert_cmpuint(qtest_readl(qts, base + i * 4), ==, i);
51
+ }
52
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
53
+}
43
+}
54
+
44
+
55
+static void test_nrf51_nvmc(void)
45
+static bool gen_gvec_fpst_arg_zzz(DisasContext *s, gen_helper_gvec_3_ptr *fn,
46
+ arg_rrr_esz *a, int data)
56
+{
47
+{
57
+ uint32_t value;
48
+ return gen_gvec_fpst_zzz(s, fn, a->rd, a->rn, a->rm, data,
58
+ hwaddr i;
49
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
59
+ QTestState *qts = qtest_init("-M microbit");
60
+
61
+ /* Test always ready */
62
+ value = qtest_readl(qts, NRF51_NVMC_BASE + NRF51_NVMC_READY);
63
+ g_assert_cmpuint(value & 0x01, ==, 0x01);
64
+
65
+ /* Test write-read config register */
66
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x03);
67
+ g_assert_cmpuint(qtest_readl(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG),
68
+ ==, 0x03);
69
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
70
+ g_assert_cmpuint(qtest_readl(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG),
71
+ ==, 0x00);
72
+
73
+ /* Test PCR0 */
74
+ fill_and_erase(qts, NRF51_FLASH_BASE, NRF51_PAGE_SIZE,
75
+ NRF51_NVMC_ERASEPCR0);
76
+ fill_and_erase(qts, NRF51_FLASH_BASE + NRF51_PAGE_SIZE,
77
+ NRF51_PAGE_SIZE, NRF51_NVMC_ERASEPCR0);
78
+
79
+ /* Test PCR1 */
80
+ fill_and_erase(qts, NRF51_FLASH_BASE, NRF51_PAGE_SIZE,
81
+ NRF51_NVMC_ERASEPCR1);
82
+ fill_and_erase(qts, NRF51_FLASH_BASE + NRF51_PAGE_SIZE,
83
+ NRF51_PAGE_SIZE, NRF51_NVMC_ERASEPCR1);
84
+
85
+ /* Erase all */
86
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x02);
87
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_ERASEALL, 0x01);
88
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
89
+
90
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x01);
91
+ for (i = 0; i < FLASH_SIZE / 4; i++) {
92
+ qtest_writel(qts, NRF51_FLASH_BASE + i * 4, i);
93
+ g_assert_cmpuint(qtest_readl(qts, NRF51_FLASH_BASE + i * 4), ==, i);
94
+ }
95
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
96
+
97
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x02);
98
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_ERASEALL, 0x01);
99
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
100
+
101
+ for (i = 0; i < FLASH_SIZE / 4; i++) {
102
+ g_assert_cmpuint(qtest_readl(qts, NRF51_FLASH_BASE + i * 4),
103
+ ==, 0xFFFFFFFF);
104
+ }
105
+
106
+ /* Erase UICR */
107
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x02);
108
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_ERASEUICR, 0x01);
109
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
110
+
111
+ for (i = 0; i < NRF51_UICR_SIZE / 4; i++) {
112
+ g_assert_cmpuint(qtest_readl(qts, NRF51_UICR_BASE + i * 4),
113
+ ==, 0xFFFFFFFF);
114
+ }
115
+
116
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x01);
117
+ for (i = 0; i < NRF51_UICR_SIZE / 4; i++) {
118
+ qtest_writel(qts, NRF51_UICR_BASE + i * 4, i);
119
+ g_assert_cmpuint(qtest_readl(qts, NRF51_UICR_BASE + i * 4), ==, i);
120
+ }
121
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
122
+
123
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x02);
124
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_ERASEUICR, 0x01);
125
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
126
+
127
+ for (i = 0; i < NRF51_UICR_SIZE / 4; i++) {
128
+ g_assert_cmpuint(qtest_readl(qts, NRF51_UICR_BASE + i * 4),
129
+ ==, 0xFFFFFFFF);
130
+ }
131
+
132
+ qtest_quit(qts);
133
+}
50
+}
134
+
51
+
135
static void test_nrf51_gpio(void)
52
/* Invoke an out-of-line helper on 4 Zregs. */
136
{
53
static bool gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
137
size_t i;
54
int rd, int rn, int rm, int ra, int data)
138
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
55
@@ -XXX,XX +XXX,XX @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
139
56
*** SVE Floating Point Arithmetic - Unpredicated Group
140
qtest_add_func("/microbit/nrf51/uart", test_nrf51_uart);
57
*/
141
qtest_add_func("/microbit/nrf51/gpio", test_nrf51_gpio);
58
142
+ qtest_add_func("/microbit/nrf51/nvmc", test_nrf51_nvmc);
59
-static bool do_zzz_fp(DisasContext *s, arg_rrr_esz *a,
143
qtest_add_func("/microbit/nrf51/timer", test_nrf51_timer);
60
- gen_helper_gvec_3_ptr *fn)
144
qtest_add_func("/microbit/microbit/i2c", test_microbit_i2c);
61
-{
145
62
- if (fn == NULL) {
63
- return false;
64
- }
65
- if (sve_access_check(s)) {
66
- unsigned vsz = vec_full_reg_size(s);
67
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
68
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
69
- vec_full_reg_offset(s, a->rn),
70
- vec_full_reg_offset(s, a->rm),
71
- status, vsz, vsz, 0, fn);
72
- tcg_temp_free_ptr(status);
73
- }
74
- return true;
75
-}
76
-
77
-
78
#define DO_FP3(NAME, name) \
79
static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
80
{ \
81
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
82
NULL, gen_helper_gvec_##name##_h, \
83
gen_helper_gvec_##name##_s, gen_helper_gvec_##name##_d \
84
}; \
85
- return do_zzz_fp(s, a, fns[a->esz]); \
86
+ return gen_gvec_fpst_arg_zzz(s, fns[a->esz], a, 0); \
87
}
88
89
DO_FP3(FADD_zzz, fadd)
146
--
90
--
147
2.20.1
91
2.25.1
148
149
diff view generated by jsdifflib
1
The PRFM prefetch insn in the load/store with imm9 encodings
1
From: Richard Henderson <richard.henderson@linaro.org>
2
requires idx field 0b00; we were underdecoding this by
3
only checking !is_unpriv (which is equivalent to idx != 2).
4
Correctly UNDEF the unallocated encodings where idx == 0b01
5
and 0b11 as well as 0b10.
6
2
7
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-87-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Message-id: 20190125182626.9221-3-peter.maydell@linaro.org
11
---
7
---
12
target/arm/translate-a64.c | 2 +-
8
target/arm/translate-sve.c | 7 ++-----
13
1 file changed, 1 insertion(+), 1 deletion(-)
9
1 file changed, 2 insertions(+), 5 deletions(-)
14
10
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
13
--- a/target/arm/translate-sve.c
18
+++ b/target/arm/translate-a64.c
14
+++ b/target/arm/translate-sve.c
19
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_reg_imm9(DisasContext *s, uint32_t insn,
15
@@ -XXX,XX +XXX,XX @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
20
} else {
16
*/
21
if (size == 3 && opc == 2) {
17
22
/* PRFM - prefetch */
18
#define DO_FP3(NAME, name) \
23
- if (is_unpriv) {
19
-static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
24
+ if (idx != 0) {
20
-{ \
25
unallocated_encoding(s);
21
- static gen_helper_gvec_3_ptr * const fns[4] = { \
26
return;
22
+ static gen_helper_gvec_3_ptr * const name##_fns[4] = { \
27
}
23
NULL, gen_helper_gvec_##name##_h, \
24
gen_helper_gvec_##name##_s, gen_helper_gvec_##name##_d \
25
}; \
26
- return gen_gvec_fpst_arg_zzz(s, fns[a->esz], a, 0); \
27
-}
28
+ TRANS_FEAT(NAME, aa64_sve, gen_gvec_fpst_arg_zzz, name##_fns[a->esz], a, 0)
29
30
DO_FP3(FADD_zzz, fadd)
31
DO_FP3(FSUB_zzz, fsub)
28
--
32
--
29
2.20.1
33
2.25.1
30
31
diff view generated by jsdifflib
1
The "system instructions" and "system register move" subcategories
1
From: Richard Henderson <richard.henderson@linaro.org>
2
of "branches, exception generating and system instructions" for A64
3
only apply if bits [23:22] are zero; other values are currently
4
unallocated. Correctly UNDEF these unallocated encodings.
5
2
6
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-88-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
9
Message-id: 20190125182626.9221-2-peter.maydell@linaro.org
10
---
7
---
11
target/arm/translate-a64.c | 6 +++++-
8
target/arm/translate-sve.c | 26 +++++++-------------------
12
1 file changed, 5 insertions(+), 1 deletion(-)
9
1 file changed, 7 insertions(+), 19 deletions(-)
13
10
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-a64.c
13
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-a64.c
14
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static void disas_b_exc_sys(DisasContext *s, uint32_t insn)
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FMLS_zzxz, aa64_sve, do_FMLA_zzxz, a, true)
19
break;
16
*** SVE Floating Point Multiply Indexed Group
20
case 0x6a: /* Exception generation / System */
17
*/
21
if (insn & (1 << 24)) {
18
22
- disas_system(s, insn);
19
-static bool trans_FMUL_zzx(DisasContext *s, arg_FMUL_zzx *a)
23
+ if (extract32(insn, 22, 2) == 0) {
20
-{
24
+ disas_system(s, insn);
21
- static gen_helper_gvec_3_ptr * const fns[3] = {
25
+ } else {
22
- gen_helper_gvec_fmul_idx_h,
26
+ unallocated_encoding(s);
23
- gen_helper_gvec_fmul_idx_s,
27
+ }
24
- gen_helper_gvec_fmul_idx_d,
28
} else {
25
- };
29
disas_exc(s, insn);
26
-
30
}
27
- if (sve_access_check(s)) {
28
- unsigned vsz = vec_full_reg_size(s);
29
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
30
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
31
- vec_full_reg_offset(s, a->rn),
32
- vec_full_reg_offset(s, a->rm),
33
- status, vsz, vsz, a->index, fns[a->esz - 1]);
34
- tcg_temp_free_ptr(status);
35
- }
36
- return true;
37
-}
38
+static gen_helper_gvec_3_ptr * const fmul_idx_fns[4] = {
39
+ NULL, gen_helper_gvec_fmul_idx_h,
40
+ gen_helper_gvec_fmul_idx_s, gen_helper_gvec_fmul_idx_d,
41
+};
42
+TRANS_FEAT(FMUL_zzx, aa64_sve, gen_gvec_fpst_zzz,
43
+ fmul_idx_fns[a->esz], a->rd, a->rn, a->rm, a->index,
44
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
45
46
/*
47
*** SVE Floating Point Fast Reduction Group
31
--
48
--
32
2.20.1
49
2.25.1
33
34
diff view generated by jsdifflib
1
The SSE-200 has four banks of SRAM, each with its own
1
From: Richard Henderson <richard.henderson@linaro.org>
2
Memory Protection Controller, where the IoTKit has only one.
3
Make the number of SRAM banks a field in ARMSSEInfo.
4
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-89-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
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
Message-id: 20190121185118.18550-10-peter.maydell@linaro.org
8
---
7
---
9
include/hw/arm/armsse.h | 9 +++--
8
target/arm/translate-sve.c | 29 +++++++----------------------
10
hw/arm/armsse.c | 78 ++++++++++++++++++++++++++---------------
9
1 file changed, 7 insertions(+), 22 deletions(-)
11
2 files changed, 56 insertions(+), 31 deletions(-)
12
10
13
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/arm/armsse.h
13
--- a/target/arm/translate-sve.c
16
+++ b/include/hw/arm/armsse.h
14
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@ DO_PPZ(FCMNE_ppz0, fcmne0)
18
#define NUM_EXTERNAL_PPCS (IOTS_NUM_AHB_EXP_PPC + IOTS_NUM_APB_EXP_PPC)
16
*** SVE floating-point trig multiply-add coefficient
19
#define NUM_PPCS (NUM_EXTERNAL_PPCS + 2)
17
*/
20
18
21
+#define MAX_SRAM_BANKS 4
19
-static bool trans_FTMAD(DisasContext *s, arg_FTMAD *a)
22
+#if MAX_SRAM_BANKS > IOTS_NUM_MPC
20
-{
23
+#error Too many SRAM banks
21
- static gen_helper_gvec_3_ptr * const fns[3] = {
24
+#endif
22
- gen_helper_sve_ftmad_h,
25
+
23
- gen_helper_sve_ftmad_s,
26
typedef struct ARMSSE {
24
- gen_helper_sve_ftmad_d,
27
/*< private >*/
25
- };
28
SysBusDevice parent_obj;
26
-
29
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
27
- if (a->esz == 0) {
30
IoTKitSecCtl secctl;
28
- return false;
31
TZPPC apb_ppc0;
32
TZPPC apb_ppc1;
33
- TZMPC mpc;
34
+ TZMPC mpc[IOTS_NUM_MPC];
35
CMSDKAPBTIMER timer0;
36
CMSDKAPBTIMER timer1;
37
CMSDKAPBTIMER s32ktimer;
38
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
39
MemoryRegion alias1;
40
MemoryRegion alias2;
41
MemoryRegion alias3;
42
- MemoryRegion sram0;
43
+ MemoryRegion sram[MAX_SRAM_BANKS];
44
45
qemu_irq *exp_irqs;
46
qemu_irq ppc0_irq;
47
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/hw/arm/armsse.c
50
+++ b/hw/arm/armsse.c
51
@@ -XXX,XX +XXX,XX @@
52
53
struct ARMSSEInfo {
54
const char *name;
55
+ int sram_banks;
56
};
57
58
static const ARMSSEInfo armsse_variants[] = {
59
{
60
.name = TYPE_IOTKIT,
61
+ .sram_banks = 1,
62
},
63
};
64
65
@@ -XXX,XX +XXX,XX @@ static void armsse_forward_sec_resp_cfg(ARMSSE *s)
66
static void armsse_init(Object *obj)
67
{
68
ARMSSE *s = ARMSSE(obj);
69
+ ARMSSEClass *asc = ARMSSE_GET_CLASS(obj);
70
+ const ARMSSEInfo *info = asc->info;
71
int i;
72
73
+ assert(info->sram_banks <= MAX_SRAM_BANKS);
74
+
75
memory_region_init(&s->container, obj, "armsse-container", UINT64_MAX);
76
77
sysbus_init_child_obj(obj, "armv7m", &s->armv7m, sizeof(s->armv7m),
78
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
79
TYPE_TZ_PPC);
80
sysbus_init_child_obj(obj, "apb-ppc1", &s->apb_ppc1, sizeof(s->apb_ppc1),
81
TYPE_TZ_PPC);
82
- sysbus_init_child_obj(obj, "mpc", &s->mpc, sizeof(s->mpc), TYPE_TZ_MPC);
83
+ for (i = 0; i < info->sram_banks; i++) {
84
+ char *name = g_strdup_printf("mpc%d", i);
85
+ sysbus_init_child_obj(obj, name, &s->mpc[i],
86
+ sizeof(s->mpc[i]), TYPE_TZ_MPC);
87
+ g_free(name);
88
+ }
89
object_initialize_child(obj, "mpc-irq-orgate", &s->mpc_irq_orgate,
90
sizeof(s->mpc_irq_orgate), TYPE_OR_IRQ,
91
&error_abort, NULL);
92
93
- for (i = 0; i < IOTS_NUM_EXP_MPC + 1; i++) {
94
+ for (i = 0; i < IOTS_NUM_EXP_MPC + info->sram_banks; i++) {
95
char *name = g_strdup_printf("mpc-irq-splitter-%d", i);
96
SplitIRQ *splitter = &s->mpc_irq_splitter[i];
97
98
@@ -XXX,XX +XXX,XX @@ static void armsse_mpcexp_status(void *opaque, int n, int level)
99
static void armsse_realize(DeviceState *dev, Error **errp)
100
{
101
ARMSSE *s = ARMSSE(dev);
102
+ ARMSSEClass *asc = ARMSSE_GET_CLASS(dev);
103
+ const ARMSSEInfo *info = asc->info;
104
int i;
105
MemoryRegion *mr;
106
Error *err = NULL;
107
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
108
qdev_connect_gpio_out_named(dev_secctl, "sec_resp_cfg", 0,
109
qdev_get_gpio_in(dev_splitter, 0));
110
111
- /* This RAM lives behind the Memory Protection Controller */
112
- memory_region_init_ram(&s->sram0, NULL, "armsse.sram0", 0x00008000, &err);
113
- if (err) {
114
- error_propagate(errp, err);
115
- return;
116
+ /* Each SRAM bank lives behind its own Memory Protection Controller */
117
+ for (i = 0; i < info->sram_banks; i++) {
118
+ char *ramname = g_strdup_printf("armsse.sram%d", i);
119
+ SysBusDevice *sbd_mpc;
120
+
121
+ memory_region_init_ram(&s->sram[i], NULL, ramname, 0x00008000, &err);
122
+ g_free(ramname);
123
+ if (err) {
124
+ error_propagate(errp, err);
125
+ return;
126
+ }
127
+ object_property_set_link(OBJECT(&s->mpc[i]), OBJECT(&s->sram[i]),
128
+ "downstream", &err);
129
+ if (err) {
130
+ error_propagate(errp, err);
131
+ return;
132
+ }
133
+ object_property_set_bool(OBJECT(&s->mpc[i]), true, "realized", &err);
134
+ if (err) {
135
+ error_propagate(errp, err);
136
+ return;
137
+ }
138
+ /* Map the upstream end of the MPC into the right place... */
139
+ sbd_mpc = SYS_BUS_DEVICE(&s->mpc[i]);
140
+ memory_region_add_subregion(&s->container, 0x20000000 + i * 0x8000,
141
+ sysbus_mmio_get_region(sbd_mpc, 1));
142
+ /* ...and its register interface */
143
+ memory_region_add_subregion(&s->container, 0x50083000 + i * 0x1000,
144
+ sysbus_mmio_get_region(sbd_mpc, 0));
145
}
146
- object_property_set_link(OBJECT(&s->mpc), OBJECT(&s->sram0),
147
- "downstream", &err);
148
- if (err) {
149
- error_propagate(errp, err);
150
- return;
151
- }
29
- }
152
- object_property_set_bool(OBJECT(&s->mpc), true, "realized", &err);
30
- if (sve_access_check(s)) {
153
- if (err) {
31
- unsigned vsz = vec_full_reg_size(s);
154
- error_propagate(errp, err);
32
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
155
- return;
33
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
34
- vec_full_reg_offset(s, a->rn),
35
- vec_full_reg_offset(s, a->rm),
36
- status, vsz, vsz, a->imm, fns[a->esz - 1]);
37
- tcg_temp_free_ptr(status);
156
- }
38
- }
157
- /* Map the upstream end of the MPC into the right place... */
39
- return true;
158
- memory_region_add_subregion(&s->container, 0x20000000,
40
-}
159
- sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->mpc),
41
+static gen_helper_gvec_3_ptr * const ftmad_fns[4] = {
160
- 1));
42
+ NULL, gen_helper_sve_ftmad_h,
161
- /* ...and its register interface */
43
+ gen_helper_sve_ftmad_s, gen_helper_sve_ftmad_d,
162
- memory_region_add_subregion(&s->container, 0x50083000,
44
+};
163
- sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->mpc),
45
+TRANS_FEAT(FTMAD, aa64_sve, gen_gvec_fpst_zzz,
164
- 0));
46
+ ftmad_fns[a->esz], a->rd, a->rn, a->rm, a->imm,
165
47
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
166
/* We must OR together lines from the MPC splitters to go to the NVIC */
48
167
object_property_set_int(OBJECT(&s->mpc_irq_orgate),
49
/*
168
- IOTS_NUM_EXP_MPC + 1, "num-lines", &err);
50
*** SVE Floating Point Accumulating Reduction Group
169
+ IOTS_NUM_EXP_MPC + info->sram_banks,
170
+ "num-lines", &err);
171
if (err) {
172
error_propagate(errp, err);
173
return;
174
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
175
}
176
177
/* Wire up the splitters for the MPC IRQs */
178
- for (i = 0; i < IOTS_NUM_EXP_MPC + 1; i++) {
179
+ for (i = 0; i < IOTS_NUM_EXP_MPC + info->sram_banks; i++) {
180
SplitIRQ *splitter = &s->mpc_irq_splitter[i];
181
DeviceState *dev_splitter = DEVICE(splitter);
182
183
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
184
"mpcexp_status", i));
185
} else {
186
/* Splitter input is from our own MPC */
187
- qdev_connect_gpio_out_named(DEVICE(&s->mpc), "irq", 0,
188
+ qdev_connect_gpio_out_named(DEVICE(&s->mpc[i - IOTS_NUM_EXP_MPC]),
189
+ "irq", 0,
190
qdev_get_gpio_in(dev_splitter, 0));
191
qdev_connect_gpio_out(dev_splitter, 0,
192
qdev_get_gpio_in_named(dev_secctl,
193
--
51
--
194
2.20.1
52
2.25.1
195
196
diff view generated by jsdifflib
1
In the AdvSIMD load/store multiple structures encodings,
1
From: Richard Henderson <richard.henderson@linaro.org>
2
the non-post-indexed case should have zeroes in [20:16]
3
(which is the Rm field for the post-indexed case).
4
Correctly UNDEF the currently unallocated encodings which
5
have non-zeroes in those bits.
6
2
7
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-90-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Message-id: 20190125182626.9221-4-peter.maydell@linaro.org
11
---
7
---
12
target/arm/translate-a64.c | 7 ++++++-
8
target/arm/translate-sve.c | 30 +++++++++++++++++-------------
13
1 file changed, 6 insertions(+), 1 deletion(-)
9
1 file changed, 17 insertions(+), 13 deletions(-)
14
10
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
13
--- a/target/arm/translate-sve.c
18
+++ b/target/arm/translate-a64.c
14
+++ b/target/arm/translate-sve.c
19
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn)
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FMUL_zzx, aa64_sve, gen_gvec_fpst_zzz,
16
typedef void gen_helper_fp_reduce(TCGv_i64, TCGv_ptr, TCGv_ptr,
17
TCGv_ptr, TCGv_i32);
18
19
-static void do_reduce(DisasContext *s, arg_rpr_esz *a,
20
+static bool do_reduce(DisasContext *s, arg_rpr_esz *a,
21
gen_helper_fp_reduce *fn)
20
{
22
{
21
int rt = extract32(insn, 0, 5);
23
- unsigned vsz = vec_full_reg_size(s);
22
int rn = extract32(insn, 5, 5);
24
- unsigned p2vsz = pow2ceil(vsz);
23
+ int rm = extract32(insn, 16, 5);
25
- TCGv_i32 t_desc = tcg_constant_i32(simd_desc(vsz, vsz, p2vsz));
24
int size = extract32(insn, 10, 2);
26
+ unsigned vsz, p2vsz;
25
int opcode = extract32(insn, 12, 4);
27
+ TCGv_i32 t_desc;
26
bool is_store = !extract32(insn, 22, 1);
28
TCGv_ptr t_zn, t_pg, status;
27
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn)
29
TCGv_i64 temp;
28
return;
30
29
}
31
+ if (fn == NULL) {
30
32
+ return false;
31
+ if (!is_postidx && rm != 0) {
33
+ }
32
+ unallocated_encoding(s);
34
+ if (!sve_access_check(s)) {
33
+ return;
35
+ return true;
34
+ }
36
+ }
35
+
37
+
36
/* From the shared decode logic */
38
+ vsz = vec_full_reg_size(s);
37
switch (opcode) {
39
+ p2vsz = pow2ceil(vsz);
38
case 0x0:
40
+ t_desc = tcg_constant_i32(simd_desc(vsz, vsz, p2vsz));
39
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn)
41
temp = tcg_temp_new_i64();
40
}
42
t_zn = tcg_temp_new_ptr();
41
43
t_pg = tcg_temp_new_ptr();
42
if (is_postidx) {
44
@@ -XXX,XX +XXX,XX @@ static void do_reduce(DisasContext *s, arg_rpr_esz *a,
43
- int rm = extract32(insn, 16, 5);
45
44
if (rm == 31) {
46
write_fp_dreg(s, a->rd, temp);
45
tcg_gen_mov_i64(tcg_rn, tcg_addr);
47
tcg_temp_free_i64(temp);
46
} else {
48
+ return true;
49
}
50
51
#define DO_VPZ(NAME, name) \
52
static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
53
{ \
54
- static gen_helper_fp_reduce * const fns[3] = { \
55
- gen_helper_sve_##name##_h, \
56
+ static gen_helper_fp_reduce * const fns[4] = { \
57
+ NULL, gen_helper_sve_##name##_h, \
58
gen_helper_sve_##name##_s, \
59
gen_helper_sve_##name##_d, \
60
}; \
61
- if (a->esz == 0) { \
62
- return false; \
63
- } \
64
- if (sve_access_check(s)) { \
65
- do_reduce(s, a, fns[a->esz - 1]); \
66
- } \
67
- return true; \
68
+ return do_reduce(s, a, fns[a->esz]); \
69
}
70
71
DO_VPZ(FADDV, faddv)
47
--
72
--
48
2.20.1
73
2.25.1
49
50
diff view generated by jsdifflib
1
The SSE-200 has 4 banks of SRAM, each with its own internal
1
From: Richard Henderson <richard.henderson@linaro.org>
2
Memory Protection Controller. The interrupt status for these
3
extra MPCs appears in the same security controller SECMPCINTSTATUS
4
register as the MPC for the IoTKit's single SRAM bank. Enhance the
5
iotkit-secctl device to allow 4 MPCs. (If the particular IoTKit/SSE
6
variant in use does not have all 4 MPCs then the unused inputs will
7
simply result in the SECMPCINTSTATUS bits being zero as required.)
8
2
9
The hardcoded constant "1"s in armsse.c indicate the actual number
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
of SRAM MPCs the IoTKit has, and will be replaced in the following
4
Message-id: 20220527181907.189259-91-richard.henderson@linaro.org
11
commit.
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 14 ++++++--------
9
1 file changed, 6 insertions(+), 8 deletions(-)
12
10
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20190121185118.18550-9-peter.maydell@linaro.org
16
---
17
include/hw/misc/iotkit-secctl.h | 6 +++---
18
hw/arm/armsse.c | 6 +++---
19
hw/misc/iotkit-secctl.c | 5 +++--
20
3 files changed, 9 insertions(+), 8 deletions(-)
21
22
diff --git a/include/hw/misc/iotkit-secctl.h b/include/hw/misc/iotkit-secctl.h
23
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/misc/iotkit-secctl.h
13
--- a/target/arm/translate-sve.c
25
+++ b/include/hw/misc/iotkit-secctl.h
14
+++ b/target/arm/translate-sve.c
26
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@ static bool do_reduce(DisasContext *s, arg_rpr_esz *a,
27
* + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_enable
28
* + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_clear
29
* + named GPIO inputs ahb_ppcexp{0,1,2,3}_irq_status
30
- * Controlling the MPC in the IoTKit:
31
- * + named GPIO input mpc_status
32
+ * Controlling the (up to) 4 MPCs in the IoTKit/SSE:
33
+ * + named GPIO inputs mpc_status[0..3]
34
* Controlling each of the 16 expansion MPCs which a system using the IoTKit
35
* might provide:
36
* + named GPIO inputs mpcexp_status[0..15]
37
@@ -XXX,XX +XXX,XX @@
38
#define IOTS_NUM_APB_EXP_PPC 4
39
#define IOTS_NUM_AHB_EXP_PPC 4
40
#define IOTS_NUM_EXP_MPC 16
41
-#define IOTS_NUM_MPC 1
42
+#define IOTS_NUM_MPC 4
43
#define IOTS_NUM_EXP_MSC 16
44
45
typedef struct IoTKitSecCtl IoTKitSecCtl;
46
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/armsse.c
49
+++ b/hw/arm/armsse.c
50
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
51
sizeof(s->mpc_irq_orgate), TYPE_OR_IRQ,
52
&error_abort, NULL);
53
54
- for (i = 0; i < ARRAY_SIZE(s->mpc_irq_splitter); i++) {
55
+ for (i = 0; i < IOTS_NUM_EXP_MPC + 1; i++) {
56
char *name = g_strdup_printf("mpc-irq-splitter-%d", i);
57
SplitIRQ *splitter = &s->mpc_irq_splitter[i];
58
59
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
60
61
/* We must OR together lines from the MPC splitters to go to the NVIC */
62
object_property_set_int(OBJECT(&s->mpc_irq_orgate),
63
- IOTS_NUM_EXP_MPC + IOTS_NUM_MPC, "num-lines", &err);
64
+ IOTS_NUM_EXP_MPC + 1, "num-lines", &err);
65
if (err) {
66
error_propagate(errp, err);
67
return;
68
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
69
}
70
71
/* Wire up the splitters for the MPC IRQs */
72
- for (i = 0; i < IOTS_NUM_EXP_MPC + IOTS_NUM_MPC; i++) {
73
+ for (i = 0; i < IOTS_NUM_EXP_MPC + 1; i++) {
74
SplitIRQ *splitter = &s->mpc_irq_splitter[i];
75
DeviceState *dev_splitter = DEVICE(splitter);
76
77
diff --git a/hw/misc/iotkit-secctl.c b/hw/misc/iotkit-secctl.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/hw/misc/iotkit-secctl.c
80
+++ b/hw/misc/iotkit-secctl.c
81
@@ -XXX,XX +XXX,XX @@ static void iotkit_secctl_mpc_status(void *opaque, int n, int level)
82
{
83
IoTKitSecCtl *s = IOTKIT_SECCTL(opaque);
84
85
- s->mpcintstatus = deposit32(s->mpcintstatus, 0, 1, !!level);
86
+ s->mpcintstatus = deposit32(s->mpcintstatus, n, 1, !!level);
87
}
16
}
88
17
89
static void iotkit_secctl_mpcexp_status(void *opaque, int n, int level)
18
#define DO_VPZ(NAME, name) \
90
@@ -XXX,XX +XXX,XX @@ static void iotkit_secctl_init(Object *obj)
19
-static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
91
qdev_init_gpio_out_named(dev, &s->sec_resp_cfg, "sec_resp_cfg", 1);
20
-{ \
92
qdev_init_gpio_out_named(dev, &s->nsc_cfg_irq, "nsc_cfg", 1);
21
- static gen_helper_fp_reduce * const fns[4] = { \
93
22
- NULL, gen_helper_sve_##name##_h, \
94
- qdev_init_gpio_in_named(dev, iotkit_secctl_mpc_status, "mpc_status", 1);
23
- gen_helper_sve_##name##_s, \
95
+ qdev_init_gpio_in_named(dev, iotkit_secctl_mpc_status, "mpc_status",
24
- gen_helper_sve_##name##_d, \
96
+ IOTS_NUM_MPC);
25
+ static gen_helper_fp_reduce * const name##_fns[4] = { \
97
qdev_init_gpio_in_named(dev, iotkit_secctl_mpcexp_status,
26
+ NULL, gen_helper_sve_##name##_h, \
98
"mpcexp_status", IOTS_NUM_EXP_MPC);
27
+ gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
99
28
}; \
29
- return do_reduce(s, a, fns[a->esz]); \
30
-}
31
+ TRANS_FEAT(NAME, aa64_sve, do_reduce, a, name##_fns[a->esz])
32
33
DO_VPZ(FADDV, faddv)
34
DO_VPZ(FMINNMV, fminnmv)
35
@@ -XXX,XX +XXX,XX @@ DO_VPZ(FMAXNMV, fmaxnmv)
36
DO_VPZ(FMINV, fminv)
37
DO_VPZ(FMAXV, fmaxv)
38
39
+#undef DO_VPZ
40
+
41
/*
42
*** SVE Floating Point Unary Operations - Unpredicated Group
43
*/
100
--
44
--
101
2.20.1
45
2.25.1
102
103
diff view generated by jsdifflib
1
The SSE-200 has a CPU_IDENTITY register block, which is a set of
1
From: Richard Henderson <richard.henderson@linaro.org>
2
read-only registers. As well as the usual PID/CID registers, there
3
is a single CPUID register which indicates whether the CPU is CPU 0
4
or CPU 1. Implement a model of this register block.
5
2
3
Rename do_zz_fp to gen_gvec_fpst_arg_zz, and move up.
4
Split out gen_gvec_fpst_zz as a helper while we're at it.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-92-richard.henderson@linaro.org
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: 20190121185118.18550-20-peter.maydell@linaro.org
9
---
10
---
10
hw/misc/Makefile.objs | 1 +
11
target/arm/translate-sve.c | 77 ++++++++++++++++++--------------------
11
include/hw/misc/armsse-cpuid.h | 41 ++++++++++
12
1 file changed, 36 insertions(+), 41 deletions(-)
12
hw/misc/armsse-cpuid.c | 134 ++++++++++++++++++++++++++++++++
13
MAINTAINERS | 2 +
14
default-configs/arm-softmmu.mak | 1 +
15
hw/misc/trace-events | 4 +
16
6 files changed, 183 insertions(+)
17
create mode 100644 include/hw/misc/armsse-cpuid.h
18
create mode 100644 hw/misc/armsse-cpuid.c
19
13
20
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/misc/Makefile.objs
16
--- a/target/arm/translate-sve.c
23
+++ b/hw/misc/Makefile.objs
17
+++ b/target/arm/translate-sve.c
24
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_TZ_PPC) += tz-ppc.o
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
25
obj-$(CONFIG_IOTKIT_SECCTL) += iotkit-secctl.o
19
return true;
26
obj-$(CONFIG_IOTKIT_SYSCTL) += iotkit-sysctl.o
20
}
27
obj-$(CONFIG_IOTKIT_SYSINFO) += iotkit-sysinfo.o
21
28
+obj-$(CONFIG_ARMSSE_CPUID) += armsse-cpuid.o
22
+static bool gen_gvec_fpst_zz(DisasContext *s, gen_helper_gvec_2_ptr *fn,
29
23
+ int rd, int rn, int data,
30
obj-$(CONFIG_PVPANIC) += pvpanic.o
24
+ ARMFPStatusFlavour flavour)
31
obj-$(CONFIG_AUX) += auxbus.o
25
+{
32
diff --git a/include/hw/misc/armsse-cpuid.h b/include/hw/misc/armsse-cpuid.h
26
+ if (fn == NULL) {
33
new file mode 100644
27
+ return false;
34
index XXXXXXX..XXXXXXX
28
+ }
35
--- /dev/null
29
+ if (sve_access_check(s)) {
36
+++ b/include/hw/misc/armsse-cpuid.h
30
+ unsigned vsz = vec_full_reg_size(s);
37
@@ -XXX,XX +XXX,XX @@
31
+ TCGv_ptr status = fpstatus_ptr(flavour);
38
+/*
39
+ * ARM SSE-200 CPU_IDENTITY register block
40
+ *
41
+ * Copyright (c) 2019 Linaro Limited
42
+ * Written by Peter Maydell
43
+ *
44
+ * This program is free software; you can redistribute it and/or modify
45
+ * it under the terms of the GNU General Public License version 2 or
46
+ * (at your option) any later version.
47
+ */
48
+
32
+
49
+/*
33
+ tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, rd),
50
+ * This is a model of the "CPU_IDENTITY" register block which is part of the
34
+ vec_full_reg_offset(s, rn),
51
+ * Arm SSE-200 and documented in
35
+ status, vsz, vsz, data, fn);
52
+ * http://infocenter.arm.com/help/topic/com.arm.doc.101104_0100_00_en/corelink_sse200_subsystem_for_embedded_technical_reference_manual_101104_0100_00_en.pdf
36
+ tcg_temp_free_ptr(status);
53
+ *
54
+ * QEMU interface:
55
+ * + QOM property "CPUID": the value to use for the CPUID register
56
+ * + sysbus MMIO region 0: the system information register bank
57
+ */
58
+
59
+#ifndef HW_MISC_ARMSSE_CPUID_H
60
+#define HW_MISC_ARMSSE_CPUID_H
61
+
62
+#include "hw/sysbus.h"
63
+
64
+#define TYPE_ARMSSE_CPUID "armsse-cpuid"
65
+#define ARMSSE_CPUID(obj) OBJECT_CHECK(ARMSSECPUID, (obj), TYPE_ARMSSE_CPUID)
66
+
67
+typedef struct ARMSSECPUID {
68
+ /*< private >*/
69
+ SysBusDevice parent_obj;
70
+
71
+ /*< public >*/
72
+ MemoryRegion iomem;
73
+
74
+ /* Properties */
75
+ uint32_t cpuid;
76
+} ARMSSECPUID;
77
+
78
+#endif
79
diff --git a/hw/misc/armsse-cpuid.c b/hw/misc/armsse-cpuid.c
80
new file mode 100644
81
index XXXXXXX..XXXXXXX
82
--- /dev/null
83
+++ b/hw/misc/armsse-cpuid.c
84
@@ -XXX,XX +XXX,XX @@
85
+/*
86
+ * ARM SSE-200 CPU_IDENTITY register block
87
+ *
88
+ * Copyright (c) 2019 Linaro Limited
89
+ * Written by Peter Maydell
90
+ *
91
+ * This program is free software; you can redistribute it and/or modify
92
+ * it under the terms of the GNU General Public License version 2 or
93
+ * (at your option) any later version.
94
+ */
95
+
96
+/*
97
+ * This is a model of the "CPU_IDENTITY" register block which is part of the
98
+ * Arm SSE-200 and documented in
99
+ * http://infocenter.arm.com/help/topic/com.arm.doc.101104_0100_00_en/corelink_sse200_subsystem_for_embedded_technical_reference_manual_101104_0100_00_en.pdf
100
+ *
101
+ * It consists of one read-only CPUID register (set by QOM property), plus the
102
+ * usual ID registers.
103
+ */
104
+
105
+#include "qemu/osdep.h"
106
+#include "qemu/log.h"
107
+#include "trace.h"
108
+#include "qapi/error.h"
109
+#include "sysemu/sysemu.h"
110
+#include "hw/sysbus.h"
111
+#include "hw/registerfields.h"
112
+#include "hw/misc/armsse-cpuid.h"
113
+
114
+REG32(CPUID, 0x0)
115
+REG32(PID4, 0xfd0)
116
+REG32(PID5, 0xfd4)
117
+REG32(PID6, 0xfd8)
118
+REG32(PID7, 0xfdc)
119
+REG32(PID0, 0xfe0)
120
+REG32(PID1, 0xfe4)
121
+REG32(PID2, 0xfe8)
122
+REG32(PID3, 0xfec)
123
+REG32(CID0, 0xff0)
124
+REG32(CID1, 0xff4)
125
+REG32(CID2, 0xff8)
126
+REG32(CID3, 0xffc)
127
+
128
+/* PID/CID values */
129
+static const int sysinfo_id[] = {
130
+ 0x04, 0x00, 0x00, 0x00, /* PID4..PID7 */
131
+ 0x58, 0xb8, 0x0b, 0x00, /* PID0..PID3 */
132
+ 0x0d, 0xf0, 0x05, 0xb1, /* CID0..CID3 */
133
+};
134
+
135
+static uint64_t armsse_cpuid_read(void *opaque, hwaddr offset,
136
+ unsigned size)
137
+{
138
+ ARMSSECPUID *s = ARMSSE_CPUID(opaque);
139
+ uint64_t r;
140
+
141
+ switch (offset) {
142
+ case A_CPUID:
143
+ r = s->cpuid;
144
+ break;
145
+ case A_PID4 ... A_CID3:
146
+ r = sysinfo_id[(offset - A_PID4) / 4];
147
+ break;
148
+ default:
149
+ qemu_log_mask(LOG_GUEST_ERROR,
150
+ "SSE CPU_IDENTITY read: bad offset 0x%x\n", (int)offset);
151
+ r = 0;
152
+ break;
153
+ }
37
+ }
154
+ trace_armsse_cpuid_read(offset, r, size);
38
+ return true;
155
+ return r;
156
+}
39
+}
157
+
40
+
158
+static void armsse_cpuid_write(void *opaque, hwaddr offset,
41
+static bool gen_gvec_fpst_arg_zz(DisasContext *s, gen_helper_gvec_2_ptr *fn,
159
+ uint64_t value, unsigned size)
42
+ arg_rr_esz *a, int data)
160
+{
43
+{
161
+ trace_armsse_cpuid_write(offset, value, size);
44
+ return gen_gvec_fpst_zz(s, fn, a->rd, a->rn, data,
162
+
45
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
163
+ qemu_log_mask(LOG_GUEST_ERROR,
164
+ "SSE CPU_IDENTITY: write to RO offset 0x%x\n", (int)offset);
165
+}
46
+}
166
+
47
+
167
+static const MemoryRegionOps armsse_cpuid_ops = {
48
/* Invoke an out-of-line helper on 3 Zregs. */
168
+ .read = armsse_cpuid_read,
49
static bool gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
169
+ .write = armsse_cpuid_write,
50
int rd, int rn, int rm, int data)
170
+ .endianness = DEVICE_LITTLE_ENDIAN,
51
@@ -XXX,XX +XXX,XX @@ DO_VPZ(FMAXV, fmaxv)
171
+ /* byte/halfword accesses are just zero-padded on reads and writes */
52
*** SVE Floating Point Unary Operations - Unpredicated Group
172
+ .impl.min_access_size = 4,
53
*/
173
+ .impl.max_access_size = 4,
54
174
+ .valid.min_access_size = 1,
55
-static void do_zz_fp(DisasContext *s, arg_rr_esz *a, gen_helper_gvec_2_ptr *fn)
175
+ .valid.max_access_size = 4,
56
-{
57
- unsigned vsz = vec_full_reg_size(s);
58
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
59
+static gen_helper_gvec_2_ptr * const frecpe_fns[] = {
60
+ NULL, gen_helper_gvec_frecpe_h,
61
+ gen_helper_gvec_frecpe_s, gen_helper_gvec_frecpe_d,
176
+};
62
+};
177
+
63
+TRANS_FEAT(FRECPE, aa64_sve, gen_gvec_fpst_arg_zz, frecpe_fns[a->esz], a, 0)
178
+static Property armsse_cpuid_props[] = {
64
179
+ DEFINE_PROP_UINT32("CPUID", ARMSSECPUID, cpuid, 0),
65
- tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, a->rd),
180
+ DEFINE_PROP_END_OF_LIST()
66
- vec_full_reg_offset(s, a->rn),
67
- status, vsz, vsz, 0, fn);
68
- tcg_temp_free_ptr(status);
69
-}
70
-
71
-static bool trans_FRECPE(DisasContext *s, arg_rr_esz *a)
72
-{
73
- static gen_helper_gvec_2_ptr * const fns[3] = {
74
- gen_helper_gvec_frecpe_h,
75
- gen_helper_gvec_frecpe_s,
76
- gen_helper_gvec_frecpe_d,
77
- };
78
- if (a->esz == 0) {
79
- return false;
80
- }
81
- if (sve_access_check(s)) {
82
- do_zz_fp(s, a, fns[a->esz - 1]);
83
- }
84
- return true;
85
-}
86
-
87
-static bool trans_FRSQRTE(DisasContext *s, arg_rr_esz *a)
88
-{
89
- static gen_helper_gvec_2_ptr * const fns[3] = {
90
- gen_helper_gvec_frsqrte_h,
91
- gen_helper_gvec_frsqrte_s,
92
- gen_helper_gvec_frsqrte_d,
93
- };
94
- if (a->esz == 0) {
95
- return false;
96
- }
97
- if (sve_access_check(s)) {
98
- do_zz_fp(s, a, fns[a->esz - 1]);
99
- }
100
- return true;
101
-}
102
+static gen_helper_gvec_2_ptr * const frsqrte_fns[] = {
103
+ NULL, gen_helper_gvec_frsqrte_h,
104
+ gen_helper_gvec_frsqrte_s, gen_helper_gvec_frsqrte_d,
181
+};
105
+};
182
+
106
+TRANS_FEAT(FRSQRTE, aa64_sve, gen_gvec_fpst_arg_zz, frsqrte_fns[a->esz], a, 0)
183
+static void armsse_cpuid_init(Object *obj)
107
184
+{
108
/*
185
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
109
*** SVE Floating Point Compare with Zero Group
186
+ ARMSSECPUID *s = ARMSSE_CPUID(obj);
187
+
188
+ memory_region_init_io(&s->iomem, obj, &armsse_cpuid_ops,
189
+ s, "armsse-cpuid", 0x1000);
190
+ sysbus_init_mmio(sbd, &s->iomem);
191
+}
192
+
193
+static void armsse_cpuid_class_init(ObjectClass *klass, void *data)
194
+{
195
+ DeviceClass *dc = DEVICE_CLASS(klass);
196
+
197
+ /*
198
+ * This device has no guest-modifiable state and so it
199
+ * does not need a reset function or VMState.
200
+ */
201
+
202
+ dc->props = armsse_cpuid_props;
203
+}
204
+
205
+static const TypeInfo armsse_cpuid_info = {
206
+ .name = TYPE_ARMSSE_CPUID,
207
+ .parent = TYPE_SYS_BUS_DEVICE,
208
+ .instance_size = sizeof(ARMSSECPUID),
209
+ .instance_init = armsse_cpuid_init,
210
+ .class_init = armsse_cpuid_class_init,
211
+};
212
+
213
+static void armsse_cpuid_register_types(void)
214
+{
215
+ type_register_static(&armsse_cpuid_info);
216
+}
217
+
218
+type_init(armsse_cpuid_register_types);
219
diff --git a/MAINTAINERS b/MAINTAINERS
220
index XXXXXXX..XXXXXXX 100644
221
--- a/MAINTAINERS
222
+++ b/MAINTAINERS
223
@@ -XXX,XX +XXX,XX @@ F: hw/misc/iotkit-sysctl.c
224
F: include/hw/misc/iotkit-sysctl.h
225
F: hw/misc/iotkit-sysinfo.c
226
F: include/hw/misc/iotkit-sysinfo.h
227
+F: hw/misc/armsse-cpuid.c
228
+F: include/hw/misc/armsse-cpuid.h
229
230
Musicpal
231
M: Jan Kiszka <jan.kiszka@web.de>
232
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
233
index XXXXXXX..XXXXXXX 100644
234
--- a/default-configs/arm-softmmu.mak
235
+++ b/default-configs/arm-softmmu.mak
236
@@ -XXX,XX +XXX,XX @@ CONFIG_ARMSSE=y
237
CONFIG_IOTKIT_SECCTL=y
238
CONFIG_IOTKIT_SYSCTL=y
239
CONFIG_IOTKIT_SYSINFO=y
240
+CONFIG_ARMSSE_CPUID=y
241
242
CONFIG_VERSATILE=y
243
CONFIG_VERSATILE_PCI=y
244
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
245
index XXXXXXX..XXXXXXX 100644
246
--- a/hw/misc/trace-events
247
+++ b/hw/misc/trace-events
248
@@ -XXX,XX +XXX,XX @@ iotkit_sysinfo_write(uint64_t offset, uint64_t data, unsigned size) "IoTKit SysI
249
iotkit_sysctl_read(uint64_t offset, uint64_t data, unsigned size) "IoTKit SysCtl read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
250
iotkit_sysctl_write(uint64_t offset, uint64_t data, unsigned size) "IoTKit SysCtl write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
251
iotkit_sysctl_reset(void) "IoTKit SysCtl: reset"
252
+
253
+# hw/misc/armsse-cpuid.c
254
+armsse_cpuid_read(uint64_t offset, uint64_t data, unsigned size) "SSE-200 CPU_IDENTITY read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
255
+armsse_cpuid_write(uint64_t offset, uint64_t data, unsigned size) "SSE-200 CPU_IDENTITY write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
256
--
110
--
257
2.20.1
111
2.25.1
258
259
diff view generated by jsdifflib
1
The Arm IoTKit was effectively the forerunner of a series of
1
From: Richard Henderson <richard.henderson@linaro.org>
2
subsystems for embedded SoCs, named the SSE-050, SSE-100 and SSE-200:
3
https://developer.arm.com/products/system-design/subsystems
4
These are generally quite similar, though later iterations have
5
extra devices that earlier ones do not.
6
2
7
We want to add a model of the SSE-200, which means refactoring the
3
Simplify indexing of this array. This will allow folding
8
IoTKit code into an abstract base class and subclasses (using the
4
of the illegal esz == 0 into the normal fn == NULL check.
9
same design that the bcm283x SoC and Aspeed SoC family
10
implementations do). As a first step, rename the IoTKit struct and
11
QOM macros to ARMSSE, which is what we're going to name the base
12
class. We temporarily retain TYPE_IOTKIT to avoid changing the
13
code that instantiates a TYPE_IOTKIT device here and then changing
14
it back again when it is re-introduced as a subclass.
15
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-93-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Message-id: 20190121185118.18550-5-peter.maydell@linaro.org
20
---
10
---
21
include/hw/arm/iotkit.h | 22 ++++++++++-----
11
target/arm/translate-sve.c | 15 ++++++++-------
22
hw/arm/iotkit.c | 59 +++++++++++++++++++++--------------------
12
1 file changed, 8 insertions(+), 7 deletions(-)
23
hw/arm/mps2-tz.c | 2 +-
24
3 files changed, 47 insertions(+), 36 deletions(-)
25
13
26
diff --git a/include/hw/arm/iotkit.h b/include/hw/arm/iotkit.h
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
27
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/arm/iotkit.h
16
--- a/target/arm/translate-sve.c
29
+++ b/include/hw/arm/iotkit.h
17
+++ b/target/arm/translate-sve.c
30
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ static bool trans_FCVTZU_dd(DisasContext *s, arg_rpr_esz *a)
31
/*
19
return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzu_dd);
32
- * ARM IoT Kit
33
+ * ARM SSE (Subsystems for Embedded): IoTKit
34
*
35
* Copyright (c) 2018 Linaro Limited
36
* Written by Peter Maydell
37
@@ -XXX,XX +XXX,XX @@
38
* (at your option) any later version.
39
*/
40
41
-/* This is a model of the Arm IoT Kit which is documented in
42
+/*
43
+ * This is a model of the Arm "Subsystems for Embedded" family of
44
+ * hardware, which include the IoT Kit and the SSE-050, SSE-100 and
45
+ * SSE-200. Currently we model only the Arm IoT Kit which is documented in
46
* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ecm0601256/index.html
47
* It contains:
48
* a Cortex-M33
49
@@ -XXX,XX +XXX,XX @@
50
#include "hw/or-irq.h"
51
#include "hw/core/split-irq.h"
52
53
-#define TYPE_IOTKIT "iotkit"
54
-#define IOTKIT(obj) OBJECT_CHECK(IoTKit, (obj), TYPE_IOTKIT)
55
+#define TYPE_ARMSSE "iotkit"
56
+#define ARMSSE(obj) OBJECT_CHECK(ARMSSE, (obj), TYPE_ARMSSE)
57
+
58
+/*
59
+ * For the moment TYPE_IOTKIT is a synonym for TYPE_ARMSSE (and the
60
+ * latter's underlying name is left as "iotkit"); in a later
61
+ * commit it will become a subclass of TYPE_ARMSSE.
62
+ */
63
+#define TYPE_IOTKIT TYPE_ARMSSE
64
65
/* We have an IRQ splitter and an OR gate input for each external PPC
66
* and the 2 internal PPCs
67
@@ -XXX,XX +XXX,XX @@
68
#define NUM_EXTERNAL_PPCS (IOTS_NUM_AHB_EXP_PPC + IOTS_NUM_APB_EXP_PPC)
69
#define NUM_PPCS (NUM_EXTERNAL_PPCS + 2)
70
71
-typedef struct IoTKit {
72
+typedef struct ARMSSE {
73
/*< private >*/
74
SysBusDevice parent_obj;
75
76
@@ -XXX,XX +XXX,XX @@ typedef struct IoTKit {
77
MemoryRegion *board_memory;
78
uint32_t exp_numirq;
79
uint32_t mainclk_frq;
80
-} IoTKit;
81
+} ARMSSE;
82
83
#endif
84
diff --git a/hw/arm/iotkit.c b/hw/arm/iotkit.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/hw/arm/iotkit.c
87
+++ b/hw/arm/iotkit.c
88
@@ -XXX,XX +XXX,XX @@
89
/*
90
- * Arm IoT Kit
91
+ * Arm SSE (Subsystems for Embedded): IoTKit
92
*
93
* Copyright (c) 2018 Linaro Limited
94
* Written by Peter Maydell
95
@@ -XXX,XX +XXX,XX @@
96
/* Create an alias region of @size bytes starting at @base
97
* which mirrors the memory starting at @orig.
98
*/
99
-static void make_alias(IoTKit *s, MemoryRegion *mr, const char *name,
100
+static void make_alias(ARMSSE *s, MemoryRegion *mr, const char *name,
101
hwaddr base, hwaddr size, hwaddr orig)
102
{
103
memory_region_init_alias(mr, NULL, name, &s->container, orig, size);
104
@@ -XXX,XX +XXX,XX @@ static void irq_status_forwarder(void *opaque, int n, int level)
105
106
static void nsccfg_handler(void *opaque, int n, int level)
107
{
108
- IoTKit *s = IOTKIT(opaque);
109
+ ARMSSE *s = ARMSSE(opaque);
110
111
s->nsccfg = level;
112
}
20
}
113
21
114
-static void iotkit_forward_ppc(IoTKit *s, const char *ppcname, int ppcnum)
22
-static gen_helper_gvec_3_ptr * const frint_fns[3] = {
115
+static void iotkit_forward_ppc(ARMSSE *s, const char *ppcname, int ppcnum)
23
+static gen_helper_gvec_3_ptr * const frint_fns[] = {
116
{
24
+ NULL,
117
/* Each of the 4 AHB and 4 APB PPCs that might be present in a
25
gen_helper_sve_frint_h,
118
- * system using the IoTKit has a collection of control lines which
26
gen_helper_sve_frint_s,
119
+ * system using the ARMSSE has a collection of control lines which
27
gen_helper_sve_frint_d
120
* are provided by the security controller and which we want to
28
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTI(DisasContext *s, arg_rpr_esz *a)
121
- * expose as control lines on the IoTKit device itself, so the
29
return false;
122
- * code using the IoTKit can wire them up to the PPCs.
30
}
123
+ * expose as control lines on the ARMSSE device itself, so the
31
return do_zpz_ptr(s, a->rd, a->rn, a->pg, a->esz == MO_16,
124
+ * code using the ARMSSE can wire them up to the PPCs.
32
- frint_fns[a->esz - 1]);
125
*/
33
+ frint_fns[a->esz]);
126
SplitIRQ *splitter = &s->ppc_irq_splitter[ppcnum];
127
DeviceState *iotkitdev = DEVICE(s);
128
@@ -XXX,XX +XXX,XX @@ static void iotkit_forward_ppc(IoTKit *s, const char *ppcname, int ppcnum)
129
g_free(name);
130
}
34
}
131
35
132
-static void iotkit_forward_sec_resp_cfg(IoTKit *s)
36
static bool trans_FRINTX(DisasContext *s, arg_rpr_esz *a)
133
+static void iotkit_forward_sec_resp_cfg(ARMSSE *s)
37
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTN(DisasContext *s, arg_rpr_esz *a)
134
{
38
if (a->esz == 0) {
135
/* Forward the 3rd output from the splitter device as a
39
return false;
136
* named GPIO output of the iotkit object.
40
}
137
@@ -XXX,XX +XXX,XX @@ static void iotkit_forward_sec_resp_cfg(IoTKit *s)
41
- return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz - 1]);
138
42
+ return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz]);
139
static void iotkit_init(Object *obj)
140
{
141
- IoTKit *s = IOTKIT(obj);
142
+ ARMSSE *s = ARMSSE(obj);
143
int i;
144
145
memory_region_init(&s->container, obj, "iotkit-container", UINT64_MAX);
146
@@ -XXX,XX +XXX,XX @@ static void iotkit_init(Object *obj)
147
148
static void iotkit_exp_irq(void *opaque, int n, int level)
149
{
150
- IoTKit *s = IOTKIT(opaque);
151
+ ARMSSE *s = ARMSSE(opaque);
152
153
qemu_set_irq(s->exp_irqs[n], level);
154
}
43
}
155
44
156
static void iotkit_mpcexp_status(void *opaque, int n, int level)
45
static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
157
{
46
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
158
- IoTKit *s = IOTKIT(opaque);
47
if (a->esz == 0) {
159
+ ARMSSE *s = ARMSSE(opaque);
48
return false;
160
qemu_set_irq(s->mpcexp_status_in[n], level);
49
}
50
- return do_frint_mode(s, a, float_round_up, frint_fns[a->esz - 1]);
51
+ return do_frint_mode(s, a, float_round_up, frint_fns[a->esz]);
161
}
52
}
162
53
163
static void iotkit_realize(DeviceState *dev, Error **errp)
54
static bool trans_FRINTM(DisasContext *s, arg_rpr_esz *a)
164
{
55
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTM(DisasContext *s, arg_rpr_esz *a)
165
- IoTKit *s = IOTKIT(dev);
56
if (a->esz == 0) {
166
+ ARMSSE *s = ARMSSE(dev);
57
return false;
167
int i;
168
MemoryRegion *mr;
169
Error *err = NULL;
170
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
171
* devices exist in both address spaces but with hard-wired security
172
* permissions that will cause the CPU to fault for non-secure accesses.
173
*
174
- * The IoTKit has an IDAU (Implementation Defined Access Unit),
175
+ * The ARMSSE has an IDAU (Implementation Defined Access Unit),
176
* which specifies hard-wired security permissions for different
177
- * areas of the physical address space. For the IoTKit IDAU, the
178
+ * areas of the physical address space. For the ARMSSE IDAU, the
179
* top 4 bits of the physical address are the IDAU region ID, and
180
* if bit 28 (ie the lowest bit of the ID) is 0 then this is an NS
181
* region, otherwise it is an S region.
182
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
183
* 0x20000000..0x2007ffff 32KB FPGA block RAM
184
* 0x30000000..0x3fffffff alias of 0x20000000..0x2fffffff
185
* 0x40000000..0x4000ffff base peripheral region 1
186
- * 0x40010000..0x4001ffff CPU peripherals (none for IoTKit)
187
+ * 0x40010000..0x4001ffff CPU peripherals (none for ARMSSE)
188
* 0x40020000..0x4002ffff system control element peripherals
189
* 0x40080000..0x400fffff base peripheral region 2
190
* 0x50000000..0x5fffffff alias of 0x40000000..0x4fffffff
191
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
192
qdev_connect_gpio_out_named(dev_secctl, "nsc_cfg", 0, s->nsc_cfg_in);
193
194
/* The sec_resp_cfg output from the security controller must be split into
195
- * multiple lines, one for each of the PPCs within the IoTKit and one
196
- * that will be an output from the IoTKit to the system.
197
+ * multiple lines, one for each of the PPCs within the ARMSSE and one
198
+ * that will be an output from the ARMSSE to the system.
199
*/
200
object_property_set_int(OBJECT(&s->sec_resp_splitter), 3,
201
"num-lines", &err);
202
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
203
204
/* 0x40010000 .. 0x4001ffff: private CPU region: unused in IoTKit */
205
206
- /* 0x40020000 .. 0x4002ffff : IoTKit system control peripheral region */
207
+ /* 0x40020000 .. 0x4002ffff : ARMSSE system control peripheral region */
208
/* Devices behind APB PPC1:
209
* 0x4002f000: S32K timer
210
*/
211
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
212
qdev_get_gpio_in(DEVICE(&s->nmi_orgate), 0));
213
sysbus_mmio_map(SYS_BUS_DEVICE(&s->s32kwatchdog), 0, 0x5002e000);
214
215
- /* 0x40080000 .. 0x4008ffff : IoTKit second Base peripheral region */
216
+ /* 0x40080000 .. 0x4008ffff : ARMSSE second Base peripheral region */
217
218
qdev_prop_set_uint32(DEVICE(&s->nswatchdog), "wdogclk-frq", s->mainclk_frq);
219
object_property_set_bool(OBJECT(&s->nswatchdog), true, "realized", &err);
220
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
221
* Expose our container region to the board model; this corresponds
222
* to the AHB Slave Expansion ports which allow bus master devices
223
* (eg DMA controllers) in the board model to make transactions into
224
- * devices in the IoTKit.
225
+ * devices in the ARMSSE.
226
*/
227
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->container);
228
229
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
230
static void iotkit_idau_check(IDAUInterface *ii, uint32_t address,
231
int *iregion, bool *exempt, bool *ns, bool *nsc)
232
{
233
- /* For IoTKit systems the IDAU responses are simple logical functions
234
+ /*
235
+ * For ARMSSE systems the IDAU responses are simple logical functions
236
* of the address bits. The NSC attribute is guest-adjustable via the
237
* NSCCFG register in the security controller.
238
*/
239
- IoTKit *s = IOTKIT(ii);
240
+ ARMSSE *s = ARMSSE(ii);
241
int region = extract32(address, 28, 4);
242
243
*ns = !(region & 1);
244
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription iotkit_vmstate = {
245
.version_id = 1,
246
.minimum_version_id = 1,
247
.fields = (VMStateField[]) {
248
- VMSTATE_UINT32(nsccfg, IoTKit),
249
+ VMSTATE_UINT32(nsccfg, ARMSSE),
250
VMSTATE_END_OF_LIST()
251
}
58
}
252
};
59
- return do_frint_mode(s, a, float_round_down, frint_fns[a->esz - 1]);
253
60
+ return do_frint_mode(s, a, float_round_down, frint_fns[a->esz]);
254
static Property iotkit_properties[] = {
255
- DEFINE_PROP_LINK("memory", IoTKit, board_memory, TYPE_MEMORY_REGION,
256
+ DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
257
MemoryRegion *),
258
- DEFINE_PROP_UINT32("EXP_NUMIRQ", IoTKit, exp_numirq, 64),
259
- DEFINE_PROP_UINT32("MAINCLK", IoTKit, mainclk_frq, 0),
260
+ DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
261
+ DEFINE_PROP_UINT32("MAINCLK", ARMSSE, mainclk_frq, 0),
262
DEFINE_PROP_END_OF_LIST()
263
};
264
265
static void iotkit_reset(DeviceState *dev)
266
{
267
- IoTKit *s = IOTKIT(dev);
268
+ ARMSSE *s = ARMSSE(dev);
269
270
s->nsccfg = 0;
271
}
61
}
272
@@ -XXX,XX +XXX,XX @@ static void iotkit_class_init(ObjectClass *klass, void *data)
62
63
static bool trans_FRINTZ(DisasContext *s, arg_rpr_esz *a)
64
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTZ(DisasContext *s, arg_rpr_esz *a)
65
if (a->esz == 0) {
66
return false;
67
}
68
- return do_frint_mode(s, a, float_round_to_zero, frint_fns[a->esz - 1]);
69
+ return do_frint_mode(s, a, float_round_to_zero, frint_fns[a->esz]);
273
}
70
}
274
71
275
static const TypeInfo iotkit_info = {
72
static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
276
- .name = TYPE_IOTKIT,
73
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
277
+ .name = TYPE_ARMSSE,
74
if (a->esz == 0) {
278
.parent = TYPE_SYS_BUS_DEVICE,
75
return false;
279
- .instance_size = sizeof(IoTKit),
76
}
280
+ .instance_size = sizeof(ARMSSE),
77
- return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz - 1]);
281
.instance_init = iotkit_init,
78
+ return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz]);
282
.class_init = iotkit_class_init,
79
}
283
.interfaces = (InterfaceInfo[]) {
80
284
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
81
static bool trans_FRECPX(DisasContext *s, arg_rpr_esz *a)
285
index XXXXXXX..XXXXXXX 100644
286
--- a/hw/arm/mps2-tz.c
287
+++ b/hw/arm/mps2-tz.c
288
@@ -XXX,XX +XXX,XX @@ typedef struct {
289
typedef struct {
290
MachineState parent;
291
292
- IoTKit iotkit;
293
+ ARMSSE iotkit;
294
MemoryRegion psram;
295
MemoryRegion ssram[3];
296
MemoryRegion ssram1_m;
297
--
82
--
298
2.20.1
83
2.25.1
299
300
diff view generated by jsdifflib
1
Rename the files that used to be iotkit.[ch] to
1
From: Richard Henderson <richard.henderson@linaro.org>
2
armsse.[ch] to reflect the fact they new cover
3
multiple Arm subsystems for embedded.
4
2
3
Rename the function to match other expansion function and
4
move to be adjacent. Split out gen_gvec_fpst_zzp as a
5
helper while we're at it.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-94-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20190121185118.18550-8-peter.maydell@linaro.org
9
---
11
---
10
hw/arm/Makefile.objs | 2 +-
12
target/arm/translate-sve.c | 392 ++++++++++++-------------------------
11
include/hw/arm/{iotkit.h => armsse.h} | 4 ++--
13
1 file changed, 129 insertions(+), 263 deletions(-)
12
hw/arm/{iotkit.c => armsse.c} | 2 +-
13
hw/arm/mps2-tz.c | 2 +-
14
MAINTAINERS | 4 ++--
15
default-configs/arm-softmmu.mak | 2 +-
16
6 files changed, 8 insertions(+), 8 deletions(-)
17
rename include/hw/arm/{iotkit.h => armsse.h} (99%)
18
rename hw/arm/{iotkit.c => armsse.c} (99%)
19
14
20
diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
21
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/Makefile.objs
17
--- a/target/arm/translate-sve.c
23
+++ b/hw/arm/Makefile.objs
18
+++ b/target/arm/translate-sve.c
24
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_ASPEED_SOC) += aspeed_soc.o aspeed.o
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzi(DisasContext *s, gen_helper_gvec_3 *fn,
25
obj-$(CONFIG_MPS2) += mps2.o
20
return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
26
obj-$(CONFIG_MPS2) += mps2-tz.o
21
}
27
obj-$(CONFIG_MSF2) += msf2-soc.o msf2-som.o
22
28
-obj-$(CONFIG_IOTKIT) += iotkit.o
23
+static bool gen_gvec_fpst_zzp(DisasContext *s, gen_helper_gvec_3_ptr *fn,
29
+obj-$(CONFIG_ARMSSE) += armsse.o
24
+ int rd, int rn, int pg, int data,
30
obj-$(CONFIG_FSL_IMX7) += fsl-imx7.o mcimx7d-sabre.o
25
+ ARMFPStatusFlavour flavour)
31
obj-$(CONFIG_ARM_SMMUV3) += smmu-common.o smmuv3.o
26
+{
32
obj-$(CONFIG_FSL_IMX6UL) += fsl-imx6ul.o mcimx6ul-evk.o
27
+ if (fn == NULL) {
33
diff --git a/include/hw/arm/iotkit.h b/include/hw/arm/armsse.h
28
+ return false;
34
similarity index 99%
29
+ }
35
rename from include/hw/arm/iotkit.h
30
+ if (sve_access_check(s)) {
36
rename to include/hw/arm/armsse.h
31
+ unsigned vsz = vec_full_reg_size(s);
37
index XXXXXXX..XXXXXXX 100644
32
+ TCGv_ptr status = fpstatus_ptr(flavour);
38
--- a/include/hw/arm/iotkit.h
33
+
39
+++ b/include/hw/arm/armsse.h
34
+ tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
40
@@ -XXX,XX +XXX,XX @@
35
+ vec_full_reg_offset(s, rn),
41
* + named GPIO outputs mscexp_ns[0..15]
36
+ pred_full_reg_offset(s, pg),
37
+ status, vsz, vsz, data, fn);
38
+ tcg_temp_free_ptr(status);
39
+ }
40
+ return true;
41
+}
42
+
43
+static bool gen_gvec_fpst_arg_zpz(DisasContext *s, gen_helper_gvec_3_ptr *fn,
44
+ arg_rpr_esz *a, int data,
45
+ ARMFPStatusFlavour flavour)
46
+{
47
+ return gen_gvec_fpst_zzp(s, fn, a->rd, a->rn, a->pg, data, flavour);
48
+}
49
+
50
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
51
static bool gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
52
int rd, int rn, int rm, int pg, int data)
53
@@ -XXX,XX +XXX,XX @@ static bool trans_FCMLA_zzxz(DisasContext *s, arg_FCMLA_zzxz *a)
54
*** SVE Floating Point Unary Operations Predicated Group
42
*/
55
*/
43
56
44
-#ifndef IOTKIT_H
57
-static bool do_zpz_ptr(DisasContext *s, int rd, int rn, int pg,
45
-#define IOTKIT_H
58
- bool is_fp16, gen_helper_gvec_3_ptr *fn)
46
+#ifndef ARMSSE_H
59
-{
47
+#define ARMSSE_H
60
- if (sve_access_check(s)) {
48
61
- unsigned vsz = vec_full_reg_size(s);
49
#include "hw/sysbus.h"
62
- TCGv_ptr status = fpstatus_ptr(is_fp16 ? FPST_FPCR_F16 : FPST_FPCR);
50
#include "hw/arm/armv7m.h"
63
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
51
diff --git a/hw/arm/iotkit.c b/hw/arm/armsse.c
64
- vec_full_reg_offset(s, rn),
52
similarity index 99%
65
- pred_full_reg_offset(s, pg),
53
rename from hw/arm/iotkit.c
66
- status, vsz, vsz, 0, fn);
54
rename to hw/arm/armsse.c
67
- tcg_temp_free_ptr(status);
55
index XXXXXXX..XXXXXXX 100644
68
- }
56
--- a/hw/arm/iotkit.c
69
- return true;
57
+++ b/hw/arm/armsse.c
70
-}
58
@@ -XXX,XX +XXX,XX @@
71
+TRANS_FEAT(FCVT_sh, aa64_sve, gen_gvec_fpst_arg_zpz,
59
#include "trace.h"
72
+ gen_helper_sve_fcvt_sh, a, 0, FPST_FPCR)
60
#include "hw/sysbus.h"
73
+TRANS_FEAT(FCVT_hs, aa64_sve, gen_gvec_fpst_arg_zpz,
61
#include "hw/registerfields.h"
74
+ gen_helper_sve_fcvt_hs, a, 0, FPST_FPCR)
62
-#include "hw/arm/iotkit.h"
75
63
+#include "hw/arm/armsse.h"
76
-static bool trans_FCVT_sh(DisasContext *s, arg_rpr_esz *a)
64
#include "hw/arm/arm.h"
77
-{
65
78
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_sh);
66
struct ARMSSEInfo {
79
-}
67
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
80
+TRANS_FEAT(BFCVT, aa64_sve_bf16, gen_gvec_fpst_arg_zpz,
68
index XXXXXXX..XXXXXXX 100644
81
+ gen_helper_sve_bfcvt, a, 0, FPST_FPCR)
69
--- a/hw/arm/mps2-tz.c
82
70
+++ b/hw/arm/mps2-tz.c
83
-static bool trans_FCVT_hs(DisasContext *s, arg_rpr_esz *a)
71
@@ -XXX,XX +XXX,XX @@
84
-{
72
#include "hw/misc/mps2-fpgaio.h"
85
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_hs);
73
#include "hw/misc/tz-mpc.h"
86
-}
74
#include "hw/misc/tz-msc.h"
87
+TRANS_FEAT(FCVT_dh, aa64_sve, gen_gvec_fpst_arg_zpz,
75
-#include "hw/arm/iotkit.h"
88
+ gen_helper_sve_fcvt_dh, a, 0, FPST_FPCR)
76
+#include "hw/arm/armsse.h"
89
+TRANS_FEAT(FCVT_hd, aa64_sve, gen_gvec_fpst_arg_zpz,
77
#include "hw/dma/pl080.h"
90
+ gen_helper_sve_fcvt_hd, a, 0, FPST_FPCR)
78
#include "hw/ssi/pl022.h"
91
+TRANS_FEAT(FCVT_ds, aa64_sve, gen_gvec_fpst_arg_zpz,
79
#include "hw/devices.h"
92
+ gen_helper_sve_fcvt_ds, a, 0, FPST_FPCR)
80
diff --git a/MAINTAINERS b/MAINTAINERS
93
+TRANS_FEAT(FCVT_sd, aa64_sve, gen_gvec_fpst_arg_zpz,
81
index XXXXXXX..XXXXXXX 100644
94
+ gen_helper_sve_fcvt_sd, a, 0, FPST_FPCR)
82
--- a/MAINTAINERS
95
83
+++ b/MAINTAINERS
96
-static bool trans_BFCVT(DisasContext *s, arg_rpr_esz *a)
84
@@ -XXX,XX +XXX,XX @@ F: hw/arm/mps2.c
97
-{
85
F: hw/arm/mps2-tz.c
98
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
86
F: hw/misc/mps2-*.c
99
- return false;
87
F: include/hw/misc/mps2-*.h
100
- }
88
-F: hw/arm/iotkit.c
101
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_bfcvt);
89
-F: include/hw/arm/iotkit.h
102
-}
90
+F: hw/arm/armsse.c
103
+TRANS_FEAT(FCVTZS_hh, aa64_sve, gen_gvec_fpst_arg_zpz,
91
+F: include/hw/arm/armsse.h
104
+ gen_helper_sve_fcvtzs_hh, a, 0, FPST_FPCR_F16)
92
F: hw/misc/iotkit-secctl.c
105
+TRANS_FEAT(FCVTZU_hh, aa64_sve, gen_gvec_fpst_arg_zpz,
93
F: include/hw/misc/iotkit-secctl.h
106
+ gen_helper_sve_fcvtzu_hh, a, 0, FPST_FPCR_F16)
94
F: hw/misc/iotkit-sysctl.c
107
+TRANS_FEAT(FCVTZS_hs, aa64_sve, gen_gvec_fpst_arg_zpz,
95
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
108
+ gen_helper_sve_fcvtzs_hs, a, 0, FPST_FPCR_F16)
96
index XXXXXXX..XXXXXXX 100644
109
+TRANS_FEAT(FCVTZU_hs, aa64_sve, gen_gvec_fpst_arg_zpz,
97
--- a/default-configs/arm-softmmu.mak
110
+ gen_helper_sve_fcvtzu_hs, a, 0, FPST_FPCR_F16)
98
+++ b/default-configs/arm-softmmu.mak
111
+TRANS_FEAT(FCVTZS_hd, aa64_sve, gen_gvec_fpst_arg_zpz,
99
@@ -XXX,XX +XXX,XX @@ CONFIG_MPS2_SCC=y
112
+ gen_helper_sve_fcvtzs_hd, a, 0, FPST_FPCR_F16)
100
CONFIG_TZ_MPC=y
113
+TRANS_FEAT(FCVTZU_hd, aa64_sve, gen_gvec_fpst_arg_zpz,
101
CONFIG_TZ_MSC=y
114
+ gen_helper_sve_fcvtzu_hd, a, 0, FPST_FPCR_F16)
102
CONFIG_TZ_PPC=y
115
103
-CONFIG_IOTKIT=y
116
-static bool trans_FCVT_dh(DisasContext *s, arg_rpr_esz *a)
104
+CONFIG_ARMSSE=y
117
-{
105
CONFIG_IOTKIT_SECCTL=y
118
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_dh);
106
CONFIG_IOTKIT_SYSCTL=y
119
-}
107
CONFIG_IOTKIT_SYSINFO=y
120
+TRANS_FEAT(FCVTZS_ss, aa64_sve, gen_gvec_fpst_arg_zpz,
121
+ gen_helper_sve_fcvtzs_ss, a, 0, FPST_FPCR)
122
+TRANS_FEAT(FCVTZU_ss, aa64_sve, gen_gvec_fpst_arg_zpz,
123
+ gen_helper_sve_fcvtzu_ss, a, 0, FPST_FPCR)
124
+TRANS_FEAT(FCVTZS_sd, aa64_sve, gen_gvec_fpst_arg_zpz,
125
+ gen_helper_sve_fcvtzs_sd, a, 0, FPST_FPCR)
126
+TRANS_FEAT(FCVTZU_sd, aa64_sve, gen_gvec_fpst_arg_zpz,
127
+ gen_helper_sve_fcvtzu_sd, a, 0, FPST_FPCR)
128
+TRANS_FEAT(FCVTZS_ds, aa64_sve, gen_gvec_fpst_arg_zpz,
129
+ gen_helper_sve_fcvtzs_ds, a, 0, FPST_FPCR)
130
+TRANS_FEAT(FCVTZU_ds, aa64_sve, gen_gvec_fpst_arg_zpz,
131
+ gen_helper_sve_fcvtzu_ds, a, 0, FPST_FPCR)
132
133
-static bool trans_FCVT_hd(DisasContext *s, arg_rpr_esz *a)
134
-{
135
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_hd);
136
-}
137
-
138
-static bool trans_FCVT_ds(DisasContext *s, arg_rpr_esz *a)
139
-{
140
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_ds);
141
-}
142
-
143
-static bool trans_FCVT_sd(DisasContext *s, arg_rpr_esz *a)
144
-{
145
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_sd);
146
-}
147
-
148
-static bool trans_FCVTZS_hh(DisasContext *s, arg_rpr_esz *a)
149
-{
150
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzs_hh);
151
-}
152
-
153
-static bool trans_FCVTZU_hh(DisasContext *s, arg_rpr_esz *a)
154
-{
155
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzu_hh);
156
-}
157
-
158
-static bool trans_FCVTZS_hs(DisasContext *s, arg_rpr_esz *a)
159
-{
160
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzs_hs);
161
-}
162
-
163
-static bool trans_FCVTZU_hs(DisasContext *s, arg_rpr_esz *a)
164
-{
165
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzu_hs);
166
-}
167
-
168
-static bool trans_FCVTZS_hd(DisasContext *s, arg_rpr_esz *a)
169
-{
170
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzs_hd);
171
-}
172
-
173
-static bool trans_FCVTZU_hd(DisasContext *s, arg_rpr_esz *a)
174
-{
175
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzu_hd);
176
-}
177
-
178
-static bool trans_FCVTZS_ss(DisasContext *s, arg_rpr_esz *a)
179
-{
180
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzs_ss);
181
-}
182
-
183
-static bool trans_FCVTZU_ss(DisasContext *s, arg_rpr_esz *a)
184
-{
185
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzu_ss);
186
-}
187
-
188
-static bool trans_FCVTZS_sd(DisasContext *s, arg_rpr_esz *a)
189
-{
190
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzs_sd);
191
-}
192
-
193
-static bool trans_FCVTZU_sd(DisasContext *s, arg_rpr_esz *a)
194
-{
195
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzu_sd);
196
-}
197
-
198
-static bool trans_FCVTZS_ds(DisasContext *s, arg_rpr_esz *a)
199
-{
200
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzs_ds);
201
-}
202
-
203
-static bool trans_FCVTZU_ds(DisasContext *s, arg_rpr_esz *a)
204
-{
205
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzu_ds);
206
-}
207
-
208
-static bool trans_FCVTZS_dd(DisasContext *s, arg_rpr_esz *a)
209
-{
210
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzs_dd);
211
-}
212
-
213
-static bool trans_FCVTZU_dd(DisasContext *s, arg_rpr_esz *a)
214
-{
215
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzu_dd);
216
-}
217
+TRANS_FEAT(FCVTZS_dd, aa64_sve, gen_gvec_fpst_arg_zpz,
218
+ gen_helper_sve_fcvtzs_dd, a, 0, FPST_FPCR)
219
+TRANS_FEAT(FCVTZU_dd, aa64_sve, gen_gvec_fpst_arg_zpz,
220
+ gen_helper_sve_fcvtzu_dd, a, 0, FPST_FPCR)
221
222
static gen_helper_gvec_3_ptr * const frint_fns[] = {
223
NULL,
224
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3_ptr * const frint_fns[] = {
225
gen_helper_sve_frint_s,
226
gen_helper_sve_frint_d
227
};
228
+TRANS_FEAT(FRINTI, aa64_sve, gen_gvec_fpst_arg_zpz, frint_fns[a->esz],
229
+ a, 0, a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
230
231
-static bool trans_FRINTI(DisasContext *s, arg_rpr_esz *a)
232
-{
233
- if (a->esz == 0) {
234
- return false;
235
- }
236
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, a->esz == MO_16,
237
- frint_fns[a->esz]);
238
-}
239
-
240
-static bool trans_FRINTX(DisasContext *s, arg_rpr_esz *a)
241
-{
242
- static gen_helper_gvec_3_ptr * const fns[3] = {
243
- gen_helper_sve_frintx_h,
244
- gen_helper_sve_frintx_s,
245
- gen_helper_sve_frintx_d
246
- };
247
- if (a->esz == 0) {
248
- return false;
249
- }
250
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, a->esz == MO_16, fns[a->esz - 1]);
251
-}
252
+static gen_helper_gvec_3_ptr * const frintx_fns[] = {
253
+ NULL,
254
+ gen_helper_sve_frintx_h,
255
+ gen_helper_sve_frintx_s,
256
+ gen_helper_sve_frintx_d
257
+};
258
+TRANS_FEAT(FRINTX, aa64_sve, gen_gvec_fpst_arg_zpz, frintx_fns[a->esz],
259
+ a, 0, a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
260
261
static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a,
262
int mode, gen_helper_gvec_3_ptr *fn)
263
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
264
return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz]);
265
}
266
267
-static bool trans_FRECPX(DisasContext *s, arg_rpr_esz *a)
268
-{
269
- static gen_helper_gvec_3_ptr * const fns[3] = {
270
- gen_helper_sve_frecpx_h,
271
- gen_helper_sve_frecpx_s,
272
- gen_helper_sve_frecpx_d
273
- };
274
- if (a->esz == 0) {
275
- return false;
276
- }
277
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, a->esz == MO_16, fns[a->esz - 1]);
278
-}
279
+static gen_helper_gvec_3_ptr * const frecpx_fns[] = {
280
+ NULL, gen_helper_sve_frecpx_h,
281
+ gen_helper_sve_frecpx_s, gen_helper_sve_frecpx_d,
282
+};
283
+TRANS_FEAT(FRECPX, aa64_sve, gen_gvec_fpst_arg_zpz, frecpx_fns[a->esz],
284
+ a, 0, a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
285
286
-static bool trans_FSQRT(DisasContext *s, arg_rpr_esz *a)
287
-{
288
- static gen_helper_gvec_3_ptr * const fns[3] = {
289
- gen_helper_sve_fsqrt_h,
290
- gen_helper_sve_fsqrt_s,
291
- gen_helper_sve_fsqrt_d
292
- };
293
- if (a->esz == 0) {
294
- return false;
295
- }
296
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, a->esz == MO_16, fns[a->esz - 1]);
297
-}
298
+static gen_helper_gvec_3_ptr * const fsqrt_fns[] = {
299
+ NULL, gen_helper_sve_fsqrt_h,
300
+ gen_helper_sve_fsqrt_s, gen_helper_sve_fsqrt_d,
301
+};
302
+TRANS_FEAT(FSQRT, aa64_sve, gen_gvec_fpst_arg_zpz, fsqrt_fns[a->esz],
303
+ a, 0, a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
304
305
-static bool trans_SCVTF_hh(DisasContext *s, arg_rpr_esz *a)
306
-{
307
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_scvt_hh);
308
-}
309
+TRANS_FEAT(SCVTF_hh, aa64_sve, gen_gvec_fpst_arg_zpz,
310
+ gen_helper_sve_scvt_hh, a, 0, FPST_FPCR_F16)
311
+TRANS_FEAT(SCVTF_sh, aa64_sve, gen_gvec_fpst_arg_zpz,
312
+ gen_helper_sve_scvt_sh, a, 0, FPST_FPCR_F16)
313
+TRANS_FEAT(SCVTF_dh, aa64_sve, gen_gvec_fpst_arg_zpz,
314
+ gen_helper_sve_scvt_dh, a, 0, FPST_FPCR_F16)
315
316
-static bool trans_SCVTF_sh(DisasContext *s, arg_rpr_esz *a)
317
-{
318
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_scvt_sh);
319
-}
320
+TRANS_FEAT(SCVTF_ss, aa64_sve, gen_gvec_fpst_arg_zpz,
321
+ gen_helper_sve_scvt_ss, a, 0, FPST_FPCR)
322
+TRANS_FEAT(SCVTF_ds, aa64_sve, gen_gvec_fpst_arg_zpz,
323
+ gen_helper_sve_scvt_ds, a, 0, FPST_FPCR)
324
325
-static bool trans_SCVTF_dh(DisasContext *s, arg_rpr_esz *a)
326
-{
327
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_scvt_dh);
328
-}
329
+TRANS_FEAT(SCVTF_sd, aa64_sve, gen_gvec_fpst_arg_zpz,
330
+ gen_helper_sve_scvt_sd, a, 0, FPST_FPCR)
331
+TRANS_FEAT(SCVTF_dd, aa64_sve, gen_gvec_fpst_arg_zpz,
332
+ gen_helper_sve_scvt_dd, a, 0, FPST_FPCR)
333
334
-static bool trans_SCVTF_ss(DisasContext *s, arg_rpr_esz *a)
335
-{
336
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_scvt_ss);
337
-}
338
+TRANS_FEAT(UCVTF_hh, aa64_sve, gen_gvec_fpst_arg_zpz,
339
+ gen_helper_sve_ucvt_hh, a, 0, FPST_FPCR_F16)
340
+TRANS_FEAT(UCVTF_sh, aa64_sve, gen_gvec_fpst_arg_zpz,
341
+ gen_helper_sve_ucvt_sh, a, 0, FPST_FPCR_F16)
342
+TRANS_FEAT(UCVTF_dh, aa64_sve, gen_gvec_fpst_arg_zpz,
343
+ gen_helper_sve_ucvt_dh, a, 0, FPST_FPCR_F16)
344
345
-static bool trans_SCVTF_ds(DisasContext *s, arg_rpr_esz *a)
346
-{
347
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_scvt_ds);
348
-}
349
+TRANS_FEAT(UCVTF_ss, aa64_sve, gen_gvec_fpst_arg_zpz,
350
+ gen_helper_sve_ucvt_ss, a, 0, FPST_FPCR)
351
+TRANS_FEAT(UCVTF_ds, aa64_sve, gen_gvec_fpst_arg_zpz,
352
+ gen_helper_sve_ucvt_ds, a, 0, FPST_FPCR)
353
+TRANS_FEAT(UCVTF_sd, aa64_sve, gen_gvec_fpst_arg_zpz,
354
+ gen_helper_sve_ucvt_sd, a, 0, FPST_FPCR)
355
356
-static bool trans_SCVTF_sd(DisasContext *s, arg_rpr_esz *a)
357
-{
358
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_scvt_sd);
359
-}
360
-
361
-static bool trans_SCVTF_dd(DisasContext *s, arg_rpr_esz *a)
362
-{
363
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_scvt_dd);
364
-}
365
-
366
-static bool trans_UCVTF_hh(DisasContext *s, arg_rpr_esz *a)
367
-{
368
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_ucvt_hh);
369
-}
370
-
371
-static bool trans_UCVTF_sh(DisasContext *s, arg_rpr_esz *a)
372
-{
373
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_ucvt_sh);
374
-}
375
-
376
-static bool trans_UCVTF_dh(DisasContext *s, arg_rpr_esz *a)
377
-{
378
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_ucvt_dh);
379
-}
380
-
381
-static bool trans_UCVTF_ss(DisasContext *s, arg_rpr_esz *a)
382
-{
383
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_ucvt_ss);
384
-}
385
-
386
-static bool trans_UCVTF_ds(DisasContext *s, arg_rpr_esz *a)
387
-{
388
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_ucvt_ds);
389
-}
390
-
391
-static bool trans_UCVTF_sd(DisasContext *s, arg_rpr_esz *a)
392
-{
393
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_ucvt_sd);
394
-}
395
-
396
-static bool trans_UCVTF_dd(DisasContext *s, arg_rpr_esz *a)
397
-{
398
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_ucvt_dd);
399
-}
400
+TRANS_FEAT(UCVTF_dd, aa64_sve, gen_gvec_fpst_arg_zpz,
401
+ gen_helper_sve_ucvt_dd, a, 0, FPST_FPCR)
402
403
/*
404
*** SVE Memory - 32-bit Gather and Unsized Contiguous Group
405
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SM4EKEY, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
406
407
TRANS_FEAT(RAX1, aa64_sve2_sha3, gen_gvec_fn_arg_zzz, gen_gvec_rax1, a)
408
409
-static bool trans_FCVTNT_sh(DisasContext *s, arg_rpr_esz *a)
410
-{
411
- if (!dc_isar_feature(aa64_sve2, s)) {
412
- return false;
413
- }
414
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve2_fcvtnt_sh);
415
-}
416
+TRANS_FEAT(FCVTNT_sh, aa64_sve2, gen_gvec_fpst_arg_zpz,
417
+ gen_helper_sve2_fcvtnt_sh, a, 0, FPST_FPCR)
418
+TRANS_FEAT(FCVTNT_ds, aa64_sve2, gen_gvec_fpst_arg_zpz,
419
+ gen_helper_sve2_fcvtnt_ds, a, 0, FPST_FPCR)
420
421
-static bool trans_BFCVTNT(DisasContext *s, arg_rpr_esz *a)
422
-{
423
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
424
- return false;
425
- }
426
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_bfcvtnt);
427
-}
428
+TRANS_FEAT(BFCVTNT, aa64_sve_bf16, gen_gvec_fpst_arg_zpz,
429
+ gen_helper_sve_bfcvtnt, a, 0, FPST_FPCR)
430
431
-static bool trans_FCVTNT_ds(DisasContext *s, arg_rpr_esz *a)
432
-{
433
- if (!dc_isar_feature(aa64_sve2, s)) {
434
- return false;
435
- }
436
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve2_fcvtnt_ds);
437
-}
438
-
439
-static bool trans_FCVTLT_hs(DisasContext *s, arg_rpr_esz *a)
440
-{
441
- if (!dc_isar_feature(aa64_sve2, s)) {
442
- return false;
443
- }
444
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve2_fcvtlt_hs);
445
-}
446
-
447
-static bool trans_FCVTLT_sd(DisasContext *s, arg_rpr_esz *a)
448
-{
449
- if (!dc_isar_feature(aa64_sve2, s)) {
450
- return false;
451
- }
452
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve2_fcvtlt_sd);
453
-}
454
+TRANS_FEAT(FCVTLT_hs, aa64_sve2, gen_gvec_fpst_arg_zpz,
455
+ gen_helper_sve2_fcvtlt_hs, a, 0, FPST_FPCR)
456
+TRANS_FEAT(FCVTLT_sd, aa64_sve2, gen_gvec_fpst_arg_zpz,
457
+ gen_helper_sve2_fcvtlt_sd, a, 0, FPST_FPCR)
458
459
static bool trans_FCVTX_ds(DisasContext *s, arg_rpr_esz *a)
460
{
108
--
461
--
109
2.20.1
462
2.25.1
110
111
diff view generated by jsdifflib
1
For the IoTKit the SRAM bank size is always 32K (15 bits); for the
1
From: Richard Henderson <richard.henderson@linaro.org>
2
SSE-200 this is a configurable parameter, which defaults to 32K but
3
can be changed when it is built into a particular SoC. For instance
4
the Musca-B1 board sets it to 128K (17 bits).
5
2
6
Make the bank size a QOM property. We follow the SSE-200 hardware in
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
naming the parameter SRAM_ADDR_WIDTH, which specifies the number of
4
Message-id: 20220527181907.189259-95-richard.henderson@linaro.org
8
address bits of a single SRAM bank.
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 52 +++++++++++++++++---------------------
9
1 file changed, 23 insertions(+), 29 deletions(-)
9
10
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20190121185118.18550-11-peter.maydell@linaro.org
13
---
14
include/hw/arm/armsse.h | 1 +
15
hw/arm/armsse.c | 18 ++++++++++++++++--
16
2 files changed, 17 insertions(+), 2 deletions(-)
17
18
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
19
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/arm/armsse.h
13
--- a/target/arm/translate-sve.c
21
+++ b/include/hw/arm/armsse.h
14
+++ b/target/arm/translate-sve.c
22
@@ -XXX,XX +XXX,XX @@ typedef struct ARMSSE {
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FRINTX, aa64_sve, gen_gvec_fpst_arg_zpz, frintx_fns[a->esz],
23
MemoryRegion *board_memory;
16
static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a,
24
uint32_t exp_numirq;
17
int mode, gen_helper_gvec_3_ptr *fn)
25
uint32_t mainclk_frq;
18
{
26
+ uint32_t sram_addr_width;
19
- if (sve_access_check(s)) {
27
} ARMSSE;
20
- unsigned vsz = vec_full_reg_size(s);
28
21
- TCGv_i32 tmode = tcg_const_i32(mode);
29
typedef struct ARMSSEInfo ARMSSEInfo;
22
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
30
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
23
+ unsigned vsz;
31
index XXXXXXX..XXXXXXX 100644
24
+ TCGv_i32 tmode;
32
--- a/hw/arm/armsse.c
25
+ TCGv_ptr status;
33
+++ b/hw/arm/armsse.c
26
34
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
27
- gen_helper_set_rmode(tmode, tmode, status);
35
DeviceState *dev_apb_ppc1;
28
-
36
DeviceState *dev_secctl;
29
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
37
DeviceState *dev_splitter;
30
- vec_full_reg_offset(s, a->rn),
38
+ uint32_t addr_width_max;
31
- pred_full_reg_offset(s, a->pg),
39
32
- status, vsz, vsz, 0, fn);
40
if (!s->board_memory) {
33
-
41
error_setg(errp, "memory property was not set");
34
- gen_helper_set_rmode(tmode, tmode, status);
42
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
35
- tcg_temp_free_i32(tmode);
43
return;
36
- tcg_temp_free_ptr(status);
37
+ if (fn == NULL) {
38
+ return false;
44
}
39
}
45
40
+ if (!sve_access_check(s)) {
46
+ /* max SRAM_ADDR_WIDTH: 24 - log2(SRAM_NUM_BANK) */
41
+ return true;
47
+ assert(is_power_of_2(info->sram_banks));
48
+ addr_width_max = 24 - ctz32(info->sram_banks);
49
+ if (s->sram_addr_width < 1 || s->sram_addr_width > addr_width_max) {
50
+ error_setg(errp, "SRAM_ADDR_WIDTH must be between 1 and %d",
51
+ addr_width_max);
52
+ return;
53
+ }
42
+ }
54
+
43
+
55
/* Handling of which devices should be available only to secure
44
+ vsz = vec_full_reg_size(s);
56
* code is usually done differently for M profile than for A profile.
45
+ tmode = tcg_const_i32(mode);
57
* Instead of putting some devices only into the secure address space,
46
+ status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
58
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
47
+
59
for (i = 0; i < info->sram_banks; i++) {
48
+ gen_helper_set_rmode(tmode, tmode, status);
60
char *ramname = g_strdup_printf("armsse.sram%d", i);
49
+
61
SysBusDevice *sbd_mpc;
50
+ tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
62
+ uint32_t sram_bank_size = 1 << s->sram_addr_width;
51
+ vec_full_reg_offset(s, a->rn),
63
52
+ pred_full_reg_offset(s, a->pg),
64
- memory_region_init_ram(&s->sram[i], NULL, ramname, 0x00008000, &err);
53
+ status, vsz, vsz, 0, fn);
65
+ memory_region_init_ram(&s->sram[i], NULL, ramname,
54
+
66
+ sram_bank_size, &err);
55
+ gen_helper_set_rmode(tmode, tmode, status);
67
g_free(ramname);
56
+ tcg_temp_free_i32(tmode);
68
if (err) {
57
+ tcg_temp_free_ptr(status);
69
error_propagate(errp, err);
58
return true;
70
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
59
}
71
}
60
72
/* Map the upstream end of the MPC into the right place... */
61
static bool trans_FRINTN(DisasContext *s, arg_rpr_esz *a)
73
sbd_mpc = SYS_BUS_DEVICE(&s->mpc[i]);
62
{
74
- memory_region_add_subregion(&s->container, 0x20000000 + i * 0x8000,
63
- if (a->esz == 0) {
75
+ memory_region_add_subregion(&s->container,
64
- return false;
76
+ 0x20000000 + i * sram_bank_size,
65
- }
77
sysbus_mmio_get_region(sbd_mpc, 1));
66
return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz]);
78
/* ...and its register interface */
67
}
79
memory_region_add_subregion(&s->container, 0x50083000 + i * 0x1000,
68
80
@@ -XXX,XX +XXX,XX @@ static Property armsse_properties[] = {
69
static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
81
MemoryRegion *),
70
{
82
DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
71
- if (a->esz == 0) {
83
DEFINE_PROP_UINT32("MAINCLK", ARMSSE, mainclk_frq, 0),
72
- return false;
84
+ DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
73
- }
85
DEFINE_PROP_END_OF_LIST()
74
return do_frint_mode(s, a, float_round_up, frint_fns[a->esz]);
86
};
75
}
76
77
static bool trans_FRINTM(DisasContext *s, arg_rpr_esz *a)
78
{
79
- if (a->esz == 0) {
80
- return false;
81
- }
82
return do_frint_mode(s, a, float_round_down, frint_fns[a->esz]);
83
}
84
85
static bool trans_FRINTZ(DisasContext *s, arg_rpr_esz *a)
86
{
87
- if (a->esz == 0) {
88
- return false;
89
- }
90
return do_frint_mode(s, a, float_round_to_zero, frint_fns[a->esz]);
91
}
92
93
static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
94
{
95
- if (a->esz == 0) {
96
- return false;
97
- }
98
return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz]);
99
}
87
100
88
--
101
--
89
2.20.1
102
2.25.1
90
91
diff view generated by jsdifflib
1
Rather than just creating the CPUs with object_new, make them child
1
From: Richard Henderson <richard.henderson@linaro.org>
2
objects of the armv7m container. This will allow the cluster code to
3
find the CPUs if an armv7m object is made a child of a cluster object.
4
object_new_with_props() will do the parenting for us.
5
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-96-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20190121185118.18550-3-peter.maydell@linaro.org
10
---
7
---
11
hw/arm/armv7m.c | 7 ++++++-
8
target/arm/translate-sve.c | 53 ++++++++++----------------------------
12
1 file changed, 6 insertions(+), 1 deletion(-)
9
1 file changed, 14 insertions(+), 39 deletions(-)
13
10
14
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/armv7m.c
13
--- a/target/arm/translate-sve.c
17
+++ b/hw/arm/armv7m.c
14
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static void armv7m_realize(DeviceState *dev, Error **errp)
15
@@ -XXX,XX +XXX,XX @@ static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a,
19
16
return true;
20
memory_region_add_subregion_overlap(&s->container, 0, s->board_memory, -1);
17
}
21
18
22
- s->cpu = ARM_CPU(object_new(s->cpu_type));
19
-static bool trans_FRINTN(DisasContext *s, arg_rpr_esz *a)
23
+ s->cpu = ARM_CPU(object_new_with_props(s->cpu_type, OBJECT(s), "cpu",
20
-{
24
+ &err, NULL));
21
- return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz]);
25
+ if (err != NULL) {
22
-}
26
+ error_propagate(errp, err);
23
-
27
+ return;
24
-static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
28
+ }
25
-{
29
26
- return do_frint_mode(s, a, float_round_up, frint_fns[a->esz]);
30
object_property_set_link(OBJECT(s->cpu), OBJECT(&s->container), "memory",
27
-}
31
&error_abort);
28
-
29
-static bool trans_FRINTM(DisasContext *s, arg_rpr_esz *a)
30
-{
31
- return do_frint_mode(s, a, float_round_down, frint_fns[a->esz]);
32
-}
33
-
34
-static bool trans_FRINTZ(DisasContext *s, arg_rpr_esz *a)
35
-{
36
- return do_frint_mode(s, a, float_round_to_zero, frint_fns[a->esz]);
37
-}
38
-
39
-static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
40
-{
41
- return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz]);
42
-}
43
+TRANS_FEAT(FRINTN, aa64_sve, do_frint_mode, a,
44
+ float_round_nearest_even, frint_fns[a->esz])
45
+TRANS_FEAT(FRINTP, aa64_sve, do_frint_mode, a,
46
+ float_round_up, frint_fns[a->esz])
47
+TRANS_FEAT(FRINTM, aa64_sve, do_frint_mode, a,
48
+ float_round_down, frint_fns[a->esz])
49
+TRANS_FEAT(FRINTZ, aa64_sve, do_frint_mode, a,
50
+ float_round_to_zero, frint_fns[a->esz])
51
+TRANS_FEAT(FRINTA, aa64_sve, do_frint_mode, a,
52
+ float_round_ties_away, frint_fns[a->esz])
53
54
static gen_helper_gvec_3_ptr * const frecpx_fns[] = {
55
NULL, gen_helper_sve_frecpx_h,
56
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FCVTLT_hs, aa64_sve2, gen_gvec_fpst_arg_zpz,
57
TRANS_FEAT(FCVTLT_sd, aa64_sve2, gen_gvec_fpst_arg_zpz,
58
gen_helper_sve2_fcvtlt_sd, a, 0, FPST_FPCR)
59
60
-static bool trans_FCVTX_ds(DisasContext *s, arg_rpr_esz *a)
61
-{
62
- if (!dc_isar_feature(aa64_sve2, s)) {
63
- return false;
64
- }
65
- return do_frint_mode(s, a, float_round_to_odd, gen_helper_sve_fcvt_ds);
66
-}
67
-
68
-static bool trans_FCVTXNT_ds(DisasContext *s, arg_rpr_esz *a)
69
-{
70
- if (!dc_isar_feature(aa64_sve2, s)) {
71
- return false;
72
- }
73
- return do_frint_mode(s, a, float_round_to_odd, gen_helper_sve2_fcvtnt_ds);
74
-}
75
+TRANS_FEAT(FCVTX_ds, aa64_sve2, do_frint_mode, a,
76
+ float_round_to_odd, gen_helper_sve_fcvt_ds)
77
+TRANS_FEAT(FCVTXNT_ds, aa64_sve2, do_frint_mode, a,
78
+ float_round_to_odd, gen_helper_sve2_fcvtnt_ds)
79
80
static bool trans_FLOGB(DisasContext *s, arg_rpr_esz *a)
81
{
32
--
82
--
33
2.20.1
83
2.25.1
34
35
diff view generated by jsdifflib
1
From: kumar sourav <sourav.jb1988@gmail.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
set object owner in memory_region_init_ram() instead
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
of NULL.
4
Message-id: 20220527181907.189259-97-richard.henderson@linaro.org
5
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: kumar sourav <sourav.jb1988@gmail.com>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
9
Message-id: 20190125155630.17430-1-sourav.jb1988@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
7
---
12
hw/arm/nrf51_soc.c | 3 ++-
8
target/arm/translate-sve.c | 29 ++++++-----------------------
13
1 file changed, 2 insertions(+), 1 deletion(-)
9
1 file changed, 6 insertions(+), 23 deletions(-)
14
10
15
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/nrf51_soc.c
13
--- a/target/arm/translate-sve.c
18
+++ b/hw/arm/nrf51_soc.c
14
+++ b/target/arm/translate-sve.c
19
@@ -XXX,XX +XXX,XX @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FCVTX_ds, aa64_sve2, do_frint_mode, a,
20
}
16
TRANS_FEAT(FCVTXNT_ds, aa64_sve2, do_frint_mode, a,
21
memory_region_add_subregion(&s->container, NRF51_FLASH_BASE, &s->flash);
17
float_round_to_odd, gen_helper_sve2_fcvtnt_ds)
22
18
23
- memory_region_init_ram(&s->sram, NULL, "nrf51.sram", s->sram_size, &err);
19
-static bool trans_FLOGB(DisasContext *s, arg_rpr_esz *a)
24
+ memory_region_init_ram(&s->sram, OBJECT(s), "nrf51.sram", s->sram_size,
20
-{
25
+ &err);
21
- static gen_helper_gvec_3_ptr * const fns[] = {
26
if (err) {
22
- NULL, gen_helper_flogb_h,
27
error_propagate(errp, err);
23
- gen_helper_flogb_s, gen_helper_flogb_d
28
return;
24
- };
25
-
26
- if (!dc_isar_feature(aa64_sve2, s) || fns[a->esz] == NULL) {
27
- return false;
28
- }
29
- if (sve_access_check(s)) {
30
- TCGv_ptr status =
31
- fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
32
- unsigned vsz = vec_full_reg_size(s);
33
-
34
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
35
- vec_full_reg_offset(s, a->rn),
36
- pred_full_reg_offset(s, a->pg),
37
- status, vsz, vsz, 0, fns[a->esz]);
38
- tcg_temp_free_ptr(status);
39
- }
40
- return true;
41
-}
42
+static gen_helper_gvec_3_ptr * const flogb_fns[] = {
43
+ NULL, gen_helper_flogb_h,
44
+ gen_helper_flogb_s, gen_helper_flogb_d
45
+};
46
+TRANS_FEAT(FLOGB, aa64_sve2, gen_gvec_fpst_arg_zpz, flogb_fns[a->esz],
47
+ a, 0, a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
48
49
static bool do_FMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sub, bool sel)
50
{
29
--
51
--
30
2.20.1
52
2.25.1
31
32
diff view generated by jsdifflib