1
A set of small bugfixes for arm for 3.0; the "migration was
1
Handful of bugfixes for rc2. None of these are particularly critical
2
broken" fixes for SMMUv3 and v7M NVIC with security extensions
2
or exciting.
3
are the most significant.
4
3
5
thanks
6
-- PMM
4
-- PMM
7
5
8
The following changes since commit 6d9dd5fb9d0e9f4a174f53a0e20a39fbe809c71e:
6
The following changes since commit 45a150aa2b3492acf6691c7bdbeb25a8545d8345:
9
7
10
Merge remote-tracking branch 'remotes/armbru/tags/pull-qobject-2018-07-27-v2' into staging (2018-07-30 09:55:47 +0100)
8
Merge remote-tracking branch 'remotes/ericb/tags/pull-bitmaps-2020-08-03' into staging (2020-08-03 15:13:49 +0100)
11
9
12
are available in the Git repository at:
10
are available in the Git repository at:
13
11
14
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180730
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200803
15
13
16
for you to fetch changes up to 0261fb805c00a6f97d143235e7b06b0906bdf898:
14
for you to fetch changes up to 13557fd392890cbd985bceba7f717e01efd674b8:
17
15
18
target/arm: Remove duplicate 'host' entry in '-cpu ?' output (2018-07-30 15:07:08 +0100)
16
hw/timer/imx_epit: Avoid assertion when CR.SWR is written (2020-08-03 17:56:11 +0100)
19
17
20
----------------------------------------------------------------
18
----------------------------------------------------------------
21
target-arm queue:
19
target-arm queue:
22
* arm/smmuv3: Fix broken VM state migration
20
* hw/timer/imx_epit: Avoid assertion when CR.SWR is written
23
* armv7m_nvic: Fix broken VM state migration
21
* netduino2, netduinoplus2, microbit: set system_clock_scale so that
24
* hw/arm/sysbus-fdt: Fix assertion in copy_properties_from_host()
22
SysTick running on the CPU clock works
25
* hw/arm/iotkit: Fix IRQ number for timer1
23
* target/arm: Avoid maybe-uninitialized warning with gcc 4.9
26
* hw/misc/tz-mpc: Zero the LUT on initialization, not just reset
24
* target/arm: Fix AddPAC error indication
27
* target/arm: Remove duplicate 'host' entry in '-cpu ?' output
25
* Make AIRCR.SYSRESETREQ actually reset the system for the
26
microbit, mps2-*, musca-*, netduino* boards
28
27
29
----------------------------------------------------------------
28
----------------------------------------------------------------
30
Dr. David Alan Gilbert (1):
29
Kaige Li (1):
31
arm/smmuv3: Fix missing VMSD terminator
30
target/arm: Avoid maybe-uninitialized warning with gcc 4.9
32
31
33
Geert Uytterhoeven (1):
32
Peter Maydell (6):
34
hw/arm/sysbus-fdt: Fix assertion in copy_properties_from_host()
33
hw/arm/netduino2, netduinoplus2: Set system_clock_scale
34
include/hw/irq.h: New function qemu_irq_is_connected()
35
hw/intc/armv7m_nvic: Provide default "reset the system" behaviour for SYSRESETREQ
36
msf2-soc, stellaris: Don't wire up SYSRESETREQ
37
hw/arm/nrf51_soc: Set system_clock_scale
38
hw/timer/imx_epit: Avoid assertion when CR.SWR is written
35
39
36
Peter Maydell (3):
40
Richard Henderson (1):
37
armv7m_nvic: Fix m-security subsection name
41
target/arm: Fix AddPAC error indication
38
hw/arm/iotkit: Fix IRQ number for timer1
39
hw/misc/tz-mpc: Zero the LUT on initialization, not just reset
40
42
41
Philippe Mathieu-Daudé (1):
43
include/hw/arm/armv7m.h | 4 +++-
42
target/arm: Remove duplicate 'host' entry in '-cpu ?' output
44
include/hw/irq.h | 18 ++++++++++++++++++
45
hw/arm/msf2-soc.c | 11 -----------
46
hw/arm/netduino2.c | 10 ++++++++++
47
hw/arm/netduinoplus2.c | 10 ++++++++++
48
hw/arm/nrf51_soc.c | 5 +++++
49
hw/arm/stellaris.c | 12 ------------
50
hw/intc/armv7m_nvic.c | 17 ++++++++++++++++-
51
hw/timer/imx_epit.c | 13 ++++++++++---
52
target/arm/pauth_helper.c | 6 +++++-
53
target/arm/translate-a64.c | 2 +-
54
tests/tcg/aarch64/pauth-5.c | 33 +++++++++++++++++++++++++++++++++
55
tests/tcg/aarch64/Makefile.target | 2 +-
56
13 files changed, 112 insertions(+), 31 deletions(-)
57
create mode 100644 tests/tcg/aarch64/pauth-5.c
43
58
44
hw/arm/iotkit.c | 2 +-
45
hw/arm/smmuv3.c | 1 +
46
hw/arm/sysbus-fdt.c | 1 +
47
hw/intc/armv7m_nvic.c | 2 +-
48
hw/misc/tz-mpc.c | 2 +-
49
target/arm/helper.c | 6 ------
50
6 files changed, 5 insertions(+), 9 deletions(-)
51
diff view generated by jsdifflib
New patch
1
The netduino2 and netduinoplus2 boards forgot to set the system_clock_scale
2
global, which meant that if guest code used the systick timer in "use
3
the processor clock" mode it would hang because time never advances.
1
4
5
Set the global to match the documented CPU clock speed of these boards.
6
Judging by the data sheet this is slightly simplistic because the
7
SoC allows configuration of the SYSCLK source and frequency via the
8
RCC (reset and clock control) module, but we don't model that.
9
10
Fixes: https://bugs.launchpad.net/qemu/+bug/1876187
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-id: 20200727162617.26227-1-peter.maydell@linaro.org
14
---
15
hw/arm/netduino2.c | 10 ++++++++++
16
hw/arm/netduinoplus2.c | 10 ++++++++++
17
2 files changed, 20 insertions(+)
18
19
diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/netduino2.c
22
+++ b/hw/arm/netduino2.c
23
@@ -XXX,XX +XXX,XX @@
24
#include "hw/arm/stm32f205_soc.h"
25
#include "hw/arm/boot.h"
26
27
+/* Main SYSCLK frequency in Hz (120MHz) */
28
+#define SYSCLK_FRQ 120000000ULL
29
+
30
static void netduino2_init(MachineState *machine)
31
{
32
DeviceState *dev;
33
34
+ /*
35
+ * TODO: ideally we would model the SoC RCC and let it handle
36
+ * system_clock_scale, including its ability to define different
37
+ * possible SYSCLK sources.
38
+ */
39
+ system_clock_scale = NANOSECONDS_PER_SECOND / SYSCLK_FRQ;
40
+
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
--
70
2.20.1
71
72
diff view generated by jsdifflib
New patch
1
Mostly devices don't need to care whether one of their output
2
qemu_irq lines is connected, because functions like qemu_set_irq()
3
silently do nothing if there is nothing on the other end. However
4
sometimes a device might want to implement default behaviour for the
5
case where the machine hasn't wired the line up to anywhere.
1
6
7
Provide a function qemu_irq_is_connected() that devices can use for
8
this purpose. (The test is trivial but encapsulating it in a
9
function makes it easier to see where we're doing it in case we need
10
to change the implementation later.)
11
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
15
Message-id: 20200728103744.6909-2-peter.maydell@linaro.org
16
---
17
include/hw/irq.h | 18 ++++++++++++++++++
18
1 file changed, 18 insertions(+)
19
20
diff --git a/include/hw/irq.h b/include/hw/irq.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/irq.h
23
+++ b/include/hw/irq.h
24
@@ -XXX,XX +XXX,XX @@ qemu_irq qemu_irq_split(qemu_irq irq1, qemu_irq irq2);
25
on an existing vector of qemu_irq. */
26
void qemu_irq_intercept_in(qemu_irq *gpio_in, qemu_irq_handler handler, int n);
27
28
+/**
29
+ * qemu_irq_is_connected: Return true if IRQ line is wired up
30
+ *
31
+ * If a qemu_irq has a device on the other (receiving) end of it,
32
+ * return true; otherwise return false.
33
+ *
34
+ * Usually device models don't need to care whether the machine model
35
+ * has wired up their outbound qemu_irq lines, because functions like
36
+ * qemu_set_irq() silently do nothing if there is nothing on the other
37
+ * end of the line. However occasionally a device model will want to
38
+ * provide default behaviour if its output is left floating, and
39
+ * it can use this function to identify when that is the case.
40
+ */
41
+static inline bool qemu_irq_is_connected(qemu_irq irq)
42
+{
43
+ return irq != NULL;
44
+}
45
+
46
#endif
47
--
48
2.20.1
49
50
diff view generated by jsdifflib
1
The vmstate save/load code insists that subsections of a VMState must
1
The NVIC provides an outbound qemu_irq "SYSRESETREQ" which it signals
2
have names which include their parent VMState's name as a leading
2
when the guest sets the SYSRESETREQ bit in the AIRCR register. This
3
substring. Unfortunately it neither documents this nor checks it on
3
matches the hardware design (where the CPU has a signal of this name
4
device init or state save, but instead fails state load with a
4
and it is up to the SoC to connect that up to an actual reset
5
confusing error message ("Missing section footer for armv7m_nvic").
5
mechanism), but in QEMU it mostly results in duplicated code in SoC
6
objects and bugs where SoC model implementors forget to wire up the
7
SYSRESETREQ line.
6
8
7
Fix the name of the m-security subsection of the NVIC, so that
9
Provide a default behaviour for the case where SYSRESETREQ is not
8
state save/load works correctly for the security-enabled NVIC.
10
actually connected to anything: use qemu_system_reset_request() to
11
perform a system reset. This will allow us to remove the
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
16
* microbit
17
* mps2-an385
18
* mps2-an505
19
* mps2-an511
20
* mps2-an521
21
* musca-a
22
* musca-b1
23
* netduino
24
* netduinoplus2
25
26
We still allow the board to wire up the signal if it needs to, in case
27
we need to model more complicated reset controller logic or to model
28
buggy SoC hardware which forgot to wire up the line itself. But
29
defaulting to "reset the system" is more often going to be correct
30
than defaulting to "do nothing".
9
31
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
33
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20180727113854.20283-2-peter.maydell@linaro.org
34
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
35
Message-id: 20200728103744.6909-3-peter.maydell@linaro.org
13
---
36
---
14
hw/intc/armv7m_nvic.c | 2 +-
37
include/hw/arm/armv7m.h | 4 +++-
15
1 file changed, 1 insertion(+), 1 deletion(-)
38
hw/intc/armv7m_nvic.c | 17 ++++++++++++++++-
39
2 files changed, 19 insertions(+), 2 deletions(-)
16
40
41
diff --git a/include/hw/arm/armv7m.h b/include/hw/arm/armv7m.h
42
index XXXXXXX..XXXXXXX 100644
43
--- a/include/hw/arm/armv7m.h
44
+++ b/include/hw/arm/armv7m.h
45
@@ -XXX,XX +XXX,XX @@ typedef struct {
46
47
/* ARMv7M container object.
48
* + Unnamed GPIO input lines: external IRQ lines for the NVIC
49
- * + Named GPIO output SYSRESETREQ: signalled for guest AIRCR.SYSRESETREQ
50
+ * + Named GPIO output SYSRESETREQ: signalled for guest AIRCR.SYSRESETREQ.
51
+ * If this GPIO is not wired up then the NVIC will default to performing
52
+ * a qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET).
53
* + Property "cpu-type": CPU type to instantiate
54
* + Property "num-irq": number of external IRQ lines
55
* + Property "memory": MemoryRegion defining the physical address space
17
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
56
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
18
index XXXXXXX..XXXXXXX 100644
57
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/armv7m_nvic.c
58
--- a/hw/intc/armv7m_nvic.c
20
+++ b/hw/intc/armv7m_nvic.c
59
+++ b/hw/intc/armv7m_nvic.c
21
@@ -XXX,XX +XXX,XX @@ static int nvic_security_post_load(void *opaque, int version_id)
60
@@ -XXX,XX +XXX,XX @@
22
}
61
#include "hw/intc/armv7m_nvic.h"
23
62
#include "hw/irq.h"
24
static const VMStateDescription vmstate_nvic_security = {
63
#include "hw/qdev-properties.h"
25
- .name = "nvic/m-security",
64
+#include "sysemu/runstate.h"
26
+ .name = "armv7m_nvic/m-security",
65
#include "target/arm/cpu.h"
27
.version_id = 1,
66
#include "exec/exec-all.h"
28
.minimum_version_id = 1,
67
#include "exec/memop.h"
29
.needed = nvic_security_needed,
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
+{
74
+ if (qemu_irq_is_connected(s->sysresetreq)) {
75
+ qemu_irq_pulse(s->sysresetreq);
76
+ } else {
77
+ /*
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
+ }
84
+}
85
+
86
static int nvic_pending_prio(NVICState *s)
87
{
88
/* return the group priority of the current pending interrupt,
89
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
90
if (value & R_V7M_AIRCR_SYSRESETREQ_MASK) {
91
if (attrs.secure ||
92
!(cpu->env.v7m.aircr & R_V7M_AIRCR_SYSRESETREQS_MASK)) {
93
- qemu_irq_pulse(s->sysresetreq);
94
+ signal_sysresetreq(s);
95
}
96
}
97
if (value & R_V7M_AIRCR_VECTCLRACTIVE_MASK) {
30
--
98
--
31
2.17.1
99
2.20.1
32
100
33
101
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The MSF2 SoC model and the Stellaris board code both wire
2
SYSRESETREQ up to a function that just invokes
3
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
4
This is now the default action that the NVIC does if the line is
5
not connected, so we can delete the handling code.
2
6
3
Since 86f0a186d6f the TYPE_ARM_HOST_CPU is only compiled when CONFIG_KVM
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
is enabled.
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20200728103744.6909-4-peter.maydell@linaro.org
11
---
12
hw/arm/msf2-soc.c | 11 -----------
13
hw/arm/stellaris.c | 12 ------------
14
2 files changed, 23 deletions(-)
5
15
6
Remove the now redundant special-case introduced in a96c0514ab7, to avoid:
16
diff --git a/hw/arm/msf2-soc.c b/hw/arm/msf2-soc.c
7
8
$ qemu-system-aarch64 -machine virt -cpu \? | fgrep host
9
host
10
host (only available in KVM mode)
11
12
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180727132311.2777-1-f4bug@amsat.org
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
target/arm/helper.c | 6 ------
18
1 file changed, 6 deletions(-)
19
20
diff --git a/target/arm/helper.c b/target/arm/helper.c
21
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/helper.c
18
--- a/hw/arm/msf2-soc.c
23
+++ b/target/arm/helper.c
19
+++ b/hw/arm/msf2-soc.c
24
@@ -XXX,XX +XXX,XX @@ void arm_cpu_list(FILE *f, fprintf_function cpu_fprintf)
20
@@ -XXX,XX +XXX,XX @@
25
(*cpu_fprintf)(f, "Available CPUs:\n");
21
#include "hw/irq.h"
26
g_slist_foreach(list, arm_cpu_list_entry, &s);
22
#include "hw/arm/msf2-soc.h"
27
g_slist_free(list);
23
#include "hw/misc/unimp.h"
28
-#ifdef CONFIG_KVM
24
-#include "sysemu/runstate.h"
29
- /* The 'host' CPU type is dynamically registered only if KVM is
25
#include "sysemu/sysemu.h"
30
- * enabled, so we have to special-case it here:
26
31
- */
27
#define MSF2_TIMER_BASE 0x40004000
32
- (*cpu_fprintf)(f, " host (only available in KVM mode)\n");
28
@@ -XXX,XX +XXX,XX @@ static const int spi_irq[MSF2_NUM_SPIS] = { 2, 3 };
33
-#endif
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
-
39
static void m2sxxx_soc_initfn(Object *obj)
40
{
41
MSF2State *s = MSF2_SOC(obj);
42
@@ -XXX,XX +XXX,XX @@ static void m2sxxx_soc_realize(DeviceState *dev_soc, Error **errp)
43
return;
44
}
45
46
- qdev_connect_gpio_out_named(DEVICE(&s->armv7m.nvic), "SYSRESETREQ", 0,
47
- qemu_allocate_irq(&do_sys_reset, NULL, 0));
48
-
49
system_clock_scale = NANOSECONDS_PER_SECOND / s->m3clk;
50
51
for (i = 0; i < MSF2_NUM_UARTS; i++) {
52
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/hw/arm/stellaris.c
55
+++ b/hw/arm/stellaris.c
56
@@ -XXX,XX +XXX,XX @@
57
#include "hw/boards.h"
58
#include "qemu/log.h"
59
#include "exec/address-spaces.h"
60
-#include "sysemu/runstate.h"
61
#include "sysemu/sysemu.h"
62
#include "hw/arm/armv7m.h"
63
#include "hw/char/pl011.h"
64
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_init(Object *obj)
65
qdev_init_gpio_in(dev, stellaris_adc_trigger, 1);
34
}
66
}
35
67
36
static void arm_cpu_add_definition(gpointer data, gpointer user_data)
68
-static
69
-void do_sys_reset(void *opaque, int n, int level)
70
-{
71
- if (level) {
72
- qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
73
- }
74
-}
75
-
76
/* Board init. */
77
static stellaris_board_info stellaris_boards[] = {
78
{ "LM3S811EVB",
79
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
80
/* This will exit with an error if the user passed us a bad cpu_type */
81
sysbus_realize_and_unref(SYS_BUS_DEVICE(nvic), &error_fatal);
82
83
- qdev_connect_gpio_out_named(nvic, "SYSRESETREQ", 0,
84
- qemu_allocate_irq(&do_sys_reset, NULL, 0));
85
-
86
if (board->dc1 & (1 << 16)) {
87
dev = sysbus_create_varargs(TYPE_STELLARIS_ADC, 0x40038000,
88
qdev_get_gpio_in(nvic, 14),
37
--
89
--
38
2.17.1
90
2.20.1
39
91
40
92
diff view generated by jsdifflib
1
From: Geert Uytterhoeven <geert+renesas@glider.be>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
When copy_properties_from_host() ignores the error for an optional
3
The definition of top_bit used in this function is one higher
4
property, it frees the error, but fails to reset it.
4
than that used in the Arm ARM psuedo-code, which put the error
5
indication at top_bit - 1 at the wrong place, which meant that
6
it wasn't visible to Auth.
5
7
6
Hence if two or more optional properties are missing, an assertion is
8
Fixing the definition of top_bit requires more changes, because
7
triggered:
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.
8
11
9
util/error.c:57: error_setv: Assertion `*errp == NULL' failed.
12
For now, prefer the minimal fix to the error indication alone.
10
13
11
Fis this by resetting err to NULL after ignoring the error.
14
Fixes: 63ff0ca94cb
12
15
Reported-by: Derrick McKee <derrick.mckee@gmail.com>
13
Fixes: 9481cf2e5f2f2bb6 ("hw/arm/sysbus-fdt: helpers for clock node generation")
16
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
17
Message-id: 20200728195706.11087-1-richard.henderson@linaro.org
15
Message-id: 20180725113000.11014-1-geert+renesas@glider.be
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
[PMM: added comment about the divergence from the pseudocode]
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
21
---
19
hw/arm/sysbus-fdt.c | 1 +
22
target/arm/pauth_helper.c | 6 +++++-
20
1 file changed, 1 insertion(+)
23
tests/tcg/aarch64/pauth-5.c | 33 +++++++++++++++++++++++++++++++
24
tests/tcg/aarch64/Makefile.target | 2 +-
25
3 files changed, 39 insertions(+), 2 deletions(-)
26
create mode 100644 tests/tcg/aarch64/pauth-5.c
21
27
22
diff --git a/hw/arm/sysbus-fdt.c b/hw/arm/sysbus-fdt.c
28
diff --git a/target/arm/pauth_helper.c b/target/arm/pauth_helper.c
23
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
24
--- a/hw/arm/sysbus-fdt.c
30
--- a/target/arm/pauth_helper.c
25
+++ b/hw/arm/sysbus-fdt.c
31
+++ b/target/arm/pauth_helper.c
26
@@ -XXX,XX +XXX,XX @@ static void copy_properties_from_host(HostProperty *props, int nb_props,
32
@@ -XXX,XX +XXX,XX @@ static uint64_t pauth_addpac(CPUARMState *env, uint64_t ptr, uint64_t modifier,
27
/* mandatory property not found: bail out */
33
*/
28
exit(1);
34
test = sextract64(ptr, bot_bit, top_bit - bot_bit);
29
}
35
if (test != 0 && test != -1) {
30
+ err = NULL;
36
- pac ^= MAKE_64BIT_MASK(top_bit - 1, 1);
31
}
37
+ /*
38
+ * Note that our top_bit is one greater than the pseudocode's
39
+ * version, hence "- 2" here.
40
+ */
41
+ pac ^= MAKE_64BIT_MASK(top_bit - 2, 1);
32
}
42
}
33
}
43
44
/*
45
diff --git a/tests/tcg/aarch64/pauth-5.c b/tests/tcg/aarch64/pauth-5.c
46
new file mode 100644
47
index XXXXXXX..XXXXXXX
48
--- /dev/null
49
+++ b/tests/tcg/aarch64/pauth-5.c
50
@@ -XXX,XX +XXX,XX @@
51
+#include <assert.h>
52
+
53
+static int x;
54
+
55
+int main()
56
+{
57
+ int *p0 = &x, *p1, *p2, *p3;
58
+ unsigned long salt = 0;
59
+
60
+ /*
61
+ * With TBI enabled and a 48-bit VA, there are 7 bits of auth, and so
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
34
--
97
--
35
2.17.1
98
2.20.1
36
99
37
100
diff view generated by jsdifflib
1
In the tz-mpc device we allocate a data block for the LUT,
1
From: Kaige Li <likaige@loongson.cn>
2
which we then clear to zero in the device's reset method.
3
This is conceptually fine, but unfortunately results in a
4
valgrind complaint about use of uninitialized data on startup:
5
2
6
==30906== Conditional jump or move depends on uninitialised value(s)
3
GCC version 4.9.4 isn't clever enough to figure out that all
7
==30906== at 0x503609: tz_mpc_translate (tz-mpc.c:439)
4
execution paths in disas_ldst() that use 'fn' will have initialized
8
==30906== by 0x3F3D90: address_space_translate_iommu (exec.c:511)
5
it first, and so it warns:
9
==30906== by 0x3F3FF8: flatview_do_translate (exec.c:584)
10
==30906== by 0x3F4292: flatview_translate (exec.c:644)
11
==30906== by 0x3F2120: address_space_translate (memory.h:1962)
12
==30906== by 0x3FB753: address_space_ldl_internal (memory_ldst.inc.c:36)
13
==30906== by 0x3FB8A6: address_space_ldl (memory_ldst.inc.c:80)
14
==30906== by 0x619037: ldl_phys (memory_ldst_phys.inc.h:25)
15
==30906== by 0x61985D: arm_cpu_reset (cpu.c:255)
16
==30906== by 0x98791B: cpu_reset (cpu.c:249)
17
==30906== by 0x57FFDB: armv7m_reset (armv7m.c:265)
18
==30906== by 0x7B1775: qemu_devices_reset (reset.c:69)
19
6
20
This is because of a reset ordering problem -- the TZ MPC
7
/home/LiKaige/qemu/target/arm/translate-a64.c: In function ‘disas_ldst’:
21
resets after the CPU, but an M-profile CPU's reset function
8
/home/LiKaige/qemu/target/arm/translate-a64.c:3392:5: error: ‘fn’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
22
includes memory loads to get the initial PC and SP, which
9
fn(cpu_reg(s, rt), clean_addr, tcg_rs, get_mem_index(s),
23
then go through an MPC that hasn't yet been reset.
10
^
11
/home/LiKaige/qemu/target/arm/translate-a64.c:3318:22: note: ‘fn’ was declared here
12
AtomicThreeOpFn *fn;
13
^
24
14
25
The simplest fix for this is to zero the LUT when we
15
Make it happy by initializing the variable to NULL.
26
initialize the data, which will result in the MPC's
27
translate function giving the right answers for these
28
early memory accesses.
29
16
30
Reported-by: Thomas Huth <thuth@redhat.com>
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]
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
Tested-by: Thomas Huth <thuth@redhat.com>
33
Message-id: 20180724153616.32352-1-peter.maydell@linaro.org
34
---
22
---
35
hw/misc/tz-mpc.c | 2 +-
23
target/arm/translate-a64.c | 2 +-
36
1 file changed, 1 insertion(+), 1 deletion(-)
24
1 file changed, 1 insertion(+), 1 deletion(-)
37
25
38
diff --git a/hw/misc/tz-mpc.c b/hw/misc/tz-mpc.c
26
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
39
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/misc/tz-mpc.c
28
--- a/target/arm/translate-a64.c
41
+++ b/hw/misc/tz-mpc.c
29
+++ b/target/arm/translate-a64.c
42
@@ -XXX,XX +XXX,XX @@ static void tz_mpc_realize(DeviceState *dev, Error **errp)
30
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_atomic(DisasContext *s, uint32_t insn,
43
address_space_init(&s->blocked_io_as, &s->blocked_io,
31
bool r = extract32(insn, 22, 1);
44
"tz-mpc-blocked-io");
32
bool a = extract32(insn, 23, 1);
45
33
TCGv_i64 tcg_rs, clean_addr;
46
- s->blk_lut = g_new(uint32_t, s->blk_max);
34
- AtomicThreeOpFn *fn;
47
+ s->blk_lut = g_new0(uint32_t, s->blk_max);
35
+ AtomicThreeOpFn *fn = NULL;
48
}
36
49
37
if (is_vector || !dc_isar_feature(aa64_atomics, s)) {
50
static int tz_mpc_post_load(void *opaque, int version_id)
38
unallocated_encoding(s);
51
--
39
--
52
2.17.1
40
2.20.1
53
41
54
42
diff view generated by jsdifflib
1
A cut-and-paste error meant we were incorrectly wiring up the timer1
1
The nrf51 SoC model wasn't setting the system_clock_scale
2
IRQ to IRQ3. IRQ3 is the interrupt for timer0 -- move timer0 to
2
global.which meant that if guest code used the systick timer in "use
3
IRQ4 where it belongs.
3
the processor clock" mode it would hang because time never advances.
4
5
Set the global to match the documented CPU clock speed for this SoC.
6
7
This SoC in fact doesn't have a SysTick timer (which is the only thing
8
currently that cares about the system_clock_scale), because it's
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.
4
12
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20180727113854.20283-3-peter.maydell@linaro.org
15
Message-id: 20200727193458.31250-1-peter.maydell@linaro.org
8
---
16
---
9
hw/arm/iotkit.c | 2 +-
17
hw/arm/nrf51_soc.c | 5 +++++
10
1 file changed, 1 insertion(+), 1 deletion(-)
18
1 file changed, 5 insertions(+)
11
19
12
diff --git a/hw/arm/iotkit.c b/hw/arm/iotkit.c
20
diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
13
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/arm/iotkit.c
22
--- a/hw/arm/nrf51_soc.c
15
+++ b/hw/arm/iotkit.c
23
+++ b/hw/arm/nrf51_soc.c
16
@@ -XXX,XX +XXX,XX @@ static void iotkit_realize(DeviceState *dev, Error **errp)
24
@@ -XXX,XX +XXX,XX @@
25
26
#define BASE_TO_IRQ(base) ((base >> 12) & 0x1F)
27
28
+/* HCLK (the main CPU clock) on this SoC is always 16MHz */
29
+#define HCLK_FRQ 16000000
30
+
31
static uint64_t clock_read(void *opaque, hwaddr addr, unsigned int size)
32
{
33
qemu_log_mask(LOG_UNIMP, "%s: 0x%" HWADDR_PRIx " [%u]\n",
34
@@ -XXX,XX +XXX,XX @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp)
17
return;
35
return;
18
}
36
}
19
sysbus_connect_irq(SYS_BUS_DEVICE(&s->timer1), 0,
37
20
- qdev_get_gpio_in(DEVICE(&s->armv7m), 3));
38
+ system_clock_scale = NANOSECONDS_PER_SECOND / HCLK_FRQ;
21
+ qdev_get_gpio_in(DEVICE(&s->armv7m), 4));
39
+
22
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->timer1), 0);
40
object_property_set_link(OBJECT(&s->cpu), "memory", OBJECT(&s->container),
23
object_property_set_link(OBJECT(&s->apb_ppc0), OBJECT(mr), "port[1]", &err);
41
&error_abort);
24
if (err) {
42
if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpu), errp)) {
25
--
43
--
26
2.17.1
44
2.20.1
27
45
28
46
diff view generated by jsdifflib
1
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
1
The imx_epit device has a software-controllable reset triggered by
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".
2
7
3
The 'vmstate_smmuv3_queue' is missing the end-of-list marker.
8
The cleanest way to avoid this double-transaction is to move the
9
start-transaction for the CR write handling down below the check of
10
the SWR bit.
4
11
5
Fixes: 10a83cb9887
12
Fixes: https://bugs.launchpad.net/qemu/+bug/1880424
6
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
13
Fixes: cc2722ec83ad944505fe
7
Message-id: 20180727135406.15132-1-dgilbert@redhat.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
[PMM: dropped stray blank line]
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
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
11
---
17
---
12
hw/arm/smmuv3.c | 1 +
18
hw/timer/imx_epit.c | 13 ++++++++++---
13
1 file changed, 1 insertion(+)
19
1 file changed, 10 insertions(+), 3 deletions(-)
14
20
15
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
21
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
16
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/smmuv3.c
23
--- a/hw/timer/imx_epit.c
18
+++ b/hw/arm/smmuv3.c
24
+++ b/hw/timer/imx_epit.c
19
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_smmuv3_queue = {
25
@@ -XXX,XX +XXX,XX @@ static void imx_epit_write(void *opaque, hwaddr offset, uint64_t value,
20
VMSTATE_UINT32(prod, SMMUQueue),
26
21
VMSTATE_UINT32(cons, SMMUQueue),
27
switch (offset >> 2) {
22
VMSTATE_UINT8(log2size, SMMUQueue),
28
case 0: /* CR */
23
+ VMSTATE_END_OF_LIST(),
29
- ptimer_transaction_begin(s->timer_cmp);
24
},
30
- ptimer_transaction_begin(s->timer_reload);
25
};
31
32
oldcr = s->cr;
33
s->cr = value & 0x03ffffff;
34
if (s->cr & CR_SWR) {
35
/* handle the reset */
36
imx_epit_reset(DEVICE(s));
37
- } else {
38
+ /*
39
+ * TODO: could we 'break' here? following operations appear
40
+ * to duplicate the work imx_epit_reset() already did.
41
+ */
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
}
26
50
27
--
51
--
28
2.17.1
52
2.20.1
29
53
30
54
diff view generated by jsdifflib