1
Just 4 bug fixes here...
1
The following changes since commit 3214bec13d8d4c40f707d21d8350d04e4123ae97:
2
2
3
thanks
3
Merge tag 'migration-20250110-pull-request' of https://gitlab.com/farosas/qemu into staging (2025-01-10 13:39:19 -0500)
4
-- PMM
5
6
The following changes since commit e9d2db818ff934afb366aea566d0b33acf7bced1:
7
8
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging (2024-08-01 07:31:49 +1000)
9
4
10
are available in the Git repository at:
5
are available in the Git repository at:
11
6
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20240801
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20250113
13
8
14
for you to fetch changes up to 5e8e4f098d872818aa9a138a171200068b81c8d1:
9
for you to fetch changes up to 435d260e7ec5ff9c79e3e62f1d66ec82d2d691ae:
15
10
16
target/xtensa: Correct assert condition in handle_interrupt() (2024-08-01 10:59:01 +0100)
11
docs/system/arm/virt: mention specific migration information (2025-01-13 12:35:35 +0000)
17
12
18
----------------------------------------------------------------
13
----------------------------------------------------------------
19
target-arm queue:
14
target-arm queue:
20
* hw/arm/mps2-tz.c: fix RX/TX interrupts order
15
* hw/arm_sysctl: fix extracting 31th bit of val
21
* accel/kvm/kvm-all: Fixes the missing break in vCPU unpark logic
16
* hw/misc: cast rpm to uint64_t
22
* target/arm: Handle denormals correctly for FMOPA (widening)
17
* tests/qtest/boot-serial-test: Improve ASM
23
* target/xtensa: Correct assert condition in handle_interrupt()
18
* target/arm: Move minor arithmetic helpers out of helper.c
19
* target/arm: change default pauth algorithm to impdef
24
20
25
----------------------------------------------------------------
21
----------------------------------------------------------------
26
Marco Palumbi (1):
22
Anastasia Belova (1):
27
hw/arm/mps2-tz.c: fix RX/TX interrupts order
23
hw/arm_sysctl: fix extracting 31th bit of val
28
24
29
Peter Maydell (2):
25
Peter Maydell (2):
30
target/arm: Handle denormals correctly for FMOPA (widening)
26
target/arm: Move minor arithmetic helpers out of helper.c
31
target/xtensa: Correct assert condition in handle_interrupt()
27
tests/tcg/aarch64: force qarma5 for pauth-3 test
32
28
33
Salil Mehta (1):
29
Philippe Mathieu-Daudé (4):
34
accel/kvm/kvm-all: Fixes the missing break in vCPU unpark logic
30
tests/qtest/boot-serial-test: Improve ASM comments of PL011 tests
31
tests/qtest/boot-serial-test: Reduce for() loop in PL011 tests
32
tests/qtest/boot-serial-test: Reorder pair of instructions in PL011 test
33
tests/qtest/boot-serial-test: Initialize PL011 Control register
35
34
36
target/arm/tcg/helper-sme.h | 2 +-
35
Pierrick Bouvier (3):
37
accel/kvm/kvm-all.c | 1 +
36
target/arm: add new property to select pauth-qarma5
38
hw/arm/mps2-tz.c | 6 +++---
37
target/arm: change default pauth algorithm to impdef
39
target/arm/tcg/sme_helper.c | 39 +++++++++++++++++++++++++++------------
38
docs/system/arm/virt: mention specific migration information
40
target/arm/tcg/translate-sme.c | 25 +++++++++++++++++++++++--
39
41
target/xtensa/exc_helper.c | 2 +-
40
Tigran Sogomonian (1):
42
6 files changed, 56 insertions(+), 19 deletions(-)
41
hw/misc: cast rpm to uint64_t
42
43
docs/system/arm/cpu-features.rst | 7 +-
44
docs/system/arm/virt.rst | 4 +
45
docs/system/introduction.rst | 2 +-
46
target/arm/cpu.h | 4 +
47
hw/core/machine.c | 4 +-
48
hw/misc/arm_sysctl.c | 2 +-
49
hw/misc/npcm7xx_mft.c | 5 +-
50
target/arm/arm-qmp-cmds.c | 2 +-
51
target/arm/cpu.c | 2 +
52
target/arm/cpu64.c | 38 ++-
53
target/arm/helper.c | 285 -----------------------
54
target/arm/tcg/arith_helper.c | 296 ++++++++++++++++++++++++
55
tests/qtest/arm-cpu-features.c | 15 +-
56
tests/qtest/boot-serial-test.c | 23 +-
57
target/arm/{op_addsub.h => tcg/op_addsub.c.inc} | 0
58
target/arm/tcg/meson.build | 1 +
59
tests/tcg/aarch64/Makefile.softmmu-target | 3 +
60
17 files changed, 377 insertions(+), 316 deletions(-)
61
create mode 100644 target/arm/tcg/arith_helper.c
62
rename target/arm/{op_addsub.h => tcg/op_addsub.c.inc} (100%)
63
diff view generated by jsdifflib
New patch
1
From: Anastasia Belova <abelova@astralinux.ru>
1
2
3
1 << 31 is casted to uint64_t while bitwise and with val.
4
So this value may become 0xffffffff80000000 but only
5
31th "start" bit is required.
6
7
This is not possible in practice because the MemoryRegionOps
8
uses the default max access size of 4 bytes and so none
9
of the upper bytes of val will be set, but the bitfield
10
extract API is clearer anyway.
11
12
Use the bitfield extract() API instead.
13
14
Found by Linux Verification Center (linuxtesting.org) with SVACE.
15
16
Signed-off-by: Anastasia Belova <abelova@astralinux.ru>
17
Message-id: 20241220125429.7552-1-abelova@astralinux.ru
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
[PMM: add clarification to commit message]
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
---
22
hw/misc/arm_sysctl.c | 2 +-
23
1 file changed, 1 insertion(+), 1 deletion(-)
24
25
diff --git a/hw/misc/arm_sysctl.c b/hw/misc/arm_sysctl.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/misc/arm_sysctl.c
28
+++ b/hw/misc/arm_sysctl.c
29
@@ -XXX,XX +XXX,XX @@ static void arm_sysctl_write(void *opaque, hwaddr offset,
30
* as zero.
31
*/
32
s->sys_cfgctrl = val & ~((3 << 18) | (1 << 31));
33
- if (val & (1 << 31)) {
34
+ if (extract64(val, 31, 1)) {
35
/* Start bit set -- actually do something */
36
unsigned int dcc = extract32(s->sys_cfgctrl, 26, 4);
37
unsigned int function = extract32(s->sys_cfgctrl, 20, 6);
38
--
39
2.34.1
diff view generated by jsdifflib
New patch
1
From: Tigran Sogomonian <tsogomonian@astralinux.ru>
1
2
3
The value of an arithmetic expression
4
'rpm * NPCM7XX_MFT_PULSE_PER_REVOLUTION' is a subject
5
to overflow because its operands are not cast to
6
a larger data type before performing arithmetic. Thus, need
7
to cast rpm to uint64_t.
8
9
Found by Linux Verification Center (linuxtesting.org) with SVACE.
10
11
Signed-off-by: Tigran Sogomonian <tsogomonian@astralinux.ru>
12
Reviewed-by: Patrick Leis <venture@google.com>
13
Reviewed-by: Hao Wu <wuhaotsh@google.com>
14
Message-id: 20241226130311.1349-1-tsogomonian@astralinux.ru
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/misc/npcm7xx_mft.c | 5 +++--
18
1 file changed, 3 insertions(+), 2 deletions(-)
19
20
diff --git a/hw/misc/npcm7xx_mft.c b/hw/misc/npcm7xx_mft.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/misc/npcm7xx_mft.c
23
+++ b/hw/misc/npcm7xx_mft.c
24
@@ -XXX,XX +XXX,XX @@ static NPCM7xxMFTCaptureState npcm7xx_mft_compute_cnt(
25
* RPM = revolution/min. The time for one revlution (in ns) is
26
* MINUTE_TO_NANOSECOND / RPM.
27
*/
28
- count = clock_ns_to_ticks(clock, (60 * NANOSECONDS_PER_SECOND) /
29
- (rpm * NPCM7XX_MFT_PULSE_PER_REVOLUTION));
30
+ count = clock_ns_to_ticks(clock,
31
+ (uint64_t)(60 * NANOSECONDS_PER_SECOND) /
32
+ ((uint64_t)rpm * NPCM7XX_MFT_PULSE_PER_REVOLUTION));
33
}
34
35
if (count > NPCM7XX_MFT_MAX_CNT) {
36
--
37
2.34.1
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
2
3
Re-indent ASM comments adding the 'loop:' label.
4
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Fabiano Rosas <farosas@suse.de>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
tests/qtest/boot-serial-test.c | 18 +++++++++---------
11
1 file changed, 9 insertions(+), 9 deletions(-)
12
13
diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/qtest/boot-serial-test.c
16
+++ b/tests/qtest/boot-serial-test.c
17
@@ -XXX,XX +XXX,XX @@ static const uint8_t kernel_plml605[] = {
18
};
19
20
static const uint8_t bios_raspi2[] = {
21
- 0x08, 0x30, 0x9f, 0xe5, /* ldr r3,[pc,#8] Get base */
22
- 0x54, 0x20, 0xa0, 0xe3, /* mov r2,#'T' */
23
- 0x00, 0x20, 0xc3, 0xe5, /* strb r2,[r3] */
24
- 0xfb, 0xff, 0xff, 0xea, /* b loop */
25
- 0x00, 0x10, 0x20, 0x3f, /* 0x3f201000 = UART0 base addr */
26
+ 0x08, 0x30, 0x9f, 0xe5, /* loop: ldr r3, [pc, #8] Get &UART0 */
27
+ 0x54, 0x20, 0xa0, 0xe3, /* mov r2, #'T' */
28
+ 0x00, 0x20, 0xc3, 0xe5, /* strb r2, [r3] *TXDAT = 'T' */
29
+ 0xfb, 0xff, 0xff, 0xea, /* b -12 (loop) */
30
+ 0x00, 0x10, 0x20, 0x3f, /* UART0: 0x3f201000 */
31
};
32
33
static const uint8_t kernel_aarch64[] = {
34
- 0x81, 0x0a, 0x80, 0x52, /* mov w1, #0x54 */
35
- 0x02, 0x20, 0xa1, 0xd2, /* mov x2, #0x9000000 */
36
- 0x41, 0x00, 0x00, 0x39, /* strb w1, [x2] */
37
- 0xfd, 0xff, 0xff, 0x17, /* b -12 (loop) */
38
+ 0x81, 0x0a, 0x80, 0x52, /* loop: mov w1, #'T' */
39
+ 0x02, 0x20, 0xa1, 0xd2, /* mov x2, #0x9000000 Load UART0 */
40
+ 0x41, 0x00, 0x00, 0x39, /* strb w1, [x2] *TXDAT = 'T' */
41
+ 0xfd, 0xff, 0xff, 0x17, /* b -12 (loop) */
42
};
43
44
static const uint8_t kernel_nrf51[] = {
45
--
46
2.34.1
47
48
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
2
3
Since registers are not modified, we don't need
4
to refill their values. Directly jump to the previous
5
store instruction to keep filling the TXDAT register.
6
7
The equivalent C code remains:
8
9
while (true) {
10
*UART_DATA = 'T';
11
}
12
13
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Reviewed-by: Fabiano Rosas <farosas@suse.de>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
tests/qtest/boot-serial-test.c | 12 ++++++------
19
1 file changed, 6 insertions(+), 6 deletions(-)
20
21
diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/tests/qtest/boot-serial-test.c
24
+++ b/tests/qtest/boot-serial-test.c
25
@@ -XXX,XX +XXX,XX @@ static const uint8_t kernel_plml605[] = {
26
};
27
28
static const uint8_t bios_raspi2[] = {
29
- 0x08, 0x30, 0x9f, 0xe5, /* loop: ldr r3, [pc, #8] Get &UART0 */
30
+ 0x08, 0x30, 0x9f, 0xe5, /* ldr r3, [pc, #8] Get &UART0 */
31
0x54, 0x20, 0xa0, 0xe3, /* mov r2, #'T' */
32
- 0x00, 0x20, 0xc3, 0xe5, /* strb r2, [r3] *TXDAT = 'T' */
33
- 0xfb, 0xff, 0xff, 0xea, /* b -12 (loop) */
34
+ 0x00, 0x20, 0xc3, 0xe5, /* loop: strb r2, [r3] *TXDAT = 'T' */
35
+ 0xff, 0xff, 0xff, 0xea, /* b -4 (loop) */
36
0x00, 0x10, 0x20, 0x3f, /* UART0: 0x3f201000 */
37
};
38
39
static const uint8_t kernel_aarch64[] = {
40
- 0x81, 0x0a, 0x80, 0x52, /* loop: mov w1, #'T' */
41
+ 0x81, 0x0a, 0x80, 0x52, /* mov w1, #'T' */
42
0x02, 0x20, 0xa1, 0xd2, /* mov x2, #0x9000000 Load UART0 */
43
- 0x41, 0x00, 0x00, 0x39, /* strb w1, [x2] *TXDAT = 'T' */
44
- 0xfd, 0xff, 0xff, 0x17, /* b -12 (loop) */
45
+ 0x41, 0x00, 0x00, 0x39, /* loop: strb w1, [x2] *TXDAT = 'T' */
46
+ 0xff, 0xff, 0xff, 0x17, /* b -4 (loop) */
47
};
48
49
static const uint8_t kernel_nrf51[] = {
50
--
51
2.34.1
52
53
diff view generated by jsdifflib
1
In commit ad18376b90c8101 we added an assert that the level value was
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
in-bounds for the array we're about to index into. However, the
3
assert condition is wrong -- env->config->interrupt_vector is an
4
array of uint32_t, so we should bounds check the index against
5
ARRAY_SIZE(...), not against sizeof().
6
2
7
Resolves: Coverity CID 1507131
3
In the next commit we are going to use a different value
8
Fixes: ad18376b90c8101 ("target/xtensa: Assert that interrupt level is within bounds")
4
for the $w1 register, maintaining the same $x2 value. In
5
order to keep the next commit trivial to review, set $x2
6
before $w1.
7
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Fabiano Rosas <farosas@suse.de>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Acked-by: Max Filippov <jcmvbkbc@gmail.com>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
12
Message-id: 20240731172246.3682311-1-peter.maydell@linaro.org
13
---
12
---
14
target/xtensa/exc_helper.c | 2 +-
13
tests/qtest/boot-serial-test.c | 2 +-
15
1 file changed, 1 insertion(+), 1 deletion(-)
14
1 file changed, 1 insertion(+), 1 deletion(-)
16
15
17
diff --git a/target/xtensa/exc_helper.c b/target/xtensa/exc_helper.c
16
diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c
18
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
19
--- a/target/xtensa/exc_helper.c
18
--- a/tests/qtest/boot-serial-test.c
20
+++ b/target/xtensa/exc_helper.c
19
+++ b/tests/qtest/boot-serial-test.c
21
@@ -XXX,XX +XXX,XX @@ static void handle_interrupt(CPUXtensaState *env)
20
@@ -XXX,XX +XXX,XX @@ static const uint8_t bios_raspi2[] = {
22
21
};
23
if (level > 1) {
22
24
/* env->config->nlevel check should have ensured this */
23
static const uint8_t kernel_aarch64[] = {
25
- assert(level < sizeof(env->config->interrupt_vector));
24
- 0x81, 0x0a, 0x80, 0x52, /* mov w1, #'T' */
26
+ assert(level < ARRAY_SIZE(env->config->interrupt_vector));
25
0x02, 0x20, 0xa1, 0xd2, /* mov x2, #0x9000000 Load UART0 */
27
26
+ 0x81, 0x0a, 0x80, 0x52, /* mov w1, #'T' */
28
env->sregs[EPC1 + level - 1] = env->pc;
27
0x41, 0x00, 0x00, 0x39, /* loop: strb w1, [x2] *TXDAT = 'T' */
29
env->sregs[EPS2 + level - 2] = env->sregs[PS];
28
0xff, 0xff, 0xff, 0x17, /* b -4 (loop) */
29
};
30
--
30
--
31
2.34.1
31
2.34.1
32
32
33
33
diff view generated by jsdifflib
1
From: Salil Mehta <salil.mehta@huawei.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Loop should exit prematurely on successfully finding out the parked vCPU (struct
3
The tests using the PL011 UART of the virt and raspi machines
4
KVMParkedVcpu) in the 'struct KVMState' maintained 'kvm_parked_vcpus' list of
4
weren't properly enabling the UART and its transmitter previous
5
parked vCPUs.
5
to sending characters. Follow the PL011 manual initialization
6
recommendation by setting the proper bits of the control register.
6
7
7
Fixes: Coverity CID 1558552
8
Update the ASM code prefixing:
8
Fixes: 08c3286822 ("accel/kvm: Extract common KVM vCPU {creation,parking} code")
9
9
Reported-by: Peter Maydell <peter.maydell@linaro.org>
10
*UART_CTRL = UART_ENABLE | TX_ENABLE;
10
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
11
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
12
to:
12
Reviewed-by: Gavin Shan <gshan@redhat.com>
13
13
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
14
while (true) {
14
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
15
*UART_DATA = 'T';
15
Message-id: 20240725145132.99355-1-salil.mehta@huawei.com
16
}
16
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
17
17
Message-ID: <CAFEAcA-3_d1c7XSXWkFubD-LsW5c5i95e6xxV09r2C9yGtzcdA@mail.gmail.com>
18
Note, since commit 51b61dd4d56 ("hw/char/pl011: Warn when using
18
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
19
disabled transmitter") incomplete PL011 initialization can be
20
logged using the '-d guest_errors' command line option.
21
22
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
23
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
25
---
21
accel/kvm/kvm-all.c | 1 +
26
tests/qtest/boot-serial-test.c | 7 ++++++-
22
1 file changed, 1 insertion(+)
27
1 file changed, 6 insertions(+), 1 deletion(-)
23
28
24
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
29
diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c
25
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
26
--- a/accel/kvm/kvm-all.c
31
--- a/tests/qtest/boot-serial-test.c
27
+++ b/accel/kvm/kvm-all.c
32
+++ b/tests/qtest/boot-serial-test.c
28
@@ -XXX,XX +XXX,XX @@ int kvm_unpark_vcpu(KVMState *s, unsigned long vcpu_id)
33
@@ -XXX,XX +XXX,XX @@ static const uint8_t kernel_plml605[] = {
29
QLIST_REMOVE(cpu, node);
34
};
30
kvm_fd = cpu->kvm_fd;
35
31
g_free(cpu);
36
static const uint8_t bios_raspi2[] = {
32
+ break;
37
- 0x08, 0x30, 0x9f, 0xe5, /* ldr r3, [pc, #8] Get &UART0 */
33
}
38
+ 0x10, 0x30, 0x9f, 0xe5, /* ldr r3, [pc, #16] Get &UART0 */
34
}
39
+ 0x10, 0x20, 0x9f, 0xe5, /* ldr r2, [pc, #16] Get &CR */
35
40
+ 0xb0, 0x23, 0xc3, 0xe1, /* strh r2, [r3, #48] Set CR */
41
0x54, 0x20, 0xa0, 0xe3, /* mov r2, #'T' */
42
0x00, 0x20, 0xc3, 0xe5, /* loop: strb r2, [r3] *TXDAT = 'T' */
43
0xff, 0xff, 0xff, 0xea, /* b -4 (loop) */
44
0x00, 0x10, 0x20, 0x3f, /* UART0: 0x3f201000 */
45
+ 0x01, 0x01, 0x00, 0x00, /* CR: 0x101 = UARTEN|TXE */
46
};
47
48
static const uint8_t kernel_aarch64[] = {
49
0x02, 0x20, 0xa1, 0xd2, /* mov x2, #0x9000000 Load UART0 */
50
+ 0x21, 0x20, 0x80, 0x52, /* mov w1, 0x101 CR = UARTEN|TXE */
51
+ 0x41, 0x60, 0x00, 0x79, /* strh w1, [x2, #48] Set CR */
52
0x81, 0x0a, 0x80, 0x52, /* mov w1, #'T' */
53
0x41, 0x00, 0x00, 0x39, /* loop: strb w1, [x2] *TXDAT = 'T' */
54
0xff, 0xff, 0xff, 0x17, /* b -4 (loop) */
36
--
55
--
37
2.34.1
56
2.34.1
38
57
39
58
diff view generated by jsdifflib
New patch
1
helper.c includes some small TCG helper functions used for mostly
2
arithmetic instructions. These are TCG only and there's no need for
3
them to be in the large and unwieldy helper.c. Move them out to
4
their own source file in the tcg/ subdirectory, together with the
5
op_addsub.h multiply-included template header that they use.
1
6
7
Since we are moving op_addsub.h, we take the opportunity to
8
give it a name which matches our convention for files which
9
are not true header files but which are #included from other
10
C files: op_addsub.c.inc.
11
12
(Ironically, this means that helper.c no longer contains
13
any TCG helper function definitions at all.)
14
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20250110131211.2546314-1-peter.maydell@linaro.org
18
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
19
---
20
target/arm/helper.c | 285 -----------------
21
target/arm/tcg/arith_helper.c | 296 ++++++++++++++++++
22
.../arm/{op_addsub.h => tcg/op_addsub.c.inc} | 0
23
target/arm/tcg/meson.build | 1 +
24
4 files changed, 297 insertions(+), 285 deletions(-)
25
create mode 100644 target/arm/tcg/arith_helper.c
26
rename target/arm/{op_addsub.h => tcg/op_addsub.c.inc} (100%)
27
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/helper.c
31
+++ b/target/arm/helper.c
32
@@ -XXX,XX +XXX,XX @@
33
#include "qemu/main-loop.h"
34
#include "qemu/timer.h"
35
#include "qemu/bitops.h"
36
-#include "qemu/crc32c.h"
37
#include "qemu/qemu-print.h"
38
#include "exec/exec-all.h"
39
#include "exec/translation-block.h"
40
-#include <zlib.h> /* for crc32 */
41
#include "hw/irq.h"
42
#include "system/cpu-timers.h"
43
#include "system/kvm.h"
44
@@ -XXX,XX +XXX,XX @@ ARMVAParameters aa64_va_parameters(CPUARMState *env, uint64_t va,
45
};
46
}
47
48
-/*
49
- * Note that signed overflow is undefined in C. The following routines are
50
- * careful to use unsigned types where modulo arithmetic is required.
51
- * Failure to do so _will_ break on newer gcc.
52
- */
53
-
54
-/* Signed saturating arithmetic. */
55
-
56
-/* Perform 16-bit signed saturating addition. */
57
-static inline uint16_t add16_sat(uint16_t a, uint16_t b)
58
-{
59
- uint16_t res;
60
-
61
- res = a + b;
62
- if (((res ^ a) & 0x8000) && !((a ^ b) & 0x8000)) {
63
- if (a & 0x8000) {
64
- res = 0x8000;
65
- } else {
66
- res = 0x7fff;
67
- }
68
- }
69
- return res;
70
-}
71
-
72
-/* Perform 8-bit signed saturating addition. */
73
-static inline uint8_t add8_sat(uint8_t a, uint8_t b)
74
-{
75
- uint8_t res;
76
-
77
- res = a + b;
78
- if (((res ^ a) & 0x80) && !((a ^ b) & 0x80)) {
79
- if (a & 0x80) {
80
- res = 0x80;
81
- } else {
82
- res = 0x7f;
83
- }
84
- }
85
- return res;
86
-}
87
-
88
-/* Perform 16-bit signed saturating subtraction. */
89
-static inline uint16_t sub16_sat(uint16_t a, uint16_t b)
90
-{
91
- uint16_t res;
92
-
93
- res = a - b;
94
- if (((res ^ a) & 0x8000) && ((a ^ b) & 0x8000)) {
95
- if (a & 0x8000) {
96
- res = 0x8000;
97
- } else {
98
- res = 0x7fff;
99
- }
100
- }
101
- return res;
102
-}
103
-
104
-/* Perform 8-bit signed saturating subtraction. */
105
-static inline uint8_t sub8_sat(uint8_t a, uint8_t b)
106
-{
107
- uint8_t res;
108
-
109
- res = a - b;
110
- if (((res ^ a) & 0x80) && ((a ^ b) & 0x80)) {
111
- if (a & 0x80) {
112
- res = 0x80;
113
- } else {
114
- res = 0x7f;
115
- }
116
- }
117
- return res;
118
-}
119
-
120
-#define ADD16(a, b, n) RESULT(add16_sat(a, b), n, 16);
121
-#define SUB16(a, b, n) RESULT(sub16_sat(a, b), n, 16);
122
-#define ADD8(a, b, n) RESULT(add8_sat(a, b), n, 8);
123
-#define SUB8(a, b, n) RESULT(sub8_sat(a, b), n, 8);
124
-#define PFX q
125
-
126
-#include "op_addsub.h"
127
-
128
-/* Unsigned saturating arithmetic. */
129
-static inline uint16_t add16_usat(uint16_t a, uint16_t b)
130
-{
131
- uint16_t res;
132
- res = a + b;
133
- if (res < a) {
134
- res = 0xffff;
135
- }
136
- return res;
137
-}
138
-
139
-static inline uint16_t sub16_usat(uint16_t a, uint16_t b)
140
-{
141
- if (a > b) {
142
- return a - b;
143
- } else {
144
- return 0;
145
- }
146
-}
147
-
148
-static inline uint8_t add8_usat(uint8_t a, uint8_t b)
149
-{
150
- uint8_t res;
151
- res = a + b;
152
- if (res < a) {
153
- res = 0xff;
154
- }
155
- return res;
156
-}
157
-
158
-static inline uint8_t sub8_usat(uint8_t a, uint8_t b)
159
-{
160
- if (a > b) {
161
- return a - b;
162
- } else {
163
- return 0;
164
- }
165
-}
166
-
167
-#define ADD16(a, b, n) RESULT(add16_usat(a, b), n, 16);
168
-#define SUB16(a, b, n) RESULT(sub16_usat(a, b), n, 16);
169
-#define ADD8(a, b, n) RESULT(add8_usat(a, b), n, 8);
170
-#define SUB8(a, b, n) RESULT(sub8_usat(a, b), n, 8);
171
-#define PFX uq
172
-
173
-#include "op_addsub.h"
174
-
175
-/* Signed modulo arithmetic. */
176
-#define SARITH16(a, b, n, op) do { \
177
- int32_t sum; \
178
- sum = (int32_t)(int16_t)(a) op (int32_t)(int16_t)(b); \
179
- RESULT(sum, n, 16); \
180
- if (sum >= 0) \
181
- ge |= 3 << (n * 2); \
182
- } while (0)
183
-
184
-#define SARITH8(a, b, n, op) do { \
185
- int32_t sum; \
186
- sum = (int32_t)(int8_t)(a) op (int32_t)(int8_t)(b); \
187
- RESULT(sum, n, 8); \
188
- if (sum >= 0) \
189
- ge |= 1 << n; \
190
- } while (0)
191
-
192
-
193
-#define ADD16(a, b, n) SARITH16(a, b, n, +)
194
-#define SUB16(a, b, n) SARITH16(a, b, n, -)
195
-#define ADD8(a, b, n) SARITH8(a, b, n, +)
196
-#define SUB8(a, b, n) SARITH8(a, b, n, -)
197
-#define PFX s
198
-#define ARITH_GE
199
-
200
-#include "op_addsub.h"
201
-
202
-/* Unsigned modulo arithmetic. */
203
-#define ADD16(a, b, n) do { \
204
- uint32_t sum; \
205
- sum = (uint32_t)(uint16_t)(a) + (uint32_t)(uint16_t)(b); \
206
- RESULT(sum, n, 16); \
207
- if ((sum >> 16) == 1) \
208
- ge |= 3 << (n * 2); \
209
- } while (0)
210
-
211
-#define ADD8(a, b, n) do { \
212
- uint32_t sum; \
213
- sum = (uint32_t)(uint8_t)(a) + (uint32_t)(uint8_t)(b); \
214
- RESULT(sum, n, 8); \
215
- if ((sum >> 8) == 1) \
216
- ge |= 1 << n; \
217
- } while (0)
218
-
219
-#define SUB16(a, b, n) do { \
220
- uint32_t sum; \
221
- sum = (uint32_t)(uint16_t)(a) - (uint32_t)(uint16_t)(b); \
222
- RESULT(sum, n, 16); \
223
- if ((sum >> 16) == 0) \
224
- ge |= 3 << (n * 2); \
225
- } while (0)
226
-
227
-#define SUB8(a, b, n) do { \
228
- uint32_t sum; \
229
- sum = (uint32_t)(uint8_t)(a) - (uint32_t)(uint8_t)(b); \
230
- RESULT(sum, n, 8); \
231
- if ((sum >> 8) == 0) \
232
- ge |= 1 << n; \
233
- } while (0)
234
-
235
-#define PFX u
236
-#define ARITH_GE
237
-
238
-#include "op_addsub.h"
239
-
240
-/* Halved signed arithmetic. */
241
-#define ADD16(a, b, n) \
242
- RESULT(((int32_t)(int16_t)(a) + (int32_t)(int16_t)(b)) >> 1, n, 16)
243
-#define SUB16(a, b, n) \
244
- RESULT(((int32_t)(int16_t)(a) - (int32_t)(int16_t)(b)) >> 1, n, 16)
245
-#define ADD8(a, b, n) \
246
- RESULT(((int32_t)(int8_t)(a) + (int32_t)(int8_t)(b)) >> 1, n, 8)
247
-#define SUB8(a, b, n) \
248
- RESULT(((int32_t)(int8_t)(a) - (int32_t)(int8_t)(b)) >> 1, n, 8)
249
-#define PFX sh
250
-
251
-#include "op_addsub.h"
252
-
253
-/* Halved unsigned arithmetic. */
254
-#define ADD16(a, b, n) \
255
- RESULT(((uint32_t)(uint16_t)(a) + (uint32_t)(uint16_t)(b)) >> 1, n, 16)
256
-#define SUB16(a, b, n) \
257
- RESULT(((uint32_t)(uint16_t)(a) - (uint32_t)(uint16_t)(b)) >> 1, n, 16)
258
-#define ADD8(a, b, n) \
259
- RESULT(((uint32_t)(uint8_t)(a) + (uint32_t)(uint8_t)(b)) >> 1, n, 8)
260
-#define SUB8(a, b, n) \
261
- RESULT(((uint32_t)(uint8_t)(a) - (uint32_t)(uint8_t)(b)) >> 1, n, 8)
262
-#define PFX uh
263
-
264
-#include "op_addsub.h"
265
-
266
-static inline uint8_t do_usad(uint8_t a, uint8_t b)
267
-{
268
- if (a > b) {
269
- return a - b;
270
- } else {
271
- return b - a;
272
- }
273
-}
274
-
275
-/* Unsigned sum of absolute byte differences. */
276
-uint32_t HELPER(usad8)(uint32_t a, uint32_t b)
277
-{
278
- uint32_t sum;
279
- sum = do_usad(a, b);
280
- sum += do_usad(a >> 8, b >> 8);
281
- sum += do_usad(a >> 16, b >> 16);
282
- sum += do_usad(a >> 24, b >> 24);
283
- return sum;
284
-}
285
-
286
-/* For ARMv6 SEL instruction. */
287
-uint32_t HELPER(sel_flags)(uint32_t flags, uint32_t a, uint32_t b)
288
-{
289
- uint32_t mask;
290
-
291
- mask = 0;
292
- if (flags & 1) {
293
- mask |= 0xff;
294
- }
295
- if (flags & 2) {
296
- mask |= 0xff00;
297
- }
298
- if (flags & 4) {
299
- mask |= 0xff0000;
300
- }
301
- if (flags & 8) {
302
- mask |= 0xff000000;
303
- }
304
- return (a & mask) | (b & ~mask);
305
-}
306
-
307
-/*
308
- * CRC helpers.
309
- * The upper bytes of val (above the number specified by 'bytes') must have
310
- * been zeroed out by the caller.
311
- */
312
-uint32_t HELPER(crc32)(uint32_t acc, uint32_t val, uint32_t bytes)
313
-{
314
- uint8_t buf[4];
315
-
316
- stl_le_p(buf, val);
317
-
318
- /* zlib crc32 converts the accumulator and output to one's complement. */
319
- return crc32(acc ^ 0xffffffff, buf, bytes) ^ 0xffffffff;
320
-}
321
-
322
-uint32_t HELPER(crc32c)(uint32_t acc, uint32_t val, uint32_t bytes)
323
-{
324
- uint8_t buf[4];
325
-
326
- stl_le_p(buf, val);
327
-
328
- /* Linux crc32c converts the output to one's complement. */
329
- return crc32c(acc, buf, bytes) ^ 0xffffffff;
330
-}
331
332
/*
333
* Return the exception level to which FP-disabled exceptions should
334
diff --git a/target/arm/tcg/arith_helper.c b/target/arm/tcg/arith_helper.c
335
new file mode 100644
336
index XXXXXXX..XXXXXXX
337
--- /dev/null
338
+++ b/target/arm/tcg/arith_helper.c
339
@@ -XXX,XX +XXX,XX @@
340
+/*
341
+ * ARM generic helpers for various arithmetical operations.
342
+ *
343
+ * This code is licensed under the GNU GPL v2 or later.
344
+ *
345
+ * SPDX-License-Identifier: GPL-2.0-or-later
346
+ */
347
+#include "qemu/osdep.h"
348
+#include "cpu.h"
349
+#include "exec/helper-proto.h"
350
+#include "qemu/crc32c.h"
351
+#include <zlib.h> /* for crc32 */
352
+
353
+/*
354
+ * Note that signed overflow is undefined in C. The following routines are
355
+ * careful to use unsigned types where modulo arithmetic is required.
356
+ * Failure to do so _will_ break on newer gcc.
357
+ */
358
+
359
+/* Signed saturating arithmetic. */
360
+
361
+/* Perform 16-bit signed saturating addition. */
362
+static inline uint16_t add16_sat(uint16_t a, uint16_t b)
363
+{
364
+ uint16_t res;
365
+
366
+ res = a + b;
367
+ if (((res ^ a) & 0x8000) && !((a ^ b) & 0x8000)) {
368
+ if (a & 0x8000) {
369
+ res = 0x8000;
370
+ } else {
371
+ res = 0x7fff;
372
+ }
373
+ }
374
+ return res;
375
+}
376
+
377
+/* Perform 8-bit signed saturating addition. */
378
+static inline uint8_t add8_sat(uint8_t a, uint8_t b)
379
+{
380
+ uint8_t res;
381
+
382
+ res = a + b;
383
+ if (((res ^ a) & 0x80) && !((a ^ b) & 0x80)) {
384
+ if (a & 0x80) {
385
+ res = 0x80;
386
+ } else {
387
+ res = 0x7f;
388
+ }
389
+ }
390
+ return res;
391
+}
392
+
393
+/* Perform 16-bit signed saturating subtraction. */
394
+static inline uint16_t sub16_sat(uint16_t a, uint16_t b)
395
+{
396
+ uint16_t res;
397
+
398
+ res = a - b;
399
+ if (((res ^ a) & 0x8000) && ((a ^ b) & 0x8000)) {
400
+ if (a & 0x8000) {
401
+ res = 0x8000;
402
+ } else {
403
+ res = 0x7fff;
404
+ }
405
+ }
406
+ return res;
407
+}
408
+
409
+/* Perform 8-bit signed saturating subtraction. */
410
+static inline uint8_t sub8_sat(uint8_t a, uint8_t b)
411
+{
412
+ uint8_t res;
413
+
414
+ res = a - b;
415
+ if (((res ^ a) & 0x80) && ((a ^ b) & 0x80)) {
416
+ if (a & 0x80) {
417
+ res = 0x80;
418
+ } else {
419
+ res = 0x7f;
420
+ }
421
+ }
422
+ return res;
423
+}
424
+
425
+#define ADD16(a, b, n) RESULT(add16_sat(a, b), n, 16);
426
+#define SUB16(a, b, n) RESULT(sub16_sat(a, b), n, 16);
427
+#define ADD8(a, b, n) RESULT(add8_sat(a, b), n, 8);
428
+#define SUB8(a, b, n) RESULT(sub8_sat(a, b), n, 8);
429
+#define PFX q
430
+
431
+#include "op_addsub.c.inc"
432
+
433
+/* Unsigned saturating arithmetic. */
434
+static inline uint16_t add16_usat(uint16_t a, uint16_t b)
435
+{
436
+ uint16_t res;
437
+ res = a + b;
438
+ if (res < a) {
439
+ res = 0xffff;
440
+ }
441
+ return res;
442
+}
443
+
444
+static inline uint16_t sub16_usat(uint16_t a, uint16_t b)
445
+{
446
+ if (a > b) {
447
+ return a - b;
448
+ } else {
449
+ return 0;
450
+ }
451
+}
452
+
453
+static inline uint8_t add8_usat(uint8_t a, uint8_t b)
454
+{
455
+ uint8_t res;
456
+ res = a + b;
457
+ if (res < a) {
458
+ res = 0xff;
459
+ }
460
+ return res;
461
+}
462
+
463
+static inline uint8_t sub8_usat(uint8_t a, uint8_t b)
464
+{
465
+ if (a > b) {
466
+ return a - b;
467
+ } else {
468
+ return 0;
469
+ }
470
+}
471
+
472
+#define ADD16(a, b, n) RESULT(add16_usat(a, b), n, 16);
473
+#define SUB16(a, b, n) RESULT(sub16_usat(a, b), n, 16);
474
+#define ADD8(a, b, n) RESULT(add8_usat(a, b), n, 8);
475
+#define SUB8(a, b, n) RESULT(sub8_usat(a, b), n, 8);
476
+#define PFX uq
477
+
478
+#include "op_addsub.c.inc"
479
+
480
+/* Signed modulo arithmetic. */
481
+#define SARITH16(a, b, n, op) do { \
482
+ int32_t sum; \
483
+ sum = (int32_t)(int16_t)(a) op (int32_t)(int16_t)(b); \
484
+ RESULT(sum, n, 16); \
485
+ if (sum >= 0) \
486
+ ge |= 3 << (n * 2); \
487
+ } while (0)
488
+
489
+#define SARITH8(a, b, n, op) do { \
490
+ int32_t sum; \
491
+ sum = (int32_t)(int8_t)(a) op (int32_t)(int8_t)(b); \
492
+ RESULT(sum, n, 8); \
493
+ if (sum >= 0) \
494
+ ge |= 1 << n; \
495
+ } while (0)
496
+
497
+
498
+#define ADD16(a, b, n) SARITH16(a, b, n, +)
499
+#define SUB16(a, b, n) SARITH16(a, b, n, -)
500
+#define ADD8(a, b, n) SARITH8(a, b, n, +)
501
+#define SUB8(a, b, n) SARITH8(a, b, n, -)
502
+#define PFX s
503
+#define ARITH_GE
504
+
505
+#include "op_addsub.c.inc"
506
+
507
+/* Unsigned modulo arithmetic. */
508
+#define ADD16(a, b, n) do { \
509
+ uint32_t sum; \
510
+ sum = (uint32_t)(uint16_t)(a) + (uint32_t)(uint16_t)(b); \
511
+ RESULT(sum, n, 16); \
512
+ if ((sum >> 16) == 1) \
513
+ ge |= 3 << (n * 2); \
514
+ } while (0)
515
+
516
+#define ADD8(a, b, n) do { \
517
+ uint32_t sum; \
518
+ sum = (uint32_t)(uint8_t)(a) + (uint32_t)(uint8_t)(b); \
519
+ RESULT(sum, n, 8); \
520
+ if ((sum >> 8) == 1) \
521
+ ge |= 1 << n; \
522
+ } while (0)
523
+
524
+#define SUB16(a, b, n) do { \
525
+ uint32_t sum; \
526
+ sum = (uint32_t)(uint16_t)(a) - (uint32_t)(uint16_t)(b); \
527
+ RESULT(sum, n, 16); \
528
+ if ((sum >> 16) == 0) \
529
+ ge |= 3 << (n * 2); \
530
+ } while (0)
531
+
532
+#define SUB8(a, b, n) do { \
533
+ uint32_t sum; \
534
+ sum = (uint32_t)(uint8_t)(a) - (uint32_t)(uint8_t)(b); \
535
+ RESULT(sum, n, 8); \
536
+ if ((sum >> 8) == 0) \
537
+ ge |= 1 << n; \
538
+ } while (0)
539
+
540
+#define PFX u
541
+#define ARITH_GE
542
+
543
+#include "op_addsub.c.inc"
544
+
545
+/* Halved signed arithmetic. */
546
+#define ADD16(a, b, n) \
547
+ RESULT(((int32_t)(int16_t)(a) + (int32_t)(int16_t)(b)) >> 1, n, 16)
548
+#define SUB16(a, b, n) \
549
+ RESULT(((int32_t)(int16_t)(a) - (int32_t)(int16_t)(b)) >> 1, n, 16)
550
+#define ADD8(a, b, n) \
551
+ RESULT(((int32_t)(int8_t)(a) + (int32_t)(int8_t)(b)) >> 1, n, 8)
552
+#define SUB8(a, b, n) \
553
+ RESULT(((int32_t)(int8_t)(a) - (int32_t)(int8_t)(b)) >> 1, n, 8)
554
+#define PFX sh
555
+
556
+#include "op_addsub.c.inc"
557
+
558
+/* Halved unsigned arithmetic. */
559
+#define ADD16(a, b, n) \
560
+ RESULT(((uint32_t)(uint16_t)(a) + (uint32_t)(uint16_t)(b)) >> 1, n, 16)
561
+#define SUB16(a, b, n) \
562
+ RESULT(((uint32_t)(uint16_t)(a) - (uint32_t)(uint16_t)(b)) >> 1, n, 16)
563
+#define ADD8(a, b, n) \
564
+ RESULT(((uint32_t)(uint8_t)(a) + (uint32_t)(uint8_t)(b)) >> 1, n, 8)
565
+#define SUB8(a, b, n) \
566
+ RESULT(((uint32_t)(uint8_t)(a) - (uint32_t)(uint8_t)(b)) >> 1, n, 8)
567
+#define PFX uh
568
+
569
+#include "op_addsub.c.inc"
570
+
571
+static inline uint8_t do_usad(uint8_t a, uint8_t b)
572
+{
573
+ if (a > b) {
574
+ return a - b;
575
+ } else {
576
+ return b - a;
577
+ }
578
+}
579
+
580
+/* Unsigned sum of absolute byte differences. */
581
+uint32_t HELPER(usad8)(uint32_t a, uint32_t b)
582
+{
583
+ uint32_t sum;
584
+ sum = do_usad(a, b);
585
+ sum += do_usad(a >> 8, b >> 8);
586
+ sum += do_usad(a >> 16, b >> 16);
587
+ sum += do_usad(a >> 24, b >> 24);
588
+ return sum;
589
+}
590
+
591
+/* For ARMv6 SEL instruction. */
592
+uint32_t HELPER(sel_flags)(uint32_t flags, uint32_t a, uint32_t b)
593
+{
594
+ uint32_t mask;
595
+
596
+ mask = 0;
597
+ if (flags & 1) {
598
+ mask |= 0xff;
599
+ }
600
+ if (flags & 2) {
601
+ mask |= 0xff00;
602
+ }
603
+ if (flags & 4) {
604
+ mask |= 0xff0000;
605
+ }
606
+ if (flags & 8) {
607
+ mask |= 0xff000000;
608
+ }
609
+ return (a & mask) | (b & ~mask);
610
+}
611
+
612
+/*
613
+ * CRC helpers.
614
+ * The upper bytes of val (above the number specified by 'bytes') must have
615
+ * been zeroed out by the caller.
616
+ */
617
+uint32_t HELPER(crc32)(uint32_t acc, uint32_t val, uint32_t bytes)
618
+{
619
+ uint8_t buf[4];
620
+
621
+ stl_le_p(buf, val);
622
+
623
+ /* zlib crc32 converts the accumulator and output to one's complement. */
624
+ return crc32(acc ^ 0xffffffff, buf, bytes) ^ 0xffffffff;
625
+}
626
+
627
+uint32_t HELPER(crc32c)(uint32_t acc, uint32_t val, uint32_t bytes)
628
+{
629
+ uint8_t buf[4];
630
+
631
+ stl_le_p(buf, val);
632
+
633
+ /* Linux crc32c converts the output to one's complement. */
634
+ return crc32c(acc, buf, bytes) ^ 0xffffffff;
635
+}
636
diff --git a/target/arm/op_addsub.h b/target/arm/tcg/op_addsub.c.inc
637
similarity index 100%
638
rename from target/arm/op_addsub.h
639
rename to target/arm/tcg/op_addsub.c.inc
640
diff --git a/target/arm/tcg/meson.build b/target/arm/tcg/meson.build
641
index XXXXXXX..XXXXXXX 100644
642
--- a/target/arm/tcg/meson.build
643
+++ b/target/arm/tcg/meson.build
644
@@ -XXX,XX +XXX,XX @@ arm_ss.add(files(
645
'tlb_helper.c',
646
'vec_helper.c',
647
'tlb-insns.c',
648
+ 'arith_helper.c',
649
))
650
651
arm_ss.add(when: 'TARGET_AARCH64', if_true: files(
652
--
653
2.34.1
654
655
diff view generated by jsdifflib
1
The FMOPA (widening) SME instruction takes pairs of half-precision
1
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
floating point values, widens them to single-precision, does a
3
two-way dot product and accumulates the results into a
4
single-precision destination. We don't quite correctly handle the
5
FPCR bits FZ and FZ16 which control flushing of denormal inputs and
6
outputs. This is because at the moment we pass a single float_status
7
value to the helper function, which then uses that configuration for
8
all the fp operations it does. However, because the inputs to this
9
operation are float16 and the outputs are float32 we need to use the
10
fp_status_f16 for the float16 input widening but the normal fp_status
11
for everything else. Otherwise we will apply the flushing control
12
FPCR.FZ16 to the 32-bit output rather than the FPCR.FZ control, and
13
incorrectly flush a denormal output to zero when we should not (or
14
vice-versa).
15
2
16
(In commit 207d30b5fdb5b we tried to fix the FZ handling but
3
Before changing default pauth algorithm, we need to make sure current
17
didn't get it right, switching from "use FPCR.FZ for everything" to
4
default one (QARMA5) can still be selected.
18
"use FPCR.FZ16 for everything".)
19
5
20
Pass the CPU env to the sme_fmopa_h helper instead of an fp_status
6
$ qemu-system-aarch64 -cpu max,pauth-qarma5=on ...
21
pointer, and have the helper pass an extra fp_status into the
22
f16_dotadd() function so that we can use the right status for the
23
right parts of this operation.
24
7
25
Cc: qemu-stable@nongnu.org
8
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
26
Fixes: 207d30b5fdb5 ("target/arm: Use FPST_F16 for SME FMOPA (widening)")
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
27
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2373
10
Message-id: 20241219183211.3493974-2-pierrick.bouvier@linaro.org
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
30
---
12
---
31
target/arm/tcg/helper-sme.h | 2 +-
13
docs/system/arm/cpu-features.rst | 5 ++++-
32
target/arm/tcg/sme_helper.c | 39 +++++++++++++++++++++++-----------
14
target/arm/cpu.h | 1 +
33
target/arm/tcg/translate-sme.c | 25 ++++++++++++++++++++--
15
target/arm/arm-qmp-cmds.c | 2 +-
34
3 files changed, 51 insertions(+), 15 deletions(-)
16
target/arm/cpu64.c | 20 ++++++++++++++------
17
tests/qtest/arm-cpu-features.c | 15 +++++++++++----
18
5 files changed, 31 insertions(+), 12 deletions(-)
35
19
36
diff --git a/target/arm/tcg/helper-sme.h b/target/arm/tcg/helper-sme.h
20
diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst
37
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/tcg/helper-sme.h
22
--- a/docs/system/arm/cpu-features.rst
39
+++ b/target/arm/tcg/helper-sme.h
23
+++ b/docs/system/arm/cpu-features.rst
40
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(sme_addha_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
24
@@ -XXX,XX +XXX,XX @@ Below is the list of TCG VCPU features and their descriptions.
41
DEF_HELPER_FLAGS_5(sme_addva_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
25
``pauth-qarma3``
42
26
When ``pauth`` is enabled, select the architected QARMA3 algorithm.
43
DEF_HELPER_FLAGS_7(sme_fmopa_h, TCG_CALL_NO_RWG,
27
44
- void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
28
-Without either ``pauth-impdef`` or ``pauth-qarma3`` enabled,
45
+ void, ptr, ptr, ptr, ptr, ptr, env, i32)
29
+``pauth-qarma5``
46
DEF_HELPER_FLAGS_7(sme_fmopa_s, TCG_CALL_NO_RWG,
30
+ When ``pauth`` is enabled, select the architected QARMA5 algorithm.
47
void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
31
+
48
DEF_HELPER_FLAGS_7(sme_fmopa_d, TCG_CALL_NO_RWG,
32
+Without ``pauth-impdef``, ``pauth-qarma3`` or ``pauth-qarma5`` enabled,
49
diff --git a/target/arm/tcg/sme_helper.c b/target/arm/tcg/sme_helper.c
33
the architected QARMA5 algorithm is used. The architected QARMA5
34
and QARMA3 algorithms have good cryptographic properties, but can
35
be quite slow to emulate. The impdef algorithm used by QEMU is
36
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
50
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
51
--- a/target/arm/tcg/sme_helper.c
38
--- a/target/arm/cpu.h
52
+++ b/target/arm/tcg/sme_helper.c
39
+++ b/target/arm/cpu.h
53
@@ -XXX,XX +XXX,XX @@ static inline uint32_t f16mop_adj_pair(uint32_t pair, uint32_t pg, uint32_t neg)
40
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
41
bool prop_pauth;
42
bool prop_pauth_impdef;
43
bool prop_pauth_qarma3;
44
+ bool prop_pauth_qarma5;
45
bool prop_lpa2;
46
47
/* DCZ blocksize, in log_2(words), ie low 4 bits of DCZID_EL0 */
48
diff --git a/target/arm/arm-qmp-cmds.c b/target/arm/arm-qmp-cmds.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/target/arm/arm-qmp-cmds.c
51
+++ b/target/arm/arm-qmp-cmds.c
52
@@ -XXX,XX +XXX,XX @@ static const char *cpu_model_advertised_features[] = {
53
"sve640", "sve768", "sve896", "sve1024", "sve1152", "sve1280",
54
"sve1408", "sve1536", "sve1664", "sve1792", "sve1920", "sve2048",
55
"kvm-no-adjvtime", "kvm-steal-time",
56
- "pauth", "pauth-impdef", "pauth-qarma3",
57
+ "pauth", "pauth-impdef", "pauth-qarma3", "pauth-qarma5",
58
NULL
59
};
60
61
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/target/arm/cpu64.c
64
+++ b/target/arm/cpu64.c
65
@@ -XXX,XX +XXX,XX @@ void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp)
66
}
67
68
if (cpu->prop_pauth) {
69
- if (cpu->prop_pauth_impdef && cpu->prop_pauth_qarma3) {
70
+ if ((cpu->prop_pauth_impdef && cpu->prop_pauth_qarma3) ||
71
+ (cpu->prop_pauth_impdef && cpu->prop_pauth_qarma5) ||
72
+ (cpu->prop_pauth_qarma3 && cpu->prop_pauth_qarma5)) {
73
error_setg(errp,
74
- "cannot enable both pauth-impdef and pauth-qarma3");
75
+ "cannot enable pauth-impdef, pauth-qarma3 and "
76
+ "pauth-qarma5 at the same time");
77
return;
78
}
79
80
@@ -XXX,XX +XXX,XX @@ void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp)
81
} else if (cpu->prop_pauth_qarma3) {
82
isar2 = FIELD_DP64(isar2, ID_AA64ISAR2, APA3, features);
83
isar2 = FIELD_DP64(isar2, ID_AA64ISAR2, GPA3, 1);
84
- } else {
85
+ } else { /* default is pauth-qarma5 */
86
isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, APA, features);
87
isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, GPA, 1);
88
}
89
- } else if (cpu->prop_pauth_impdef || cpu->prop_pauth_qarma3) {
90
- error_setg(errp, "cannot enable pauth-impdef or "
91
- "pauth-qarma3 without pauth");
92
+ } else if (cpu->prop_pauth_impdef ||
93
+ cpu->prop_pauth_qarma3 ||
94
+ cpu->prop_pauth_qarma5) {
95
+ error_setg(errp, "cannot enable pauth-impdef, pauth-qarma3 or "
96
+ "pauth-qarma5 without pauth");
97
error_append_hint(errp, "Add pauth=on to the CPU property list.\n");
98
}
99
}
100
@@ -XXX,XX +XXX,XX @@ static const Property arm_cpu_pauth_impdef_property =
101
DEFINE_PROP_BOOL("pauth-impdef", ARMCPU, prop_pauth_impdef, false);
102
static const Property arm_cpu_pauth_qarma3_property =
103
DEFINE_PROP_BOOL("pauth-qarma3", ARMCPU, prop_pauth_qarma3, false);
104
+static Property arm_cpu_pauth_qarma5_property =
105
+ DEFINE_PROP_BOOL("pauth-qarma5", ARMCPU, prop_pauth_qarma5, false);
106
107
void aarch64_add_pauth_properties(Object *obj)
108
{
109
@@ -XXX,XX +XXX,XX @@ void aarch64_add_pauth_properties(Object *obj)
110
} else {
111
qdev_property_add_static(DEVICE(obj), &arm_cpu_pauth_impdef_property);
112
qdev_property_add_static(DEVICE(obj), &arm_cpu_pauth_qarma3_property);
113
+ qdev_property_add_static(DEVICE(obj), &arm_cpu_pauth_qarma5_property);
114
}
54
}
115
}
55
116
56
static float32 f16_dotadd(float32 sum, uint32_t e1, uint32_t e2,
117
diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
57
- float_status *s_std, float_status *s_odd)
118
index XXXXXXX..XXXXXXX 100644
58
+ float_status *s_f16, float_status *s_std,
119
--- a/tests/qtest/arm-cpu-features.c
59
+ float_status *s_odd)
120
+++ b/tests/qtest/arm-cpu-features.c
60
{
121
@@ -XXX,XX +XXX,XX @@ static void pauth_tests_default(QTestState *qts, const char *cpu_type)
61
- float64 e1r = float16_to_float64(e1 & 0xffff, true, s_std);
122
assert_has_feature_enabled(qts, cpu_type, "pauth");
62
- float64 e1c = float16_to_float64(e1 >> 16, true, s_std);
123
assert_has_feature_disabled(qts, cpu_type, "pauth-impdef");
63
- float64 e2r = float16_to_float64(e2 & 0xffff, true, s_std);
124
assert_has_feature_disabled(qts, cpu_type, "pauth-qarma3");
64
- float64 e2c = float16_to_float64(e2 >> 16, true, s_std);
125
+ assert_has_feature_disabled(qts, cpu_type, "pauth-qarma5");
65
+ /*
126
assert_set_feature(qts, cpu_type, "pauth", false);
66
+ * We need three different float_status for different parts of this
127
assert_set_feature(qts, cpu_type, "pauth", true);
67
+ * operation:
128
assert_set_feature(qts, cpu_type, "pauth-impdef", true);
68
+ * - the input conversion of the float16 values must use the
129
assert_set_feature(qts, cpu_type, "pauth-impdef", false);
69
+ * f16-specific float_status, so that the FPCR.FZ16 control is applied
130
assert_set_feature(qts, cpu_type, "pauth-qarma3", true);
70
+ * - operations on float32 including the final accumulation must use
131
assert_set_feature(qts, cpu_type, "pauth-qarma3", false);
71
+ * the normal float_status, so that FPCR.FZ is applied
132
+ assert_set_feature(qts, cpu_type, "pauth-qarma5", true);
72
+ * - we have pre-set-up copy of s_std which is set to round-to-odd,
133
+ assert_set_feature(qts, cpu_type, "pauth-qarma5", false);
73
+ * for the multiply (see below)
134
assert_error(qts, cpu_type,
74
+ */
135
- "cannot enable pauth-impdef or pauth-qarma3 without pauth",
75
+ float64 e1r = float16_to_float64(e1 & 0xffff, true, s_f16);
136
+ "cannot enable pauth-impdef, pauth-qarma3 or pauth-qarma5 without pauth",
76
+ float64 e1c = float16_to_float64(e1 >> 16, true, s_f16);
137
"{ 'pauth': false, 'pauth-impdef': true }");
77
+ float64 e2r = float16_to_float64(e2 & 0xffff, true, s_f16);
138
assert_error(qts, cpu_type,
78
+ float64 e2c = float16_to_float64(e2 >> 16, true, s_f16);
139
- "cannot enable pauth-impdef or pauth-qarma3 without pauth",
79
float64 t64;
140
+ "cannot enable pauth-impdef, pauth-qarma3 or pauth-qarma5 without pauth",
80
float32 t32;
141
"{ 'pauth': false, 'pauth-qarma3': true }");
81
142
assert_error(qts, cpu_type,
82
@@ -XXX,XX +XXX,XX @@ static float32 f16_dotadd(float32 sum, uint32_t e1, uint32_t e2,
143
- "cannot enable both pauth-impdef and pauth-qarma3",
144
- "{ 'pauth': true, 'pauth-impdef': true, 'pauth-qarma3': true }");
145
+ "cannot enable pauth-impdef, pauth-qarma3 or pauth-qarma5 without pauth",
146
+ "{ 'pauth': false, 'pauth-qarma5': true }");
147
+ assert_error(qts, cpu_type,
148
+ "cannot enable pauth-impdef, pauth-qarma3 and pauth-qarma5 at the same time",
149
+ "{ 'pauth': true, 'pauth-impdef': true, 'pauth-qarma3': true,"
150
+ " 'pauth-qarma5': true }");
83
}
151
}
84
152
85
void HELPER(sme_fmopa_h)(void *vza, void *vzn, void *vzm, void *vpn,
153
static void test_query_cpu_model_expansion(const void *data)
86
- void *vpm, void *vst, uint32_t desc)
87
+ void *vpm, CPUARMState *env, uint32_t desc)
88
{
89
intptr_t row, col, oprsz = simd_maxsz(desc);
90
uint32_t neg = simd_data(desc) * 0x80008000u;
91
uint16_t *pn = vpn, *pm = vpm;
92
- float_status fpst_odd, fpst_std;
93
+ float_status fpst_odd, fpst_std, fpst_f16;
94
95
/*
96
- * Make a copy of float_status because this operation does not
97
- * update the cumulative fp exception status. It also produces
98
- * default nans. Make a second copy with round-to-odd -- see above.
99
+ * Make copies of fp_status and fp_status_f16, because this operation
100
+ * does not update the cumulative fp exception status. It also
101
+ * produces default NaNs. We also need a second copy of fp_status with
102
+ * round-to-odd -- see above.
103
*/
104
- fpst_std = *(float_status *)vst;
105
+ fpst_f16 = env->vfp.fp_status_f16;
106
+ fpst_std = env->vfp.fp_status;
107
set_default_nan_mode(true, &fpst_std);
108
+ set_default_nan_mode(true, &fpst_f16);
109
fpst_odd = fpst_std;
110
set_float_rounding_mode(float_round_to_odd, &fpst_odd);
111
112
@@ -XXX,XX +XXX,XX @@ void HELPER(sme_fmopa_h)(void *vza, void *vzn, void *vzm, void *vpn,
113
uint32_t m = *(uint32_t *)(vzm + H1_4(col));
114
115
m = f16mop_adj_pair(m, pcol, 0);
116
- *a = f16_dotadd(*a, n, m, &fpst_std, &fpst_odd);
117
+ *a = f16_dotadd(*a, n, m,
118
+ &fpst_f16, &fpst_std, &fpst_odd);
119
}
120
col += 4;
121
pcol >>= 4;
122
diff --git a/target/arm/tcg/translate-sme.c b/target/arm/tcg/translate-sme.c
123
index XXXXXXX..XXXXXXX 100644
124
--- a/target/arm/tcg/translate-sme.c
125
+++ b/target/arm/tcg/translate-sme.c
126
@@ -XXX,XX +XXX,XX @@ static bool do_outprod_fpst(DisasContext *s, arg_op *a, MemOp esz,
127
return true;
128
}
129
130
-TRANS_FEAT(FMOPA_h, aa64_sme, do_outprod_fpst, a,
131
- MO_32, FPST_FPCR_F16, gen_helper_sme_fmopa_h)
132
+static bool do_outprod_env(DisasContext *s, arg_op *a, MemOp esz,
133
+ gen_helper_gvec_5_ptr *fn)
134
+{
135
+ int svl = streaming_vec_reg_size(s);
136
+ uint32_t desc = simd_desc(svl, svl, a->sub);
137
+ TCGv_ptr za, zn, zm, pn, pm;
138
+
139
+ if (!sme_smza_enabled_check(s)) {
140
+ return true;
141
+ }
142
+
143
+ za = get_tile(s, esz, a->zad);
144
+ zn = vec_full_reg_ptr(s, a->zn);
145
+ zm = vec_full_reg_ptr(s, a->zm);
146
+ pn = pred_full_reg_ptr(s, a->pn);
147
+ pm = pred_full_reg_ptr(s, a->pm);
148
+
149
+ fn(za, zn, zm, pn, pm, tcg_env, tcg_constant_i32(desc));
150
+ return true;
151
+}
152
+
153
+TRANS_FEAT(FMOPA_h, aa64_sme, do_outprod_env, a,
154
+ MO_32, gen_helper_sme_fmopa_h)
155
TRANS_FEAT(FMOPA_s, aa64_sme, do_outprod_fpst, a,
156
MO_32, FPST_FPCR, gen_helper_sme_fmopa_s)
157
TRANS_FEAT(FMOPA_d, aa64_sme_f64f64, do_outprod_fpst, a,
158
--
154
--
159
2.34.1
155
2.34.1
diff view generated by jsdifflib
New patch
1
The pauth-3 test explicitly tests that a computation of the
2
pointer-authentication produces the expected result. This means that
3
it must be run with the QARMA5 algorithm.
1
4
5
Explicitly set the pauth algorithm when running this test, so that it
6
doesn't break when we change the default algorithm the 'max' CPU
7
uses.
8
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
tests/tcg/aarch64/Makefile.softmmu-target | 3 +++
12
1 file changed, 3 insertions(+)
13
14
diff --git a/tests/tcg/aarch64/Makefile.softmmu-target b/tests/tcg/aarch64/Makefile.softmmu-target
15
index XXXXXXX..XXXXXXX 100644
16
--- a/tests/tcg/aarch64/Makefile.softmmu-target
17
+++ b/tests/tcg/aarch64/Makefile.softmmu-target
18
@@ -XXX,XX +XXX,XX @@ EXTRA_RUNS+=run-memory-replay
19
20
ifneq ($(CROSS_CC_HAS_ARMV8_3),)
21
pauth-3: CFLAGS += $(CROSS_CC_HAS_ARMV8_3)
22
+# This test explicitly checks the output of the pauth operation so we
23
+# must force the use of the QARMA5 algorithm for it.
24
+run-pauth-3: QEMU_BASE_MACHINE=-M virt -cpu max,pauth-qarma5=on -display none
25
else
26
pauth-3:
27
    $(call skip-test, "BUILD of $@", "missing compiler support")
28
--
29
2.34.1
diff view generated by jsdifflib
New patch
1
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
2
3
Pointer authentication on aarch64 is pretty expensive (up to 50% of
4
execution time) when running a virtual machine with tcg and -cpu max
5
(which enables pauth=on).
6
7
The advice is always: use pauth-impdef=on.
8
Our documentation even mentions it "by default" in
9
docs/system/introduction.rst.
10
11
Thus, we change the default to use impdef by default. This does not
12
affect kvm or hvf acceleration, since pauth algorithm used is the one
13
from host cpu.
14
15
This change is retro compatible, in terms of cli, with previous
16
versions, as the semantic of using -cpu max,pauth-impdef=on, and -cpu
17
max,pauth-qarma3=on is preserved.
18
The new option introduced in previous patch and matching old default is
19
-cpu max,pauth-qarma5=on.
20
It is retro compatible with migration as well, by defining a backcompat
21
property, that will use qarma5 by default for virt machine <= 9.2.
22
Tested by saving and restoring a vm from qemu 9.2.0 into qemu-master
23
(10.0) for cpus neoverse-n2 and max.
24
25
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
26
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
27
Message-id: 20241219183211.3493974-3-pierrick.bouvier@linaro.org
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
29
---
30
docs/system/arm/cpu-features.rst | 2 +-
31
docs/system/introduction.rst | 2 +-
32
target/arm/cpu.h | 3 +++
33
hw/core/machine.c | 4 +++-
34
target/arm/cpu.c | 2 ++
35
target/arm/cpu64.c | 22 ++++++++++++++++------
36
6 files changed, 26 insertions(+), 9 deletions(-)
37
38
diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst
39
index XXXXXXX..XXXXXXX 100644
40
--- a/docs/system/arm/cpu-features.rst
41
+++ b/docs/system/arm/cpu-features.rst
42
@@ -XXX,XX +XXX,XX @@ Below is the list of TCG VCPU features and their descriptions.
43
When ``pauth`` is enabled, select the architected QARMA5 algorithm.
44
45
Without ``pauth-impdef``, ``pauth-qarma3`` or ``pauth-qarma5`` enabled,
46
-the architected QARMA5 algorithm is used. The architected QARMA5
47
+the QEMU impdef algorithm is used. The architected QARMA5
48
and QARMA3 algorithms have good cryptographic properties, but can
49
be quite slow to emulate. The impdef algorithm used by QEMU is
50
non-cryptographic but significantly faster.
51
diff --git a/docs/system/introduction.rst b/docs/system/introduction.rst
52
index XXXXXXX..XXXXXXX 100644
53
--- a/docs/system/introduction.rst
54
+++ b/docs/system/introduction.rst
55
@@ -XXX,XX +XXX,XX @@ would default to it anyway.
56
57
.. code::
58
59
- -cpu max,pauth-impdef=on \
60
+ -cpu max \
61
-smp 4 \
62
-accel tcg \
63
64
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
65
index XXXXXXX..XXXXXXX 100644
66
--- a/target/arm/cpu.h
67
+++ b/target/arm/cpu.h
68
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
69
/* QOM property to indicate we should use the back-compat CNTFRQ default */
70
bool backcompat_cntfrq;
71
72
+ /* QOM property to indicate we should use the back-compat QARMA5 default */
73
+ bool backcompat_pauth_default_use_qarma5;
74
+
75
/* Specify the number of cores in this CPU cluster. Used for the L2CTLR
76
* register.
77
*/
78
diff --git a/hw/core/machine.c b/hw/core/machine.c
79
index XXXXXXX..XXXXXXX 100644
80
--- a/hw/core/machine.c
81
+++ b/hw/core/machine.c
82
@@ -XXX,XX +XXX,XX @@
83
#include "hw/virtio/virtio-iommu.h"
84
#include "audio/audio.h"
85
86
-GlobalProperty hw_compat_9_2[] = {};
87
+GlobalProperty hw_compat_9_2[] = {
88
+ {"arm-cpu", "backcompat-pauth-default-use-qarma5", "true"},
89
+};
90
const size_t hw_compat_9_2_len = G_N_ELEMENTS(hw_compat_9_2);
91
92
GlobalProperty hw_compat_9_1[] = {
93
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/target/arm/cpu.c
96
+++ b/target/arm/cpu.c
97
@@ -XXX,XX +XXX,XX @@ static const Property arm_cpu_properties[] = {
98
DEFINE_PROP_INT32("core-count", ARMCPU, core_count, -1),
99
/* True to default to the backward-compat old CNTFRQ rather than 1Ghz */
100
DEFINE_PROP_BOOL("backcompat-cntfrq", ARMCPU, backcompat_cntfrq, false),
101
+ DEFINE_PROP_BOOL("backcompat-pauth-default-use-qarma5", ARMCPU,
102
+ backcompat_pauth_default_use_qarma5, false),
103
};
104
105
static const gchar *arm_gdb_arch_name(CPUState *cs)
106
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/target/arm/cpu64.c
109
+++ b/target/arm/cpu64.c
110
@@ -XXX,XX +XXX,XX @@ void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp)
111
return;
112
}
113
114
- if (cpu->prop_pauth_impdef) {
115
- isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, API, features);
116
- isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, GPI, 1);
117
+ bool use_default = !cpu->prop_pauth_qarma5 &&
118
+ !cpu->prop_pauth_qarma3 &&
119
+ !cpu->prop_pauth_impdef;
120
+
121
+ if (cpu->prop_pauth_qarma5 ||
122
+ (use_default &&
123
+ cpu->backcompat_pauth_default_use_qarma5)) {
124
+ isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, APA, features);
125
+ isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, GPA, 1);
126
} else if (cpu->prop_pauth_qarma3) {
127
isar2 = FIELD_DP64(isar2, ID_AA64ISAR2, APA3, features);
128
isar2 = FIELD_DP64(isar2, ID_AA64ISAR2, GPA3, 1);
129
- } else { /* default is pauth-qarma5 */
130
- isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, APA, features);
131
- isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, GPA, 1);
132
+ } else if (cpu->prop_pauth_impdef ||
133
+ (use_default &&
134
+ !cpu->backcompat_pauth_default_use_qarma5)) {
135
+ isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, API, features);
136
+ isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, GPI, 1);
137
+ } else {
138
+ g_assert_not_reached();
139
}
140
} else if (cpu->prop_pauth_impdef ||
141
cpu->prop_pauth_qarma3 ||
142
--
143
2.34.1
diff view generated by jsdifflib
1
From: Marco Palumbi <Marco.Palumbi@tii.ae>
1
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
2
3
The order of the RX and TX interrupts are swapped.
3
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
4
This commit fixes the order as per the following documents:
4
Message-id: 20241219183211.3493974-4-pierrick.bouvier@linaro.org
5
* https://developer.arm.com/documentation/dai0505/latest/
5
[PMM: Removed a paragraph about using non-versioned models.]
6
* https://developer.arm.com/documentation/dai0521/latest/
7
* https://developer.arm.com/documentation/dai0524/latest/
8
* https://developer.arm.com/documentation/dai0547/latest/
9
10
Cc: qemu-stable@nongnu.org
11
Signed-off-by: Marco Palumbi <Marco.Palumbi@tii.ae>
12
Message-id: 20240730073123.72992-1-marco@palumbi.it
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
7
---
16
hw/arm/mps2-tz.c | 6 +++---
8
docs/system/arm/virt.rst | 4 ++++
17
1 file changed, 3 insertions(+), 3 deletions(-)
9
1 file changed, 4 insertions(+)
18
10
19
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
11
diff --git a/docs/system/arm/virt.rst b/docs/system/arm/virt.rst
20
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/mps2-tz.c
13
--- a/docs/system/arm/virt.rst
22
+++ b/hw/arm/mps2-tz.c
14
+++ b/docs/system/arm/virt.rst
23
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_uart(MPS2TZMachineState *mms, void *opaque,
15
@@ -XXX,XX +XXX,XX @@ of the 5.0 release and ``virt-5.0`` of the 5.1 release. Migration
24
const char *name, hwaddr size,
16
is not guaranteed to work between different QEMU releases for
25
const int *irqs, const PPCExtraData *extradata)
17
the non-versioned ``virt`` machine type.
26
{
18
27
- /* The irq[] array is tx, rx, combined, in that order */
19
+VM migration is not guaranteed when using ``-cpu max``, as features
28
+ /* The irq[] array is rx, tx, combined, in that order */
20
+supported may change between QEMU versions. To ensure your VM can be
29
MPS2TZMachineClass *mmc = MPS2TZ_MACHINE_GET_CLASS(mms);
21
+migrated, it is recommended to use another cpu model instead.
30
CMSDKAPBUART *uart = opaque;
22
+
31
int i = uart - &mms->uart[0];
23
Supported devices
32
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_uart(MPS2TZMachineState *mms, void *opaque,
24
"""""""""""""""""
33
qdev_prop_set_uint32(DEVICE(uart), "pclk-frq", mmc->apb_periph_frq);
25
34
sysbus_realize(SYS_BUS_DEVICE(uart), &error_fatal);
35
s = SYS_BUS_DEVICE(uart);
36
- sysbus_connect_irq(s, 0, get_sse_irq_in(mms, irqs[0]));
37
- sysbus_connect_irq(s, 1, get_sse_irq_in(mms, irqs[1]));
38
+ sysbus_connect_irq(s, 0, get_sse_irq_in(mms, irqs[1]));
39
+ sysbus_connect_irq(s, 1, get_sse_irq_in(mms, irqs[0]));
40
sysbus_connect_irq(s, 2, qdev_get_gpio_in(orgate_dev, i * 2));
41
sysbus_connect_irq(s, 3, qdev_get_gpio_in(orgate_dev, i * 2 + 1));
42
sysbus_connect_irq(s, 4, get_sse_irq_in(mms, irqs[2]));
43
--
26
--
44
2.34.1
27
2.34.1
diff view generated by jsdifflib