1
Arm queue. I'll probably end up doing another later this week.
1
Hi; this is one last arm pullreq before the end of the year.
2
Mostly minor cleanups, and also implementation of the
3
FEAT_XS architectural feature.
2
4
3
thanks
5
thanks
4
-- PMM
6
-- PMM
5
7
6
The following changes since commit 5f39a91dbd9a186edb999afd4d17524f4b1da14f:
8
The following changes since commit 8032c78e556cd0baec111740a6c636863f9bd7c8:
7
9
8
Merge remote-tracking branch 'remotes/jnsnow/tags/ide-pull-request' into staging (2019-01-28 12:54:06 +0000)
10
Merge tag 'firmware-20241216-pull-request' of https://gitlab.com/kraxel/qemu into staging (2024-12-16 14:20:33 -0500)
9
11
10
are available in the Git repository at:
12
are available in the Git repository at:
11
13
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190128
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20241217
13
15
14
for you to fetch changes up to dc192cb2d851c51ebd8d8e1a3b6b14ce9d16efc7:
16
for you to fetch changes up to e91254250acb8570bd7b8a8f89d30e6d18291d02:
15
17
16
gdbstub: Simplify gdb_get_cpu_pid() to use cpu->cluster_index (2019-01-28 18:03:16 +0000)
18
tests/functional: update sbsa-ref firmware used in test (2024-12-17 15:21:06 +0000)
17
19
18
----------------------------------------------------------------
20
----------------------------------------------------------------
19
target-arm queue:
21
target-arm queue:
20
* Fix validation of 32-bit address spaces for aa32 (fixes an assert introduced in ba97be9f4a4)
22
* remove a line of redundant code
21
* v8m: Ensure IDAU is respected if SAU is disabled
23
* convert various TCG helper fns to use 'fpst' alias
22
* gdbstub: fix gdb_get_cpu(s, pid, tid) when pid and/or tid are 0
24
* Use float_status in helper_fcvtx_f64_to_f32
23
* exec.c: Use correct attrs in cpu_memory_rw_debug()
25
* Use float_status in helper_vfp_fcvt{ds,sd}
24
* accel/tcg/user-exec: Don't parse aarch64 insns to test for read vs write
26
* Implement FEAT_XS
25
* target/arm: Don't clear supported PMU events when initializing PMCEID1
27
* hw/intc/arm_gicv3_its: Zero initialize local DTEntry etc structs
26
* memory: add memory_region_flush_rom_device()
28
* tests/functional: update sbsa-ref firmware used in test
27
* microbit: Add nRF51 non-volatile memories
28
* microbit: Add stub NRF51 TWI magnetometer/accelerometer detection
29
* tests/microbit-test: extend testing of microbit devices
30
* checkpatch: Don't emit spurious warnings about block comments
31
* aspeed/smc: misc bug fixes
32
* xlnx-zynqmp: Don't create rpu-cluster if there are no RPUs
33
* xlnx-zynqmp: Realize cluster after putting RPUs in it
34
* accel/tcg: Add cluster number to TCG TB hash so differently configured
35
CPUs don't pick up cached TBs for the wrong kind of CPU
36
29
37
----------------------------------------------------------------
30
----------------------------------------------------------------
38
Aaron Lindsay OS (1):
31
Denis Rastyogin (1):
39
target/arm: Don't clear supported PMU events when initializing PMCEID1
32
target/arm: remove redundant code
40
33
41
Cédric Le Goater (4):
34
Manos Pitsidianakis (3):
42
aspeed/smc: fix default read value
35
target/arm: Add decodetree entry for DSB nXS variant
43
aspeed/smc: define registers for all possible CS
36
target/arm: Enable FEAT_XS for the max cpu
44
aspeed/smc: Add dummy data register
37
tests/tcg/aarch64: add system test for FEAT_XS
45
aspeed/smc: snoop SPI transfers to fake dummy cycles
46
38
47
Julia Suvorova (3):
39
Marcin Juszkiewicz (1):
48
tests/libqtest: Introduce qtest_init_with_serial()
40
tests/functional: update sbsa-ref firmware used in test
49
tests/microbit-test: Make test independent of global_qtest
50
tests/microbit-test: Check nRF51 UART functionality
51
41
52
Luc Michel (1):
42
Peter Maydell (4):
53
gdbstub: fix gdb_get_cpu(s, pid, tid) when pid and/or tid are 0
43
target/arm: Implement fine-grained-trap handling for FEAT_XS
44
target/arm: Add ARM_CP_ADD_TLBI_NXS type flag for NXS insns
45
target/arm: Add ARM_CP_ADD_TLBI_NXS type flag to TLBI insns
46
hw/intc/arm_gicv3_its: Zero initialize local DTEntry etc structs
54
47
55
Peter Maydell (8):
48
Richard Henderson (10):
56
exec.c: Use correct attrs in cpu_memory_rw_debug()
49
target/arm: Convert vfp_helper.c to fpst alias
57
accel/tcg/user-exec: Don't parse aarch64 insns to test for read vs write
50
target/arm: Convert helper-a64.c to fpst alias
58
checkpatch: Don't emit spurious warnings about block comments
51
target/arm: Convert vec_helper.c to fpst alias
59
xlnx-zynqmp: Don't create rpu-cluster if there are no RPUs
52
target/arm: Convert neon_helper.c to fpst alias
60
hw/arm/xlnx-zynqmp: Realize cluster after putting RPUs in it
53
target/arm: Convert sve_helper.c to fpst alias
61
qom/cpu: Add cluster_index to CPUState
54
target/arm: Convert sme_helper.c to fpst alias
62
accel/tcg: Add cluster number to TCG TB hash
55
target/arm: Convert vec_helper.c to use env alias
63
gdbstub: Simplify gdb_get_cpu_pid() to use cpu->cluster_index
56
target/arm: Convert neon_helper.c to use env alias
57
target/arm: Use float_status in helper_fcvtx_f64_to_f32
58
target/arm: Use float_status in helper_vfp_fcvt{ds,sd}
64
59
65
Richard Henderson (1):
60
docs/system/arm/emulation.rst | 1 +
66
target/arm: Fix validation of 32-bit address spaces for aa32
61
target/arm/cpregs.h | 80 ++--
67
62
target/arm/cpu-features.h | 5 +
68
Stefan Hajnoczi (3):
63
target/arm/helper.h | 638 +++++++++++++++----------------
69
tests/microbit-test: add TWI stub device test
64
target/arm/tcg/helper-a64.h | 116 +++---
70
MAINTAINERS: update microbit ARM board files
65
target/arm/tcg/helper-sme.h | 4 +-
71
memory: add memory_region_flush_rom_device()
66
target/arm/tcg/helper-sve.h | 426 ++++++++++-----------
72
67
target/arm/tcg/a64.decode | 3 +
73
Steffen Görtz (4):
68
hw/intc/arm_gicv3_its.c | 44 +--
74
arm: Stub out NRF51 TWI magnetometer/accelerometer detection
69
target/arm/helper.c | 30 +-
75
hw/nvram/nrf51_nvm: Add nRF51 non-volatile memories
70
target/arm/tcg/cpu64.c | 1 +
76
arm: Instantiate NRF51 special NVM's and NVMC
71
target/arm/tcg/helper-a64.c | 101 ++---
77
tests/microbit-test: Add tests for nRF51 NVMC
72
target/arm/tcg/neon_helper.c | 27 +-
78
73
target/arm/tcg/op_helper.c | 11 +-
79
Thomas Roth (1):
74
target/arm/tcg/sme_helper.c | 8 +-
80
target/arm: v8m: Ensure IDAU is respected if SAU is disabled
75
target/arm/tcg/sve_helper.c | 96 ++---
81
76
target/arm/tcg/tlb-insns.c | 202 ++++++----
82
hw/i2c/Makefile.objs | 1 +
77
target/arm/tcg/translate-a64.c | 26 +-
83
hw/nvram/Makefile.objs | 1 +
78
target/arm/tcg/translate-vfp.c | 4 +-
84
include/exec/exec-all.h | 4 +-
79
target/arm/tcg/vec_helper.c | 81 ++--
85
include/exec/memory.h | 18 ++
80
target/arm/vfp_helper.c | 130 +++----
86
include/hw/arm/nrf51.h | 2 +
81
tests/tcg/aarch64/system/feat-xs.c | 27 ++
87
include/hw/arm/nrf51_soc.h | 3 +
82
tests/functional/test_aarch64_sbsaref.py | 20 +-
88
include/hw/cpu/cluster.h | 24 +++
83
23 files changed, 1083 insertions(+), 998 deletions(-)
89
include/hw/i2c/microbit_i2c.h | 42 ++++
84
create mode 100644 tests/tcg/aarch64/system/feat-xs.c
90
include/hw/nvram/nrf51_nvm.h | 64 ++++++
91
include/hw/ssi/aspeed_smc.h | 3 +
92
include/qom/cpu.h | 7 +
93
target/arm/cpu.h | 11 +-
94
tests/libqtest.h | 11 +
95
accel/tcg/cpu-exec.c | 3 +
96
accel/tcg/translate-all.c | 3 +
97
accel/tcg/user-exec.c | 66 ++++--
98
exec.c | 19 +-
99
gdbstub.c | 120 +++++------
100
hw/arm/microbit.c | 16 ++
101
hw/arm/nrf51_soc.c | 41 ++--
102
hw/arm/xlnx-zynqmp.c | 9 +-
103
hw/cpu/cluster.c | 46 +++++
104
hw/i2c/microbit_i2c.c | 127 ++++++++++++
105
hw/nvram/nrf51_nvm.c | 381 +++++++++++++++++++++++++++++++++++
106
hw/ssi/aspeed_smc.c | 128 +++++++++++-
107
qom/cpu.c | 1 +
108
target/arm/cpu.c | 3 +-
109
target/arm/helper.c | 67 +++---
110
tests/libqtest.c | 25 +++
111
tests/microbit-test.c | 458 ++++++++++++++++++++++++++++++++----------
112
MAINTAINERS | 8 +-
113
scripts/checkpatch.pl | 2 +-
114
32 files changed, 1459 insertions(+), 255 deletions(-)
115
create mode 100644 include/hw/i2c/microbit_i2c.h
116
create mode 100644 include/hw/nvram/nrf51_nvm.h
117
create mode 100644 hw/i2c/microbit_i2c.c
118
create mode 100644 hw/nvram/nrf51_nvm.c
119
diff view generated by jsdifflib
1
From: Julia Suvorova <jusual@mail.ru>
1
From: Denis Rastyogin <gerben@altlinux.org>
2
2
3
Some functional tests for:
3
This call is redundant as it only retrieves a value that is not used further.
4
Basic reception/transmittion
5
Suspending
6
INTEN* registers
7
4
8
Signed-off-by: Julia Suvorova <jusual@mail.ru>
5
Found by Linux Verification Center (linuxtesting.org) with SVACE.
9
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
6
10
Acked-by: Thomas Huth <thuth@redhat.com>
7
Signed-off-by: Denis Rastyogin <gerben@altlinux.org>
11
Message-id: 20190123120759.7162-4-jusual@mail.ru
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20241212120618.518369-1-gerben@altlinux.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
11
---
14
tests/microbit-test.c | 89 +++++++++++++++++++++++++++++++++++++++++++
12
target/arm/vfp_helper.c | 2 --
15
1 file changed, 89 insertions(+)
13
1 file changed, 2 deletions(-)
16
14
17
diff --git a/tests/microbit-test.c b/tests/microbit-test.c
15
diff --git a/target/arm/vfp_helper.c b/target/arm/vfp_helper.c
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/tests/microbit-test.c
17
--- a/target/arm/vfp_helper.c
20
+++ b/tests/microbit-test.c
18
+++ b/target/arm/vfp_helper.c
21
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ float64 HELPER(rintd)(float64 x, void *fp_status)
22
#include "libqtest.h"
20
23
21
ret = float64_round_to_int(x, fp_status);
24
#include "hw/arm/nrf51.h"
22
25
+#include "hw/char/nrf51_uart.h"
23
- new_flags = get_float_exception_flags(fp_status);
26
#include "hw/gpio/nrf51_gpio.h"
24
-
27
#include "hw/timer/nrf51_timer.h"
25
/* Suppress any inexact exceptions the conversion produced */
28
#include "hw/i2c/microbit_i2c.h"
26
if (!(old_flags & float_flag_inexact)) {
29
27
new_flags = get_float_exception_flags(fp_status);
30
+static bool uart_wait_for_event(QTestState *qts, uint32_t event_addr)
31
+{
32
+ time_t now, start = time(NULL);
33
+
34
+ while (true) {
35
+ if (qtest_readl(qts, event_addr) == 1) {
36
+ qtest_writel(qts, event_addr, 0x00);
37
+ return true;
38
+ }
39
+
40
+ /* Wait at most 10 minutes */
41
+ now = time(NULL);
42
+ if (now - start > 600) {
43
+ break;
44
+ }
45
+ g_usleep(10000);
46
+ }
47
+
48
+ return false;
49
+}
50
+
51
+static void uart_rw_to_rxd(QTestState *qts, int sock_fd, const char *in,
52
+ char *out)
53
+{
54
+ int i, in_len = strlen(in);
55
+
56
+ g_assert_true(write(sock_fd, in, in_len) == in_len);
57
+ for (i = 0; i < in_len; i++) {
58
+ g_assert_true(uart_wait_for_event(qts, NRF51_UART_BASE +
59
+ A_UART_RXDRDY));
60
+ out[i] = qtest_readl(qts, NRF51_UART_BASE + A_UART_RXD);
61
+ }
62
+ out[i] = '\0';
63
+}
64
+
65
+static void uart_w_to_txd(QTestState *qts, const char *in)
66
+{
67
+ int i, in_len = strlen(in);
68
+
69
+ for (i = 0; i < in_len; i++) {
70
+ qtest_writel(qts, NRF51_UART_BASE + A_UART_TXD, in[i]);
71
+ g_assert_true(uart_wait_for_event(qts, NRF51_UART_BASE +
72
+ A_UART_TXDRDY));
73
+ }
74
+}
75
+
76
+static void test_nrf51_uart(void)
77
+{
78
+ int sock_fd;
79
+ char s[10];
80
+ QTestState *qts = qtest_init_with_serial("-M microbit", &sock_fd);
81
+
82
+ g_assert_true(write(sock_fd, "c", 1) == 1);
83
+ g_assert_cmphex(qtest_readl(qts, NRF51_UART_BASE + A_UART_RXD), ==, 0x00);
84
+
85
+ qtest_writel(qts, NRF51_UART_BASE + A_UART_ENABLE, 0x04);
86
+ qtest_writel(qts, NRF51_UART_BASE + A_UART_STARTRX, 0x01);
87
+
88
+ g_assert_true(uart_wait_for_event(qts, NRF51_UART_BASE + A_UART_RXDRDY));
89
+ qtest_writel(qts, NRF51_UART_BASE + A_UART_RXDRDY, 0x00);
90
+ g_assert_cmphex(qtest_readl(qts, NRF51_UART_BASE + A_UART_RXD), ==, 'c');
91
+
92
+ qtest_writel(qts, NRF51_UART_BASE + A_UART_INTENSET, 0x04);
93
+ g_assert_cmphex(qtest_readl(qts, NRF51_UART_BASE + A_UART_INTEN), ==, 0x04);
94
+ qtest_writel(qts, NRF51_UART_BASE + A_UART_INTENCLR, 0x04);
95
+ g_assert_cmphex(qtest_readl(qts, NRF51_UART_BASE + A_UART_INTEN), ==, 0x00);
96
+
97
+ uart_rw_to_rxd(qts, sock_fd, "hello", s);
98
+ g_assert_true(memcmp(s, "hello", 5) == 0);
99
+
100
+ qtest_writel(qts, NRF51_UART_BASE + A_UART_STARTTX, 0x01);
101
+ uart_w_to_txd(qts, "d");
102
+ g_assert_true(read(sock_fd, s, 10) == 1);
103
+ g_assert_cmphex(s[0], ==, 'd');
104
+
105
+ qtest_writel(qts, NRF51_UART_BASE + A_UART_SUSPEND, 0x01);
106
+ qtest_writel(qts, NRF51_UART_BASE + A_UART_TXD, 'h');
107
+ qtest_writel(qts, NRF51_UART_BASE + A_UART_STARTTX, 0x01);
108
+ uart_w_to_txd(qts, "world");
109
+ g_assert_true(read(sock_fd, s, 10) == 5);
110
+ g_assert_true(memcmp(s, "world", 5) == 0);
111
+
112
+ close(sock_fd);
113
+
114
+ qtest_quit(qts);
115
+}
116
+
117
/* Read a byte from I2C device at @addr from register @reg */
118
static uint32_t i2c_read_byte(QTestState *qts, uint32_t addr, uint32_t reg)
119
{
120
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
121
{
122
g_test_init(&argc, &argv, NULL);
123
124
+ qtest_add_func("/microbit/nrf51/uart", test_nrf51_uart);
125
qtest_add_func("/microbit/nrf51/gpio", test_nrf51_gpio);
126
qtest_add_func("/microbit/nrf51/timer", test_nrf51_timer);
127
qtest_add_func("/microbit/microbit/i2c", test_microbit_i2c);
128
--
28
--
129
2.20.1
29
2.34.1
130
131
diff view generated by jsdifflib
1
From: Thomas Roth <code@stacksmashing.net>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The current behavior of v8m_security_lookup in helper.c only checks whether the
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
IDAU specifies a higher security if the SAU is enabled. If SAU.ALLNS is set to
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
1, this will lead to addresses being treated as non-secure, even though the
5
Message-id: 20241206031224.78525-3-richard.henderson@linaro.org
6
IDAU indicates that they must be secure.
7
8
This patch changes the behavior to also check the IDAU if the SAU is currently
9
disabled.
10
11
(This brings the behaviour here into line with the v8M Arm ARM
12
SecurityCheck() pseudocode.)
13
14
Signed-off-by: Thomas Roth <code@stacksmashing.net>
15
Message-id: CAGGekkuc+-tvp5RJP7CM+Jy_hJF7eiRHZ96132sb=hPPCappKg@mail.gmail.com
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
[PMM: added pseudocode ref to the commit message, fixed comment style]
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
7
---
20
target/arm/helper.c | 21 +++++++++++----------
8
target/arm/helper.h | 268 ++++++++++++++++++++--------------------
21
1 file changed, 11 insertions(+), 10 deletions(-)
9
target/arm/vfp_helper.c | 120 ++++++++----------
10
2 files changed, 186 insertions(+), 202 deletions(-)
22
11
23
diff --git a/target/arm/helper.c b/target/arm/helper.c
12
diff --git a/target/arm/helper.h b/target/arm/helper.h
24
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
25
--- a/target/arm/helper.c
14
--- a/target/arm/helper.h
26
+++ b/target/arm/helper.c
15
+++ b/target/arm/helper.h
27
@@ -XXX,XX +XXX,XX @@ static void v8m_security_lookup(CPUARMState *env, uint32_t address,
16
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(probe_access, TCG_CALL_NO_WG, void, env, tl, i32, i32, i32)
28
}
17
DEF_HELPER_1(vfp_get_fpscr, i32, env)
18
DEF_HELPER_2(vfp_set_fpscr, void, env, i32)
19
20
-DEF_HELPER_3(vfp_addh, f16, f16, f16, ptr)
21
-DEF_HELPER_3(vfp_adds, f32, f32, f32, ptr)
22
-DEF_HELPER_3(vfp_addd, f64, f64, f64, ptr)
23
-DEF_HELPER_3(vfp_subh, f16, f16, f16, ptr)
24
-DEF_HELPER_3(vfp_subs, f32, f32, f32, ptr)
25
-DEF_HELPER_3(vfp_subd, f64, f64, f64, ptr)
26
-DEF_HELPER_3(vfp_mulh, f16, f16, f16, ptr)
27
-DEF_HELPER_3(vfp_muls, f32, f32, f32, ptr)
28
-DEF_HELPER_3(vfp_muld, f64, f64, f64, ptr)
29
-DEF_HELPER_3(vfp_divh, f16, f16, f16, ptr)
30
-DEF_HELPER_3(vfp_divs, f32, f32, f32, ptr)
31
-DEF_HELPER_3(vfp_divd, f64, f64, f64, ptr)
32
-DEF_HELPER_3(vfp_maxh, f16, f16, f16, ptr)
33
-DEF_HELPER_3(vfp_maxs, f32, f32, f32, ptr)
34
-DEF_HELPER_3(vfp_maxd, f64, f64, f64, ptr)
35
-DEF_HELPER_3(vfp_minh, f16, f16, f16, ptr)
36
-DEF_HELPER_3(vfp_mins, f32, f32, f32, ptr)
37
-DEF_HELPER_3(vfp_mind, f64, f64, f64, ptr)
38
-DEF_HELPER_3(vfp_maxnumh, f16, f16, f16, ptr)
39
-DEF_HELPER_3(vfp_maxnums, f32, f32, f32, ptr)
40
-DEF_HELPER_3(vfp_maxnumd, f64, f64, f64, ptr)
41
-DEF_HELPER_3(vfp_minnumh, f16, f16, f16, ptr)
42
-DEF_HELPER_3(vfp_minnums, f32, f32, f32, ptr)
43
-DEF_HELPER_3(vfp_minnumd, f64, f64, f64, ptr)
44
-DEF_HELPER_2(vfp_sqrth, f16, f16, ptr)
45
-DEF_HELPER_2(vfp_sqrts, f32, f32, ptr)
46
-DEF_HELPER_2(vfp_sqrtd, f64, f64, ptr)
47
+DEF_HELPER_3(vfp_addh, f16, f16, f16, fpst)
48
+DEF_HELPER_3(vfp_adds, f32, f32, f32, fpst)
49
+DEF_HELPER_3(vfp_addd, f64, f64, f64, fpst)
50
+DEF_HELPER_3(vfp_subh, f16, f16, f16, fpst)
51
+DEF_HELPER_3(vfp_subs, f32, f32, f32, fpst)
52
+DEF_HELPER_3(vfp_subd, f64, f64, f64, fpst)
53
+DEF_HELPER_3(vfp_mulh, f16, f16, f16, fpst)
54
+DEF_HELPER_3(vfp_muls, f32, f32, f32, fpst)
55
+DEF_HELPER_3(vfp_muld, f64, f64, f64, fpst)
56
+DEF_HELPER_3(vfp_divh, f16, f16, f16, fpst)
57
+DEF_HELPER_3(vfp_divs, f32, f32, f32, fpst)
58
+DEF_HELPER_3(vfp_divd, f64, f64, f64, fpst)
59
+DEF_HELPER_3(vfp_maxh, f16, f16, f16, fpst)
60
+DEF_HELPER_3(vfp_maxs, f32, f32, f32, fpst)
61
+DEF_HELPER_3(vfp_maxd, f64, f64, f64, fpst)
62
+DEF_HELPER_3(vfp_minh, f16, f16, f16, fpst)
63
+DEF_HELPER_3(vfp_mins, f32, f32, f32, fpst)
64
+DEF_HELPER_3(vfp_mind, f64, f64, f64, fpst)
65
+DEF_HELPER_3(vfp_maxnumh, f16, f16, f16, fpst)
66
+DEF_HELPER_3(vfp_maxnums, f32, f32, f32, fpst)
67
+DEF_HELPER_3(vfp_maxnumd, f64, f64, f64, fpst)
68
+DEF_HELPER_3(vfp_minnumh, f16, f16, f16, fpst)
69
+DEF_HELPER_3(vfp_minnums, f32, f32, f32, fpst)
70
+DEF_HELPER_3(vfp_minnumd, f64, f64, f64, fpst)
71
+DEF_HELPER_2(vfp_sqrth, f16, f16, fpst)
72
+DEF_HELPER_2(vfp_sqrts, f32, f32, fpst)
73
+DEF_HELPER_2(vfp_sqrtd, f64, f64, fpst)
74
DEF_HELPER_3(vfp_cmph, void, f16, f16, env)
75
DEF_HELPER_3(vfp_cmps, void, f32, f32, env)
76
DEF_HELPER_3(vfp_cmpd, void, f64, f64, env)
77
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_cmped, void, f64, f64, env)
78
79
DEF_HELPER_2(vfp_fcvtds, f64, f32, env)
80
DEF_HELPER_2(vfp_fcvtsd, f32, f64, env)
81
-DEF_HELPER_FLAGS_2(bfcvt, TCG_CALL_NO_RWG, i32, f32, ptr)
82
-DEF_HELPER_FLAGS_2(bfcvt_pair, TCG_CALL_NO_RWG, i32, i64, ptr)
83
+DEF_HELPER_FLAGS_2(bfcvt, TCG_CALL_NO_RWG, i32, f32, fpst)
84
+DEF_HELPER_FLAGS_2(bfcvt_pair, TCG_CALL_NO_RWG, i32, i64, fpst)
85
86
-DEF_HELPER_2(vfp_uitoh, f16, i32, ptr)
87
-DEF_HELPER_2(vfp_uitos, f32, i32, ptr)
88
-DEF_HELPER_2(vfp_uitod, f64, i32, ptr)
89
-DEF_HELPER_2(vfp_sitoh, f16, i32, ptr)
90
-DEF_HELPER_2(vfp_sitos, f32, i32, ptr)
91
-DEF_HELPER_2(vfp_sitod, f64, i32, ptr)
92
+DEF_HELPER_2(vfp_uitoh, f16, i32, fpst)
93
+DEF_HELPER_2(vfp_uitos, f32, i32, fpst)
94
+DEF_HELPER_2(vfp_uitod, f64, i32, fpst)
95
+DEF_HELPER_2(vfp_sitoh, f16, i32, fpst)
96
+DEF_HELPER_2(vfp_sitos, f32, i32, fpst)
97
+DEF_HELPER_2(vfp_sitod, f64, i32, fpst)
98
99
-DEF_HELPER_2(vfp_touih, i32, f16, ptr)
100
-DEF_HELPER_2(vfp_touis, i32, f32, ptr)
101
-DEF_HELPER_2(vfp_touid, i32, f64, ptr)
102
-DEF_HELPER_2(vfp_touizh, i32, f16, ptr)
103
-DEF_HELPER_2(vfp_touizs, i32, f32, ptr)
104
-DEF_HELPER_2(vfp_touizd, i32, f64, ptr)
105
-DEF_HELPER_2(vfp_tosih, s32, f16, ptr)
106
-DEF_HELPER_2(vfp_tosis, s32, f32, ptr)
107
-DEF_HELPER_2(vfp_tosid, s32, f64, ptr)
108
-DEF_HELPER_2(vfp_tosizh, s32, f16, ptr)
109
-DEF_HELPER_2(vfp_tosizs, s32, f32, ptr)
110
-DEF_HELPER_2(vfp_tosizd, s32, f64, ptr)
111
+DEF_HELPER_2(vfp_touih, i32, f16, fpst)
112
+DEF_HELPER_2(vfp_touis, i32, f32, fpst)
113
+DEF_HELPER_2(vfp_touid, i32, f64, fpst)
114
+DEF_HELPER_2(vfp_touizh, i32, f16, fpst)
115
+DEF_HELPER_2(vfp_touizs, i32, f32, fpst)
116
+DEF_HELPER_2(vfp_touizd, i32, f64, fpst)
117
+DEF_HELPER_2(vfp_tosih, s32, f16, fpst)
118
+DEF_HELPER_2(vfp_tosis, s32, f32, fpst)
119
+DEF_HELPER_2(vfp_tosid, s32, f64, fpst)
120
+DEF_HELPER_2(vfp_tosizh, s32, f16, fpst)
121
+DEF_HELPER_2(vfp_tosizs, s32, f32, fpst)
122
+DEF_HELPER_2(vfp_tosizd, s32, f64, fpst)
123
124
-DEF_HELPER_3(vfp_toshh_round_to_zero, i32, f16, i32, ptr)
125
-DEF_HELPER_3(vfp_toslh_round_to_zero, i32, f16, i32, ptr)
126
-DEF_HELPER_3(vfp_touhh_round_to_zero, i32, f16, i32, ptr)
127
-DEF_HELPER_3(vfp_toulh_round_to_zero, i32, f16, i32, ptr)
128
-DEF_HELPER_3(vfp_toshs_round_to_zero, i32, f32, i32, ptr)
129
-DEF_HELPER_3(vfp_tosls_round_to_zero, i32, f32, i32, ptr)
130
-DEF_HELPER_3(vfp_touhs_round_to_zero, i32, f32, i32, ptr)
131
-DEF_HELPER_3(vfp_touls_round_to_zero, i32, f32, i32, ptr)
132
-DEF_HELPER_3(vfp_toshd_round_to_zero, i64, f64, i32, ptr)
133
-DEF_HELPER_3(vfp_tosld_round_to_zero, i64, f64, i32, ptr)
134
-DEF_HELPER_3(vfp_tosqd_round_to_zero, i64, f64, i32, ptr)
135
-DEF_HELPER_3(vfp_touhd_round_to_zero, i64, f64, i32, ptr)
136
-DEF_HELPER_3(vfp_tould_round_to_zero, i64, f64, i32, ptr)
137
-DEF_HELPER_3(vfp_touqd_round_to_zero, i64, f64, i32, ptr)
138
-DEF_HELPER_3(vfp_touhh, i32, f16, i32, ptr)
139
-DEF_HELPER_3(vfp_toshh, i32, f16, i32, ptr)
140
-DEF_HELPER_3(vfp_toulh, i32, f16, i32, ptr)
141
-DEF_HELPER_3(vfp_toslh, i32, f16, i32, ptr)
142
-DEF_HELPER_3(vfp_touqh, i64, f16, i32, ptr)
143
-DEF_HELPER_3(vfp_tosqh, i64, f16, i32, ptr)
144
-DEF_HELPER_3(vfp_toshs, i32, f32, i32, ptr)
145
-DEF_HELPER_3(vfp_tosls, i32, f32, i32, ptr)
146
-DEF_HELPER_3(vfp_tosqs, i64, f32, i32, ptr)
147
-DEF_HELPER_3(vfp_touhs, i32, f32, i32, ptr)
148
-DEF_HELPER_3(vfp_touls, i32, f32, i32, ptr)
149
-DEF_HELPER_3(vfp_touqs, i64, f32, i32, ptr)
150
-DEF_HELPER_3(vfp_toshd, i64, f64, i32, ptr)
151
-DEF_HELPER_3(vfp_tosld, i64, f64, i32, ptr)
152
-DEF_HELPER_3(vfp_tosqd, i64, f64, i32, ptr)
153
-DEF_HELPER_3(vfp_touhd, i64, f64, i32, ptr)
154
-DEF_HELPER_3(vfp_tould, i64, f64, i32, ptr)
155
-DEF_HELPER_3(vfp_touqd, i64, f64, i32, ptr)
156
-DEF_HELPER_3(vfp_shtos, f32, i32, i32, ptr)
157
-DEF_HELPER_3(vfp_sltos, f32, i32, i32, ptr)
158
-DEF_HELPER_3(vfp_sqtos, f32, i64, i32, ptr)
159
-DEF_HELPER_3(vfp_uhtos, f32, i32, i32, ptr)
160
-DEF_HELPER_3(vfp_ultos, f32, i32, i32, ptr)
161
-DEF_HELPER_3(vfp_uqtos, f32, i64, i32, ptr)
162
-DEF_HELPER_3(vfp_shtod, f64, i64, i32, ptr)
163
-DEF_HELPER_3(vfp_sltod, f64, i64, i32, ptr)
164
-DEF_HELPER_3(vfp_sqtod, f64, i64, i32, ptr)
165
-DEF_HELPER_3(vfp_uhtod, f64, i64, i32, ptr)
166
-DEF_HELPER_3(vfp_ultod, f64, i64, i32, ptr)
167
-DEF_HELPER_3(vfp_uqtod, f64, i64, i32, ptr)
168
-DEF_HELPER_3(vfp_shtoh, f16, i32, i32, ptr)
169
-DEF_HELPER_3(vfp_uhtoh, f16, i32, i32, ptr)
170
-DEF_HELPER_3(vfp_sltoh, f16, i32, i32, ptr)
171
-DEF_HELPER_3(vfp_ultoh, f16, i32, i32, ptr)
172
-DEF_HELPER_3(vfp_sqtoh, f16, i64, i32, ptr)
173
-DEF_HELPER_3(vfp_uqtoh, f16, i64, i32, ptr)
174
+DEF_HELPER_3(vfp_toshh_round_to_zero, i32, f16, i32, fpst)
175
+DEF_HELPER_3(vfp_toslh_round_to_zero, i32, f16, i32, fpst)
176
+DEF_HELPER_3(vfp_touhh_round_to_zero, i32, f16, i32, fpst)
177
+DEF_HELPER_3(vfp_toulh_round_to_zero, i32, f16, i32, fpst)
178
+DEF_HELPER_3(vfp_toshs_round_to_zero, i32, f32, i32, fpst)
179
+DEF_HELPER_3(vfp_tosls_round_to_zero, i32, f32, i32, fpst)
180
+DEF_HELPER_3(vfp_touhs_round_to_zero, i32, f32, i32, fpst)
181
+DEF_HELPER_3(vfp_touls_round_to_zero, i32, f32, i32, fpst)
182
+DEF_HELPER_3(vfp_toshd_round_to_zero, i64, f64, i32, fpst)
183
+DEF_HELPER_3(vfp_tosld_round_to_zero, i64, f64, i32, fpst)
184
+DEF_HELPER_3(vfp_tosqd_round_to_zero, i64, f64, i32, fpst)
185
+DEF_HELPER_3(vfp_touhd_round_to_zero, i64, f64, i32, fpst)
186
+DEF_HELPER_3(vfp_tould_round_to_zero, i64, f64, i32, fpst)
187
+DEF_HELPER_3(vfp_touqd_round_to_zero, i64, f64, i32, fpst)
188
+DEF_HELPER_3(vfp_touhh, i32, f16, i32, fpst)
189
+DEF_HELPER_3(vfp_toshh, i32, f16, i32, fpst)
190
+DEF_HELPER_3(vfp_toulh, i32, f16, i32, fpst)
191
+DEF_HELPER_3(vfp_toslh, i32, f16, i32, fpst)
192
+DEF_HELPER_3(vfp_touqh, i64, f16, i32, fpst)
193
+DEF_HELPER_3(vfp_tosqh, i64, f16, i32, fpst)
194
+DEF_HELPER_3(vfp_toshs, i32, f32, i32, fpst)
195
+DEF_HELPER_3(vfp_tosls, i32, f32, i32, fpst)
196
+DEF_HELPER_3(vfp_tosqs, i64, f32, i32, fpst)
197
+DEF_HELPER_3(vfp_touhs, i32, f32, i32, fpst)
198
+DEF_HELPER_3(vfp_touls, i32, f32, i32, fpst)
199
+DEF_HELPER_3(vfp_touqs, i64, f32, i32, fpst)
200
+DEF_HELPER_3(vfp_toshd, i64, f64, i32, fpst)
201
+DEF_HELPER_3(vfp_tosld, i64, f64, i32, fpst)
202
+DEF_HELPER_3(vfp_tosqd, i64, f64, i32, fpst)
203
+DEF_HELPER_3(vfp_touhd, i64, f64, i32, fpst)
204
+DEF_HELPER_3(vfp_tould, i64, f64, i32, fpst)
205
+DEF_HELPER_3(vfp_touqd, i64, f64, i32, fpst)
206
+DEF_HELPER_3(vfp_shtos, f32, i32, i32, fpst)
207
+DEF_HELPER_3(vfp_sltos, f32, i32, i32, fpst)
208
+DEF_HELPER_3(vfp_sqtos, f32, i64, i32, fpst)
209
+DEF_HELPER_3(vfp_uhtos, f32, i32, i32, fpst)
210
+DEF_HELPER_3(vfp_ultos, f32, i32, i32, fpst)
211
+DEF_HELPER_3(vfp_uqtos, f32, i64, i32, fpst)
212
+DEF_HELPER_3(vfp_shtod, f64, i64, i32, fpst)
213
+DEF_HELPER_3(vfp_sltod, f64, i64, i32, fpst)
214
+DEF_HELPER_3(vfp_sqtod, f64, i64, i32, fpst)
215
+DEF_HELPER_3(vfp_uhtod, f64, i64, i32, fpst)
216
+DEF_HELPER_3(vfp_ultod, f64, i64, i32, fpst)
217
+DEF_HELPER_3(vfp_uqtod, f64, i64, i32, fpst)
218
+DEF_HELPER_3(vfp_shtoh, f16, i32, i32, fpst)
219
+DEF_HELPER_3(vfp_uhtoh, f16, i32, i32, fpst)
220
+DEF_HELPER_3(vfp_sltoh, f16, i32, i32, fpst)
221
+DEF_HELPER_3(vfp_ultoh, f16, i32, i32, fpst)
222
+DEF_HELPER_3(vfp_sqtoh, f16, i64, i32, fpst)
223
+DEF_HELPER_3(vfp_uqtoh, f16, i64, i32, fpst)
224
225
-DEF_HELPER_3(vfp_shtos_round_to_nearest, f32, i32, i32, ptr)
226
-DEF_HELPER_3(vfp_sltos_round_to_nearest, f32, i32, i32, ptr)
227
-DEF_HELPER_3(vfp_uhtos_round_to_nearest, f32, i32, i32, ptr)
228
-DEF_HELPER_3(vfp_ultos_round_to_nearest, f32, i32, i32, ptr)
229
-DEF_HELPER_3(vfp_shtod_round_to_nearest, f64, i64, i32, ptr)
230
-DEF_HELPER_3(vfp_sltod_round_to_nearest, f64, i64, i32, ptr)
231
-DEF_HELPER_3(vfp_uhtod_round_to_nearest, f64, i64, i32, ptr)
232
-DEF_HELPER_3(vfp_ultod_round_to_nearest, f64, i64, i32, ptr)
233
-DEF_HELPER_3(vfp_shtoh_round_to_nearest, f16, i32, i32, ptr)
234
-DEF_HELPER_3(vfp_uhtoh_round_to_nearest, f16, i32, i32, ptr)
235
-DEF_HELPER_3(vfp_sltoh_round_to_nearest, f16, i32, i32, ptr)
236
-DEF_HELPER_3(vfp_ultoh_round_to_nearest, f16, i32, i32, ptr)
237
+DEF_HELPER_3(vfp_shtos_round_to_nearest, f32, i32, i32, fpst)
238
+DEF_HELPER_3(vfp_sltos_round_to_nearest, f32, i32, i32, fpst)
239
+DEF_HELPER_3(vfp_uhtos_round_to_nearest, f32, i32, i32, fpst)
240
+DEF_HELPER_3(vfp_ultos_round_to_nearest, f32, i32, i32, fpst)
241
+DEF_HELPER_3(vfp_shtod_round_to_nearest, f64, i64, i32, fpst)
242
+DEF_HELPER_3(vfp_sltod_round_to_nearest, f64, i64, i32, fpst)
243
+DEF_HELPER_3(vfp_uhtod_round_to_nearest, f64, i64, i32, fpst)
244
+DEF_HELPER_3(vfp_ultod_round_to_nearest, f64, i64, i32, fpst)
245
+DEF_HELPER_3(vfp_shtoh_round_to_nearest, f16, i32, i32, fpst)
246
+DEF_HELPER_3(vfp_uhtoh_round_to_nearest, f16, i32, i32, fpst)
247
+DEF_HELPER_3(vfp_sltoh_round_to_nearest, f16, i32, i32, fpst)
248
+DEF_HELPER_3(vfp_ultoh_round_to_nearest, f16, i32, i32, fpst)
249
250
-DEF_HELPER_FLAGS_2(set_rmode, TCG_CALL_NO_RWG, i32, i32, ptr)
251
+DEF_HELPER_FLAGS_2(set_rmode, TCG_CALL_NO_RWG, i32, i32, fpst)
252
253
-DEF_HELPER_FLAGS_3(vfp_fcvt_f16_to_f32, TCG_CALL_NO_RWG, f32, f16, ptr, i32)
254
-DEF_HELPER_FLAGS_3(vfp_fcvt_f32_to_f16, TCG_CALL_NO_RWG, f16, f32, ptr, i32)
255
-DEF_HELPER_FLAGS_3(vfp_fcvt_f16_to_f64, TCG_CALL_NO_RWG, f64, f16, ptr, i32)
256
-DEF_HELPER_FLAGS_3(vfp_fcvt_f64_to_f16, TCG_CALL_NO_RWG, f16, f64, ptr, i32)
257
+DEF_HELPER_FLAGS_3(vfp_fcvt_f16_to_f32, TCG_CALL_NO_RWG, f32, f16, fpst, i32)
258
+DEF_HELPER_FLAGS_3(vfp_fcvt_f32_to_f16, TCG_CALL_NO_RWG, f16, f32, fpst, i32)
259
+DEF_HELPER_FLAGS_3(vfp_fcvt_f16_to_f64, TCG_CALL_NO_RWG, f64, f16, fpst, i32)
260
+DEF_HELPER_FLAGS_3(vfp_fcvt_f64_to_f16, TCG_CALL_NO_RWG, f16, f64, fpst, i32)
261
262
-DEF_HELPER_4(vfp_muladdd, f64, f64, f64, f64, ptr)
263
-DEF_HELPER_4(vfp_muladds, f32, f32, f32, f32, ptr)
264
-DEF_HELPER_4(vfp_muladdh, f16, f16, f16, f16, ptr)
265
+DEF_HELPER_4(vfp_muladdd, f64, f64, f64, f64, fpst)
266
+DEF_HELPER_4(vfp_muladds, f32, f32, f32, f32, fpst)
267
+DEF_HELPER_4(vfp_muladdh, f16, f16, f16, f16, fpst)
268
269
-DEF_HELPER_FLAGS_2(recpe_f16, TCG_CALL_NO_RWG, f16, f16, ptr)
270
-DEF_HELPER_FLAGS_2(recpe_f32, TCG_CALL_NO_RWG, f32, f32, ptr)
271
-DEF_HELPER_FLAGS_2(recpe_f64, TCG_CALL_NO_RWG, f64, f64, ptr)
272
-DEF_HELPER_FLAGS_2(rsqrte_f16, TCG_CALL_NO_RWG, f16, f16, ptr)
273
-DEF_HELPER_FLAGS_2(rsqrte_f32, TCG_CALL_NO_RWG, f32, f32, ptr)
274
-DEF_HELPER_FLAGS_2(rsqrte_f64, TCG_CALL_NO_RWG, f64, f64, ptr)
275
+DEF_HELPER_FLAGS_2(recpe_f16, TCG_CALL_NO_RWG, f16, f16, fpst)
276
+DEF_HELPER_FLAGS_2(recpe_f32, TCG_CALL_NO_RWG, f32, f32, fpst)
277
+DEF_HELPER_FLAGS_2(recpe_f64, TCG_CALL_NO_RWG, f64, f64, fpst)
278
+DEF_HELPER_FLAGS_2(rsqrte_f16, TCG_CALL_NO_RWG, f16, f16, fpst)
279
+DEF_HELPER_FLAGS_2(rsqrte_f32, TCG_CALL_NO_RWG, f32, f32, fpst)
280
+DEF_HELPER_FLAGS_2(rsqrte_f64, TCG_CALL_NO_RWG, f64, f64, fpst)
281
DEF_HELPER_FLAGS_1(recpe_u32, TCG_CALL_NO_RWG, i32, i32)
282
DEF_HELPER_FLAGS_1(rsqrte_u32, TCG_CALL_NO_RWG, i32, i32)
283
DEF_HELPER_FLAGS_4(neon_tbl, TCG_CALL_NO_RWG, i64, env, i32, i64, i64)
284
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(shr_cc, i32, env, i32, i32)
285
DEF_HELPER_3(sar_cc, i32, env, i32, i32)
286
DEF_HELPER_3(ror_cc, i32, env, i32, i32)
287
288
-DEF_HELPER_FLAGS_2(rinth_exact, TCG_CALL_NO_RWG, f16, f16, ptr)
289
-DEF_HELPER_FLAGS_2(rints_exact, TCG_CALL_NO_RWG, f32, f32, ptr)
290
-DEF_HELPER_FLAGS_2(rintd_exact, TCG_CALL_NO_RWG, f64, f64, ptr)
291
-DEF_HELPER_FLAGS_2(rinth, TCG_CALL_NO_RWG, f16, f16, ptr)
292
-DEF_HELPER_FLAGS_2(rints, TCG_CALL_NO_RWG, f32, f32, ptr)
293
-DEF_HELPER_FLAGS_2(rintd, TCG_CALL_NO_RWG, f64, f64, ptr)
294
+DEF_HELPER_FLAGS_2(rinth_exact, TCG_CALL_NO_RWG, f16, f16, fpst)
295
+DEF_HELPER_FLAGS_2(rints_exact, TCG_CALL_NO_RWG, f32, f32, fpst)
296
+DEF_HELPER_FLAGS_2(rintd_exact, TCG_CALL_NO_RWG, f64, f64, fpst)
297
+DEF_HELPER_FLAGS_2(rinth, TCG_CALL_NO_RWG, f16, f16, fpst)
298
+DEF_HELPER_FLAGS_2(rints, TCG_CALL_NO_RWG, f32, f32, fpst)
299
+DEF_HELPER_FLAGS_2(rintd, TCG_CALL_NO_RWG, f64, f64, fpst)
300
301
DEF_HELPER_FLAGS_2(vjcvt, TCG_CALL_NO_RWG, i32, f64, env)
302
-DEF_HELPER_FLAGS_2(fjcvtzs, TCG_CALL_NO_RWG, i64, f64, ptr)
303
+DEF_HELPER_FLAGS_2(fjcvtzs, TCG_CALL_NO_RWG, i64, f64, fpst)
304
305
DEF_HELPER_FLAGS_3(check_hcr_el2_trap, TCG_CALL_NO_WG, void, env, i32, i32)
306
307
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(gvec_fmlal_idx_a32, TCG_CALL_NO_RWG,
308
DEF_HELPER_FLAGS_5(gvec_fmlal_idx_a64, TCG_CALL_NO_RWG,
309
void, ptr, ptr, ptr, ptr, i32)
310
311
-DEF_HELPER_FLAGS_2(frint32_s, TCG_CALL_NO_RWG, f32, f32, ptr)
312
-DEF_HELPER_FLAGS_2(frint64_s, TCG_CALL_NO_RWG, f32, f32, ptr)
313
-DEF_HELPER_FLAGS_2(frint32_d, TCG_CALL_NO_RWG, f64, f64, ptr)
314
-DEF_HELPER_FLAGS_2(frint64_d, TCG_CALL_NO_RWG, f64, f64, ptr)
315
+DEF_HELPER_FLAGS_2(frint32_s, TCG_CALL_NO_RWG, f32, f32, fpst)
316
+DEF_HELPER_FLAGS_2(frint64_s, TCG_CALL_NO_RWG, f32, f32, fpst)
317
+DEF_HELPER_FLAGS_2(frint32_d, TCG_CALL_NO_RWG, f64, f64, fpst)
318
+DEF_HELPER_FLAGS_2(frint64_d, TCG_CALL_NO_RWG, f64, f64, fpst)
319
320
DEF_HELPER_FLAGS_3(gvec_ceq0_b, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
321
DEF_HELPER_FLAGS_3(gvec_ceq0_h, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
322
diff --git a/target/arm/vfp_helper.c b/target/arm/vfp_helper.c
323
index XXXXXXX..XXXXXXX 100644
324
--- a/target/arm/vfp_helper.c
325
+++ b/target/arm/vfp_helper.c
326
@@ -XXX,XX +XXX,XX @@ void vfp_set_fpscr(CPUARMState *env, uint32_t val)
327
#define VFP_HELPER(name, p) HELPER(glue(glue(vfp_,name),p))
328
329
#define VFP_BINOP(name) \
330
-dh_ctype_f16 VFP_HELPER(name, h)(dh_ctype_f16 a, dh_ctype_f16 b, void *fpstp) \
331
+dh_ctype_f16 VFP_HELPER(name, h)(dh_ctype_f16 a, dh_ctype_f16 b, float_status *fpst) \
332
{ \
333
- float_status *fpst = fpstp; \
334
return float16_ ## name(a, b, fpst); \
335
} \
336
-float32 VFP_HELPER(name, s)(float32 a, float32 b, void *fpstp) \
337
+float32 VFP_HELPER(name, s)(float32 a, float32 b, float_status *fpst) \
338
{ \
339
- float_status *fpst = fpstp; \
340
return float32_ ## name(a, b, fpst); \
341
} \
342
-float64 VFP_HELPER(name, d)(float64 a, float64 b, void *fpstp) \
343
+float64 VFP_HELPER(name, d)(float64 a, float64 b, float_status *fpst) \
344
{ \
345
- float_status *fpst = fpstp; \
346
return float64_ ## name(a, b, fpst); \
347
}
348
VFP_BINOP(add)
349
@@ -XXX,XX +XXX,XX @@ VFP_BINOP(minnum)
350
VFP_BINOP(maxnum)
351
#undef VFP_BINOP
352
353
-dh_ctype_f16 VFP_HELPER(sqrt, h)(dh_ctype_f16 a, void *fpstp)
354
+dh_ctype_f16 VFP_HELPER(sqrt, h)(dh_ctype_f16 a, float_status *fpst)
355
{
356
- return float16_sqrt(a, fpstp);
357
+ return float16_sqrt(a, fpst);
358
}
359
360
-float32 VFP_HELPER(sqrt, s)(float32 a, void *fpstp)
361
+float32 VFP_HELPER(sqrt, s)(float32 a, float_status *fpst)
362
{
363
- return float32_sqrt(a, fpstp);
364
+ return float32_sqrt(a, fpst);
365
}
366
367
-float64 VFP_HELPER(sqrt, d)(float64 a, void *fpstp)
368
+float64 VFP_HELPER(sqrt, d)(float64 a, float_status *fpst)
369
{
370
- return float64_sqrt(a, fpstp);
371
+ return float64_sqrt(a, fpst);
372
}
373
374
static void softfloat_to_vfp_compare(CPUARMState *env, FloatRelation cmp)
375
@@ -XXX,XX +XXX,XX @@ DO_VFP_cmp(d, float64, float64, fp_status)
376
/* Integer to float and float to integer conversions */
377
378
#define CONV_ITOF(name, ftype, fsz, sign) \
379
-ftype HELPER(name)(uint32_t x, void *fpstp) \
380
+ftype HELPER(name)(uint32_t x, float_status *fpst) \
381
{ \
382
- float_status *fpst = fpstp; \
383
return sign##int32_to_##float##fsz((sign##int32_t)x, fpst); \
384
}
385
386
#define CONV_FTOI(name, ftype, fsz, sign, round) \
387
-sign##int32_t HELPER(name)(ftype x, void *fpstp) \
388
+sign##int32_t HELPER(name)(ftype x, float_status *fpst) \
389
{ \
390
- float_status *fpst = fpstp; \
391
if (float##fsz##_is_any_nan(x)) { \
392
float_raise(float_flag_invalid, fpst); \
393
return 0; \
394
@@ -XXX,XX +XXX,XX @@ float32 VFP_HELPER(fcvts, d)(float64 x, CPUARMState *env)
395
return float64_to_float32(x, &env->vfp.fp_status);
396
}
397
398
-uint32_t HELPER(bfcvt)(float32 x, void *status)
399
+uint32_t HELPER(bfcvt)(float32 x, float_status *status)
400
{
401
return float32_to_bfloat16(x, status);
402
}
403
404
-uint32_t HELPER(bfcvt_pair)(uint64_t pair, void *status)
405
+uint32_t HELPER(bfcvt_pair)(uint64_t pair, float_status *status)
406
{
407
bfloat16 lo = float32_to_bfloat16(extract64(pair, 0, 32), status);
408
bfloat16 hi = float32_to_bfloat16(extract64(pair, 32, 32), status);
409
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(bfcvt_pair)(uint64_t pair, void *status)
410
*/
411
#define VFP_CONV_FIX_FLOAT(name, p, fsz, ftype, isz, itype) \
412
ftype HELPER(vfp_##name##to##p)(uint##isz##_t x, uint32_t shift, \
413
- void *fpstp) \
414
-{ return itype##_to_##float##fsz##_scalbn(x, -shift, fpstp); }
415
+ float_status *fpst) \
416
+{ return itype##_to_##float##fsz##_scalbn(x, -shift, fpst); }
417
418
#define VFP_CONV_FIX_FLOAT_ROUND(name, p, fsz, ftype, isz, itype) \
419
ftype HELPER(vfp_##name##to##p##_round_to_nearest)(uint##isz##_t x, \
420
uint32_t shift, \
421
- void *fpstp) \
422
+ float_status *fpst) \
423
{ \
424
ftype ret; \
425
- float_status *fpst = fpstp; \
426
FloatRoundMode oldmode = fpst->float_rounding_mode; \
427
fpst->float_rounding_mode = float_round_nearest_even; \
428
- ret = itype##_to_##float##fsz##_scalbn(x, -shift, fpstp); \
429
+ ret = itype##_to_##float##fsz##_scalbn(x, -shift, fpst); \
430
fpst->float_rounding_mode = oldmode; \
431
return ret; \
432
}
433
434
#define VFP_CONV_FLOAT_FIX_ROUND(name, p, fsz, ftype, isz, itype, ROUND, suff) \
435
uint##isz##_t HELPER(vfp_to##name##p##suff)(ftype x, uint32_t shift, \
436
- void *fpst) \
437
+ float_status *fpst) \
438
{ \
439
if (unlikely(float##fsz##_is_any_nan(x))) { \
440
float_raise(float_flag_invalid, fpst); \
441
@@ -XXX,XX +XXX,XX @@ VFP_CONV_FLOAT_FIX_ROUND(uq, d, 64, float64, 64, uint64,
442
/* Set the current fp rounding mode and return the old one.
443
* The argument is a softfloat float_round_ value.
444
*/
445
-uint32_t HELPER(set_rmode)(uint32_t rmode, void *fpstp)
446
+uint32_t HELPER(set_rmode)(uint32_t rmode, float_status *fp_status)
447
{
448
- float_status *fp_status = fpstp;
449
-
450
uint32_t prev_rmode = get_float_rounding_mode(fp_status);
451
set_float_rounding_mode(rmode, fp_status);
452
453
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(set_rmode)(uint32_t rmode, void *fpstp)
454
}
455
456
/* Half precision conversions. */
457
-float32 HELPER(vfp_fcvt_f16_to_f32)(uint32_t a, void *fpstp, uint32_t ahp_mode)
458
+float32 HELPER(vfp_fcvt_f16_to_f32)(uint32_t a, float_status *fpst,
459
+ uint32_t ahp_mode)
460
{
461
/* Squash FZ16 to 0 for the duration of conversion. In this case,
462
* it would affect flushing input denormals.
463
*/
464
- float_status *fpst = fpstp;
465
bool save = get_flush_inputs_to_zero(fpst);
466
set_flush_inputs_to_zero(false, fpst);
467
float32 r = float16_to_float32(a, !ahp_mode, fpst);
468
@@ -XXX,XX +XXX,XX @@ float32 HELPER(vfp_fcvt_f16_to_f32)(uint32_t a, void *fpstp, uint32_t ahp_mode)
469
return r;
470
}
471
472
-uint32_t HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
473
+uint32_t HELPER(vfp_fcvt_f32_to_f16)(float32 a, float_status *fpst,
474
+ uint32_t ahp_mode)
475
{
476
/* Squash FZ16 to 0 for the duration of conversion. In this case,
477
* it would affect flushing output denormals.
478
*/
479
- float_status *fpst = fpstp;
480
bool save = get_flush_to_zero(fpst);
481
set_flush_to_zero(false, fpst);
482
float16 r = float32_to_float16(a, !ahp_mode, fpst);
483
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
484
return r;
485
}
486
487
-float64 HELPER(vfp_fcvt_f16_to_f64)(uint32_t a, void *fpstp, uint32_t ahp_mode)
488
+float64 HELPER(vfp_fcvt_f16_to_f64)(uint32_t a, float_status *fpst,
489
+ uint32_t ahp_mode)
490
{
491
/* Squash FZ16 to 0 for the duration of conversion. In this case,
492
* it would affect flushing input denormals.
493
*/
494
- float_status *fpst = fpstp;
495
bool save = get_flush_inputs_to_zero(fpst);
496
set_flush_inputs_to_zero(false, fpst);
497
float64 r = float16_to_float64(a, !ahp_mode, fpst);
498
@@ -XXX,XX +XXX,XX @@ float64 HELPER(vfp_fcvt_f16_to_f64)(uint32_t a, void *fpstp, uint32_t ahp_mode)
499
return r;
500
}
501
502
-uint32_t HELPER(vfp_fcvt_f64_to_f16)(float64 a, void *fpstp, uint32_t ahp_mode)
503
+uint32_t HELPER(vfp_fcvt_f64_to_f16)(float64 a, float_status *fpst,
504
+ uint32_t ahp_mode)
505
{
506
/* Squash FZ16 to 0 for the duration of conversion. In this case,
507
* it would affect flushing output denormals.
508
*/
509
- float_status *fpst = fpstp;
510
bool save = get_flush_to_zero(fpst);
511
set_flush_to_zero(false, fpst);
512
float16 r = float64_to_float16(a, !ahp_mode, fpst);
513
@@ -XXX,XX +XXX,XX @@ static bool round_to_inf(float_status *fpst, bool sign_bit)
514
}
515
}
516
517
-uint32_t HELPER(recpe_f16)(uint32_t input, void *fpstp)
518
+uint32_t HELPER(recpe_f16)(uint32_t input, float_status *fpst)
519
{
520
- float_status *fpst = fpstp;
521
float16 f16 = float16_squash_input_denormal(input, fpst);
522
uint32_t f16_val = float16_val(f16);
523
uint32_t f16_sign = float16_is_neg(f16);
524
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(recpe_f16)(uint32_t input, void *fpstp)
525
return make_float16(f16_val);
526
}
527
528
-float32 HELPER(recpe_f32)(float32 input, void *fpstp)
529
+float32 HELPER(recpe_f32)(float32 input, float_status *fpst)
530
{
531
- float_status *fpst = fpstp;
532
float32 f32 = float32_squash_input_denormal(input, fpst);
533
uint32_t f32_val = float32_val(f32);
534
bool f32_sign = float32_is_neg(f32);
535
@@ -XXX,XX +XXX,XX @@ float32 HELPER(recpe_f32)(float32 input, void *fpstp)
536
return make_float32(f32_val);
537
}
538
539
-float64 HELPER(recpe_f64)(float64 input, void *fpstp)
540
+float64 HELPER(recpe_f64)(float64 input, float_status *fpst)
541
{
542
- float_status *fpst = fpstp;
543
float64 f64 = float64_squash_input_denormal(input, fpst);
544
uint64_t f64_val = float64_val(f64);
545
bool f64_sign = float64_is_neg(f64);
546
@@ -XXX,XX +XXX,XX @@ static uint64_t recip_sqrt_estimate(int *exp , int exp_off, uint64_t frac)
547
return extract64(estimate, 0, 8) << 44;
548
}
549
550
-uint32_t HELPER(rsqrte_f16)(uint32_t input, void *fpstp)
551
+uint32_t HELPER(rsqrte_f16)(uint32_t input, float_status *s)
552
{
553
- float_status *s = fpstp;
554
float16 f16 = float16_squash_input_denormal(input, s);
555
uint16_t val = float16_val(f16);
556
bool f16_sign = float16_is_neg(f16);
557
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(rsqrte_f16)(uint32_t input, void *fpstp)
558
if (float16_is_signaling_nan(f16, s)) {
559
float_raise(float_flag_invalid, s);
560
if (!s->default_nan_mode) {
561
- nan = float16_silence_nan(f16, fpstp);
562
+ nan = float16_silence_nan(f16, s);
29
}
563
}
30
}
564
}
31
-
565
if (s->default_nan_mode) {
32
- /* The IDAU will override the SAU lookup results if it specifies
566
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(rsqrte_f16)(uint32_t input, void *fpstp)
33
- * higher security than the SAU does.
567
return make_float16(val);
34
- */
568
}
35
- if (!idau_ns) {
569
36
- if (sattrs->ns || (!idau_nsc && sattrs->nsc)) {
570
-float32 HELPER(rsqrte_f32)(float32 input, void *fpstp)
37
- sattrs->ns = false;
571
+float32 HELPER(rsqrte_f32)(float32 input, float_status *s)
38
- sattrs->nsc = idau_nsc;
572
{
39
- }
573
- float_status *s = fpstp;
40
- }
574
float32 f32 = float32_squash_input_denormal(input, s);
41
break;
575
uint32_t val = float32_val(f32);
42
}
576
uint32_t f32_sign = float32_is_neg(f32);
43
+
577
@@ -XXX,XX +XXX,XX @@ float32 HELPER(rsqrte_f32)(float32 input, void *fpstp)
44
+ /*
578
if (float32_is_signaling_nan(f32, s)) {
45
+ * The IDAU will override the SAU lookup results if it specifies
579
float_raise(float_flag_invalid, s);
46
+ * higher security than the SAU does.
580
if (!s->default_nan_mode) {
47
+ */
581
- nan = float32_silence_nan(f32, fpstp);
48
+ if (!idau_ns) {
582
+ nan = float32_silence_nan(f32, s);
49
+ if (sattrs->ns || (!idau_nsc && sattrs->nsc)) {
583
}
50
+ sattrs->ns = false;
584
}
51
+ sattrs->nsc = idau_nsc;
585
if (s->default_nan_mode) {
52
+ }
586
@@ -XXX,XX +XXX,XX @@ float32 HELPER(rsqrte_f32)(float32 input, void *fpstp)
53
+ }
587
return make_float32(val);
54
}
588
}
55
589
56
static bool pmsav8_mpu_lookup(CPUARMState *env, uint32_t address,
590
-float64 HELPER(rsqrte_f64)(float64 input, void *fpstp)
591
+float64 HELPER(rsqrte_f64)(float64 input, float_status *s)
592
{
593
- float_status *s = fpstp;
594
float64 f64 = float64_squash_input_denormal(input, s);
595
uint64_t val = float64_val(f64);
596
bool f64_sign = float64_is_neg(f64);
597
@@ -XXX,XX +XXX,XX @@ float64 HELPER(rsqrte_f64)(float64 input, void *fpstp)
598
if (float64_is_signaling_nan(f64, s)) {
599
float_raise(float_flag_invalid, s);
600
if (!s->default_nan_mode) {
601
- nan = float64_silence_nan(f64, fpstp);
602
+ nan = float64_silence_nan(f64, s);
603
}
604
}
605
if (s->default_nan_mode) {
606
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(rsqrte_u32)(uint32_t a)
607
608
/* VFPv4 fused multiply-accumulate */
609
dh_ctype_f16 VFP_HELPER(muladd, h)(dh_ctype_f16 a, dh_ctype_f16 b,
610
- dh_ctype_f16 c, void *fpstp)
611
+ dh_ctype_f16 c, float_status *fpst)
612
{
613
- float_status *fpst = fpstp;
614
return float16_muladd(a, b, c, 0, fpst);
615
}
616
617
-float32 VFP_HELPER(muladd, s)(float32 a, float32 b, float32 c, void *fpstp)
618
+float32 VFP_HELPER(muladd, s)(float32 a, float32 b, float32 c,
619
+ float_status *fpst)
620
{
621
- float_status *fpst = fpstp;
622
return float32_muladd(a, b, c, 0, fpst);
623
}
624
625
-float64 VFP_HELPER(muladd, d)(float64 a, float64 b, float64 c, void *fpstp)
626
+float64 VFP_HELPER(muladd, d)(float64 a, float64 b, float64 c,
627
+ float_status *fpst)
628
{
629
- float_status *fpst = fpstp;
630
return float64_muladd(a, b, c, 0, fpst);
631
}
632
633
/* ARMv8 round to integral */
634
-dh_ctype_f16 HELPER(rinth_exact)(dh_ctype_f16 x, void *fp_status)
635
+dh_ctype_f16 HELPER(rinth_exact)(dh_ctype_f16 x, float_status *fp_status)
636
{
637
return float16_round_to_int(x, fp_status);
638
}
639
640
-float32 HELPER(rints_exact)(float32 x, void *fp_status)
641
+float32 HELPER(rints_exact)(float32 x, float_status *fp_status)
642
{
643
return float32_round_to_int(x, fp_status);
644
}
645
646
-float64 HELPER(rintd_exact)(float64 x, void *fp_status)
647
+float64 HELPER(rintd_exact)(float64 x, float_status *fp_status)
648
{
649
return float64_round_to_int(x, fp_status);
650
}
651
652
-dh_ctype_f16 HELPER(rinth)(dh_ctype_f16 x, void *fp_status)
653
+dh_ctype_f16 HELPER(rinth)(dh_ctype_f16 x, float_status *fp_status)
654
{
655
int old_flags = get_float_exception_flags(fp_status), new_flags;
656
float16 ret;
657
@@ -XXX,XX +XXX,XX @@ dh_ctype_f16 HELPER(rinth)(dh_ctype_f16 x, void *fp_status)
658
return ret;
659
}
660
661
-float32 HELPER(rints)(float32 x, void *fp_status)
662
+float32 HELPER(rints)(float32 x, float_status *fp_status)
663
{
664
int old_flags = get_float_exception_flags(fp_status), new_flags;
665
float32 ret;
666
@@ -XXX,XX +XXX,XX @@ float32 HELPER(rints)(float32 x, void *fp_status)
667
return ret;
668
}
669
670
-float64 HELPER(rintd)(float64 x, void *fp_status)
671
+float64 HELPER(rintd)(float64 x, float_status *fp_status)
672
{
673
int old_flags = get_float_exception_flags(fp_status), new_flags;
674
float64 ret;
675
@@ -XXX,XX +XXX,XX @@ const FloatRoundMode arm_rmode_to_sf_map[] = {
676
* Implement float64 to int32_t conversion without saturation;
677
* the result is supplied modulo 2^32.
678
*/
679
-uint64_t HELPER(fjcvtzs)(float64 value, void *vstatus)
680
+uint64_t HELPER(fjcvtzs)(float64 value, float_status *status)
681
{
682
- float_status *status = vstatus;
683
uint32_t frac, e_old, e_new;
684
bool inexact;
685
686
@@ -XXX,XX +XXX,XX @@ static float32 frint_s(float32 f, float_status *fpst, int intsize)
687
return (0x100u + 126u + intsize) << 23;
688
}
689
690
-float32 HELPER(frint32_s)(float32 f, void *fpst)
691
+float32 HELPER(frint32_s)(float32 f, float_status *fpst)
692
{
693
return frint_s(f, fpst, 32);
694
}
695
696
-float32 HELPER(frint64_s)(float32 f, void *fpst)
697
+float32 HELPER(frint64_s)(float32 f, float_status *fpst)
698
{
699
return frint_s(f, fpst, 64);
700
}
701
@@ -XXX,XX +XXX,XX @@ static float64 frint_d(float64 f, float_status *fpst, int intsize)
702
return (uint64_t)(0x800 + 1022 + intsize) << 52;
703
}
704
705
-float64 HELPER(frint32_d)(float64 f, void *fpst)
706
+float64 HELPER(frint32_d)(float64 f, float_status *fpst)
707
{
708
return frint_d(f, fpst, 32);
709
}
710
711
-float64 HELPER(frint64_d)(float64 f, void *fpst)
712
+float64 HELPER(frint64_d)(float64 f, float_status *fpst)
713
{
714
return frint_d(f, fpst, 64);
715
}
57
--
716
--
58
2.20.1
717
2.34.1
59
718
60
719
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The SMC controllers have a register containing the byte that will be
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
used as dummy output. It can be modified by software.
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
5
Message-id: 20241206031224.78525-4-richard.henderson@linaro.org
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Joel Stanley <joel@jms.id.au>
10
Message-id: 20190124140519.13838-4-clg@kaod.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
7
---
13
hw/ssi/aspeed_smc.c | 9 ++++++---
8
target/arm/tcg/helper-a64.h | 94 +++++++++++++++++------------------
14
1 file changed, 6 insertions(+), 3 deletions(-)
9
target/arm/tcg/helper-a64.c | 98 +++++++++++++------------------------
10
2 files changed, 80 insertions(+), 112 deletions(-)
15
11
16
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
12
diff --git a/target/arm/tcg/helper-a64.h b/target/arm/tcg/helper-a64.h
17
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/ssi/aspeed_smc.c
14
--- a/target/arm/tcg/helper-a64.h
19
+++ b/hw/ssi/aspeed_smc.c
15
+++ b/target/arm/tcg/helper-a64.h
20
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_2(msr_i_spsel, void, env, i32)
21
/* Misc Control Register #1 */
17
DEF_HELPER_2(msr_i_daifset, void, env, i32)
22
#define R_MISC_CTRL1 (0x50 / 4)
18
DEF_HELPER_2(msr_i_daifclear, void, env, i32)
23
19
DEF_HELPER_1(msr_set_allint_el1, void, env)
24
-/* Misc Control Register #2 */
20
-DEF_HELPER_3(vfp_cmph_a64, i64, f16, f16, ptr)
25
-#define R_MISC_CTRL2 (0x54 / 4)
21
-DEF_HELPER_3(vfp_cmpeh_a64, i64, f16, f16, ptr)
26
+/* SPI dummy cycle data */
22
-DEF_HELPER_3(vfp_cmps_a64, i64, f32, f32, ptr)
27
+#define R_DUMMY_DATA (0x54 / 4)
23
-DEF_HELPER_3(vfp_cmpes_a64, i64, f32, f32, ptr)
28
24
-DEF_HELPER_3(vfp_cmpd_a64, i64, f64, f64, ptr)
29
/* DMA Control/Status Register */
25
-DEF_HELPER_3(vfp_cmped_a64, i64, f64, f64, ptr)
30
#define R_DMA_CTRL (0x80 / 4)
26
+DEF_HELPER_3(vfp_cmph_a64, i64, f16, f16, fpst)
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_flash_setup(AspeedSMCFlash *fl, uint32_t addr)
27
+DEF_HELPER_3(vfp_cmpeh_a64, i64, f16, f16, fpst)
32
*/
28
+DEF_HELPER_3(vfp_cmps_a64, i64, f32, f32, fpst)
33
if (aspeed_smc_flash_mode(fl) == CTRL_FREADMODE) {
29
+DEF_HELPER_3(vfp_cmpes_a64, i64, f32, f32, fpst)
34
for (i = 0; i < aspeed_smc_flash_dummies(fl); i++) {
30
+DEF_HELPER_3(vfp_cmpd_a64, i64, f64, f64, fpst)
35
- ssi_transfer(fl->controller->spi, 0xFF);
31
+DEF_HELPER_3(vfp_cmped_a64, i64, f64, f64, fpst)
36
+ ssi_transfer(fl->controller->spi, s->regs[R_DUMMY_DATA] & 0xff);
32
DEF_HELPER_FLAGS_4(simd_tblx, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
37
}
33
-DEF_HELPER_FLAGS_3(vfp_mulxs, TCG_CALL_NO_RWG, f32, f32, f32, ptr)
34
-DEF_HELPER_FLAGS_3(vfp_mulxd, TCG_CALL_NO_RWG, f64, f64, f64, ptr)
35
-DEF_HELPER_FLAGS_3(neon_ceq_f64, TCG_CALL_NO_RWG, i64, i64, i64, ptr)
36
-DEF_HELPER_FLAGS_3(neon_cge_f64, TCG_CALL_NO_RWG, i64, i64, i64, ptr)
37
-DEF_HELPER_FLAGS_3(neon_cgt_f64, TCG_CALL_NO_RWG, i64, i64, i64, ptr)
38
-DEF_HELPER_FLAGS_3(recpsf_f16, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
39
-DEF_HELPER_FLAGS_3(recpsf_f32, TCG_CALL_NO_RWG, f32, f32, f32, ptr)
40
-DEF_HELPER_FLAGS_3(recpsf_f64, TCG_CALL_NO_RWG, f64, f64, f64, ptr)
41
-DEF_HELPER_FLAGS_3(rsqrtsf_f16, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
42
-DEF_HELPER_FLAGS_3(rsqrtsf_f32, TCG_CALL_NO_RWG, f32, f32, f32, ptr)
43
-DEF_HELPER_FLAGS_3(rsqrtsf_f64, TCG_CALL_NO_RWG, f64, f64, f64, ptr)
44
-DEF_HELPER_FLAGS_2(frecpx_f64, TCG_CALL_NO_RWG, f64, f64, ptr)
45
-DEF_HELPER_FLAGS_2(frecpx_f32, TCG_CALL_NO_RWG, f32, f32, ptr)
46
-DEF_HELPER_FLAGS_2(frecpx_f16, TCG_CALL_NO_RWG, f16, f16, ptr)
47
+DEF_HELPER_FLAGS_3(vfp_mulxs, TCG_CALL_NO_RWG, f32, f32, f32, fpst)
48
+DEF_HELPER_FLAGS_3(vfp_mulxd, TCG_CALL_NO_RWG, f64, f64, f64, fpst)
49
+DEF_HELPER_FLAGS_3(neon_ceq_f64, TCG_CALL_NO_RWG, i64, i64, i64, fpst)
50
+DEF_HELPER_FLAGS_3(neon_cge_f64, TCG_CALL_NO_RWG, i64, i64, i64, fpst)
51
+DEF_HELPER_FLAGS_3(neon_cgt_f64, TCG_CALL_NO_RWG, i64, i64, i64, fpst)
52
+DEF_HELPER_FLAGS_3(recpsf_f16, TCG_CALL_NO_RWG, f16, f16, f16, fpst)
53
+DEF_HELPER_FLAGS_3(recpsf_f32, TCG_CALL_NO_RWG, f32, f32, f32, fpst)
54
+DEF_HELPER_FLAGS_3(recpsf_f64, TCG_CALL_NO_RWG, f64, f64, f64, fpst)
55
+DEF_HELPER_FLAGS_3(rsqrtsf_f16, TCG_CALL_NO_RWG, f16, f16, f16, fpst)
56
+DEF_HELPER_FLAGS_3(rsqrtsf_f32, TCG_CALL_NO_RWG, f32, f32, f32, fpst)
57
+DEF_HELPER_FLAGS_3(rsqrtsf_f64, TCG_CALL_NO_RWG, f64, f64, f64, fpst)
58
+DEF_HELPER_FLAGS_2(frecpx_f64, TCG_CALL_NO_RWG, f64, f64, fpst)
59
+DEF_HELPER_FLAGS_2(frecpx_f32, TCG_CALL_NO_RWG, f32, f32, fpst)
60
+DEF_HELPER_FLAGS_2(frecpx_f16, TCG_CALL_NO_RWG, f16, f16, fpst)
61
DEF_HELPER_FLAGS_2(fcvtx_f64_to_f32, TCG_CALL_NO_RWG, f32, f64, env)
62
DEF_HELPER_FLAGS_3(crc32_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32)
63
DEF_HELPER_FLAGS_3(crc32c_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32)
64
-DEF_HELPER_FLAGS_3(advsimd_maxh, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
65
-DEF_HELPER_FLAGS_3(advsimd_minh, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
66
-DEF_HELPER_FLAGS_3(advsimd_maxnumh, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
67
-DEF_HELPER_FLAGS_3(advsimd_minnumh, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
68
-DEF_HELPER_3(advsimd_addh, f16, f16, f16, ptr)
69
-DEF_HELPER_3(advsimd_subh, f16, f16, f16, ptr)
70
-DEF_HELPER_3(advsimd_mulh, f16, f16, f16, ptr)
71
-DEF_HELPER_3(advsimd_divh, f16, f16, f16, ptr)
72
-DEF_HELPER_3(advsimd_ceq_f16, i32, f16, f16, ptr)
73
-DEF_HELPER_3(advsimd_cge_f16, i32, f16, f16, ptr)
74
-DEF_HELPER_3(advsimd_cgt_f16, i32, f16, f16, ptr)
75
-DEF_HELPER_3(advsimd_acge_f16, i32, f16, f16, ptr)
76
-DEF_HELPER_3(advsimd_acgt_f16, i32, f16, f16, ptr)
77
-DEF_HELPER_3(advsimd_mulxh, f16, f16, f16, ptr)
78
-DEF_HELPER_4(advsimd_muladdh, f16, f16, f16, f16, ptr)
79
-DEF_HELPER_3(advsimd_add2h, i32, i32, i32, ptr)
80
-DEF_HELPER_3(advsimd_sub2h, i32, i32, i32, ptr)
81
-DEF_HELPER_3(advsimd_mul2h, i32, i32, i32, ptr)
82
-DEF_HELPER_3(advsimd_div2h, i32, i32, i32, ptr)
83
-DEF_HELPER_3(advsimd_max2h, i32, i32, i32, ptr)
84
-DEF_HELPER_3(advsimd_min2h, i32, i32, i32, ptr)
85
-DEF_HELPER_3(advsimd_maxnum2h, i32, i32, i32, ptr)
86
-DEF_HELPER_3(advsimd_minnum2h, i32, i32, i32, ptr)
87
-DEF_HELPER_3(advsimd_mulx2h, i32, i32, i32, ptr)
88
-DEF_HELPER_4(advsimd_muladd2h, i32, i32, i32, i32, ptr)
89
-DEF_HELPER_2(advsimd_rinth_exact, f16, f16, ptr)
90
-DEF_HELPER_2(advsimd_rinth, f16, f16, ptr)
91
+DEF_HELPER_FLAGS_3(advsimd_maxh, TCG_CALL_NO_RWG, f16, f16, f16, fpst)
92
+DEF_HELPER_FLAGS_3(advsimd_minh, TCG_CALL_NO_RWG, f16, f16, f16, fpst)
93
+DEF_HELPER_FLAGS_3(advsimd_maxnumh, TCG_CALL_NO_RWG, f16, f16, f16, fpst)
94
+DEF_HELPER_FLAGS_3(advsimd_minnumh, TCG_CALL_NO_RWG, f16, f16, f16, fpst)
95
+DEF_HELPER_3(advsimd_addh, f16, f16, f16, fpst)
96
+DEF_HELPER_3(advsimd_subh, f16, f16, f16, fpst)
97
+DEF_HELPER_3(advsimd_mulh, f16, f16, f16, fpst)
98
+DEF_HELPER_3(advsimd_divh, f16, f16, f16, fpst)
99
+DEF_HELPER_3(advsimd_ceq_f16, i32, f16, f16, fpst)
100
+DEF_HELPER_3(advsimd_cge_f16, i32, f16, f16, fpst)
101
+DEF_HELPER_3(advsimd_cgt_f16, i32, f16, f16, fpst)
102
+DEF_HELPER_3(advsimd_acge_f16, i32, f16, f16, fpst)
103
+DEF_HELPER_3(advsimd_acgt_f16, i32, f16, f16, fpst)
104
+DEF_HELPER_3(advsimd_mulxh, f16, f16, f16, fpst)
105
+DEF_HELPER_4(advsimd_muladdh, f16, f16, f16, f16, fpst)
106
+DEF_HELPER_3(advsimd_add2h, i32, i32, i32, fpst)
107
+DEF_HELPER_3(advsimd_sub2h, i32, i32, i32, fpst)
108
+DEF_HELPER_3(advsimd_mul2h, i32, i32, i32, fpst)
109
+DEF_HELPER_3(advsimd_div2h, i32, i32, i32, fpst)
110
+DEF_HELPER_3(advsimd_max2h, i32, i32, i32, fpst)
111
+DEF_HELPER_3(advsimd_min2h, i32, i32, i32, fpst)
112
+DEF_HELPER_3(advsimd_maxnum2h, i32, i32, i32, fpst)
113
+DEF_HELPER_3(advsimd_minnum2h, i32, i32, i32, fpst)
114
+DEF_HELPER_3(advsimd_mulx2h, i32, i32, i32, fpst)
115
+DEF_HELPER_4(advsimd_muladd2h, i32, i32, i32, i32, fpst)
116
+DEF_HELPER_2(advsimd_rinth_exact, f16, f16, fpst)
117
+DEF_HELPER_2(advsimd_rinth, f16, f16, fpst)
118
119
DEF_HELPER_2(exception_return, void, env, i64)
120
DEF_HELPER_FLAGS_2(dc_zva, TCG_CALL_NO_WG, void, env, i64)
121
diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
122
index XXXXXXX..XXXXXXX 100644
123
--- a/target/arm/tcg/helper-a64.c
124
+++ b/target/arm/tcg/helper-a64.c
125
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float_rel_to_flags(int res)
126
return flags;
127
}
128
129
-uint64_t HELPER(vfp_cmph_a64)(uint32_t x, uint32_t y, void *fp_status)
130
+uint64_t HELPER(vfp_cmph_a64)(uint32_t x, uint32_t y, float_status *fp_status)
131
{
132
return float_rel_to_flags(float16_compare_quiet(x, y, fp_status));
133
}
134
135
-uint64_t HELPER(vfp_cmpeh_a64)(uint32_t x, uint32_t y, void *fp_status)
136
+uint64_t HELPER(vfp_cmpeh_a64)(uint32_t x, uint32_t y, float_status *fp_status)
137
{
138
return float_rel_to_flags(float16_compare(x, y, fp_status));
139
}
140
141
-uint64_t HELPER(vfp_cmps_a64)(float32 x, float32 y, void *fp_status)
142
+uint64_t HELPER(vfp_cmps_a64)(float32 x, float32 y, float_status *fp_status)
143
{
144
return float_rel_to_flags(float32_compare_quiet(x, y, fp_status));
145
}
146
147
-uint64_t HELPER(vfp_cmpes_a64)(float32 x, float32 y, void *fp_status)
148
+uint64_t HELPER(vfp_cmpes_a64)(float32 x, float32 y, float_status *fp_status)
149
{
150
return float_rel_to_flags(float32_compare(x, y, fp_status));
151
}
152
153
-uint64_t HELPER(vfp_cmpd_a64)(float64 x, float64 y, void *fp_status)
154
+uint64_t HELPER(vfp_cmpd_a64)(float64 x, float64 y, float_status *fp_status)
155
{
156
return float_rel_to_flags(float64_compare_quiet(x, y, fp_status));
157
}
158
159
-uint64_t HELPER(vfp_cmped_a64)(float64 x, float64 y, void *fp_status)
160
+uint64_t HELPER(vfp_cmped_a64)(float64 x, float64 y, float_status *fp_status)
161
{
162
return float_rel_to_flags(float64_compare(x, y, fp_status));
163
}
164
165
-float32 HELPER(vfp_mulxs)(float32 a, float32 b, void *fpstp)
166
+float32 HELPER(vfp_mulxs)(float32 a, float32 b, float_status *fpst)
167
{
168
- float_status *fpst = fpstp;
169
-
170
a = float32_squash_input_denormal(a, fpst);
171
b = float32_squash_input_denormal(b, fpst);
172
173
@@ -XXX,XX +XXX,XX @@ float32 HELPER(vfp_mulxs)(float32 a, float32 b, void *fpstp)
174
return float32_mul(a, b, fpst);
175
}
176
177
-float64 HELPER(vfp_mulxd)(float64 a, float64 b, void *fpstp)
178
+float64 HELPER(vfp_mulxd)(float64 a, float64 b, float_status *fpst)
179
{
180
- float_status *fpst = fpstp;
181
-
182
a = float64_squash_input_denormal(a, fpst);
183
b = float64_squash_input_denormal(b, fpst);
184
185
@@ -XXX,XX +XXX,XX @@ float64 HELPER(vfp_mulxd)(float64 a, float64 b, void *fpstp)
186
}
187
188
/* 64bit/double versions of the neon float compare functions */
189
-uint64_t HELPER(neon_ceq_f64)(float64 a, float64 b, void *fpstp)
190
+uint64_t HELPER(neon_ceq_f64)(float64 a, float64 b, float_status *fpst)
191
{
192
- float_status *fpst = fpstp;
193
return -float64_eq_quiet(a, b, fpst);
194
}
195
196
-uint64_t HELPER(neon_cge_f64)(float64 a, float64 b, void *fpstp)
197
+uint64_t HELPER(neon_cge_f64)(float64 a, float64 b, float_status *fpst)
198
{
199
- float_status *fpst = fpstp;
200
return -float64_le(b, a, fpst);
201
}
202
203
-uint64_t HELPER(neon_cgt_f64)(float64 a, float64 b, void *fpstp)
204
+uint64_t HELPER(neon_cgt_f64)(float64 a, float64 b, float_status *fpst)
205
{
206
- float_status *fpst = fpstp;
207
return -float64_lt(b, a, fpst);
208
}
209
210
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_cgt_f64)(float64 a, float64 b, void *fpstp)
211
* multiply-add-and-halve.
212
*/
213
214
-uint32_t HELPER(recpsf_f16)(uint32_t a, uint32_t b, void *fpstp)
215
+uint32_t HELPER(recpsf_f16)(uint32_t a, uint32_t b, float_status *fpst)
216
{
217
- float_status *fpst = fpstp;
218
-
219
a = float16_squash_input_denormal(a, fpst);
220
b = float16_squash_input_denormal(b, fpst);
221
222
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(recpsf_f16)(uint32_t a, uint32_t b, void *fpstp)
223
return float16_muladd(a, b, float16_two, 0, fpst);
224
}
225
226
-float32 HELPER(recpsf_f32)(float32 a, float32 b, void *fpstp)
227
+float32 HELPER(recpsf_f32)(float32 a, float32 b, float_status *fpst)
228
{
229
- float_status *fpst = fpstp;
230
-
231
a = float32_squash_input_denormal(a, fpst);
232
b = float32_squash_input_denormal(b, fpst);
233
234
@@ -XXX,XX +XXX,XX @@ float32 HELPER(recpsf_f32)(float32 a, float32 b, void *fpstp)
235
return float32_muladd(a, b, float32_two, 0, fpst);
236
}
237
238
-float64 HELPER(recpsf_f64)(float64 a, float64 b, void *fpstp)
239
+float64 HELPER(recpsf_f64)(float64 a, float64 b, float_status *fpst)
240
{
241
- float_status *fpst = fpstp;
242
-
243
a = float64_squash_input_denormal(a, fpst);
244
b = float64_squash_input_denormal(b, fpst);
245
246
@@ -XXX,XX +XXX,XX @@ float64 HELPER(recpsf_f64)(float64 a, float64 b, void *fpstp)
247
return float64_muladd(a, b, float64_two, 0, fpst);
248
}
249
250
-uint32_t HELPER(rsqrtsf_f16)(uint32_t a, uint32_t b, void *fpstp)
251
+uint32_t HELPER(rsqrtsf_f16)(uint32_t a, uint32_t b, float_status *fpst)
252
{
253
- float_status *fpst = fpstp;
254
-
255
a = float16_squash_input_denormal(a, fpst);
256
b = float16_squash_input_denormal(b, fpst);
257
258
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(rsqrtsf_f16)(uint32_t a, uint32_t b, void *fpstp)
259
return float16_muladd(a, b, float16_three, float_muladd_halve_result, fpst);
260
}
261
262
-float32 HELPER(rsqrtsf_f32)(float32 a, float32 b, void *fpstp)
263
+float32 HELPER(rsqrtsf_f32)(float32 a, float32 b, float_status *fpst)
264
{
265
- float_status *fpst = fpstp;
266
-
267
a = float32_squash_input_denormal(a, fpst);
268
b = float32_squash_input_denormal(b, fpst);
269
270
@@ -XXX,XX +XXX,XX @@ float32 HELPER(rsqrtsf_f32)(float32 a, float32 b, void *fpstp)
271
return float32_muladd(a, b, float32_three, float_muladd_halve_result, fpst);
272
}
273
274
-float64 HELPER(rsqrtsf_f64)(float64 a, float64 b, void *fpstp)
275
+float64 HELPER(rsqrtsf_f64)(float64 a, float64 b, float_status *fpst)
276
{
277
- float_status *fpst = fpstp;
278
-
279
a = float64_squash_input_denormal(a, fpst);
280
b = float64_squash_input_denormal(b, fpst);
281
282
@@ -XXX,XX +XXX,XX @@ float64 HELPER(rsqrtsf_f64)(float64 a, float64 b, void *fpstp)
283
}
284
285
/* Floating-point reciprocal exponent - see FPRecpX in ARM ARM */
286
-uint32_t HELPER(frecpx_f16)(uint32_t a, void *fpstp)
287
+uint32_t HELPER(frecpx_f16)(uint32_t a, float_status *fpst)
288
{
289
- float_status *fpst = fpstp;
290
uint16_t val16, sbit;
291
int16_t exp;
292
293
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(frecpx_f16)(uint32_t a, void *fpstp)
38
}
294
}
39
}
295
}
40
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr addr, unsigned int size)
296
41
addr == s->r_timings ||
297
-float32 HELPER(frecpx_f32)(float32 a, void *fpstp)
42
addr == s->r_ce_ctrl ||
298
+float32 HELPER(frecpx_f32)(float32 a, float_status *fpst)
43
addr == R_INTR_CTRL ||
299
{
44
+ addr == R_DUMMY_DATA ||
300
- float_status *fpst = fpstp;
45
(addr >= R_SEG_ADDR0 && addr < R_SEG_ADDR0 + s->ctrl->max_slaves) ||
301
uint32_t val32, sbit;
46
(addr >= s->r_ctrl0 && addr < s->r_ctrl0 + s->ctrl->max_slaves)) {
302
int32_t exp;
47
return s->regs[addr];
303
48
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_write(void *opaque, hwaddr addr, uint64_t data,
304
@@ -XXX,XX +XXX,XX @@ float32 HELPER(frecpx_f32)(float32 a, void *fpstp)
49
if (value != s->regs[R_SEG_ADDR0 + cs]) {
305
}
50
aspeed_smc_flash_set_segment(s, cs, value);
306
}
51
}
307
52
+ } else if (addr == R_DUMMY_DATA) {
308
-float64 HELPER(frecpx_f64)(float64 a, void *fpstp)
53
+ s->regs[addr] = value & 0xff;
309
+float64 HELPER(frecpx_f64)(float64 a, float_status *fpst)
54
} else {
310
{
55
qemu_log_mask(LOG_UNIMP, "%s: not implemented: 0x%" HWADDR_PRIx "\n",
311
- float_status *fpst = fpstp;
56
__func__, addr);
312
uint64_t val64, sbit;
313
int64_t exp;
314
315
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(crc32c_64)(uint64_t acc, uint64_t val, uint32_t bytes)
316
#define ADVSIMD_HELPER(name, suffix) HELPER(glue(glue(advsimd_, name), suffix))
317
318
#define ADVSIMD_HALFOP(name) \
319
-uint32_t ADVSIMD_HELPER(name, h)(uint32_t a, uint32_t b, void *fpstp) \
320
+uint32_t ADVSIMD_HELPER(name, h)(uint32_t a, uint32_t b, float_status *fpst) \
321
{ \
322
- float_status *fpst = fpstp; \
323
return float16_ ## name(a, b, fpst); \
324
}
325
326
@@ -XXX,XX +XXX,XX @@ ADVSIMD_HALFOP(minnum)
327
ADVSIMD_HALFOP(maxnum)
328
329
#define ADVSIMD_TWOHALFOP(name) \
330
-uint32_t ADVSIMD_HELPER(name, 2h)(uint32_t two_a, uint32_t two_b, void *fpstp) \
331
+uint32_t ADVSIMD_HELPER(name, 2h)(uint32_t two_a, uint32_t two_b, \
332
+ float_status *fpst) \
333
{ \
334
float16 a1, a2, b1, b2; \
335
uint32_t r1, r2; \
336
- float_status *fpst = fpstp; \
337
a1 = extract32(two_a, 0, 16); \
338
a2 = extract32(two_a, 16, 16); \
339
b1 = extract32(two_b, 0, 16); \
340
@@ -XXX,XX +XXX,XX @@ ADVSIMD_TWOHALFOP(minnum)
341
ADVSIMD_TWOHALFOP(maxnum)
342
343
/* Data processing - scalar floating-point and advanced SIMD */
344
-static float16 float16_mulx(float16 a, float16 b, void *fpstp)
345
+static float16 float16_mulx(float16 a, float16 b, float_status *fpst)
346
{
347
- float_status *fpst = fpstp;
348
-
349
a = float16_squash_input_denormal(a, fpst);
350
b = float16_squash_input_denormal(b, fpst);
351
352
@@ -XXX,XX +XXX,XX @@ ADVSIMD_TWOHALFOP(mulx)
353
354
/* fused multiply-accumulate */
355
uint32_t HELPER(advsimd_muladdh)(uint32_t a, uint32_t b, uint32_t c,
356
- void *fpstp)
357
+ float_status *fpst)
358
{
359
- float_status *fpst = fpstp;
360
return float16_muladd(a, b, c, 0, fpst);
361
}
362
363
uint32_t HELPER(advsimd_muladd2h)(uint32_t two_a, uint32_t two_b,
364
- uint32_t two_c, void *fpstp)
365
+ uint32_t two_c, float_status *fpst)
366
{
367
- float_status *fpst = fpstp;
368
float16 a1, a2, b1, b2, c1, c2;
369
uint32_t r1, r2;
370
a1 = extract32(two_a, 0, 16);
371
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_muladd2h)(uint32_t two_a, uint32_t two_b,
372
373
#define ADVSIMD_CMPRES(test) (test) ? 0xffff : 0
374
375
-uint32_t HELPER(advsimd_ceq_f16)(uint32_t a, uint32_t b, void *fpstp)
376
+uint32_t HELPER(advsimd_ceq_f16)(uint32_t a, uint32_t b, float_status *fpst)
377
{
378
- float_status *fpst = fpstp;
379
int compare = float16_compare_quiet(a, b, fpst);
380
return ADVSIMD_CMPRES(compare == float_relation_equal);
381
}
382
383
-uint32_t HELPER(advsimd_cge_f16)(uint32_t a, uint32_t b, void *fpstp)
384
+uint32_t HELPER(advsimd_cge_f16)(uint32_t a, uint32_t b, float_status *fpst)
385
{
386
- float_status *fpst = fpstp;
387
int compare = float16_compare(a, b, fpst);
388
return ADVSIMD_CMPRES(compare == float_relation_greater ||
389
compare == float_relation_equal);
390
}
391
392
-uint32_t HELPER(advsimd_cgt_f16)(uint32_t a, uint32_t b, void *fpstp)
393
+uint32_t HELPER(advsimd_cgt_f16)(uint32_t a, uint32_t b, float_status *fpst)
394
{
395
- float_status *fpst = fpstp;
396
int compare = float16_compare(a, b, fpst);
397
return ADVSIMD_CMPRES(compare == float_relation_greater);
398
}
399
400
-uint32_t HELPER(advsimd_acge_f16)(uint32_t a, uint32_t b, void *fpstp)
401
+uint32_t HELPER(advsimd_acge_f16)(uint32_t a, uint32_t b, float_status *fpst)
402
{
403
- float_status *fpst = fpstp;
404
float16 f0 = float16_abs(a);
405
float16 f1 = float16_abs(b);
406
int compare = float16_compare(f0, f1, fpst);
407
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acge_f16)(uint32_t a, uint32_t b, void *fpstp)
408
compare == float_relation_equal);
409
}
410
411
-uint32_t HELPER(advsimd_acgt_f16)(uint32_t a, uint32_t b, void *fpstp)
412
+uint32_t HELPER(advsimd_acgt_f16)(uint32_t a, uint32_t b, float_status *fpst)
413
{
414
- float_status *fpst = fpstp;
415
float16 f0 = float16_abs(a);
416
float16 f1 = float16_abs(b);
417
int compare = float16_compare(f0, f1, fpst);
418
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acgt_f16)(uint32_t a, uint32_t b, void *fpstp)
419
}
420
421
/* round to integral */
422
-uint32_t HELPER(advsimd_rinth_exact)(uint32_t x, void *fp_status)
423
+uint32_t HELPER(advsimd_rinth_exact)(uint32_t x, float_status *fp_status)
424
{
425
return float16_round_to_int(x, fp_status);
426
}
427
428
-uint32_t HELPER(advsimd_rinth)(uint32_t x, void *fp_status)
429
+uint32_t HELPER(advsimd_rinth)(uint32_t x, float_status *fp_status)
430
{
431
int old_flags = get_float_exception_flags(fp_status), new_flags;
432
float16 ret;
57
--
433
--
58
2.20.1
434
2.34.1
59
435
60
436
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The model should expose one control register per possible CS. When
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
testing the validity of the register number in the read operation,
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
replace 's->num_cs' by 'ctrl->max_slaves' which represents the maximum
5
Message-id: 20241206031224.78525-5-richard.henderson@linaro.org
6
number of flash devices a controller can handle.
7
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Reviewed-by: Joel Stanley <joel@jms.id.au>
10
Message-id: 20190124140519.13838-3-clg@kaod.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
7
---
13
hw/ssi/aspeed_smc.c | 2 +-
8
target/arm/helper.h | 284 ++++++++++++++++++------------------
14
1 file changed, 1 insertion(+), 1 deletion(-)
9
target/arm/tcg/helper-a64.h | 18 +--
10
target/arm/tcg/helper-sve.h | 12 +-
11
target/arm/tcg/vec_helper.c | 60 ++++----
12
4 files changed, 183 insertions(+), 191 deletions(-)
15
13
16
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
14
diff --git a/target/arm/helper.h b/target/arm/helper.h
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/ssi/aspeed_smc.c
16
--- a/target/arm/helper.h
19
+++ b/hw/ssi/aspeed_smc.c
17
+++ b/target/arm/helper.h
20
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr addr, unsigned int size)
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(gvec_usdot_idx_b, TCG_CALL_NO_RWG,
21
addr == s->r_ce_ctrl ||
19
void, ptr, ptr, ptr, ptr, i32)
22
addr == R_INTR_CTRL ||
20
23
(addr >= R_SEG_ADDR0 && addr < R_SEG_ADDR0 + s->ctrl->max_slaves) ||
21
DEF_HELPER_FLAGS_5(gvec_fcaddh, TCG_CALL_NO_RWG,
24
- (addr >= s->r_ctrl0 && addr < s->r_ctrl0 + s->num_cs)) {
22
- void, ptr, ptr, ptr, ptr, i32)
25
+ (addr >= s->r_ctrl0 && addr < s->r_ctrl0 + s->ctrl->max_slaves)) {
23
+ void, ptr, ptr, ptr, fpst, i32)
26
return s->regs[addr];
24
DEF_HELPER_FLAGS_5(gvec_fcadds, TCG_CALL_NO_RWG,
27
} else {
25
- void, ptr, ptr, ptr, ptr, i32)
28
qemu_log_mask(LOG_UNIMP, "%s: not implemented: 0x%" HWADDR_PRIx "\n",
26
+ void, ptr, ptr, ptr, fpst, i32)
27
DEF_HELPER_FLAGS_5(gvec_fcaddd, TCG_CALL_NO_RWG,
28
- void, ptr, ptr, ptr, ptr, i32)
29
+ void, ptr, ptr, ptr, fpst, i32)
30
31
DEF_HELPER_FLAGS_6(gvec_fcmlah, TCG_CALL_NO_RWG,
32
- void, ptr, ptr, ptr, ptr, ptr, i32)
33
+ void, ptr, ptr, ptr, ptr, fpst, i32)
34
DEF_HELPER_FLAGS_6(gvec_fcmlah_idx, TCG_CALL_NO_RWG,
35
- void, ptr, ptr, ptr, ptr, ptr, i32)
36
+ void, ptr, ptr, ptr, ptr, fpst, i32)
37
DEF_HELPER_FLAGS_6(gvec_fcmlas, TCG_CALL_NO_RWG,
38
- void, ptr, ptr, ptr, ptr, ptr, i32)
39
+ void, ptr, ptr, ptr, ptr, fpst, i32)
40
DEF_HELPER_FLAGS_6(gvec_fcmlas_idx, TCG_CALL_NO_RWG,
41
- void, ptr, ptr, ptr, ptr, ptr, i32)
42
+ void, ptr, ptr, ptr, ptr, fpst, i32)
43
DEF_HELPER_FLAGS_6(gvec_fcmlad, TCG_CALL_NO_RWG,
44
- void, ptr, ptr, ptr, ptr, ptr, i32)
45
+ void, ptr, ptr, ptr, ptr, fpst, i32)
46
47
-DEF_HELPER_FLAGS_4(gvec_sstoh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
48
-DEF_HELPER_FLAGS_4(gvec_sitos, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
49
-DEF_HELPER_FLAGS_4(gvec_ustoh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
50
-DEF_HELPER_FLAGS_4(gvec_uitos, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
51
-DEF_HELPER_FLAGS_4(gvec_tosszh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
52
-DEF_HELPER_FLAGS_4(gvec_tosizs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
53
-DEF_HELPER_FLAGS_4(gvec_touszh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
54
-DEF_HELPER_FLAGS_4(gvec_touizs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
55
+DEF_HELPER_FLAGS_4(gvec_sstoh, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
56
+DEF_HELPER_FLAGS_4(gvec_sitos, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
57
+DEF_HELPER_FLAGS_4(gvec_ustoh, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
58
+DEF_HELPER_FLAGS_4(gvec_uitos, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
59
+DEF_HELPER_FLAGS_4(gvec_tosszh, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
60
+DEF_HELPER_FLAGS_4(gvec_tosizs, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
61
+DEF_HELPER_FLAGS_4(gvec_touszh, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
62
+DEF_HELPER_FLAGS_4(gvec_touizs, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
63
64
-DEF_HELPER_FLAGS_4(gvec_vcvt_sf, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
65
-DEF_HELPER_FLAGS_4(gvec_vcvt_uf, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
66
-DEF_HELPER_FLAGS_4(gvec_vcvt_rz_fs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
67
-DEF_HELPER_FLAGS_4(gvec_vcvt_rz_fu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
68
+DEF_HELPER_FLAGS_4(gvec_vcvt_sf, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
69
+DEF_HELPER_FLAGS_4(gvec_vcvt_uf, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
70
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_fs, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
71
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_fu, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
72
73
-DEF_HELPER_FLAGS_4(gvec_vcvt_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
74
-DEF_HELPER_FLAGS_4(gvec_vcvt_uh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
75
-DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
76
-DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
77
+DEF_HELPER_FLAGS_4(gvec_vcvt_sh, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
78
+DEF_HELPER_FLAGS_4(gvec_vcvt_uh, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
79
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hs, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
80
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hu, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
81
82
-DEF_HELPER_FLAGS_4(gvec_vcvt_sd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
83
-DEF_HELPER_FLAGS_4(gvec_vcvt_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
84
-DEF_HELPER_FLAGS_4(gvec_vcvt_rz_ds, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
85
-DEF_HELPER_FLAGS_4(gvec_vcvt_rz_du, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
86
+DEF_HELPER_FLAGS_4(gvec_vcvt_sd, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
87
+DEF_HELPER_FLAGS_4(gvec_vcvt_ud, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
88
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_ds, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
89
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_du, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
90
91
-DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
92
-DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
93
-DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
94
-DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
95
-DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
96
-DEF_HELPER_FLAGS_4(gvec_vcvt_rm_uh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
97
+DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sd, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
98
+DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ud, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
99
+DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
100
+DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
101
+DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sh, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
102
+DEF_HELPER_FLAGS_4(gvec_vcvt_rm_uh, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
103
104
-DEF_HELPER_FLAGS_4(gvec_vrint_rm_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
105
-DEF_HELPER_FLAGS_4(gvec_vrint_rm_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
106
+DEF_HELPER_FLAGS_4(gvec_vrint_rm_h, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
107
+DEF_HELPER_FLAGS_4(gvec_vrint_rm_s, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
108
109
-DEF_HELPER_FLAGS_4(gvec_vrintx_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
110
-DEF_HELPER_FLAGS_4(gvec_vrintx_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
111
+DEF_HELPER_FLAGS_4(gvec_vrintx_h, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
112
+DEF_HELPER_FLAGS_4(gvec_vrintx_s, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
113
114
-DEF_HELPER_FLAGS_4(gvec_frecpe_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
115
-DEF_HELPER_FLAGS_4(gvec_frecpe_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
116
-DEF_HELPER_FLAGS_4(gvec_frecpe_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
117
+DEF_HELPER_FLAGS_4(gvec_frecpe_h, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
118
+DEF_HELPER_FLAGS_4(gvec_frecpe_s, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
119
+DEF_HELPER_FLAGS_4(gvec_frecpe_d, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
120
121
-DEF_HELPER_FLAGS_4(gvec_frsqrte_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
122
-DEF_HELPER_FLAGS_4(gvec_frsqrte_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
123
-DEF_HELPER_FLAGS_4(gvec_frsqrte_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
124
+DEF_HELPER_FLAGS_4(gvec_frsqrte_h, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
125
+DEF_HELPER_FLAGS_4(gvec_frsqrte_s, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
126
+DEF_HELPER_FLAGS_4(gvec_frsqrte_d, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
127
128
-DEF_HELPER_FLAGS_4(gvec_fcgt0_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
129
-DEF_HELPER_FLAGS_4(gvec_fcgt0_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
130
-DEF_HELPER_FLAGS_4(gvec_fcgt0_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
131
+DEF_HELPER_FLAGS_4(gvec_fcgt0_h, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
132
+DEF_HELPER_FLAGS_4(gvec_fcgt0_s, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
133
+DEF_HELPER_FLAGS_4(gvec_fcgt0_d, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
134
135
-DEF_HELPER_FLAGS_4(gvec_fcge0_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
136
-DEF_HELPER_FLAGS_4(gvec_fcge0_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
137
-DEF_HELPER_FLAGS_4(gvec_fcge0_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
138
+DEF_HELPER_FLAGS_4(gvec_fcge0_h, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
139
+DEF_HELPER_FLAGS_4(gvec_fcge0_s, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
140
+DEF_HELPER_FLAGS_4(gvec_fcge0_d, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
141
142
-DEF_HELPER_FLAGS_4(gvec_fceq0_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
143
-DEF_HELPER_FLAGS_4(gvec_fceq0_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
144
-DEF_HELPER_FLAGS_4(gvec_fceq0_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
145
+DEF_HELPER_FLAGS_4(gvec_fceq0_h, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
146
+DEF_HELPER_FLAGS_4(gvec_fceq0_s, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
147
+DEF_HELPER_FLAGS_4(gvec_fceq0_d, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
148
149
-DEF_HELPER_FLAGS_4(gvec_fcle0_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
150
-DEF_HELPER_FLAGS_4(gvec_fcle0_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
151
-DEF_HELPER_FLAGS_4(gvec_fcle0_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
152
+DEF_HELPER_FLAGS_4(gvec_fcle0_h, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
153
+DEF_HELPER_FLAGS_4(gvec_fcle0_s, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
154
+DEF_HELPER_FLAGS_4(gvec_fcle0_d, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
155
156
-DEF_HELPER_FLAGS_4(gvec_fclt0_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
157
-DEF_HELPER_FLAGS_4(gvec_fclt0_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
158
-DEF_HELPER_FLAGS_4(gvec_fclt0_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
159
+DEF_HELPER_FLAGS_4(gvec_fclt0_h, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
160
+DEF_HELPER_FLAGS_4(gvec_fclt0_s, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
161
+DEF_HELPER_FLAGS_4(gvec_fclt0_d, TCG_CALL_NO_RWG, void, ptr, ptr, fpst, i32)
162
163
-DEF_HELPER_FLAGS_5(gvec_fadd_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
164
-DEF_HELPER_FLAGS_5(gvec_fadd_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
165
-DEF_HELPER_FLAGS_5(gvec_fadd_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
166
+DEF_HELPER_FLAGS_5(gvec_fadd_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
167
+DEF_HELPER_FLAGS_5(gvec_fadd_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
168
+DEF_HELPER_FLAGS_5(gvec_fadd_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
169
170
-DEF_HELPER_FLAGS_5(gvec_fsub_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
171
-DEF_HELPER_FLAGS_5(gvec_fsub_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
172
-DEF_HELPER_FLAGS_5(gvec_fsub_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
173
+DEF_HELPER_FLAGS_5(gvec_fsub_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
174
+DEF_HELPER_FLAGS_5(gvec_fsub_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
175
+DEF_HELPER_FLAGS_5(gvec_fsub_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
176
177
-DEF_HELPER_FLAGS_5(gvec_fmul_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
178
-DEF_HELPER_FLAGS_5(gvec_fmul_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
179
-DEF_HELPER_FLAGS_5(gvec_fmul_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
180
+DEF_HELPER_FLAGS_5(gvec_fmul_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
181
+DEF_HELPER_FLAGS_5(gvec_fmul_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
182
+DEF_HELPER_FLAGS_5(gvec_fmul_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
183
184
-DEF_HELPER_FLAGS_5(gvec_fabd_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
185
-DEF_HELPER_FLAGS_5(gvec_fabd_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
186
-DEF_HELPER_FLAGS_5(gvec_fabd_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
187
+DEF_HELPER_FLAGS_5(gvec_fabd_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
188
+DEF_HELPER_FLAGS_5(gvec_fabd_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
189
+DEF_HELPER_FLAGS_5(gvec_fabd_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
190
191
-DEF_HELPER_FLAGS_5(gvec_fceq_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
192
-DEF_HELPER_FLAGS_5(gvec_fceq_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
193
-DEF_HELPER_FLAGS_5(gvec_fceq_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
194
+DEF_HELPER_FLAGS_5(gvec_fceq_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
195
+DEF_HELPER_FLAGS_5(gvec_fceq_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
196
+DEF_HELPER_FLAGS_5(gvec_fceq_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
197
198
-DEF_HELPER_FLAGS_5(gvec_fcge_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
199
-DEF_HELPER_FLAGS_5(gvec_fcge_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
200
-DEF_HELPER_FLAGS_5(gvec_fcge_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
201
+DEF_HELPER_FLAGS_5(gvec_fcge_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
202
+DEF_HELPER_FLAGS_5(gvec_fcge_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
203
+DEF_HELPER_FLAGS_5(gvec_fcge_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
204
205
-DEF_HELPER_FLAGS_5(gvec_fcgt_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
206
-DEF_HELPER_FLAGS_5(gvec_fcgt_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
207
-DEF_HELPER_FLAGS_5(gvec_fcgt_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
208
+DEF_HELPER_FLAGS_5(gvec_fcgt_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
209
+DEF_HELPER_FLAGS_5(gvec_fcgt_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
210
+DEF_HELPER_FLAGS_5(gvec_fcgt_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
211
212
-DEF_HELPER_FLAGS_5(gvec_facge_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
213
-DEF_HELPER_FLAGS_5(gvec_facge_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
214
-DEF_HELPER_FLAGS_5(gvec_facge_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
215
+DEF_HELPER_FLAGS_5(gvec_facge_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
216
+DEF_HELPER_FLAGS_5(gvec_facge_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
217
+DEF_HELPER_FLAGS_5(gvec_facge_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
218
219
-DEF_HELPER_FLAGS_5(gvec_facgt_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
220
-DEF_HELPER_FLAGS_5(gvec_facgt_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
221
-DEF_HELPER_FLAGS_5(gvec_facgt_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
222
+DEF_HELPER_FLAGS_5(gvec_facgt_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
223
+DEF_HELPER_FLAGS_5(gvec_facgt_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
224
+DEF_HELPER_FLAGS_5(gvec_facgt_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
225
226
-DEF_HELPER_FLAGS_5(gvec_fmax_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
227
-DEF_HELPER_FLAGS_5(gvec_fmax_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
228
-DEF_HELPER_FLAGS_5(gvec_fmax_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
229
+DEF_HELPER_FLAGS_5(gvec_fmax_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
230
+DEF_HELPER_FLAGS_5(gvec_fmax_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
231
+DEF_HELPER_FLAGS_5(gvec_fmax_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
232
233
-DEF_HELPER_FLAGS_5(gvec_fmin_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
234
-DEF_HELPER_FLAGS_5(gvec_fmin_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
235
-DEF_HELPER_FLAGS_5(gvec_fmin_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
236
+DEF_HELPER_FLAGS_5(gvec_fmin_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
237
+DEF_HELPER_FLAGS_5(gvec_fmin_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
238
+DEF_HELPER_FLAGS_5(gvec_fmin_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
239
240
-DEF_HELPER_FLAGS_5(gvec_fmaxnum_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
241
-DEF_HELPER_FLAGS_5(gvec_fmaxnum_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
242
-DEF_HELPER_FLAGS_5(gvec_fmaxnum_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
243
+DEF_HELPER_FLAGS_5(gvec_fmaxnum_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
244
+DEF_HELPER_FLAGS_5(gvec_fmaxnum_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
245
+DEF_HELPER_FLAGS_5(gvec_fmaxnum_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
246
247
-DEF_HELPER_FLAGS_5(gvec_fminnum_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
248
-DEF_HELPER_FLAGS_5(gvec_fminnum_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
249
-DEF_HELPER_FLAGS_5(gvec_fminnum_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
250
+DEF_HELPER_FLAGS_5(gvec_fminnum_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
251
+DEF_HELPER_FLAGS_5(gvec_fminnum_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
252
+DEF_HELPER_FLAGS_5(gvec_fminnum_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
253
254
-DEF_HELPER_FLAGS_5(gvec_recps_nf_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
255
-DEF_HELPER_FLAGS_5(gvec_recps_nf_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
256
+DEF_HELPER_FLAGS_5(gvec_recps_nf_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
257
+DEF_HELPER_FLAGS_5(gvec_recps_nf_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
258
259
-DEF_HELPER_FLAGS_5(gvec_rsqrts_nf_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
260
-DEF_HELPER_FLAGS_5(gvec_rsqrts_nf_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
261
+DEF_HELPER_FLAGS_5(gvec_rsqrts_nf_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
262
+DEF_HELPER_FLAGS_5(gvec_rsqrts_nf_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
263
264
-DEF_HELPER_FLAGS_5(gvec_fmla_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
265
-DEF_HELPER_FLAGS_5(gvec_fmla_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
266
+DEF_HELPER_FLAGS_5(gvec_fmla_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
267
+DEF_HELPER_FLAGS_5(gvec_fmla_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
268
269
-DEF_HELPER_FLAGS_5(gvec_fmls_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
270
-DEF_HELPER_FLAGS_5(gvec_fmls_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
271
+DEF_HELPER_FLAGS_5(gvec_fmls_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
272
+DEF_HELPER_FLAGS_5(gvec_fmls_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
273
274
-DEF_HELPER_FLAGS_5(gvec_vfma_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
275
-DEF_HELPER_FLAGS_5(gvec_vfma_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
276
-DEF_HELPER_FLAGS_5(gvec_vfma_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
277
+DEF_HELPER_FLAGS_5(gvec_vfma_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
278
+DEF_HELPER_FLAGS_5(gvec_vfma_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
279
+DEF_HELPER_FLAGS_5(gvec_vfma_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
280
281
-DEF_HELPER_FLAGS_5(gvec_vfms_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
282
-DEF_HELPER_FLAGS_5(gvec_vfms_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
283
-DEF_HELPER_FLAGS_5(gvec_vfms_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
284
+DEF_HELPER_FLAGS_5(gvec_vfms_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
285
+DEF_HELPER_FLAGS_5(gvec_vfms_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
286
+DEF_HELPER_FLAGS_5(gvec_vfms_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
287
288
DEF_HELPER_FLAGS_5(gvec_ftsmul_h, TCG_CALL_NO_RWG,
289
- void, ptr, ptr, ptr, ptr, i32)
290
+ void, ptr, ptr, ptr, fpst, i32)
291
DEF_HELPER_FLAGS_5(gvec_ftsmul_s, TCG_CALL_NO_RWG,
292
- void, ptr, ptr, ptr, ptr, i32)
293
+ void, ptr, ptr, ptr, fpst, i32)
294
DEF_HELPER_FLAGS_5(gvec_ftsmul_d, TCG_CALL_NO_RWG,
295
- void, ptr, ptr, ptr, ptr, i32)
296
+ void, ptr, ptr, ptr, fpst, i32)
297
298
DEF_HELPER_FLAGS_5(gvec_fmul_idx_h, TCG_CALL_NO_RWG,
299
- void, ptr, ptr, ptr, ptr, i32)
300
+ void, ptr, ptr, ptr, fpst, i32)
301
DEF_HELPER_FLAGS_5(gvec_fmul_idx_s, TCG_CALL_NO_RWG,
302
- void, ptr, ptr, ptr, ptr, i32)
303
+ void, ptr, ptr, ptr, fpst, i32)
304
DEF_HELPER_FLAGS_5(gvec_fmul_idx_d, TCG_CALL_NO_RWG,
305
- void, ptr, ptr, ptr, ptr, i32)
306
+ void, ptr, ptr, ptr, fpst, i32)
307
308
DEF_HELPER_FLAGS_5(gvec_fmla_nf_idx_h, TCG_CALL_NO_RWG,
309
- void, ptr, ptr, ptr, ptr, i32)
310
+ void, ptr, ptr, ptr, fpst, i32)
311
DEF_HELPER_FLAGS_5(gvec_fmla_nf_idx_s, TCG_CALL_NO_RWG,
312
- void, ptr, ptr, ptr, ptr, i32)
313
+ void, ptr, ptr, ptr, fpst, i32)
314
315
DEF_HELPER_FLAGS_5(gvec_fmls_nf_idx_h, TCG_CALL_NO_RWG,
316
- void, ptr, ptr, ptr, ptr, i32)
317
+ void, ptr, ptr, ptr, fpst, i32)
318
DEF_HELPER_FLAGS_5(gvec_fmls_nf_idx_s, TCG_CALL_NO_RWG,
319
- void, ptr, ptr, ptr, ptr, i32)
320
+ void, ptr, ptr, ptr, fpst, i32)
321
322
DEF_HELPER_FLAGS_6(gvec_fmla_idx_h, TCG_CALL_NO_RWG,
323
- void, ptr, ptr, ptr, ptr, ptr, i32)
324
+ void, ptr, ptr, ptr, ptr, fpst, i32)
325
DEF_HELPER_FLAGS_6(gvec_fmla_idx_s, TCG_CALL_NO_RWG,
326
- void, ptr, ptr, ptr, ptr, ptr, i32)
327
+ void, ptr, ptr, ptr, ptr, fpst, i32)
328
DEF_HELPER_FLAGS_6(gvec_fmla_idx_d, TCG_CALL_NO_RWG,
329
- void, ptr, ptr, ptr, ptr, ptr, i32)
330
+ void, ptr, ptr, ptr, ptr, fpst, i32)
331
332
DEF_HELPER_FLAGS_5(gvec_uqadd_b, TCG_CALL_NO_RWG,
333
void, ptr, ptr, ptr, ptr, i32)
334
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_6(gvec_bfmmla, TCG_CALL_NO_RWG,
335
void, ptr, ptr, ptr, ptr, env, i32)
336
337
DEF_HELPER_FLAGS_6(gvec_bfmlal, TCG_CALL_NO_RWG,
338
- void, ptr, ptr, ptr, ptr, ptr, i32)
339
+ void, ptr, ptr, ptr, ptr, fpst, i32)
340
DEF_HELPER_FLAGS_6(gvec_bfmlal_idx, TCG_CALL_NO_RWG,
341
- void, ptr, ptr, ptr, ptr, ptr, i32)
342
+ void, ptr, ptr, ptr, ptr, fpst, i32)
343
344
DEF_HELPER_FLAGS_5(gvec_sclamp_b, TCG_CALL_NO_RWG,
345
void, ptr, ptr, ptr, ptr, i32)
346
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(gvec_uclamp_s, TCG_CALL_NO_RWG,
347
DEF_HELPER_FLAGS_5(gvec_uclamp_d, TCG_CALL_NO_RWG,
348
void, ptr, ptr, ptr, ptr, i32)
349
350
-DEF_HELPER_FLAGS_5(gvec_faddp_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
351
-DEF_HELPER_FLAGS_5(gvec_faddp_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
352
-DEF_HELPER_FLAGS_5(gvec_faddp_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
353
+DEF_HELPER_FLAGS_5(gvec_faddp_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
354
+DEF_HELPER_FLAGS_5(gvec_faddp_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
355
+DEF_HELPER_FLAGS_5(gvec_faddp_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
356
357
-DEF_HELPER_FLAGS_5(gvec_fmaxp_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
358
-DEF_HELPER_FLAGS_5(gvec_fmaxp_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
359
-DEF_HELPER_FLAGS_5(gvec_fmaxp_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
360
+DEF_HELPER_FLAGS_5(gvec_fmaxp_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
361
+DEF_HELPER_FLAGS_5(gvec_fmaxp_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
362
+DEF_HELPER_FLAGS_5(gvec_fmaxp_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
363
364
-DEF_HELPER_FLAGS_5(gvec_fminp_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
365
-DEF_HELPER_FLAGS_5(gvec_fminp_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
366
-DEF_HELPER_FLAGS_5(gvec_fminp_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
367
+DEF_HELPER_FLAGS_5(gvec_fminp_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
368
+DEF_HELPER_FLAGS_5(gvec_fminp_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
369
+DEF_HELPER_FLAGS_5(gvec_fminp_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
370
371
-DEF_HELPER_FLAGS_5(gvec_fmaxnump_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
372
-DEF_HELPER_FLAGS_5(gvec_fmaxnump_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
373
-DEF_HELPER_FLAGS_5(gvec_fmaxnump_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
374
+DEF_HELPER_FLAGS_5(gvec_fmaxnump_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
375
+DEF_HELPER_FLAGS_5(gvec_fmaxnump_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
376
+DEF_HELPER_FLAGS_5(gvec_fmaxnump_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
377
378
-DEF_HELPER_FLAGS_5(gvec_fminnump_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
379
-DEF_HELPER_FLAGS_5(gvec_fminnump_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
380
-DEF_HELPER_FLAGS_5(gvec_fminnump_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
381
+DEF_HELPER_FLAGS_5(gvec_fminnump_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
382
+DEF_HELPER_FLAGS_5(gvec_fminnump_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
383
+DEF_HELPER_FLAGS_5(gvec_fminnump_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
384
385
DEF_HELPER_FLAGS_4(gvec_addp_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
386
DEF_HELPER_FLAGS_4(gvec_addp_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
387
diff --git a/target/arm/tcg/helper-a64.h b/target/arm/tcg/helper-a64.h
388
index XXXXXXX..XXXXXXX 100644
389
--- a/target/arm/tcg/helper-a64.h
390
+++ b/target/arm/tcg/helper-a64.h
391
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_4(cpyfe, void, env, i32, i32, i32)
392
DEF_HELPER_FLAGS_1(guarded_page_check, TCG_CALL_NO_WG, void, env)
393
DEF_HELPER_FLAGS_2(guarded_page_br, TCG_CALL_NO_RWG, void, env, tl)
394
395
-DEF_HELPER_FLAGS_5(gvec_fdiv_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
396
-DEF_HELPER_FLAGS_5(gvec_fdiv_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
397
-DEF_HELPER_FLAGS_5(gvec_fdiv_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
398
+DEF_HELPER_FLAGS_5(gvec_fdiv_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
399
+DEF_HELPER_FLAGS_5(gvec_fdiv_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
400
+DEF_HELPER_FLAGS_5(gvec_fdiv_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
401
402
-DEF_HELPER_FLAGS_5(gvec_fmulx_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
403
-DEF_HELPER_FLAGS_5(gvec_fmulx_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
404
-DEF_HELPER_FLAGS_5(gvec_fmulx_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
405
+DEF_HELPER_FLAGS_5(gvec_fmulx_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
406
+DEF_HELPER_FLAGS_5(gvec_fmulx_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
407
+DEF_HELPER_FLAGS_5(gvec_fmulx_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
408
409
-DEF_HELPER_FLAGS_5(gvec_fmulx_idx_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
410
-DEF_HELPER_FLAGS_5(gvec_fmulx_idx_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
411
-DEF_HELPER_FLAGS_5(gvec_fmulx_idx_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
412
+DEF_HELPER_FLAGS_5(gvec_fmulx_idx_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
413
+DEF_HELPER_FLAGS_5(gvec_fmulx_idx_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
414
+DEF_HELPER_FLAGS_5(gvec_fmulx_idx_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
415
diff --git a/target/arm/tcg/helper-sve.h b/target/arm/tcg/helper-sve.h
416
index XXXXXXX..XXXXXXX 100644
417
--- a/target/arm/tcg/helper-sve.h
418
+++ b/target/arm/tcg/helper-sve.h
419
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(sve_umini_s, TCG_CALL_NO_RWG, void, ptr, ptr, i64, i32)
420
DEF_HELPER_FLAGS_4(sve_umini_d, TCG_CALL_NO_RWG, void, ptr, ptr, i64, i32)
421
422
DEF_HELPER_FLAGS_5(gvec_recps_h, TCG_CALL_NO_RWG,
423
- void, ptr, ptr, ptr, ptr, i32)
424
+ void, ptr, ptr, ptr, fpst, i32)
425
DEF_HELPER_FLAGS_5(gvec_recps_s, TCG_CALL_NO_RWG,
426
- void, ptr, ptr, ptr, ptr, i32)
427
+ void, ptr, ptr, ptr, fpst, i32)
428
DEF_HELPER_FLAGS_5(gvec_recps_d, TCG_CALL_NO_RWG,
429
- void, ptr, ptr, ptr, ptr, i32)
430
+ void, ptr, ptr, ptr, fpst, i32)
431
432
DEF_HELPER_FLAGS_5(gvec_rsqrts_h, TCG_CALL_NO_RWG,
433
- void, ptr, ptr, ptr, ptr, i32)
434
+ void, ptr, ptr, ptr, fpst, i32)
435
DEF_HELPER_FLAGS_5(gvec_rsqrts_s, TCG_CALL_NO_RWG,
436
- void, ptr, ptr, ptr, ptr, i32)
437
+ void, ptr, ptr, ptr, fpst, i32)
438
DEF_HELPER_FLAGS_5(gvec_rsqrts_d, TCG_CALL_NO_RWG,
439
- void, ptr, ptr, ptr, ptr, i32)
440
+ void, ptr, ptr, ptr, fpst, i32)
441
442
DEF_HELPER_FLAGS_4(sve_faddv_h, TCG_CALL_NO_RWG,
443
i64, ptr, ptr, ptr, i32)
444
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
445
index XXXXXXX..XXXXXXX 100644
446
--- a/target/arm/tcg/vec_helper.c
447
+++ b/target/arm/tcg/vec_helper.c
448
@@ -XXX,XX +XXX,XX @@ DO_DOT_IDX(gvec_sdot_idx_h, int64_t, int16_t, int16_t, H8)
449
DO_DOT_IDX(gvec_udot_idx_h, uint64_t, uint16_t, uint16_t, H8)
450
451
void HELPER(gvec_fcaddh)(void *vd, void *vn, void *vm,
452
- void *vfpst, uint32_t desc)
453
+ float_status *fpst, uint32_t desc)
454
{
455
uintptr_t opr_sz = simd_oprsz(desc);
456
float16 *d = vd;
457
float16 *n = vn;
458
float16 *m = vm;
459
- float_status *fpst = vfpst;
460
uint32_t neg_real = extract32(desc, SIMD_DATA_SHIFT, 1);
461
uint32_t neg_imag = neg_real ^ 1;
462
uintptr_t i;
463
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_fcaddh)(void *vd, void *vn, void *vm,
464
}
465
466
void HELPER(gvec_fcadds)(void *vd, void *vn, void *vm,
467
- void *vfpst, uint32_t desc)
468
+ float_status *fpst, uint32_t desc)
469
{
470
uintptr_t opr_sz = simd_oprsz(desc);
471
float32 *d = vd;
472
float32 *n = vn;
473
float32 *m = vm;
474
- float_status *fpst = vfpst;
475
uint32_t neg_real = extract32(desc, SIMD_DATA_SHIFT, 1);
476
uint32_t neg_imag = neg_real ^ 1;
477
uintptr_t i;
478
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_fcadds)(void *vd, void *vn, void *vm,
479
}
480
481
void HELPER(gvec_fcaddd)(void *vd, void *vn, void *vm,
482
- void *vfpst, uint32_t desc)
483
+ float_status *fpst, uint32_t desc)
484
{
485
uintptr_t opr_sz = simd_oprsz(desc);
486
float64 *d = vd;
487
float64 *n = vn;
488
float64 *m = vm;
489
- float_status *fpst = vfpst;
490
uint64_t neg_real = extract64(desc, SIMD_DATA_SHIFT, 1);
491
uint64_t neg_imag = neg_real ^ 1;
492
uintptr_t i;
493
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_fcaddd)(void *vd, void *vn, void *vm,
494
}
495
496
void HELPER(gvec_fcmlah)(void *vd, void *vn, void *vm, void *va,
497
- void *vfpst, uint32_t desc)
498
+ float_status *fpst, uint32_t desc)
499
{
500
uintptr_t opr_sz = simd_oprsz(desc);
501
float16 *d = vd, *n = vn, *m = vm, *a = va;
502
- float_status *fpst = vfpst;
503
intptr_t flip = extract32(desc, SIMD_DATA_SHIFT, 1);
504
uint32_t neg_imag = extract32(desc, SIMD_DATA_SHIFT + 1, 1);
505
uint32_t neg_real = flip ^ neg_imag;
506
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_fcmlah)(void *vd, void *vn, void *vm, void *va,
507
}
508
509
void HELPER(gvec_fcmlah_idx)(void *vd, void *vn, void *vm, void *va,
510
- void *vfpst, uint32_t desc)
511
+ float_status *fpst, uint32_t desc)
512
{
513
uintptr_t opr_sz = simd_oprsz(desc);
514
float16 *d = vd, *n = vn, *m = vm, *a = va;
515
- float_status *fpst = vfpst;
516
intptr_t flip = extract32(desc, SIMD_DATA_SHIFT, 1);
517
uint32_t neg_imag = extract32(desc, SIMD_DATA_SHIFT + 1, 1);
518
intptr_t index = extract32(desc, SIMD_DATA_SHIFT + 2, 2);
519
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_fcmlah_idx)(void *vd, void *vn, void *vm, void *va,
520
}
521
522
void HELPER(gvec_fcmlas)(void *vd, void *vn, void *vm, void *va,
523
- void *vfpst, uint32_t desc)
524
+ float_status *fpst, uint32_t desc)
525
{
526
uintptr_t opr_sz = simd_oprsz(desc);
527
float32 *d = vd, *n = vn, *m = vm, *a = va;
528
- float_status *fpst = vfpst;
529
intptr_t flip = extract32(desc, SIMD_DATA_SHIFT, 1);
530
uint32_t neg_imag = extract32(desc, SIMD_DATA_SHIFT + 1, 1);
531
uint32_t neg_real = flip ^ neg_imag;
532
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_fcmlas)(void *vd, void *vn, void *vm, void *va,
533
}
534
535
void HELPER(gvec_fcmlas_idx)(void *vd, void *vn, void *vm, void *va,
536
- void *vfpst, uint32_t desc)
537
+ float_status *fpst, uint32_t desc)
538
{
539
uintptr_t opr_sz = simd_oprsz(desc);
540
float32 *d = vd, *n = vn, *m = vm, *a = va;
541
- float_status *fpst = vfpst;
542
intptr_t flip = extract32(desc, SIMD_DATA_SHIFT, 1);
543
uint32_t neg_imag = extract32(desc, SIMD_DATA_SHIFT + 1, 1);
544
intptr_t index = extract32(desc, SIMD_DATA_SHIFT + 2, 2);
545
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_fcmlas_idx)(void *vd, void *vn, void *vm, void *va,
546
}
547
548
void HELPER(gvec_fcmlad)(void *vd, void *vn, void *vm, void *va,
549
- void *vfpst, uint32_t desc)
550
+ float_status *fpst, uint32_t desc)
551
{
552
uintptr_t opr_sz = simd_oprsz(desc);
553
float64 *d = vd, *n = vn, *m = vm, *a = va;
554
- float_status *fpst = vfpst;
555
intptr_t flip = extract32(desc, SIMD_DATA_SHIFT, 1);
556
uint64_t neg_imag = extract32(desc, SIMD_DATA_SHIFT + 1, 1);
557
uint64_t neg_real = flip ^ neg_imag;
558
@@ -XXX,XX +XXX,XX @@ static uint64_t float64_acgt(float64 op1, float64 op2, float_status *stat)
559
return -float64_lt(float64_abs(op2), float64_abs(op1), stat);
560
}
561
562
-static int16_t vfp_tosszh(float16 x, void *fpstp)
563
+static int16_t vfp_tosszh(float16 x, float_status *fpst)
564
{
565
- float_status *fpst = fpstp;
566
if (float16_is_any_nan(x)) {
567
float_raise(float_flag_invalid, fpst);
568
return 0;
569
@@ -XXX,XX +XXX,XX @@ static int16_t vfp_tosszh(float16 x, void *fpstp)
570
return float16_to_int16_round_to_zero(x, fpst);
571
}
572
573
-static uint16_t vfp_touszh(float16 x, void *fpstp)
574
+static uint16_t vfp_touszh(float16 x, float_status *fpst)
575
{
576
- float_status *fpst = fpstp;
577
if (float16_is_any_nan(x)) {
578
float_raise(float_flag_invalid, fpst);
579
return 0;
580
@@ -XXX,XX +XXX,XX @@ static uint16_t vfp_touszh(float16 x, void *fpstp)
581
}
582
583
#define DO_2OP(NAME, FUNC, TYPE) \
584
-void HELPER(NAME)(void *vd, void *vn, void *stat, uint32_t desc) \
585
+void HELPER(NAME)(void *vd, void *vn, float_status *stat, uint32_t desc) \
586
{ \
587
intptr_t i, oprsz = simd_oprsz(desc); \
588
TYPE *d = vd, *n = vn; \
589
@@ -XXX,XX +XXX,XX @@ static float32 float32_rsqrts_nf(float32 op1, float32 op2, float_status *stat)
590
}
591
592
#define DO_3OP(NAME, FUNC, TYPE) \
593
-void HELPER(NAME)(void *vd, void *vn, void *vm, void *stat, uint32_t desc) \
594
+void HELPER(NAME)(void *vd, void *vn, void *vm, \
595
+ float_status *stat, uint32_t desc) \
596
{ \
597
intptr_t i, oprsz = simd_oprsz(desc); \
598
TYPE *d = vd, *n = vn, *m = vm; \
599
@@ -XXX,XX +XXX,XX @@ static float64 float64_mulsub_f(float64 dest, float64 op1, float64 op2,
600
return float64_muladd(float64_chs(op1), op2, dest, 0, stat);
601
}
602
603
-#define DO_MULADD(NAME, FUNC, TYPE) \
604
-void HELPER(NAME)(void *vd, void *vn, void *vm, void *stat, uint32_t desc) \
605
+#define DO_MULADD(NAME, FUNC, TYPE) \
606
+void HELPER(NAME)(void *vd, void *vn, void *vm, \
607
+ float_status *stat, uint32_t desc) \
608
{ \
609
intptr_t i, oprsz = simd_oprsz(desc); \
610
TYPE *d = vd, *n = vn, *m = vm; \
611
@@ -XXX,XX +XXX,XX @@ DO_MLA_IDX(gvec_mls_idx_d, uint64_t, -, H8)
612
#undef DO_MLA_IDX
613
614
#define DO_FMUL_IDX(NAME, ADD, MUL, TYPE, H) \
615
-void HELPER(NAME)(void *vd, void *vn, void *vm, void *stat, uint32_t desc) \
616
+void HELPER(NAME)(void *vd, void *vn, void *vm, \
617
+ float_status *stat, uint32_t desc) \
618
{ \
619
intptr_t i, j, oprsz = simd_oprsz(desc); \
620
intptr_t segment = MIN(16, oprsz) / sizeof(TYPE); \
621
@@ -XXX,XX +XXX,XX @@ DO_FMUL_IDX(gvec_fmls_nf_idx_s, float32_sub, float32_mul, float32, H4)
622
623
#define DO_FMLA_IDX(NAME, TYPE, H) \
624
void HELPER(NAME)(void *vd, void *vn, void *vm, void *va, \
625
- void *stat, uint32_t desc) \
626
+ float_status *stat, uint32_t desc) \
627
{ \
628
intptr_t i, j, oprsz = simd_oprsz(desc); \
629
intptr_t segment = MIN(16, oprsz) / sizeof(TYPE); \
630
@@ -XXX,XX +XXX,XX @@ DO_ABA(gvec_uaba_d, uint64_t)
631
#undef DO_ABA
632
633
#define DO_3OP_PAIR(NAME, FUNC, TYPE, H) \
634
-void HELPER(NAME)(void *vd, void *vn, void *vm, void *stat, uint32_t desc) \
635
+void HELPER(NAME)(void *vd, void *vn, void *vm, \
636
+ float_status *stat, uint32_t desc) \
637
{ \
638
ARMVectorReg scratch; \
639
intptr_t oprsz = simd_oprsz(desc); \
640
@@ -XXX,XX +XXX,XX @@ DO_3OP_PAIR(gvec_uminp_s, MIN, uint32_t, H4)
641
#undef DO_3OP_PAIR
642
643
#define DO_VCVT_FIXED(NAME, FUNC, TYPE) \
644
- void HELPER(NAME)(void *vd, void *vn, void *stat, uint32_t desc) \
645
+ void HELPER(NAME)(void *vd, void *vn, float_status *stat, uint32_t desc) \
646
{ \
647
intptr_t i, oprsz = simd_oprsz(desc); \
648
int shift = simd_data(desc); \
649
@@ -XXX,XX +XXX,XX @@ DO_VCVT_FIXED(gvec_vcvt_rz_hu, helper_vfp_touhh_round_to_zero, uint16_t)
650
#undef DO_VCVT_FIXED
651
652
#define DO_VCVT_RMODE(NAME, FUNC, TYPE) \
653
- void HELPER(NAME)(void *vd, void *vn, void *stat, uint32_t desc) \
654
+ void HELPER(NAME)(void *vd, void *vn, float_status *fpst, uint32_t desc) \
655
{ \
656
- float_status *fpst = stat; \
657
intptr_t i, oprsz = simd_oprsz(desc); \
658
uint32_t rmode = simd_data(desc); \
659
uint32_t prev_rmode = get_float_rounding_mode(fpst); \
660
@@ -XXX,XX +XXX,XX @@ DO_VCVT_RMODE(gvec_vcvt_rm_uh, helper_vfp_touhh, uint16_t)
661
#undef DO_VCVT_RMODE
662
663
#define DO_VRINT_RMODE(NAME, FUNC, TYPE) \
664
- void HELPER(NAME)(void *vd, void *vn, void *stat, uint32_t desc) \
665
+ void HELPER(NAME)(void *vd, void *vn, float_status *fpst, uint32_t desc) \
666
{ \
667
- float_status *fpst = stat; \
668
intptr_t i, oprsz = simd_oprsz(desc); \
669
uint32_t rmode = simd_data(desc); \
670
uint32_t prev_rmode = get_float_rounding_mode(fpst); \
671
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_bfmmla)(void *vd, void *vn, void *vm, void *va,
672
}
673
674
void HELPER(gvec_bfmlal)(void *vd, void *vn, void *vm, void *va,
675
- void *stat, uint32_t desc)
676
+ float_status *stat, uint32_t desc)
677
{
678
intptr_t i, opr_sz = simd_oprsz(desc);
679
intptr_t sel = simd_data(desc);
680
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_bfmlal)(void *vd, void *vn, void *vm, void *va,
681
}
682
683
void HELPER(gvec_bfmlal_idx)(void *vd, void *vn, void *vm,
684
- void *va, void *stat, uint32_t desc)
685
+ void *va, float_status *stat, uint32_t desc)
686
{
687
intptr_t i, j, opr_sz = simd_oprsz(desc);
688
intptr_t sel = extract32(desc, SIMD_DATA_SHIFT, 1);
29
--
689
--
30
2.20.1
690
2.34.1
31
691
32
692
diff view generated by jsdifflib
1
From: Julia Suvorova <jusual@mail.ru>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Using of global_qtest is not required here. Let's replace functions like
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
readl() with the corresponding qtest_* counterparts.
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
5
Message-id: 20241206031224.78525-6-richard.henderson@linaro.org
6
Signed-off-by: Julia Suvorova <jusual@mail.ru>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Acked-by: Thomas Huth <thuth@redhat.com>
9
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
10
Message-id: 20190123120759.7162-3-jusual@mail.ru
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
7
---
13
tests/microbit-test.c | 247 ++++++++++++++++++++++--------------------
8
target/arm/helper.h | 14 +++++++-------
14
1 file changed, 129 insertions(+), 118 deletions(-)
9
target/arm/tcg/neon_helper.c | 21 +++++++--------------
10
2 files changed, 14 insertions(+), 21 deletions(-)
15
11
16
diff --git a/tests/microbit-test.c b/tests/microbit-test.c
12
diff --git a/target/arm/helper.h b/target/arm/helper.h
17
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
18
--- a/tests/microbit-test.c
14
--- a/target/arm/helper.h
19
+++ b/tests/microbit-test.c
15
+++ b/target/arm/helper.h
20
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(neon_qneg_s16, TCG_CALL_NO_RWG, i32, env, i32)
21
#include "hw/i2c/microbit_i2c.h"
17
DEF_HELPER_FLAGS_2(neon_qneg_s32, TCG_CALL_NO_RWG, i32, env, i32)
22
18
DEF_HELPER_FLAGS_2(neon_qneg_s64, TCG_CALL_NO_RWG, i64, env, i64)
23
/* Read a byte from I2C device at @addr from register @reg */
19
24
-static uint32_t i2c_read_byte(uint32_t addr, uint32_t reg)
20
-DEF_HELPER_3(neon_ceq_f32, i32, i32, i32, ptr)
25
+static uint32_t i2c_read_byte(QTestState *qts, uint32_t addr, uint32_t reg)
21
-DEF_HELPER_3(neon_cge_f32, i32, i32, i32, ptr)
22
-DEF_HELPER_3(neon_cgt_f32, i32, i32, i32, ptr)
23
-DEF_HELPER_3(neon_acge_f32, i32, i32, i32, ptr)
24
-DEF_HELPER_3(neon_acgt_f32, i32, i32, i32, ptr)
25
-DEF_HELPER_3(neon_acge_f64, i64, i64, i64, ptr)
26
-DEF_HELPER_3(neon_acgt_f64, i64, i64, i64, ptr)
27
+DEF_HELPER_3(neon_ceq_f32, i32, i32, i32, fpst)
28
+DEF_HELPER_3(neon_cge_f32, i32, i32, i32, fpst)
29
+DEF_HELPER_3(neon_cgt_f32, i32, i32, i32, fpst)
30
+DEF_HELPER_3(neon_acge_f32, i32, i32, i32, fpst)
31
+DEF_HELPER_3(neon_acgt_f32, i32, i32, i32, fpst)
32
+DEF_HELPER_3(neon_acge_f64, i64, i64, i64, fpst)
33
+DEF_HELPER_3(neon_acgt_f64, i64, i64, i64, fpst)
34
35
/* iwmmxt_helper.c */
36
DEF_HELPER_2(iwmmxt_maddsq, i64, i64, i64)
37
diff --git a/target/arm/tcg/neon_helper.c b/target/arm/tcg/neon_helper.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/tcg/neon_helper.c
40
+++ b/target/arm/tcg/neon_helper.c
41
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_qneg_s64)(CPUARMState *env, uint64_t x)
42
* Note that EQ doesn't signal InvalidOp for QNaNs but GE and GT do.
43
* Softfloat routines return 0/1, which we convert to the 0/-1 Neon requires.
44
*/
45
-uint32_t HELPER(neon_ceq_f32)(uint32_t a, uint32_t b, void *fpstp)
46
+uint32_t HELPER(neon_ceq_f32)(uint32_t a, uint32_t b, float_status *fpst)
26
{
47
{
27
uint32_t val;
48
- float_status *fpst = fpstp;
28
49
return -float32_eq_quiet(make_float32(a), make_float32(b), fpst);
29
- writel(NRF51_TWI_BASE + NRF51_TWI_REG_ADDRESS, addr);
30
- writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STARTTX, 1);
31
- writel(NRF51_TWI_BASE + NRF51_TWI_REG_TXD, reg);
32
- val = readl(NRF51_TWI_BASE + NRF51_TWI_EVENT_TXDSENT);
33
+ qtest_writel(qts, NRF51_TWI_BASE + NRF51_TWI_REG_ADDRESS, addr);
34
+ qtest_writel(qts, NRF51_TWI_BASE + NRF51_TWI_TASK_STARTTX, 1);
35
+ qtest_writel(qts, NRF51_TWI_BASE + NRF51_TWI_REG_TXD, reg);
36
+ val = qtest_readl(qts, NRF51_TWI_BASE + NRF51_TWI_EVENT_TXDSENT);
37
g_assert_cmpuint(val, ==, 1);
38
- writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STOP, 1);
39
+ qtest_writel(qts, NRF51_TWI_BASE + NRF51_TWI_TASK_STOP, 1);
40
41
- writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STARTRX, 1);
42
- val = readl(NRF51_TWI_BASE + NRF51_TWI_EVENT_RXDREADY);
43
+ qtest_writel(qts, NRF51_TWI_BASE + NRF51_TWI_TASK_STARTRX, 1);
44
+ val = qtest_readl(qts, NRF51_TWI_BASE + NRF51_TWI_EVENT_RXDREADY);
45
g_assert_cmpuint(val, ==, 1);
46
- val = readl(NRF51_TWI_BASE + NRF51_TWI_REG_RXD);
47
- writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STOP, 1);
48
+ val = qtest_readl(qts, NRF51_TWI_BASE + NRF51_TWI_REG_RXD);
49
+ qtest_writel(qts, NRF51_TWI_BASE + NRF51_TWI_TASK_STOP, 1);
50
51
return val;
52
}
50
}
53
@@ -XXX,XX +XXX,XX @@ static uint32_t i2c_read_byte(uint32_t addr, uint32_t reg)
51
54
static void test_microbit_i2c(void)
52
-uint32_t HELPER(neon_cge_f32)(uint32_t a, uint32_t b, void *fpstp)
53
+uint32_t HELPER(neon_cge_f32)(uint32_t a, uint32_t b, float_status *fpst)
55
{
54
{
56
uint32_t val;
55
- float_status *fpst = fpstp;
57
+ QTestState *qts = qtest_init("-M microbit");
56
return -float32_le(make_float32(b), make_float32(a), fpst);
58
59
/* We don't program pins/irqs but at least enable the device */
60
- writel(NRF51_TWI_BASE + NRF51_TWI_REG_ENABLE, 5);
61
+ qtest_writel(qts, NRF51_TWI_BASE + NRF51_TWI_REG_ENABLE, 5);
62
63
/* MMA8653 magnetometer detection */
64
- val = i2c_read_byte(0x3A, 0x0D);
65
+ val = i2c_read_byte(qts, 0x3A, 0x0D);
66
g_assert_cmpuint(val, ==, 0x5A);
67
68
- val = i2c_read_byte(0x3A, 0x0D);
69
+ val = i2c_read_byte(qts, 0x3A, 0x0D);
70
g_assert_cmpuint(val, ==, 0x5A);
71
72
/* LSM303 accelerometer detection */
73
- val = i2c_read_byte(0x3C, 0x4F);
74
+ val = i2c_read_byte(qts, 0x3C, 0x4F);
75
g_assert_cmpuint(val, ==, 0x40);
76
77
- writel(NRF51_TWI_BASE + NRF51_TWI_REG_ENABLE, 0);
78
+ qtest_writel(qts, NRF51_TWI_BASE + NRF51_TWI_REG_ENABLE, 0);
79
+
80
+ qtest_quit(qts);
81
}
57
}
82
58
83
static void test_nrf51_gpio(void)
59
-uint32_t HELPER(neon_cgt_f32)(uint32_t a, uint32_t b, void *fpstp)
84
@@ -XXX,XX +XXX,XX @@ static void test_nrf51_gpio(void)
60
+uint32_t HELPER(neon_cgt_f32)(uint32_t a, uint32_t b, float_status *fpst)
85
{NRF51_GPIO_REG_DIRCLR, 0x00000000}
61
{
86
};
62
- float_status *fpst = fpstp;
87
63
return -float32_lt(make_float32(b), make_float32(a), fpst);
88
+ QTestState *qts = qtest_init("-M microbit");
89
+
90
/* Check reset state */
91
for (i = 0; i < ARRAY_SIZE(reset_state); i++) {
92
expected = reset_state[i].expected;
93
- actual = readl(NRF51_GPIO_BASE + reset_state[i].addr);
94
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + reset_state[i].addr);
95
g_assert_cmpuint(actual, ==, expected);
96
}
97
98
for (i = 0; i < NRF51_GPIO_PINS; i++) {
99
expected = 0x00000002;
100
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START + i * 4);
101
+ actual = qtest_readl(qts, NRF51_GPIO_BASE +
102
+ NRF51_GPIO_REG_CNF_START + i * 4);
103
g_assert_cmpuint(actual, ==, expected);
104
}
105
106
/* Check dir bit consistency between dir and cnf */
107
/* Check set via DIRSET */
108
expected = 0x80000001;
109
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIRSET, expected);
110
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR);
111
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_DIRSET, expected);
112
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR);
113
g_assert_cmpuint(actual, ==, expected);
114
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START) & 0x01;
115
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START)
116
+ & 0x01;
117
g_assert_cmpuint(actual, ==, 0x01);
118
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_END) & 0x01;
119
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_END) & 0x01;
120
g_assert_cmpuint(actual, ==, 0x01);
121
122
/* Check clear via DIRCLR */
123
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIRCLR, 0x80000001);
124
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR);
125
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_DIRCLR, 0x80000001);
126
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR);
127
g_assert_cmpuint(actual, ==, 0x00000000);
128
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START) & 0x01;
129
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START)
130
+ & 0x01;
131
g_assert_cmpuint(actual, ==, 0x00);
132
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_END) & 0x01;
133
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_END) & 0x01;
134
g_assert_cmpuint(actual, ==, 0x00);
135
136
/* Check set via DIR */
137
expected = 0x80000001;
138
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR, expected);
139
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR);
140
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR, expected);
141
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR);
142
g_assert_cmpuint(actual, ==, expected);
143
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START) & 0x01;
144
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START)
145
+ & 0x01;
146
g_assert_cmpuint(actual, ==, 0x01);
147
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_END) & 0x01;
148
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_END) & 0x01;
149
g_assert_cmpuint(actual, ==, 0x01);
150
151
/* Reset DIR */
152
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR, 0x00000000);
153
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_DIR, 0x00000000);
154
155
/* Check Input propagates */
156
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x00);
157
- qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, 0);
158
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
159
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x00);
160
+ qtest_set_irq_in(qts, "/machine/nrf51", "unnamed-gpio-in", 0, 0);
161
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
162
g_assert_cmpuint(actual, ==, 0x00);
163
- qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, 1);
164
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
165
+ qtest_set_irq_in(qts, "/machine/nrf51", "unnamed-gpio-in", 0, 1);
166
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
167
g_assert_cmpuint(actual, ==, 0x01);
168
- qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, -1);
169
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
170
+ qtest_set_irq_in(qts, "/machine/nrf51", "unnamed-gpio-in", 0, -1);
171
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
172
g_assert_cmpuint(actual, ==, 0x01);
173
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x02);
174
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x02);
175
176
/* Check pull-up working */
177
- qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, 0);
178
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0000);
179
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
180
+ qtest_set_irq_in(qts, "/machine/nrf51", "unnamed-gpio-in", 0, 0);
181
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0000);
182
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
183
g_assert_cmpuint(actual, ==, 0x00);
184
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b1110);
185
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
186
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b1110);
187
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
188
g_assert_cmpuint(actual, ==, 0x01);
189
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x02);
190
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x02);
191
192
/* Check pull-down working */
193
- qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, 1);
194
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0000);
195
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
196
+ qtest_set_irq_in(qts, "/machine/nrf51", "unnamed-gpio-in", 0, 1);
197
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0000);
198
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
199
g_assert_cmpuint(actual, ==, 0x01);
200
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0110);
201
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
202
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0110);
203
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
204
g_assert_cmpuint(actual, ==, 0x00);
205
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x02);
206
- qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, -1);
207
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0x02);
208
+ qtest_set_irq_in(qts, "/machine/nrf51", "unnamed-gpio-in", 0, -1);
209
210
/* Check Output propagates */
211
- irq_intercept_out("/machine/nrf51");
212
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0011);
213
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTSET, 0x01);
214
- g_assert_true(get_irq(0));
215
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTCLR, 0x01);
216
- g_assert_false(get_irq(0));
217
+ qtest_irq_intercept_out(qts, "/machine/nrf51");
218
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b0011);
219
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTSET, 0x01);
220
+ g_assert_true(qtest_get_irq(qts, 0));
221
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTCLR, 0x01);
222
+ g_assert_false(qtest_get_irq(qts, 0));
223
224
/* Check self-stimulation */
225
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b01);
226
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTSET, 0x01);
227
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
228
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b01);
229
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTSET, 0x01);
230
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
231
g_assert_cmpuint(actual, ==, 0x01);
232
233
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTCLR, 0x01);
234
- actual = readl(NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
235
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTCLR, 0x01);
236
+ actual = qtest_readl(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_IN) & 0x01;
237
g_assert_cmpuint(actual, ==, 0x00);
238
239
/*
240
* Check short-circuit - generates an guest_error which must be checked
241
* manually as long as qtest can not scan qemu_log messages
242
*/
243
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b01);
244
- writel(NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTSET, 0x01);
245
- qtest_set_irq_in(global_qtest, "/machine/nrf51", "unnamed-gpio-in", 0, 0);
246
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_CNF_START, 0b01);
247
+ qtest_writel(qts, NRF51_GPIO_BASE + NRF51_GPIO_REG_OUTSET, 0x01);
248
+ qtest_set_irq_in(qts, "/machine/nrf51", "unnamed-gpio-in", 0, 0);
249
+
250
+ qtest_quit(qts);
251
}
64
}
252
65
253
-static void timer_task(hwaddr task)
66
-uint32_t HELPER(neon_acge_f32)(uint32_t a, uint32_t b, void *fpstp)
254
+static void timer_task(QTestState *qts, hwaddr task)
67
+uint32_t HELPER(neon_acge_f32)(uint32_t a, uint32_t b, float_status *fpst)
255
{
68
{
256
- writel(NRF51_TIMER_BASE + task, NRF51_TRIGGER_TASK);
69
- float_status *fpst = fpstp;
257
+ qtest_writel(qts, NRF51_TIMER_BASE + task, NRF51_TRIGGER_TASK);
70
float32 f0 = float32_abs(make_float32(a));
71
float32 f1 = float32_abs(make_float32(b));
72
return -float32_le(f1, f0, fpst);
258
}
73
}
259
74
260
-static void timer_clear_event(hwaddr event)
75
-uint32_t HELPER(neon_acgt_f32)(uint32_t a, uint32_t b, void *fpstp)
261
+static void timer_clear_event(QTestState *qts, hwaddr event)
76
+uint32_t HELPER(neon_acgt_f32)(uint32_t a, uint32_t b, float_status *fpst)
262
{
77
{
263
- writel(NRF51_TIMER_BASE + event, NRF51_EVENT_CLEAR);
78
- float_status *fpst = fpstp;
264
+ qtest_writel(qts, NRF51_TIMER_BASE + event, NRF51_EVENT_CLEAR);
79
float32 f0 = float32_abs(make_float32(a));
80
float32 f1 = float32_abs(make_float32(b));
81
return -float32_lt(f1, f0, fpst);
265
}
82
}
266
83
267
-static void timer_set_bitmode(uint8_t mode)
84
-uint64_t HELPER(neon_acge_f64)(uint64_t a, uint64_t b, void *fpstp)
268
+static void timer_set_bitmode(QTestState *qts, uint8_t mode)
85
+uint64_t HELPER(neon_acge_f64)(uint64_t a, uint64_t b, float_status *fpst)
269
{
86
{
270
- writel(NRF51_TIMER_BASE + NRF51_TIMER_REG_BITMODE, mode);
87
- float_status *fpst = fpstp;
271
+ qtest_writel(qts, NRF51_TIMER_BASE + NRF51_TIMER_REG_BITMODE, mode);
88
float64 f0 = float64_abs(make_float64(a));
89
float64 f1 = float64_abs(make_float64(b));
90
return -float64_le(f1, f0, fpst);
272
}
91
}
273
92
274
-static void timer_set_prescaler(uint8_t prescaler)
93
-uint64_t HELPER(neon_acgt_f64)(uint64_t a, uint64_t b, void *fpstp)
275
+static void timer_set_prescaler(QTestState *qts, uint8_t prescaler)
94
+uint64_t HELPER(neon_acgt_f64)(uint64_t a, uint64_t b, float_status *fpst)
276
{
95
{
277
- writel(NRF51_TIMER_BASE + NRF51_TIMER_REG_PRESCALER, prescaler);
96
- float_status *fpst = fpstp;
278
+ qtest_writel(qts, NRF51_TIMER_BASE + NRF51_TIMER_REG_PRESCALER, prescaler);
97
float64 f0 = float64_abs(make_float64(a));
279
}
98
float64 f1 = float64_abs(make_float64(b));
280
99
return -float64_lt(f1, f0, fpst);
281
-static void timer_set_cc(size_t idx, uint32_t value)
282
+static void timer_set_cc(QTestState *qts, size_t idx, uint32_t value)
283
{
284
- writel(NRF51_TIMER_BASE + NRF51_TIMER_REG_CC0 + idx * 4, value);
285
+ qtest_writel(qts, NRF51_TIMER_BASE + NRF51_TIMER_REG_CC0 + idx * 4, value);
286
}
287
288
-static void timer_assert_events(uint32_t ev0, uint32_t ev1, uint32_t ev2,
289
- uint32_t ev3)
290
+static void timer_assert_events(QTestState *qts, uint32_t ev0, uint32_t ev1,
291
+ uint32_t ev2, uint32_t ev3)
292
{
293
- g_assert(readl(NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_0) == ev0);
294
- g_assert(readl(NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_1) == ev1);
295
- g_assert(readl(NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_2) == ev2);
296
- g_assert(readl(NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_3) == ev3);
297
+ g_assert(qtest_readl(qts, NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_0)
298
+ == ev0);
299
+ g_assert(qtest_readl(qts, NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_1)
300
+ == ev1);
301
+ g_assert(qtest_readl(qts, NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_2)
302
+ == ev2);
303
+ g_assert(qtest_readl(qts, NRF51_TIMER_BASE + NRF51_TIMER_EVENT_COMPARE_3)
304
+ == ev3);
305
}
306
307
static void test_nrf51_timer(void)
308
{
309
uint32_t steps_to_overflow = 408;
310
+ QTestState *qts = qtest_init("-M microbit");
311
312
/* Compare Match */
313
- timer_task(NRF51_TIMER_TASK_STOP);
314
- timer_task(NRF51_TIMER_TASK_CLEAR);
315
+ timer_task(qts, NRF51_TIMER_TASK_STOP);
316
+ timer_task(qts, NRF51_TIMER_TASK_CLEAR);
317
318
- timer_clear_event(NRF51_TIMER_EVENT_COMPARE_0);
319
- timer_clear_event(NRF51_TIMER_EVENT_COMPARE_1);
320
- timer_clear_event(NRF51_TIMER_EVENT_COMPARE_2);
321
- timer_clear_event(NRF51_TIMER_EVENT_COMPARE_3);
322
+ timer_clear_event(qts, NRF51_TIMER_EVENT_COMPARE_0);
323
+ timer_clear_event(qts, NRF51_TIMER_EVENT_COMPARE_1);
324
+ timer_clear_event(qts, NRF51_TIMER_EVENT_COMPARE_2);
325
+ timer_clear_event(qts, NRF51_TIMER_EVENT_COMPARE_3);
326
327
- timer_set_bitmode(NRF51_TIMER_WIDTH_16); /* 16 MHz Timer */
328
- timer_set_prescaler(0);
329
+ timer_set_bitmode(qts, NRF51_TIMER_WIDTH_16); /* 16 MHz Timer */
330
+ timer_set_prescaler(qts, 0);
331
/* Swept over in first step */
332
- timer_set_cc(0, 2);
333
+ timer_set_cc(qts, 0, 2);
334
/* Barely miss on first step */
335
- timer_set_cc(1, 162);
336
+ timer_set_cc(qts, 1, 162);
337
/* Spot on on third step */
338
- timer_set_cc(2, 480);
339
+ timer_set_cc(qts, 2, 480);
340
341
- timer_assert_events(0, 0, 0, 0);
342
+ timer_assert_events(qts, 0, 0, 0, 0);
343
344
- timer_task(NRF51_TIMER_TASK_START);
345
- clock_step(10000);
346
- timer_assert_events(1, 0, 0, 0);
347
+ timer_task(qts, NRF51_TIMER_TASK_START);
348
+ qtest_clock_step(qts, 10000);
349
+ timer_assert_events(qts, 1, 0, 0, 0);
350
351
/* Swept over on first overflow */
352
- timer_set_cc(3, 114);
353
+ timer_set_cc(qts, 3, 114);
354
355
- clock_step(10000);
356
- timer_assert_events(1, 1, 0, 0);
357
+ qtest_clock_step(qts, 10000);
358
+ timer_assert_events(qts, 1, 1, 0, 0);
359
360
- clock_step(10000);
361
- timer_assert_events(1, 1, 1, 0);
362
+ qtest_clock_step(qts, 10000);
363
+ timer_assert_events(qts, 1, 1, 1, 0);
364
365
/* Wrap time until internal counter overflows */
366
while (steps_to_overflow--) {
367
- timer_assert_events(1, 1, 1, 0);
368
- clock_step(10000);
369
+ timer_assert_events(qts, 1, 1, 1, 0);
370
+ qtest_clock_step(qts, 10000);
371
}
372
373
- timer_assert_events(1, 1, 1, 1);
374
+ timer_assert_events(qts, 1, 1, 1, 1);
375
376
- timer_clear_event(NRF51_TIMER_EVENT_COMPARE_0);
377
- timer_clear_event(NRF51_TIMER_EVENT_COMPARE_1);
378
- timer_clear_event(NRF51_TIMER_EVENT_COMPARE_2);
379
- timer_clear_event(NRF51_TIMER_EVENT_COMPARE_3);
380
- timer_assert_events(0, 0, 0, 0);
381
+ timer_clear_event(qts, NRF51_TIMER_EVENT_COMPARE_0);
382
+ timer_clear_event(qts, NRF51_TIMER_EVENT_COMPARE_1);
383
+ timer_clear_event(qts, NRF51_TIMER_EVENT_COMPARE_2);
384
+ timer_clear_event(qts, NRF51_TIMER_EVENT_COMPARE_3);
385
+ timer_assert_events(qts, 0, 0, 0, 0);
386
387
- timer_task(NRF51_TIMER_TASK_STOP);
388
+ timer_task(qts, NRF51_TIMER_TASK_STOP);
389
390
/* Test Proposal: Stop/Shutdown */
391
/* Test Proposal: Shortcut Compare -> Clear */
392
/* Test Proposal: Shortcut Compare -> Stop */
393
/* Test Proposal: Counter Mode */
394
+
395
+ qtest_quit(qts);
396
}
397
398
int main(int argc, char **argv)
399
{
400
- int ret;
401
-
402
g_test_init(&argc, &argv, NULL);
403
404
- global_qtest = qtest_initf("-machine microbit");
405
-
406
qtest_add_func("/microbit/nrf51/gpio", test_nrf51_gpio);
407
qtest_add_func("/microbit/nrf51/timer", test_nrf51_timer);
408
qtest_add_func("/microbit/microbit/i2c", test_microbit_i2c);
409
410
- ret = g_test_run();
411
-
412
- qtest_quit(global_qtest);
413
- return ret;
414
+ return g_test_run();
415
}
416
--
100
--
417
2.20.1
101
2.34.1
418
102
419
103
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
0xFFFFFFFF should be returned for non implemented registers.
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
5
Message-id: 20241206031224.78525-7-richard.henderson@linaro.org
6
Reviewed-by: Joel Stanley <joel@jms.id.au>
7
Message-id: 20190124140519.13838-2-clg@kaod.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
7
---
10
hw/ssi/aspeed_smc.c | 2 +-
8
target/arm/tcg/helper-sve.h | 414 ++++++++++++++++++------------------
11
1 file changed, 1 insertion(+), 1 deletion(-)
9
target/arm/tcg/sve_helper.c | 96 +++++----
10
2 files changed, 258 insertions(+), 252 deletions(-)
12
11
13
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
12
diff --git a/target/arm/tcg/helper-sve.h b/target/arm/tcg/helper-sve.h
14
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/ssi/aspeed_smc.c
14
--- a/target/arm/tcg/helper-sve.h
16
+++ b/hw/ssi/aspeed_smc.c
15
+++ b/target/arm/tcg/helper-sve.h
17
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr addr, unsigned int size)
16
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(gvec_rsqrts_d, TCG_CALL_NO_RWG,
18
} else {
17
void, ptr, ptr, ptr, fpst, i32)
19
qemu_log_mask(LOG_UNIMP, "%s: not implemented: 0x%" HWADDR_PRIx "\n",
18
20
__func__, addr);
19
DEF_HELPER_FLAGS_4(sve_faddv_h, TCG_CALL_NO_RWG,
21
- return 0;
20
- i64, ptr, ptr, ptr, i32)
22
+ return -1;
21
+ i64, ptr, ptr, fpst, i32)
22
DEF_HELPER_FLAGS_4(sve_faddv_s, TCG_CALL_NO_RWG,
23
- i64, ptr, ptr, ptr, i32)
24
+ i64, ptr, ptr, fpst, i32)
25
DEF_HELPER_FLAGS_4(sve_faddv_d, TCG_CALL_NO_RWG,
26
- i64, ptr, ptr, ptr, i32)
27
+ i64, ptr, ptr, fpst, i32)
28
29
DEF_HELPER_FLAGS_4(sve_fmaxnmv_h, TCG_CALL_NO_RWG,
30
- i64, ptr, ptr, ptr, i32)
31
+ i64, ptr, ptr, fpst, i32)
32
DEF_HELPER_FLAGS_4(sve_fmaxnmv_s, TCG_CALL_NO_RWG,
33
- i64, ptr, ptr, ptr, i32)
34
+ i64, ptr, ptr, fpst, i32)
35
DEF_HELPER_FLAGS_4(sve_fmaxnmv_d, TCG_CALL_NO_RWG,
36
- i64, ptr, ptr, ptr, i32)
37
+ i64, ptr, ptr, fpst, i32)
38
39
DEF_HELPER_FLAGS_4(sve_fminnmv_h, TCG_CALL_NO_RWG,
40
- i64, ptr, ptr, ptr, i32)
41
+ i64, ptr, ptr, fpst, i32)
42
DEF_HELPER_FLAGS_4(sve_fminnmv_s, TCG_CALL_NO_RWG,
43
- i64, ptr, ptr, ptr, i32)
44
+ i64, ptr, ptr, fpst, i32)
45
DEF_HELPER_FLAGS_4(sve_fminnmv_d, TCG_CALL_NO_RWG,
46
- i64, ptr, ptr, ptr, i32)
47
+ i64, ptr, ptr, fpst, i32)
48
49
DEF_HELPER_FLAGS_4(sve_fmaxv_h, TCG_CALL_NO_RWG,
50
- i64, ptr, ptr, ptr, i32)
51
+ i64, ptr, ptr, fpst, i32)
52
DEF_HELPER_FLAGS_4(sve_fmaxv_s, TCG_CALL_NO_RWG,
53
- i64, ptr, ptr, ptr, i32)
54
+ i64, ptr, ptr, fpst, i32)
55
DEF_HELPER_FLAGS_4(sve_fmaxv_d, TCG_CALL_NO_RWG,
56
- i64, ptr, ptr, ptr, i32)
57
+ i64, ptr, ptr, fpst, i32)
58
59
DEF_HELPER_FLAGS_4(sve_fminv_h, TCG_CALL_NO_RWG,
60
- i64, ptr, ptr, ptr, i32)
61
+ i64, ptr, ptr, fpst, i32)
62
DEF_HELPER_FLAGS_4(sve_fminv_s, TCG_CALL_NO_RWG,
63
- i64, ptr, ptr, ptr, i32)
64
+ i64, ptr, ptr, fpst, i32)
65
DEF_HELPER_FLAGS_4(sve_fminv_d, TCG_CALL_NO_RWG,
66
- i64, ptr, ptr, ptr, i32)
67
+ i64, ptr, ptr, fpst, i32)
68
69
DEF_HELPER_FLAGS_5(sve_fadda_h, TCG_CALL_NO_RWG,
70
- i64, i64, ptr, ptr, ptr, i32)
71
+ i64, i64, ptr, ptr, fpst, i32)
72
DEF_HELPER_FLAGS_5(sve_fadda_s, TCG_CALL_NO_RWG,
73
- i64, i64, ptr, ptr, ptr, i32)
74
+ i64, i64, ptr, ptr, fpst, i32)
75
DEF_HELPER_FLAGS_5(sve_fadda_d, TCG_CALL_NO_RWG,
76
- i64, i64, ptr, ptr, ptr, i32)
77
+ i64, i64, ptr, ptr, fpst, i32)
78
79
DEF_HELPER_FLAGS_5(sve_fcmge0_h, TCG_CALL_NO_RWG,
80
- void, ptr, ptr, ptr, ptr, i32)
81
+ void, ptr, ptr, ptr, fpst, i32)
82
DEF_HELPER_FLAGS_5(sve_fcmge0_s, TCG_CALL_NO_RWG,
83
- void, ptr, ptr, ptr, ptr, i32)
84
+ void, ptr, ptr, ptr, fpst, i32)
85
DEF_HELPER_FLAGS_5(sve_fcmge0_d, TCG_CALL_NO_RWG,
86
- void, ptr, ptr, ptr, ptr, i32)
87
+ void, ptr, ptr, ptr, fpst, i32)
88
89
DEF_HELPER_FLAGS_5(sve_fcmgt0_h, TCG_CALL_NO_RWG,
90
- void, ptr, ptr, ptr, ptr, i32)
91
+ void, ptr, ptr, ptr, fpst, i32)
92
DEF_HELPER_FLAGS_5(sve_fcmgt0_s, TCG_CALL_NO_RWG,
93
- void, ptr, ptr, ptr, ptr, i32)
94
+ void, ptr, ptr, ptr, fpst, i32)
95
DEF_HELPER_FLAGS_5(sve_fcmgt0_d, TCG_CALL_NO_RWG,
96
- void, ptr, ptr, ptr, ptr, i32)
97
+ void, ptr, ptr, ptr, fpst, i32)
98
99
DEF_HELPER_FLAGS_5(sve_fcmlt0_h, TCG_CALL_NO_RWG,
100
- void, ptr, ptr, ptr, ptr, i32)
101
+ void, ptr, ptr, ptr, fpst, i32)
102
DEF_HELPER_FLAGS_5(sve_fcmlt0_s, TCG_CALL_NO_RWG,
103
- void, ptr, ptr, ptr, ptr, i32)
104
+ void, ptr, ptr, ptr, fpst, i32)
105
DEF_HELPER_FLAGS_5(sve_fcmlt0_d, TCG_CALL_NO_RWG,
106
- void, ptr, ptr, ptr, ptr, i32)
107
+ void, ptr, ptr, ptr, fpst, i32)
108
109
DEF_HELPER_FLAGS_5(sve_fcmle0_h, TCG_CALL_NO_RWG,
110
- void, ptr, ptr, ptr, ptr, i32)
111
+ void, ptr, ptr, ptr, fpst, i32)
112
DEF_HELPER_FLAGS_5(sve_fcmle0_s, TCG_CALL_NO_RWG,
113
- void, ptr, ptr, ptr, ptr, i32)
114
+ void, ptr, ptr, ptr, fpst, i32)
115
DEF_HELPER_FLAGS_5(sve_fcmle0_d, TCG_CALL_NO_RWG,
116
- void, ptr, ptr, ptr, ptr, i32)
117
+ void, ptr, ptr, ptr, fpst, i32)
118
119
DEF_HELPER_FLAGS_5(sve_fcmeq0_h, TCG_CALL_NO_RWG,
120
- void, ptr, ptr, ptr, ptr, i32)
121
+ void, ptr, ptr, ptr, fpst, i32)
122
DEF_HELPER_FLAGS_5(sve_fcmeq0_s, TCG_CALL_NO_RWG,
123
- void, ptr, ptr, ptr, ptr, i32)
124
+ void, ptr, ptr, ptr, fpst, i32)
125
DEF_HELPER_FLAGS_5(sve_fcmeq0_d, TCG_CALL_NO_RWG,
126
- void, ptr, ptr, ptr, ptr, i32)
127
+ void, ptr, ptr, ptr, fpst, i32)
128
129
DEF_HELPER_FLAGS_5(sve_fcmne0_h, TCG_CALL_NO_RWG,
130
- void, ptr, ptr, ptr, ptr, i32)
131
+ void, ptr, ptr, ptr, fpst, i32)
132
DEF_HELPER_FLAGS_5(sve_fcmne0_s, TCG_CALL_NO_RWG,
133
- void, ptr, ptr, ptr, ptr, i32)
134
+ void, ptr, ptr, ptr, fpst, i32)
135
DEF_HELPER_FLAGS_5(sve_fcmne0_d, TCG_CALL_NO_RWG,
136
- void, ptr, ptr, ptr, ptr, i32)
137
+ void, ptr, ptr, ptr, fpst, i32)
138
139
DEF_HELPER_FLAGS_6(sve_fadd_h, TCG_CALL_NO_RWG,
140
- void, ptr, ptr, ptr, ptr, ptr, i32)
141
+ void, ptr, ptr, ptr, ptr, fpst, i32)
142
DEF_HELPER_FLAGS_6(sve_fadd_s, TCG_CALL_NO_RWG,
143
- void, ptr, ptr, ptr, ptr, ptr, i32)
144
+ void, ptr, ptr, ptr, ptr, fpst, i32)
145
DEF_HELPER_FLAGS_6(sve_fadd_d, TCG_CALL_NO_RWG,
146
- void, ptr, ptr, ptr, ptr, ptr, i32)
147
+ void, ptr, ptr, ptr, ptr, fpst, i32)
148
149
DEF_HELPER_FLAGS_6(sve_fsub_h, TCG_CALL_NO_RWG,
150
- void, ptr, ptr, ptr, ptr, ptr, i32)
151
+ void, ptr, ptr, ptr, ptr, fpst, i32)
152
DEF_HELPER_FLAGS_6(sve_fsub_s, TCG_CALL_NO_RWG,
153
- void, ptr, ptr, ptr, ptr, ptr, i32)
154
+ void, ptr, ptr, ptr, ptr, fpst, i32)
155
DEF_HELPER_FLAGS_6(sve_fsub_d, TCG_CALL_NO_RWG,
156
- void, ptr, ptr, ptr, ptr, ptr, i32)
157
+ void, ptr, ptr, ptr, ptr, fpst, i32)
158
159
DEF_HELPER_FLAGS_6(sve_fmul_h, TCG_CALL_NO_RWG,
160
- void, ptr, ptr, ptr, ptr, ptr, i32)
161
+ void, ptr, ptr, ptr, ptr, fpst, i32)
162
DEF_HELPER_FLAGS_6(sve_fmul_s, TCG_CALL_NO_RWG,
163
- void, ptr, ptr, ptr, ptr, ptr, i32)
164
+ void, ptr, ptr, ptr, ptr, fpst, i32)
165
DEF_HELPER_FLAGS_6(sve_fmul_d, TCG_CALL_NO_RWG,
166
- void, ptr, ptr, ptr, ptr, ptr, i32)
167
+ void, ptr, ptr, ptr, ptr, fpst, i32)
168
169
DEF_HELPER_FLAGS_6(sve_fdiv_h, TCG_CALL_NO_RWG,
170
- void, ptr, ptr, ptr, ptr, ptr, i32)
171
+ void, ptr, ptr, ptr, ptr, fpst, i32)
172
DEF_HELPER_FLAGS_6(sve_fdiv_s, TCG_CALL_NO_RWG,
173
- void, ptr, ptr, ptr, ptr, ptr, i32)
174
+ void, ptr, ptr, ptr, ptr, fpst, i32)
175
DEF_HELPER_FLAGS_6(sve_fdiv_d, TCG_CALL_NO_RWG,
176
- void, ptr, ptr, ptr, ptr, ptr, i32)
177
+ void, ptr, ptr, ptr, ptr, fpst, i32)
178
179
DEF_HELPER_FLAGS_6(sve_fmin_h, TCG_CALL_NO_RWG,
180
- void, ptr, ptr, ptr, ptr, ptr, i32)
181
+ void, ptr, ptr, ptr, ptr, fpst, i32)
182
DEF_HELPER_FLAGS_6(sve_fmin_s, TCG_CALL_NO_RWG,
183
- void, ptr, ptr, ptr, ptr, ptr, i32)
184
+ void, ptr, ptr, ptr, ptr, fpst, i32)
185
DEF_HELPER_FLAGS_6(sve_fmin_d, TCG_CALL_NO_RWG,
186
- void, ptr, ptr, ptr, ptr, ptr, i32)
187
+ void, ptr, ptr, ptr, ptr, fpst, i32)
188
189
DEF_HELPER_FLAGS_6(sve_fmax_h, TCG_CALL_NO_RWG,
190
- void, ptr, ptr, ptr, ptr, ptr, i32)
191
+ void, ptr, ptr, ptr, ptr, fpst, i32)
192
DEF_HELPER_FLAGS_6(sve_fmax_s, TCG_CALL_NO_RWG,
193
- void, ptr, ptr, ptr, ptr, ptr, i32)
194
+ void, ptr, ptr, ptr, ptr, fpst, i32)
195
DEF_HELPER_FLAGS_6(sve_fmax_d, TCG_CALL_NO_RWG,
196
- void, ptr, ptr, ptr, ptr, ptr, i32)
197
+ void, ptr, ptr, ptr, ptr, fpst, i32)
198
199
DEF_HELPER_FLAGS_6(sve_fminnum_h, TCG_CALL_NO_RWG,
200
- void, ptr, ptr, ptr, ptr, ptr, i32)
201
+ void, ptr, ptr, ptr, ptr, fpst, i32)
202
DEF_HELPER_FLAGS_6(sve_fminnum_s, TCG_CALL_NO_RWG,
203
- void, ptr, ptr, ptr, ptr, ptr, i32)
204
+ void, ptr, ptr, ptr, ptr, fpst, i32)
205
DEF_HELPER_FLAGS_6(sve_fminnum_d, TCG_CALL_NO_RWG,
206
- void, ptr, ptr, ptr, ptr, ptr, i32)
207
+ void, ptr, ptr, ptr, ptr, fpst, i32)
208
209
DEF_HELPER_FLAGS_6(sve_fmaxnum_h, TCG_CALL_NO_RWG,
210
- void, ptr, ptr, ptr, ptr, ptr, i32)
211
+ void, ptr, ptr, ptr, ptr, fpst, i32)
212
DEF_HELPER_FLAGS_6(sve_fmaxnum_s, TCG_CALL_NO_RWG,
213
- void, ptr, ptr, ptr, ptr, ptr, i32)
214
+ void, ptr, ptr, ptr, ptr, fpst, i32)
215
DEF_HELPER_FLAGS_6(sve_fmaxnum_d, TCG_CALL_NO_RWG,
216
- void, ptr, ptr, ptr, ptr, ptr, i32)
217
+ void, ptr, ptr, ptr, ptr, fpst, i32)
218
219
DEF_HELPER_FLAGS_6(sve_fabd_h, TCG_CALL_NO_RWG,
220
- void, ptr, ptr, ptr, ptr, ptr, i32)
221
+ void, ptr, ptr, ptr, ptr, fpst, i32)
222
DEF_HELPER_FLAGS_6(sve_fabd_s, TCG_CALL_NO_RWG,
223
- void, ptr, ptr, ptr, ptr, ptr, i32)
224
+ void, ptr, ptr, ptr, ptr, fpst, i32)
225
DEF_HELPER_FLAGS_6(sve_fabd_d, TCG_CALL_NO_RWG,
226
- void, ptr, ptr, ptr, ptr, ptr, i32)
227
+ void, ptr, ptr, ptr, ptr, fpst, i32)
228
229
DEF_HELPER_FLAGS_6(sve_fscalbn_h, TCG_CALL_NO_RWG,
230
- void, ptr, ptr, ptr, ptr, ptr, i32)
231
+ void, ptr, ptr, ptr, ptr, fpst, i32)
232
DEF_HELPER_FLAGS_6(sve_fscalbn_s, TCG_CALL_NO_RWG,
233
- void, ptr, ptr, ptr, ptr, ptr, i32)
234
+ void, ptr, ptr, ptr, ptr, fpst, i32)
235
DEF_HELPER_FLAGS_6(sve_fscalbn_d, TCG_CALL_NO_RWG,
236
- void, ptr, ptr, ptr, ptr, ptr, i32)
237
+ void, ptr, ptr, ptr, ptr, fpst, i32)
238
239
DEF_HELPER_FLAGS_6(sve_fmulx_h, TCG_CALL_NO_RWG,
240
- void, ptr, ptr, ptr, ptr, ptr, i32)
241
+ void, ptr, ptr, ptr, ptr, fpst, i32)
242
DEF_HELPER_FLAGS_6(sve_fmulx_s, TCG_CALL_NO_RWG,
243
- void, ptr, ptr, ptr, ptr, ptr, i32)
244
+ void, ptr, ptr, ptr, ptr, fpst, i32)
245
DEF_HELPER_FLAGS_6(sve_fmulx_d, TCG_CALL_NO_RWG,
246
- void, ptr, ptr, ptr, ptr, ptr, i32)
247
+ void, ptr, ptr, ptr, ptr, fpst, i32)
248
249
DEF_HELPER_FLAGS_6(sve_fadds_h, TCG_CALL_NO_RWG,
250
- void, ptr, ptr, ptr, i64, ptr, i32)
251
+ void, ptr, ptr, ptr, i64, fpst, i32)
252
DEF_HELPER_FLAGS_6(sve_fadds_s, TCG_CALL_NO_RWG,
253
- void, ptr, ptr, ptr, i64, ptr, i32)
254
+ void, ptr, ptr, ptr, i64, fpst, i32)
255
DEF_HELPER_FLAGS_6(sve_fadds_d, TCG_CALL_NO_RWG,
256
- void, ptr, ptr, ptr, i64, ptr, i32)
257
+ void, ptr, ptr, ptr, i64, fpst, i32)
258
259
DEF_HELPER_FLAGS_6(sve_fsubs_h, TCG_CALL_NO_RWG,
260
- void, ptr, ptr, ptr, i64, ptr, i32)
261
+ void, ptr, ptr, ptr, i64, fpst, i32)
262
DEF_HELPER_FLAGS_6(sve_fsubs_s, TCG_CALL_NO_RWG,
263
- void, ptr, ptr, ptr, i64, ptr, i32)
264
+ void, ptr, ptr, ptr, i64, fpst, i32)
265
DEF_HELPER_FLAGS_6(sve_fsubs_d, TCG_CALL_NO_RWG,
266
- void, ptr, ptr, ptr, i64, ptr, i32)
267
+ void, ptr, ptr, ptr, i64, fpst, i32)
268
269
DEF_HELPER_FLAGS_6(sve_fmuls_h, TCG_CALL_NO_RWG,
270
- void, ptr, ptr, ptr, i64, ptr, i32)
271
+ void, ptr, ptr, ptr, i64, fpst, i32)
272
DEF_HELPER_FLAGS_6(sve_fmuls_s, TCG_CALL_NO_RWG,
273
- void, ptr, ptr, ptr, i64, ptr, i32)
274
+ void, ptr, ptr, ptr, i64, fpst, i32)
275
DEF_HELPER_FLAGS_6(sve_fmuls_d, TCG_CALL_NO_RWG,
276
- void, ptr, ptr, ptr, i64, ptr, i32)
277
+ void, ptr, ptr, ptr, i64, fpst, i32)
278
279
DEF_HELPER_FLAGS_6(sve_fsubrs_h, TCG_CALL_NO_RWG,
280
- void, ptr, ptr, ptr, i64, ptr, i32)
281
+ void, ptr, ptr, ptr, i64, fpst, i32)
282
DEF_HELPER_FLAGS_6(sve_fsubrs_s, TCG_CALL_NO_RWG,
283
- void, ptr, ptr, ptr, i64, ptr, i32)
284
+ void, ptr, ptr, ptr, i64, fpst, i32)
285
DEF_HELPER_FLAGS_6(sve_fsubrs_d, TCG_CALL_NO_RWG,
286
- void, ptr, ptr, ptr, i64, ptr, i32)
287
+ void, ptr, ptr, ptr, i64, fpst, i32)
288
289
DEF_HELPER_FLAGS_6(sve_fmaxnms_h, TCG_CALL_NO_RWG,
290
- void, ptr, ptr, ptr, i64, ptr, i32)
291
+ void, ptr, ptr, ptr, i64, fpst, i32)
292
DEF_HELPER_FLAGS_6(sve_fmaxnms_s, TCG_CALL_NO_RWG,
293
- void, ptr, ptr, ptr, i64, ptr, i32)
294
+ void, ptr, ptr, ptr, i64, fpst, i32)
295
DEF_HELPER_FLAGS_6(sve_fmaxnms_d, TCG_CALL_NO_RWG,
296
- void, ptr, ptr, ptr, i64, ptr, i32)
297
+ void, ptr, ptr, ptr, i64, fpst, i32)
298
299
DEF_HELPER_FLAGS_6(sve_fminnms_h, TCG_CALL_NO_RWG,
300
- void, ptr, ptr, ptr, i64, ptr, i32)
301
+ void, ptr, ptr, ptr, i64, fpst, i32)
302
DEF_HELPER_FLAGS_6(sve_fminnms_s, TCG_CALL_NO_RWG,
303
- void, ptr, ptr, ptr, i64, ptr, i32)
304
+ void, ptr, ptr, ptr, i64, fpst, i32)
305
DEF_HELPER_FLAGS_6(sve_fminnms_d, TCG_CALL_NO_RWG,
306
- void, ptr, ptr, ptr, i64, ptr, i32)
307
+ void, ptr, ptr, ptr, i64, fpst, i32)
308
309
DEF_HELPER_FLAGS_6(sve_fmaxs_h, TCG_CALL_NO_RWG,
310
- void, ptr, ptr, ptr, i64, ptr, i32)
311
+ void, ptr, ptr, ptr, i64, fpst, i32)
312
DEF_HELPER_FLAGS_6(sve_fmaxs_s, TCG_CALL_NO_RWG,
313
- void, ptr, ptr, ptr, i64, ptr, i32)
314
+ void, ptr, ptr, ptr, i64, fpst, i32)
315
DEF_HELPER_FLAGS_6(sve_fmaxs_d, TCG_CALL_NO_RWG,
316
- void, ptr, ptr, ptr, i64, ptr, i32)
317
+ void, ptr, ptr, ptr, i64, fpst, i32)
318
319
DEF_HELPER_FLAGS_6(sve_fmins_h, TCG_CALL_NO_RWG,
320
- void, ptr, ptr, ptr, i64, ptr, i32)
321
+ void, ptr, ptr, ptr, i64, fpst, i32)
322
DEF_HELPER_FLAGS_6(sve_fmins_s, TCG_CALL_NO_RWG,
323
- void, ptr, ptr, ptr, i64, ptr, i32)
324
+ void, ptr, ptr, ptr, i64, fpst, i32)
325
DEF_HELPER_FLAGS_6(sve_fmins_d, TCG_CALL_NO_RWG,
326
- void, ptr, ptr, ptr, i64, ptr, i32)
327
+ void, ptr, ptr, ptr, i64, fpst, i32)
328
329
DEF_HELPER_FLAGS_5(sve_fcvt_sh, TCG_CALL_NO_RWG,
330
- void, ptr, ptr, ptr, ptr, i32)
331
+ void, ptr, ptr, ptr, fpst, i32)
332
DEF_HELPER_FLAGS_5(sve_fcvt_dh, TCG_CALL_NO_RWG,
333
- void, ptr, ptr, ptr, ptr, i32)
334
+ void, ptr, ptr, ptr, fpst, i32)
335
DEF_HELPER_FLAGS_5(sve_fcvt_hs, TCG_CALL_NO_RWG,
336
- void, ptr, ptr, ptr, ptr, i32)
337
+ void, ptr, ptr, ptr, fpst, i32)
338
DEF_HELPER_FLAGS_5(sve_fcvt_ds, TCG_CALL_NO_RWG,
339
- void, ptr, ptr, ptr, ptr, i32)
340
+ void, ptr, ptr, ptr, fpst, i32)
341
DEF_HELPER_FLAGS_5(sve_fcvt_hd, TCG_CALL_NO_RWG,
342
- void, ptr, ptr, ptr, ptr, i32)
343
+ void, ptr, ptr, ptr, fpst, i32)
344
DEF_HELPER_FLAGS_5(sve_fcvt_sd, TCG_CALL_NO_RWG,
345
- void, ptr, ptr, ptr, ptr, i32)
346
+ void, ptr, ptr, ptr, fpst, i32)
347
DEF_HELPER_FLAGS_5(sve_bfcvt, TCG_CALL_NO_RWG,
348
- void, ptr, ptr, ptr, ptr, i32)
349
+ void, ptr, ptr, ptr, fpst, i32)
350
351
DEF_HELPER_FLAGS_5(sve_fcvtzs_hh, TCG_CALL_NO_RWG,
352
- void, ptr, ptr, ptr, ptr, i32)
353
+ void, ptr, ptr, ptr, fpst, i32)
354
DEF_HELPER_FLAGS_5(sve_fcvtzs_hs, TCG_CALL_NO_RWG,
355
- void, ptr, ptr, ptr, ptr, i32)
356
+ void, ptr, ptr, ptr, fpst, i32)
357
DEF_HELPER_FLAGS_5(sve_fcvtzs_ss, TCG_CALL_NO_RWG,
358
- void, ptr, ptr, ptr, ptr, i32)
359
+ void, ptr, ptr, ptr, fpst, i32)
360
DEF_HELPER_FLAGS_5(sve_fcvtzs_ds, TCG_CALL_NO_RWG,
361
- void, ptr, ptr, ptr, ptr, i32)
362
+ void, ptr, ptr, ptr, fpst, i32)
363
DEF_HELPER_FLAGS_5(sve_fcvtzs_hd, TCG_CALL_NO_RWG,
364
- void, ptr, ptr, ptr, ptr, i32)
365
+ void, ptr, ptr, ptr, fpst, i32)
366
DEF_HELPER_FLAGS_5(sve_fcvtzs_sd, TCG_CALL_NO_RWG,
367
- void, ptr, ptr, ptr, ptr, i32)
368
+ void, ptr, ptr, ptr, fpst, i32)
369
DEF_HELPER_FLAGS_5(sve_fcvtzs_dd, TCG_CALL_NO_RWG,
370
- void, ptr, ptr, ptr, ptr, i32)
371
+ void, ptr, ptr, ptr, fpst, i32)
372
373
DEF_HELPER_FLAGS_5(sve_fcvtzu_hh, TCG_CALL_NO_RWG,
374
- void, ptr, ptr, ptr, ptr, i32)
375
+ void, ptr, ptr, ptr, fpst, i32)
376
DEF_HELPER_FLAGS_5(sve_fcvtzu_hs, TCG_CALL_NO_RWG,
377
- void, ptr, ptr, ptr, ptr, i32)
378
+ void, ptr, ptr, ptr, fpst, i32)
379
DEF_HELPER_FLAGS_5(sve_fcvtzu_ss, TCG_CALL_NO_RWG,
380
- void, ptr, ptr, ptr, ptr, i32)
381
+ void, ptr, ptr, ptr, fpst, i32)
382
DEF_HELPER_FLAGS_5(sve_fcvtzu_ds, TCG_CALL_NO_RWG,
383
- void, ptr, ptr, ptr, ptr, i32)
384
+ void, ptr, ptr, ptr, fpst, i32)
385
DEF_HELPER_FLAGS_5(sve_fcvtzu_hd, TCG_CALL_NO_RWG,
386
- void, ptr, ptr, ptr, ptr, i32)
387
+ void, ptr, ptr, ptr, fpst, i32)
388
DEF_HELPER_FLAGS_5(sve_fcvtzu_sd, TCG_CALL_NO_RWG,
389
- void, ptr, ptr, ptr, ptr, i32)
390
+ void, ptr, ptr, ptr, fpst, i32)
391
DEF_HELPER_FLAGS_5(sve_fcvtzu_dd, TCG_CALL_NO_RWG,
392
- void, ptr, ptr, ptr, ptr, i32)
393
+ void, ptr, ptr, ptr, fpst, i32)
394
395
DEF_HELPER_FLAGS_5(sve_frint_h, TCG_CALL_NO_RWG,
396
- void, ptr, ptr, ptr, ptr, i32)
397
+ void, ptr, ptr, ptr, fpst, i32)
398
DEF_HELPER_FLAGS_5(sve_frint_s, TCG_CALL_NO_RWG,
399
- void, ptr, ptr, ptr, ptr, i32)
400
+ void, ptr, ptr, ptr, fpst, i32)
401
DEF_HELPER_FLAGS_5(sve_frint_d, TCG_CALL_NO_RWG,
402
- void, ptr, ptr, ptr, ptr, i32)
403
+ void, ptr, ptr, ptr, fpst, i32)
404
405
DEF_HELPER_FLAGS_5(sve_frintx_h, TCG_CALL_NO_RWG,
406
- void, ptr, ptr, ptr, ptr, i32)
407
+ void, ptr, ptr, ptr, fpst, i32)
408
DEF_HELPER_FLAGS_5(sve_frintx_s, TCG_CALL_NO_RWG,
409
- void, ptr, ptr, ptr, ptr, i32)
410
+ void, ptr, ptr, ptr, fpst, i32)
411
DEF_HELPER_FLAGS_5(sve_frintx_d, TCG_CALL_NO_RWG,
412
- void, ptr, ptr, ptr, ptr, i32)
413
+ void, ptr, ptr, ptr, fpst, i32)
414
415
DEF_HELPER_FLAGS_5(sve_frecpx_h, TCG_CALL_NO_RWG,
416
- void, ptr, ptr, ptr, ptr, i32)
417
+ void, ptr, ptr, ptr, fpst, i32)
418
DEF_HELPER_FLAGS_5(sve_frecpx_s, TCG_CALL_NO_RWG,
419
- void, ptr, ptr, ptr, ptr, i32)
420
+ void, ptr, ptr, ptr, fpst, i32)
421
DEF_HELPER_FLAGS_5(sve_frecpx_d, TCG_CALL_NO_RWG,
422
- void, ptr, ptr, ptr, ptr, i32)
423
+ void, ptr, ptr, ptr, fpst, i32)
424
425
DEF_HELPER_FLAGS_5(sve_fsqrt_h, TCG_CALL_NO_RWG,
426
- void, ptr, ptr, ptr, ptr, i32)
427
+ void, ptr, ptr, ptr, fpst, i32)
428
DEF_HELPER_FLAGS_5(sve_fsqrt_s, TCG_CALL_NO_RWG,
429
- void, ptr, ptr, ptr, ptr, i32)
430
+ void, ptr, ptr, ptr, fpst, i32)
431
DEF_HELPER_FLAGS_5(sve_fsqrt_d, TCG_CALL_NO_RWG,
432
- void, ptr, ptr, ptr, ptr, i32)
433
+ void, ptr, ptr, ptr, fpst, i32)
434
435
DEF_HELPER_FLAGS_5(sve_scvt_hh, TCG_CALL_NO_RWG,
436
- void, ptr, ptr, ptr, ptr, i32)
437
+ void, ptr, ptr, ptr, fpst, i32)
438
DEF_HELPER_FLAGS_5(sve_scvt_sh, TCG_CALL_NO_RWG,
439
- void, ptr, ptr, ptr, ptr, i32)
440
+ void, ptr, ptr, ptr, fpst, i32)
441
DEF_HELPER_FLAGS_5(sve_scvt_dh, TCG_CALL_NO_RWG,
442
- void, ptr, ptr, ptr, ptr, i32)
443
+ void, ptr, ptr, ptr, fpst, i32)
444
DEF_HELPER_FLAGS_5(sve_scvt_ss, TCG_CALL_NO_RWG,
445
- void, ptr, ptr, ptr, ptr, i32)
446
+ void, ptr, ptr, ptr, fpst, i32)
447
DEF_HELPER_FLAGS_5(sve_scvt_sd, TCG_CALL_NO_RWG,
448
- void, ptr, ptr, ptr, ptr, i32)
449
+ void, ptr, ptr, ptr, fpst, i32)
450
DEF_HELPER_FLAGS_5(sve_scvt_ds, TCG_CALL_NO_RWG,
451
- void, ptr, ptr, ptr, ptr, i32)
452
+ void, ptr, ptr, ptr, fpst, i32)
453
DEF_HELPER_FLAGS_5(sve_scvt_dd, TCG_CALL_NO_RWG,
454
- void, ptr, ptr, ptr, ptr, i32)
455
+ void, ptr, ptr, ptr, fpst, i32)
456
457
DEF_HELPER_FLAGS_5(sve_ucvt_hh, TCG_CALL_NO_RWG,
458
- void, ptr, ptr, ptr, ptr, i32)
459
+ void, ptr, ptr, ptr, fpst, i32)
460
DEF_HELPER_FLAGS_5(sve_ucvt_sh, TCG_CALL_NO_RWG,
461
- void, ptr, ptr, ptr, ptr, i32)
462
+ void, ptr, ptr, ptr, fpst, i32)
463
DEF_HELPER_FLAGS_5(sve_ucvt_dh, TCG_CALL_NO_RWG,
464
- void, ptr, ptr, ptr, ptr, i32)
465
+ void, ptr, ptr, ptr, fpst, i32)
466
DEF_HELPER_FLAGS_5(sve_ucvt_ss, TCG_CALL_NO_RWG,
467
- void, ptr, ptr, ptr, ptr, i32)
468
+ void, ptr, ptr, ptr, fpst, i32)
469
DEF_HELPER_FLAGS_5(sve_ucvt_sd, TCG_CALL_NO_RWG,
470
- void, ptr, ptr, ptr, ptr, i32)
471
+ void, ptr, ptr, ptr, fpst, i32)
472
DEF_HELPER_FLAGS_5(sve_ucvt_ds, TCG_CALL_NO_RWG,
473
- void, ptr, ptr, ptr, ptr, i32)
474
+ void, ptr, ptr, ptr, fpst, i32)
475
DEF_HELPER_FLAGS_5(sve_ucvt_dd, TCG_CALL_NO_RWG,
476
- void, ptr, ptr, ptr, ptr, i32)
477
+ void, ptr, ptr, ptr, fpst, i32)
478
479
DEF_HELPER_FLAGS_6(sve_fcmge_h, TCG_CALL_NO_RWG,
480
- void, ptr, ptr, ptr, ptr, ptr, i32)
481
+ void, ptr, ptr, ptr, ptr, fpst, i32)
482
DEF_HELPER_FLAGS_6(sve_fcmge_s, TCG_CALL_NO_RWG,
483
- void, ptr, ptr, ptr, ptr, ptr, i32)
484
+ void, ptr, ptr, ptr, ptr, fpst, i32)
485
DEF_HELPER_FLAGS_6(sve_fcmge_d, TCG_CALL_NO_RWG,
486
- void, ptr, ptr, ptr, ptr, ptr, i32)
487
+ void, ptr, ptr, ptr, ptr, fpst, i32)
488
489
DEF_HELPER_FLAGS_6(sve_fcmgt_h, TCG_CALL_NO_RWG,
490
- void, ptr, ptr, ptr, ptr, ptr, i32)
491
+ void, ptr, ptr, ptr, ptr, fpst, i32)
492
DEF_HELPER_FLAGS_6(sve_fcmgt_s, TCG_CALL_NO_RWG,
493
- void, ptr, ptr, ptr, ptr, ptr, i32)
494
+ void, ptr, ptr, ptr, ptr, fpst, i32)
495
DEF_HELPER_FLAGS_6(sve_fcmgt_d, TCG_CALL_NO_RWG,
496
- void, ptr, ptr, ptr, ptr, ptr, i32)
497
+ void, ptr, ptr, ptr, ptr, fpst, i32)
498
499
DEF_HELPER_FLAGS_6(sve_fcmeq_h, TCG_CALL_NO_RWG,
500
- void, ptr, ptr, ptr, ptr, ptr, i32)
501
+ void, ptr, ptr, ptr, ptr, fpst, i32)
502
DEF_HELPER_FLAGS_6(sve_fcmeq_s, TCG_CALL_NO_RWG,
503
- void, ptr, ptr, ptr, ptr, ptr, i32)
504
+ void, ptr, ptr, ptr, ptr, fpst, i32)
505
DEF_HELPER_FLAGS_6(sve_fcmeq_d, TCG_CALL_NO_RWG,
506
- void, ptr, ptr, ptr, ptr, ptr, i32)
507
+ void, ptr, ptr, ptr, ptr, fpst, i32)
508
509
DEF_HELPER_FLAGS_6(sve_fcmne_h, TCG_CALL_NO_RWG,
510
- void, ptr, ptr, ptr, ptr, ptr, i32)
511
+ void, ptr, ptr, ptr, ptr, fpst, i32)
512
DEF_HELPER_FLAGS_6(sve_fcmne_s, TCG_CALL_NO_RWG,
513
- void, ptr, ptr, ptr, ptr, ptr, i32)
514
+ void, ptr, ptr, ptr, ptr, fpst, i32)
515
DEF_HELPER_FLAGS_6(sve_fcmne_d, TCG_CALL_NO_RWG,
516
- void, ptr, ptr, ptr, ptr, ptr, i32)
517
+ void, ptr, ptr, ptr, ptr, fpst, i32)
518
519
DEF_HELPER_FLAGS_6(sve_fcmuo_h, TCG_CALL_NO_RWG,
520
- void, ptr, ptr, ptr, ptr, ptr, i32)
521
+ void, ptr, ptr, ptr, ptr, fpst, i32)
522
DEF_HELPER_FLAGS_6(sve_fcmuo_s, TCG_CALL_NO_RWG,
523
- void, ptr, ptr, ptr, ptr, ptr, i32)
524
+ void, ptr, ptr, ptr, ptr, fpst, i32)
525
DEF_HELPER_FLAGS_6(sve_fcmuo_d, TCG_CALL_NO_RWG,
526
- void, ptr, ptr, ptr, ptr, ptr, i32)
527
+ void, ptr, ptr, ptr, ptr, fpst, i32)
528
529
DEF_HELPER_FLAGS_6(sve_facge_h, TCG_CALL_NO_RWG,
530
- void, ptr, ptr, ptr, ptr, ptr, i32)
531
+ void, ptr, ptr, ptr, ptr, fpst, i32)
532
DEF_HELPER_FLAGS_6(sve_facge_s, TCG_CALL_NO_RWG,
533
- void, ptr, ptr, ptr, ptr, ptr, i32)
534
+ void, ptr, ptr, ptr, ptr, fpst, i32)
535
DEF_HELPER_FLAGS_6(sve_facge_d, TCG_CALL_NO_RWG,
536
- void, ptr, ptr, ptr, ptr, ptr, i32)
537
+ void, ptr, ptr, ptr, ptr, fpst, i32)
538
539
DEF_HELPER_FLAGS_6(sve_facgt_h, TCG_CALL_NO_RWG,
540
- void, ptr, ptr, ptr, ptr, ptr, i32)
541
+ void, ptr, ptr, ptr, ptr, fpst, i32)
542
DEF_HELPER_FLAGS_6(sve_facgt_s, TCG_CALL_NO_RWG,
543
- void, ptr, ptr, ptr, ptr, ptr, i32)
544
+ void, ptr, ptr, ptr, ptr, fpst, i32)
545
DEF_HELPER_FLAGS_6(sve_facgt_d, TCG_CALL_NO_RWG,
546
- void, ptr, ptr, ptr, ptr, ptr, i32)
547
+ void, ptr, ptr, ptr, ptr, fpst, i32)
548
549
DEF_HELPER_FLAGS_6(sve_fcadd_h, TCG_CALL_NO_RWG,
550
- void, ptr, ptr, ptr, ptr, ptr, i32)
551
+ void, ptr, ptr, ptr, ptr, fpst, i32)
552
DEF_HELPER_FLAGS_6(sve_fcadd_s, TCG_CALL_NO_RWG,
553
- void, ptr, ptr, ptr, ptr, ptr, i32)
554
+ void, ptr, ptr, ptr, ptr, fpst, i32)
555
DEF_HELPER_FLAGS_6(sve_fcadd_d, TCG_CALL_NO_RWG,
556
- void, ptr, ptr, ptr, ptr, ptr, i32)
557
+ void, ptr, ptr, ptr, ptr, fpst, i32)
558
559
DEF_HELPER_FLAGS_7(sve_fmla_zpzzz_h, TCG_CALL_NO_RWG,
560
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
561
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
562
DEF_HELPER_FLAGS_7(sve_fmla_zpzzz_s, TCG_CALL_NO_RWG,
563
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
564
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
565
DEF_HELPER_FLAGS_7(sve_fmla_zpzzz_d, TCG_CALL_NO_RWG,
566
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
567
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
568
569
DEF_HELPER_FLAGS_7(sve_fmls_zpzzz_h, TCG_CALL_NO_RWG,
570
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
571
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
572
DEF_HELPER_FLAGS_7(sve_fmls_zpzzz_s, TCG_CALL_NO_RWG,
573
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
574
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
575
DEF_HELPER_FLAGS_7(sve_fmls_zpzzz_d, TCG_CALL_NO_RWG,
576
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
577
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
578
579
DEF_HELPER_FLAGS_7(sve_fnmla_zpzzz_h, TCG_CALL_NO_RWG,
580
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
581
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
582
DEF_HELPER_FLAGS_7(sve_fnmla_zpzzz_s, TCG_CALL_NO_RWG,
583
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
584
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
585
DEF_HELPER_FLAGS_7(sve_fnmla_zpzzz_d, TCG_CALL_NO_RWG,
586
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
587
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
588
589
DEF_HELPER_FLAGS_7(sve_fnmls_zpzzz_h, TCG_CALL_NO_RWG,
590
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
591
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
592
DEF_HELPER_FLAGS_7(sve_fnmls_zpzzz_s, TCG_CALL_NO_RWG,
593
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
594
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
595
DEF_HELPER_FLAGS_7(sve_fnmls_zpzzz_d, TCG_CALL_NO_RWG,
596
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
597
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
598
599
DEF_HELPER_FLAGS_7(sve_fcmla_zpzzz_h, TCG_CALL_NO_RWG,
600
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
601
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
602
DEF_HELPER_FLAGS_7(sve_fcmla_zpzzz_s, TCG_CALL_NO_RWG,
603
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
604
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
605
DEF_HELPER_FLAGS_7(sve_fcmla_zpzzz_d, TCG_CALL_NO_RWG,
606
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
607
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
608
609
-DEF_HELPER_FLAGS_5(sve_ftmad_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
610
-DEF_HELPER_FLAGS_5(sve_ftmad_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
611
-DEF_HELPER_FLAGS_5(sve_ftmad_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
612
+DEF_HELPER_FLAGS_5(sve_ftmad_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
613
+DEF_HELPER_FLAGS_5(sve_ftmad_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
614
+DEF_HELPER_FLAGS_5(sve_ftmad_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
615
616
DEF_HELPER_FLAGS_4(sve2_saddl_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
617
DEF_HELPER_FLAGS_4(sve2_saddl_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
618
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(sve2_xar_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
619
DEF_HELPER_FLAGS_4(sve2_xar_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
620
621
DEF_HELPER_FLAGS_6(sve2_faddp_zpzz_h, TCG_CALL_NO_RWG,
622
- void, ptr, ptr, ptr, ptr, ptr, i32)
623
+ void, ptr, ptr, ptr, ptr, fpst, i32)
624
DEF_HELPER_FLAGS_6(sve2_faddp_zpzz_s, TCG_CALL_NO_RWG,
625
- void, ptr, ptr, ptr, ptr, ptr, i32)
626
+ void, ptr, ptr, ptr, ptr, fpst, i32)
627
DEF_HELPER_FLAGS_6(sve2_faddp_zpzz_d, TCG_CALL_NO_RWG,
628
- void, ptr, ptr, ptr, ptr, ptr, i32)
629
+ void, ptr, ptr, ptr, ptr, fpst, i32)
630
631
DEF_HELPER_FLAGS_6(sve2_fmaxnmp_zpzz_h, TCG_CALL_NO_RWG,
632
- void, ptr, ptr, ptr, ptr, ptr, i32)
633
+ void, ptr, ptr, ptr, ptr, fpst, i32)
634
DEF_HELPER_FLAGS_6(sve2_fmaxnmp_zpzz_s, TCG_CALL_NO_RWG,
635
- void, ptr, ptr, ptr, ptr, ptr, i32)
636
+ void, ptr, ptr, ptr, ptr, fpst, i32)
637
DEF_HELPER_FLAGS_6(sve2_fmaxnmp_zpzz_d, TCG_CALL_NO_RWG,
638
- void, ptr, ptr, ptr, ptr, ptr, i32)
639
+ void, ptr, ptr, ptr, ptr, fpst, i32)
640
641
DEF_HELPER_FLAGS_6(sve2_fminnmp_zpzz_h, TCG_CALL_NO_RWG,
642
- void, ptr, ptr, ptr, ptr, ptr, i32)
643
+ void, ptr, ptr, ptr, ptr, fpst, i32)
644
DEF_HELPER_FLAGS_6(sve2_fminnmp_zpzz_s, TCG_CALL_NO_RWG,
645
- void, ptr, ptr, ptr, ptr, ptr, i32)
646
+ void, ptr, ptr, ptr, ptr, fpst, i32)
647
DEF_HELPER_FLAGS_6(sve2_fminnmp_zpzz_d, TCG_CALL_NO_RWG,
648
- void, ptr, ptr, ptr, ptr, ptr, i32)
649
+ void, ptr, ptr, ptr, ptr, fpst, i32)
650
651
DEF_HELPER_FLAGS_6(sve2_fmaxp_zpzz_h, TCG_CALL_NO_RWG,
652
- void, ptr, ptr, ptr, ptr, ptr, i32)
653
+ void, ptr, ptr, ptr, ptr, fpst, i32)
654
DEF_HELPER_FLAGS_6(sve2_fmaxp_zpzz_s, TCG_CALL_NO_RWG,
655
- void, ptr, ptr, ptr, ptr, ptr, i32)
656
+ void, ptr, ptr, ptr, ptr, fpst, i32)
657
DEF_HELPER_FLAGS_6(sve2_fmaxp_zpzz_d, TCG_CALL_NO_RWG,
658
- void, ptr, ptr, ptr, ptr, ptr, i32)
659
+ void, ptr, ptr, ptr, ptr, fpst, i32)
660
661
DEF_HELPER_FLAGS_6(sve2_fminp_zpzz_h, TCG_CALL_NO_RWG,
662
- void, ptr, ptr, ptr, ptr, ptr, i32)
663
+ void, ptr, ptr, ptr, ptr, fpst, i32)
664
DEF_HELPER_FLAGS_6(sve2_fminp_zpzz_s, TCG_CALL_NO_RWG,
665
- void, ptr, ptr, ptr, ptr, ptr, i32)
666
+ void, ptr, ptr, ptr, ptr, fpst, i32)
667
DEF_HELPER_FLAGS_6(sve2_fminp_zpzz_d, TCG_CALL_NO_RWG,
668
- void, ptr, ptr, ptr, ptr, ptr, i32)
669
+ void, ptr, ptr, ptr, ptr, fpst, i32)
670
671
DEF_HELPER_FLAGS_5(sve2_eor3, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
672
DEF_HELPER_FLAGS_5(sve2_bcax, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
673
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(sve2_sqrdcmlah_zzzz_s, TCG_CALL_NO_RWG,
674
DEF_HELPER_FLAGS_5(sve2_sqrdcmlah_zzzz_d, TCG_CALL_NO_RWG,
675
void, ptr, ptr, ptr, ptr, i32)
676
677
-DEF_HELPER_FLAGS_6(fmmla_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, ptr, i32)
678
-DEF_HELPER_FLAGS_6(fmmla_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, ptr, i32)
679
+DEF_HELPER_FLAGS_6(fmmla_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, fpst, i32)
680
+DEF_HELPER_FLAGS_6(fmmla_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, fpst, i32)
681
682
DEF_HELPER_FLAGS_5(sve2_sqrdmlah_idx_h, TCG_CALL_NO_RWG,
683
void, ptr, ptr, ptr, ptr, i32)
684
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(sve2_cdot_idx_d, TCG_CALL_NO_RWG,
685
void, ptr, ptr, ptr, ptr, i32)
686
687
DEF_HELPER_FLAGS_5(sve2_fcvtnt_sh, TCG_CALL_NO_RWG,
688
- void, ptr, ptr, ptr, ptr, i32)
689
+ void, ptr, ptr, ptr, fpst, i32)
690
DEF_HELPER_FLAGS_5(sve2_fcvtnt_ds, TCG_CALL_NO_RWG,
691
- void, ptr, ptr, ptr, ptr, i32)
692
+ void, ptr, ptr, ptr, fpst, i32)
693
DEF_HELPER_FLAGS_5(sve_bfcvtnt, TCG_CALL_NO_RWG,
694
- void, ptr, ptr, ptr, ptr, i32)
695
+ void, ptr, ptr, ptr, fpst, i32)
696
697
DEF_HELPER_FLAGS_5(sve2_fcvtlt_hs, TCG_CALL_NO_RWG,
698
- void, ptr, ptr, ptr, ptr, i32)
699
+ void, ptr, ptr, ptr, fpst, i32)
700
DEF_HELPER_FLAGS_5(sve2_fcvtlt_sd, TCG_CALL_NO_RWG,
701
- void, ptr, ptr, ptr, ptr, i32)
702
+ void, ptr, ptr, ptr, fpst, i32)
703
704
-DEF_HELPER_FLAGS_5(flogb_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
705
-DEF_HELPER_FLAGS_5(flogb_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
706
-DEF_HELPER_FLAGS_5(flogb_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
707
+DEF_HELPER_FLAGS_5(flogb_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
708
+DEF_HELPER_FLAGS_5(flogb_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
709
+DEF_HELPER_FLAGS_5(flogb_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, fpst, i32)
710
711
DEF_HELPER_FLAGS_4(sve2_sqshl_zpzi_b, TCG_CALL_NO_RWG,
712
void, ptr, ptr, ptr, i32)
713
diff --git a/target/arm/tcg/sve_helper.c b/target/arm/tcg/sve_helper.c
714
index XXXXXXX..XXXXXXX 100644
715
--- a/target/arm/tcg/sve_helper.c
716
+++ b/target/arm/tcg/sve_helper.c
717
@@ -XXX,XX +XXX,XX @@ DO_ZPZZ_PAIR_D(sve2_sminp_zpzz_d, int64_t, DO_MIN)
718
719
#define DO_ZPZZ_PAIR_FP(NAME, TYPE, H, OP) \
720
void HELPER(NAME)(void *vd, void *vn, void *vm, void *vg, \
721
- void *status, uint32_t desc) \
722
+ float_status *status, uint32_t desc) \
723
{ \
724
intptr_t i, opr_sz = simd_oprsz(desc); \
725
for (i = 0; i < opr_sz; ) { \
726
@@ -XXX,XX +XXX,XX @@ static TYPE NAME##_reduce(TYPE *data, float_status *status, uintptr_t n) \
727
return TYPE##_##FUNC(lo, hi, status); \
728
} \
729
} \
730
-uint64_t HELPER(NAME)(void *vn, void *vg, void *vs, uint32_t desc) \
731
+uint64_t HELPER(NAME)(void *vn, void *vg, float_status *s, uint32_t desc) \
732
{ \
733
uintptr_t i, oprsz = simd_oprsz(desc), maxsz = simd_data(desc); \
734
TYPE data[sizeof(ARMVectorReg) / sizeof(TYPE)]; \
735
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(NAME)(void *vn, void *vg, void *vs, uint32_t desc) \
736
for (; i < maxsz; i += sizeof(TYPE)) { \
737
*(TYPE *)((void *)data + i) = IDENT; \
738
} \
739
- return NAME##_reduce(data, vs, maxsz / sizeof(TYPE)); \
740
+ return NAME##_reduce(data, s, maxsz / sizeof(TYPE)); \
741
}
742
743
DO_REDUCE(sve_faddv_h, float16, H1_2, add, float16_zero)
744
@@ -XXX,XX +XXX,XX @@ DO_REDUCE(sve_fmaxv_d, float64, H1_8, max, float64_chs(float64_infinity))
745
#undef DO_REDUCE
746
747
uint64_t HELPER(sve_fadda_h)(uint64_t nn, void *vm, void *vg,
748
- void *status, uint32_t desc)
749
+ float_status *status, uint32_t desc)
750
{
751
intptr_t i = 0, opr_sz = simd_oprsz(desc);
752
float16 result = nn;
753
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(sve_fadda_h)(uint64_t nn, void *vm, void *vg,
754
}
755
756
uint64_t HELPER(sve_fadda_s)(uint64_t nn, void *vm, void *vg,
757
- void *status, uint32_t desc)
758
+ float_status *status, uint32_t desc)
759
{
760
intptr_t i = 0, opr_sz = simd_oprsz(desc);
761
float32 result = nn;
762
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(sve_fadda_s)(uint64_t nn, void *vm, void *vg,
763
}
764
765
uint64_t HELPER(sve_fadda_d)(uint64_t nn, void *vm, void *vg,
766
- void *status, uint32_t desc)
767
+ float_status *status, uint32_t desc)
768
{
769
intptr_t i = 0, opr_sz = simd_oprsz(desc) / 8;
770
uint64_t *m = vm;
771
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(sve_fadda_d)(uint64_t nn, void *vm, void *vg,
772
*/
773
#define DO_ZPZZ_FP(NAME, TYPE, H, OP) \
774
void HELPER(NAME)(void *vd, void *vn, void *vm, void *vg, \
775
- void *status, uint32_t desc) \
776
+ float_status *status, uint32_t desc) \
777
{ \
778
intptr_t i = simd_oprsz(desc); \
779
uint64_t *g = vg; \
780
@@ -XXX,XX +XXX,XX @@ DO_ZPZZ_FP(sve_fmulx_d, uint64_t, H1_8, helper_vfp_mulxd)
781
*/
782
#define DO_ZPZS_FP(NAME, TYPE, H, OP) \
783
void HELPER(NAME)(void *vd, void *vn, void *vg, uint64_t scalar, \
784
- void *status, uint32_t desc) \
785
+ float_status *status, uint32_t desc) \
786
{ \
787
intptr_t i = simd_oprsz(desc); \
788
uint64_t *g = vg; \
789
@@ -XXX,XX +XXX,XX @@ DO_ZPZS_FP(sve_fmins_d, float64, H1_8, float64_min)
790
* With the extra float_status parameter.
791
*/
792
#define DO_ZPZ_FP(NAME, TYPE, H, OP) \
793
-void HELPER(NAME)(void *vd, void *vn, void *vg, void *status, uint32_t desc) \
794
+void HELPER(NAME)(void *vd, void *vn, void *vg, \
795
+ float_status *status, uint32_t desc) \
796
{ \
797
intptr_t i = simd_oprsz(desc); \
798
uint64_t *g = vg; \
799
@@ -XXX,XX +XXX,XX @@ static void do_fmla_zpzzz_h(void *vd, void *vn, void *vm, void *va, void *vg,
800
}
801
802
void HELPER(sve_fmla_zpzzz_h)(void *vd, void *vn, void *vm, void *va,
803
- void *vg, void *status, uint32_t desc)
804
+ void *vg, float_status *status, uint32_t desc)
805
{
806
do_fmla_zpzzz_h(vd, vn, vm, va, vg, status, desc, 0, 0);
807
}
808
809
void HELPER(sve_fmls_zpzzz_h)(void *vd, void *vn, void *vm, void *va,
810
- void *vg, void *status, uint32_t desc)
811
+ void *vg, float_status *status, uint32_t desc)
812
{
813
do_fmla_zpzzz_h(vd, vn, vm, va, vg, status, desc, 0x8000, 0);
814
}
815
816
void HELPER(sve_fnmla_zpzzz_h)(void *vd, void *vn, void *vm, void *va,
817
- void *vg, void *status, uint32_t desc)
818
+ void *vg, float_status *status, uint32_t desc)
819
{
820
do_fmla_zpzzz_h(vd, vn, vm, va, vg, status, desc, 0x8000, 0x8000);
821
}
822
823
void HELPER(sve_fnmls_zpzzz_h)(void *vd, void *vn, void *vm, void *va,
824
- void *vg, void *status, uint32_t desc)
825
+ void *vg, float_status *status, uint32_t desc)
826
{
827
do_fmla_zpzzz_h(vd, vn, vm, va, vg, status, desc, 0, 0x8000);
828
}
829
@@ -XXX,XX +XXX,XX @@ static void do_fmla_zpzzz_s(void *vd, void *vn, void *vm, void *va, void *vg,
830
}
831
832
void HELPER(sve_fmla_zpzzz_s)(void *vd, void *vn, void *vm, void *va,
833
- void *vg, void *status, uint32_t desc)
834
+ void *vg, float_status *status, uint32_t desc)
835
{
836
do_fmla_zpzzz_s(vd, vn, vm, va, vg, status, desc, 0, 0);
837
}
838
839
void HELPER(sve_fmls_zpzzz_s)(void *vd, void *vn, void *vm, void *va,
840
- void *vg, void *status, uint32_t desc)
841
+ void *vg, float_status *status, uint32_t desc)
842
{
843
do_fmla_zpzzz_s(vd, vn, vm, va, vg, status, desc, 0x80000000, 0);
844
}
845
846
void HELPER(sve_fnmla_zpzzz_s)(void *vd, void *vn, void *vm, void *va,
847
- void *vg, void *status, uint32_t desc)
848
+ void *vg, float_status *status, uint32_t desc)
849
{
850
do_fmla_zpzzz_s(vd, vn, vm, va, vg, status, desc, 0x80000000, 0x80000000);
851
}
852
853
void HELPER(sve_fnmls_zpzzz_s)(void *vd, void *vn, void *vm, void *va,
854
- void *vg, void *status, uint32_t desc)
855
+ void *vg, float_status *status, uint32_t desc)
856
{
857
do_fmla_zpzzz_s(vd, vn, vm, va, vg, status, desc, 0, 0x80000000);
858
}
859
@@ -XXX,XX +XXX,XX @@ static void do_fmla_zpzzz_d(void *vd, void *vn, void *vm, void *va, void *vg,
860
}
861
862
void HELPER(sve_fmla_zpzzz_d)(void *vd, void *vn, void *vm, void *va,
863
- void *vg, void *status, uint32_t desc)
864
+ void *vg, float_status *status, uint32_t desc)
865
{
866
do_fmla_zpzzz_d(vd, vn, vm, va, vg, status, desc, 0, 0);
867
}
868
869
void HELPER(sve_fmls_zpzzz_d)(void *vd, void *vn, void *vm, void *va,
870
- void *vg, void *status, uint32_t desc)
871
+ void *vg, float_status *status, uint32_t desc)
872
{
873
do_fmla_zpzzz_d(vd, vn, vm, va, vg, status, desc, INT64_MIN, 0);
874
}
875
876
void HELPER(sve_fnmla_zpzzz_d)(void *vd, void *vn, void *vm, void *va,
877
- void *vg, void *status, uint32_t desc)
878
+ void *vg, float_status *status, uint32_t desc)
879
{
880
do_fmla_zpzzz_d(vd, vn, vm, va, vg, status, desc, INT64_MIN, INT64_MIN);
881
}
882
883
void HELPER(sve_fnmls_zpzzz_d)(void *vd, void *vn, void *vm, void *va,
884
- void *vg, void *status, uint32_t desc)
885
+ void *vg, float_status *status, uint32_t desc)
886
{
887
do_fmla_zpzzz_d(vd, vn, vm, va, vg, status, desc, 0, INT64_MIN);
888
}
889
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_fnmls_zpzzz_d)(void *vd, void *vn, void *vm, void *va,
890
*/
891
#define DO_FPCMP_PPZZ(NAME, TYPE, H, OP) \
892
void HELPER(NAME)(void *vd, void *vn, void *vm, void *vg, \
893
- void *status, uint32_t desc) \
894
+ float_status *status, uint32_t desc) \
895
{ \
896
intptr_t i = simd_oprsz(desc), j = (i - 1) >> 6; \
897
uint64_t *d = vd, *g = vg; \
898
@@ -XXX,XX +XXX,XX @@ DO_FPCMP_PPZZ_ALL(sve_facgt, DO_FACGT)
899
*/
900
#define DO_FPCMP_PPZ0(NAME, TYPE, H, OP) \
901
void HELPER(NAME)(void *vd, void *vn, void *vg, \
902
- void *status, uint32_t desc) \
903
+ float_status *status, uint32_t desc) \
904
{ \
905
intptr_t i = simd_oprsz(desc), j = (i - 1) >> 6; \
906
uint64_t *d = vd, *g = vg; \
907
@@ -XXX,XX +XXX,XX @@ DO_FPCMP_PPZ0_ALL(sve_fcmne0, DO_FCMNE)
908
909
/* FP Trig Multiply-Add. */
910
911
-void HELPER(sve_ftmad_h)(void *vd, void *vn, void *vm, void *vs, uint32_t desc)
912
+void HELPER(sve_ftmad_h)(void *vd, void *vn, void *vm,
913
+ float_status *s, uint32_t desc)
914
{
915
static const float16 coeff[16] = {
916
0x3c00, 0xb155, 0x2030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
917
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_ftmad_h)(void *vd, void *vn, void *vm, void *vs, uint32_t desc)
918
mm = float16_abs(mm);
919
xx += 8;
920
}
921
- d[i] = float16_muladd(n[i], mm, coeff[xx], 0, vs);
922
+ d[i] = float16_muladd(n[i], mm, coeff[xx], 0, s);
23
}
923
}
24
}
924
}
25
925
926
-void HELPER(sve_ftmad_s)(void *vd, void *vn, void *vm, void *vs, uint32_t desc)
927
+void HELPER(sve_ftmad_s)(void *vd, void *vn, void *vm,
928
+ float_status *s, uint32_t desc)
929
{
930
static const float32 coeff[16] = {
931
0x3f800000, 0xbe2aaaab, 0x3c088886, 0xb95008b9,
932
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_ftmad_s)(void *vd, void *vn, void *vm, void *vs, uint32_t desc)
933
mm = float32_abs(mm);
934
xx += 8;
935
}
936
- d[i] = float32_muladd(n[i], mm, coeff[xx], 0, vs);
937
+ d[i] = float32_muladd(n[i], mm, coeff[xx], 0, s);
938
}
939
}
940
941
-void HELPER(sve_ftmad_d)(void *vd, void *vn, void *vm, void *vs, uint32_t desc)
942
+void HELPER(sve_ftmad_d)(void *vd, void *vn, void *vm,
943
+ float_status *s, uint32_t desc)
944
{
945
static const float64 coeff[16] = {
946
0x3ff0000000000000ull, 0xbfc5555555555543ull,
947
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_ftmad_d)(void *vd, void *vn, void *vm, void *vs, uint32_t desc)
948
mm = float64_abs(mm);
949
xx += 8;
950
}
951
- d[i] = float64_muladd(n[i], mm, coeff[xx], 0, vs);
952
+ d[i] = float64_muladd(n[i], mm, coeff[xx], 0, s);
953
}
954
}
955
956
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_ftmad_d)(void *vd, void *vn, void *vm, void *vs, uint32_t desc)
957
*/
958
959
void HELPER(sve_fcadd_h)(void *vd, void *vn, void *vm, void *vg,
960
- void *vs, uint32_t desc)
961
+ float_status *s, uint32_t desc)
962
{
963
intptr_t j, i = simd_oprsz(desc);
964
uint64_t *g = vg;
965
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_fcadd_h)(void *vd, void *vn, void *vm, void *vg,
966
e3 = *(float16 *)(vm + H1_2(i)) ^ neg_imag;
967
968
if (likely((pg >> (i & 63)) & 1)) {
969
- *(float16 *)(vd + H1_2(i)) = float16_add(e0, e1, vs);
970
+ *(float16 *)(vd + H1_2(i)) = float16_add(e0, e1, s);
971
}
972
if (likely((pg >> (j & 63)) & 1)) {
973
- *(float16 *)(vd + H1_2(j)) = float16_add(e2, e3, vs);
974
+ *(float16 *)(vd + H1_2(j)) = float16_add(e2, e3, s);
975
}
976
} while (i & 63);
977
} while (i != 0);
978
}
979
980
void HELPER(sve_fcadd_s)(void *vd, void *vn, void *vm, void *vg,
981
- void *vs, uint32_t desc)
982
+ float_status *s, uint32_t desc)
983
{
984
intptr_t j, i = simd_oprsz(desc);
985
uint64_t *g = vg;
986
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_fcadd_s)(void *vd, void *vn, void *vm, void *vg,
987
e3 = *(float32 *)(vm + H1_2(i)) ^ neg_imag;
988
989
if (likely((pg >> (i & 63)) & 1)) {
990
- *(float32 *)(vd + H1_2(i)) = float32_add(e0, e1, vs);
991
+ *(float32 *)(vd + H1_2(i)) = float32_add(e0, e1, s);
992
}
993
if (likely((pg >> (j & 63)) & 1)) {
994
- *(float32 *)(vd + H1_2(j)) = float32_add(e2, e3, vs);
995
+ *(float32 *)(vd + H1_2(j)) = float32_add(e2, e3, s);
996
}
997
} while (i & 63);
998
} while (i != 0);
999
}
1000
1001
void HELPER(sve_fcadd_d)(void *vd, void *vn, void *vm, void *vg,
1002
- void *vs, uint32_t desc)
1003
+ float_status *s, uint32_t desc)
1004
{
1005
intptr_t j, i = simd_oprsz(desc);
1006
uint64_t *g = vg;
1007
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_fcadd_d)(void *vd, void *vn, void *vm, void *vg,
1008
e3 = *(float64 *)(vm + H1_2(i)) ^ neg_imag;
1009
1010
if (likely((pg >> (i & 63)) & 1)) {
1011
- *(float64 *)(vd + H1_2(i)) = float64_add(e0, e1, vs);
1012
+ *(float64 *)(vd + H1_2(i)) = float64_add(e0, e1, s);
1013
}
1014
if (likely((pg >> (j & 63)) & 1)) {
1015
- *(float64 *)(vd + H1_2(j)) = float64_add(e2, e3, vs);
1016
+ *(float64 *)(vd + H1_2(j)) = float64_add(e2, e3, s);
1017
}
1018
} while (i & 63);
1019
} while (i != 0);
1020
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_fcadd_d)(void *vd, void *vn, void *vm, void *vg,
1021
*/
1022
1023
void HELPER(sve_fcmla_zpzzz_h)(void *vd, void *vn, void *vm, void *va,
1024
- void *vg, void *status, uint32_t desc)
1025
+ void *vg, float_status *status, uint32_t desc)
1026
{
1027
intptr_t j, i = simd_oprsz(desc);
1028
unsigned rot = simd_data(desc);
1029
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_fcmla_zpzzz_h)(void *vd, void *vn, void *vm, void *va,
1030
}
1031
1032
void HELPER(sve_fcmla_zpzzz_s)(void *vd, void *vn, void *vm, void *va,
1033
- void *vg, void *status, uint32_t desc)
1034
+ void *vg, float_status *status, uint32_t desc)
1035
{
1036
intptr_t j, i = simd_oprsz(desc);
1037
unsigned rot = simd_data(desc);
1038
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_fcmla_zpzzz_s)(void *vd, void *vn, void *vm, void *va,
1039
}
1040
1041
void HELPER(sve_fcmla_zpzzz_d)(void *vd, void *vn, void *vm, void *va,
1042
- void *vg, void *status, uint32_t desc)
1043
+ void *vg, float_status *status, uint32_t desc)
1044
{
1045
intptr_t j, i = simd_oprsz(desc);
1046
unsigned rot = simd_data(desc);
1047
@@ -XXX,XX +XXX,XX @@ void HELPER(sve2_xar_s)(void *vd, void *vn, void *vm, uint32_t desc)
1048
}
1049
1050
void HELPER(fmmla_s)(void *vd, void *vn, void *vm, void *va,
1051
- void *status, uint32_t desc)
1052
+ float_status *status, uint32_t desc)
1053
{
1054
intptr_t s, opr_sz = simd_oprsz(desc) / (sizeof(float32) * 4);
1055
1056
@@ -XXX,XX +XXX,XX @@ void HELPER(fmmla_s)(void *vd, void *vn, void *vm, void *va,
1057
}
1058
1059
void HELPER(fmmla_d)(void *vd, void *vn, void *vm, void *va,
1060
- void *status, uint32_t desc)
1061
+ float_status *status, uint32_t desc)
1062
{
1063
intptr_t s, opr_sz = simd_oprsz(desc) / (sizeof(float64) * 4);
1064
1065
@@ -XXX,XX +XXX,XX @@ void HELPER(fmmla_d)(void *vd, void *vn, void *vm, void *va,
1066
}
1067
1068
#define DO_FCVTNT(NAME, TYPEW, TYPEN, HW, HN, OP) \
1069
-void HELPER(NAME)(void *vd, void *vn, void *vg, void *status, uint32_t desc) \
1070
+void HELPER(NAME)(void *vd, void *vn, void *vg, \
1071
+ float_status *status, uint32_t desc) \
1072
{ \
1073
intptr_t i = simd_oprsz(desc); \
1074
uint64_t *g = vg; \
1075
@@ -XXX,XX +XXX,XX @@ DO_FCVTNT(sve2_fcvtnt_sh, uint32_t, uint16_t, H1_4, H1_2, sve_f32_to_f16)
1076
DO_FCVTNT(sve2_fcvtnt_ds, uint64_t, uint32_t, H1_8, H1_4, float64_to_float32)
1077
1078
#define DO_FCVTLT(NAME, TYPEW, TYPEN, HW, HN, OP) \
1079
-void HELPER(NAME)(void *vd, void *vn, void *vg, void *status, uint32_t desc) \
1080
+void HELPER(NAME)(void *vd, void *vn, void *vg, \
1081
+ float_status *status, uint32_t desc) \
1082
{ \
1083
intptr_t i = simd_oprsz(desc); \
1084
uint64_t *g = vg; \
26
--
1085
--
27
2.20.1
1086
2.34.1
28
1087
29
1088
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
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
5
Signed-off-by: Steffen Görtz <contrib@steffen-goertz.de>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
5
Message-id: 20241206031224.78525-8-richard.henderson@linaro.org
8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9
Message-id: 20190123212234.32068-5-stefanha@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
7
---
12
include/hw/arm/nrf51_soc.h | 2 ++
8
target/arm/tcg/helper-sme.h | 4 ++--
13
hw/arm/nrf51_soc.c | 41 +++++++++++++++++++++++++++-----------
9
target/arm/tcg/sme_helper.c | 8 ++++----
14
2 files changed, 31 insertions(+), 12 deletions(-)
10
2 files changed, 6 insertions(+), 6 deletions(-)
15
11
16
diff --git a/include/hw/arm/nrf51_soc.h b/include/hw/arm/nrf51_soc.h
12
diff --git a/target/arm/tcg/helper-sme.h b/target/arm/tcg/helper-sme.h
17
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/nrf51_soc.h
14
--- a/target/arm/tcg/helper-sme.h
19
+++ b/include/hw/arm/nrf51_soc.h
15
+++ b/target/arm/tcg/helper-sme.h
20
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(sme_addva_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
21
#include "hw/char/nrf51_uart.h"
17
DEF_HELPER_FLAGS_7(sme_fmopa_h, TCG_CALL_NO_RWG,
22
#include "hw/misc/nrf51_rng.h"
18
void, ptr, ptr, ptr, ptr, ptr, env, i32)
23
#include "hw/gpio/nrf51_gpio.h"
19
DEF_HELPER_FLAGS_7(sme_fmopa_s, TCG_CALL_NO_RWG,
24
+#include "hw/nvram/nrf51_nvm.h"
20
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
25
#include "hw/timer/nrf51_timer.h"
21
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
26
22
DEF_HELPER_FLAGS_7(sme_fmopa_d, TCG_CALL_NO_RWG,
27
#define TYPE_NRF51_SOC "nrf51-soc"
23
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
28
@@ -XXX,XX +XXX,XX @@ typedef struct NRF51State {
24
+ void, ptr, ptr, ptr, ptr, ptr, fpst, i32)
29
25
DEF_HELPER_FLAGS_7(sme_bfmopa, TCG_CALL_NO_RWG,
30
NRF51UARTState uart;
26
void, ptr, ptr, ptr, ptr, ptr, env, i32)
31
NRF51RNGState rng;
27
DEF_HELPER_FLAGS_6(sme_smopa_s, TCG_CALL_NO_RWG,
32
+ NRF51NVMState nvm;
28
diff --git a/target/arm/tcg/sme_helper.c b/target/arm/tcg/sme_helper.c
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
29
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/arm/nrf51_soc.c
30
--- a/target/arm/tcg/sme_helper.c
39
+++ b/hw/arm/nrf51_soc.c
31
+++ b/target/arm/tcg/sme_helper.c
40
@@ -XXX,XX +XXX,XX @@
32
@@ -XXX,XX +XXX,XX @@ void HELPER(sme_addva_d)(void *vzda, void *vzn, void *vpn,
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, NULL, "nrf51.sram", s->sram_size, &err);
66
if (err) {
67
error_propagate(errp, 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
+ }
79
+
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
}
33
}
107
@@ -XXX,XX +XXX,XX @@ static void nrf51_soc_init(Object *obj)
34
108
sysbus_init_child_obj(obj, "rng", &s->rng, sizeof(s->rng),
35
void HELPER(sme_fmopa_s)(void *vza, void *vzn, void *vzm, void *vpn,
109
TYPE_NRF51_RNG);
36
- void *vpm, void *vst, uint32_t desc)
110
37
+ void *vpm, float_status *fpst_in, uint32_t desc)
111
+ sysbus_init_child_obj(obj, "nvm", &s->nvm, sizeof(s->nvm), TYPE_NRF51_NVM);
38
{
112
+
39
intptr_t row, col, oprsz = simd_maxsz(desc);
113
sysbus_init_child_obj(obj, "gpio", &s->gpio, sizeof(s->gpio),
40
uint32_t neg = simd_data(desc) << 31;
114
TYPE_NRF51_GPIO);
41
@@ -XXX,XX +XXX,XX @@ void HELPER(sme_fmopa_s)(void *vza, void *vzn, void *vzm, void *vpn,
42
* update the cumulative fp exception status. It also produces
43
* default nans.
44
*/
45
- fpst = *(float_status *)vst;
46
+ fpst = *fpst_in;
47
set_default_nan_mode(true, &fpst);
48
49
for (row = 0; row < oprsz; ) {
50
@@ -XXX,XX +XXX,XX @@ void HELPER(sme_fmopa_s)(void *vza, void *vzn, void *vzm, void *vpn,
51
}
52
53
void HELPER(sme_fmopa_d)(void *vza, void *vzn, void *vzm, void *vpn,
54
- void *vpm, void *vst, uint32_t desc)
55
+ void *vpm, float_status *fpst_in, uint32_t desc)
56
{
57
intptr_t row, col, oprsz = simd_oprsz(desc) / 8;
58
uint64_t neg = (uint64_t)simd_data(desc) << 63;
59
uint64_t *za = vza, *zn = vzn, *zm = vzm;
60
uint8_t *pn = vpn, *pm = vpm;
61
- float_status fpst = *(float_status *)vst;
62
+ float_status fpst = *fpst_in;
63
64
set_default_nan_mode(true, &fpst);
115
65
116
--
66
--
117
2.20.1
67
2.34.1
118
119
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The m25p80 models dummy cycles using byte transfers. This works well
3
Allow the helpers to receive CPUARMState* directly
4
when the transfers are initiated by the QEMU model of a SPI controller
4
instead of via void*.
5
but when these are initiated by the OS, it breaks emulation.
6
5
7
Snoop the SPI transfer to catch commands requiring dummy cycles and
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
replace them with byte transfers compatible with the m25p80 model.
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
8
Message-id: 20241206031224.78525-9-richard.henderson@linaro.org
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
13
Message-id: 20190124140519.13838-5-clg@kaod.org
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
10
---
16
include/hw/ssi/aspeed_smc.h | 3 +
11
target/arm/helper.h | 12 ++++++------
17
hw/ssi/aspeed_smc.c | 115 +++++++++++++++++++++++++++++++++++-
12
target/arm/tcg/helper-a64.h | 2 +-
18
2 files changed, 115 insertions(+), 3 deletions(-)
13
target/arm/tcg/vec_helper.c | 21 +++++++--------------
14
3 files changed, 14 insertions(+), 21 deletions(-)
19
15
20
diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h
16
diff --git a/target/arm/helper.h b/target/arm/helper.h
21
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/ssi/aspeed_smc.h
18
--- a/target/arm/helper.h
23
+++ b/include/hw/ssi/aspeed_smc.h
19
+++ b/target/arm/helper.h
24
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSMCState {
20
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(gvec_suqadd_d, TCG_CALL_NO_RWG,
25
uint8_t conf_enable_w0;
21
void, ptr, ptr, ptr, ptr, i32)
26
22
27
AspeedSMCFlash *flashes;
23
DEF_HELPER_FLAGS_5(gvec_fmlal_a32, TCG_CALL_NO_RWG,
28
+
24
- void, ptr, ptr, ptr, ptr, i32)
29
+ uint8_t snoop_index;
25
+ void, ptr, ptr, ptr, env, i32)
30
+ uint8_t snoop_dummies;
26
DEF_HELPER_FLAGS_5(gvec_fmlal_a64, TCG_CALL_NO_RWG,
31
} AspeedSMCState;
27
- void, ptr, ptr, ptr, ptr, i32)
32
28
+ void, ptr, ptr, ptr, env, i32)
33
#endif /* ASPEED_SMC_H */
29
DEF_HELPER_FLAGS_5(gvec_fmlal_idx_a32, TCG_CALL_NO_RWG,
34
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
30
- void, ptr, ptr, ptr, ptr, i32)
31
+ void, ptr, ptr, ptr, env, i32)
32
DEF_HELPER_FLAGS_5(gvec_fmlal_idx_a64, TCG_CALL_NO_RWG,
33
- void, ptr, ptr, ptr, ptr, i32)
34
+ void, ptr, ptr, ptr, env, i32)
35
36
DEF_HELPER_FLAGS_2(frint32_s, TCG_CALL_NO_RWG, f32, f32, fpst)
37
DEF_HELPER_FLAGS_2(frint64_s, TCG_CALL_NO_RWG, f32, f32, fpst)
38
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(sve2_sqrdmulh_idx_d, TCG_CALL_NO_RWG,
39
void, ptr, ptr, ptr, i32)
40
41
DEF_HELPER_FLAGS_6(sve2_fmlal_zzzw_s, TCG_CALL_NO_RWG,
42
- void, ptr, ptr, ptr, ptr, ptr, i32)
43
+ void, ptr, ptr, ptr, ptr, env, i32)
44
DEF_HELPER_FLAGS_6(sve2_fmlal_zzxw_s, TCG_CALL_NO_RWG,
45
- void, ptr, ptr, ptr, ptr, ptr, i32)
46
+ void, ptr, ptr, ptr, ptr, env, i32)
47
48
DEF_HELPER_FLAGS_4(gvec_xar_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
49
50
diff --git a/target/arm/tcg/helper-a64.h b/target/arm/tcg/helper-a64.h
35
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/ssi/aspeed_smc.c
52
--- a/target/arm/tcg/helper-a64.h
37
+++ b/hw/ssi/aspeed_smc.c
53
+++ b/target/arm/tcg/helper-a64.h
38
@@ -XXX,XX +XXX,XX @@
54
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_cmps_a64, i64, f32, f32, fpst)
39
/* Flash opcodes. */
55
DEF_HELPER_3(vfp_cmpes_a64, i64, f32, f32, fpst)
40
#define SPI_OP_READ 0x03 /* Read data bytes (low frequency) */
56
DEF_HELPER_3(vfp_cmpd_a64, i64, f64, f64, fpst)
41
57
DEF_HELPER_3(vfp_cmped_a64, i64, f64, f64, fpst)
42
+#define SNOOP_OFF 0xFF
58
-DEF_HELPER_FLAGS_4(simd_tblx, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
43
+#define SNOOP_START 0x0
59
+DEF_HELPER_FLAGS_4(simd_tblx, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
44
+
60
DEF_HELPER_FLAGS_3(vfp_mulxs, TCG_CALL_NO_RWG, f32, f32, f32, fpst)
45
/*
61
DEF_HELPER_FLAGS_3(vfp_mulxd, TCG_CALL_NO_RWG, f64, f64, f64, fpst)
46
* Default segments mapping addresses and size for each slave per
62
DEF_HELPER_FLAGS_3(neon_ceq_f64, TCG_CALL_NO_RWG, i64, i64, i64, fpst)
47
* controller. These can be changed when board is initialized with the
63
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
48
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_smc_flash_read(void *opaque, hwaddr addr, unsigned size)
64
index XXXXXXX..XXXXXXX 100644
49
return ret;
65
--- a/target/arm/tcg/vec_helper.c
66
+++ b/target/arm/tcg/vec_helper.c
67
@@ -XXX,XX +XXX,XX @@ static void do_fmlal(float32 *d, void *vn, void *vm, float_status *fpst,
50
}
68
}
51
69
52
+/*
70
void HELPER(gvec_fmlal_a32)(void *vd, void *vn, void *vm,
53
+ * TODO (clg@kaod.org): stolen from xilinx_spips.c. Should move to a
71
- void *venv, uint32_t desc)
54
+ * common include header.
72
+ CPUARMState *env, uint32_t desc)
55
+ */
56
+typedef enum {
57
+ READ = 0x3, READ_4 = 0x13,
58
+ FAST_READ = 0xb, FAST_READ_4 = 0x0c,
59
+ DOR = 0x3b, DOR_4 = 0x3c,
60
+ QOR = 0x6b, QOR_4 = 0x6c,
61
+ DIOR = 0xbb, DIOR_4 = 0xbc,
62
+ QIOR = 0xeb, QIOR_4 = 0xec,
63
+
64
+ PP = 0x2, PP_4 = 0x12,
65
+ DPP = 0xa2,
66
+ QPP = 0x32, QPP_4 = 0x34,
67
+} FlashCMD;
68
+
69
+static int aspeed_smc_num_dummies(uint8_t command)
70
+{
71
+ switch (command) { /* check for dummies */
72
+ case READ: /* no dummy bytes/cycles */
73
+ case PP:
74
+ case DPP:
75
+ case QPP:
76
+ case READ_4:
77
+ case PP_4:
78
+ case QPP_4:
79
+ return 0;
80
+ case FAST_READ:
81
+ case DOR:
82
+ case QOR:
83
+ case DOR_4:
84
+ case QOR_4:
85
+ return 1;
86
+ case DIOR:
87
+ case FAST_READ_4:
88
+ case DIOR_4:
89
+ return 2;
90
+ case QIOR:
91
+ case QIOR_4:
92
+ return 4;
93
+ default:
94
+ return -1;
95
+ }
96
+}
97
+
98
+static bool aspeed_smc_do_snoop(AspeedSMCFlash *fl, uint64_t data,
99
+ unsigned size)
100
+{
101
+ AspeedSMCState *s = fl->controller;
102
+ uint8_t addr_width = aspeed_smc_flash_is_4byte(fl) ? 4 : 3;
103
+
104
+ if (s->snoop_index == SNOOP_OFF) {
105
+ return false; /* Do nothing */
106
+
107
+ } else if (s->snoop_index == SNOOP_START) {
108
+ uint8_t cmd = data & 0xff;
109
+ int ndummies = aspeed_smc_num_dummies(cmd);
110
+
111
+ /*
112
+ * No dummy cycles are expected with the current command. Turn
113
+ * off snooping and let the transfer proceed normally.
114
+ */
115
+ if (ndummies <= 0) {
116
+ s->snoop_index = SNOOP_OFF;
117
+ return false;
118
+ }
119
+
120
+ s->snoop_dummies = ndummies * 8;
121
+
122
+ } else if (s->snoop_index >= addr_width + 1) {
123
+
124
+ /* The SPI transfer has reached the dummy cycles sequence */
125
+ for (; s->snoop_dummies; s->snoop_dummies--) {
126
+ ssi_transfer(s->spi, s->regs[R_DUMMY_DATA] & 0xff);
127
+ }
128
+
129
+ /* If no more dummy cycles are expected, turn off snooping */
130
+ if (!s->snoop_dummies) {
131
+ s->snoop_index = SNOOP_OFF;
132
+ } else {
133
+ s->snoop_index += size;
134
+ }
135
+
136
+ /*
137
+ * Dummy cycles have been faked already. Ignore the current
138
+ * SPI transfer
139
+ */
140
+ return true;
141
+ }
142
+
143
+ s->snoop_index += size;
144
+ return false;
145
+}
146
+
147
static void aspeed_smc_flash_write(void *opaque, hwaddr addr, uint64_t data,
148
unsigned size)
149
{
73
{
150
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_flash_write(void *opaque, hwaddr addr, uint64_t data,
74
- CPUARMState *env = venv;
151
75
do_fmlal(vd, vn, vm, &env->vfp.standard_fp_status, desc,
152
switch (aspeed_smc_flash_mode(fl)) {
76
get_flush_inputs_to_zero(&env->vfp.fp_status_f16));
153
case CTRL_USERMODE:
77
}
154
+ if (aspeed_smc_do_snoop(fl, data, size)) {
78
155
+ break;
79
void HELPER(gvec_fmlal_a64)(void *vd, void *vn, void *vm,
156
+ }
80
- void *venv, uint32_t desc)
157
+
81
+ CPUARMState *env, uint32_t desc)
158
for (i = 0; i < size; i++) {
159
ssi_transfer(s->spi, (data >> (8 * i)) & 0xff);
160
}
161
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps aspeed_smc_flash_ops = {
162
163
static void aspeed_smc_flash_update_cs(AspeedSMCFlash *fl)
164
{
82
{
165
- const AspeedSMCState *s = fl->controller;
83
- CPUARMState *env = venv;
166
+ AspeedSMCState *s = fl->controller;
84
do_fmlal(vd, vn, vm, &env->vfp.fp_status, desc,
167
+
85
get_flush_inputs_to_zero(&env->vfp.fp_status_f16));
168
+ s->snoop_index = aspeed_smc_is_ce_stop_active(fl) ? SNOOP_OFF : SNOOP_START;
169
170
qemu_set_irq(s->cs_lines[fl->id], aspeed_smc_is_ce_stop_active(fl));
171
}
86
}
172
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_reset(DeviceState *d)
87
173
if (s->ctrl->segments == aspeed_segments_fmc) {
88
void HELPER(sve2_fmlal_zzzw_s)(void *vd, void *vn, void *vm, void *va,
174
s->regs[s->r_conf] |= (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0);
89
- void *venv, uint32_t desc)
175
}
90
+ CPUARMState *env, uint32_t desc)
176
+
91
{
177
+ s->snoop_index = SNOOP_OFF;
92
intptr_t i, oprsz = simd_oprsz(desc);
178
+ s->snoop_dummies = 0;
93
uint16_t negn = extract32(desc, SIMD_DATA_SHIFT, 1) << 15;
94
intptr_t sel = extract32(desc, SIMD_DATA_SHIFT + 1, 1) * sizeof(float16);
95
- CPUARMState *env = venv;
96
float_status *status = &env->vfp.fp_status;
97
bool fz16 = get_flush_inputs_to_zero(&env->vfp.fp_status_f16);
98
99
@@ -XXX,XX +XXX,XX @@ static void do_fmlal_idx(float32 *d, void *vn, void *vm, float_status *fpst,
179
}
100
}
180
101
181
static uint64_t aspeed_smc_read(void *opaque, hwaddr addr, unsigned int size)
102
void HELPER(gvec_fmlal_idx_a32)(void *vd, void *vn, void *vm,
182
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_realize(DeviceState *dev, Error **errp)
103
- void *venv, uint32_t desc)
183
104
+ CPUARMState *env, uint32_t desc)
184
static const VMStateDescription vmstate_aspeed_smc = {
105
{
185
.name = "aspeed.smc",
106
- CPUARMState *env = venv;
186
- .version_id = 1,
107
do_fmlal_idx(vd, vn, vm, &env->vfp.standard_fp_status, desc,
187
- .minimum_version_id = 1,
108
get_flush_inputs_to_zero(&env->vfp.fp_status_f16));
188
+ .version_id = 2,
109
}
189
+ .minimum_version_id = 2,
110
190
.fields = (VMStateField[]) {
111
void HELPER(gvec_fmlal_idx_a64)(void *vd, void *vn, void *vm,
191
VMSTATE_UINT32_ARRAY(regs, AspeedSMCState, ASPEED_SMC_R_MAX),
112
- void *venv, uint32_t desc)
192
+ VMSTATE_UINT8(snoop_index, AspeedSMCState),
113
+ CPUARMState *env, uint32_t desc)
193
+ VMSTATE_UINT8(snoop_dummies, AspeedSMCState),
114
{
194
VMSTATE_END_OF_LIST()
115
- CPUARMState *env = venv;
195
}
116
do_fmlal_idx(vd, vn, vm, &env->vfp.fp_status, desc,
196
};
117
get_flush_inputs_to_zero(&env->vfp.fp_status_f16));
118
}
119
120
void HELPER(sve2_fmlal_zzxw_s)(void *vd, void *vn, void *vm, void *va,
121
- void *venv, uint32_t desc)
122
+ CPUARMState *env, uint32_t desc)
123
{
124
intptr_t i, j, oprsz = simd_oprsz(desc);
125
uint16_t negn = extract32(desc, SIMD_DATA_SHIFT, 1) << 15;
126
intptr_t sel = extract32(desc, SIMD_DATA_SHIFT + 1, 1) * sizeof(float16);
127
intptr_t idx = extract32(desc, SIMD_DATA_SHIFT + 2, 3) * sizeof(float16);
128
- CPUARMState *env = venv;
129
float_status *status = &env->vfp.fp_status;
130
bool fz16 = get_flush_inputs_to_zero(&env->vfp.fp_status_f16);
131
132
@@ -XXX,XX +XXX,XX @@ DO_VRINT_RMODE(gvec_vrint_rm_s, helper_rints, uint32_t)
133
#undef DO_VRINT_RMODE
134
135
#ifdef TARGET_AARCH64
136
-void HELPER(simd_tblx)(void *vd, void *vm, void *venv, uint32_t desc)
137
+void HELPER(simd_tblx)(void *vd, void *vm, CPUARMState *env, uint32_t desc)
138
{
139
const uint8_t *indices = vm;
140
- CPUARMState *env = venv;
141
size_t oprsz = simd_oprsz(desc);
142
uint32_t rn = extract32(desc, SIMD_DATA_SHIFT, 5);
143
bool is_tbx = extract32(desc, SIMD_DATA_SHIFT + 5, 1);
197
--
144
--
198
2.20.1
145
2.34.1
199
146
200
147
diff view generated by jsdifflib
1
From: Luc Michel <luc.michel@greensocs.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
a TID or PID value means "any thread" (resp. "any process"). This commit
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
fixes the different combinations when at least one value is 0.
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
5
Message-id: 20241206031224.78525-10-richard.henderson@linaro.org
6
When both are 0, the function now returns the first attached CPU,
7
instead of the CPU with TID 1, which is not necessarily attached or even
8
existent.
9
10
When PID is specified but TID is 0, the function returns the first CPU
11
in the process, or NULL if the process does not exist or is not
12
attached.
13
14
In other cases, it returns the corresponding CPU, while ignoring the PID
15
check when PID is 0.
16
17
Reported-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Luc Michel <luc.michel@greensocs.com>
19
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
20
Message-id: 20190119140000.11767-1-luc.michel@greensocs.com
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
7
---
23
gdbstub.c | 72 +++++++++++++++++++++++++++++++++----------------------
8
target/arm/helper.h | 56 ++++++++++++++++++------------------
24
1 file changed, 43 insertions(+), 29 deletions(-)
9
target/arm/tcg/neon_helper.c | 6 ++--
10
2 files changed, 30 insertions(+), 32 deletions(-)
25
11
26
diff --git a/gdbstub.c b/gdbstub.c
12
diff --git a/target/arm/helper.h b/target/arm/helper.h
27
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
28
--- a/gdbstub.c
14
--- a/target/arm/helper.h
29
+++ b/gdbstub.c
15
+++ b/target/arm/helper.h
30
@@ -XXX,XX +XXX,XX @@ static CPUState *gdb_next_cpu_in_process(const GDBState *s, CPUState *cpu)
16
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(neon_qrshl_u32, i32, env, i32, i32)
31
return cpu;
17
DEF_HELPER_3(neon_qrshl_s32, i32, env, i32, i32)
18
DEF_HELPER_3(neon_qrshl_u64, i64, env, i64, i64)
19
DEF_HELPER_3(neon_qrshl_s64, i64, env, i64, i64)
20
-DEF_HELPER_FLAGS_5(neon_sqshl_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
21
-DEF_HELPER_FLAGS_5(neon_sqshl_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
22
-DEF_HELPER_FLAGS_5(neon_sqshl_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
23
-DEF_HELPER_FLAGS_5(neon_sqshl_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
24
-DEF_HELPER_FLAGS_5(neon_uqshl_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
25
-DEF_HELPER_FLAGS_5(neon_uqshl_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
26
-DEF_HELPER_FLAGS_5(neon_uqshl_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
27
-DEF_HELPER_FLAGS_5(neon_uqshl_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
28
-DEF_HELPER_FLAGS_5(neon_sqrshl_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
29
-DEF_HELPER_FLAGS_5(neon_sqrshl_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
30
-DEF_HELPER_FLAGS_5(neon_sqrshl_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
31
-DEF_HELPER_FLAGS_5(neon_sqrshl_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
32
-DEF_HELPER_FLAGS_5(neon_uqrshl_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
33
-DEF_HELPER_FLAGS_5(neon_uqrshl_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
34
-DEF_HELPER_FLAGS_5(neon_uqrshl_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
35
-DEF_HELPER_FLAGS_5(neon_uqrshl_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
36
-DEF_HELPER_FLAGS_4(neon_sqshli_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
37
-DEF_HELPER_FLAGS_4(neon_sqshli_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
38
-DEF_HELPER_FLAGS_4(neon_sqshli_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
39
-DEF_HELPER_FLAGS_4(neon_sqshli_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
40
-DEF_HELPER_FLAGS_4(neon_uqshli_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
41
-DEF_HELPER_FLAGS_4(neon_uqshli_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
42
-DEF_HELPER_FLAGS_4(neon_uqshli_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
43
-DEF_HELPER_FLAGS_4(neon_uqshli_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
44
-DEF_HELPER_FLAGS_4(neon_sqshlui_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
45
-DEF_HELPER_FLAGS_4(neon_sqshlui_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
46
-DEF_HELPER_FLAGS_4(neon_sqshlui_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
47
-DEF_HELPER_FLAGS_4(neon_sqshlui_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
48
+DEF_HELPER_FLAGS_5(neon_sqshl_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
49
+DEF_HELPER_FLAGS_5(neon_sqshl_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
50
+DEF_HELPER_FLAGS_5(neon_sqshl_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
51
+DEF_HELPER_FLAGS_5(neon_sqshl_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
52
+DEF_HELPER_FLAGS_5(neon_uqshl_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
53
+DEF_HELPER_FLAGS_5(neon_uqshl_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
54
+DEF_HELPER_FLAGS_5(neon_uqshl_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
55
+DEF_HELPER_FLAGS_5(neon_uqshl_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
56
+DEF_HELPER_FLAGS_5(neon_sqrshl_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
57
+DEF_HELPER_FLAGS_5(neon_sqrshl_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
58
+DEF_HELPER_FLAGS_5(neon_sqrshl_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
59
+DEF_HELPER_FLAGS_5(neon_sqrshl_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
60
+DEF_HELPER_FLAGS_5(neon_uqrshl_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
61
+DEF_HELPER_FLAGS_5(neon_uqrshl_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
62
+DEF_HELPER_FLAGS_5(neon_uqrshl_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
63
+DEF_HELPER_FLAGS_5(neon_uqrshl_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
64
+DEF_HELPER_FLAGS_4(neon_sqshli_b, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
65
+DEF_HELPER_FLAGS_4(neon_sqshli_h, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
66
+DEF_HELPER_FLAGS_4(neon_sqshli_s, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
67
+DEF_HELPER_FLAGS_4(neon_sqshli_d, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
68
+DEF_HELPER_FLAGS_4(neon_uqshli_b, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
69
+DEF_HELPER_FLAGS_4(neon_uqshli_h, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
70
+DEF_HELPER_FLAGS_4(neon_uqshli_s, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
71
+DEF_HELPER_FLAGS_4(neon_uqshli_d, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
72
+DEF_HELPER_FLAGS_4(neon_sqshlui_b, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
73
+DEF_HELPER_FLAGS_4(neon_sqshlui_h, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
74
+DEF_HELPER_FLAGS_4(neon_sqshlui_s, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
75
+DEF_HELPER_FLAGS_4(neon_sqshlui_d, TCG_CALL_NO_RWG, void, ptr, ptr, env, i32)
76
77
DEF_HELPER_FLAGS_4(gvec_srshl_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
78
DEF_HELPER_FLAGS_4(gvec_srshl_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
79
diff --git a/target/arm/tcg/neon_helper.c b/target/arm/tcg/neon_helper.c
80
index XXXXXXX..XXXXXXX 100644
81
--- a/target/arm/tcg/neon_helper.c
82
+++ b/target/arm/tcg/neon_helper.c
83
@@ -XXX,XX +XXX,XX @@ void HELPER(name)(void *vd, void *vn, void *vm, uint32_t desc) \
32
}
84
}
33
85
34
-static CPUState *gdb_get_cpu(const GDBState *s, uint32_t pid, uint32_t tid)
86
#define NEON_GVEC_VOP2_ENV(name, vtype) \
35
-{
87
-void HELPER(name)(void *vd, void *vn, void *vm, void *venv, uint32_t desc) \
36
- GDBProcess *process;
88
+void HELPER(name)(void *vd, void *vn, void *vm, CPUARMState *env, uint32_t desc) \
37
- CPUState *cpu;
89
{ \
38
-
90
intptr_t i, opr_sz = simd_oprsz(desc); \
39
- if (!tid) {
91
vtype *d = vd, *n = vn, *m = vm; \
40
- /* 0 means any thread, we take the first one */
92
- CPUARMState *env = venv; \
41
- tid = 1;
93
for (i = 0; i < opr_sz / sizeof(vtype); i++) { \
42
- }
94
NEON_FN(d[i], n[i], m[i]); \
43
-
95
} \
44
- cpu = find_cpu(tid);
96
@@ -XXX,XX +XXX,XX @@ void HELPER(name)(void *vd, void *vn, void *vm, void *venv, uint32_t desc) \
45
-
46
- if (cpu == NULL) {
47
- return NULL;
48
- }
49
-
50
- process = gdb_get_cpu_process(s, cpu);
51
-
52
- if (process->pid != pid) {
53
- return NULL;
54
- }
55
-
56
- if (!process->attached) {
57
- return NULL;
58
- }
59
-
60
- return cpu;
61
-}
62
-
63
/* Return the cpu following @cpu, while ignoring unattached processes. */
64
static CPUState *gdb_next_attached_cpu(const GDBState *s, CPUState *cpu)
65
{
66
@@ -XXX,XX +XXX,XX @@ static CPUState *gdb_first_attached_cpu(const GDBState *s)
67
return cpu;
68
}
97
}
69
98
70
+static CPUState *gdb_get_cpu(const GDBState *s, uint32_t pid, uint32_t tid)
99
#define NEON_GVEC_VOP2i_ENV(name, vtype) \
71
+{
100
-void HELPER(name)(void *vd, void *vn, void *venv, uint32_t desc) \
72
+ GDBProcess *process;
101
+void HELPER(name)(void *vd, void *vn, CPUARMState *env, uint32_t desc) \
73
+ CPUState *cpu;
102
{ \
74
+
103
intptr_t i, opr_sz = simd_oprsz(desc); \
75
+ if (!pid && !tid) {
104
int imm = simd_data(desc); \
76
+ /* 0 means any process/thread, we take the first attached one */
105
vtype *d = vd, *n = vn; \
77
+ return gdb_first_attached_cpu(s);
106
- CPUARMState *env = venv; \
78
+ } else if (pid && !tid) {
107
for (i = 0; i < opr_sz / sizeof(vtype); i++) { \
79
+ /* any thread in a specific process */
108
NEON_FN(d[i], n[i], imm); \
80
+ process = gdb_get_process(s, pid);
109
} \
81
+
82
+ if (process == NULL) {
83
+ return NULL;
84
+ }
85
+
86
+ if (!process->attached) {
87
+ return NULL;
88
+ }
89
+
90
+ return get_first_cpu_in_process(s, process);
91
+ } else {
92
+ /* a specific thread */
93
+ cpu = find_cpu(tid);
94
+
95
+ if (cpu == NULL) {
96
+ return NULL;
97
+ }
98
+
99
+ process = gdb_get_cpu_process(s, cpu);
100
+
101
+ if (pid && process->pid != pid) {
102
+ return NULL;
103
+ }
104
+
105
+ if (!process->attached) {
106
+ return NULL;
107
+ }
108
+
109
+ return cpu;
110
+ }
111
+}
112
+
113
static const char *get_feature_xml(const GDBState *s, const char *p,
114
const char **newp, GDBProcess *process)
115
{
116
--
110
--
117
2.20.1
111
2.34.1
118
112
119
113
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
Pass float_status not env to match other functions.
4
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
4
5
Acked-by: Thomas Huth <thuth@redhat.com>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20190124141147.8416-1-stefanha@redhat.com
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Message-id: 20241206031952.78776-2-richard.henderson@linaro.org
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
---
9
tests/microbit-test.c | 108 ++++++++++++++++++++++++++++++++++++++++++
10
target/arm/tcg/helper-a64.h | 2 +-
10
1 file changed, 108 insertions(+)
11
target/arm/tcg/helper-a64.c | 3 +--
12
target/arm/tcg/translate-a64.c | 2 +-
13
3 files changed, 3 insertions(+), 4 deletions(-)
11
14
12
diff --git a/tests/microbit-test.c b/tests/microbit-test.c
15
diff --git a/target/arm/tcg/helper-a64.h b/target/arm/tcg/helper-a64.h
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/tests/microbit-test.c
17
--- a/target/arm/tcg/helper-a64.h
15
+++ b/tests/microbit-test.c
18
+++ b/target/arm/tcg/helper-a64.h
16
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(rsqrtsf_f64, TCG_CALL_NO_RWG, f64, f64, f64, fpst)
17
#include "hw/arm/nrf51.h"
20
DEF_HELPER_FLAGS_2(frecpx_f64, TCG_CALL_NO_RWG, f64, f64, fpst)
18
#include "hw/char/nrf51_uart.h"
21
DEF_HELPER_FLAGS_2(frecpx_f32, TCG_CALL_NO_RWG, f32, f32, fpst)
19
#include "hw/gpio/nrf51_gpio.h"
22
DEF_HELPER_FLAGS_2(frecpx_f16, TCG_CALL_NO_RWG, f16, f16, fpst)
20
+#include "hw/nvram/nrf51_nvm.h"
23
-DEF_HELPER_FLAGS_2(fcvtx_f64_to_f32, TCG_CALL_NO_RWG, f32, f64, env)
21
#include "hw/timer/nrf51_timer.h"
24
+DEF_HELPER_FLAGS_2(fcvtx_f64_to_f32, TCG_CALL_NO_RWG, f32, f64, fpst)
22
#include "hw/i2c/microbit_i2c.h"
25
DEF_HELPER_FLAGS_3(crc32_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32)
23
26
DEF_HELPER_FLAGS_3(crc32c_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32)
24
@@ -XXX,XX +XXX,XX @@ static void test_microbit_i2c(void)
27
DEF_HELPER_FLAGS_3(advsimd_maxh, TCG_CALL_NO_RWG, f16, f16, f16, fpst)
25
qtest_quit(qts);
28
diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/tcg/helper-a64.c
31
+++ b/target/arm/tcg/helper-a64.c
32
@@ -XXX,XX +XXX,XX @@ float64 HELPER(frecpx_f64)(float64 a, float_status *fpst)
33
}
26
}
34
}
27
35
28
+#define FLASH_SIZE (256 * NRF51_PAGE_SIZE)
36
-float32 HELPER(fcvtx_f64_to_f32)(float64 a, CPUARMState *env)
29
+
37
+float32 HELPER(fcvtx_f64_to_f32)(float64 a, float_status *fpst)
30
+static void fill_and_erase(QTestState *qts, hwaddr base, hwaddr size,
31
+ uint32_t address_reg)
32
+{
33
+ hwaddr i;
34
+
35
+ /* Erase Page */
36
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x02);
37
+ qtest_writel(qts, NRF51_NVMC_BASE + address_reg, base);
38
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
39
+
40
+ /* Check memory */
41
+ for (i = 0; i < size / 4; i++) {
42
+ g_assert_cmpuint(qtest_readl(qts, base + i * 4), ==, 0xFFFFFFFF);
43
+ }
44
+
45
+ /* Fill memory */
46
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x01);
47
+ for (i = 0; i < size / 4; i++) {
48
+ qtest_writel(qts, base + i * 4, i);
49
+ g_assert_cmpuint(qtest_readl(qts, base + i * 4), ==, i);
50
+ }
51
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
52
+}
53
+
54
+static void test_nrf51_nvmc(void)
55
+{
56
+ uint32_t value;
57
+ hwaddr i;
58
+ QTestState *qts = qtest_init("-M microbit");
59
+
60
+ /* Test always ready */
61
+ value = qtest_readl(qts, NRF51_NVMC_BASE + NRF51_NVMC_READY);
62
+ g_assert_cmpuint(value & 0x01, ==, 0x01);
63
+
64
+ /* Test write-read config register */
65
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x03);
66
+ g_assert_cmpuint(qtest_readl(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG),
67
+ ==, 0x03);
68
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
69
+ g_assert_cmpuint(qtest_readl(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG),
70
+ ==, 0x00);
71
+
72
+ /* Test PCR0 */
73
+ fill_and_erase(qts, NRF51_FLASH_BASE, NRF51_PAGE_SIZE,
74
+ NRF51_NVMC_ERASEPCR0);
75
+ fill_and_erase(qts, NRF51_FLASH_BASE + NRF51_PAGE_SIZE,
76
+ NRF51_PAGE_SIZE, NRF51_NVMC_ERASEPCR0);
77
+
78
+ /* Test PCR1 */
79
+ fill_and_erase(qts, NRF51_FLASH_BASE, NRF51_PAGE_SIZE,
80
+ NRF51_NVMC_ERASEPCR1);
81
+ fill_and_erase(qts, NRF51_FLASH_BASE + NRF51_PAGE_SIZE,
82
+ NRF51_PAGE_SIZE, NRF51_NVMC_ERASEPCR1);
83
+
84
+ /* Erase all */
85
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x02);
86
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_ERASEALL, 0x01);
87
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
88
+
89
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x01);
90
+ for (i = 0; i < FLASH_SIZE / 4; i++) {
91
+ qtest_writel(qts, NRF51_FLASH_BASE + i * 4, i);
92
+ g_assert_cmpuint(qtest_readl(qts, NRF51_FLASH_BASE + i * 4), ==, i);
93
+ }
94
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
95
+
96
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x02);
97
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_ERASEALL, 0x01);
98
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
99
+
100
+ for (i = 0; i < FLASH_SIZE / 4; i++) {
101
+ g_assert_cmpuint(qtest_readl(qts, NRF51_FLASH_BASE + i * 4),
102
+ ==, 0xFFFFFFFF);
103
+ }
104
+
105
+ /* Erase UICR */
106
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x02);
107
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_ERASEUICR, 0x01);
108
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
109
+
110
+ for (i = 0; i < NRF51_UICR_SIZE / 4; i++) {
111
+ g_assert_cmpuint(qtest_readl(qts, NRF51_UICR_BASE + i * 4),
112
+ ==, 0xFFFFFFFF);
113
+ }
114
+
115
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x01);
116
+ for (i = 0; i < NRF51_UICR_SIZE / 4; i++) {
117
+ qtest_writel(qts, NRF51_UICR_BASE + i * 4, i);
118
+ g_assert_cmpuint(qtest_readl(qts, NRF51_UICR_BASE + i * 4), ==, i);
119
+ }
120
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
121
+
122
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x02);
123
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_ERASEUICR, 0x01);
124
+ qtest_writel(qts, NRF51_NVMC_BASE + NRF51_NVMC_CONFIG, 0x00);
125
+
126
+ for (i = 0; i < NRF51_UICR_SIZE / 4; i++) {
127
+ g_assert_cmpuint(qtest_readl(qts, NRF51_UICR_BASE + i * 4),
128
+ ==, 0xFFFFFFFF);
129
+ }
130
+
131
+ qtest_quit(qts);
132
+}
133
+
134
static void test_nrf51_gpio(void)
135
{
38
{
136
size_t i;
39
float32 r;
137
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
40
- float_status *fpst = &env->vfp.fp_status;
138
41
int old = get_float_rounding_mode(fpst);
139
qtest_add_func("/microbit/nrf51/uart", test_nrf51_uart);
42
140
qtest_add_func("/microbit/nrf51/gpio", test_nrf51_gpio);
43
set_float_rounding_mode(float_round_to_odd, fpst);
141
+ qtest_add_func("/microbit/nrf51/nvmc", test_nrf51_nvmc);
44
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
142
qtest_add_func("/microbit/nrf51/timer", test_nrf51_timer);
45
index XXXXXXX..XXXXXXX 100644
143
qtest_add_func("/microbit/microbit/i2c", test_microbit_i2c);
46
--- a/target/arm/tcg/translate-a64.c
47
+++ b/target/arm/tcg/translate-a64.c
48
@@ -XXX,XX +XXX,XX @@ static void gen_fcvtxn_sd(TCGv_i64 d, TCGv_i64 n)
49
* with von Neumann rounding (round to odd)
50
*/
51
TCGv_i32 tmp = tcg_temp_new_i32();
52
- gen_helper_fcvtx_f64_to_f32(tmp, n, tcg_env);
53
+ gen_helper_fcvtx_f64_to_f32(tmp, n, fpstatus_ptr(FPST_FPCR));
54
tcg_gen_extu_i32_i64(d, tmp);
55
}
144
56
145
--
57
--
146
2.20.1
58
2.34.1
147
59
148
60
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
When tsz == 0, aarch32 selects the address space via exclusion,
3
Pass float_status not env to match other functions.
4
and there are no "top_bits" remaining that require validation.
5
4
6
Fixes: ba97be9f4a4
7
Reported-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20190125184913.5970-1-richard.henderson@linaro.org
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20241206031952.78776-3-richard.henderson@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
9
---
13
target/arm/helper.c | 19 +++++++++++++------
10
target/arm/helper.h | 4 ++--
14
1 file changed, 13 insertions(+), 6 deletions(-)
11
target/arm/tcg/translate-a64.c | 15 ++++++++++-----
12
target/arm/tcg/translate-vfp.c | 4 ++--
13
target/arm/vfp_helper.c | 8 ++++----
14
4 files changed, 18 insertions(+), 13 deletions(-)
15
15
16
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
diff --git a/target/arm/helper.h b/target/arm/helper.h
17
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/helper.c
18
--- a/target/arm/helper.h
19
+++ b/target/arm/helper.c
19
+++ b/target/arm/helper.h
20
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
20
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_cmpeh, void, f16, f16, env)
21
uint64_t ttbr;
21
DEF_HELPER_3(vfp_cmpes, void, f32, f32, env)
22
hwaddr descaddr, indexmask, indexmask_grainsize;
22
DEF_HELPER_3(vfp_cmped, void, f64, f64, env)
23
uint32_t tableattrs;
23
24
- target_ulong page_size, top_bits;
24
-DEF_HELPER_2(vfp_fcvtds, f64, f32, env)
25
+ target_ulong page_size;
25
-DEF_HELPER_2(vfp_fcvtsd, f32, f64, env)
26
uint32_t attrs;
26
+DEF_HELPER_2(vfp_fcvtds, f64, f32, fpst)
27
int32_t stride;
27
+DEF_HELPER_2(vfp_fcvtsd, f32, f64, fpst)
28
int addrsize, inputsize;
28
DEF_HELPER_FLAGS_2(bfcvt, TCG_CALL_NO_RWG, i32, f32, fpst)
29
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
29
DEF_HELPER_FLAGS_2(bfcvt_pair, TCG_CALL_NO_RWG, i32, i64, fpst)
30
* We determined the region when collecting the parameters, but we
30
31
* have not yet validated that the address is valid for the region.
31
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
32
* Extract the top bits and verify that they all match select.
32
index XXXXXXX..XXXXXXX 100644
33
+ *
33
--- a/target/arm/tcg/translate-a64.c
34
+ * For aa32, if inputsize == addrsize, then we have selected the
34
+++ b/target/arm/tcg/translate-a64.c
35
+ * region by exclusion in aa32_va_parameters and there is no more
35
@@ -XXX,XX +XXX,XX @@ static bool trans_FCVT_s_ds(DisasContext *s, arg_rr *a)
36
+ * validation to do here.
36
if (fp_access_check(s)) {
37
TCGv_i32 tcg_rn = read_fp_sreg(s, a->rn);
38
TCGv_i64 tcg_rd = tcg_temp_new_i64();
39
+ TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
40
41
- gen_helper_vfp_fcvtds(tcg_rd, tcg_rn, tcg_env);
42
+ gen_helper_vfp_fcvtds(tcg_rd, tcg_rn, fpst);
43
write_fp_dreg(s, a->rd, tcg_rd);
44
}
45
return true;
46
@@ -XXX,XX +XXX,XX @@ static bool trans_FCVT_s_sd(DisasContext *s, arg_rr *a)
47
if (fp_access_check(s)) {
48
TCGv_i64 tcg_rn = read_fp_dreg(s, a->rn);
49
TCGv_i32 tcg_rd = tcg_temp_new_i32();
50
+ TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
51
52
- gen_helper_vfp_fcvtsd(tcg_rd, tcg_rn, tcg_env);
53
+ gen_helper_vfp_fcvtsd(tcg_rd, tcg_rn, fpst);
54
write_fp_sreg(s, a->rd, tcg_rd);
55
}
56
return true;
57
@@ -XXX,XX +XXX,XX @@ static void gen_fcvtn_hs(TCGv_i64 d, TCGv_i64 n)
58
static void gen_fcvtn_sd(TCGv_i64 d, TCGv_i64 n)
59
{
60
TCGv_i32 tmp = tcg_temp_new_i32();
61
- gen_helper_vfp_fcvtsd(tmp, n, tcg_env);
62
+ TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
63
+
64
+ gen_helper_vfp_fcvtsd(tmp, n, fpst);
65
tcg_gen_extu_i32_i64(d, tmp);
66
}
67
68
@@ -XXX,XX +XXX,XX @@ static bool trans_FCVTL_v(DisasContext *s, arg_qrr_e *a)
69
* The only instruction like this is FCVTL.
37
*/
70
*/
38
- top_bits = sextract64(address, inputsize, addrsize - inputsize);
71
int pass;
39
- if (-top_bits != param.select || (param.select && !ttbr1_valid)) {
72
+ TCGv_ptr fpst;
40
- /* In the gap between the two regions, this is a Translation fault */
73
41
- fault_type = ARMFault_Translation;
74
if (!fp_access_check(s)) {
42
- goto do_fault;
75
return true;
43
+ if (inputsize < addrsize) {
44
+ target_ulong top_bits = sextract64(address, inputsize,
45
+ addrsize - inputsize);
46
+ if (-top_bits != param.select || (param.select && !ttbr1_valid)) {
47
+ /* The gap between the two regions is a Translation fault */
48
+ fault_type = ARMFault_Translation;
49
+ goto do_fault;
50
+ }
51
}
76
}
52
77
53
if (param.using64k) {
78
+ fpst = fpstatus_ptr(FPST_FPCR);
79
if (a->esz == MO_64) {
80
/* 32 -> 64 bit fp conversion */
81
TCGv_i64 tcg_res[2];
82
@@ -XXX,XX +XXX,XX @@ static bool trans_FCVTL_v(DisasContext *s, arg_qrr_e *a)
83
for (pass = 0; pass < 2; pass++) {
84
tcg_res[pass] = tcg_temp_new_i64();
85
read_vec_element_i32(s, tcg_op, a->rn, srcelt + pass, MO_32);
86
- gen_helper_vfp_fcvtds(tcg_res[pass], tcg_op, tcg_env);
87
+ gen_helper_vfp_fcvtds(tcg_res[pass], tcg_op, fpst);
88
}
89
for (pass = 0; pass < 2; pass++) {
90
write_vec_element(s, tcg_res[pass], a->rd, pass, MO_64);
91
@@ -XXX,XX +XXX,XX @@ static bool trans_FCVTL_v(DisasContext *s, arg_qrr_e *a)
92
/* 16 -> 32 bit fp conversion */
93
int srcelt = a->q ? 4 : 0;
94
TCGv_i32 tcg_res[4];
95
- TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
96
TCGv_i32 ahp = get_ahp_flag();
97
98
for (pass = 0; pass < 4; pass++) {
99
diff --git a/target/arm/tcg/translate-vfp.c b/target/arm/tcg/translate-vfp.c
100
index XXXXXXX..XXXXXXX 100644
101
--- a/target/arm/tcg/translate-vfp.c
102
+++ b/target/arm/tcg/translate-vfp.c
103
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_sp(DisasContext *s, arg_VCVT_sp *a)
104
vm = tcg_temp_new_i32();
105
vd = tcg_temp_new_i64();
106
vfp_load_reg32(vm, a->vm);
107
- gen_helper_vfp_fcvtds(vd, vm, tcg_env);
108
+ gen_helper_vfp_fcvtds(vd, vm, fpstatus_ptr(FPST_FPCR));
109
vfp_store_reg64(vd, a->vd);
110
return true;
111
}
112
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_dp(DisasContext *s, arg_VCVT_dp *a)
113
vd = tcg_temp_new_i32();
114
vm = tcg_temp_new_i64();
115
vfp_load_reg64(vm, a->vm);
116
- gen_helper_vfp_fcvtsd(vd, vm, tcg_env);
117
+ gen_helper_vfp_fcvtsd(vd, vm, fpstatus_ptr(FPST_FPCR));
118
vfp_store_reg32(vd, a->vd);
119
return true;
120
}
121
diff --git a/target/arm/vfp_helper.c b/target/arm/vfp_helper.c
122
index XXXXXXX..XXXXXXX 100644
123
--- a/target/arm/vfp_helper.c
124
+++ b/target/arm/vfp_helper.c
125
@@ -XXX,XX +XXX,XX @@ FLOAT_CONVS(ui, d, float64, 64, u)
126
#undef FLOAT_CONVS
127
128
/* floating point conversion */
129
-float64 VFP_HELPER(fcvtd, s)(float32 x, CPUARMState *env)
130
+float64 VFP_HELPER(fcvtd, s)(float32 x, float_status *status)
131
{
132
- return float32_to_float64(x, &env->vfp.fp_status);
133
+ return float32_to_float64(x, status);
134
}
135
136
-float32 VFP_HELPER(fcvts, d)(float64 x, CPUARMState *env)
137
+float32 VFP_HELPER(fcvts, d)(float64 x, float_status *status)
138
{
139
- return float64_to_float32(x, &env->vfp.fp_status);
140
+ return float64_to_float32(x, status);
141
}
142
143
uint32_t HELPER(bfcvt)(float32 x, float_status *status)
54
--
144
--
55
2.20.1
145
2.34.1
56
146
57
147
diff view generated by jsdifflib
Deleted patch
1
From: Steffen Görtz <contrib@steffen-goertz.de>
2
1
3
Recent microbit firmwares panic if the TWI magnetometer/accelerometer
4
devices are not detected during startup. We don't implement TWI (I2C)
5
so let's stub out these devices just to let the firmware boot.
6
7
Signed-off by: Steffen Görtz <contrib@steffen-goertz.de>
8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9
Message-id: 20190110094020.18354-2-stefanha@redhat.com
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
[PMM: fixed comment style]
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/i2c/Makefile.objs | 1 +
15
include/hw/arm/nrf51.h | 2 +
16
include/hw/arm/nrf51_soc.h | 1 +
17
include/hw/i2c/microbit_i2c.h | 42 +++++++++++
18
hw/arm/microbit.c | 16 +++++
19
hw/i2c/microbit_i2c.c | 127 ++++++++++++++++++++++++++++++++++
20
6 files changed, 189 insertions(+)
21
create mode 100644 include/hw/i2c/microbit_i2c.h
22
create mode 100644 hw/i2c/microbit_i2c.c
23
24
diff --git a/hw/i2c/Makefile.objs b/hw/i2c/Makefile.objs
25
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/i2c/Makefile.objs
27
+++ b/hw/i2c/Makefile.objs
28
@@ -XXX,XX +XXX,XX @@ common-obj-$(CONFIG_BITBANG_I2C) += bitbang_i2c.o
29
common-obj-$(CONFIG_EXYNOS4) += exynos4210_i2c.o
30
common-obj-$(CONFIG_IMX_I2C) += imx_i2c.o
31
common-obj-$(CONFIG_ASPEED_SOC) += aspeed_i2c.o
32
+common-obj-$(CONFIG_NRF51_SOC) += microbit_i2c.o
33
obj-$(CONFIG_OMAP) += omap_i2c.o
34
obj-$(CONFIG_PPC4XX) += ppc4xx_i2c.o
35
diff --git a/include/hw/arm/nrf51.h b/include/hw/arm/nrf51.h
36
index XXXXXXX..XXXXXXX 100644
37
--- a/include/hw/arm/nrf51.h
38
+++ b/include/hw/arm/nrf51.h
39
@@ -XXX,XX +XXX,XX @@
40
#define NRF51_IOMEM_SIZE 0x20000000
41
42
#define NRF51_UART_BASE 0x40002000
43
+#define NRF51_TWI_BASE 0x40003000
44
+#define NRF51_TWI_SIZE 0x00001000
45
#define NRF51_TIMER_BASE 0x40008000
46
#define NRF51_TIMER_SIZE 0x00001000
47
#define NRF51_RNG_BASE 0x4000D000
48
diff --git a/include/hw/arm/nrf51_soc.h b/include/hw/arm/nrf51_soc.h
49
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/arm/nrf51_soc.h
51
+++ b/include/hw/arm/nrf51_soc.h
52
@@ -XXX,XX +XXX,XX @@ typedef struct NRF51State {
53
MemoryRegion sram;
54
MemoryRegion flash;
55
MemoryRegion clock;
56
+ MemoryRegion twi;
57
58
uint32_t sram_size;
59
uint32_t flash_size;
60
diff --git a/include/hw/i2c/microbit_i2c.h b/include/hw/i2c/microbit_i2c.h
61
new file mode 100644
62
index XXXXXXX..XXXXXXX
63
--- /dev/null
64
+++ b/include/hw/i2c/microbit_i2c.h
65
@@ -XXX,XX +XXX,XX @@
66
+/*
67
+ * Microbit stub for Nordic Semiconductor nRF51 SoC Two-Wire Interface
68
+ * http://infocenter.nordicsemi.com/pdf/nRF51_RM_v3.0.1.pdf
69
+ *
70
+ * Copyright 2019 Red Hat, Inc.
71
+ *
72
+ * This code is licensed under the GPL version 2 or later. See
73
+ * the COPYING file in the top-level directory.
74
+ */
75
+
76
+#ifndef MICROBIT_I2C_H
77
+#define MICROBIT_I2C_H
78
+
79
+#include "hw/sysbus.h"
80
+#include "hw/arm/nrf51.h"
81
+
82
+#define NRF51_TWI_TASK_STARTRX 0x000
83
+#define NRF51_TWI_TASK_STARTTX 0x008
84
+#define NRF51_TWI_TASK_STOP 0x014
85
+#define NRF51_TWI_EVENT_STOPPED 0x104
86
+#define NRF51_TWI_EVENT_RXDREADY 0x108
87
+#define NRF51_TWI_EVENT_TXDSENT 0x11c
88
+#define NRF51_TWI_REG_ENABLE 0x500
89
+#define NRF51_TWI_REG_RXD 0x518
90
+#define NRF51_TWI_REG_TXD 0x51c
91
+#define NRF51_TWI_REG_ADDRESS 0x588
92
+
93
+#define TYPE_MICROBIT_I2C "microbit.i2c"
94
+#define MICROBIT_I2C(obj) \
95
+ OBJECT_CHECK(MicrobitI2CState, (obj), TYPE_MICROBIT_I2C)
96
+
97
+#define MICROBIT_I2C_NREGS (NRF51_TWI_SIZE / sizeof(uint32_t))
98
+
99
+typedef struct {
100
+ SysBusDevice parent_obj;
101
+
102
+ MemoryRegion iomem;
103
+ uint32_t regs[MICROBIT_I2C_NREGS];
104
+ uint32_t read_idx;
105
+} MicrobitI2CState;
106
+
107
+#endif /* MICROBIT_I2C_H */
108
diff --git a/hw/arm/microbit.c b/hw/arm/microbit.c
109
index XXXXXXX..XXXXXXX 100644
110
--- a/hw/arm/microbit.c
111
+++ b/hw/arm/microbit.c
112
@@ -XXX,XX +XXX,XX @@
113
#include "exec/address-spaces.h"
114
115
#include "hw/arm/nrf51_soc.h"
116
+#include "hw/i2c/microbit_i2c.h"
117
118
typedef struct {
119
MachineState parent;
120
121
NRF51State nrf51;
122
+ MicrobitI2CState i2c;
123
} MicrobitMachineState;
124
125
#define TYPE_MICROBIT_MACHINE MACHINE_TYPE_NAME("microbit")
126
@@ -XXX,XX +XXX,XX @@ static void microbit_init(MachineState *machine)
127
{
128
MicrobitMachineState *s = MICROBIT_MACHINE(machine);
129
MemoryRegion *system_memory = get_system_memory();
130
+ MemoryRegion *mr;
131
Object *soc = OBJECT(&s->nrf51);
132
+ Object *i2c = OBJECT(&s->i2c);
133
134
sysbus_init_child_obj(OBJECT(machine), "nrf51", soc, sizeof(s->nrf51),
135
TYPE_NRF51_SOC);
136
@@ -XXX,XX +XXX,XX @@ static void microbit_init(MachineState *machine)
137
&error_fatal);
138
object_property_set_bool(soc, true, "realized", &error_fatal);
139
140
+ /*
141
+ * Overlap the TWI stub device into the SoC. This is a microbit-specific
142
+ * hack until we implement the nRF51 TWI controller properly and the
143
+ * magnetometer/accelerometer devices.
144
+ */
145
+ sysbus_init_child_obj(OBJECT(machine), "microbit.twi", i2c,
146
+ sizeof(s->i2c), TYPE_MICROBIT_I2C);
147
+ object_property_set_bool(i2c, true, "realized", &error_fatal);
148
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(i2c), 0);
149
+ memory_region_add_subregion_overlap(&s->nrf51.container, NRF51_TWI_BASE,
150
+ mr, -1);
151
+
152
armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename,
153
NRF51_SOC(soc)->flash_size);
154
}
155
diff --git a/hw/i2c/microbit_i2c.c b/hw/i2c/microbit_i2c.c
156
new file mode 100644
157
index XXXXXXX..XXXXXXX
158
--- /dev/null
159
+++ b/hw/i2c/microbit_i2c.c
160
@@ -XXX,XX +XXX,XX @@
161
+/*
162
+ * Microbit stub for Nordic Semiconductor nRF51 SoC Two-Wire Interface
163
+ * http://infocenter.nordicsemi.com/pdf/nRF51_RM_v3.0.1.pdf
164
+ *
165
+ * This is a microbit-specific stub for the TWI controller on the nRF51 SoC.
166
+ * We don't emulate I2C devices but the firmware probes the
167
+ * accelerometer/magnetometer on startup and panics if they are not found.
168
+ * Therefore we stub out the probing.
169
+ *
170
+ * In the future this file could evolve into a full nRF51 TWI controller
171
+ * device.
172
+ *
173
+ * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de>
174
+ * Copyright 2019 Red Hat, Inc.
175
+ *
176
+ * This code is licensed under the GPL version 2 or later. See
177
+ * the COPYING file in the top-level directory.
178
+ */
179
+
180
+#include "qemu/osdep.h"
181
+#include "qemu/log.h"
182
+#include "hw/i2c/microbit_i2c.h"
183
+
184
+static const uint32_t twi_read_sequence[] = {0x5A, 0x5A, 0x40};
185
+
186
+static uint64_t microbit_i2c_read(void *opaque, hwaddr addr, unsigned int size)
187
+{
188
+ MicrobitI2CState *s = opaque;
189
+ uint64_t data = 0x00;
190
+
191
+ switch (addr) {
192
+ case NRF51_TWI_EVENT_STOPPED:
193
+ data = 0x01;
194
+ break;
195
+ case NRF51_TWI_EVENT_RXDREADY:
196
+ data = 0x01;
197
+ break;
198
+ case NRF51_TWI_EVENT_TXDSENT:
199
+ data = 0x01;
200
+ break;
201
+ case NRF51_TWI_REG_RXD:
202
+ data = twi_read_sequence[s->read_idx];
203
+ if (s->read_idx < G_N_ELEMENTS(twi_read_sequence)) {
204
+ s->read_idx++;
205
+ }
206
+ break;
207
+ default:
208
+ data = s->regs[addr / sizeof(s->regs[0])];
209
+ break;
210
+ }
211
+
212
+ qemu_log_mask(LOG_UNIMP, "%s: 0x%" HWADDR_PRIx " [%u] = %" PRIx32 "\n",
213
+ __func__, addr, size, (uint32_t)data);
214
+
215
+
216
+ return data;
217
+}
218
+
219
+static void microbit_i2c_write(void *opaque, hwaddr addr, uint64_t data,
220
+ unsigned int size)
221
+{
222
+ MicrobitI2CState *s = opaque;
223
+
224
+ qemu_log_mask(LOG_UNIMP, "%s: 0x%" HWADDR_PRIx " <- 0x%" PRIx64 " [%u]\n",
225
+ __func__, addr, data, size);
226
+ s->regs[addr / sizeof(s->regs[0])] = data;
227
+}
228
+
229
+static const MemoryRegionOps microbit_i2c_ops = {
230
+ .read = microbit_i2c_read,
231
+ .write = microbit_i2c_write,
232
+ .endianness = DEVICE_LITTLE_ENDIAN,
233
+ .impl.min_access_size = 4,
234
+ .impl.max_access_size = 4,
235
+};
236
+
237
+static const VMStateDescription microbit_i2c_vmstate = {
238
+ .name = TYPE_MICROBIT_I2C,
239
+ .version_id = 1,
240
+ .minimum_version_id = 1,
241
+ .fields = (VMStateField[]) {
242
+ VMSTATE_UINT32_ARRAY(regs, MicrobitI2CState, MICROBIT_I2C_NREGS),
243
+ VMSTATE_UINT32(read_idx, MicrobitI2CState),
244
+ },
245
+};
246
+
247
+static void microbit_i2c_reset(DeviceState *dev)
248
+{
249
+ MicrobitI2CState *s = MICROBIT_I2C(dev);
250
+
251
+ memset(s->regs, 0, sizeof(s->regs));
252
+ s->read_idx = 0;
253
+}
254
+
255
+static void microbit_i2c_realize(DeviceState *dev, Error **errp)
256
+{
257
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
258
+ MicrobitI2CState *s = MICROBIT_I2C(dev);
259
+
260
+ memory_region_init_io(&s->iomem, OBJECT(s), &microbit_i2c_ops, s,
261
+ "microbit.twi", NRF51_TWI_SIZE);
262
+ sysbus_init_mmio(sbd, &s->iomem);
263
+}
264
+
265
+static void microbit_i2c_class_init(ObjectClass *klass, void *data)
266
+{
267
+ DeviceClass *dc = DEVICE_CLASS(klass);
268
+
269
+ dc->vmsd = &microbit_i2c_vmstate;
270
+ dc->reset = microbit_i2c_reset;
271
+ dc->realize = microbit_i2c_realize;
272
+ dc->desc = "Microbit I2C controller";
273
+}
274
+
275
+static const TypeInfo microbit_i2c_info = {
276
+ .name = TYPE_MICROBIT_I2C,
277
+ .parent = TYPE_SYS_BUS_DEVICE,
278
+ .instance_size = sizeof(MicrobitI2CState),
279
+ .class_init = microbit_i2c_class_init,
280
+};
281
+
282
+static void microbit_i2c_register_types(void)
283
+{
284
+ type_register_static(&microbit_i2c_info);
285
+}
286
+
287
+type_init(microbit_i2c_register_types)
288
--
289
2.20.1
290
291
diff view generated by jsdifflib
1
For TCG we want to distinguish which cluster a CPU is in, and
1
FEAT_XS introduces a set of new TLBI maintenance instructions with an
2
we need to do it quickly. Cache the cluster index in the CPUState
2
"nXS" qualifier. These behave like the stardard ones except that
3
struct, by having the cluster object set cpu->cluster_index for
3
they do not wait for memory accesses with the XS attribute to
4
each CPU child when it is realized.
4
complete. They have an interaction with the fine-grained-trap
5
handling: the FGT bits that a hypervisor can use to trap TLBI
6
maintenance instructions normally trap also the nXS variants, but the
7
hypervisor can elect to not trap the nXS variants by setting
8
HCRX_EL2.FGTnXS to 1.
5
9
6
This means that board/SoC code must add all CPUs to the cluster
10
Add support to our FGT mechanism for these TLBI bits. For each
7
before realizing the cluster object. Regrettably QOM provides no
11
TLBI-trapping FGT bit we define, for example:
8
way to prevent adding children to a realized object and no way for
12
* FGT_TLBIVAE1 -- the same value we do at present for the
9
the parent to be notified when a new child is added to it, so
13
normal variant of the insn
10
we don't have any way to enforce/assert this constraint; all
14
* FGT_TLBIVAE1NXS -- for the nXS qualified insn; the value of
11
we can do is document it in a comment. We can at least put in a
15
this enum has an NXS bit ORed into it
12
check that the cluster contains at least one CPU, which should
13
catch the typical cases of "realized cluster too early" or
14
"forgot to parent the CPUs into it".
15
16
16
The restriction on how many clusters can exist in the system
17
In access_check_cp_reg() we can then ignore the trap bit for an
17
is imposed by TCG code which will be added in a subsequent commit,
18
access where ri->fgt has the NXS bit set and HCRX_EL2.FGTnXS is 1.
18
but the check to enforce it in cluster.c fits better in this one.
19
19
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
21
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
22
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
22
Message-id: 20241211144440.2700268-2-peter.maydell@linaro.org
23
Message-id: 20190121152218.9592-3-peter.maydell@linaro.org
24
---
23
---
25
include/hw/cpu/cluster.h | 24 +++++++++++++++++++++
24
target/arm/cpregs.h | 72 ++++++++++++++++++++++----------------
26
include/qom/cpu.h | 7 ++++++
25
target/arm/cpu-features.h | 5 +++
27
hw/cpu/cluster.c | 46 ++++++++++++++++++++++++++++++++++++++++
26
target/arm/helper.c | 5 ++-
28
qom/cpu.c | 1 +
27
target/arm/tcg/op_helper.c | 11 +++++-
29
4 files changed, 78 insertions(+)
28
4 files changed, 61 insertions(+), 32 deletions(-)
30
29
31
diff --git a/include/hw/cpu/cluster.h b/include/hw/cpu/cluster.h
30
diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h
32
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
33
--- a/include/hw/cpu/cluster.h
32
--- a/target/arm/cpregs.h
34
+++ b/include/hw/cpu/cluster.h
33
+++ b/target/arm/cpregs.h
35
@@ -XXX,XX +XXX,XX @@
34
@@ -XXX,XX +XXX,XX @@ FIELD(HDFGWTR_EL2, NBRBCTL, 60, 1)
36
* Arm big.LITTLE system) they should be in different clusters. If the CPUs do
35
FIELD(HDFGWTR_EL2, NBRBDATA, 61, 1)
37
* not have the same view of memory (for example the main CPU and a management
36
FIELD(HDFGWTR_EL2, NPMSNEVFR_EL1, 62, 1)
38
* controller processor) they should be in different clusters.
37
39
+ *
38
+FIELD(FGT, NXS, 13, 1) /* Honour HCR_EL2.FGTnXS to suppress FGT */
40
+ * A cluster is created by creating an object of TYPE_CPU_CLUSTER, and then
39
/* Which fine-grained trap bit register to check, if any */
41
+ * adding the CPUs to it as QOM child objects (e.g. using the
40
FIELD(FGT, TYPE, 10, 3)
42
+ * object_initialize_child() or object_property_add_child() functions).
41
FIELD(FGT, REV, 9, 1) /* Is bit sense reversed? */
43
+ * The CPUs may be either direct children of the cluster object, or indirect
42
@@ -XXX,XX +XXX,XX @@ FIELD(FGT, BITPOS, 0, 6) /* Bit position within the uint64_t */
44
+ * children (e.g. children of children of the cluster object).
43
#define DO_REV_BIT(REG, BITNAME) \
45
+ *
44
FGT_##BITNAME = FGT_##REG | FGT_REV | R_##REG##_EL2_##BITNAME##_SHIFT
46
+ * All CPUs must be added as children before the cluster is realized.
47
+ * (Regrettably QOM provides no way to prevent adding children to a realized
48
+ * object and no way for the parent to be notified when a new child is added
49
+ * to it, so this restriction is not checked for, but the system will not
50
+ * behave correctly if it is not adhered to. The cluster will assert that
51
+ * it contains at least one CPU, which should catch most inadvertent
52
+ * violations of this constraint.)
53
+ *
54
+ * A CPU which is not put into any cluster will be considered implicitly
55
+ * to be in a cluster with all the other "loose" CPUs, so all CPUs that are
56
+ * not assigned to clusters must be identical.
57
*/
58
59
#define TYPE_CPU_CLUSTER "cpu-cluster"
60
#define CPU_CLUSTER(obj) \
61
OBJECT_CHECK(CPUClusterState, (obj), TYPE_CPU_CLUSTER)
62
45
63
+/*
46
+/*
64
+ * This limit is imposed by TCG, which puts the cluster ID into an
47
+ * The FGT bits for TLBI maintenance instructions accessible at EL1 always
65
+ * 8 bit field (and uses all-1s for the default "not in any cluster").
48
+ * affect the "normal" TLBI insns; they affect the corresponding TLBI insns
49
+ * with the nXS qualifier only if HCRX_EL2.FGTnXS is 0. We define e.g.
50
+ * FGT_TLBIVAE1 to use for the normal insn, and FGT_TLBIVAE1NXS to use
51
+ * for the nXS qualified insn.
66
+ */
52
+ */
67
+#define MAX_CLUSTERS 255
53
+#define DO_TLBINXS_BIT(REG, BITNAME) \
54
+ FGT_##BITNAME = FGT_##REG | R_##REG##_EL2_##BITNAME##_SHIFT, \
55
+ FGT_##BITNAME##NXS = FGT_##BITNAME | R_FGT_NXS_MASK
68
+
56
+
69
/**
57
typedef enum FGTBit {
70
* CPUClusterState:
58
/*
71
* @cluster_id: The cluster ID. This value is for internal use only and should
59
* These bits tell us which register arrays to use:
72
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
60
@@ -XXX,XX +XXX,XX @@ typedef enum FGTBit {
61
DO_BIT(HFGITR, ATS1E0W),
62
DO_BIT(HFGITR, ATS1E1RP),
63
DO_BIT(HFGITR, ATS1E1WP),
64
- DO_BIT(HFGITR, TLBIVMALLE1OS),
65
- DO_BIT(HFGITR, TLBIVAE1OS),
66
- DO_BIT(HFGITR, TLBIASIDE1OS),
67
- DO_BIT(HFGITR, TLBIVAAE1OS),
68
- DO_BIT(HFGITR, TLBIVALE1OS),
69
- DO_BIT(HFGITR, TLBIVAALE1OS),
70
- DO_BIT(HFGITR, TLBIRVAE1OS),
71
- DO_BIT(HFGITR, TLBIRVAAE1OS),
72
- DO_BIT(HFGITR, TLBIRVALE1OS),
73
- DO_BIT(HFGITR, TLBIRVAALE1OS),
74
- DO_BIT(HFGITR, TLBIVMALLE1IS),
75
- DO_BIT(HFGITR, TLBIVAE1IS),
76
- DO_BIT(HFGITR, TLBIASIDE1IS),
77
- DO_BIT(HFGITR, TLBIVAAE1IS),
78
- DO_BIT(HFGITR, TLBIVALE1IS),
79
- DO_BIT(HFGITR, TLBIVAALE1IS),
80
- DO_BIT(HFGITR, TLBIRVAE1IS),
81
- DO_BIT(HFGITR, TLBIRVAAE1IS),
82
- DO_BIT(HFGITR, TLBIRVALE1IS),
83
- DO_BIT(HFGITR, TLBIRVAALE1IS),
84
- DO_BIT(HFGITR, TLBIRVAE1),
85
- DO_BIT(HFGITR, TLBIRVAAE1),
86
- DO_BIT(HFGITR, TLBIRVALE1),
87
- DO_BIT(HFGITR, TLBIRVAALE1),
88
- DO_BIT(HFGITR, TLBIVMALLE1),
89
- DO_BIT(HFGITR, TLBIVAE1),
90
- DO_BIT(HFGITR, TLBIASIDE1),
91
- DO_BIT(HFGITR, TLBIVAAE1),
92
- DO_BIT(HFGITR, TLBIVALE1),
93
- DO_BIT(HFGITR, TLBIVAALE1),
94
+ DO_TLBINXS_BIT(HFGITR, TLBIVMALLE1OS),
95
+ DO_TLBINXS_BIT(HFGITR, TLBIVAE1OS),
96
+ DO_TLBINXS_BIT(HFGITR, TLBIASIDE1OS),
97
+ DO_TLBINXS_BIT(HFGITR, TLBIVAAE1OS),
98
+ DO_TLBINXS_BIT(HFGITR, TLBIVALE1OS),
99
+ DO_TLBINXS_BIT(HFGITR, TLBIVAALE1OS),
100
+ DO_TLBINXS_BIT(HFGITR, TLBIRVAE1OS),
101
+ DO_TLBINXS_BIT(HFGITR, TLBIRVAAE1OS),
102
+ DO_TLBINXS_BIT(HFGITR, TLBIRVALE1OS),
103
+ DO_TLBINXS_BIT(HFGITR, TLBIRVAALE1OS),
104
+ DO_TLBINXS_BIT(HFGITR, TLBIVMALLE1IS),
105
+ DO_TLBINXS_BIT(HFGITR, TLBIVAE1IS),
106
+ DO_TLBINXS_BIT(HFGITR, TLBIASIDE1IS),
107
+ DO_TLBINXS_BIT(HFGITR, TLBIVAAE1IS),
108
+ DO_TLBINXS_BIT(HFGITR, TLBIVALE1IS),
109
+ DO_TLBINXS_BIT(HFGITR, TLBIVAALE1IS),
110
+ DO_TLBINXS_BIT(HFGITR, TLBIRVAE1IS),
111
+ DO_TLBINXS_BIT(HFGITR, TLBIRVAAE1IS),
112
+ DO_TLBINXS_BIT(HFGITR, TLBIRVALE1IS),
113
+ DO_TLBINXS_BIT(HFGITR, TLBIRVAALE1IS),
114
+ DO_TLBINXS_BIT(HFGITR, TLBIRVAE1),
115
+ DO_TLBINXS_BIT(HFGITR, TLBIRVAAE1),
116
+ DO_TLBINXS_BIT(HFGITR, TLBIRVALE1),
117
+ DO_TLBINXS_BIT(HFGITR, TLBIRVAALE1),
118
+ DO_TLBINXS_BIT(HFGITR, TLBIVMALLE1),
119
+ DO_TLBINXS_BIT(HFGITR, TLBIVAE1),
120
+ DO_TLBINXS_BIT(HFGITR, TLBIASIDE1),
121
+ DO_TLBINXS_BIT(HFGITR, TLBIVAAE1),
122
+ DO_TLBINXS_BIT(HFGITR, TLBIVALE1),
123
+ DO_TLBINXS_BIT(HFGITR, TLBIVAALE1),
124
DO_BIT(HFGITR, CFPRCTX),
125
DO_BIT(HFGITR, DVPRCTX),
126
DO_BIT(HFGITR, CPPRCTX),
127
diff --git a/target/arm/cpu-features.h b/target/arm/cpu-features.h
73
index XXXXXXX..XXXXXXX 100644
128
index XXXXXXX..XXXXXXX 100644
74
--- a/include/qom/cpu.h
129
--- a/target/arm/cpu-features.h
75
+++ b/include/qom/cpu.h
130
+++ b/target/arm/cpu-features.h
76
@@ -XXX,XX +XXX,XX @@ struct qemu_work_item;
131
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_fcma(const ARMISARegisters *id)
77
/**
132
return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, FCMA) != 0;
78
* CPUState:
133
}
79
* @cpu_index: CPU index (informative).
134
80
+ * @cluster_index: Identifies which cluster this CPU is in.
135
+static inline bool isar_feature_aa64_xs(const ARMISARegisters *id)
81
+ * For boards which don't define clusters or for "loose" CPUs not assigned
82
+ * to a cluster this will be UNASSIGNED_CLUSTER_INDEX; otherwise it will
83
+ * be the same as the cluster-id property of the CPU object's TYPE_CPU_CLUSTER
84
+ * QOM parent.
85
* @nr_cores: Number of cores within this CPU package.
86
* @nr_threads: Number of threads within this CPU.
87
* @running: #true if CPU is currently running (lockless).
88
@@ -XXX,XX +XXX,XX @@ struct CPUState {
89
90
/* TODO Move common fields from CPUArchState here. */
91
int cpu_index;
92
+ int cluster_index;
93
uint32_t halted;
94
uint32_t can_do_io;
95
int32_t exception_index;
96
@@ -XXX,XX +XXX,XX @@ extern const struct VMStateDescription vmstate_cpu_common;
97
#endif /* NEED_CPU_H */
98
99
#define UNASSIGNED_CPU_INDEX -1
100
+#define UNASSIGNED_CLUSTER_INDEX -1
101
102
#endif
103
diff --git a/hw/cpu/cluster.c b/hw/cpu/cluster.c
104
index XXXXXXX..XXXXXXX 100644
105
--- a/hw/cpu/cluster.c
106
+++ b/hw/cpu/cluster.c
107
@@ -XXX,XX +XXX,XX @@
108
109
#include "qemu/osdep.h"
110
#include "hw/cpu/cluster.h"
111
+#include "qom/cpu.h"
112
#include "qapi/error.h"
113
#include "qemu/module.h"
114
+#include "qemu/cutils.h"
115
116
static Property cpu_cluster_properties[] = {
117
DEFINE_PROP_UINT32("cluster-id", CPUClusterState, cluster_id, 0),
118
DEFINE_PROP_END_OF_LIST()
119
};
120
121
+typedef struct CallbackData {
122
+ CPUClusterState *cluster;
123
+ int cpu_count;
124
+} CallbackData;
125
+
126
+static int add_cpu_to_cluster(Object *obj, void *opaque)
127
+{
136
+{
128
+ CallbackData *cbdata = opaque;
137
+ return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, XS) != 0;
129
+ CPUState *cpu = (CPUState *)object_dynamic_cast(obj, TYPE_CPU);
130
+
131
+ if (cpu) {
132
+ cpu->cluster_index = cbdata->cluster->cluster_id;
133
+ cbdata->cpu_count++;
134
+ }
135
+ return 0;
136
+}
138
+}
137
+
139
+
138
+static void cpu_cluster_realize(DeviceState *dev, Error **errp)
140
/*
139
+{
141
* These are the values from APA/API/APA3.
140
+ /* Iterate through all our CPU children and set their cluster_index */
142
* In general these must be compared '>=', per the normal Arm ARM
141
+ CPUClusterState *cluster = CPU_CLUSTER(dev);
143
diff --git a/target/arm/helper.c b/target/arm/helper.c
142
+ Object *cluster_obj = OBJECT(dev);
144
index XXXXXXX..XXXXXXX 100644
143
+ CallbackData cbdata = {
145
--- a/target/arm/helper.c
144
+ .cluster = cluster,
146
+++ b/target/arm/helper.c
145
+ .cpu_count = 0,
147
@@ -XXX,XX +XXX,XX @@ static void hcrx_write(CPUARMState *env, const ARMCPRegInfo *ri,
146
+ };
148
valid_mask |= HCRX_TALLINT | HCRX_VINMI | HCRX_VFNMI;
147
+
149
}
148
+ if (cluster->cluster_id >= MAX_CLUSTERS) {
150
/* FEAT_CMOW adds CMOW */
149
+ error_setg(errp, "cluster-id must be less than %d", MAX_CLUSTERS);
151
-
150
+ return;
152
if (cpu_isar_feature(aa64_cmow, cpu)) {
153
valid_mask |= HCRX_CMOW;
154
}
155
+ /* FEAT_XS adds FGTnXS, FnXS */
156
+ if (cpu_isar_feature(aa64_xs, cpu)) {
157
+ valid_mask |= HCRX_FGTNXS | HCRX_FNXS;
151
+ }
158
+ }
152
+
159
153
+ object_child_foreach_recursive(cluster_obj, add_cpu_to_cluster, &cbdata);
160
/* Clear RES0 bits. */
154
+
161
env->cp15.hcrx_el2 = value & valid_mask;
155
+ /*
162
diff --git a/target/arm/tcg/op_helper.c b/target/arm/tcg/op_helper.c
156
+ * A cluster with no CPUs is a bug in the board/SoC code that created it;
157
+ * if you hit this during development of new code, check that you have
158
+ * created the CPUs and parented them into the cluster object before
159
+ * realizing the cluster object.
160
+ */
161
+ assert(cbdata.cpu_count > 0);
162
+}
163
+
164
static void cpu_cluster_class_init(ObjectClass *klass, void *data)
165
{
166
DeviceClass *dc = DEVICE_CLASS(klass);
167
168
dc->props = cpu_cluster_properties;
169
+ dc->realize = cpu_cluster_realize;
170
}
171
172
static const TypeInfo cpu_cluster_type_info = {
173
diff --git a/qom/cpu.c b/qom/cpu.c
174
index XXXXXXX..XXXXXXX 100644
163
index XXXXXXX..XXXXXXX 100644
175
--- a/qom/cpu.c
164
--- a/target/arm/tcg/op_helper.c
176
+++ b/qom/cpu.c
165
+++ b/target/arm/tcg/op_helper.c
177
@@ -XXX,XX +XXX,XX @@ static void cpu_common_initfn(Object *obj)
166
@@ -XXX,XX +XXX,XX @@ const void *HELPER(access_check_cp_reg)(CPUARMState *env, uint32_t key,
178
CPUClass *cc = CPU_GET_CLASS(obj);
167
unsigned int idx = FIELD_EX32(ri->fgt, FGT, IDX);
179
168
unsigned int bitpos = FIELD_EX32(ri->fgt, FGT, BITPOS);
180
cpu->cpu_index = UNASSIGNED_CPU_INDEX;
169
bool rev = FIELD_EX32(ri->fgt, FGT, REV);
181
+ cpu->cluster_index = UNASSIGNED_CLUSTER_INDEX;
170
+ bool nxs = FIELD_EX32(ri->fgt, FGT, NXS);
182
cpu->gdb_num_regs = cpu->gdb_num_g_regs = cc->gdb_num_core_regs;
171
bool trapbit;
183
/* *-user doesn't have configurable SMP topology */
172
184
/* the default value is changed by qemu_init_vcpu() for softmmu */
173
if (ri->fgt & FGT_EXEC) {
174
@@ -XXX,XX +XXX,XX @@ const void *HELPER(access_check_cp_reg)(CPUARMState *env, uint32_t key,
175
trapword = env->cp15.fgt_write[idx];
176
}
177
178
- trapbit = extract64(trapword, bitpos, 1);
179
+ if (nxs && (arm_hcrx_el2_eff(env) & HCRX_FGTNXS)) {
180
+ /*
181
+ * If HCRX_EL2.FGTnXS is 1 then the fine-grained trap for
182
+ * TLBI maintenance insns does *not* apply to the nXS variant.
183
+ */
184
+ trapbit = 0;
185
+ } else {
186
+ trapbit = extract64(trapword, bitpos, 1);
187
+ }
188
if (trapbit != rev) {
189
res = CP_ACCESS_TRAP_EL2;
190
goto fail;
185
--
191
--
186
2.20.1
192
2.34.1
187
188
diff view generated by jsdifflib
1
From: Aaron Lindsay OS <aaron@os.amperecomputing.com>
1
All of the TLBI insns with an NXS variant put that variant at the
2
same encoding but with a CRn field that is one greater than for the
3
original TLBI insn. To avoid having to define every TLBI insn
4
effectively twice, once in the normal way and once in a set of cpreg
5
arrays that are only registered when FEAT_XS is present, we define a
6
new ARM_CP_ADD_TLB_NXS type flag for cpregs. When this flag is set
7
in a cpreg struct and FEAT_XS is present,
8
define_one_arm_cp_reg_with_opaque() will automatically add a second
9
cpreg to the hash table for the TLBI NXS insn with:
10
* the crn+1 encoding
11
* an FGT field that indicates that it should honour HCR_EL2.FGTnXS
12
* a name with the "NXS" suffix
2
13
3
A bug was introduced during a respin of:
14
(If there are future TLBI NXS insns that don't use this same
15
encoding convention, it is also possible to define them manually.)
4
16
5
    commit 57a4a11b2b281bb548b419ca81bfafb214e4c77a
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
    target/arm: Add array for supported PMU events, generate PMCEID[01]_EL0
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Message-id: 20241211144440.2700268-3-peter.maydell@linaro.org
20
---
21
target/arm/cpregs.h | 8 ++++++++
22
target/arm/helper.c | 25 +++++++++++++++++++++++++
23
2 files changed, 33 insertions(+)
7
24
8
This patch introduced two calls to get_pmceid() during CPU
25
diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h
9
initialization - one each for PMCEID0 and PMCEID1. In addition to
10
building the register values, get_pmceid() clears an internal array
11
mapping event numbers to their implementations (supported_event_map)
12
before rebuilding it. This is an optimization since much of the logic is
13
shared. However, since it was called twice, the contents of
14
supported_event_map reflect only the events in PMCEID1 (the second call
15
to get_pmceid()).
16
17
Fix this bug by moving the initialization of PMCEID0 and PMCEID1 back
18
into a single function call, and name it more appropriately since it is
19
doing more than simply generating the contents of the PMCEID[01]
20
registers.
21
22
Signed-off-by: Aaron Lindsay <aaron@os.amperecomputing.com>
23
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
24
Message-id: 20190123195814.29253-1-aaron@os.amperecomputing.com
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
---
27
target/arm/cpu.h | 11 +++++------
28
target/arm/cpu.c | 3 +--
29
target/arm/helper.c | 27 ++++++++++++++++-----------
30
3 files changed, 22 insertions(+), 19 deletions(-)
31
32
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
33
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/cpu.h
27
--- a/target/arm/cpregs.h
35
+++ b/target/arm/cpu.h
28
+++ b/target/arm/cpregs.h
36
@@ -XXX,XX +XXX,XX @@ void pmu_pre_el_change(ARMCPU *cpu, void *ignored);
29
@@ -XXX,XX +XXX,XX @@ enum {
37
void pmu_post_el_change(ARMCPU *cpu, void *ignored);
30
* equivalent EL1 register when FEAT_NV2 is enabled.
31
*/
32
ARM_CP_NV2_REDIRECT = 1 << 20,
33
+ /*
34
+ * Flag: this is a TLBI insn which (when FEAT_XS is present) also has
35
+ * an NXS variant at the same encoding except that crn is 1 greater,
36
+ * so when registering this cpreg automatically also register one
37
+ * for the TLBI NXS variant. (For QEMU the NXS variant behaves
38
+ * identically to the normal one, other than FGT trapping handling.)
39
+ */
40
+ ARM_CP_ADD_TLBI_NXS = 1 << 21,
41
};
38
42
39
/*
43
/*
40
- * get_pmceid
41
- * @env: CPUARMState
42
- * @which: which PMCEID register to return (0 or 1)
43
+ * pmu_init
44
+ * @cpu: ARMCPU
45
*
46
- * Return the PMCEID[01]_EL0 register values corresponding to the counters
47
- * which are supported given the current configuration
48
+ * Initialize the CPU's PMCEID[01]_EL0 registers and associated internal state
49
+ * for the current configuration
50
*/
51
-uint64_t get_pmceid(CPUARMState *env, unsigned which);
52
+void pmu_init(ARMCPU *cpu);
53
54
/* SCTLR bit meanings. Several bits have been reused in newer
55
* versions of the architecture; in that case we define constants
56
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/arm/cpu.c
59
+++ b/target/arm/cpu.c
60
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
61
unset_feature(env, ARM_FEATURE_PMU);
62
}
63
if (arm_feature(env, ARM_FEATURE_PMU)) {
64
- cpu->pmceid0 = get_pmceid(&cpu->env, 0);
65
- cpu->pmceid1 = get_pmceid(&cpu->env, 1);
66
+ pmu_init(cpu);
67
68
if (!kvm_enabled()) {
69
arm_register_pre_el_change_hook(cpu, &pmu_pre_el_change, 0);
70
diff --git a/target/arm/helper.c b/target/arm/helper.c
44
diff --git a/target/arm/helper.c b/target/arm/helper.c
71
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
72
--- a/target/arm/helper.c
46
--- a/target/arm/helper.c
73
+++ b/target/arm/helper.c
47
+++ b/target/arm/helper.c
74
@@ -XXX,XX +XXX,XX @@ static const pm_event pm_events[] = {
48
@@ -XXX,XX +XXX,XX @@ void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu,
75
static uint16_t supported_event_map[MAX_EVENT_ID + 1];
49
if (r->state != state && r->state != ARM_CP_STATE_BOTH) {
76
50
continue;
77
/*
51
}
78
- * Called upon initialization to build PMCEID0_EL0 or PMCEID1_EL0 (indicated by
52
+ if ((r->type & ARM_CP_ADD_TLBI_NXS) &&
79
- * 'which'). We also use it to build a map of ARM event numbers to indices in
53
+ cpu_isar_feature(aa64_xs, cpu)) {
80
- * our pm_events array.
54
+ /*
81
+ * Called upon CPU initialization to initialize PMCEID[01]_EL0 and build a map
55
+ * This is a TLBI insn which has an NXS variant. The
82
+ * of ARM event numbers to indices in our pm_events array.
56
+ * NXS variant is at the same encoding except that
83
*
57
+ * crn is +1, and has the same behaviour except for
84
* Note: Events in the 0x40XX range are not currently supported.
58
+ * fine-grained trapping. Add the NXS insn here and
85
*/
59
+ * then fall through to add the normal register.
86
-uint64_t get_pmceid(CPUARMState *env, unsigned which)
60
+ * add_cpreg_to_hashtable() copies the cpreg struct
87
+void pmu_init(ARMCPU *cpu)
61
+ * and name that it is passed, so it's OK to use
88
{
62
+ * a local struct here.
89
- uint64_t pmceid = 0;
63
+ */
90
unsigned int i;
64
+ ARMCPRegInfo nxs_ri = *r;
91
65
+ g_autofree char *name = g_strdup_printf("%sNXS", r->name);
92
- assert(which <= 1);
66
+
93
-
67
+ assert(state == ARM_CP_STATE_AA64);
94
+ /*
68
+ assert(nxs_ri.crn < 0xf);
95
+ * Empty supported_event_map and cpu->pmceid[01] before adding supported
69
+ nxs_ri.crn++;
96
+ * events to them
70
+ if (nxs_ri.fgt) {
97
+ */
71
+ nxs_ri.fgt |= R_FGT_NXS_MASK;
98
for (i = 0; i < ARRAY_SIZE(supported_event_map); i++) {
72
+ }
99
supported_event_map[i] = UNSUPPORTED_EVENT;
73
+ add_cpreg_to_hashtable(cpu, &nxs_ri, opaque, state,
100
}
74
+ ARM_CP_SECSTATE_NS,
101
+ cpu->pmceid0 = 0;
75
+ crm, opc1, opc2, name);
102
+ cpu->pmceid1 = 0;
76
+ }
103
77
if (state == ARM_CP_STATE_AA32) {
104
for (i = 0; i < ARRAY_SIZE(pm_events); i++) {
78
/*
105
const pm_event *cnt = &pm_events[i];
79
* Under AArch32 CP registers can be common
106
@@ -XXX,XX +XXX,XX @@ uint64_t get_pmceid(CPUARMState *env, unsigned which)
107
/* We do not currently support events in the 0x40xx range */
108
assert(cnt->number <= 0x3f);
109
110
- if ((cnt->number & 0x20) == (which << 6) &&
111
- cnt->supported(env)) {
112
- pmceid |= (1 << (cnt->number & 0x1f));
113
+ if (cnt->supported(&cpu->env)) {
114
supported_event_map[cnt->number] = i;
115
+ uint64_t event_mask = 1 << (cnt->number & 0x1f);
116
+ if (cnt->number & 0x20) {
117
+ cpu->pmceid1 |= event_mask;
118
+ } else {
119
+ cpu->pmceid0 |= event_mask;
120
+ }
121
}
122
}
123
- return pmceid;
124
}
125
126
/*
127
--
80
--
128
2.20.1
81
2.34.1
129
130
diff view generated by jsdifflib
1
In cpu_signal_handler() for aarch64 hosts, currently we parse
1
Add the ARM_CP_ADD_TLBI_NXS to the TLBI insns with an NXS variant.
2
the faulting instruction to see if it is a load or a store.
2
This is every AArch64 TLBI encoding except for the four FEAT_RME TLBI
3
Since the 3.16 kernel (~2014), the kernel has provided us with
3
insns.
4
the syndrome register for a fault, which includes the WnR bit.
5
Use this instead if it is present, only falling back to
6
instruction parsing if not.
7
4
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20190108180014.32386-1-peter.maydell@linaro.org
7
Message-id: 20241211144440.2700268-4-peter.maydell@linaro.org
11
---
8
---
12
accel/tcg/user-exec.c | 66 ++++++++++++++++++++++++++++++++++---------
9
target/arm/tcg/tlb-insns.c | 202 +++++++++++++++++++++++--------------
13
1 file changed, 52 insertions(+), 14 deletions(-)
10
1 file changed, 124 insertions(+), 78 deletions(-)
14
11
15
diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c
12
diff --git a/target/arm/tcg/tlb-insns.c b/target/arm/tcg/tlb-insns.c
16
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
17
--- a/accel/tcg/user-exec.c
14
--- a/target/arm/tcg/tlb-insns.c
18
+++ b/accel/tcg/user-exec.c
15
+++ b/target/arm/tcg/tlb-insns.c
19
@@ -XXX,XX +XXX,XX @@ int cpu_signal_handler(int host_signum, void *pinfo,
16
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = {
20
17
/* AArch64 TLBI operations */
21
#elif defined(__aarch64__)
18
{ .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64,
22
19
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
23
+#ifndef ESR_MAGIC
20
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
24
+/* Pre-3.16 kernel headers don't have these, so provide fallback definitions */
21
+ .access = PL1_W, .accessfn = access_ttlbis,
25
+#define ESR_MAGIC 0x45535201
22
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
26
+struct esr_context {
23
.fgt = FGT_TLBIVMALLE1IS,
27
+ struct _aarch64_ctx head;
24
.writefn = tlbi_aa64_vmalle1is_write },
28
+ uint64_t esr;
25
{ .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64,
29
+};
26
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
30
+#endif
27
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
31
+
28
+ .access = PL1_W, .accessfn = access_ttlbis,
32
+static inline struct _aarch64_ctx *first_ctx(ucontext_t *uc)
29
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
33
+{
30
.fgt = FGT_TLBIVAE1IS,
34
+ return (struct _aarch64_ctx *)&uc->uc_mcontext.__reserved;
31
.writefn = tlbi_aa64_vae1is_write },
35
+}
32
{ .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64,
36
+
33
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
37
+static inline struct _aarch64_ctx *next_ctx(struct _aarch64_ctx *hdr)
34
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
38
+{
35
+ .access = PL1_W, .accessfn = access_ttlbis,
39
+ return (struct _aarch64_ctx *)((char *)hdr + hdr->size);
36
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
40
+}
37
.fgt = FGT_TLBIASIDE1IS,
41
+
38
.writefn = tlbi_aa64_vmalle1is_write },
42
int cpu_signal_handler(int host_signum, void *pinfo, void *puc)
39
{ .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64,
43
{
40
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
44
siginfo_t *info = pinfo;
41
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
45
ucontext_t *uc = puc;
42
+ .access = PL1_W, .accessfn = access_ttlbis,
46
uintptr_t pc = uc->uc_mcontext.pc;
43
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
47
- uint32_t insn = *(uint32_t *)pc;
44
.fgt = FGT_TLBIVAAE1IS,
48
bool is_write;
45
.writefn = tlbi_aa64_vae1is_write },
49
+ struct _aarch64_ctx *hdr;
46
{ .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64,
50
+ struct esr_context const *esrctx = NULL;
47
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
51
48
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
52
- /* XXX: need kernel patch to get write flag faster. */
49
+ .access = PL1_W, .accessfn = access_ttlbis,
53
- is_write = ( (insn & 0xbfff0000) == 0x0c000000 /* C3.3.1 */
50
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
54
- || (insn & 0xbfe00000) == 0x0c800000 /* C3.3.2 */
51
.fgt = FGT_TLBIVALE1IS,
55
- || (insn & 0xbfdf0000) == 0x0d000000 /* C3.3.3 */
52
.writefn = tlbi_aa64_vae1is_write },
56
- || (insn & 0xbfc00000) == 0x0d800000 /* C3.3.4 */
53
{ .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64,
57
- || (insn & 0x3f400000) == 0x08000000 /* C3.3.6 */
54
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
58
- || (insn & 0x3bc00000) == 0x39000000 /* C3.3.13 */
55
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
59
- || (insn & 0x3fc00000) == 0x3d800000 /* ... 128bit */
56
+ .access = PL1_W, .accessfn = access_ttlbis,
60
- /* Ingore bits 10, 11 & 21, controlling indexing. */
57
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
61
- || (insn & 0x3bc00000) == 0x38000000 /* C3.3.8-12 */
58
.fgt = FGT_TLBIVAALE1IS,
62
- || (insn & 0x3fe00000) == 0x3c800000 /* ... 128bit */
59
.writefn = tlbi_aa64_vae1is_write },
63
- /* Ignore bits 23 & 24, controlling indexing. */
60
{ .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64,
64
- || (insn & 0x3a400000) == 0x28000000); /* C3.3.7,14-16 */
61
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
65
+ /* Find the esr_context, which has the WnR bit in it */
62
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
66
+ for (hdr = first_ctx(uc); hdr->magic; hdr = next_ctx(hdr)) {
63
+ .access = PL1_W, .accessfn = access_ttlb,
67
+ if (hdr->magic == ESR_MAGIC) {
64
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
68
+ esrctx = (struct esr_context const *)hdr;
65
.fgt = FGT_TLBIVMALLE1,
69
+ break;
66
.writefn = tlbi_aa64_vmalle1_write },
70
+ }
67
{ .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64,
71
+ }
68
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
72
69
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
73
+ if (esrctx) {
70
+ .access = PL1_W, .accessfn = access_ttlb,
74
+ /* For data aborts ESR.EC is 0b10010x: then bit 6 is the WnR bit */
71
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
75
+ uint64_t esr = esrctx->esr;
72
.fgt = FGT_TLBIVAE1,
76
+ is_write = extract32(esr, 27, 5) == 0x12 && extract32(esr, 6, 1) == 1;
73
.writefn = tlbi_aa64_vae1_write },
77
+ } else {
74
{ .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64,
78
+ /*
75
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
79
+ * Fall back to parsing instructions; will only be needed
76
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
80
+ * for really ancient (pre-3.16) kernels.
77
+ .access = PL1_W, .accessfn = access_ttlb,
81
+ */
78
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
82
+ uint32_t insn = *(uint32_t *)pc;
79
.fgt = FGT_TLBIASIDE1,
83
+
80
.writefn = tlbi_aa64_vmalle1_write },
84
+ is_write = ((insn & 0xbfff0000) == 0x0c000000 /* C3.3.1 */
81
{ .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64,
85
+ || (insn & 0xbfe00000) == 0x0c800000 /* C3.3.2 */
82
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
86
+ || (insn & 0xbfdf0000) == 0x0d000000 /* C3.3.3 */
83
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
87
+ || (insn & 0xbfc00000) == 0x0d800000 /* C3.3.4 */
84
+ .access = PL1_W, .accessfn = access_ttlb,
88
+ || (insn & 0x3f400000) == 0x08000000 /* C3.3.6 */
85
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
89
+ || (insn & 0x3bc00000) == 0x39000000 /* C3.3.13 */
86
.fgt = FGT_TLBIVAAE1,
90
+ || (insn & 0x3fc00000) == 0x3d800000 /* ... 128bit */
87
.writefn = tlbi_aa64_vae1_write },
91
+ /* Ignore bits 10, 11 & 21, controlling indexing. */
88
{ .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64,
92
+ || (insn & 0x3bc00000) == 0x38000000 /* C3.3.8-12 */
89
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
93
+ || (insn & 0x3fe00000) == 0x3c800000 /* ... 128bit */
90
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
94
+ /* Ignore bits 23 & 24, controlling indexing. */
91
+ .access = PL1_W, .accessfn = access_ttlb,
95
+ || (insn & 0x3a400000) == 0x28000000); /* C3.3.7,14-16 */
92
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
96
+ }
93
.fgt = FGT_TLBIVALE1,
97
return handle_cpu_signal(pc, info, is_write, &uc->uc_sigmask);
94
.writefn = tlbi_aa64_vae1_write },
98
}
95
{ .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64,
96
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
97
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
98
+ .access = PL1_W, .accessfn = access_ttlb,
99
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
100
.fgt = FGT_TLBIVAALE1,
101
.writefn = tlbi_aa64_vae1_write },
102
{ .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
103
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
104
- .access = PL2_W, .type = ARM_CP_NO_RAW,
105
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
106
.writefn = tlbi_aa64_ipas2e1is_write },
107
{ .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64,
108
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
109
- .access = PL2_W, .type = ARM_CP_NO_RAW,
110
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
111
.writefn = tlbi_aa64_ipas2e1is_write },
112
{ .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64,
113
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
114
- .access = PL2_W, .type = ARM_CP_NO_RAW,
115
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
116
.writefn = tlbi_aa64_alle1is_write },
117
{ .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64,
118
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6,
119
- .access = PL2_W, .type = ARM_CP_NO_RAW,
120
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
121
.writefn = tlbi_aa64_alle1is_write },
122
{ .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64,
123
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
124
- .access = PL2_W, .type = ARM_CP_NO_RAW,
125
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
126
.writefn = tlbi_aa64_ipas2e1_write },
127
{ .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64,
128
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
129
- .access = PL2_W, .type = ARM_CP_NO_RAW,
130
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
131
.writefn = tlbi_aa64_ipas2e1_write },
132
{ .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64,
133
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
134
- .access = PL2_W, .type = ARM_CP_NO_RAW,
135
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
136
.writefn = tlbi_aa64_alle1_write },
137
{ .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64,
138
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6,
139
- .access = PL2_W, .type = ARM_CP_NO_RAW,
140
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
141
.writefn = tlbi_aa64_alle1is_write },
142
};
143
144
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
145
.writefn = tlbimva_hyp_is_write },
146
{ .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64,
147
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
148
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
149
+ .access = PL2_W,
150
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
151
.writefn = tlbi_aa64_alle2_write },
152
{ .name = "TLBI_VAE2", .state = ARM_CP_STATE_AA64,
153
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
154
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
155
+ .access = PL2_W,
156
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
157
.writefn = tlbi_aa64_vae2_write },
158
{ .name = "TLBI_VALE2", .state = ARM_CP_STATE_AA64,
159
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
160
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
161
+ .access = PL2_W,
162
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
163
.writefn = tlbi_aa64_vae2_write },
164
{ .name = "TLBI_ALLE2IS", .state = ARM_CP_STATE_AA64,
165
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
166
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
167
+ .access = PL2_W,
168
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
169
.writefn = tlbi_aa64_alle2is_write },
170
{ .name = "TLBI_VAE2IS", .state = ARM_CP_STATE_AA64,
171
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
172
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
173
+ .access = PL2_W,
174
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
175
.writefn = tlbi_aa64_vae2is_write },
176
{ .name = "TLBI_VALE2IS", .state = ARM_CP_STATE_AA64,
177
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
178
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
179
+ .access = PL2_W,
180
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
181
.writefn = tlbi_aa64_vae2is_write },
182
};
183
184
static const ARMCPRegInfo tlbi_el3_cp_reginfo[] = {
185
{ .name = "TLBI_ALLE3IS", .state = ARM_CP_STATE_AA64,
186
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 0,
187
- .access = PL3_W, .type = ARM_CP_NO_RAW,
188
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
189
.writefn = tlbi_aa64_alle3is_write },
190
{ .name = "TLBI_VAE3IS", .state = ARM_CP_STATE_AA64,
191
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 1,
192
- .access = PL3_W, .type = ARM_CP_NO_RAW,
193
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
194
.writefn = tlbi_aa64_vae3is_write },
195
{ .name = "TLBI_VALE3IS", .state = ARM_CP_STATE_AA64,
196
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 5,
197
- .access = PL3_W, .type = ARM_CP_NO_RAW,
198
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
199
.writefn = tlbi_aa64_vae3is_write },
200
{ .name = "TLBI_ALLE3", .state = ARM_CP_STATE_AA64,
201
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 0,
202
- .access = PL3_W, .type = ARM_CP_NO_RAW,
203
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
204
.writefn = tlbi_aa64_alle3_write },
205
{ .name = "TLBI_VAE3", .state = ARM_CP_STATE_AA64,
206
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 1,
207
- .access = PL3_W, .type = ARM_CP_NO_RAW,
208
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
209
.writefn = tlbi_aa64_vae3_write },
210
{ .name = "TLBI_VALE3", .state = ARM_CP_STATE_AA64,
211
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 5,
212
- .access = PL3_W, .type = ARM_CP_NO_RAW,
213
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
214
.writefn = tlbi_aa64_vae3_write },
215
};
216
217
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_ripas2e1is_write(CPUARMState *env,
218
static const ARMCPRegInfo tlbirange_reginfo[] = {
219
{ .name = "TLBI_RVAE1IS", .state = ARM_CP_STATE_AA64,
220
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 1,
221
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
222
+ .access = PL1_W, .accessfn = access_ttlbis,
223
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
224
.fgt = FGT_TLBIRVAE1IS,
225
.writefn = tlbi_aa64_rvae1is_write },
226
{ .name = "TLBI_RVAAE1IS", .state = ARM_CP_STATE_AA64,
227
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 3,
228
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
229
+ .access = PL1_W, .accessfn = access_ttlbis,
230
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
231
.fgt = FGT_TLBIRVAAE1IS,
232
.writefn = tlbi_aa64_rvae1is_write },
233
{ .name = "TLBI_RVALE1IS", .state = ARM_CP_STATE_AA64,
234
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 5,
235
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
236
+ .access = PL1_W, .accessfn = access_ttlbis,
237
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
238
.fgt = FGT_TLBIRVALE1IS,
239
.writefn = tlbi_aa64_rvae1is_write },
240
{ .name = "TLBI_RVAALE1IS", .state = ARM_CP_STATE_AA64,
241
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 7,
242
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
243
+ .access = PL1_W, .accessfn = access_ttlbis,
244
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
245
.fgt = FGT_TLBIRVAALE1IS,
246
.writefn = tlbi_aa64_rvae1is_write },
247
{ .name = "TLBI_RVAE1OS", .state = ARM_CP_STATE_AA64,
248
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
249
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
250
+ .access = PL1_W, .accessfn = access_ttlbos,
251
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
252
.fgt = FGT_TLBIRVAE1OS,
253
.writefn = tlbi_aa64_rvae1is_write },
254
{ .name = "TLBI_RVAAE1OS", .state = ARM_CP_STATE_AA64,
255
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 3,
256
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
257
+ .access = PL1_W, .accessfn = access_ttlbos,
258
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
259
.fgt = FGT_TLBIRVAAE1OS,
260
.writefn = tlbi_aa64_rvae1is_write },
261
{ .name = "TLBI_RVALE1OS", .state = ARM_CP_STATE_AA64,
262
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 5,
263
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
264
+ .access = PL1_W, .accessfn = access_ttlbos,
265
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
266
.fgt = FGT_TLBIRVALE1OS,
267
.writefn = tlbi_aa64_rvae1is_write },
268
{ .name = "TLBI_RVAALE1OS", .state = ARM_CP_STATE_AA64,
269
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 7,
270
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
271
+ .access = PL1_W, .accessfn = access_ttlbos,
272
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
273
.fgt = FGT_TLBIRVAALE1OS,
274
.writefn = tlbi_aa64_rvae1is_write },
275
{ .name = "TLBI_RVAE1", .state = ARM_CP_STATE_AA64,
276
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
277
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
278
+ .access = PL1_W, .accessfn = access_ttlb,
279
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
280
.fgt = FGT_TLBIRVAE1,
281
.writefn = tlbi_aa64_rvae1_write },
282
{ .name = "TLBI_RVAAE1", .state = ARM_CP_STATE_AA64,
283
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 3,
284
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
285
+ .access = PL1_W, .accessfn = access_ttlb,
286
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
287
.fgt = FGT_TLBIRVAAE1,
288
.writefn = tlbi_aa64_rvae1_write },
289
{ .name = "TLBI_RVALE1", .state = ARM_CP_STATE_AA64,
290
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 5,
291
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
292
+ .access = PL1_W, .accessfn = access_ttlb,
293
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
294
.fgt = FGT_TLBIRVALE1,
295
.writefn = tlbi_aa64_rvae1_write },
296
{ .name = "TLBI_RVAALE1", .state = ARM_CP_STATE_AA64,
297
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 7,
298
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
299
+ .access = PL1_W, .accessfn = access_ttlb,
300
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
301
.fgt = FGT_TLBIRVAALE1,
302
.writefn = tlbi_aa64_rvae1_write },
303
{ .name = "TLBI_RIPAS2E1IS", .state = ARM_CP_STATE_AA64,
304
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 2,
305
- .access = PL2_W, .type = ARM_CP_NO_RAW,
306
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
307
.writefn = tlbi_aa64_ripas2e1is_write },
308
{ .name = "TLBI_RIPAS2LE1IS", .state = ARM_CP_STATE_AA64,
309
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 6,
310
- .access = PL2_W, .type = ARM_CP_NO_RAW,
311
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
312
.writefn = tlbi_aa64_ripas2e1is_write },
313
{ .name = "TLBI_RVAE2IS", .state = ARM_CP_STATE_AA64,
314
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 1,
315
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
316
+ .access = PL2_W,
317
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
318
.writefn = tlbi_aa64_rvae2is_write },
319
{ .name = "TLBI_RVALE2IS", .state = ARM_CP_STATE_AA64,
320
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 5,
321
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
322
+ .access = PL2_W,
323
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
324
.writefn = tlbi_aa64_rvae2is_write },
325
{ .name = "TLBI_RIPAS2E1", .state = ARM_CP_STATE_AA64,
326
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 2,
327
- .access = PL2_W, .type = ARM_CP_NO_RAW,
328
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
329
.writefn = tlbi_aa64_ripas2e1_write },
330
{ .name = "TLBI_RIPAS2LE1", .state = ARM_CP_STATE_AA64,
331
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 6,
332
- .access = PL2_W, .type = ARM_CP_NO_RAW,
333
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
334
.writefn = tlbi_aa64_ripas2e1_write },
335
{ .name = "TLBI_RVAE2OS", .state = ARM_CP_STATE_AA64,
336
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 1,
337
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
338
+ .access = PL2_W,
339
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
340
.writefn = tlbi_aa64_rvae2is_write },
341
{ .name = "TLBI_RVALE2OS", .state = ARM_CP_STATE_AA64,
342
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 5,
343
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
344
+ .access = PL2_W,
345
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
346
.writefn = tlbi_aa64_rvae2is_write },
347
{ .name = "TLBI_RVAE2", .state = ARM_CP_STATE_AA64,
348
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 1,
349
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
350
+ .access = PL2_W,
351
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
352
.writefn = tlbi_aa64_rvae2_write },
353
{ .name = "TLBI_RVALE2", .state = ARM_CP_STATE_AA64,
354
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 5,
355
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
356
+ .access = PL2_W,
357
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
358
.writefn = tlbi_aa64_rvae2_write },
359
{ .name = "TLBI_RVAE3IS", .state = ARM_CP_STATE_AA64,
360
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 1,
361
- .access = PL3_W, .type = ARM_CP_NO_RAW,
362
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
363
.writefn = tlbi_aa64_rvae3is_write },
364
{ .name = "TLBI_RVALE3IS", .state = ARM_CP_STATE_AA64,
365
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 5,
366
- .access = PL3_W, .type = ARM_CP_NO_RAW,
367
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
368
.writefn = tlbi_aa64_rvae3is_write },
369
{ .name = "TLBI_RVAE3OS", .state = ARM_CP_STATE_AA64,
370
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 1,
371
- .access = PL3_W, .type = ARM_CP_NO_RAW,
372
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
373
.writefn = tlbi_aa64_rvae3is_write },
374
{ .name = "TLBI_RVALE3OS", .state = ARM_CP_STATE_AA64,
375
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 5,
376
- .access = PL3_W, .type = ARM_CP_NO_RAW,
377
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
378
.writefn = tlbi_aa64_rvae3is_write },
379
{ .name = "TLBI_RVAE3", .state = ARM_CP_STATE_AA64,
380
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 1,
381
- .access = PL3_W, .type = ARM_CP_NO_RAW,
382
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
383
.writefn = tlbi_aa64_rvae3_write },
384
{ .name = "TLBI_RVALE3", .state = ARM_CP_STATE_AA64,
385
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 5,
386
- .access = PL3_W, .type = ARM_CP_NO_RAW,
387
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
388
.writefn = tlbi_aa64_rvae3_write },
389
};
390
391
static const ARMCPRegInfo tlbios_reginfo[] = {
392
{ .name = "TLBI_VMALLE1OS", .state = ARM_CP_STATE_AA64,
393
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 0,
394
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
395
+ .access = PL1_W, .accessfn = access_ttlbos,
396
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
397
.fgt = FGT_TLBIVMALLE1OS,
398
.writefn = tlbi_aa64_vmalle1is_write },
399
{ .name = "TLBI_VAE1OS", .state = ARM_CP_STATE_AA64,
400
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 1,
401
.fgt = FGT_TLBIVAE1OS,
402
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
403
+ .access = PL1_W, .accessfn = access_ttlbos,
404
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
405
.writefn = tlbi_aa64_vae1is_write },
406
{ .name = "TLBI_ASIDE1OS", .state = ARM_CP_STATE_AA64,
407
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 2,
408
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
409
+ .access = PL1_W, .accessfn = access_ttlbos,
410
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
411
.fgt = FGT_TLBIASIDE1OS,
412
.writefn = tlbi_aa64_vmalle1is_write },
413
{ .name = "TLBI_VAAE1OS", .state = ARM_CP_STATE_AA64,
414
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 3,
415
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
416
+ .access = PL1_W, .accessfn = access_ttlbos,
417
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
418
.fgt = FGT_TLBIVAAE1OS,
419
.writefn = tlbi_aa64_vae1is_write },
420
{ .name = "TLBI_VALE1OS", .state = ARM_CP_STATE_AA64,
421
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 5,
422
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
423
+ .access = PL1_W, .accessfn = access_ttlbos,
424
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
425
.fgt = FGT_TLBIVALE1OS,
426
.writefn = tlbi_aa64_vae1is_write },
427
{ .name = "TLBI_VAALE1OS", .state = ARM_CP_STATE_AA64,
428
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 7,
429
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
430
+ .access = PL1_W, .accessfn = access_ttlbos,
431
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
432
.fgt = FGT_TLBIVAALE1OS,
433
.writefn = tlbi_aa64_vae1is_write },
434
{ .name = "TLBI_ALLE2OS", .state = ARM_CP_STATE_AA64,
435
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 0,
436
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
437
+ .access = PL2_W,
438
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
439
.writefn = tlbi_aa64_alle2is_write },
440
{ .name = "TLBI_VAE2OS", .state = ARM_CP_STATE_AA64,
441
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 1,
442
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
443
+ .access = PL2_W,
444
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
445
.writefn = tlbi_aa64_vae2is_write },
446
{ .name = "TLBI_ALLE1OS", .state = ARM_CP_STATE_AA64,
447
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 4,
448
- .access = PL2_W, .type = ARM_CP_NO_RAW,
449
+ .access = PL2_W,
450
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
451
.writefn = tlbi_aa64_alle1is_write },
452
{ .name = "TLBI_VALE2OS", .state = ARM_CP_STATE_AA64,
453
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 5,
454
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
455
+ .access = PL2_W,
456
+ .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS | ARM_CP_EL3_NO_EL2_UNDEF,
457
.writefn = tlbi_aa64_vae2is_write },
458
{ .name = "TLBI_VMALLS12E1OS", .state = ARM_CP_STATE_AA64,
459
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 6,
460
- .access = PL2_W, .type = ARM_CP_NO_RAW,
461
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
462
.writefn = tlbi_aa64_alle1is_write },
463
{ .name = "TLBI_IPAS2E1OS", .state = ARM_CP_STATE_AA64,
464
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 0,
465
- .access = PL2_W, .type = ARM_CP_NOP },
466
+ .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
467
{ .name = "TLBI_RIPAS2E1OS", .state = ARM_CP_STATE_AA64,
468
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 3,
469
- .access = PL2_W, .type = ARM_CP_NOP },
470
+ .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
471
{ .name = "TLBI_IPAS2LE1OS", .state = ARM_CP_STATE_AA64,
472
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 4,
473
- .access = PL2_W, .type = ARM_CP_NOP },
474
+ .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
475
{ .name = "TLBI_RIPAS2LE1OS", .state = ARM_CP_STATE_AA64,
476
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 7,
477
- .access = PL2_W, .type = ARM_CP_NOP },
478
+ .access = PL2_W, .type = ARM_CP_NOP | ARM_CP_ADD_TLBI_NXS },
479
{ .name = "TLBI_ALLE3OS", .state = ARM_CP_STATE_AA64,
480
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 0,
481
- .access = PL3_W, .type = ARM_CP_NO_RAW,
482
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
483
.writefn = tlbi_aa64_alle3is_write },
484
{ .name = "TLBI_VAE3OS", .state = ARM_CP_STATE_AA64,
485
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 1,
486
- .access = PL3_W, .type = ARM_CP_NO_RAW,
487
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
488
.writefn = tlbi_aa64_vae3is_write },
489
{ .name = "TLBI_VALE3OS", .state = ARM_CP_STATE_AA64,
490
.opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 5,
491
- .access = PL3_W, .type = ARM_CP_NO_RAW,
492
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_ADD_TLBI_NXS,
493
.writefn = tlbi_aa64_vae3is_write },
494
};
99
495
100
--
496
--
101
2.20.1
497
2.34.1
102
103
diff view generated by jsdifflib
1
From: Julia Suvorova <jusual@mail.ru>
1
From: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
2
2
3
Run qtest with a socket that connects QEMU chardev and test code.
3
The DSB nXS variant is always both a reads and writes request type.
4
Ignore the domain field like we do in plain DSB and perform a full
5
system barrier operation.
4
6
5
Signed-off-by: Julia Suvorova <jusual@mail.ru>
7
The DSB nXS variant is part of FEAT_XS made mandatory from Armv8.7.
6
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
8
7
Reviewed-by: Thomas Huth <thuth@redhat.com>
9
Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20190123120759.7162-2-jusual@mail.ru
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20241211144440.2700268-5-peter.maydell@linaro.org
13
[PMM: added missing "UNDEF unless feature present" check]
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
15
---
12
tests/libqtest.h | 11 +++++++++++
16
target/arm/tcg/a64.decode | 3 +++
13
tests/libqtest.c | 25 +++++++++++++++++++++++++
17
target/arm/tcg/translate-a64.c | 9 +++++++++
14
2 files changed, 36 insertions(+)
18
2 files changed, 12 insertions(+)
15
19
16
diff --git a/tests/libqtest.h b/tests/libqtest.h
20
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
17
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
18
--- a/tests/libqtest.h
22
--- a/target/arm/tcg/a64.decode
19
+++ b/tests/libqtest.h
23
+++ b/target/arm/tcg/a64.decode
20
@@ -XXX,XX +XXX,XX @@ QTestState *qtest_init(const char *extra_args);
24
@@ -XXX,XX +XXX,XX @@ WFIT 1101 0101 0000 0011 0001 0000 001 rd:5
21
*/
25
22
QTestState *qtest_init_without_qmp_handshake(const char *extra_args);
26
CLREX 1101 0101 0000 0011 0011 ---- 010 11111
23
27
DSB_DMB 1101 0101 0000 0011 0011 domain:2 types:2 10- 11111
24
+/**
28
+# For the DSB nXS variant, types always equals MBReqTypes_All and we ignore the
25
+ * qtest_init_with_serial:
29
+# domain bits.
26
+ * @extra_args: other arguments to pass to QEMU. CAUTION: these
30
+DSB_nXS 1101 0101 0000 0011 0011 -- 10 001 11111
27
+ * arguments are subject to word splitting and shell evaluation.
31
ISB 1101 0101 0000 0011 0011 ---- 110 11111
28
+ * @sock_fd: pointer to store the socket file descriptor for
32
SB 1101 0101 0000 0011 0011 0000 111 11111
29
+ * connection with serial.
33
30
+ *
34
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
31
+ * Returns: #QTestState instance.
32
+ */
33
+QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd);
34
+
35
/**
36
* qtest_quit:
37
* @s: #QTestState instance to operate on.
38
diff --git a/tests/libqtest.c b/tests/libqtest.c
39
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
40
--- a/tests/libqtest.c
36
--- a/target/arm/tcg/translate-a64.c
41
+++ b/tests/libqtest.c
37
+++ b/target/arm/tcg/translate-a64.c
42
@@ -XXX,XX +XXX,XX @@ QTestState *qtest_initf(const char *fmt, ...)
38
@@ -XXX,XX +XXX,XX @@ static bool trans_DSB_DMB(DisasContext *s, arg_DSB_DMB *a)
43
return s;
39
return true;
44
}
40
}
45
41
46
+QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd)
42
+static bool trans_DSB_nXS(DisasContext *s, arg_DSB_nXS *a)
47
+{
43
+{
48
+ int sock_fd_init;
44
+ if (!dc_isar_feature(aa64_xs, s)) {
49
+ char *sock_path, sock_dir[] = "/tmp/qtest-serial-XXXXXX";
45
+ return false;
50
+ QTestState *qts;
46
+ }
51
+
47
+ tcg_gen_mb(TCG_BAR_SC | TCG_MO_ALL);
52
+ g_assert_true(mkdtemp(sock_dir) != NULL);
48
+ return true;
53
+ sock_path = g_strdup_printf("%s/sock", sock_dir);
54
+
55
+ sock_fd_init = init_socket(sock_path);
56
+
57
+ qts = qtest_initf("-chardev socket,id=s0,path=%s -serial chardev:s0 %s",
58
+ sock_path, extra_args);
59
+
60
+ *sock_fd = socket_accept(sock_fd_init);
61
+
62
+ unlink(sock_path);
63
+ g_free(sock_path);
64
+ rmdir(sock_dir);
65
+
66
+ g_assert_true(*sock_fd >= 0);
67
+
68
+ return qts;
69
+}
49
+}
70
+
50
+
71
void qtest_quit(QTestState *s)
51
static bool trans_ISB(DisasContext *s, arg_ISB *a)
72
{
52
{
73
g_hook_destroy_link(&abrt_hooks, g_hook_find_data(&abrt_hooks, TRUE, s));
53
/*
74
--
54
--
75
2.20.1
55
2.34.1
76
77
diff view generated by jsdifflib
1
Include the cluster number in the hash we use to look
1
From: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
2
up TBs. This is important because a TB that is valid
3
for one cluster at a given physical address and set
4
of CPU flags is not necessarily valid for another:
5
the two clusters may have different views of physical
6
memory, or may have different CPU features (eg FPU
7
present or absent).
8
2
9
We put the cluster number in the high 8 bits of the
3
Add FEAT_XS feature report value in max cpu's ID_AA64ISAR1 sys register.
10
TB cflags. This gives us up to 256 clusters, which should
11
be enough for anybody. If we ever need more, or need
12
more bits in cflags for other purposes, we could make
13
tb_hash_func() take more data (and expand qemu_xxhash7()
14
to qemu_xxhash8()).
15
4
5
Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20241211144440.2700268-6-peter.maydell@linaro.org
19
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
[PMM: Add entry for FEAT_XS to documentation]
20
Message-id: 20190121152218.9592-4-peter.maydell@linaro.org
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
---
11
---
22
include/exec/exec-all.h | 4 +++-
12
docs/system/arm/emulation.rst | 1 +
23
accel/tcg/cpu-exec.c | 3 +++
13
target/arm/tcg/cpu64.c | 1 +
24
accel/tcg/translate-all.c | 3 +++
14
2 files changed, 2 insertions(+)
25
3 files changed, 9 insertions(+), 1 deletion(-)
26
15
27
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
16
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
28
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
29
--- a/include/exec/exec-all.h
18
--- a/docs/system/arm/emulation.rst
30
+++ b/include/exec/exec-all.h
19
+++ b/docs/system/arm/emulation.rst
31
@@ -XXX,XX +XXX,XX @@ struct TranslationBlock {
20
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
32
#define CF_USE_ICOUNT 0x00020000
21
- FEAT_VMID16 (16-bit VMID)
33
#define CF_INVALID 0x00040000 /* TB is stale. Set with @jmp_lock held */
22
- FEAT_WFxT (WFE and WFI instructions with timeout)
34
#define CF_PARALLEL 0x00080000 /* Generate code for a parallel context */
23
- FEAT_XNX (Translation table stage 2 Unprivileged Execute-never)
35
+#define CF_CLUSTER_MASK 0xff000000 /* Top 8 bits are cluster ID */
24
+- FEAT_XS (XS attribute)
36
+#define CF_CLUSTER_SHIFT 24
25
37
/* cflags' mask for hashing/comparison */
26
For information on the specifics of these extensions, please refer
38
#define CF_HASH_MASK \
27
to the `Arm Architecture Reference Manual for A-profile architecture
39
- (CF_COUNT_MASK | CF_LAST_IO | CF_USE_ICOUNT | CF_PARALLEL)
28
diff --git a/target/arm/tcg/cpu64.c b/target/arm/tcg/cpu64.c
40
+ (CF_COUNT_MASK | CF_LAST_IO | CF_USE_ICOUNT | CF_PARALLEL | CF_CLUSTER_MASK)
41
42
/* Per-vCPU dynamic tracing state used to generate this TB */
43
uint32_t trace_vcpu_dstate;
44
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
45
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
46
--- a/accel/tcg/cpu-exec.c
30
--- a/target/arm/tcg/cpu64.c
47
+++ b/accel/tcg/cpu-exec.c
31
+++ b/target/arm/tcg/cpu64.c
48
@@ -XXX,XX +XXX,XX @@ TranslationBlock *tb_htable_lookup(CPUState *cpu, target_ulong pc,
32
@@ -XXX,XX +XXX,XX @@ void aarch64_max_tcg_initfn(Object *obj)
49
struct tb_desc desc;
33
t = FIELD_DP64(t, ID_AA64ISAR1, BF16, 2); /* FEAT_BF16, FEAT_EBF16 */
50
uint32_t h;
34
t = FIELD_DP64(t, ID_AA64ISAR1, DGH, 1); /* FEAT_DGH */
51
35
t = FIELD_DP64(t, ID_AA64ISAR1, I8MM, 1); /* FEAT_I8MM */
52
+ cf_mask &= ~CF_CLUSTER_MASK;
36
+ t = FIELD_DP64(t, ID_AA64ISAR1, XS, 1); /* FEAT_XS */
53
+ cf_mask |= cpu->cluster_index << CF_CLUSTER_SHIFT;
37
cpu->isar.id_aa64isar1 = t;
54
+
38
55
desc.env = (CPUArchState *)cpu->env_ptr;
39
t = cpu->isar.id_aa64isar2;
56
desc.cs_base = cs_base;
57
desc.flags = flags;
58
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
59
index XXXXXXX..XXXXXXX 100644
60
--- a/accel/tcg/translate-all.c
61
+++ b/accel/tcg/translate-all.c
62
@@ -XXX,XX +XXX,XX @@ TranslationBlock *tb_gen_code(CPUState *cpu,
63
cflags |= CF_NOCACHE | 1;
64
}
65
66
+ cflags &= ~CF_CLUSTER_MASK;
67
+ cflags |= cpu->cluster_index << CF_CLUSTER_SHIFT;
68
+
69
buffer_overflow:
70
tb = tb_alloc(pc);
71
if (unlikely(!tb)) {
72
--
40
--
73
2.20.1
41
2.34.1
74
75
diff view generated by jsdifflib
1
From: Steffen Görtz <contrib@steffen-goertz.de>
1
From: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
2
2
3
The nRF51 contains three regions of non-volatile memory (NVM):
3
Add system test to make sure FEAT_XS is enabled for max cpu emulation
4
- CODE (R/W): contains code
4
and that QEMU doesn't crash when encountering an NXS instruction
5
- FICR (R): Factory information like code size, chip id etc.
5
variant.
6
- UICR (R/W): Changeable configuration data. Lock bits, Code
7
protection configuration, Bootloader address, Nordic SoftRadio
8
configuration, Firmware configuration.
9
6
10
Read and write access to the memories is managed by the
7
Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
11
Non-volatile memory controller.
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
9
Message-id: 20241211144440.2700268-7-peter.maydell@linaro.org
13
Memory schema:
10
[PMM: In ISAR field test, mask with 0xf, not 0xff; use < rather
14
[ CPU ] -+- [ NVM, either FICR, UICR or CODE ]
11
than an equality test to follow the standard ID register field
15
| |
12
check guidelines]
16
\- [ NVMC ]
17
18
Signed-off-by: Steffen Görtz <contrib@steffen-goertz.de>
19
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
20
Message-id: 20190123212234.32068-4-stefanha@redhat.com
21
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
---
14
---
24
hw/nvram/Makefile.objs | 1 +
15
tests/tcg/aarch64/system/feat-xs.c | 27 +++++++++++++++++++++++++++
25
include/hw/nvram/nrf51_nvm.h | 64 ++++++
16
1 file changed, 27 insertions(+)
26
hw/nvram/nrf51_nvm.c | 381 +++++++++++++++++++++++++++++++++++
17
create mode 100644 tests/tcg/aarch64/system/feat-xs.c
27
3 files changed, 446 insertions(+)
28
create mode 100644 include/hw/nvram/nrf51_nvm.h
29
create mode 100644 hw/nvram/nrf51_nvm.c
30
18
31
diff --git a/hw/nvram/Makefile.objs b/hw/nvram/Makefile.objs
19
diff --git a/tests/tcg/aarch64/system/feat-xs.c b/tests/tcg/aarch64/system/feat-xs.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/nvram/Makefile.objs
34
+++ b/hw/nvram/Makefile.objs
35
@@ -XXX,XX +XXX,XX @@ common-obj-y += fw_cfg.o
36
common-obj-y += chrp_nvram.o
37
common-obj-$(CONFIG_MAC_NVRAM) += mac_nvram.o
38
obj-$(CONFIG_PSERIES) += spapr_nvram.o
39
+obj-$(CONFIG_NRF51_SOC) += nrf51_nvm.o
40
diff --git a/include/hw/nvram/nrf51_nvm.h b/include/hw/nvram/nrf51_nvm.h
41
new file mode 100644
20
new file mode 100644
42
index XXXXXXX..XXXXXXX
21
index XXXXXXX..XXXXXXX
43
--- /dev/null
22
--- /dev/null
44
+++ b/include/hw/nvram/nrf51_nvm.h
23
+++ b/tests/tcg/aarch64/system/feat-xs.c
45
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@
46
+/*
25
+/*
47
+ * Nordic Semiconductor nRF51 non-volatile memory
26
+ * FEAT_XS Test
48
+ *
27
+ *
49
+ * It provides an interface to erase regions in flash memory.
28
+ * Copyright (c) 2024 Linaro Ltd
50
+ * Furthermore it provides the user and factory information registers.
51
+ *
29
+ *
52
+ * QEMU interface:
30
+ * SPDX-License-Identifier: GPL-2.0-or-later
53
+ * + sysbus MMIO regions 0: NVMC peripheral registers
54
+ * + sysbus MMIO regions 1: FICR peripheral registers
55
+ * + sysbus MMIO regions 2: UICR peripheral registers
56
+ * + flash-size property: flash size in bytes.
57
+ *
58
+ * Accuracy of the peripheral model:
59
+ * + Code regions (MPU configuration) are disregarded.
60
+ *
61
+ * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de>
62
+ *
63
+ * This code is licensed under the GPL version 2 or later. See
64
+ * the COPYING file in the top-level directory.
65
+ *
66
+ */
67
+#ifndef NRF51_NVM_H
68
+#define NRF51_NVM_H
69
+
70
+#include "hw/sysbus.h"
71
+#define TYPE_NRF51_NVM "nrf51_soc.nvm"
72
+#define NRF51_NVM(obj) OBJECT_CHECK(NRF51NVMState, (obj), TYPE_NRF51_NVM)
73
+
74
+#define NRF51_UICR_FIXTURE_SIZE 64
75
+
76
+#define NRF51_NVMC_SIZE 0x1000
77
+
78
+#define NRF51_NVMC_READY 0x400
79
+#define NRF51_NVMC_READY_READY 0x01
80
+#define NRF51_NVMC_CONFIG 0x504
81
+#define NRF51_NVMC_CONFIG_MASK 0x03
82
+#define NRF51_NVMC_CONFIG_WEN 0x01
83
+#define NRF51_NVMC_CONFIG_EEN 0x02
84
+#define NRF51_NVMC_ERASEPCR1 0x508
85
+#define NRF51_NVMC_ERASEPCR0 0x510
86
+#define NRF51_NVMC_ERASEALL 0x50C
87
+#define NRF51_NVMC_ERASEUICR 0x514
88
+#define NRF51_NVMC_ERASE 0x01
89
+
90
+#define NRF51_UICR_SIZE 0x100
91
+
92
+typedef struct NRF51NVMState {
93
+ SysBusDevice parent_obj;
94
+
95
+ MemoryRegion mmio;
96
+ MemoryRegion ficr;
97
+ MemoryRegion uicr;
98
+ MemoryRegion flash;
99
+
100
+ uint32_t uicr_content[NRF51_UICR_FIXTURE_SIZE];
101
+ uint32_t flash_size;
102
+ uint32_t *storage;
103
+
104
+ uint32_t config;
105
+
106
+} NRF51NVMState;
107
+
108
+
109
+#endif
110
diff --git a/hw/nvram/nrf51_nvm.c b/hw/nvram/nrf51_nvm.c
111
new file mode 100644
112
index XXXXXXX..XXXXXXX
113
--- /dev/null
114
+++ b/hw/nvram/nrf51_nvm.c
115
@@ -XXX,XX +XXX,XX @@
116
+/*
117
+ * Nordic Semiconductor nRF51 non-volatile memory
118
+ *
119
+ * It provides an interface to erase regions in flash memory.
120
+ * Furthermore it provides the user and factory information registers.
121
+ *
122
+ * Reference Manual: http://infocenter.nordicsemi.com/pdf/nRF51_RM_v3.0.pdf
123
+ *
124
+ * See nRF51 reference manual and product sheet sections:
125
+ * + Non-Volatile Memory Controller (NVMC)
126
+ * + Factory Information Configuration Registers (FICR)
127
+ * + User Information Configuration Registers (UICR)
128
+ *
129
+ * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de>
130
+ *
131
+ * This code is licensed under the GPL version 2 or later. See
132
+ * the COPYING file in the top-level directory.
133
+ */
31
+ */
134
+
32
+
135
+#include "qemu/osdep.h"
33
+#include <minilib.h>
136
+#include "qapi/error.h"
34
+#include <stdint.h>
137
+#include "qemu/log.h"
138
+#include "exec/address-spaces.h"
139
+#include "hw/arm/nrf51.h"
140
+#include "hw/nvram/nrf51_nvm.h"
141
+
35
+
142
+/*
36
+int main(void)
143
+ * FICR Registers Assignments
37
+{
144
+ * CODEPAGESIZE 0x010
38
+ uint64_t isar1;
145
+ * CODESIZE 0x014
146
+ * CLENR0 0x028
147
+ * PPFC 0x02C
148
+ * NUMRAMBLOCK 0x034
149
+ * SIZERAMBLOCKS 0x038
150
+ * SIZERAMBLOCK[0] 0x038
151
+ * SIZERAMBLOCK[1] 0x03C
152
+ * SIZERAMBLOCK[2] 0x040
153
+ * SIZERAMBLOCK[3] 0x044
154
+ * CONFIGID 0x05C
155
+ * DEVICEID[0] 0x060
156
+ * DEVICEID[1] 0x064
157
+ * ER[0] 0x080
158
+ * ER[1] 0x084
159
+ * ER[2] 0x088
160
+ * ER[3] 0x08C
161
+ * IR[0] 0x090
162
+ * IR[1] 0x094
163
+ * IR[2] 0x098
164
+ * IR[3] 0x09C
165
+ * DEVICEADDRTYPE 0x0A0
166
+ * DEVICEADDR[0] 0x0A4
167
+ * DEVICEADDR[1] 0x0A8
168
+ * OVERRIDEEN 0x0AC
169
+ * NRF_1MBIT[0] 0x0B0
170
+ * NRF_1MBIT[1] 0x0B4
171
+ * NRF_1MBIT[2] 0x0B8
172
+ * NRF_1MBIT[3] 0x0BC
173
+ * NRF_1MBIT[4] 0x0C0
174
+ * BLE_1MBIT[0] 0x0EC
175
+ * BLE_1MBIT[1] 0x0F0
176
+ * BLE_1MBIT[2] 0x0F4
177
+ * BLE_1MBIT[3] 0x0F8
178
+ * BLE_1MBIT[4] 0x0FC
179
+ */
180
+static const uint32_t ficr_content[64] = {
181
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000400,
182
+ 0x00000100, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000002, 0x00002000,
183
+ 0x00002000, 0x00002000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
184
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
185
+ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000003,
186
+ 0x12345678, 0x9ABCDEF1, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
187
+ 0xFFFFFFFF, 0xFFFFFFFF, 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
194
+};
195
+
39
+
196
+static uint64_t ficr_read(void *opaque, hwaddr offset, unsigned int size)
40
+ asm volatile ("mrs %0, id_aa64isar1_el1" : "=r"(isar1));
197
+{
41
+ if (((isar1 >> 56) & 0xf) < 1) {
198
+ assert(offset < sizeof(ficr_content));
42
+ ml_printf("FEAT_XS not supported by CPU");
199
+ return ficr_content[offset / 4];
43
+ return 1;
44
+ }
45
+ /* VMALLE1NXS */
46
+ asm volatile (".inst 0xd508971f");
47
+ /* VMALLE1OSNXS */
48
+ asm volatile (".inst 0xd508911f");
49
+
50
+ return 0;
200
+}
51
+}
201
+
202
+static void ficr_write(void *opaque, hwaddr offset, uint64_t value,
203
+ unsigned int size)
204
+{
205
+ /* Intentionally do nothing */
206
+}
207
+
208
+static const MemoryRegionOps ficr_ops = {
209
+ .read = ficr_read,
210
+ .write = ficr_write,
211
+ .impl.min_access_size = 4,
212
+ .impl.max_access_size = 4,
213
+ .endianness = DEVICE_LITTLE_ENDIAN
214
+};
215
+
216
+/*
217
+ * UICR Registers Assignments
218
+ * CLENR0 0x000
219
+ * RBPCONF 0x004
220
+ * XTALFREQ 0x008
221
+ * FWID 0x010
222
+ * BOOTLOADERADDR 0x014
223
+ * NRFFW[0] 0x014
224
+ * NRFFW[1] 0x018
225
+ * NRFFW[2] 0x01C
226
+ * NRFFW[3] 0x020
227
+ * NRFFW[4] 0x024
228
+ * NRFFW[5] 0x028
229
+ * NRFFW[6] 0x02C
230
+ * NRFFW[7] 0x030
231
+ * NRFFW[8] 0x034
232
+ * NRFFW[9] 0x038
233
+ * NRFFW[10] 0x03C
234
+ * NRFFW[11] 0x040
235
+ * NRFFW[12] 0x044
236
+ * NRFFW[13] 0x048
237
+ * NRFFW[14] 0x04C
238
+ * NRFHW[0] 0x050
239
+ * NRFHW[1] 0x054
240
+ * NRFHW[2] 0x058
241
+ * NRFHW[3] 0x05C
242
+ * NRFHW[4] 0x060
243
+ * NRFHW[5] 0x064
244
+ * NRFHW[6] 0x068
245
+ * NRFHW[7] 0x06C
246
+ * NRFHW[8] 0x070
247
+ * NRFHW[9] 0x074
248
+ * NRFHW[10] 0x078
249
+ * NRFHW[11] 0x07C
250
+ * CUSTOMER[0] 0x080
251
+ * CUSTOMER[1] 0x084
252
+ * CUSTOMER[2] 0x088
253
+ * CUSTOMER[3] 0x08C
254
+ * CUSTOMER[4] 0x090
255
+ * CUSTOMER[5] 0x094
256
+ * CUSTOMER[6] 0x098
257
+ * CUSTOMER[7] 0x09C
258
+ * CUSTOMER[8] 0x0A0
259
+ * CUSTOMER[9] 0x0A4
260
+ * CUSTOMER[10] 0x0A8
261
+ * CUSTOMER[11] 0x0AC
262
+ * CUSTOMER[12] 0x0B0
263
+ * CUSTOMER[13] 0x0B4
264
+ * CUSTOMER[14] 0x0B8
265
+ * CUSTOMER[15] 0x0BC
266
+ * CUSTOMER[16] 0x0C0
267
+ * CUSTOMER[17] 0x0C4
268
+ * CUSTOMER[18] 0x0C8
269
+ * CUSTOMER[19] 0x0CC
270
+ * CUSTOMER[20] 0x0D0
271
+ * CUSTOMER[21] 0x0D4
272
+ * CUSTOMER[22] 0x0D8
273
+ * CUSTOMER[23] 0x0DC
274
+ * CUSTOMER[24] 0x0E0
275
+ * CUSTOMER[25] 0x0E4
276
+ * CUSTOMER[26] 0x0E8
277
+ * CUSTOMER[27] 0x0EC
278
+ * CUSTOMER[28] 0x0F0
279
+ * CUSTOMER[29] 0x0F4
280
+ * CUSTOMER[30] 0x0F8
281
+ * CUSTOMER[31] 0x0FC
282
+ */
283
+
284
+static uint64_t uicr_read(void *opaque, hwaddr offset, unsigned int size)
285
+{
286
+ NRF51NVMState *s = NRF51_NVM(opaque);
287
+
288
+ assert(offset < sizeof(s->uicr_content));
289
+ return s->uicr_content[offset / 4];
290
+}
291
+
292
+static void uicr_write(void *opaque, hwaddr offset, uint64_t value,
293
+ unsigned int size)
294
+{
295
+ NRF51NVMState *s = NRF51_NVM(opaque);
296
+
297
+ assert(offset < sizeof(s->uicr_content));
298
+ s->uicr_content[offset / 4] = value;
299
+}
300
+
301
+static const MemoryRegionOps uicr_ops = {
302
+ .read = uicr_read,
303
+ .write = uicr_write,
304
+ .impl.min_access_size = 4,
305
+ .impl.max_access_size = 4,
306
+ .endianness = DEVICE_LITTLE_ENDIAN
307
+};
308
+
309
+
310
+static uint64_t io_read(void *opaque, hwaddr offset, unsigned int size)
311
+{
312
+ NRF51NVMState *s = NRF51_NVM(opaque);
313
+ uint64_t r = 0;
314
+
315
+ switch (offset) {
316
+ case NRF51_NVMC_READY:
317
+ r = NRF51_NVMC_READY_READY;
318
+ break;
319
+ case NRF51_NVMC_CONFIG:
320
+ r = s->config;
321
+ break;
322
+ default:
323
+ qemu_log_mask(LOG_GUEST_ERROR,
324
+ "%s: bad read offset 0x%" HWADDR_PRIx "\n", __func__, offset);
325
+ break;
326
+ }
327
+
328
+ return r;
329
+}
330
+
331
+static void io_write(void *opaque, hwaddr offset, uint64_t value,
332
+ unsigned int size)
333
+{
334
+ NRF51NVMState *s = NRF51_NVM(opaque);
335
+
336
+ switch (offset) {
337
+ case NRF51_NVMC_CONFIG:
338
+ s->config = value & NRF51_NVMC_CONFIG_MASK;
339
+ break;
340
+ case NRF51_NVMC_ERASEPCR0:
341
+ case NRF51_NVMC_ERASEPCR1:
342
+ if (s->config & NRF51_NVMC_CONFIG_EEN) {
343
+ /* Mask in-page sub address */
344
+ value &= ~(NRF51_PAGE_SIZE - 1);
345
+ if (value < (s->flash_size - NRF51_PAGE_SIZE)) {
346
+ memset(s->storage + value / 4, 0xFF, NRF51_PAGE_SIZE);
347
+ memory_region_flush_rom_device(&s->flash, value,
348
+ NRF51_PAGE_SIZE);
349
+ }
350
+ } else {
351
+ qemu_log_mask(LOG_GUEST_ERROR,
352
+ "%s: Flash erase at 0x%" HWADDR_PRIx" while flash not erasable.\n",
353
+ __func__, offset);
354
+ }
355
+ break;
356
+ case NRF51_NVMC_ERASEALL:
357
+ if (value == NRF51_NVMC_ERASE) {
358
+ if (s->config & NRF51_NVMC_CONFIG_EEN) {
359
+ memset(s->storage, 0xFF, s->flash_size);
360
+ memory_region_flush_rom_device(&s->flash, 0, s->flash_size);
361
+ memset(s->uicr_content, 0xFF, sizeof(s->uicr_content));
362
+ } else {
363
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash not erasable.\n",
364
+ __func__);
365
+ }
366
+ }
367
+ break;
368
+ case NRF51_NVMC_ERASEUICR:
369
+ if (value == NRF51_NVMC_ERASE) {
370
+ memset(s->uicr_content, 0xFF, sizeof(s->uicr_content));
371
+ }
372
+ break;
373
+
374
+ default:
375
+ qemu_log_mask(LOG_GUEST_ERROR,
376
+ "%s: bad write offset 0x%" HWADDR_PRIx "\n", __func__, offset);
377
+ }
378
+}
379
+
380
+static const MemoryRegionOps io_ops = {
381
+ .read = io_read,
382
+ .write = io_write,
383
+ .impl.min_access_size = 4,
384
+ .impl.max_access_size = 4,
385
+ .endianness = DEVICE_LITTLE_ENDIAN,
386
+};
387
+
388
+
389
+static void flash_write(void *opaque, hwaddr offset, uint64_t value,
390
+ unsigned int size)
391
+{
392
+ NRF51NVMState *s = NRF51_NVM(opaque);
393
+
394
+ if (s->config & NRF51_NVMC_CONFIG_WEN) {
395
+ assert(offset < s->flash_size);
396
+ /* NOR Flash only allows bits to be flipped from 1's to 0's on write */
397
+ s->storage[offset / 4] &= value;
398
+ } else {
399
+ qemu_log_mask(LOG_GUEST_ERROR,
400
+ "%s: Flash write 0x%" HWADDR_PRIx" while flash not writable.\n",
401
+ __func__, offset);
402
+ }
403
+}
404
+
405
+
406
+
407
+static const MemoryRegionOps flash_ops = {
408
+ .write = flash_write,
409
+ .valid.min_access_size = 4,
410
+ .valid.max_access_size = 4,
411
+ .endianness = DEVICE_LITTLE_ENDIAN,
412
+};
413
+
414
+static void nrf51_nvm_init(Object *obj)
415
+{
416
+ NRF51NVMState *s = NRF51_NVM(obj);
417
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
418
+
419
+ memory_region_init_io(&s->mmio, obj, &io_ops, s, "nrf51_soc.nvmc",
420
+ NRF51_NVMC_SIZE);
421
+ sysbus_init_mmio(sbd, &s->mmio);
422
+
423
+ memory_region_init_io(&s->ficr, obj, &ficr_ops, s, "nrf51_soc.ficr",
424
+ sizeof(ficr_content));
425
+ sysbus_init_mmio(sbd, &s->ficr);
426
+
427
+ memory_region_init_io(&s->uicr, obj, &uicr_ops, s, "nrf51_soc.uicr",
428
+ sizeof(s->uicr_content));
429
+ sysbus_init_mmio(sbd, &s->uicr);
430
+}
431
+
432
+static void nrf51_nvm_realize(DeviceState *dev, Error **errp)
433
+{
434
+ NRF51NVMState *s = NRF51_NVM(dev);
435
+ Error *err = NULL;
436
+
437
+ memory_region_init_rom_device(&s->flash, OBJECT(dev), &flash_ops, s,
438
+ "nrf51_soc.flash", s->flash_size, &err);
439
+ if (err) {
440
+ error_propagate(errp, err);
441
+ return;
442
+ }
443
+
444
+ s->storage = memory_region_get_ram_ptr(&s->flash);
445
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->flash);
446
+}
447
+
448
+static void nrf51_nvm_reset(DeviceState *dev)
449
+{
450
+ NRF51NVMState *s = NRF51_NVM(dev);
451
+
452
+ s->config = 0x00;
453
+ memset(s->uicr_content, 0xFF, sizeof(s->uicr_content));
454
+}
455
+
456
+static Property nrf51_nvm_properties[] = {
457
+ DEFINE_PROP_UINT32("flash-size", NRF51NVMState, flash_size, 0x40000),
458
+ DEFINE_PROP_END_OF_LIST(),
459
+};
460
+
461
+static const VMStateDescription vmstate_nvm = {
462
+ .name = "nrf51_soc.nvm",
463
+ .version_id = 1,
464
+ .minimum_version_id = 1,
465
+ .fields = (VMStateField[]) {
466
+ VMSTATE_UINT32_ARRAY(uicr_content, NRF51NVMState,
467
+ NRF51_UICR_FIXTURE_SIZE),
468
+ VMSTATE_UINT32(config, NRF51NVMState),
469
+ VMSTATE_END_OF_LIST()
470
+ }
471
+};
472
+
473
+static void nrf51_nvm_class_init(ObjectClass *klass, void *data)
474
+{
475
+ DeviceClass *dc = DEVICE_CLASS(klass);
476
+
477
+ dc->props = nrf51_nvm_properties;
478
+ dc->vmsd = &vmstate_nvm;
479
+ dc->realize = nrf51_nvm_realize;
480
+ dc->reset = nrf51_nvm_reset;
481
+}
482
+
483
+static const TypeInfo nrf51_nvm_info = {
484
+ .name = TYPE_NRF51_NVM,
485
+ .parent = TYPE_SYS_BUS_DEVICE,
486
+ .instance_size = sizeof(NRF51NVMState),
487
+ .instance_init = nrf51_nvm_init,
488
+ .class_init = nrf51_nvm_class_init
489
+};
490
+
491
+static void nrf51_nvm_register_types(void)
492
+{
493
+ type_register_static(&nrf51_nvm_info);
494
+}
495
+
496
+type_init(nrf51_nvm_register_types)
497
--
52
--
498
2.20.1
53
2.34.1
499
500
diff view generated by jsdifflib
1
Currently the cluster implementation doesn't have any constraints
1
In the GICv3 ITS model, we have a common coding pattern which has a
2
on the ordering of realizing the TYPE_CPU_CLUSTER and populating it
2
local C struct like "DTEntry dte", which is a C representation of an
3
with child objects. We want to impose a constraint that realize
3
in-guest-memory data structure, and we call a function such as
4
must happen only after all the child objects are added, so move
4
get_dte() to read guest memory and fill in the C struct. These
5
the realize of rpu_cluster. (The apu_cluster is already
5
functions to read in the struct sometimes have cases where they will
6
realized after child population.)
6
leave early and not fill in the whole struct (for instance get_dte()
7
will set "dte->valid = false" and nothing else for the case where it
8
is passed an entry_addr implying that there is no L2 table entry for
9
the DTE). This then causes potential use of uninitialized memory
10
later, for instance when we call a trace event which prints all the
11
fields of the struct. Sufficiently advanced compilers may produce
12
-Wmaybe-uninitialized warnings about this, especially if LTO is
13
enabled.
7
14
15
Rather than trying to carefully separate out these trace events into
16
"only the 'valid' field is initialized" and "all fields can be
17
printed", zero-init all the structs when we define them. None of
18
these structs are large (the biggest is 24 bytes) and having
19
consistent behaviour is less likely to be buggy.
20
21
Cc: qemu-stable@nongnu.org
22
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2718
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
24
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
25
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
26
Message-id: 20241213182337.3343068-1-peter.maydell@linaro.org
12
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
13
Message-id: 20190121152218.9592-2-peter.maydell@linaro.org
14
---
27
---
15
hw/arm/xlnx-zynqmp.c | 4 ++--
28
hw/intc/arm_gicv3_its.c | 44 ++++++++++++++++++++---------------------
16
1 file changed, 2 insertions(+), 2 deletions(-)
29
1 file changed, 22 insertions(+), 22 deletions(-)
17
30
18
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
31
diff --git a/hw/intc/arm_gicv3_its.c b/hw/intc/arm_gicv3_its.c
19
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/xlnx-zynqmp.c
33
--- a/hw/intc/arm_gicv3_its.c
21
+++ b/hw/arm/xlnx-zynqmp.c
34
+++ b/hw/intc/arm_gicv3_its.c
22
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_rpu(XlnxZynqMPState *s, const char *boot_cpu,
35
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult lookup_vte(GICv3ITSState *s, const char *who,
23
&error_abort, NULL);
36
static ItsCmdResult process_its_cmd_phys(GICv3ITSState *s, const ITEntry *ite,
24
qdev_prop_set_uint32(DEVICE(&s->rpu_cluster), "cluster-id", 1);
37
int irqlevel)
25
38
{
26
- qdev_init_nofail(DEVICE(&s->rpu_cluster));
39
- CTEntry cte;
27
-
40
+ CTEntry cte = {};
28
for (i = 0; i < num_rpus; i++) {
41
ItsCmdResult cmdres;
29
char *name;
42
30
43
cmdres = lookup_cte(s, __func__, ite->icid, &cte);
31
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_rpu(XlnxZynqMPState *s, const char *boot_cpu,
44
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_its_cmd_phys(GICv3ITSState *s, const ITEntry *ite,
32
return;
45
static ItsCmdResult process_its_cmd_virt(GICv3ITSState *s, const ITEntry *ite,
33
}
46
int irqlevel)
34
}
47
{
35
+
48
- VTEntry vte;
36
+ qdev_init_nofail(DEVICE(&s->rpu_cluster));
49
+ VTEntry vte = {};
37
}
50
ItsCmdResult cmdres;
38
51
39
static void xlnx_zynqmp_init(Object *obj)
52
cmdres = lookup_vte(s, __func__, ite->vpeid, &vte);
53
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_its_cmd_virt(GICv3ITSState *s, const ITEntry *ite,
54
static ItsCmdResult do_process_its_cmd(GICv3ITSState *s, uint32_t devid,
55
uint32_t eventid, ItsCmdType cmd)
56
{
57
- DTEntry dte;
58
- ITEntry ite;
59
+ DTEntry dte = {};
60
+ ITEntry ite = {};
61
ItsCmdResult cmdres;
62
int irqlevel;
63
64
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_mapti(GICv3ITSState *s, const uint64_t *cmdpkt,
65
uint32_t pIntid = 0;
66
uint64_t num_eventids;
67
uint16_t icid = 0;
68
- DTEntry dte;
69
- ITEntry ite;
70
+ DTEntry dte = {};
71
+ ITEntry ite = {};
72
73
devid = (cmdpkt[0] & DEVID_MASK) >> DEVID_SHIFT;
74
eventid = cmdpkt[1] & EVENTID_MASK;
75
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_vmapti(GICv3ITSState *s, const uint64_t *cmdpkt,
76
{
77
uint32_t devid, eventid, vintid, doorbell, vpeid;
78
uint32_t num_eventids;
79
- DTEntry dte;
80
- ITEntry ite;
81
+ DTEntry dte = {};
82
+ ITEntry ite = {};
83
84
if (!its_feature_virtual(s)) {
85
return CMD_CONTINUE;
86
@@ -XXX,XX +XXX,XX @@ static bool update_cte(GICv3ITSState *s, uint16_t icid, const CTEntry *cte)
87
static ItsCmdResult process_mapc(GICv3ITSState *s, const uint64_t *cmdpkt)
88
{
89
uint16_t icid;
90
- CTEntry cte;
91
+ CTEntry cte = {};
92
93
icid = cmdpkt[2] & ICID_MASK;
94
cte.valid = cmdpkt[2] & CMD_FIELD_VALID_MASK;
95
@@ -XXX,XX +XXX,XX @@ static bool update_dte(GICv3ITSState *s, uint32_t devid, const DTEntry *dte)
96
static ItsCmdResult process_mapd(GICv3ITSState *s, const uint64_t *cmdpkt)
97
{
98
uint32_t devid;
99
- DTEntry dte;
100
+ DTEntry dte = {};
101
102
devid = (cmdpkt[0] & DEVID_MASK) >> DEVID_SHIFT;
103
dte.size = cmdpkt[1] & SIZE_MASK;
104
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_movi(GICv3ITSState *s, const uint64_t *cmdpkt)
105
{
106
uint32_t devid, eventid;
107
uint16_t new_icid;
108
- DTEntry dte;
109
- CTEntry old_cte, new_cte;
110
- ITEntry old_ite;
111
+ DTEntry dte = {};
112
+ CTEntry old_cte = {}, new_cte = {};
113
+ ITEntry old_ite = {};
114
ItsCmdResult cmdres;
115
116
devid = FIELD_EX64(cmdpkt[0], MOVI_0, DEVICEID);
117
@@ -XXX,XX +XXX,XX @@ static bool update_vte(GICv3ITSState *s, uint32_t vpeid, const VTEntry *vte)
118
119
static ItsCmdResult process_vmapp(GICv3ITSState *s, const uint64_t *cmdpkt)
120
{
121
- VTEntry vte;
122
+ VTEntry vte = {};
123
uint32_t vpeid;
124
125
if (!its_feature_virtual(s)) {
126
@@ -XXX,XX +XXX,XX @@ static void vmovp_callback(gpointer data, gpointer opaque)
127
*/
128
GICv3ITSState *s = data;
129
VmovpCallbackData *cbdata = opaque;
130
- VTEntry vte;
131
+ VTEntry vte = {};
132
ItsCmdResult cmdres;
133
134
cmdres = lookup_vte(s, __func__, cbdata->vpeid, &vte);
135
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_vmovi(GICv3ITSState *s, const uint64_t *cmdpkt)
136
{
137
uint32_t devid, eventid, vpeid, doorbell;
138
bool doorbell_valid;
139
- DTEntry dte;
140
- ITEntry ite;
141
- VTEntry old_vte, new_vte;
142
+ DTEntry dte = {};
143
+ ITEntry ite = {};
144
+ VTEntry old_vte = {}, new_vte = {};
145
ItsCmdResult cmdres;
146
147
if (!its_feature_virtual(s)) {
148
@@ -XXX,XX +XXX,XX @@ static ItsCmdResult process_vinvall(GICv3ITSState *s, const uint64_t *cmdpkt)
149
static ItsCmdResult process_inv(GICv3ITSState *s, const uint64_t *cmdpkt)
150
{
151
uint32_t devid, eventid;
152
- ITEntry ite;
153
- DTEntry dte;
154
- CTEntry cte;
155
- VTEntry vte;
156
+ ITEntry ite = {};
157
+ DTEntry dte = {};
158
+ CTEntry cte = {};
159
+ VTEntry vte = {};
160
ItsCmdResult cmdres;
161
162
devid = FIELD_EX64(cmdpkt[0], INV_0, DEVICEID);
40
--
163
--
41
2.20.1
164
2.34.1
42
165
43
166
diff view generated by jsdifflib
1
From: Stefan Hajnoczi <stefanha@redhat.com>
1
From: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
2
2
3
This test verifies that we read back the expected I2C WHO_AM_I register
3
Update the URLs for the binaries we use for the firmware in the
4
values for the accelerometer/magnetometer.
4
sbsa-ref functional tests.
5
5
6
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
6
The firmware is built using Debian 'bookworm' cross toolchain (gcc
7
Message-id: 20190110094020.18354-3-stefanha@redhat.com
7
12.2.0).
8
9
Used versions:
10
11
- Trusted Firmware v2.12.0
12
- Tianocore EDK2 stable202411
13
- Tianocore EDK2 Platforms code commit 4b3530d
14
15
This allows us to move away from "some git commit on trunk"
16
to a stable release for both TF-A and EDK2.
17
18
Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
19
Message-id: 20241125125448.185504-1-marcin.juszkiewicz@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
22
---
11
tests/microbit-test.c | 44 +++++++++++++++++++++++++++++++++++++++++++
23
tests/functional/test_aarch64_sbsaref.py | 20 ++++++++++----------
12
1 file changed, 44 insertions(+)
24
1 file changed, 10 insertions(+), 10 deletions(-)
13
25
14
diff --git a/tests/microbit-test.c b/tests/microbit-test.c
26
diff --git a/tests/functional/test_aarch64_sbsaref.py b/tests/functional/test_aarch64_sbsaref.py
15
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100755
16
--- a/tests/microbit-test.c
28
--- a/tests/functional/test_aarch64_sbsaref.py
17
+++ b/tests/microbit-test.c
29
+++ b/tests/functional/test_aarch64_sbsaref.py
18
@@ -XXX,XX +XXX,XX @@
30
@@ -XXX,XX +XXX,XX @@ def fetch_firmware(test):
19
#include "hw/arm/nrf51.h"
31
20
#include "hw/gpio/nrf51_gpio.h"
32
Used components:
21
#include "hw/timer/nrf51_timer.h"
33
22
+#include "hw/i2c/microbit_i2c.h"
34
- - Trusted Firmware v2.11.0
23
+
35
- - Tianocore EDK2 4d4f569924
24
+/* Read a byte from I2C device at @addr from register @reg */
36
- - Tianocore EDK2-platforms 3f08401
25
+static uint32_t i2c_read_byte(uint32_t addr, uint32_t reg)
37
+ - Trusted Firmware v2.12.0
26
+{
38
+ - Tianocore EDK2 edk2-stable202411
27
+ uint32_t val;
39
+ - Tianocore EDK2-platforms 4b3530d
28
+
40
29
+ writel(NRF51_TWI_BASE + NRF51_TWI_REG_ADDRESS, addr);
41
"""
30
+ writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STARTTX, 1);
42
31
+ writel(NRF51_TWI_BASE + NRF51_TWI_REG_TXD, reg);
43
@@ -XXX,XX +XXX,XX @@ class Aarch64SbsarefMachine(QemuSystemTest):
32
+ val = readl(NRF51_TWI_BASE + NRF51_TWI_EVENT_TXDSENT);
44
33
+ g_assert_cmpuint(val, ==, 1);
45
ASSET_FLASH0 = Asset(
34
+ writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STOP, 1);
46
('https://artifacts.codelinaro.org/artifactory/linaro-419-sbsa-ref/'
35
+
47
- '20240619-148232/edk2/SBSA_FLASH0.fd.xz'),
36
+ writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STARTRX, 1);
48
- '0c954842a590988f526984de22e21ae0ab9cb351a0c99a8a58e928f0c7359cf7')
37
+ val = readl(NRF51_TWI_BASE + NRF51_TWI_EVENT_RXDREADY);
49
+ '20241122-189881/edk2/SBSA_FLASH0.fd.xz'),
38
+ g_assert_cmpuint(val, ==, 1);
50
+ '76eb89d42eebe324e4395329f47447cda9ac920aabcf99aca85424609c3384a5')
39
+ val = readl(NRF51_TWI_BASE + NRF51_TWI_REG_RXD);
51
40
+ writel(NRF51_TWI_BASE + NRF51_TWI_TASK_STOP, 1);
52
ASSET_FLASH1 = Asset(
41
+
53
('https://artifacts.codelinaro.org/artifactory/linaro-419-sbsa-ref/'
42
+ return val;
54
- '20240619-148232/edk2/SBSA_FLASH1.fd.xz'),
43
+}
55
- 'c6ec39374c4d79bb9e9cdeeb6db44732d90bb4a334cec92002b3f4b9cac4b5ee')
44
+
56
+ '20241122-189881/edk2/SBSA_FLASH1.fd.xz'),
45
+static void test_microbit_i2c(void)
57
+ 'f850f243bd8dbd49c51e061e0f79f1697546938f454aeb59ab7d93e5f0d412fc')
46
+{
58
47
+ uint32_t val;
59
def test_sbsaref_edk2_firmware(self):
48
+
60
49
+ /* We don't program pins/irqs but at least enable the device */
61
@@ -XXX,XX +XXX,XX @@ def test_sbsaref_edk2_firmware(self):
50
+ writel(NRF51_TWI_BASE + NRF51_TWI_REG_ENABLE, 5);
62
51
+
63
# AP Trusted ROM
52
+ /* MMA8653 magnetometer detection */
64
wait_for_console_pattern(self, "Booting Trusted Firmware")
53
+ val = i2c_read_byte(0x3A, 0x0D);
65
- wait_for_console_pattern(self, "BL1: v2.11.0(release):")
54
+ g_assert_cmpuint(val, ==, 0x5A);
66
+ wait_for_console_pattern(self, "BL1: v2.12.0(release):")
55
+
67
wait_for_console_pattern(self, "BL1: Booting BL2")
56
+ val = i2c_read_byte(0x3A, 0x0D);
68
57
+ g_assert_cmpuint(val, ==, 0x5A);
69
# Trusted Boot Firmware
58
+
70
- wait_for_console_pattern(self, "BL2: v2.11.0(release)")
59
+ /* LSM303 accelerometer detection */
71
+ wait_for_console_pattern(self, "BL2: v2.12.0(release)")
60
+ val = i2c_read_byte(0x3C, 0x4F);
72
wait_for_console_pattern(self, "Booting BL31")
61
+ g_assert_cmpuint(val, ==, 0x40);
73
62
+
74
# EL3 Runtime Software
63
+ writel(NRF51_TWI_BASE + NRF51_TWI_REG_ENABLE, 0);
75
- wait_for_console_pattern(self, "BL31: v2.11.0(release)")
64
+}
76
+ wait_for_console_pattern(self, "BL31: v2.12.0(release)")
65
77
66
static void test_nrf51_gpio(void)
78
# Non-trusted Firmware
67
{
79
wait_for_console_pattern(self, "UEFI firmware (version 1.0")
68
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
69
70
qtest_add_func("/microbit/nrf51/gpio", test_nrf51_gpio);
71
qtest_add_func("/microbit/nrf51/timer", test_nrf51_timer);
72
+ qtest_add_func("/microbit/microbit/i2c", test_microbit_i2c);
73
74
ret = g_test_run();
75
76
--
80
--
77
2.20.1
81
2.34.1
78
79
diff view generated by jsdifflib
Deleted patch
1
In the softmmu version of cpu_memory_rw_debug(), we ask the
2
CPU for the attributes to use for the virtual memory access,
3
and we correctly use those to identify the address space
4
index. However, we were not passing them in to the
5
address_space_write_rom() and address_space_rw() functions.
6
1
7
The effect of this was that a memory access from the gdbstub
8
to a device which had behaviour that was sensitive to the
9
memory attributes (such as some ARMv8M NVIC registers) was
10
incorrectly always performed as if non-secure, rather than
11
using the right security state for the CPU's current state.
12
13
Fixes: https://bugs.launchpad.net/qemu/+bug/1812091
14
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
17
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
18
Message-id: 20190117133834.7480-1-peter.maydell@linaro.org
19
---
20
exec.c | 6 ++----
21
1 file changed, 2 insertions(+), 4 deletions(-)
22
23
diff --git a/exec.c b/exec.c
24
index XXXXXXX..XXXXXXX 100644
25
--- a/exec.c
26
+++ b/exec.c
27
@@ -XXX,XX +XXX,XX @@ int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
28
phys_addr += (addr & ~TARGET_PAGE_MASK);
29
if (is_write) {
30
address_space_write_rom(cpu->cpu_ases[asidx].as, phys_addr,
31
- MEMTXATTRS_UNSPECIFIED,
32
- buf, l);
33
+ attrs, buf, l);
34
} else {
35
address_space_rw(cpu->cpu_ases[asidx].as, phys_addr,
36
- MEMTXATTRS_UNSPECIFIED,
37
- buf, l, 0);
38
+ attrs, buf, l, 0);
39
}
40
len -= l;
41
buf += l;
42
--
43
2.20.1
44
45
diff view generated by jsdifflib
Deleted patch
1
From: Stefan Hajnoczi <stefanha@redhat.com>
2
1
3
New source files were added without corresponding ./MAINTAINERS file
4
entries. Let's get things up to date.
5
6
Reviewed-by: Thomas Huth <thuth@redhat.com>
7
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20190123183352.11025-1-stefanha@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
MAINTAINERS | 8 +++++---
13
1 file changed, 5 insertions(+), 3 deletions(-)
14
15
diff --git a/MAINTAINERS b/MAINTAINERS
16
index XXXXXXX..XXXXXXX 100644
17
--- a/MAINTAINERS
18
+++ b/MAINTAINERS
19
@@ -XXX,XX +XXX,XX @@ M: Joel Stanley <joel@jms.id.au>
20
M: Peter Maydell <peter.maydell@linaro.org>
21
L: qemu-arm@nongnu.org
22
S: Maintained
23
-F: hw/arm/nrf51_soc.c
24
-F: hw/arm/microbit.c
25
-F: include/hw/arm/nrf51_soc.h
26
+F: hw/*/nrf51*.c
27
+F: hw/*/microbit*.c
28
+F: include/hw/*/nrf51*.h
29
+F: include/hw/*/microbit*.h
30
+F: tests/microbit-test.c
31
32
CRIS Machines
33
-------------
34
--
35
2.20.1
36
37
diff view generated by jsdifflib
Deleted patch
1
From: Stefan Hajnoczi <stefanha@redhat.com>
2
1
3
ROM devices go via MemoryRegionOps->write() callbacks for write
4
operations and do not dirty/invalidate that memory. Device emulation
5
must be able to mark memory ranges that have been modified internally
6
(e.g. using memory_region_get_ram_ptr()).
7
8
Introduce the memory_region_flush_rom_device() API for this purpose.
9
10
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
11
Message-id: 20190123212234.32068-2-stefanha@redhat.com
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
[PMM: fix block comment style]
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
include/exec/memory.h | 18 ++++++++++++++++++
17
exec.c | 13 +++++++++++++
18
2 files changed, 31 insertions(+)
19
20
diff --git a/include/exec/memory.h b/include/exec/memory.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/include/exec/memory.h
23
+++ b/include/exec/memory.h
24
@@ -XXX,XX +XXX,XX @@ bool memory_region_snapshot_get_dirty(MemoryRegion *mr,
25
void memory_region_reset_dirty(MemoryRegion *mr, hwaddr addr,
26
hwaddr size, unsigned client);
27
28
+/**
29
+ * memory_region_flush_rom_device: Mark a range of pages dirty and invalidate
30
+ * TBs (for self-modifying code).
31
+ *
32
+ * The MemoryRegionOps->write() callback of a ROM device must use this function
33
+ * to mark byte ranges that have been modified internally, such as by directly
34
+ * accessing the memory returned by memory_region_get_ram_ptr().
35
+ *
36
+ * This function marks the range dirty and invalidates TBs so that TCG can
37
+ * detect self-modifying code.
38
+ *
39
+ * @mr: the region being flushed.
40
+ * @addr: the start, relative to the start of the region, of the range being
41
+ * flushed.
42
+ * @size: the size, in bytes, of the range being flushed.
43
+ */
44
+void memory_region_flush_rom_device(MemoryRegion *mr, hwaddr addr, hwaddr size);
45
+
46
/**
47
* memory_region_set_readonly: Turn a memory region read-only (or read-write)
48
*
49
diff --git a/exec.c b/exec.c
50
index XXXXXXX..XXXXXXX 100644
51
--- a/exec.c
52
+++ b/exec.c
53
@@ -XXX,XX +XXX,XX @@ static void invalidate_and_set_dirty(MemoryRegion *mr, hwaddr addr,
54
cpu_physical_memory_set_dirty_range(addr, length, dirty_log_mask);
55
}
56
57
+void memory_region_flush_rom_device(MemoryRegion *mr, hwaddr addr, hwaddr size)
58
+{
59
+ /*
60
+ * In principle this function would work on other memory region types too,
61
+ * but the ROM device use case is the only one where this operation is
62
+ * necessary. Other memory regions should use the
63
+ * address_space_read/write() APIs.
64
+ */
65
+ assert(memory_region_is_romd(mr));
66
+
67
+ invalidate_and_set_dirty(mr, addr, size);
68
+}
69
+
70
static int memory_access_size(MemoryRegion *mr, unsigned l, hwaddr addr)
71
{
72
unsigned access_size_max = mr->ops->valid.max_access_size;
73
--
74
2.20.1
75
76
diff view generated by jsdifflib
Deleted patch
1
In checkpatch we attempt to check for and warn about
2
block comments which start with /* or /** followed by a
3
non-blank. Unfortunately a bug in the regex meant that
4
we would incorrectly warn about comments starting with
5
"/**" with no following text:
6
1
7
git show 9813dc6ac3954d58ba16b3920556f106f97e1c67|./scripts/checkpatch.pl -
8
WARNING: Block comments use a leading /* on a separate line
9
#34: FILE: tests/libqtest.h:233:
10
+/**
11
12
The sequence "/\*\*?" was intended to match either "/*" or "/**",
13
but Perl's semantics for '?' allow it to backtrack and try the
14
"matches 0 chars" option if the "matches 1 char" choice leads to
15
a failure of the rest of the regex to match. Switch to "/\*\*?+"
16
which uses what perlre(1) calls the "possessive" quantifier form:
17
this means that if it matches the "/**" string it will not later
18
backtrack to matching just the "/*" prefix.
19
20
The other end of the regex is also wrong: it is attempting
21
to check for "/* or /** followed by something that isn't
22
just whitespace", but [ \t]*.+[ \t]* will match on pure
23
whitespace. This is less significant but means that a line
24
with just a comment-starter followed by trailing whitespace
25
will generate an incorrect warning about block comment style
26
as well as the correct error about trailing whitespace which
27
a different checkpatch test emits.
28
29
Fixes: 8c06fbdf36bf4d ("scripts/checkpatch.pl: Enforce multiline comment syntax")
30
Reported-by: Thomas Huth <thuth@redhat.com>
31
Reported-by: Eric Blake <eblake@redhat.com>
32
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
33
Reviewed-by: Eric Blake <eblake@redhat.com>
34
Message-id: 20190118165050.22270-1-peter.maydell@linaro.org
35
---
36
scripts/checkpatch.pl | 2 +-
37
1 file changed, 1 insertion(+), 1 deletion(-)
38
39
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
40
index XXXXXXX..XXXXXXX 100755
41
--- a/scripts/checkpatch.pl
42
+++ b/scripts/checkpatch.pl
43
@@ -XXX,XX +XXX,XX @@ sub process {
44
45
        # Block comments use /* on a line of its own
46
        if ($rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&    #inline /*...*/
47
-         $rawline =~ m@^\+.*/\*\*?[ \t]*.+[ \t]*$@) { # /* or /** non-blank
48
+         $rawline =~ m@^\+.*/\*\*?+[ \t]*[^ \t]@) { # /* or /** non-blank
49
            WARN("Block comments use a leading /* on a separate line\n" . $herecurr);
50
        }
51
52
--
53
2.20.1
54
55
diff view generated by jsdifflib
Deleted patch
1
If we aren't going to create any RPUs, then don't create the
2
rpu-cluster unit. This allows us to add an assertion to the
3
cluster object that it contains at least one CPU, which helps
4
to avoid bugs in creating clusters and putting CPUs in them.
5
1
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Message-id: 20190121184314.14311-1-peter.maydell@linaro.org
11
---
12
hw/arm/xlnx-zynqmp.c | 5 +++++
13
1 file changed, 5 insertions(+)
14
15
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/xlnx-zynqmp.c
18
+++ b/hw/arm/xlnx-zynqmp.c
19
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_rpu(XlnxZynqMPState *s, const char *boot_cpu,
20
int i;
21
int num_rpus = MIN(smp_cpus - XLNX_ZYNQMP_NUM_APU_CPUS, XLNX_ZYNQMP_NUM_RPU_CPUS);
22
23
+ if (num_rpus <= 0) {
24
+ /* Don't create rpu-cluster object if there's nothing to put in it */
25
+ return;
26
+ }
27
+
28
object_initialize_child(OBJECT(s), "rpu-cluster", &s->rpu_cluster,
29
sizeof(s->rpu_cluster), TYPE_CPU_CLUSTER,
30
&error_abort, NULL);
31
--
32
2.20.1
33
34
diff view generated by jsdifflib
Deleted patch
1
Now we're keeping the cluster index in the CPUState, we don't
2
need to jump through hoops in gdb_get_cpu_pid() to find the
3
associated cluster object.
4
1
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
7
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Message-id: 20190121152218.9592-5-peter.maydell@linaro.org
9
---
10
gdbstub.c | 48 +++++-------------------------------------------
11
1 file changed, 5 insertions(+), 43 deletions(-)
12
13
diff --git a/gdbstub.c b/gdbstub.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/gdbstub.c
16
+++ b/gdbstub.c
17
@@ -XXX,XX +XXX,XX @@ static int memtox(char *buf, const char *mem, int len)
18
19
static uint32_t gdb_get_cpu_pid(const GDBState *s, CPUState *cpu)
20
{
21
-#ifndef CONFIG_USER_ONLY
22
- gchar *path, *name = NULL;
23
- Object *obj;
24
- CPUClusterState *cluster;
25
- uint32_t ret;
26
-
27
- path = object_get_canonical_path(OBJECT(cpu));
28
-
29
- if (path == NULL) {
30
- /* Return the default process' PID */
31
- ret = s->processes[s->process_num - 1].pid;
32
- goto out;
33
- }
34
-
35
- name = object_get_canonical_path_component(OBJECT(cpu));
36
- assert(name != NULL);
37
-
38
- /*
39
- * Retrieve the CPU parent path by removing the last '/' and the CPU name
40
- * from the CPU canonical path.
41
- */
42
- path[strlen(path) - strlen(name) - 1] = '\0';
43
-
44
- obj = object_resolve_path_type(path, TYPE_CPU_CLUSTER, NULL);
45
-
46
- if (obj == NULL) {
47
- /* Return the default process' PID */
48
- ret = s->processes[s->process_num - 1].pid;
49
- goto out;
50
- }
51
-
52
- cluster = CPU_CLUSTER(obj);
53
- ret = cluster->cluster_id + 1;
54
-
55
-out:
56
- g_free(name);
57
- g_free(path);
58
-
59
- return ret;
60
-
61
-#else
62
/* TODO: In user mode, we should use the task state PID */
63
- return s->processes[s->process_num - 1].pid;
64
-#endif
65
+ if (cpu->cluster_index == UNASSIGNED_CLUSTER_INDEX) {
66
+ /* Return the default process' PID */
67
+ return s->processes[s->process_num - 1].pid;
68
+ }
69
+ return cpu->cluster_index + 1;
70
}
71
72
static GDBProcess *gdb_get_process(const GDBState *s, uint32_t pid)
73
--
74
2.20.1
75
76
diff view generated by jsdifflib