1
target-arm queue for rc1 -- these are all bug fixes.
1
target-arm queue: nothing major here, but no point
2
sitting on them waiting for more stuff to come along.
2
3
3
thanks
4
thanks
4
-- PMM
5
-- PMM
5
6
6
The following changes since commit b9404bf592e7ba74180e1a54ed7a266ec6ee67f2:
7
The following changes since commit 1329132d28bf14b9508f7a1f04a2c63422bc3f99:
7
8
8
Merge remote-tracking branch 'remotes/dgilbert/tags/pull-hmp-20190715' into staging (2019-07-15 12:22:07 +0100)
9
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2019-09-26 16:14:03 +0100)
9
10
10
are available in the Git repository at:
11
are available in the Git repository at:
11
12
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190715
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190927
13
14
14
for you to fetch changes up to 51c9122e92b776a3f16af0b9282f1dc5012e2a19:
15
for you to fetch changes up to e4e34855e658b78ecac50a651cc847662ff02cfd:
15
16
16
target/arm: NS BusFault on vector table fetch escalates to NS HardFault (2019-07-15 14:17:04 +0100)
17
hw/arm/boot: Use the IEC binary prefix definitions (2019-09-27 11:44:39 +0100)
17
18
18
----------------------------------------------------------------
19
----------------------------------------------------------------
19
target-arm queue:
20
target-arm queue:
20
* report ARMv8-A FP support for AArch32 -cpu max
21
* Fix the CBAR register implementation for Cortex-A53,
21
* hw/ssi/xilinx_spips: Avoid AXI writes to the LQSPI linear memory
22
Cortex-A57, Cortex-A72
22
* hw/ssi/xilinx_spips: Avoid out-of-bound access to lqspi_buf[]
23
* Fix direct booting of Linux kernels on emulated CPUs
23
* hw/ssi/mss-spi: Avoid crash when reading empty RX FIFO
24
which have an AArch32 EL3 (incorrect NSACR settings
24
* hw/display/xlnx_dp: Avoid crash when reading empty RX FIFO
25
meant they could not access the FPU)
25
* hw/arm/virt: Fix non-secure flash mode
26
* semihosting cleanup: do more work at translate time
26
* pl031: Correctly migrate state when using -rtc clock=host
27
and less work at runtime
27
* fix regression that meant arm926 and arm1026 lost VFP
28
double-precision support
29
* v8M: NS BusFault on vector table fetch escalates to NS HardFault
30
28
31
----------------------------------------------------------------
29
----------------------------------------------------------------
32
Alex Bennée (1):
30
Alex Bennée (6):
33
target/arm: report ARMv8-A FP support for AArch32 -cpu max
31
tests/tcg: clean-up some comments after the de-tangling
32
target/arm: handle M-profile semihosting at translate time
33
target/arm: handle A-profile semihosting at translate time
34
target/arm: remove run time semihosting checks
35
target/arm: remove run-time semihosting checks for linux-user
36
tests/tcg: add linux-user semihosting smoke test for ARM
34
37
35
David Engraf (1):
38
Luc Michel (1):
36
hw/arm/virt: Fix non-secure flash mode
39
target/arm: fix CBAR register for AArch64 CPUs
37
40
38
Peter Maydell (3):
41
Peter Maydell (1):
39
pl031: Correctly migrate state when using -rtc clock=host
42
hw/arm/boot.c: Set NSACR.{CP11,CP10} for NS kernel boots
40
target/arm: Set VFP-related MVFR0 fields for arm926 and arm1026
41
target/arm: NS BusFault on vector table fetch escalates to NS HardFault
42
43
43
Philippe Mathieu-Daudé (5):
44
Philippe Mathieu-Daudé (1):
44
hw/ssi/xilinx_spips: Convert lqspi_read() to read_with_attrs
45
hw/arm/boot: Use the IEC binary prefix definitions
45
hw/ssi/xilinx_spips: Avoid AXI writes to the LQSPI linear memory
46
hw/ssi/xilinx_spips: Avoid out-of-bound access to lqspi_buf[]
47
hw/ssi/mss-spi: Avoid crash when reading empty RX FIFO
48
hw/display/xlnx_dp: Avoid crash when reading empty RX FIFO
49
46
50
include/hw/timer/pl031.h | 2 ++
47
tests/tcg/Makefile.target | 7 ++-
51
hw/arm/virt.c | 2 +-
48
tests/tcg/aarch64/Makefile.target | 8 ++-
52
hw/core/machine.c | 1 +
49
tests/tcg/arm/Makefile.target | 20 ++++---
53
hw/display/xlnx_dp.c | 15 +++++---
50
linux-user/arm/target_syscall.h | 3 -
54
hw/ssi/mss-spi.c | 8 ++++-
51
hw/arm/boot.c | 12 ++--
55
hw/ssi/xilinx_spips.c | 43 +++++++++++++++-------
52
linux-user/arm/cpu_loop.c | 3 -
56
hw/timer/pl031.c | 92 +++++++++++++++++++++++++++++++++++++++++++++---
53
target/arm/helper.c | 115 +++++++++++++-------------------------
57
target/arm/cpu.c | 16 +++++++++
54
target/arm/m_helper.c | 18 ++----
58
target/arm/m_helper.c | 21 ++++++++---
55
target/arm/translate.c | 30 ++++++++--
59
9 files changed, 174 insertions(+), 26 deletions(-)
56
tests/tcg/arm/semihosting.c | 45 +++++++++++++++
57
10 files changed, 146 insertions(+), 115 deletions(-)
58
create mode 100644 tests/tcg/arm/semihosting.c
60
59
diff view generated by jsdifflib
1
From: David Engraf <david.engraf@sysgo.com>
1
From: Luc Michel <luc.michel@greensocs.com>
2
2
3
Using the whole 128 MiB flash in non-secure mode is not working because
3
For AArch64 CPUs with a CBAR register, we have two views for it:
4
virt_flash_fdt() expects the same address for secure_sysmem and sysmem.
4
- in AArch64 state, the CBAR_EL1 register (S3_1_C15_C3_0), returns the
5
This is not correctly handled by caller because it forwards NULL for
5
full 64 bits CBAR value
6
secure_sysmem in non-secure flash mode.
6
- in AArch32 state, the CBAR register (cp15, opc1=1, CRn=15, CRm=3, opc2=0)
7
returns a 32 bits view such that:
8
CBAR = CBAR_EL1[31:18] 0..0 CBAR_EL1[43:32]
7
9
8
Fixed by using sysmem when secure_sysmem is NULL.
10
This commit fixes the current implementation where:
11
- CBAR_EL1 was returning the 32 bits view instead of the full 64 bits
12
value,
13
- CBAR was returning a truncated 32 bits version of the full 64 bits
14
one, instead of the 32 bits view
15
- CBAR was declared as cp15, opc1=4, CRn=15, CRm=0, opc2=0, which is
16
the CBAR register found in the ARMv7 Cortex-Ax CPUs, but not in
17
ARMv8 CPUs.
9
18
10
Signed-off-by: David Engraf <david.engraf@sysgo.com>
19
Signed-off-by: Luc Michel <luc.michel@greensocs.com>
11
Message-id: 20190712075002.14326-1-david.engraf@sysgo.com
20
Message-id: 20190912110103.1417887-1-luc.michel@greensocs.com
21
[PMM: Added a comment about the two different kinds of CBAR]
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
22
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
24
---
15
hw/arm/virt.c | 2 +-
25
target/arm/helper.c | 19 ++++++++++++++++---
16
1 file changed, 1 insertion(+), 1 deletion(-)
26
1 file changed, 16 insertions(+), 3 deletions(-)
17
27
18
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
19
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/virt.c
30
--- a/target/arm/helper.c
21
+++ b/hw/arm/virt.c
31
+++ b/target/arm/helper.c
22
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
32
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
23
&machine->device_memory->mr);
24
}
33
}
25
34
26
- virt_flash_fdt(vms, sysmem, secure_sysmem);
35
if (arm_feature(env, ARM_FEATURE_CBAR)) {
27
+ virt_flash_fdt(vms, sysmem, secure_sysmem ?: sysmem);
36
+ /*
28
37
+ * CBAR is IMPDEF, but common on Arm Cortex-A implementations.
29
create_gic(vms, pic);
38
+ * There are two flavours:
30
39
+ * (1) older 32-bit only cores have a simple 32-bit CBAR
40
+ * (2) 64-bit cores have a 64-bit CBAR visible to AArch64, plus a
41
+ * 32-bit register visible to AArch32 at a different encoding
42
+ * to the "flavour 1" register and with the bits rearranged to
43
+ * be able to squash a 64-bit address into the 32-bit view.
44
+ * We distinguish the two via the ARM_FEATURE_AARCH64 flag, but
45
+ * in future if we support AArch32-only configs of some of the
46
+ * AArch64 cores we might need to add a specific feature flag
47
+ * to indicate cores with "flavour 2" CBAR.
48
+ */
49
if (arm_feature(env, ARM_FEATURE_AARCH64)) {
50
/* 32 bit view is [31:18] 0...0 [43:32]. */
51
uint32_t cbar32 = (extract64(cpu->reset_cbar, 18, 14) << 18)
52
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
53
ARMCPRegInfo cbar_reginfo[] = {
54
{ .name = "CBAR",
55
.type = ARM_CP_CONST,
56
- .cp = 15, .crn = 15, .crm = 0, .opc1 = 4, .opc2 = 0,
57
- .access = PL1_R, .resetvalue = cpu->reset_cbar },
58
+ .cp = 15, .crn = 15, .crm = 3, .opc1 = 1, .opc2 = 0,
59
+ .access = PL1_R, .resetvalue = cbar32 },
60
{ .name = "CBAR_EL1", .state = ARM_CP_STATE_AA64,
61
.type = ARM_CP_CONST,
62
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 3, .opc2 = 0,
63
- .access = PL1_R, .resetvalue = cbar32 },
64
+ .access = PL1_R, .resetvalue = cpu->reset_cbar },
65
REGINFO_SENTINEL
66
};
67
/* We don't implement a r/w 64 bit CBAR currently */
31
--
68
--
32
2.20.1
69
2.20.1
33
70
34
71
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
In the previous commit we fixed a crash when the guest read a
3
These were missed in the recent de-tangling so have been updated to be
4
register that pop from an empty FIFO.
4
more actuate. I've also built up ARM_TESTS in a manner similar to
5
By auditing the repository, we found another similar use with
5
AARCH64_TESTS for better consistency.
6
an easy way to reproduce:
7
6
8
$ qemu-system-aarch64 -M xlnx-zcu102 -monitor stdio -S
7
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
9
QEMU 4.0.50 monitor - type 'help' for more information
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
(qemu) xp/b 0xfd4a0134
9
Message-id: 20190913151845.12582-2-alex.bennee@linaro.org
11
Aborted (core dumped)
12
13
(gdb) bt
14
#0 0x00007f6936dea57f in raise () at /lib64/libc.so.6
15
#1 0x00007f6936dd4895 in abort () at /lib64/libc.so.6
16
#2 0x0000561ad32975ec in xlnx_dp_aux_pop_rx_fifo (s=0x7f692babee70) at hw/display/xlnx_dp.c:431
17
#3 0x0000561ad3297dc0 in xlnx_dp_read (opaque=0x7f692babee70, offset=77, size=4) at hw/display/xlnx_dp.c:667
18
#4 0x0000561ad321b896 in memory_region_read_accessor (mr=0x7f692babf620, addr=308, value=0x7ffe05c1db88, size=4, shift=0, mask=4294967295, attrs=...) at memory.c:439
19
#5 0x0000561ad321bd70 in access_with_adjusted_size (addr=308, value=0x7ffe05c1db88, size=1, access_size_min=4, access_size_max=4, access_fn=0x561ad321b858 <memory_region_read_accessor>, mr=0x7f692babf620, attrs=...) at memory.c:569
20
#6 0x0000561ad321e9d5 in memory_region_dispatch_read1 (mr=0x7f692babf620, addr=308, pval=0x7ffe05c1db88, size=1, attrs=...) at memory.c:1420
21
#7 0x0000561ad321ea9d in memory_region_dispatch_read (mr=0x7f692babf620, addr=308, pval=0x7ffe05c1db88, size=1, attrs=...) at memory.c:1447
22
#8 0x0000561ad31bd742 in flatview_read_continue (fv=0x561ad69c04f0, addr=4249485620, attrs=..., buf=0x7ffe05c1dcf0 "\020\335\301\005\376\177", len=1, addr1=308, l=1, mr=0x7f692babf620) at exec.c:3385
23
#9 0x0000561ad31bd895 in flatview_read (fv=0x561ad69c04f0, addr=4249485620, attrs=..., buf=0x7ffe05c1dcf0 "\020\335\301\005\376\177", len=1) at exec.c:3423
24
#10 0x0000561ad31bd90b in address_space_read_full (as=0x561ad5bb3020, addr=4249485620, attrs=..., buf=0x7ffe05c1dcf0 "\020\335\301\005\376\177", len=1) at exec.c:3436
25
#11 0x0000561ad33b1c42 in address_space_read (len=1, buf=0x7ffe05c1dcf0 "\020\335\301\005\376\177", attrs=..., addr=4249485620, as=0x561ad5bb3020) at include/exec/memory.h:2131
26
#12 0x0000561ad33b1c42 in memory_dump (mon=0x561ad59c4530, count=1, format=120, wsize=1, addr=4249485620, is_physical=1) at monitor/misc.c:723
27
#13 0x0000561ad33b1fc1 in hmp_physical_memory_dump (mon=0x561ad59c4530, qdict=0x561ad6c6fd00) at monitor/misc.c:795
28
#14 0x0000561ad37b4a9f in handle_hmp_command (mon=0x561ad59c4530, cmdline=0x561ad59d0f22 "/b 0x00000000fd4a0134") at monitor/hmp.c:1082
29
30
Fix by checking the FIFO is not empty before popping from it.
31
32
The datasheet is not clear about the reset value of this register,
33
we choose to return '0'.
34
35
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
36
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
37
Message-id: 20190709113715.7761-4-philmd@redhat.com
38
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
39
---
11
---
40
hw/display/xlnx_dp.c | 15 +++++++++++----
12
tests/tcg/Makefile.target | 7 +++++--
41
1 file changed, 11 insertions(+), 4 deletions(-)
13
tests/tcg/aarch64/Makefile.target | 3 ++-
14
tests/tcg/arm/Makefile.target | 15 ++++++++-------
15
3 files changed, 15 insertions(+), 10 deletions(-)
42
16
43
diff --git a/hw/display/xlnx_dp.c b/hw/display/xlnx_dp.c
17
diff --git a/tests/tcg/Makefile.target b/tests/tcg/Makefile.target
44
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/display/xlnx_dp.c
19
--- a/tests/tcg/Makefile.target
46
+++ b/hw/display/xlnx_dp.c
20
+++ b/tests/tcg/Makefile.target
47
@@ -XXX,XX +XXX,XX @@ static uint8_t xlnx_dp_aux_pop_rx_fifo(XlnxDPState *s)
21
@@ -XXX,XX +XXX,XX @@ TIMEOUT=15
48
uint8_t ret;
22
endif
49
23
50
if (fifo8_is_empty(&s->rx_fifo)) {
24
ifdef CONFIG_USER_ONLY
51
- DPRINTF("rx_fifo underflow..\n");
25
-# The order we include is important. We include multiarch, base arch
52
- abort();
26
-# and finally arch if it's not the same as base arch.
53
+ qemu_log_mask(LOG_GUEST_ERROR,
27
+# The order we include is important. We include multiarch first and
54
+ "%s: Reading empty RX_FIFO\n",
28
+# then the target. If there are common tests shared between
55
+ __func__);
29
+# sub-targets (e.g. ARM & AArch64) then it is up to
56
+ /*
30
+# $(TARGET_NAME)/Makefile.target to include the common parent
57
+ * The datasheet is not clear about the reset value, it seems
31
+# architecture in its VPATH.
58
+ * to be unspecified. We choose to return '0'.
32
-include $(SRC_PATH)/tests/tcg/multiarch/Makefile.target
59
+ */
33
-include $(SRC_PATH)/tests/tcg/$(TARGET_NAME)/Makefile.target
60
+ ret = 0;
34
61
+ } else {
35
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
62
+ ret = fifo8_pop(&s->rx_fifo);
36
index XXXXXXX..XXXXXXX 100644
63
+ DPRINTF("pop 0x%" PRIX8 " from rx_fifo.\n", ret);
37
--- a/tests/tcg/aarch64/Makefile.target
64
}
38
+++ b/tests/tcg/aarch64/Makefile.target
65
- ret = fifo8_pop(&s->rx_fifo);
39
@@ -XXX,XX +XXX,XX @@ VPATH         += $(ARM_SRC)
66
- DPRINTF("pop 0x%" PRIX8 " from rx_fifo.\n", ret);
40
AARCH64_SRC=$(SRC_PATH)/tests/tcg/aarch64
67
return ret;
41
VPATH         += $(AARCH64_SRC)
68
}
42
69
43
-# we don't build any other ARM test
44
+# Float-convert Tests
45
AARCH64_TESTS=fcvt
46
47
fcvt: LDFLAGS+=-lm
48
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
49
    $(call run-test,$<,$(QEMU) $<, "$< on $(TARGET_NAME)")
