1
Handful of bugfixes for rc2. None of these are particularly critical
1
Hi; here's a relatively small target-arm queue, pretty much all
2
or exciting.
2
bug fixes. (There are a few non-arm patches that I've thrown in
3
there too for my convenience :-))
3
4
5
thanks
4
-- PMM
6
-- PMM
5
7
6
The following changes since commit 45a150aa2b3492acf6691c7bdbeb25a8545d8345:
8
The following changes since commit 278238505d28d292927bff7683f39fb4fbca7fd1:
7
9
8
Merge remote-tracking branch 'remotes/ericb/tags/pull-bitmaps-2020-08-03' into staging (2020-08-03 15:13:49 +0100)
10
Merge tag 'pull-tcg-20230511-2' of https://gitlab.com/rth7680/qemu into staging (2023-05-11 11:44:23 +0100)
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-20200803
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230512
13
15
14
for you to fetch changes up to 13557fd392890cbd985bceba7f717e01efd674b8:
16
for you to fetch changes up to 478dccbb99db0bf8f00537dd0b4d0de88d5cb537:
15
17
16
hw/timer/imx_epit: Avoid assertion when CR.SWR is written (2020-08-03 17:56:11 +0100)
18
target/arm: Correct AArch64.S2MinTxSZ 32-bit EL1 input size check (2023-05-12 16:01:25 +0100)
17
19
18
----------------------------------------------------------------
20
----------------------------------------------------------------
19
target-arm queue:
21
target-arm queue:
20
* hw/timer/imx_epit: Avoid assertion when CR.SWR is written
22
* More refactoring of files into tcg/
21
* netduino2, netduinoplus2, microbit: set system_clock_scale so that
23
* Don't allow stage 2 page table walks to downgrade to NS
22
SysTick running on the CPU clock works
24
* Fix handling of SW and NSW bits for stage 2 walks
23
* target/arm: Avoid maybe-uninitialized warning with gcc 4.9
25
* MAINTAINERS: Update Akihiko Odaki's email address
24
* target/arm: Fix AddPAC error indication
26
* ui: Fix pixel colour channel order for PNG screenshots
25
* Make AIRCR.SYSRESETREQ actually reset the system for the
27
* docs: Remove unused weirdly-named cross-reference targets
26
microbit, mps2-*, musca-*, netduino* boards
28
* hw/mips/malta: Fix minor dead code issue
29
* Fixes for the "allow CONFIG_TCG=n" changes
30
* tests/qtest: Don't run cdrom boot tests if no accelerator is present
31
* target/arm: Correct AArch64.S2MinTxSZ 32-bit EL1 input size check
27
32
28
----------------------------------------------------------------
33
----------------------------------------------------------------
29
Kaige Li (1):
34
Akihiko Odaki (1):
30
target/arm: Avoid maybe-uninitialized warning with gcc 4.9
35
MAINTAINERS: Update Akihiko Odaki's email address
36
37
Fabiano Rosas (3):
38
target/arm: Select SEMIHOSTING when using TCG
39
target/arm: Select CONFIG_ARM_V7M when TCG is enabled
40
tests/qtest: Don't run cdrom boot tests if no accelerator is present
31
41
32
Peter Maydell (6):
42
Peter Maydell (6):
33
hw/arm/netduino2, netduinoplus2: Set system_clock_scale
43
target/arm: Don't allow stage 2 page table walks to downgrade to NS
34
include/hw/irq.h: New function qemu_irq_is_connected()
44
target/arm: Fix handling of SW and NSW bits for stage 2 walks
35
hw/intc/armv7m_nvic: Provide default "reset the system" behaviour for SYSRESETREQ
45
ui: Fix pixel colour channel order for PNG screenshots
36
msf2-soc, stellaris: Don't wire up SYSRESETREQ
46
docs: Remove unused weirdly-named cross-reference targets
37
hw/arm/nrf51_soc: Set system_clock_scale
47
hw/mips/malta: Fix minor dead code issue
38
hw/timer/imx_epit: Avoid assertion when CR.SWR is written
48
target/arm: Correct AArch64.S2MinTxSZ 32-bit EL1 input size check
39
49
40
Richard Henderson (1):
50
Richard Henderson (2):
41
target/arm: Fix AddPAC error indication
51
target/arm: Move translate-a32.h, arm_ldst.h, sve_ldst_internal.h to tcg/
52
target/arm: Move helper-{a64,mve,sme,sve}.h to tcg/
42
53
43
include/hw/arm/armv7m.h | 4 +++-
54
MAINTAINERS | 4 +-
44
include/hw/irq.h | 18 ++++++++++++++++++
55
docs/system/devices/igb.rst | 2 +-
45
hw/arm/msf2-soc.c | 11 -----------
56
docs/system/devices/ivshmem.rst | 2 -
46
hw/arm/netduino2.c | 10 ++++++++++
57
docs/system/devices/net.rst | 2 +-
47
hw/arm/netduinoplus2.c | 10 ++++++++++
58
docs/system/devices/usb.rst | 2 -
48
hw/arm/nrf51_soc.c | 5 +++++
59
docs/system/keys.rst | 2 +-
49
hw/arm/stellaris.c | 12 ------------
60
docs/system/linuxboot.rst | 2 +-
50
hw/intc/armv7m_nvic.c | 17 ++++++++++++++++-
61
docs/system/target-i386.rst | 4 --
51
hw/timer/imx_epit.c | 13 ++++++++++---
62
target/arm/helper.h | 8 +--
52
target/arm/pauth_helper.c | 6 +++++-
63
target/arm/internals.h | 12 +++-
53
target/arm/translate-a64.c | 2 +-
64
target/arm/{ => tcg}/arm_ldst.h | 0
54
tests/tcg/aarch64/pauth-5.c | 33 +++++++++++++++++++++++++++++++++
65
target/arm/{ => tcg}/helper-a64.h | 0
55
tests/tcg/aarch64/Makefile.target | 2 +-
66
target/arm/{ => tcg}/helper-mve.h | 0
56
13 files changed, 112 insertions(+), 31 deletions(-)
67
target/arm/{ => tcg}/helper-sme.h | 0
57
create mode 100644 tests/tcg/aarch64/pauth-5.c
68
target/arm/{ => tcg}/helper-sve.h | 0
58
69
target/arm/{ => tcg}/sve_ldst_internal.h | 0
70
target/arm/{ => tcg}/translate-a32.h | 0
71
hw/mips/malta.c | 5 +-
72
target/arm/gdbstub64.c | 2 +-
73
target/arm/helper.c | 15 ++++-
74
target/arm/ptw.c | 95 +++++++++++++++++++-------------
75
target/arm/tcg/pauth_helper.c | 6 +-
76
tests/qtest/cdrom-test.c | 10 ++++
77
ui/console.c | 4 +-
78
target/arm/Kconfig | 9 +--
79
25 files changed, 109 insertions(+), 77 deletions(-)
80
rename target/arm/{ => tcg}/arm_ldst.h (100%)
81
rename target/arm/{ => tcg}/helper-a64.h (100%)
82
rename target/arm/{ => tcg}/helper-mve.h (100%)
83
rename target/arm/{ => tcg}/helper-sme.h (100%)
84
rename target/arm/{ => tcg}/helper-sve.h (100%)
85
rename target/arm/{ => tcg}/sve_ldst_internal.h (100%)
86
rename target/arm/{ => tcg}/translate-a32.h (100%)
diff view generated by jsdifflib
1
From: Kaige Li <likaige@loongson.cn>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
GCC version 4.9.4 isn't clever enough to figure out that all
3
These files got missed when populating tcg/.
4
execution paths in disas_ldst() that use 'fn' will have initialized
4
Because they are included with "", no change to the users required.
5
it first, and so it warns:
6
5
7
/home/LiKaige/qemu/target/arm/translate-a64.c: In function ‘disas_ldst’:
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
/home/LiKaige/qemu/target/arm/translate-a64.c:3392:5: error: ‘fn’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
7
Reviewed-by: Fabiano Rosas <farosas@suse.de>
9
fn(cpu_reg(s, rt), clean_addr, tcg_rs, get_mem_index(s),
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
^
9
Message-id: 20230504110412.1892411-2-richard.henderson@linaro.org
11
/home/LiKaige/qemu/target/arm/translate-a64.c:3318:22: note: ‘fn’ was declared here
12
AtomicThreeOpFn *fn;
13
^
14
15
Make it happy by initializing the variable to NULL.
16
17
Signed-off-by: Kaige Li <likaige@loongson.cn>
18
Message-id: 1596110248-7366-2-git-send-email-likaige@loongson.cn
19
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
20
[PMM: Clean up commit message and note which gcc version this was]
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
11
---
23
target/arm/translate-a64.c | 2 +-
12
target/arm/{ => tcg}/arm_ldst.h | 0
24
1 file changed, 1 insertion(+), 1 deletion(-)
13
target/arm/{ => tcg}/sve_ldst_internal.h | 0
14
target/arm/{ => tcg}/translate-a32.h | 0
15
3 files changed, 0 insertions(+), 0 deletions(-)
16
rename target/arm/{ => tcg}/arm_ldst.h (100%)
17
rename target/arm/{ => tcg}/sve_ldst_internal.h (100%)
18
rename target/arm/{ => tcg}/translate-a32.h (100%)
25
19
26
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
20
diff --git a/target/arm/arm_ldst.h b/target/arm/tcg/arm_ldst.h
27
index XXXXXXX..XXXXXXX 100644
21
similarity index 100%
28
--- a/target/arm/translate-a64.c
22
rename from target/arm/arm_ldst.h
29
+++ b/target/arm/translate-a64.c
23
rename to target/arm/tcg/arm_ldst.h
30
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_atomic(DisasContext *s, uint32_t insn,
24
diff --git a/target/arm/sve_ldst_internal.h b/target/arm/tcg/sve_ldst_internal.h
31
bool r = extract32(insn, 22, 1);
25
similarity index 100%
32
bool a = extract32(insn, 23, 1);
26
rename from target/arm/sve_ldst_internal.h
33
TCGv_i64 tcg_rs, clean_addr;
27
rename to target/arm/tcg/sve_ldst_internal.h
34
- AtomicThreeOpFn *fn;
28
diff --git a/target/arm/translate-a32.h b/target/arm/tcg/translate-a32.h
35
+ AtomicThreeOpFn *fn = NULL;
29
similarity index 100%
36
30
rename from target/arm/translate-a32.h
37
if (is_vector || !dc_isar_feature(aa64_atomics, s)) {
31
rename to target/arm/tcg/translate-a32.h
38
unallocated_encoding(s);
39
--
32
--
40
2.20.1
33
2.34.1
41
34
42
35
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The definition of top_bit used in this function is one higher
3
While we cannot move the main "helper.h" out of target/arm/,
4
than that used in the Arm ARM psuedo-code, which put the error
4
due to usage by generic code, we can move the sub-includes.
5
indication at top_bit - 1 at the wrong place, which meant that
6
it wasn't visible to Auth.
7
5
8
Fixing the definition of top_bit requires more changes, because
9
its most common use is for the count of bits in top_bit:bot_bit,
10
which would then need to be computed as top_bit - bot_bit + 1.
11
12
For now, prefer the minimal fix to the error indication alone.
13
14
Fixes: 63ff0ca94cb
15
Reported-by: Derrick McKee <derrick.mckee@gmail.com>
16
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20200728195706.11087-1-richard.henderson@linaro.org
7
Reviewed-by: Fabiano Rosas <farosas@suse.de>
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20230504110412.1892411-3-richard.henderson@linaro.org
19
[PMM: added comment about the divergence from the pseudocode]
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
---
11
---
22
target/arm/pauth_helper.c | 6 +++++-
12
target/arm/helper.h | 8 ++++----
23
tests/tcg/aarch64/pauth-5.c | 33 +++++++++++++++++++++++++++++++
13
target/arm/{ => tcg}/helper-a64.h | 0
24
tests/tcg/aarch64/Makefile.target | 2 +-
14
target/arm/{ => tcg}/helper-mve.h | 0
25
3 files changed, 39 insertions(+), 2 deletions(-)
15
target/arm/{ => tcg}/helper-sme.h | 0
26
create mode 100644 tests/tcg/aarch64/pauth-5.c
16
target/arm/{ => tcg}/helper-sve.h | 0
17
5 files changed, 4 insertions(+), 4 deletions(-)
18
rename target/arm/{ => tcg}/helper-a64.h (100%)
19
rename target/arm/{ => tcg}/helper-mve.h (100%)
20
rename target/arm/{ => tcg}/helper-sme.h (100%)
21
rename target/arm/{ => tcg}/helper-sve.h (100%)
27
22
28
diff --git a/target/arm/pauth_helper.c b/target/arm/pauth_helper.c
23
diff --git a/target/arm/helper.h b/target/arm/helper.h
29
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/pauth_helper.c
25
--- a/target/arm/helper.h
31
+++ b/target/arm/pauth_helper.c
26
+++ b/target/arm/helper.h
32
@@ -XXX,XX +XXX,XX @@ static uint64_t pauth_addpac(CPUARMState *env, uint64_t ptr, uint64_t modifier,
27
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(gvec_uclamp_d, TCG_CALL_NO_RWG,
33
*/
28
void, ptr, ptr, ptr, ptr, i32)
34
test = sextract64(ptr, bot_bit, top_bit - bot_bit);
29
35
if (test != 0 && test != -1) {
30
#ifdef TARGET_AARCH64
36
- pac ^= MAKE_64BIT_MASK(top_bit - 1, 1);
31
-#include "helper-a64.h"
37
+ /*
32
-#include "helper-sve.h"
38
+ * Note that our top_bit is one greater than the pseudocode's
33
-#include "helper-sme.h"
39
+ * version, hence "- 2" here.
34
+#include "tcg/helper-a64.h"
40
+ */
35
+#include "tcg/helper-sve.h"
41
+ pac ^= MAKE_64BIT_MASK(top_bit - 2, 1);
36
+#include "tcg/helper-sme.h"
42
}
37
#endif
43
38
44
/*
39
-#include "helper-mve.h"
45
diff --git a/tests/tcg/aarch64/pauth-5.c b/tests/tcg/aarch64/pauth-5.c
40
+#include "tcg/helper-mve.h"
46
new file mode 100644
41
diff --git a/target/arm/helper-a64.h b/target/arm/tcg/helper-a64.h
47
index XXXXXXX..XXXXXXX
42
similarity index 100%
48
--- /dev/null
43
rename from target/arm/helper-a64.h
49
+++ b/tests/tcg/aarch64/pauth-5.c
44
rename to target/arm/tcg/helper-a64.h
50
@@ -XXX,XX +XXX,XX @@
45
diff --git a/target/arm/helper-mve.h b/target/arm/tcg/helper-mve.h
51
+#include <assert.h>
46
similarity index 100%
52
+
47
rename from target/arm/helper-mve.h
53
+static int x;
48
rename to target/arm/tcg/helper-mve.h
54
+
49
diff --git a/target/arm/helper-sme.h b/target/arm/tcg/helper-sme.h
55
+int main()
50
similarity index 100%
56
+{
51
rename from target/arm/helper-sme.h
57
+ int *p0 = &x, *p1, *p2, *p3;
52
rename to target/arm/tcg/helper-sme.h
58
+ unsigned long salt = 0;
53
diff --git a/target/arm/helper-sve.h b/target/arm/tcg/helper-sve.h
59
+
54
similarity index 100%
60
+ /*
55
rename from target/arm/helper-sve.h
61
+ * With TBI enabled and a 48-bit VA, there are 7 bits of auth, and so
56
rename to target/arm/tcg/helper-sve.h
62
+ * a 1/128 chance of auth = pac(ptr,key,salt) producing zero.
63
+ * Find a salt that creates auth != 0.
64
+ */
65
+ do {
66
+ salt++;
67
+ asm("pacda %0, %1" : "=r"(p1) : "r"(salt), "0"(p0));
68
+ } while (p0 == p1);
69
+
70
+ /*
71
+ * This pac must fail, because the input pointer bears an encryption,
72
+ * and so is not properly extended within bits [55:47]. This will
73
+ * toggle bit 54 in the output...
74
+ */
75
+ asm("pacda %0, %1" : "=r"(p2) : "r"(salt), "0"(p1));
76
+
77
+ /* ... so that the aut must fail, setting bit 53 in the output ... */
78
+ asm("autda %0, %1" : "=r"(p3) : "r"(salt), "0"(p2));
79
+
80
+ /* ... which means this equality must not hold. */
81
+ assert(p3 != p0);
82
+ return 0;
83
+}
84
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
85
index XXXXXXX..XXXXXXX 100644
86
--- a/tests/tcg/aarch64/Makefile.target
87
+++ b/tests/tcg/aarch64/Makefile.target
88
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
89
90
# Pauth Tests
91
ifneq ($(DOCKER_IMAGE)$(CROSS_CC_HAS_ARMV8_3),)
92
-AARCH64_TESTS += pauth-1 pauth-2 pauth-4
93
+AARCH64_TESTS += pauth-1 pauth-2 pauth-4 pauth-5
94
pauth-%: CFLAGS += -march=armv8.3-a
95
run-pauth-%: QEMU_OPTS += -cpu max
96
run-plugin-pauth-%: QEMU_OPTS += -cpu max
97
--
57
--
98
2.20.1
58
2.34.1
99
59
100
60
diff view generated by jsdifflib
1
The nrf51 SoC model wasn't setting the system_clock_scale
1
Bit 63 in a Table descriptor is only the NSTable bit for stage 1
2
global.which meant that if guest code used the systick timer in "use
2
translations; in stage 2 it is RES0. We were incorrectly looking at
3
the processor clock" mode it would hang because time never advances.
3
it all the time.
4
4
5
Set the global to match the documented CPU clock speed for this SoC.
5
This causes problems if:
6
* the stage 2 table descriptor was incorrectly setting the RES0 bit
7
* we are doing a stage 2 translation in Secure address space for
8
a NonSecure stage 1 regime -- in this case we would incorrectly
9
do an immediate downgrade to NonSecure
6
10
7
This SoC in fact doesn't have a SysTick timer (which is the only thing
11
A bug elsewhere in the code currently prevents us from getting
8
currently that cares about the system_clock_scale), because it's
12
to the second situation, but when we fix that it will be possible.
9
a configurable option in the Cortex-M0. However our Cortex-M0 and
10
thus our nrf51 and our micro:bit board do provide a SysTick, so
11
we ought to provide a functional one rather than a broken one.
12
13
14
Cc: qemu-stable@nongnu.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20200727193458.31250-1-peter.maydell@linaro.org
17
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
18
Message-id: 20230504135425.2748672-2-peter.maydell@linaro.org
16
---
19
---
17
hw/arm/nrf51_soc.c | 5 +++++
20
target/arm/ptw.c | 5 +++--
18
1 file changed, 5 insertions(+)
21
1 file changed, 3 insertions(+), 2 deletions(-)
19
22
20
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
23
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
21
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/nrf51_soc.c
25
--- a/target/arm/ptw.c
23
+++ b/hw/arm/nrf51_soc.c
26
+++ b/target/arm/ptw.c
24
@@ -XXX,XX +XXX,XX @@
27
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
25
28
descaddrmask &= ~indexmask_grainsize;
26
#define BASE_TO_IRQ(base) ((base >> 12) & 0x1F)
29
27
30
/*
28
+/* HCLK (the main CPU clock) on this SoC is always 16MHz */
31
- * Secure accesses start with the page table in secure memory and
29
+#define HCLK_FRQ 16000000
32
+ * Secure stage 1 accesses start with the page table in secure memory and
30
+
33
* can be downgraded to non-secure at any step. Non-secure accesses
31
static uint64_t clock_read(void *opaque, hwaddr addr, unsigned int size)
34
* remain non-secure. We implement this by just ORing in the NSTable/NS
32
{
35
* bits at each step.
33
qemu_log_mask(LOG_UNIMP, "%s: 0x%" HWADDR_PRIx " [%u]\n",
36
+ * Stage 2 never gets this kind of downgrade.
34
@@ -XXX,XX +XXX,XX @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
37
*/
35
return;
38
tableattrs = is_secure ? 0 : (1 << 4);
36
}
39
37
40
next_level:
38
+ system_clock_scale = NANOSECONDS_PER_SECOND / HCLK_FRQ;
41
descaddr |= (address >> (stride * (4 - level))) & indexmask;
39
+
42
descaddr &= ~7ULL;
40
object_property_set_link(OBJECT(&s->cpu), "memory", OBJECT(&s->container),
43
- nstable = extract32(tableattrs, 4, 1);
41
&error_abort);
44
+ nstable = !regime_is_stage2(mmu_idx) && extract32(tableattrs, 4, 1);
42
if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpu), errp)) {
45
if (nstable) {
46
/*
47
* Stage2_S -> Stage2 or Phys_S -> Phys_NS
43
--
48
--
44
2.20.1
49
2.34.1
45
50
46
51
diff view generated by jsdifflib
1
The NVIC provides an outbound qemu_irq "SYSRESETREQ" which it signals
1
We currently don't correctly handle the VSTCR_EL2.SW and VTCR_EL2.NSW
2
when the guest sets the SYSRESETREQ bit in the AIRCR register. This
2
configuration bits. These allow configuration of whether the stage 2
3
matches the hardware design (where the CPU has a signal of this name
3
page table walks for Secure IPA and NonSecure IPA should do their
4
and it is up to the SoC to connect that up to an actual reset
4
descriptor reads from Secure or NonSecure physical addresses. (This
5
mechanism), but in QEMU it mostly results in duplicated code in SoC
5
is separate from how the translation table base address and other
6
objects and bugs where SoC model implementors forget to wire up the
6
parameters are set: an NS IPA always uses VTTBR_EL2 and VTCR_EL2
7
SYSRESETREQ line.
7
for its base address and walk parameters, regardless of the NSW bit,
8
and similarly for Secure.)
8
9
9
Provide a default behaviour for the case where SYSRESETREQ is not
10
Provide a new function ptw_idx_for_stage_2() which returns the
10
actually connected to anything: use qemu_system_reset_request() to
11
MMU index to use for descriptor reads, and use it to set up
11
perform a system reset. This will allow us to remove the
12
the .in_ptw_idx wherever we call get_phys_addr_lpae().
12
implementations of SYSRESETREQ handling from the boards where that's
13
exactly what it does, and also fixes the bugs in the board models
14
which forgot to wire up the signal:
15
13
16
* microbit
14
For a stage 2 walk, wherever we call get_phys_addr_lpae():
17
* mps2-an385
15
* .in_ptw_idx should be ptw_idx_for_stage_2() of the .in_mmu_idx
18
* mps2-an505
16
* .in_secure should be true if .in_mmu_idx is Stage2_S
19
* mps2-an511
20
* mps2-an521
21
* musca-a
22
* musca-b1
23
* netduino
24
* netduinoplus2
25
17
26
We still allow the board to wire up the signal if it needs to, in case
18
This allows us to correct S1_ptw_translate() so that it consistently
27
we need to model more complicated reset controller logic or to model
19
always sets its (out_secure, out_phys) to the result it gets from the
28
buggy SoC hardware which forgot to wire up the line itself. But
20
S2 walk (either by calling get_phys_addr_lpae() or by TLB lookup).
29
defaulting to "reset the system" is more often going to be correct
21
This makes better conceptual sense because the S2 walk should return
30
than defaulting to "do nothing".
22
us an (address space, address) tuple, not an address that we then
23
randomly assign to S or NS.
31
24
25
Our previous handling of SW and NSW was broken, so guest code
26
trying to use these bits to put the s2 page tables in the "other"
27
address space wouldn't work correctly.
28
29
Cc: qemu-stable@nongnu.org
30
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1600
32
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
33
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
32
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
34
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
33
Message-id: 20230504135425.2748672-3-peter.maydell@linaro.org
35
Message-id: 20200728103744.6909-3-peter.maydell@linaro.org
36
---
34
---
37
include/hw/arm/armv7m.h | 4 +++-
35
target/arm/ptw.c | 76 ++++++++++++++++++++++++++++++++----------------
38
hw/intc/armv7m_nvic.c | 17 ++++++++++++++++-
36
1 file changed, 51 insertions(+), 25 deletions(-)
39
2 files changed, 19 insertions(+), 2 deletions(-)
40
37
41
diff --git a/include/hw/arm/armv7m.h b/include/hw/arm/armv7m.h
38
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
42
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
43
--- a/include/hw/arm/armv7m.h
40
--- a/target/arm/ptw.c
44
+++ b/include/hw/arm/armv7m.h
41
+++ b/target/arm/ptw.c
45
@@ -XXX,XX +XXX,XX @@ typedef struct {
42
@@ -XXX,XX +XXX,XX @@ ARMMMUIdx arm_stage1_mmu_idx(CPUARMState *env)
46
43
return stage_1_mmu_idx(arm_mmu_idx(env));
47
/* ARMv7M container object.
44
}
48
* + Unnamed GPIO input lines: external IRQ lines for the NVIC
45
49
- * + Named GPIO output SYSRESETREQ: signalled for guest AIRCR.SYSRESETREQ
46
+/*
50
+ * + Named GPIO output SYSRESETREQ: signalled for guest AIRCR.SYSRESETREQ.
47
+ * Return where we should do ptw loads from for a stage 2 walk.
51
+ * If this GPIO is not wired up then the NVIC will default to performing
48
+ * This depends on whether the address we are looking up is a
52
+ * a qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET).
49
+ * Secure IPA or a NonSecure IPA, which we know from whether this is
53
* + Property "cpu-type": CPU type to instantiate
50
+ * Stage2 or Stage2_S.
54
* + Property "num-irq": number of external IRQ lines
51
+ * If this is the Secure EL1&0 regime we need to check the NSW and SW bits.
55
* + Property "memory": MemoryRegion defining the physical address space
52
+ */
56
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
53
+static ARMMMUIdx ptw_idx_for_stage_2(CPUARMState *env, ARMMMUIdx stage2idx)
57
index XXXXXXX..XXXXXXX 100644
58
--- a/hw/intc/armv7m_nvic.c
59
+++ b/hw/intc/armv7m_nvic.c
60
@@ -XXX,XX +XXX,XX @@
61
#include "hw/intc/armv7m_nvic.h"
62
#include "hw/irq.h"
63
#include "hw/qdev-properties.h"
64
+#include "sysemu/runstate.h"
65
#include "target/arm/cpu.h"
66
#include "exec/exec-all.h"
67
#include "exec/memop.h"
68
@@ -XXX,XX +XXX,XX @@ static const uint8_t nvic_id[] = {
69
0x00, 0xb0, 0x1b, 0x00, 0x0d, 0xe0, 0x05, 0xb1
70
};
71
72
+static void signal_sysresetreq(NVICState *s)
73
+{
54
+{
74
+ if (qemu_irq_is_connected(s->sysresetreq)) {
55
+ bool s2walk_secure;
75
+ qemu_irq_pulse(s->sysresetreq);
56
+
57
+ /*
58
+ * We're OK to check the current state of the CPU here because
59
+ * (1) we always invalidate all TLBs when the SCR_EL3.NS bit changes
60
+ * (2) there's no way to do a lookup that cares about Stage 2 for a
61
+ * different security state to the current one for AArch64, and AArch32
62
+ * never has a secure EL2. (AArch32 ATS12NSO[UP][RW] allow EL3 to do
63
+ * an NS stage 1+2 lookup while the NS bit is 0.)
64
+ */
65
+ if (!arm_is_secure_below_el3(env) || !arm_el_is_aa64(env, 3)) {
66
+ return ARMMMUIdx_Phys_NS;
67
+ }
68
+ if (stage2idx == ARMMMUIdx_Stage2_S) {
69
+ s2walk_secure = !(env->cp15.vstcr_el2 & VSTCR_SW);
76
+ } else {
70
+ } else {
77
+ /*
71
+ s2walk_secure = !(env->cp15.vtcr_el2 & VTCR_NSW);
78
+ * Default behaviour if the SoC doesn't need to wire up
79
+ * SYSRESETREQ (eg to a system reset controller of some kind):
80
+ * perform a system reset via the usual QEMU API.
81
+ */
82
+ qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
83
+ }
72
+ }
73
+ return s2walk_secure ? ARMMMUIdx_Phys_S : ARMMMUIdx_Phys_NS;
74
+
84
+}
75
+}
85
+
76
+
86
static int nvic_pending_prio(NVICState *s)
77
static bool regime_translation_big_endian(CPUARMState *env, ARMMMUIdx mmu_idx)
87
{
78
{
88
/* return the group priority of the current pending interrupt,
79
return (regime_sctlr(env, mmu_idx) & SCTLR_EE) != 0;
89
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
80
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
90
if (value & R_V7M_AIRCR_SYSRESETREQ_MASK) {
81
ARMMMUIdx mmu_idx = ptw->in_mmu_idx;
91
if (attrs.secure ||
82
ARMMMUIdx s2_mmu_idx = ptw->in_ptw_idx;
92
!(cpu->env.v7m.aircr & R_V7M_AIRCR_SYSRESETREQS_MASK)) {
83
uint8_t pte_attrs;
93
- qemu_irq_pulse(s->sysresetreq);
84
- bool pte_secure;
94
+ signal_sysresetreq(s);
85
95
}
86
ptw->out_virt = addr;
87
88
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
89
if (regime_is_stage2(s2_mmu_idx)) {
90
S1Translate s2ptw = {
91
.in_mmu_idx = s2_mmu_idx,
92
- .in_ptw_idx = is_secure ? ARMMMUIdx_Phys_S : ARMMMUIdx_Phys_NS,
93
- .in_secure = is_secure,
94
+ .in_ptw_idx = ptw_idx_for_stage_2(env, s2_mmu_idx),
95
+ .in_secure = s2_mmu_idx == ARMMMUIdx_Stage2_S,
96
.in_debug = true,
97
};
98
GetPhysAddrResult s2 = { };
99
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
96
}
100
}
97
if (value & R_V7M_AIRCR_VECTCLRACTIVE_MASK) {
101
ptw->out_phys = s2.f.phys_addr;
102
pte_attrs = s2.cacheattrs.attrs;
103
- pte_secure = s2.f.attrs.secure;
104
+ ptw->out_secure = s2.f.attrs.secure;
105
} else {
106
/* Regime is physical. */
107
ptw->out_phys = addr;
108
pte_attrs = 0;
109
- pte_secure = is_secure;
110
+ ptw->out_secure = s2_mmu_idx == ARMMMUIdx_Phys_S;
111
}
112
ptw->out_host = NULL;
113
ptw->out_rw = false;
114
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
115
ptw->out_phys = full->phys_addr | (addr & ~TARGET_PAGE_MASK);
116
ptw->out_rw = full->prot & PAGE_WRITE;
117
pte_attrs = full->pte_attrs;
118
- pte_secure = full->attrs.secure;
119
+ ptw->out_secure = full->attrs.secure;
120
#else
121
g_assert_not_reached();
122
#endif
123
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
124
}
125
}
126
127
- /* Check if page table walk is to secure or non-secure PA space. */
128
- ptw->out_secure = (is_secure
129
- && !(pte_secure
130
- ? env->cp15.vstcr_el2 & VSTCR_SW
131
- : env->cp15.vtcr_el2 & VTCR_NSW));
132
ptw->out_be = regime_translation_big_endian(env, mmu_idx);
133
return true;
134
135
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
136
hwaddr ipa;
137
int s1_prot, s1_lgpgsz;
138
bool is_secure = ptw->in_secure;
139
- bool ret, ipa_secure, s2walk_secure;
140
+ bool ret, ipa_secure;
141
ARMCacheAttrs cacheattrs1;
142
bool is_el0;
143
uint64_t hcr;
144
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
145
146
ipa = result->f.phys_addr;
147
ipa_secure = result->f.attrs.secure;
148
- if (is_secure) {
149
- /* Select TCR based on the NS bit from the S1 walk. */
150
- s2walk_secure = !(ipa_secure
151
- ? env->cp15.vstcr_el2 & VSTCR_SW
152
- : env->cp15.vtcr_el2 & VTCR_NSW);
153
- } else {
154
- assert(!ipa_secure);
155
- s2walk_secure = false;
156
- }
157
158
is_el0 = ptw->in_mmu_idx == ARMMMUIdx_Stage1_E0;
159
- ptw->in_mmu_idx = s2walk_secure ? ARMMMUIdx_Stage2_S : ARMMMUIdx_Stage2;
160
- ptw->in_ptw_idx = s2walk_secure ? ARMMMUIdx_Phys_S : ARMMMUIdx_Phys_NS;
161
- ptw->in_secure = s2walk_secure;
162
+ ptw->in_mmu_idx = ipa_secure ? ARMMMUIdx_Stage2_S : ARMMMUIdx_Stage2;
163
+ ptw->in_secure = ipa_secure;
164
+ ptw->in_ptw_idx = ptw_idx_for_stage_2(env, ptw->in_mmu_idx);
165
166
/*
167
* S1 is done, now do S2 translation.
168
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
169
ptw->in_ptw_idx = is_secure ? ARMMMUIdx_Stage2_S : ARMMMUIdx_Stage2;
170
break;
171
172
+ case ARMMMUIdx_Stage2:
173
+ case ARMMMUIdx_Stage2_S:
174
+ /*
175
+ * Second stage lookup uses physical for ptw; whether this is S or
176
+ * NS may depend on the SW/NSW bits if this is a stage 2 lookup for
177
+ * the Secure EL2&0 regime.
178
+ */
179
+ ptw->in_ptw_idx = ptw_idx_for_stage_2(env, mmu_idx);
180
+ break;
181
+
182
case ARMMMUIdx_E10_0:
183
s1_mmu_idx = ARMMMUIdx_Stage1_E0;
184
goto do_twostage;
185
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_with_struct(CPUARMState *env, S1Translate *ptw,
186
/* fall through */
187
188
default:
189
- /* Single stage and second stage uses physical for ptw. */
190
+ /* Single stage uses physical for ptw. */
191
ptw->in_ptw_idx = is_secure ? ARMMMUIdx_Phys_S : ARMMMUIdx_Phys_NS;
192
break;
193
}
98
--
194
--
99
2.20.1
195
2.34.1
100
101
diff view generated by jsdifflib
1
The imx_epit device has a software-controllable reset triggered by
1
From: Akihiko Odaki <akihiko.odaki@gmail.com>
2
setting the SWR bit in the CR register. An error in commit cc2722ec83ad9
3
means that we will end up assert()ing if the guest does this, because
4
the code in imx_epit_write() starts ptimer transactions, and then
5
imx_epit_reset() also starts ptimer transactions, triggering
6
"ptimer_transaction_begin: Assertion `!s->in_transaction' failed".
7
2
8
The cleanest way to avoid this double-transaction is to move the
3
I am now employed by Daynix. Although my role as a reviewer of
9
start-transaction for the CR write handling down below the check of
4
macOS-related change is not very relevant to the employment, I decided
10
the SWR bit.
5
to use the company email address to avoid confusions from different
6
addresses.
11
7
12
Fixes: https://bugs.launchpad.net/qemu/+bug/1880424
8
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
13
Fixes: cc2722ec83ad944505fe
9
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20230506072333.32510-1-akihiko.odaki@daynix.com
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Message-id: 20200727154550.3409-1-peter.maydell@linaro.org
17
---
13
---
18
hw/timer/imx_epit.c | 13 ++++++++++---
14
MAINTAINERS | 4 ++--
19
1 file changed, 10 insertions(+), 3 deletions(-)
15
1 file changed, 2 insertions(+), 2 deletions(-)
20
16
21
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
17
diff --git a/MAINTAINERS b/MAINTAINERS
22
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/timer/imx_epit.c
19
--- a/MAINTAINERS
24
+++ b/hw/timer/imx_epit.c
20
+++ b/MAINTAINERS
25
@@ -XXX,XX +XXX,XX @@ static void imx_epit_write(void *opaque, hwaddr offset, uint64_t value,
21
@@ -XXX,XX +XXX,XX @@ Core Audio framework backend
26
22
M: Gerd Hoffmann <kraxel@redhat.com>
27
switch (offset >> 2) {
23
M: Philippe Mathieu-Daudé <philmd@linaro.org>
28
case 0: /* CR */
24
R: Christian Schoenebeck <qemu_oss@crudebyte.com>
29
- ptimer_transaction_begin(s->timer_cmp);
25
-R: Akihiko Odaki <akihiko.odaki@gmail.com>
30
- ptimer_transaction_begin(s->timer_reload);
26
+R: Akihiko Odaki <akihiko.odaki@daynix.com>
31
27
S: Odd Fixes
32
oldcr = s->cr;
28
F: audio/coreaudio.c
33
s->cr = value & 0x03ffffff;
29
34
if (s->cr & CR_SWR) {
30
@@ -XXX,XX +XXX,XX @@ F: docs/devel/ui.rst
35
/* handle the reset */
31
Cocoa graphics
36
imx_epit_reset(DEVICE(s));
32
M: Peter Maydell <peter.maydell@linaro.org>
37
- } else {
33
M: Philippe Mathieu-Daudé <philmd@linaro.org>
38
+ /*
34
-R: Akihiko Odaki <akihiko.odaki@gmail.com>
39
+ * TODO: could we 'break' here? following operations appear
35
+R: Akihiko Odaki <akihiko.odaki@daynix.com>
40
+ * to duplicate the work imx_epit_reset() already did.
36
S: Odd Fixes
41
+ */
37
F: ui/cocoa.m
42
+ }
43
+
44
+ ptimer_transaction_begin(s->timer_cmp);
45
+ ptimer_transaction_begin(s->timer_reload);
46
+
47
+ if (!(s->cr & CR_SWR)) {
48
imx_epit_set_freq(s);
49
}
50
38
51
--
39
--
52
2.20.1
40
2.34.1
53
41
54
42
diff view generated by jsdifflib
1
The netduino2 and netduinoplus2 boards forgot to set the system_clock_scale
1
When we take a PNG screenshot the ordering of the colour channels in
2
global, which meant that if guest code used the systick timer in "use
2
the data is not correct, resulting in the image having weird
3
the processor clock" mode it would hang because time never advances.
3
colouring compared to the actual display. (Specifically, on a
4
little-endian host the blue and red channels are swapped; on
5
big-endian everything is wrong.)
4
6
5
Set the global to match the documented CPU clock speed of these boards.
7
This happens because the pixman idea of the pixel data and the libpng
6
Judging by the data sheet this is slightly simplistic because the
8
idea differ. PIXMAN_a8r8g8b8 defines that pixels are 32-bit values,
7
SoC allows configuration of the SYSCLK source and frequency via the
9
with A in bits 24-31, R in bits 16-23, G in bits 8-15 and B in bits
8
RCC (reset and clock control) module, but we don't model that.
10
0-7. This means that on little-endian systems the bytes in memory
11
are
12
B G R A
13
and on big-endian systems they are
14
A R G B
9
15
10
Fixes: https://bugs.launchpad.net/qemu/+bug/1876187
16
libpng, on the other hand, thinks of pixels as being a series of
17
values for each channel, so its format PNG_COLOR_TYPE_RGB_ALPHA
18
always wants bytes in the order
19
R G B A
20
21
This isn't the same as the pixman order for either big or little
22
endian hosts.
23
24
The alpha channel is also unnecessary bulk in the output PNG file,
25
because there is no alpha information in a screenshot.
26
27
To handle the endianness issue, we already define in ui/qemu-pixman.h
28
various PIXMAN_BE_* and PIXMAN_LE_* values that give consistent
29
byte-order pixel channel formats. So we can use PIXMAN_BE_r8g8b8 and
30
PNG_COLOR_TYPE_RGB, which both have an in-memory byte order of
31
R G B
32
and 3 bytes per pixel.
33
34
(PPM format screenshots get this right; they already use the
35
PIXMAN_BE_r8g8b8 format.)
36
37
Cc: qemu-stable@nongnu.org
38
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1622
39
Fixes: 9a0a119a382867 ("Added parameter to take screenshot with screendump as PNG")
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
40
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
41
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
13
Message-id: 20200727162617.26227-1-peter.maydell@linaro.org
42
Message-id: 20230502135548.2451309-1-peter.maydell@linaro.org
14
---
43
---
15
hw/arm/netduino2.c | 10 ++++++++++
44
ui/console.c | 4 ++--
16
hw/arm/netduinoplus2.c | 10 ++++++++++
45
1 file changed, 2 insertions(+), 2 deletions(-)
17
2 files changed, 20 insertions(+)
18
46
19
diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
47
diff --git a/ui/console.c b/ui/console.c
20
index XXXXXXX..XXXXXXX 100644
48
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/netduino2.c
49
--- a/ui/console.c
22
+++ b/hw/arm/netduino2.c
50
+++ b/ui/console.c
23
@@ -XXX,XX +XXX,XX @@
51
@@ -XXX,XX +XXX,XX @@ static bool png_save(int fd, pixman_image_t *image, Error **errp)
24
#include "hw/arm/stm32f205_soc.h"
52
png_struct *png_ptr;
25
#include "hw/arm/boot.h"
53
png_info *info_ptr;
26
54
g_autoptr(pixman_image_t) linebuf =
27
+/* Main SYSCLK frequency in Hz (120MHz) */
55
- qemu_pixman_linebuf_create(PIXMAN_a8r8g8b8, width);
28
+#define SYSCLK_FRQ 120000000ULL
56
+ qemu_pixman_linebuf_create(PIXMAN_BE_r8g8b8, width);
29
+
57
uint8_t *buf = (uint8_t *)pixman_image_get_data(linebuf);
30
static void netduino2_init(MachineState *machine)
58
FILE *f = fdopen(fd, "wb");
31
{
59
int y;
32
DeviceState *dev;
60
@@ -XXX,XX +XXX,XX @@ static bool png_save(int fd, pixman_image_t *image, Error **errp)
33
61
png_init_io(png_ptr, f);
34
+ /*
62
35
+ * TODO: ideally we would model the SoC RCC and let it handle
63
png_set_IHDR(png_ptr, info_ptr, width, height, 8,
36
+ * system_clock_scale, including its ability to define different
64
- PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE,
37
+ * possible SYSCLK sources.
65
+ PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
38
+ */
66
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
39
+ system_clock_scale = NANOSECONDS_PER_SECOND / SYSCLK_FRQ;
67
40
+
68
png_write_info(png_ptr, info_ptr);
41
dev = qdev_new(TYPE_STM32F205_SOC);
42
qdev_prop_set_string(dev, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m3"));
43
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
44
diff --git a/hw/arm/netduinoplus2.c b/hw/arm/netduinoplus2.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/arm/netduinoplus2.c
47
+++ b/hw/arm/netduinoplus2.c
48
@@ -XXX,XX +XXX,XX @@
49
#include "hw/arm/stm32f405_soc.h"
50
#include "hw/arm/boot.h"
51
52
+/* Main SYSCLK frequency in Hz (168MHz) */
53
+#define SYSCLK_FRQ 168000000ULL
54
+
55
static void netduinoplus2_init(MachineState *machine)
56
{
57
DeviceState *dev;
58
59
+ /*
60
+ * TODO: ideally we would model the SoC RCC and let it handle
61
+ * system_clock_scale, including its ability to define different
62
+ * possible SYSCLK sources.
63
+ */
64
+ system_clock_scale = NANOSECONDS_PER_SECOND / SYSCLK_FRQ;
65
+
66
dev = qdev_new(TYPE_STM32F405_SOC);
67
qdev_prop_set_string(dev, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m4"));
68
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
69
--
69
--
70
2.20.1
70
2.34.1
71
71
72
72
diff view generated by jsdifflib
1
The MSF2 SoC model and the Stellaris board code both wire
1
In the doc sources, we have a few cross-reference targets with odd
2
SYSRESETREQ up to a function that just invokes
2
names "pcsys_005fxyz". These are the legacy of the semi-automated
3
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
3
conversion of the old info docs to rST (the '005f' is because ASCII
4
This is now the default action that the NVIC does if the line is
4
0x5f is '_' and the old info link names had underscores in them).
5
not connected, so we can delete the handling code.
5
6
Remove the targets which nothing links to, and rename the two targets
7
which are used to something a bit more descriptive.
6
8
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20230421163642.1151904-1-peter.maydell@linaro.org
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Reviewed-by: Markus Armbruster <armbru@redhat.com>
10
Message-id: 20200728103744.6909-4-peter.maydell@linaro.org
11
---
12
---
12
hw/arm/msf2-soc.c | 11 -----------
13
docs/system/devices/igb.rst | 2 +-
13
hw/arm/stellaris.c | 12 ------------
14
docs/system/devices/ivshmem.rst | 2 --
14
2 files changed, 23 deletions(-)
15
docs/system/devices/net.rst | 2 +-
16
docs/system/devices/usb.rst | 2 --
17
docs/system/keys.rst | 2 +-
18
docs/system/linuxboot.rst | 2 +-
19
docs/system/target-i386.rst | 4 ----
20
7 files changed, 4 insertions(+), 12 deletions(-)
15
21
16
diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
22
diff --git a/docs/system/devices/igb.rst b/docs/system/devices/igb.rst
17
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/msf2-soc.c
24
--- a/docs/system/devices/igb.rst
19
+++ b/hw/arm/msf2-soc.c
25
+++ b/docs/system/devices/igb.rst
26
@@ -XXX,XX +XXX,XX @@ Using igb
27
=========
28
29
Using igb should be nothing different from using another network device. See
30
-:ref:`pcsys_005fnetwork` in general.
31
+:ref:`Network_emulation` in general.
32
33
However, you may also need to perform additional steps to activate SR-IOV
34
feature on your guest. For Linux, refer to [4]_.
35
diff --git a/docs/system/devices/ivshmem.rst b/docs/system/devices/ivshmem.rst
36
index XXXXXXX..XXXXXXX 100644
37
--- a/docs/system/devices/ivshmem.rst
38
+++ b/docs/system/devices/ivshmem.rst
20
@@ -XXX,XX +XXX,XX @@
39
@@ -XXX,XX +XXX,XX @@
21
#include "hw/irq.h"
40
-.. _pcsys_005fivshmem:
22
#include "hw/arm/msf2-soc.h"
23
#include "hw/misc/unimp.h"
24
-#include "sysemu/runstate.h"
25
#include "sysemu/sysemu.h"
26
27
#define MSF2_TIMER_BASE 0x40004000
28
@@ -XXX,XX +XXX,XX @@ static const int spi_irq[MSF2_NUM_SPIS] = { 2, 3 };
29
static const int uart_irq[MSF2_NUM_UARTS] = { 10, 11 };
30
static const int timer_irq[MSF2_NUM_TIMERS] = { 14, 15 };
31
32
-static void do_sys_reset(void *opaque, int n, int level)
33
-{
34
- if (level) {
35
- qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
36
- }
37
-}
38
-
41
-
39
static void m2sxxx_soc_initfn(Object *obj)
42
Inter-VM Shared Memory device
40
{
43
-----------------------------
41
MSF2State *s = MSF2_SOC(obj);
44
42
@@ -XXX,XX +XXX,XX @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
45
diff --git a/docs/system/devices/net.rst b/docs/system/devices/net.rst
43
return;
46
index XXXXXXX..XXXXXXX 100644
44
}
47
--- a/docs/system/devices/net.rst
45
48
+++ b/docs/system/devices/net.rst
46
- qdev_connect_gpio_out_named(DEVICE(&s->armv7m.nvic), "SYSRESETREQ", 0,
49
@@ -XXX,XX +XXX,XX @@
47
- qemu_allocate_irq(&do_sys_reset, NULL, 0));
50
-.. _pcsys_005fnetwork:
51
+.. _Network_Emulation:
52
53
Network emulation
54
-----------------
55
diff --git a/docs/system/devices/usb.rst b/docs/system/devices/usb.rst
56
index XXXXXXX..XXXXXXX 100644
57
--- a/docs/system/devices/usb.rst
58
+++ b/docs/system/devices/usb.rst
59
@@ -XXX,XX +XXX,XX @@
60
-.. _pcsys_005fusb:
48
-
61
-
49
system_clock_scale = NANOSECONDS_PER_SECOND / s->m3clk;
62
USB emulation
50
63
-------------
51
for (i = 0; i < MSF2_NUM_UARTS; i++) {
64
52
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
65
diff --git a/docs/system/keys.rst b/docs/system/keys.rst
53
index XXXXXXX..XXXXXXX 100644
66
index XXXXXXX..XXXXXXX 100644
54
--- a/hw/arm/stellaris.c
67
--- a/docs/system/keys.rst
55
+++ b/hw/arm/stellaris.c
68
+++ b/docs/system/keys.rst
56
@@ -XXX,XX +XXX,XX @@
69
@@ -XXX,XX +XXX,XX @@
57
#include "hw/boards.h"
70
-.. _pcsys_005fkeys:
58
#include "qemu/log.h"
71
+.. _GUI_keys:
59
#include "exec/address-spaces.h"
72
60
-#include "sysemu/runstate.h"
73
Keys in the graphical frontends
61
#include "sysemu/sysemu.h"
74
-------------------------------
62
#include "hw/arm/armv7m.h"
75
diff --git a/docs/system/linuxboot.rst b/docs/system/linuxboot.rst
63
#include "hw/char/pl011.h"
76
index XXXXXXX..XXXXXXX 100644
64
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_init(Object *obj)
77
--- a/docs/system/linuxboot.rst
65
qdev_init_gpio_in(dev, stellaris_adc_trigger, 1);
78
+++ b/docs/system/linuxboot.rst
66
}
79
@@ -XXX,XX +XXX,XX @@ virtual serial port and the QEMU monitor to the console with the
67
80
-append "root=/dev/hda console=ttyS0" -nographic
68
-static
81
69
-void do_sys_reset(void *opaque, int n, int level)
82
Use Ctrl-a c to switch between the serial console and the monitor (see
70
-{
83
-:ref:`pcsys_005fkeys`).
71
- if (level) {
84
+:ref:`GUI_keys`).
72
- qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
85
diff --git a/docs/system/target-i386.rst b/docs/system/target-i386.rst
73
- }
86
index XXXXXXX..XXXXXXX 100644
74
-}
87
--- a/docs/system/target-i386.rst
88
+++ b/docs/system/target-i386.rst
89
@@ -XXX,XX +XXX,XX @@
90
x86 System emulator
91
-------------------
92
93
-.. _pcsys_005fdevices:
75
-
94
-
76
/* Board init. */
95
Board-specific documentation
77
static stellaris_board_info stellaris_boards[] = {
96
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
78
{ "LM3S811EVB",
97
79
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
98
@@ -XXX,XX +XXX,XX @@ Architectural features
80
/* This will exit with an error if the user passed us a bad cpu_type */
99
i386/sgx
81
sysbus_realize_and_unref(SYS_BUS_DEVICE(nvic), &error_fatal);
100
i386/amd-memory-encryption
82
101
83
- qdev_connect_gpio_out_named(nvic, "SYSRESETREQ", 0,
102
-.. _pcsys_005freq:
84
- qemu_allocate_irq(&do_sys_reset, NULL, 0));
85
-
103
-
86
if (board->dc1 & (1 << 16)) {
104
OS requirements
87
dev = sysbus_create_varargs(TYPE_STELLARIS_ADC, 0x40038000,
105
~~~~~~~~~~~~~~~
88
qdev_get_gpio_in(nvic, 14),
106
89
--
107
--
90
2.20.1
108
2.34.1
91
92
diff view generated by jsdifflib
1
Mostly devices don't need to care whether one of their output
1
Coverity points out (in CID 1508390) that write_bootloader has
2
qemu_irq lines is connected, because functions like qemu_set_irq()
2
some dead code, where we assign to 'p' and then in the following
3
silently do nothing if there is nothing on the other end. However
3
line assign to it again. This happened as a result of the
4
sometimes a device might want to implement default behaviour for the
4
refactoring in commit cd5066f8618b.
5
case where the machine hasn't wired the line up to anywhere.
6
5
7
Provide a function qemu_irq_is_connected() that devices can use for
6
Fix the dead code by removing the 'void *v' variable entirely and
8
this purpose. (The test is trivial but encapsulating it in a
7
instead adding a cast when calling bl_setup_gt64120_jump_kernel(), as
9
function makes it easier to see where we're doing it in case we need
8
we do at its other callsite in write_bootloader_nanomips().
10
to change the implementation later.)
11
9
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
14
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
15
Message-id: 20200728103744.6909-2-peter.maydell@linaro.org
16
---
12
---
17
include/hw/irq.h | 18 ++++++++++++++++++
13
hw/mips/malta.c | 5 +----
18
1 file changed, 18 insertions(+)
14
1 file changed, 1 insertion(+), 4 deletions(-)
19
15
20
diff --git a/include/hw/irq.h b/include/hw/irq.h
16
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
21
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/irq.h
18
--- a/hw/mips/malta.c
23
+++ b/include/hw/irq.h
19
+++ b/hw/mips/malta.c
24
@@ -XXX,XX +XXX,XX @@ qemu_irq qemu_irq_split(qemu_irq irq1, qemu_irq irq2);
20
@@ -XXX,XX +XXX,XX @@ static void write_bootloader(uint8_t *base, uint64_t run_addr,
25
on an existing vector of qemu_irq. */
21
uint64_t kernel_entry)
26
void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n);
22
{
27
23
uint32_t *p;
28
+/**
24
- void *v;
29
+ * qemu_irq_is_connected: Return true if IRQ line is wired up
25
30
+ *
26
/* Small bootloader */
31
+ * If a qemu_irq has a device on the other (receiving) end of it,
27
p = (uint32_t *)base;
32
+ * return true; otherwise return false.
28
@@ -XXX,XX +XXX,XX @@ static void write_bootloader(uint8_t *base, uint64_t run_addr,
33
+ *
29
*
34
+ * Usually device models don't need to care whether the machine model
30
*/
35
+ * has wired up their outbound qemu_irq lines, because functions like
31
36
+ * qemu_set_irq() silently do nothing if there is nothing on the other
32
- v = p;
37
+ * end of the line. However occasionally a device model will want to
33
- bl_setup_gt64120_jump_kernel(&v, run_addr, kernel_entry);
38
+ * provide default behaviour if its output is left floating, and
34
- p = v;
39
+ * it can use this function to identify when that is the case.
35
+ bl_setup_gt64120_jump_kernel((void **)&p, run_addr, kernel_entry);
40
+ */
36
41
+static inline bool qemu_irq_is_connected(qemu_irq irq)
37
/* YAMON subroutines */
42
+{
38
p = (uint32_t *) (base + 0x800);
43
+ return irq != NULL;
44
+}
45
+
46
#endif
47
--
39
--
48
2.20.1
40
2.34.1
49
41
50
42
diff view generated by jsdifflib
New patch
1
From: Fabiano Rosas <farosas@suse.de>
1
2
3
Semihosting has been made a 'default y' entry in Kconfig, which does
4
not work because when building --without-default-devices, the
5
semihosting code would not be available.
6
7
Make semihosting unconditional when TCG is present.
8
9
Fixes: 29d9efca16 ("arm/Kconfig: Do not build TCG-only boards on a KVM-only build")
10
Signed-off-by: Fabiano Rosas <farosas@suse.de>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20230508181611.2621-2-farosas@suse.de
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
target/arm/Kconfig | 8 +-------
16
1 file changed, 1 insertion(+), 7 deletions(-)
17
18
diff --git a/target/arm/Kconfig b/target/arm/Kconfig
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/Kconfig
21
+++ b/target/arm/Kconfig
22
@@ -XXX,XX +XXX,XX @@
23
config ARM
24
bool
25
+ select ARM_COMPATIBLE_SEMIHOSTING if TCG
26
27
config AARCH64
28
bool
29
select ARM
30
-
31
-# This config exists just so we can make SEMIHOSTING default when TCG
32
-# is selected without also changing it for other architectures.
33
-config ARM_SEMIHOSTING
34
- bool
35
- default y if TCG && ARM
36
- select ARM_COMPATIBLE_SEMIHOSTING
37
--
38
2.34.1
diff view generated by jsdifflib
New patch
1
From: Fabiano Rosas <farosas@suse.de>
1
2
3
We cannot allow this config to be disabled at the moment as not all of
4
the relevant code is protected by it.
5
6
Commit 29d9efca16 ("arm/Kconfig: Do not build TCG-only boards on a
7
KVM-only build") moved the CONFIGs of several boards to Kconfig, so it
8
is now possible that nothing selects ARM_V7M (e.g. when doing a
9
--without-default-devices build).
10
11
Return the CONFIG_ARM_V7M entry to a state where it is always selected
12
whenever TCG is available.
13
14
Fixes: 29d9efca16 ("arm/Kconfig: Do not build TCG-only boards on a KVM-only build")
15
Signed-off-by: Fabiano Rosas <farosas@suse.de>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20230508181611.2621-3-farosas@suse.de
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
20
target/arm/Kconfig | 1 +
21
1 file changed, 1 insertion(+)
22
23
diff --git a/target/arm/Kconfig b/target/arm/Kconfig
24
index XXXXXXX..XXXXXXX 100644
25
--- a/target/arm/Kconfig
26
+++ b/target/arm/Kconfig
27
@@ -XXX,XX +XXX,XX @@
28
config ARM
29
bool
30
select ARM_COMPATIBLE_SEMIHOSTING if TCG
31
+ select ARM_V7M if TCG
32
33
config AARCH64
34
bool
35
--
36
2.34.1
diff view generated by jsdifflib
New patch
1
From: Fabiano Rosas <farosas@suse.de>
1
2
3
On a build configured with: --disable-tcg --enable-xen it is possible
4
to produce a QEMU binary with no TCG nor KVM support. Skip the cdrom
5
boot tests if that's the case.
6
7
Fixes: 0c1ae3ff9d ("tests/qtest: Fix tests when no KVM or TCG are present")
8
Signed-off-by: Fabiano Rosas <farosas@suse.de>
9
Reviewed-by: Thomas Huth <thuth@redhat.com>
10
Message-id: 20230508181611.2621-4-farosas@suse.de
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
tests/qtest/cdrom-test.c | 10 ++++++++++
14
1 file changed, 10 insertions(+)
15
16
diff --git a/tests/qtest/cdrom-test.c b/tests/qtest/cdrom-test.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/tests/qtest/cdrom-test.c
19
+++ b/tests/qtest/cdrom-test.c
20
@@ -XXX,XX +XXX,XX @@ static void test_cdboot(gconstpointer data)
21
22
static void add_x86_tests(void)
23
{
24
+ if (!qtest_has_accel("tcg") && !qtest_has_accel("kvm")) {
25
+ g_test_skip("No KVM or TCG accelerator available, skipping boot tests");
26
+ return;
27
+ }
28
+
29
qtest_add_data_func("cdrom/boot/default", "-cdrom ", test_cdboot);
30
qtest_add_data_func("cdrom/boot/virtio-scsi",
31
"-device virtio-scsi -device scsi-cd,drive=cdr "
32
@@ -XXX,XX +XXX,XX @@ static void add_x86_tests(void)
33
34
static void add_s390x_tests(void)
35
{
36
+ if (!qtest_has_accel("tcg") && !qtest_has_accel("kvm")) {
37
+ g_test_skip("No KVM or TCG accelerator available, skipping boot tests");
38
+ return;
39
+ }
40
+
41
qtest_add_data_func("cdrom/boot/default", "-cdrom ", test_cdboot);
42
qtest_add_data_func("cdrom/boot/virtio-scsi",
43
"-device virtio-scsi -device scsi-cd,drive=cdr "
44
--
45
2.34.1
diff view generated by jsdifflib
New patch
1
In check_s2_mmu_setup() we have a check that is attempting to
2
implement the part of AArch64.S2MinTxSZ that is specific to when EL1
3
is AArch32:
1
4
5
if !s1aarch64 then
6
// EL1 is AArch32
7
min_txsz = Min(min_txsz, 24);
8
9
Unfortunately we got this wrong in two ways:
10
11
(1) The minimum txsz corresponds to a maximum inputsize, but we got
12
the sense of the comparison wrong and were faulting for all
13
inputsizes less than 40 bits
14
15
(2) We try to implement this as an extra check that happens after
16
we've done the same txsz checks we would do for an AArch64 EL1, but
17
in fact the pseudocode is *loosening* the requirements, so that txsz
18
values that would fault for an AArch64 EL1 do not fault for AArch32
19
EL1, because it does Min(old_min, 24), not Max(old_min, 24).
20
21
You can see this also in the text of the Arm ARM in table D8-8, which
22
shows that where the implemented PA size is less than 40 bits an
23
AArch32 EL1 is still OK with a configured stage2 T0SZ for a 40 bit
24
IPA, whereas if EL1 is AArch64 then the T0SZ must be big enough to
25
constrain the IPA to the implemented PA size.
26
27
Because of part (2), we can't do this as a separate check, but
28
have to integrate it into aa64_va_parameters(). Add a new argument
29
to that function to indicate that EL1 is 32-bit. All the existing
30
callsites except the one in get_phys_addr_lpae() can pass 'false',
31
because they are either doing a lookup for a stage 1 regime or
32
else they don't care about the tsz/tsz_oob fields.
33
34
Cc: qemu-stable@nongnu.org
35
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1627
36
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
37
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
38
Message-id: 20230509092059.3176487-1-peter.maydell@linaro.org
39
---
40
target/arm/internals.h | 12 +++++++++++-
41
target/arm/gdbstub64.c | 2 +-
42
target/arm/helper.c | 15 +++++++++++++--
43
target/arm/ptw.c | 14 ++------------
44
target/arm/tcg/pauth_helper.c | 6 +++---
45
5 files changed, 30 insertions(+), 19 deletions(-)
46
47
diff --git a/target/arm/internals.h b/target/arm/internals.h
48
index XXXXXXX..XXXXXXX 100644
49
--- a/target/arm/internals.h
50
+++ b/target/arm/internals.h
51
@@ -XXX,XX +XXX,XX @@ typedef struct ARMVAParameters {
52
ARMGranuleSize gran : 2;
53
} ARMVAParameters;
54
55
+/**
56
+ * aa64_va_parameters: Return parameters for an AArch64 virtual address
57
+ * @env: CPU
58
+ * @va: virtual address to look up
59
+ * @mmu_idx: determines translation regime to use
60
+ * @data: true if this is a data access
61
+ * @el1_is_aa32: true if we are asking about stage 2 when EL1 is AArch32
62
+ * (ignored if @mmu_idx is for a stage 1 regime; only affects tsz/tsz_oob)
63
+ */
64
ARMVAParameters aa64_va_parameters(CPUARMState *env, uint64_t va,
65
- ARMMMUIdx mmu_idx, bool data);
66
+ ARMMMUIdx mmu_idx, bool data,
67
+ bool el1_is_aa32);
68
69
int aa64_va_parameter_tbi(uint64_t tcr, ARMMMUIdx mmu_idx);
70
int aa64_va_parameter_tbid(uint64_t tcr, ARMMMUIdx mmu_idx);
71
diff --git a/target/arm/gdbstub64.c b/target/arm/gdbstub64.c
72
index XXXXXXX..XXXXXXX 100644
73
--- a/target/arm/gdbstub64.c
74
+++ b/target/arm/gdbstub64.c
75
@@ -XXX,XX +XXX,XX @@ int aarch64_gdb_get_pauth_reg(CPUARMState *env, GByteArray *buf, int reg)
76
ARMMMUIdx mmu_idx = arm_stage1_mmu_idx(env);
77
ARMVAParameters param;
78
79
- param = aa64_va_parameters(env, -is_high, mmu_idx, is_data);
80
+ param = aa64_va_parameters(env, -is_high, mmu_idx, is_data, false);
81
return gdb_get_reg64(buf, pauth_ptr_mask(param));
82
}
83
default:
84
diff --git a/target/arm/helper.c b/target/arm/helper.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/target/arm/helper.c
87
+++ b/target/arm/helper.c
88
@@ -XXX,XX +XXX,XX @@ static TLBIRange tlbi_aa64_get_range(CPUARMState *env, ARMMMUIdx mmuidx,
89
unsigned int page_size_granule, page_shift, num, scale, exponent;
90
/* Extract one bit to represent the va selector in use. */
91
uint64_t select = sextract64(value, 36, 1);
92
- ARMVAParameters param = aa64_va_parameters(env, select, mmuidx, true);
93
+ ARMVAParameters param = aa64_va_parameters(env, select, mmuidx, true, false);
94
TLBIRange ret = { };
95
ARMGranuleSize gran;
96
97
@@ -XXX,XX +XXX,XX @@ static ARMGranuleSize sanitize_gran_size(ARMCPU *cpu, ARMGranuleSize gran,
98
}
99
100
ARMVAParameters aa64_va_parameters(CPUARMState *env, uint64_t va,
101
- ARMMMUIdx mmu_idx, bool data)
102
+ ARMMMUIdx mmu_idx, bool data,
103
+ bool el1_is_aa32)
104
{
105
uint64_t tcr = regime_tcr(env, mmu_idx);
106
bool epd, hpd, tsz_oob, ds, ha, hd;
107
@@ -XXX,XX +XXX,XX @@ ARMVAParameters aa64_va_parameters(CPUARMState *env, uint64_t va,
108
}
109
}
110
111
+ if (stage2 && el1_is_aa32) {
112
+ /*
113
+ * For AArch32 EL1 the min txsz (and thus max IPA size) requirements
114
+ * are loosened: a configured IPA of 40 bits is permitted even if
115
+ * the implemented PA is less than that (and so a 40 bit IPA would
116
+ * fault for an AArch64 EL1). See R_DTLMN.
117
+ */
118
+ min_tsz = MIN(min_tsz, 24);
119
+ }
120
+
121
if (tsz > max_tsz) {
122
tsz = max_tsz;
123
tsz_oob = true;
124
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
125
index XXXXXXX..XXXXXXX 100644
126
--- a/target/arm/ptw.c
127
+++ b/target/arm/ptw.c
128
@@ -XXX,XX +XXX,XX @@ static int check_s2_mmu_setup(ARMCPU *cpu, bool is_aa64, uint64_t tcr,
129
130
sl0 = extract32(tcr, 6, 2);
131
if (is_aa64) {
132
- /*
133
- * AArch64.S2InvalidTxSZ: While we checked tsz_oob near the top of
134
- * get_phys_addr_lpae, that used aa64_va_parameters which apply
135
- * to aarch64. If Stage1 is aarch32, the min_txsz is larger.
136
- * See AArch64.S2MinTxSZ, where min_tsz is 24, translated to
137
- * inputsize is 64 - 24 = 40.
138
- */
139
- if (iasize < 40 && !arm_el_is_aa64(&cpu->env, 1)) {
140
- goto fail;
141
- }
142
-
143
/*
144
* AArch64.S2InvalidSL: Interpretation of SL depends on the page size,
145
* so interleave AArch64.S2StartLevel.
146
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
147
int ps;
148
149
param = aa64_va_parameters(env, address, mmu_idx,
150
- access_type != MMU_INST_FETCH);
151
+ access_type != MMU_INST_FETCH,
152
+ !arm_el_is_aa64(env, 1));
153
level = 0;
154
155
/*
156
diff --git a/target/arm/tcg/pauth_helper.c b/target/arm/tcg/pauth_helper.c
157
index XXXXXXX..XXXXXXX 100644
158
--- a/target/arm/tcg/pauth_helper.c
159
+++ b/target/arm/tcg/pauth_helper.c
160
@@ -XXX,XX +XXX,XX @@ static uint64_t pauth_addpac(CPUARMState *env, uint64_t ptr, uint64_t modifier,
161
ARMPACKey *key, bool data)
162
{
163
ARMMMUIdx mmu_idx = arm_stage1_mmu_idx(env);
164
- ARMVAParameters param = aa64_va_parameters(env, ptr, mmu_idx, data);
165
+ ARMVAParameters param = aa64_va_parameters(env, ptr, mmu_idx, data, false);
166
uint64_t pac, ext_ptr, ext, test;
167
int bot_bit, top_bit;
168
169
@@ -XXX,XX +XXX,XX @@ static uint64_t pauth_auth(CPUARMState *env, uint64_t ptr, uint64_t modifier,
170
ARMPACKey *key, bool data, int keynumber)
171
{
172
ARMMMUIdx mmu_idx = arm_stage1_mmu_idx(env);
173
- ARMVAParameters param = aa64_va_parameters(env, ptr, mmu_idx, data);
174
+ ARMVAParameters param = aa64_va_parameters(env, ptr, mmu_idx, data, false);
175
int bot_bit, top_bit;
176
uint64_t pac, orig_ptr, test;
177
178
@@ -XXX,XX +XXX,XX @@ static uint64_t pauth_auth(CPUARMState *env, uint64_t ptr, uint64_t modifier,
179
static uint64_t pauth_strip(CPUARMState *env, uint64_t ptr, bool data)
180
{
181
ARMMMUIdx mmu_idx = arm_stage1_mmu_idx(env);
182
- ARMVAParameters param = aa64_va_parameters(env, ptr, mmu_idx, data);
183
+ ARMVAParameters param = aa64_va_parameters(env, ptr, mmu_idx, data, false);
184
185
return pauth_original_ptr(ptr, param);
186
}
187
--
188
2.34.1
diff view generated by jsdifflib