50
    $(call diff-out,$<,$(AARCH64_SRC)/fcvt.ref)
51
52
+# Pauth Tests
53
AARCH64_TESTS += pauth-1 pauth-2
54
run-pauth-%: QEMU_OPTS += -cpu max
55
56
diff --git a/tests/tcg/arm/Makefile.target b/tests/tcg/arm/Makefile.target
57
index XXXXXXX..XXXXXXX 100644
58
--- a/tests/tcg/arm/Makefile.target
59
+++ b/tests/tcg/arm/Makefile.target
60
@@ -XXX,XX +XXX,XX @@ ARM_SRC=$(SRC_PATH)/tests/tcg/arm
61
# Set search path for all sources
62
VPATH         += $(ARM_SRC)
63
64
-ARM_TESTS=hello-arm test-arm-iwmmxt
65
-
66
-TESTS += $(ARM_TESTS) fcvt
67
-
68
+# Basic Hello World
69
+ARM_TESTS = hello-arm
70
hello-arm: CFLAGS+=-marm -ffreestanding
71
hello-arm: LDFLAGS+=-nostdlib
72
73
+# IWMXT floating point extensions
74
+ARM_TESTS += test-arm-iwmmxt
75
test-arm-iwmmxt: CFLAGS+=-marm -march=iwmmxt -mabi=aapcs -mfpu=fpv4-sp-d16
76
test-arm-iwmmxt: test-arm-iwmmxt.S
77
    $(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)
78
79
-ifeq ($(TARGET_NAME), arm)
80
+# Float-convert Tests
81
+ARM_TESTS += fcvt
82
fcvt: LDFLAGS+=-lm
83
# fcvt: CFLAGS+=-march=armv8.2-a+fp16 -mfpu=neon-fp-armv8
84
-
85
run-fcvt: fcvt
86
    $(call run-test,fcvt,$(QEMU) $<,"$< on $(TARGET_NAME)")
87
    $(call diff-out,fcvt,$(ARM_SRC)/fcvt.ref)
88
-endif
89
+
90
+TESTS += $(ARM_TESTS)
91
92
# On ARM Linux only supports 4k pages
93
EXTRA_RUNS+=run-test-mmap-4096
70
--
94
--
71
2.20.1
95
2.20.1
72
96
73
97
diff view generated by jsdifflib
1
In the M-profile architecture, when we do a vector table fetch and it
1
From: Alex Bennée <alex.bennee@linaro.org>
2
fails, we need to report a HardFault. Whether this is a Secure HF or
3
a NonSecure HF depends on several things. If AIRCR.BFHFNMINS is 0
4
then HF is always Secure, because there is no NonSecure HardFault.
5
Otherwise, the answer depends on whether the 'underlying exception'
6
(MemManage, BusFault, SecureFault) targets Secure or NonSecure. (In
7
the pseudocode, this is handled in the Vector() function: the final
8
exc.isSecure is calculated by looking at the exc.isSecure from the
9
exception returned from the memory access, not the isSecure input
10
argument.)
11
2
12
We weren't doing this correctly, because we were looking at
3
We do this for other semihosting calls so we might as well do it for
13
the target security domain of the exception we were trying to
4
M-profile as well.
14
load the vector table entry for. This produces errors of two kinds:
15
* a load from the NS vector table which hits the "NS access
16
to S memory" SecureFault should end up as a Secure HardFault,
17
but we were raising an NS HardFault
18
* a load from the S vector table which causes a BusFault
19
should raise an NS HardFault if BFHFNMINS == 1 (because
20
in that case all BusFaults are NonSecure), but we were raising
21
a Secure HardFault
22
5
23
Correct the logic.
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
24
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
25
We also fix a comment error where we claimed that we might
8
Message-id: 20190913151845.12582-3-alex.bennee@linaro.org
26
be escalating MemManage to HardFault, and forgot about SecureFault.
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
27
(Vector loads can never hit MPU access faults, because they're
28
always aligned and always use the default address map.)
29
30
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
31
Message-id: 20190705094823.28905-1-peter.maydell@linaro.org
32
---
11
---
33
target/arm/m_helper.c | 21 +++++++++++++++++----
12
target/arm/m_helper.c | 18 ++++++------------
34
1 file changed, 17 insertions(+), 4 deletions(-)
13
target/arm/translate.c | 11 ++++++++++-
14
2 files changed, 16 insertions(+), 13 deletions(-)
35
15
36
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
16
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
37
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/m_helper.c
18
--- a/target/arm/m_helper.c
39
+++ b/target/arm/m_helper.c
19
+++ b/target/arm/m_helper.c
40
@@ -XXX,XX +XXX,XX @@ static bool arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure,
20
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
41
if (sattrs.ns) {
21
break;
42
attrs.secure = false;
43
} else if (!targets_secure) {
44
- /* NS access to S memory */
45
+ /*
46
+ * NS access to S memory: the underlying exception which we escalate
47
+ * to HardFault is SecureFault, which always targets Secure.
48
+ */
49
+ exc_secure = true;
50
goto load_fail;
51
}
22
}
23
break;
24
+ case EXCP_SEMIHOST:
25
+ qemu_log_mask(CPU_LOG_INT,
26
+ "...handling as semihosting call 0x%x\n",
27
+ env->regs[0]);
28
+ env->regs[0] = do_arm_semihosting(env);
29
+ return;
30
case EXCP_BKPT:
31
- if (semihosting_enabled()) {
32
- int nr;
33
- nr = arm_lduw_code(env, env->regs[15], arm_sctlr_b(env)) & 0xff;
34
- if (nr == 0xab) {
35
- env->regs[15] += 2;
36
- qemu_log_mask(CPU_LOG_INT,
37
- "...handling as semihosting call 0x%x\n",
38
- env->regs[0]);
39
- env->regs[0] = do_arm_semihosting(env);
40
- return;
41
- }
42
- }
43
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_DEBUG, false);
44
break;
45
case EXCP_IRQ:
46
diff --git a/target/arm/translate.c b/target/arm/translate.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/translate.c
49
+++ b/target/arm/translate.c
50
@@ -XXX,XX +XXX,XX @@ static bool trans_BKPT(DisasContext *s, arg_BKPT *a)
51
if (!ENABLE_ARCH_5) {
52
return false;
52
}
53
}
53
@@ -XXX,XX +XXX,XX @@ static bool arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure,
54
- gen_exception_bkpt_insn(s, syn_aa32_bkpt(a->imm, false));
54
vector_entry = address_space_ldl(arm_addressspace(cs, attrs), addr,
55
+ if (arm_dc_feature(s, ARM_FEATURE_M) &&
55
attrs, &result);
56
+ semihosting_enabled() &&
56
if (result != MEMTX_OK) {
57
+#ifndef CONFIG_USER_ONLY
57
+ /*
58
+ !IS_USER(s) &&
58
+ * Underlying exception is BusFault: its target security state
59
+#endif
59
+ * depends on BFHFNMINS.
60
+ (a->imm == 0xab)) {
60
+ */
61
+ gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST);
61
+ exc_secure = !(cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK);
62
+ } else {
62
goto load_fail;
63
+ gen_exception_bkpt_insn(s, syn_aa32_bkpt(a->imm, false));
63
}
64
*pvec = vector_entry;
65
@@ -XXX,XX +XXX,XX @@ load_fail:
66
/*
67
* All vector table fetch fails are reported as HardFault, with
68
* HFSR.VECTTBL and .FORCED set. (FORCED is set because
69
- * technically the underlying exception is a MemManage or BusFault
70
+ * technically the underlying exception is a SecureFault or BusFault
71
* that is escalated to HardFault.) This is a terminal exception,
72
* so we will either take the HardFault immediately or else enter
73
* lockup (the latter case is handled in armv7m_nvic_set_pending_derived()).
74
+ * The HardFault is Secure if BFHFNMINS is 0 (meaning that all HFs are
75
+ * secure); otherwise it targets the same security state as the
76
+ * underlying exception.
77
*/
78
- exc_secure = targets_secure ||
79
- !(cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK);
80
+ if (!(cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK)) {
81
+ exc_secure = true;
82
+ }
64
+ }
83
env->v7m.hfsr |= R_V7M_HFSR_VECTTBL_MASK | R_V7M_HFSR_FORCED_MASK;
65
return true;
84
armv7m_nvic_set_pending_derived(env->nvic, ARMV7M_EXCP_HARD, exc_secure);
66
}
85
return false;
67
86
--
68
--
87
2.20.1
69
2.20.1
88
70
89
71
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
In the next commit we will implement the write_with_attrs()
3
As for the other semihosting calls we can resolve this at translate
4
handler. To avoid using different APIs, convert the read()
4
time.
5
handler first.
6
5
7
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
8
Tested-by: Francisco Iglesias <frasse.iglesias@gmail.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Message-id: 20190913151845.12582-4-alex.bennee@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
hw/ssi/xilinx_spips.c | 23 +++++++++++------------
11
target/arm/translate.c | 19 +++++++++++++++----
13
1 file changed, 11 insertions(+), 12 deletions(-)
12
1 file changed, 15 insertions(+), 4 deletions(-)
14
13
15
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/ssi/xilinx_spips.c
16
--- a/target/arm/translate.c
18
+++ b/hw/ssi/xilinx_spips.c
17
+++ b/target/arm/translate.c
19
@@ -XXX,XX +XXX,XX @@ static void lqspi_load_cache(void *opaque, hwaddr addr)
18
@@ -XXX,XX +XXX,XX @@ static bool trans_CBZ(DisasContext *s, arg_CBZ *a)
20
}
21
}
19
}
22
20
23
-static uint64_t
21
/*
24
-lqspi_read(void *opaque, hwaddr addr, unsigned int size)
22
- * Supervisor call
25
+static MemTxResult lqspi_read(void *opaque, hwaddr addr, uint64_t *value,
23
+ * Supervisor call - both T32 & A32 come here so we need to check
26
+ unsigned size, MemTxAttrs attrs)
24
+ * which mode we are in when checking for semihosting.
25
*/
26
27
static bool trans_SVC(DisasContext *s, arg_SVC *a)
27
{
28
{
28
- XilinxQSPIPS *q = opaque;
29
- gen_set_pc_im(s, s->base.pc_next);
29
- uint32_t ret;
30
- s->svc_imm = a->imm;
30
+ XilinxQSPIPS *q = XILINX_QSPIPS(opaque);
31
- s->base.is_jmp = DISAS_SWI;
31
32
+ const uint32_t semihost_imm = s->thumb ? 0xab : 0x123456;
32
if (addr >= q->lqspi_cached_addr &&
33
addr <= q->lqspi_cached_addr + LQSPI_CACHE_SIZE - 4) {
34
uint8_t *retp = &q->lqspi_buf[addr - q->lqspi_cached_addr];
35
- ret = cpu_to_le32(*(uint32_t *)retp);
36
- DB_PRINT_L(1, "addr: %08x, data: %08x\n", (unsigned)addr,
37
- (unsigned)ret);
38
- return ret;
39
- } else {
40
- lqspi_load_cache(opaque, addr);
41
- return lqspi_read(opaque, addr, size);
42
+ *value = cpu_to_le32(*(uint32_t *)retp);
43
+ DB_PRINT_L(1, "addr: %08" HWADDR_PRIx ", data: %08" PRIx64 "\n",
44
+ addr, *value);
45
+ return MEMTX_OK;
46
}
47
+
33
+
48
+ lqspi_load_cache(opaque, addr);
34
+ if (!arm_dc_feature(s, ARM_FEATURE_M) && semihosting_enabled() &&
49
+ return lqspi_read(opaque, addr, value, size, attrs);
35
+#ifndef CONFIG_USER_ONLY
36
+ !IS_USER(s) &&
37
+#endif
38
+ (a->imm == semihost_imm)) {
39
+ gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST);
40
+ } else {
41
+ gen_set_pc_im(s, s->base.pc_next);
42
+ s->svc_imm = a->imm;
43
+ s->base.is_jmp = DISAS_SWI;
44
+ }
45
return true;
50
}
46
}
51
47
52
static const MemoryRegionOps lqspi_ops = {
53
- .read = lqspi_read,
54
+ .read_with_attrs = lqspi_read,
55
.endianness = DEVICE_NATIVE_ENDIAN,
56
.valid = {
57
.min_access_size = 1,
58
--
48
--
59
2.20.1
49
2.20.1
60
50
61
51
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
When we converted to using feature bits in 602f6e42cfbf we missed out
3
Now we do all our checking and use a common EXCP_SEMIHOST for
4
the fact (dp && arm_dc_feature(s, ARM_FEATURE_V8)) was supported for
4
semihosting operations we can make helper code a lot simpler.
5
-cpu max configurations. This caused a regression in the GCC test
6
suite. Fix this by setting the appropriate bits in mvfr1.FPHP to
7
report ARMv8-A with FP support (but not ARMv8.2-FP16).
8
5
9
Fixes: https://bugs.launchpad.net/qemu/+bug/1836078
10
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20190711103737.10017-1-alex.bennee@linaro.org
8
Message-id: 20190913151845.12582-5-alex.bennee@linaro.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
10
---
15
target/arm/cpu.c | 4 ++++
11
target/arm/helper.c | 96 +++++++++++----------------------------------
16
1 file changed, 4 insertions(+)
12
1 file changed, 22 insertions(+), 74 deletions(-)
17
13
18
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.c
16
--- a/target/arm/helper.c
21
+++ b/target/arm/cpu.c
17
+++ b/target/arm/helper.c
22
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
18
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
23
t = FIELD_DP32(t, ID_ISAR6, SPECRES, 1);
19
new_el, env->pc, pstate_read(env));
24
cpu->isar.id_isar6 = t;
20
}
25
21
26
+ t = cpu->isar.mvfr1;
22
-static inline bool check_for_semihosting(CPUState *cs)
27
+ t = FIELD_DP32(t, MVFR1, FPHP, 2); /* v8.0 FP support */
23
-{
28
+ cpu->isar.mvfr1 = t;
24
+/*
29
+
25
+ * Do semihosting call and set the appropriate return value. All the
30
t = cpu->isar.mvfr2;
26
+ * permission and validity checks have been done at translate time.
31
t = FIELD_DP32(t, MVFR2, SIMDMISC, 3); /* SIMD MaxNum */
27
+ *
32
t = FIELD_DP32(t, MVFR2, FPMISC, 4); /* FP MaxNum */
28
+ * We only see semihosting exceptions in TCG only as they are not
29
+ * trapped to the hypervisor in KVM.
30
+ */
31
#ifdef CONFIG_TCG
32
- /* Check whether this exception is a semihosting call; if so
33
- * then handle it and return true; otherwise return false.
34
- */
35
+static void handle_semihosting(CPUState *cs)
36
+{
37
ARMCPU *cpu = ARM_CPU(cs);
38
CPUARMState *env = &cpu->env;
39
40
if (is_a64(env)) {
41
- if (cs->exception_index == EXCP_SEMIHOST) {
42
- /* This is always the 64-bit semihosting exception.
43
- * The "is this usermode" and "is semihosting enabled"
44
- * checks have been done at translate time.
45
- */
46
- qemu_log_mask(CPU_LOG_INT,
47
- "...handling as semihosting call 0x%" PRIx64 "\n",
48
- env->xregs[0]);
49
- env->xregs[0] = do_arm_semihosting(env);
50
- return true;
51
- }
52
- return false;
53
+ qemu_log_mask(CPU_LOG_INT,
54
+ "...handling as semihosting call 0x%" PRIx64 "\n",
55
+ env->xregs[0]);
56
+ env->xregs[0] = do_arm_semihosting(env);
57
} else {
58
- uint32_t imm;
59
-
60
- /* Only intercept calls from privileged modes, to provide some
61
- * semblance of security.
62
- */
63
- if (cs->exception_index != EXCP_SEMIHOST &&
64
- (!semihosting_enabled() ||
65
- ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR))) {
66
- return false;
67
- }
68
-
69
- switch (cs->exception_index) {
70
- case EXCP_SEMIHOST:
71
- /* This is always a semihosting call; the "is this usermode"
72
- * and "is semihosting enabled" checks have been done at
73
- * translate time.
74
- */
75
- break;
76
- case EXCP_SWI:
77
- /* Check for semihosting interrupt. */
78
- if (env->thumb) {
79
- imm = arm_lduw_code(env, env->regs[15] - 2, arm_sctlr_b(env))
80
- & 0xff;
81
- if (imm == 0xab) {
82
- break;
83
- }
84
- } else {
85
- imm = arm_ldl_code(env, env->regs[15] - 4, arm_sctlr_b(env))
86
- & 0xffffff;
87
- if (imm == 0x123456) {
88
- break;
89
- }
90
- }
91
- return false;
92
- case EXCP_BKPT:
93
- /* See if this is a semihosting syscall. */
94
- if (env->thumb) {
95
- imm = arm_lduw_code(env, env->regs[15], arm_sctlr_b(env))
96
- & 0xff;
97
- if (imm == 0xab) {
98
- env->regs[15] += 2;
99
- break;
100
- }
101
- }
102
- return false;
103
- default:
104
- return false;
105
- }
106
-
107
qemu_log_mask(CPU_LOG_INT,
108
"...handling as semihosting call 0x%x\n",
109
env->regs[0]);
110
env->regs[0] = do_arm_semihosting(env);
111
- return true;
112
}
113
-#else
114
- return false;
115
-#endif
116
}
117
+#endif
118
119
/* Handle a CPU exception for A and R profile CPUs.
120
* Do any appropriate logging, handle PSCI calls, and then hand off
121
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_interrupt(CPUState *cs)
122
return;
123
}
124
125
- /* Semihosting semantics depend on the register width of the
126
- * code that caused the exception, not the target exception level,
127
- * so must be handled here.
128
+ /*
129
+ * Semihosting semantics depend on the register width of the code
130
+ * that caused the exception, not the target exception level, so
131
+ * must be handled here.
132
*/
133
- if (check_for_semihosting(cs)) {
134
+#ifdef CONFIG_TCG
135
+ if (cs->exception_index == EXCP_SEMIHOST) {
136
+ handle_semihosting(cs);
137
return;
138
}
139
+#endif
140
141
/* Hooks may change global state so BQL should be held, also the
142
* BQL needs to be held for any modification of
33
--
143
--
34
2.20.1
144
2.20.1
35
145
36
146
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
Reading the RX_DATA register when the RX_FIFO is empty triggers
3
Now we do all our checking at translate time we can make cpu_loop a
4
an abort. This can be easily reproduced:
4
little bit simpler. We also introduce a simple linux-user semihosting
5
test case to defend the functionality. The out-of-tree softmmu based
6
semihosting tests are still more comprehensive.
5
7
6
$ qemu-system-arm -M emcraft-sf2 -monitor stdio -S
8
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
QEMU 4.0.50 monitor - type 'help' for more information
9
Message-id: 20190913151845.12582-6-alex.bennee@linaro.org
8
(qemu) x 0x40001010
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Aborted (core dumped)
10
11
(gdb) bt
12
#1 0x00007f035874f895 in abort () at /lib64/libc.so.6
13
#2 0x00005628686591ff in fifo8_pop (fifo=0x56286a9a4c68) at util/fifo8.c:66
14
#3 0x00005628683e0b8e in fifo32_pop (fifo=0x56286a9a4c68) at include/qemu/fifo32.h:137
15
#4 0x00005628683e0efb in spi_read (opaque=0x56286a9a4850, addr=4, size=4) at hw/ssi/mss-spi.c:168
16
#5 0x0000562867f96801 in memory_region_read_accessor (mr=0x56286a9a4b60, addr=16, value=0x7ffeecb0c5c8, size=4, shift=0, mask=4294967295, attrs=...) at memory.c:439
17
#6 0x0000562867f96cdb in access_with_adjusted_size (addr=16, value=0x7ffeecb0c5c8, size=4, access_size_min=1, access_size_max=4, access_fn=0x562867f967c3 <memory_region_read_accessor>, mr=0x56286a9a4b60, attrs=...) at memory.c:569
18
#7 0x0000562867f99940 in memory_region_dispatch_read1 (mr=0x56286a9a4b60, addr=16, pval=0x7ffeecb0c5c8, size=4, attrs=...) at memory.c:1420
19
#8 0x0000562867f99a08 in memory_region_dispatch_read (mr=0x56286a9a4b60, addr=16, pval=0x7ffeecb0c5c8, size=4, attrs=...) at memory.c:1447
20
#9 0x0000562867f38721 in flatview_read_continue (fv=0x56286aec6360, addr=1073745936, attrs=..., buf=0x7ffeecb0c7c0 "\340ǰ\354\376\177", len=4, addr1=16, l=4, mr=0x56286a9a4b60) at exec.c:3385
21
#10 0x0000562867f38874 in flatview_read (fv=0x56286aec6360, addr=1073745936, attrs=..., buf=0x7ffeecb0c7c0 "\340ǰ\354\376\177", len=4) at exec.c:3423
22
#11 0x0000562867f388ea in address_space_read_full (as=0x56286aa3e890, addr=1073745936, attrs=..., buf=0x7ffeecb0c7c0 "\340ǰ\354\376\177", len=4) at exec.c:3436
23
#12 0x0000562867f389c5 in address_space_rw (as=0x56286aa3e890, addr=1073745936, attrs=..., buf=0x7ffeecb0c7c0 "\340ǰ\354\376\177", len=4, is_write=false) at exec.c:3466
24
#13 0x0000562867f3bdd7 in cpu_memory_rw_debug (cpu=0x56286aa19d00, addr=1073745936, buf=0x7ffeecb0c7c0 "\340ǰ\354\376\177", len=4, is_write=0) at exec.c:3976
25
#14 0x000056286811ed51 in memory_dump (mon=0x56286a8c32d0, count=1, format=120, wsize=4, addr=1073745936, is_physical=0) at monitor/misc.c:730
26
#15 0x000056286811eff1 in hmp_memory_dump (mon=0x56286a8c32d0, qdict=0x56286b15c400) at monitor/misc.c:785
27
#16 0x00005628684740ee in handle_hmp_command (mon=0x56286a8c32d0, cmdline=0x56286a8caeb2 "0x40001010") at monitor/hmp.c:1082
28
29
From the datasheet "Actel SmartFusion Microcontroller Subsystem
30
User's Guide" Rev.1, Table 13-3 "SPI Register Summary", this
31
register has a reset value of 0.
32
33
Check the FIFO is not empty before accessing it, else log an
34
error message.
35
36
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
37
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
38
Message-id: 20190709113715.7761-3-philmd@redhat.com
39
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
40
---
12
---
41
hw/ssi/mss-spi.c | 8 +++++++-
13
linux-user/arm/target_syscall.h | 3 ---
42
1 file changed, 7 insertions(+), 1 deletion(-)
14
linux-user/arm/cpu_loop.c | 3 ---
15
2 files changed, 6 deletions(-)
43
16
44
diff --git a/hw/ssi/mss-spi.c b/hw/ssi/mss-spi.c
17
diff --git a/linux-user/arm/target_syscall.h b/linux-user/arm/target_syscall.h
45
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/ssi/mss-spi.c
19
--- a/linux-user/arm/target_syscall.h
47
+++ b/hw/ssi/mss-spi.c
20
+++ b/linux-user/arm/target_syscall.h
48
@@ -XXX,XX +XXX,XX @@ spi_read(void *opaque, hwaddr addr, unsigned int size)
21
@@ -XXX,XX +XXX,XX @@ struct target_pt_regs {
49
case R_SPI_RX:
22
#define ARM_NR_set_tls     (ARM_NR_BASE + 5)
50
s->regs[R_SPI_STATUS] &= ~S_RXFIFOFUL;
23
#define ARM_NR_get_tls (ARM_NR_BASE + 6)
51
s->regs[R_SPI_STATUS] &= ~S_RXCHOVRF;
24
52
- ret = fifo32_pop(&s->rx_fifo);
25
-#define ARM_NR_semihosting     0x123456
53
+ if (fifo32_is_empty(&s->rx_fifo)) {
26
-#define ARM_NR_thumb_semihosting 0xAB
54
+ qemu_log_mask(LOG_GUEST_ERROR,
27
-
55
+ "%s: Reading empty RX_FIFO\n",
28
#if defined(TARGET_WORDS_BIGENDIAN)
56
+ __func__);
29
#define UNAME_MACHINE "armv5teb"
57
+ } else {
30
#else
58
+ ret = fifo32_pop(&s->rx_fifo);
31
diff --git a/linux-user/arm/cpu_loop.c b/linux-user/arm/cpu_loop.c
59
+ }
32
index XXXXXXX..XXXXXXX 100644
60
if (fifo32_is_empty(&s->rx_fifo)) {
33
--- a/linux-user/arm/cpu_loop.c
61
s->regs[R_SPI_STATUS] |= S_RXFIFOEMP;
34
+++ b/linux-user/arm/cpu_loop.c
62
}
35
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
36
37
if (n == ARM_NR_cacheflush) {
38
/* nop */
39
- } else if (n == ARM_NR_semihosting
40
- || n == ARM_NR_thumb_semihosting) {
41
- env->regs[0] = do_arm_semihosting (env);
42
} else if (n == 0 || n >= ARM_SYSCALL_BASE || env->thumb) {
43
/* linux syscall */
44
if (env->thumb || n == 0) {
63
--
45
--
64
2.20.1
46
2.20.1
65
47
66
48
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
Lei Sun found while auditing the code that a CPU write would
3
We already use semihosting for the system stuff so this is a simple
4
trigger a NULL pointer dereference.
4
smoke test to ensure we are working OK on linux-user.
5
5
6
>From UG1085 datasheet [*] AXI writes in this region are ignored
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
and generates an AXI Slave Error (SLVERR).
7
Message-id: 20190913151845.12582-7-alex.bennee@linaro.org
8
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Fix by implementing the write_with_attrs() handler.
10
Return MEMTX_ERROR when the region is accessed (this error maps
11
to an AXI slave error).
12
13
[*] https://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf
14
15
Reported-by: Lei Sun <slei.casper@gmail.com>
16
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
17
Tested-by: Francisco Iglesias <frasse.iglesias@gmail.com>
18
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
10
---
21
hw/ssi/xilinx_spips.c | 16 ++++++++++++++++
11
tests/tcg/aarch64/Makefile.target | 5 ++++
22
1 file changed, 16 insertions(+)
12
tests/tcg/arm/Makefile.target | 5 ++++
13
tests/tcg/arm/semihosting.c | 45 +++++++++++++++++++++++++++++++
14
3 files changed, 55 insertions(+)
15
create mode 100644 tests/tcg/arm/semihosting.c
23
16
24
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
17
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
25
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/ssi/xilinx_spips.c
19
--- a/tests/tcg/aarch64/Makefile.target
27
+++ b/hw/ssi/xilinx_spips.c
20
+++ b/tests/tcg/aarch64/Makefile.target
28
@@ -XXX,XX +XXX,XX @@ static MemTxResult lqspi_read(void *opaque, hwaddr addr, uint64_t *value,
21
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
29
return lqspi_read(opaque, addr, value, size, attrs);
22
AARCH64_TESTS += pauth-1 pauth-2
30
}
23
run-pauth-%: QEMU_OPTS += -cpu max
31
24
32
+static MemTxResult lqspi_write(void *opaque, hwaddr offset, uint64_t value,
25
+# Semihosting smoke test for linux-user
33
+ unsigned size, MemTxAttrs attrs)
26
+AARCH64_TESTS += semihosting
27
+run-semihosting: semihosting
28
+    $(call run-test,$<,$(QEMU) $< 2> $<.err, "$< on $(TARGET_NAME)")
29
+
30
TESTS += $(AARCH64_TESTS)
31
diff --git a/tests/tcg/arm/Makefile.target b/tests/tcg/arm/Makefile.target
32
index XXXXXXX..XXXXXXX 100644
33
--- a/tests/tcg/arm/Makefile.target
34
+++ b/tests/tcg/arm/Makefile.target
35
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
36
    $(call run-test,fcvt,$(QEMU) $<,"$< on $(TARGET_NAME)")
37
    $(call diff-out,fcvt,$(ARM_SRC)/fcvt.ref)
38
39
+# Semihosting smoke test for linux-user
40
+ARM_TESTS += semihosting
41
+run-semihosting: semihosting
42
+    $(call run-test,$<,$(QEMU) $< 2> $<.err, "$< on $(TARGET_NAME)")
43
+
44
TESTS += $(ARM_TESTS)
45
46
# On ARM Linux only supports 4k pages
47
diff --git a/tests/tcg/arm/semihosting.c b/tests/tcg/arm/semihosting.c
48
new file mode 100644
49
index XXXXXXX..XXXXXXX
50
--- /dev/null
51
+++ b/tests/tcg/arm/semihosting.c
52
@@ -XXX,XX +XXX,XX @@
53
+/*
54
+ * linux-user semihosting checks
55
+ *
56
+ * Copyright (c) 2019
57
+ * Written by Alex Bennée <alex.bennee@linaro.org>
58
+ *
59
+ * SPDX-License-Identifier: GPL-3.0-or-later
60
+ */
61
+
62
+#include <stdint.h>
63
+
64
+#define SYS_WRITE0 0x04
65
+#define SYS_REPORTEXC 0x18
66
+
67
+void __semi_call(uintptr_t type, uintptr_t arg0)
34
+{
68
+{
35
+ /*
69
+#if defined(__arm__)
36
+ * From UG1085, Chapter 24 (Quad-SPI controllers):
70
+ register uintptr_t t asm("r0") = type;
37
+ * - Writes are ignored
71
+ register uintptr_t a0 asm("r1") = arg0;
38
+ * - AXI writes generate an external AXI slave error (SLVERR)
72
+ asm("svc 0xab"
39
+ */
73
+ : /* no return */
40
+ qemu_log_mask(LOG_GUEST_ERROR, "%s Unexpected %u-bit access to 0x%" PRIx64
74
+ : "r" (t), "r" (a0));
41
+ " (value: 0x%" PRIx64 "\n",
75
+#else
42
+ __func__, size << 3, offset, value);
76
+ register uintptr_t t asm("x0") = type;
43
+
77
+ register uintptr_t a0 asm("x1") = arg0;
44
+ return MEMTX_ERROR;
78
+ asm("hlt 0xf000"
79
+ : /* no return */
80
+ : "r" (t), "r" (a0));
81
+#endif
45
+}
82
+}
46
+
83
+
47
static const MemoryRegionOps lqspi_ops = {
84
+int main(int argc, char *argv[argc])
48
.read_with_attrs = lqspi_read,
85
+{
49
+ .write_with_attrs = lqspi_write,
86
+#if defined(__arm__)
50
.endianness = DEVICE_NATIVE_ENDIAN,
87
+ uintptr_t exit_code = 0x20026;
51
.valid = {
88
+#else
52
.min_access_size = 1,
89
+ uintptr_t exit_block[2] = {0x20026, 0};
90
+ uintptr_t exit_code = (uintptr_t) &exit_block;
91
+#endif
92
+
93
+ __semi_call(SYS_WRITE0, (uintptr_t) "Hello World");
94
+ __semi_call(SYS_REPORTEXC, exit_code);
95
+ /* if we get here we failed */
96
+ return -1;
97
+}
53
--
98
--
54
2.20.1
99
2.20.1
55
100
56
101
diff view generated by jsdifflib
1
The ARMv5 architecture didn't specify detailed per-feature ID
1
If we're booting a Linux kernel directly into Non-Secure
2
registers. Now that we're using the MVFR0 register fields to
2
state on a CPU which has Secure state, then make sure we
3
gate the existence of VFP instructions, we need to set up
3
set the NSACR CP11 and CP10 bits, so that Non-Secure is allowed
4
the correct values in the cpu->isar structure so that we still
4
to access the FPU. Otherwise an AArch32 kernel will UNDEF as
5
provide an FPU to the guest.
5
soon as it tries to use the FPU.
6
6
7
This fixes a regression in the arm926 and arm1026 CPUs, which
7
It used to not matter that we didn't do this until commit
8
are the only ones that both have VFP and are ARMv5 or earlier.
8
fc1120a7f5f2d4b6, where we implemented actually honouring
9
This regression was introduced by the VFP refactoring, and more
9
these NSACR bits.
10
specifically by commits 1120827fa182f0e76 and 266bd25c485597c,
11
which accidentally disabled VFP short-vector support and
12
double-precision support on these CPUs.
13
10
14
Fixes: 1120827fa182f0e
11
The problem only exists for CPUs where EL3 is AArch32; the
15
Fixes: 266bd25c485597c
12
equivalent AArch64 trap bits are in CPTR_EL3 and are "0 to
16
Fixes: https://bugs.launchpad.net/qemu/+bug/1836192
13
not trap, 1 to trap", so the reset value of the register
17
Reported-by: Christophe Lyon <christophe.lyon@linaro.org>
14
permits NS access, unlike NSACR.
15
16
Fixes: fc1120a7f5
17
Fixes: https://bugs.launchpad.net/qemu/+bug/1844597
18
Cc: qemu-stable@nongnu.org
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
21
Message-id: 20190920174039.3916-1-peter.maydell@linaro.org
21
Tested-by: Christophe Lyon <christophe.lyon@linaro.org>
22
Message-id: 20190711131241.22231-1-peter.maydell@linaro.org
23
---
22
---
24
target/arm/cpu.c | 12 ++++++++++++
23
hw/arm/boot.c | 2 ++
25
1 file changed, 12 insertions(+)
24
1 file changed, 2 insertions(+)
26
25
27
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
26
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
28
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/cpu.c
28
--- a/hw/arm/boot.c
30
+++ b/target/arm/cpu.c
29
+++ b/hw/arm/boot.c
31
@@ -XXX,XX +XXX,XX @@ static void arm926_initfn(Object *obj)
30
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
32
* set the field to indicate Jazelle support within QEMU.
31
(cs != first_cpu || !info->secure_board_setup)) {
33
*/
32
/* Linux expects non-secure state */
34
cpu->isar.id_isar1 = FIELD_DP32(cpu->isar.id_isar1, ID_ISAR1, JAZELLE, 1);
33
env->cp15.scr_el3 |= SCR_NS;
35
+ /*
34
+ /* Set NSACR.{CP11,CP10} so NS can access the FPU */
36
+ * Similarly, we need to set MVFR0 fields to enable double precision
35
+ env->cp15.nsacr |= 3 << 10;
37
+ * and short vector support even though ARMv5 doesn't have this register.
36
}
38
+ */
37
}
39
+ cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSHVEC, 1);
38
40
+ cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPDP, 1);
41
}
42
43
static void arm946_initfn(Object *obj)
44
@@ -XXX,XX +XXX,XX @@ static void arm1026_initfn(Object *obj)
45
* set the field to indicate Jazelle support within QEMU.
46
*/
47
cpu->isar.id_isar1 = FIELD_DP32(cpu->isar.id_isar1, ID_ISAR1, JAZELLE, 1);
48
+ /*
49
+ * Similarly, we need to set MVFR0 fields to enable double precision
50
+ * and short vector support even though ARMv5 doesn't have this register.
51
+ */
52
+ cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSHVEC, 1);
53
+ cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPDP, 1);
54
55
{
56
/* The 1026 had an IFAR at c6,c0,0,1 rather than the ARMv6 c6,c0,0,2 */
57
--
39
--
58
2.20.1
40
2.20.1
59
41
60
42
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
Both lqspi_read() and lqspi_load_cache() expect a 32-bit
3
IEC binary prefixes ease code review: the unit is explicit.
4
aligned address.
5
4
6
>From UG1085 datasheet [*] chapter on 'Quad-SPI Controller':
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
6
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
8
Transfer Size Limitations
7
Reviewed-by: Thomas Huth <thuth@redhat.com>
9
10
Because of the 32-bit wide TX, RX, and generic FIFO, all
11
APB/AXI transfers must be an integer multiple of 4-bytes.
12
Shorter transfers are not possible.
13
14
Set MemoryRegionOps.impl values to force 32-bit accesses,
15
this way we are sure we do not access the lqspi_buf[] array
16
out of bound.
17
18
[*] https://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf
19
20
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
21
Tested-by: Francisco Iglesias <frasse.iglesias@gmail.com>
22
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20190923131108.21459-1-philmd@redhat.com
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
11
---
25
hw/ssi/xilinx_spips.c | 4 ++++
12
hw/arm/boot.c | 10 +++++-----
26
1 file changed, 4 insertions(+)
13
1 file changed, 5 insertions(+), 5 deletions(-)
27
14
28
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
15
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
29
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/ssi/xilinx_spips.c
17
--- a/hw/arm/boot.c
31
+++ b/hw/ssi/xilinx_spips.c
18
+++ b/hw/arm/boot.c
32
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps lqspi_ops = {
19
@@ -XXX,XX +XXX,XX @@ int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
33
.read_with_attrs = lqspi_read,
20
goto fail;
34
.write_with_attrs = lqspi_write,
21
}
35
.endianness = DEVICE_NATIVE_ENDIAN,
22
36
+ .impl = {
23
- if (scells < 2 && binfo->ram_size >= (1ULL << 32)) {
37
+ .min_access_size = 4,
24
+ if (scells < 2 && binfo->ram_size >= 4 * GiB) {
38
+ .max_access_size = 4,
25
/* This is user error so deserves a friendlier error message
39
+ },
26
* than the failure of setprop_sized_cells would provide
40
.valid = {
27
*/
41
.min_access_size = 1,
28
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
42
.max_access_size = 4
29
* we might still make a bad choice here.
30
*/
31
info->initrd_start = info->loader_start +
32
- MIN(info->ram_size / 2, 128 * 1024 * 1024);
33
+ MIN(info->ram_size / 2, 128 * MiB);
34
if (image_high_addr) {
35
info->initrd_start = MAX(info->initrd_start, image_high_addr);
36
}
37
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
38
*
39
* Let's play safe and prealign it to 2MB to give us some space.
40
*/
41
- align = 2 * 1024 * 1024;
42
+ align = 2 * MiB;
43
} else {
44
/*
45
* Some 32bit kernels will trash anything in the 4K page the
46
* initrd ends in, so make sure the DTB isn't caught up in that.
47
*/
48
- align = 4096;
49
+ align = 4 * KiB;
50
}
51
52
/* Place the DTB after the initrd in memory with alignment. */
53
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
54
info->loader_start + KERNEL_ARGS_ADDR;
55
fixupcontext[FIXUP_ARGPTR_HI] =
56
(info->loader_start + KERNEL_ARGS_ADDR) >> 32;
57
- if (info->ram_size >= (1ULL << 32)) {
58
+ if (info->ram_size >= 4 * GiB) {
59
error_report("RAM size must be less than 4GB to boot"
60
" Linux kernel using ATAGS (try passing a device tree"
61
" using -dtb)");
43
--
62
--
44
2.20.1
63
2.20.1
45
64
46
65
diff view generated by jsdifflib
Deleted patch
1
The PL031 RTC tracks the difference between the guest RTC
2
and the host RTC using a tick_offset field. For migration,
3
however, we currently always migrate the offset between
4
the guest and the vm_clock, even if the RTC clock is not
5
the same as the vm_clock; this was an attempt to retain
6
migration backwards compatibility.
7
1
8
Unfortunately this results in the RTC behaving oddly across
9
a VM state save and restore -- since the VM clock stands still
10
across save-then-restore, regardless of how much real world
11
time has elapsed, the guest RTC ends up out of sync with the
12
host RTC in the restored VM.
13
14
Fix this by migrating the raw tick_offset. To retain migration
15
compatibility as far as possible, we have a new property
16
migrate-tick-offset; by default this is 'true' and we will
17
migrate the true tick offset in a new subsection; if the
18
incoming data has no subsection we fall back to the old
19
vm_clock-based offset information, so old->new migration
20
compatibility is preserved. For complete new->old migration
21
compatibility, the property is set to 'false' for 4.0 and
22
earlier machine types (this will only affect 'virt-4.0'
23
and below, as none of the other pl031-using machines are
24
versioned).
25
26
Reported-by: Russell King <rmk@armlinux.org.uk>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
29
Message-id: 20190709143912.28905-1-peter.maydell@linaro.org
30
---
31
include/hw/timer/pl031.h | 2 +
32
hw/core/machine.c | 1 +
33
hw/timer/pl031.c | 92 ++++++++++++++++++++++++++++++++++++++--
34
3 files changed, 91 insertions(+), 4 deletions(-)
35
36
diff --git a/include/hw/timer/pl031.h b/include/hw/timer/pl031.h
37
index XXXXXXX..XXXXXXX 100644
38
--- a/include/hw/timer/pl031.h
39
+++ b/include/hw/timer/pl031.h
40
@@ -XXX,XX +XXX,XX @@ typedef struct PL031State {
41
*/
42
uint32_t tick_offset_vmstate;
43
uint32_t tick_offset;
44
+ bool tick_offset_migrated;
45
+ bool migrate_tick_offset;
46
47
uint32_t mr;
48
uint32_t lr;
49
diff --git a/hw/core/machine.c b/hw/core/machine.c
50
index XXXXXXX..XXXXXXX 100644
51
--- a/hw/core/machine.c
52
+++ b/hw/core/machine.c
53
@@ -XXX,XX +XXX,XX @@ GlobalProperty hw_compat_4_0[] = {
54
{ "virtio-gpu-pci", "edid", "false" },
55
{ "virtio-device", "use-started", "false" },
56
{ "virtio-balloon-device", "qemu-4-0-config-size", "true" },
57
+ { "pl031", "migrate-tick-offset", "false" },
58
};
59
const size_t hw_compat_4_0_len = G_N_ELEMENTS(hw_compat_4_0);
60
61
diff --git a/hw/timer/pl031.c b/hw/timer/pl031.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/hw/timer/pl031.c
64
+++ b/hw/timer/pl031.c
65
@@ -XXX,XX +XXX,XX @@ static int pl031_pre_save(void *opaque)
66
{
67
PL031State *s = opaque;
68
69
- /* tick_offset is base_time - rtc_clock base time. Instead, we want to
70
- * store the base time relative to the QEMU_CLOCK_VIRTUAL for backwards-compatibility. */
71
+ /*
72
+ * The PL031 device model code uses the tick_offset field, which is
73
+ * the offset between what the guest RTC should read and what the
74
+ * QEMU rtc_clock reads:
75
+ * guest_rtc = rtc_clock + tick_offset
76
+ * and so
77
+ * tick_offset = guest_rtc - rtc_clock
78
+ *
79
+ * We want to migrate this offset, which sounds straightforward.
80
+ * Unfortunately older versions of QEMU migrated a conversion of this
81
+ * offset into an offset from the vm_clock. (This was in turn an
82
+ * attempt to be compatible with even older QEMU versions, but it
83
+ * has incorrect behaviour if the rtc_clock is not the same as the
84
+ * vm_clock.) So we put the actual tick_offset into a migration
85
+ * subsection, and the backwards-compatible time-relative-to-vm_clock
86
+ * in the main migration state.
87
+ *
88
+ * Calculate base time relative to QEMU_CLOCK_VIRTUAL:
89
+ */
90
int64_t delta = qemu_clock_get_ns(rtc_clock) - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
91
s->tick_offset_vmstate = s->tick_offset + delta / NANOSECONDS_PER_SECOND;
92
93
return 0;
94
}
95
96
+static int pl031_pre_load(void *opaque)
97
+{
98
+ PL031State *s = opaque;
99
+
100
+ s->tick_offset_migrated = false;
101
+ return 0;
102
+}
103
+
104
static int pl031_post_load(void *opaque, int version_id)
105
{
106
PL031State *s = opaque;
107
108
- int64_t delta = qemu_clock_get_ns(rtc_clock) - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
109
- s->tick_offset = s->tick_offset_vmstate - delta / NANOSECONDS_PER_SECOND;
110
+ /*
111
+ * If we got the tick_offset subsection, then we can just use
112
+ * the value in that. Otherwise the source is an older QEMU and
113
+ * has given us the offset from the vm_clock; convert it back to
114
+ * an offset from the rtc_clock. This will cause time to incorrectly
115
+ * go backwards compared to the host RTC, but this is unavoidable.
116
+ */
117
+
118
+ if (!s->tick_offset_migrated) {
119
+ int64_t delta = qemu_clock_get_ns(rtc_clock) -
120
+ qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
121
+ s->tick_offset = s->tick_offset_vmstate -
122
+ delta / NANOSECONDS_PER_SECOND;
123
+ }
124
pl031_set_alarm(s);
125
return 0;
126
}
127
128
+static int pl031_tick_offset_post_load(void *opaque, int version_id)
129
+{
130
+ PL031State *s = opaque;
131
+
132
+ s->tick_offset_migrated = true;
133
+ return 0;
134
+}
135
+
136
+static bool pl031_tick_offset_needed(void *opaque)
137
+{
138
+ PL031State *s = opaque;
139
+
140
+ return s->migrate_tick_offset;
141
+}
142
+
143
+static const VMStateDescription vmstate_pl031_tick_offset = {
144
+ .name = "pl031/tick-offset",
145
+ .version_id = 1,
146
+ .minimum_version_id = 1,
147
+ .needed = pl031_tick_offset_needed,
148
+ .post_load = pl031_tick_offset_post_load,
149
+ .fields = (VMStateField[]) {
150
+ VMSTATE_UINT32(tick_offset, PL031State),
151
+ VMSTATE_END_OF_LIST()
152
+ }
153
+};
154
+
155
static const VMStateDescription vmstate_pl031 = {
156
.name = "pl031",
157
.version_id = 1,
158
.minimum_version_id = 1,
159
.pre_save = pl031_pre_save,
160
+ .pre_load = pl031_pre_load,
161
.post_load = pl031_post_load,
162
.fields = (VMStateField[]) {
163
VMSTATE_UINT32(tick_offset_vmstate, PL031State),
164
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pl031 = {
165
VMSTATE_UINT32(im, PL031State),
166
VMSTATE_UINT32(is, PL031State),
167
VMSTATE_END_OF_LIST()
168
+ },
169
+ .subsections = (const VMStateDescription*[]) {
170
+ &vmstate_pl031_tick_offset,
171
+ NULL
172
}
173
};
174
175
+static Property pl031_properties[] = {
176
+ /*
177
+ * True to correctly migrate the tick offset of the RTC. False to
178
+ * obtain backward migration compatibility with older QEMU versions,
179
+ * at the expense of the guest RTC going backwards compared with the
180
+ * host RTC when the VM is saved/restored if using -rtc host.
181
+ * (Even if set to 'true' older QEMU can migrate forward to newer QEMU;
182
+ * 'false' also permits newer QEMU to migrate to older QEMU.)
183
+ */
184
+ DEFINE_PROP_BOOL("migrate-tick-offset",
185
+ PL031State, migrate_tick_offset, true),
186
+ DEFINE_PROP_END_OF_LIST()
187
+};
188
+
189
static void pl031_class_init(ObjectClass *klass, void *data)
190
{
191
DeviceClass *dc = DEVICE_CLASS(klass);
192
193
dc->vmsd = &vmstate_pl031;
194
+ dc->props = pl031_properties;
195
}
196
197
static const TypeInfo pl031_info = {
198
--
199
2.20.1
200
201
diff view generated by jsdifflib