1
target-arm queue for rc1 -- these are all bug fixes.
1
Patches for rc1: nothing major, just some minor bugfixes and
2
code cleanups.
2
3
3
thanks
4
-- PMM
4
-- PMM
5
5
6
The following changes since commit b9404bf592e7ba74180e1a54ed7a266ec6ee67f2:
6
The following changes since commit f7e1914adad8885a5d4c70239ab90d901ed97e9f:
7
7
8
Merge remote-tracking branch 'remotes/dgilbert/tags/pull-hmp-20190715' into staging (2019-07-15 12:22:07 +0100)
8
Merge remote-tracking branch 'remotes/alistair/tags/pull-riscv-to-apply-20201109' into staging (2020-11-10 09:24:56 +0000)
9
9
10
are available in the Git repository at:
10
are available in the Git repository at:
11
11
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190715
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20201110
13
13
14
for you to fetch changes up to 51c9122e92b776a3f16af0b9282f1dc5012e2a19:
14
for you to fetch changes up to b6c56c8a9a4064ea783f352f43c5df6231a110fa:
15
15
16
target/arm: NS BusFault on vector table fetch escalates to NS HardFault (2019-07-15 14:17:04 +0100)
16
target/arm/translate-neon.c: Handle VTBL UNDEF case before VFP access check (2020-11-10 11:03:48 +0000)
17
17
18
----------------------------------------------------------------
18
----------------------------------------------------------------
19
target-arm queue:
19
target-arm queue:
20
* report ARMv8-A FP support for AArch32 -cpu max
20
* hw/arm/Kconfig: ARM_V7M depends on PTIMER
21
* hw/ssi/xilinx_spips: Avoid AXI writes to the LQSPI linear memory
21
* Minor coding style fixes
22
* hw/ssi/xilinx_spips: Avoid out-of-bound access to lqspi_buf[]
22
* docs: add some notes on the sbsa-ref machine
23
* hw/ssi/mss-spi: Avoid crash when reading empty RX FIFO
23
* hw/arm/virt: Remove dependency on Cortex-A15 MPCore peripherals
24
* hw/display/xlnx_dp: Avoid crash when reading empty RX FIFO
24
* target/arm: Fix neon VTBL/VTBX for len > 1
25
* hw/arm/virt: Fix non-secure flash mode
25
* hw/arm/armsse: Correct expansion MPC interrupt lines
26
* pl031: Correctly migrate state when using -rtc clock=host
26
* hw/misc/stm32f2xx_syscfg: Remove extraneous IRQ
27
* fix regression that meant arm926 and arm1026 lost VFP
27
* hw/arm/nseries: Remove invalid/unnecessary n8x0_uart_setup()
28
double-precision support
28
* hw/arm/musicpal: Don't connect two qemu_irqs directly to the same input
29
* v8M: NS BusFault on vector table fetch escalates to NS HardFault
29
* hw/arm/musicpal: Only use qdev_get_gpio_in() when necessary
30
* hw/arm/nseries: Check return value from load_image_targphys()
31
* tests/qtest/npcm7xx_rng-test: count runs properly
32
* target/arm/translate-neon.c: Handle VTBL UNDEF case before VFP access check
30
33
31
----------------------------------------------------------------
34
----------------------------------------------------------------
32
Alex Bennée (1):
35
Alex Bennée (1):
33
target/arm: report ARMv8-A FP support for AArch32 -cpu max
36
docs: add some notes on the sbsa-ref machine
34
37
35
David Engraf (1):
38
AlexChen (1):
36
hw/arm/virt: Fix non-secure flash mode
39
ssi: Fix bad printf format specifiers
37
40
38
Peter Maydell (3):
41
Andrew Jones (1):
39
pl031: Correctly migrate state when using -rtc clock=host
42
hw/arm/Kconfig: ARM_V7M depends on PTIMER
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
Havard Skinnemoen (1):
44
hw/ssi/xilinx_spips: Convert lqspi_read() to read_with_attrs
45
tests/qtest/npcm7xx_rng-test: count runs properly
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
Peter Maydell (2):
51
hw/arm/virt.c | 2 +-
48
hw/arm/nseries: Check return value from load_image_targphys()
52
hw/core/machine.c | 1 +
49
target/arm/translate-neon.c: Handle VTBL UNDEF case before VFP access check
53
hw/display/xlnx_dp.c | 15 +++++---
54
hw/ssi/mss-spi.c | 8 ++++-
55
hw/ssi/xilinx_spips.c | 43 +++++++++++++++-------
56
hw/timer/pl031.c | 92 +++++++++++++++++++++++++++++++++++++++++++++---
57
target/arm/cpu.c | 16 +++++++++
58
target/arm/m_helper.c | 21 ++++++++---
59
9 files changed, 174 insertions(+), 26 deletions(-)
60
50
51
Philippe Mathieu-Daudé (6):
52
hw/arm/virt: Remove dependency on Cortex-A15 MPCore peripherals
53
hw/arm/armsse: Correct expansion MPC interrupt lines
54
hw/misc/stm32f2xx_syscfg: Remove extraneous IRQ
55
hw/arm/nseries: Remove invalid/unnecessary n8x0_uart_setup()
56
hw/arm/musicpal: Don't connect two qemu_irqs directly to the same input
57
hw/arm/musicpal: Only use qdev_get_gpio_in() when necessary
58
59
Richard Henderson (1):
60
target/arm: Fix neon VTBL/VTBX for len > 1
61
62
Xinhao Zhang (3):
63
target/arm: add spaces around operator
64
target/arm: Don't use '#' flag of printf format
65
target/arm: add space before the open parenthesis '('
66
67
docs/system/arm/sbsa.rst | 32 ++++++++++++++++++++++
68
docs/system/target-arm.rst | 1 +
69
include/hw/misc/stm32f2xx_syscfg.h | 2 --
70
target/arm/helper.h | 2 +-
71
hw/arm/armsse.c | 3 +-
72
hw/arm/musicpal.c | 40 +++++++++++++++++----------
73
hw/arm/nseries.c | 26 ++++++++----------
74
hw/arm/stm32f205_soc.c | 1 -
75
hw/misc/stm32f2xx_syscfg.c | 2 --
76
hw/ssi/imx_spi.c | 2 +-
77
hw/ssi/xilinx_spi.c | 2 +-
78
target/arm/arch_dump.c | 8 +++---
79
target/arm/arm-semi.c | 8 +++---
80
target/arm/helper.c | 2 +-
81
target/arm/op_helper.c | 23 +++++++++-------
82
target/arm/translate-a64.c | 4 +--
83
target/arm/translate.c | 2 +-
84
tests/qtest/npcm7xx_rng-test.c | 2 +-
85
hw/arm/Kconfig | 3 +-
86
target/arm/translate-neon.c.inc | 56 ++++++++++++++------------------------
87
20 files changed, 123 insertions(+), 98 deletions(-)
88
create mode 100644 docs/system/arm/sbsa.rst
89
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
Reading the RX_DATA register when the RX_FIFO is empty triggers
3
commit 32bd322a0134 ("hw/timer/armv7m_systick: Rewrite to use ptimers")
4
an abort. This can be easily reproduced:
4
changed armv7m_systick to build on ptimers. Make sure we have ptimers
5
in the build when building armv7m_systick.
5
6
6
$ qemu-system-arm -M emcraft-sf2 -monitor stdio -S
7
Signed-off-by: Andrew Jones <drjones@redhat.com>
7
QEMU 4.0.50 monitor - type 'help' for more information
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
(qemu) x 0x40001010
9
Message-id: 20201104103343.30392-1-drjones@redhat.com
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>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
40
---
11
---
41
hw/ssi/mss-spi.c | 8 +++++++-
12
hw/arm/Kconfig | 1 +
42
1 file changed, 7 insertions(+), 1 deletion(-)
13
1 file changed, 1 insertion(+)
43
14
44
diff --git a/hw/ssi/mss-spi.c b/hw/ssi/mss-spi.c
15
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
45
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/ssi/mss-spi.c
17
--- a/hw/arm/Kconfig
47
+++ b/hw/ssi/mss-spi.c
18
+++ b/hw/arm/Kconfig
48
@@ -XXX,XX +XXX,XX @@ spi_read(void *opaque, hwaddr addr, unsigned int size)
19
@@ -XXX,XX +XXX,XX @@ config ZYNQ
49
case R_SPI_RX:
20
50
s->regs[R_SPI_STATUS] &= ~S_RXFIFOFUL;
21
config ARM_V7M
51
s->regs[R_SPI_STATUS] &= ~S_RXCHOVRF;
22
bool
52
- ret = fifo32_pop(&s->rx_fifo);
23
+ select PTIMER
53
+ if (fifo32_is_empty(&s->rx_fifo)) {
24
54
+ qemu_log_mask(LOG_GUEST_ERROR,
25
config ALLWINNER_A10
55
+ "%s: Reading empty RX_FIFO\n",
26
bool
56
+ __func__);
57
+ } else {
58
+ ret = fifo32_pop(&s->rx_fifo);
59
+ }
60
if (fifo32_is_empty(&s->rx_fifo)) {
61
s->regs[R_SPI_STATUS] |= S_RXFIFOEMP;
62
}
63
--
27
--
64
2.20.1
28
2.20.1
65
29
66
30
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: AlexChen <alex.chen@huawei.com>
2
2
3
In the next commit we will implement the write_with_attrs()
3
We should use printf format specifier "%u" instead of "%d" for
4
handler. To avoid using different APIs, convert the read()
4
argument of type "unsigned int".
5
handler first.
6
5
7
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
6
Reported-by: Euler Robot <euler.robot@huawei.com>
8
Tested-by: Francisco Iglesias <frasse.iglesias@gmail.com>
7
Signed-off-by: Alex Chen <alex.chen@huawei.com>
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 5FA280F5.8060902@huawei.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
11
---
12
hw/ssi/xilinx_spips.c | 23 +++++++++++------------
12
hw/ssi/imx_spi.c | 2 +-
13
1 file changed, 11 insertions(+), 12 deletions(-)
13
hw/ssi/xilinx_spi.c | 2 +-
14
2 files changed, 2 insertions(+), 2 deletions(-)
14
15
15
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
16
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/ssi/xilinx_spips.c
18
--- a/hw/ssi/imx_spi.c
18
+++ b/hw/ssi/xilinx_spips.c
19
+++ b/hw/ssi/imx_spi.c
19
@@ -XXX,XX +XXX,XX @@ static void lqspi_load_cache(void *opaque, hwaddr addr)
20
@@ -XXX,XX +XXX,XX @@ static const char *imx_spi_reg_name(uint32_t reg)
21
case ECSPI_MSGDATA:
22
return "ECSPI_MSGDATA";
23
default:
24
- sprintf(unknown, "%d ?", reg);
25
+ sprintf(unknown, "%u ?", reg);
26
return unknown;
20
}
27
}
21
}
28
}
22
29
diff --git a/hw/ssi/xilinx_spi.c b/hw/ssi/xilinx_spi.c
23
-static uint64_t
30
index XXXXXXX..XXXXXXX 100644
24
-lqspi_read(void *opaque, hwaddr addr, unsigned int size)
31
--- a/hw/ssi/xilinx_spi.c
25
+static MemTxResult lqspi_read(void *opaque, hwaddr addr, uint64_t *value,
32
+++ b/hw/ssi/xilinx_spi.c
26
+ unsigned size, MemTxAttrs attrs)
33
@@ -XXX,XX +XXX,XX @@ static void xlx_spi_update_irq(XilinxSPI *s)
27
{
34
irq chain unless things really changed. */
28
- XilinxQSPIPS *q = opaque;
35
if (pending != s->irqline) {
29
- uint32_t ret;
36
s->irqline = pending;
30
+ XilinxQSPIPS *q = XILINX_QSPIPS(opaque);
37
- DB_PRINT("irq_change of state %d ISR:%x IER:%X\n",
31
38
+ DB_PRINT("irq_change of state %u ISR:%x IER:%X\n",
32
if (addr >= q->lqspi_cached_addr &&
39
pending, s->regs[R_IPISR], s->regs[R_IPIER]);
33
addr <= q->lqspi_cached_addr + LQSPI_CACHE_SIZE - 4) {
40
qemu_set_irq(s->irq, pending);
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
}
41
}
47
+
48
+ lqspi_load_cache(opaque, addr);
49
+ return lqspi_read(opaque, addr, value, size, attrs);
50
}
51
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
--
42
--
59
2.20.1
43
2.20.1
60
44
61
45
diff view generated by jsdifflib
1
In the M-profile architecture, when we do a vector table fetch and it
1
From: Xinhao Zhang <zhangxinhao1@huawei.com>
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
Fix code style. Operator needs spaces both sides.
13
the target security domain of the exception we were trying to
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
4
23
Correct the logic.
5
Signed-off-by: Xinhao Zhang <zhangxinhao1@huawei.com>
6
Signed-off-by: Kai Deng <dengkai1@huawei.com>
7
Message-id: 20201103114529.638233-1-zhangxinhao1@huawei.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/arch_dump.c | 8 ++++----
12
target/arm/arm-semi.c | 8 ++++----
13
target/arm/helper.c | 2 +-
14
3 files changed, 9 insertions(+), 9 deletions(-)
24
15
25
We also fix a comment error where we claimed that we might
16
diff --git a/target/arm/arch_dump.c b/target/arm/arch_dump.c
26
be escalating MemManage to HardFault, and forgot about SecureFault.
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>
31
Message-id: 20190705094823.28905-1-peter.maydell@linaro.org
32
---
33
target/arm/m_helper.c | 21 +++++++++++++++++----
34
1 file changed, 17 insertions(+), 4 deletions(-)
35
36
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/arch_dump.c
39
+++ b/target/arm/m_helper.c
19
+++ b/target/arm/arch_dump.c
40
@@ -XXX,XX +XXX,XX @@ static bool arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure,
20
@@ -XXX,XX +XXX,XX @@ static int aarch64_write_elf64_prfpreg(WriteCoreDumpFunction f,
41
if (sattrs.ns) {
21
42
attrs.secure = false;
22
for (i = 0; i < 32; ++i) {
43
} else if (!targets_secure) {
23
uint64_t *q = aa64_vfp_qreg(env, i);
44
- /* NS access to S memory */
24
- note.vfp.vregs[2*i + 0] = cpu_to_dump64(s, q[0]);
45
+ /*
25
- note.vfp.vregs[2*i + 1] = cpu_to_dump64(s, q[1]);
46
+ * NS access to S memory: the underlying exception which we escalate
26
+ note.vfp.vregs[2 * i + 0] = cpu_to_dump64(s, q[0]);
47
+ * to HardFault is SecureFault, which always targets Secure.
27
+ note.vfp.vregs[2 * i + 1] = cpu_to_dump64(s, q[1]);
48
+ */
28
}
49
+ exc_secure = true;
29
50
goto load_fail;
30
if (s->dump_info.d_endian == ELFDATA2MSB) {
31
@@ -XXX,XX +XXX,XX @@ static int aarch64_write_elf64_prfpreg(WriteCoreDumpFunction f,
32
*/
33
for (i = 0; i < 32; ++i) {
34
uint64_t tmp = note.vfp.vregs[2*i];
35
- note.vfp.vregs[2*i] = note.vfp.vregs[2*i+1];
36
- note.vfp.vregs[2*i+1] = tmp;
37
+ note.vfp.vregs[2 * i] = note.vfp.vregs[2 * i + 1];
38
+ note.vfp.vregs[2 * i + 1] = tmp;
51
}
39
}
52
}
40
}
53
@@ -XXX,XX +XXX,XX @@ static bool arm_v7m_load_vector(ARMCPU *cpu, int exc, bool targets_secure,
41
54
vector_entry = address_space_ldl(arm_addressspace(cs, attrs), addr,
42
diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
55
attrs, &result);
43
index XXXXXXX..XXXXXXX 100644
56
if (result != MEMTX_OK) {
44
--- a/target/arm/arm-semi.c
57
+ /*
45
+++ b/target/arm/arm-semi.c
58
+ * Underlying exception is BusFault: its target security state
46
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
59
+ * depends on BFHFNMINS.
47
if (use_gdb_syscalls()) {
60
+ */
48
arm_semi_open_guestfd = guestfd;
61
+ exc_secure = !(cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK);
49
ret = arm_gdb_syscall(cpu, arm_semi_open_cb, "open,%s,%x,1a4", arg0,
62
goto load_fail;
50
- (int)arg2+1, gdb_open_modeflags[arg1]);
63
}
51
+ (int)arg2 + 1, gdb_open_modeflags[arg1]);
64
*pvec = vector_entry;
52
} else {
65
@@ -XXX,XX +XXX,XX @@ load_fail:
53
ret = set_swi_errno(env, open(s, open_modeflags[arg1], 0644));
66
/*
54
if (ret == (uint32_t)-1) {
67
* All vector table fetch fails are reported as HardFault, with
55
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
68
* HFSR.VECTTBL and .FORCED set. (FORCED is set because
56
GET_ARG(1);
69
- * technically the underlying exception is a MemManage or BusFault
57
if (use_gdb_syscalls()) {
70
+ * technically the underlying exception is a SecureFault or BusFault
58
ret = arm_gdb_syscall(cpu, arm_semi_cb, "unlink,%s",
71
* that is escalated to HardFault.) This is a terminal exception,
59
- arg0, (int)arg1+1);
72
* so we will either take the HardFault immediately or else enter
60
+ arg0, (int)arg1 + 1);
73
* lockup (the latter case is handled in armv7m_nvic_set_pending_derived()).
61
} else {
74
+ * The HardFault is Secure if BFHFNMINS is 0 (meaning that all HFs are
62
s = lock_user_string(arg0);
75
+ * secure); otherwise it targets the same security state as the
63
if (!s) {
76
+ * underlying exception.
64
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
77
*/
65
GET_ARG(3);
78
- exc_secure = targets_secure ||
66
if (use_gdb_syscalls()) {
79
- !(cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK);
67
return arm_gdb_syscall(cpu, arm_semi_cb, "rename,%s,%s",
80
+ if (!(cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK)) {
68
- arg0, (int)arg1+1, arg2, (int)arg3+1);
81
+ exc_secure = true;
69
+ arg0, (int)arg1 + 1, arg2, (int)arg3 + 1);
82
+ }
70
} else {
83
env->v7m.hfsr |= R_V7M_HFSR_VECTTBL_MASK | R_V7M_HFSR_FORCED_MASK;
71
char *s2;
84
armv7m_nvic_set_pending_derived(env->nvic, ARMV7M_EXCP_HARD, exc_secure);
72
s = lock_user_string(arg0);
85
return false;
73
@@ -XXX,XX +XXX,XX @@ target_ulong do_arm_semihosting(CPUARMState *env)
74
GET_ARG(1);
75
if (use_gdb_syscalls()) {
76
return arm_gdb_syscall(cpu, arm_semi_cb, "system,%s",
77
- arg0, (int)arg1+1);
78
+ arg0, (int)arg1 + 1);
79
} else {
80
s = lock_user_string(arg0);
81
if (!s) {
82
diff --git a/target/arm/helper.c b/target/arm/helper.c
83
index XXXXXXX..XXXXXXX 100644
84
--- a/target/arm/helper.c
85
+++ b/target/arm/helper.c
86
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(usad8)(uint32_t a, uint32_t b)
87
uint32_t sum;
88
sum = do_usad(a, b);
89
sum += do_usad(a >> 8, b >> 8);
90
- sum += do_usad(a >> 16, b >>16);
91
+ sum += do_usad(a >> 16, b >> 16);
92
sum += do_usad(a >> 24, b >> 24);
93
return sum;
94
}
86
--
95
--
87
2.20.1
96
2.20.1
88
97
89
98
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Xinhao Zhang <zhangxinhao1@huawei.com>
2
2
3
In the previous commit we fixed a crash when the guest read a
3
Fix code style. Don't use '#' flag of printf format ('%#') in
4
register that pop from an empty FIFO.
4
format strings, use '0x' prefix instead
5
By auditing the repository, we found another similar use with
6
an easy way to reproduce:
7
5
8
$ qemu-system-aarch64 -M xlnx-zcu102 -monitor stdio -S
6
Signed-off-by: Xinhao Zhang <zhangxinhao1@huawei.com>
9
QEMU 4.0.50 monitor - type 'help' for more information
7
Signed-off-by: Kai Deng <dengkai1@huawei.com>
10
(qemu) xp/b 0xfd4a0134
8
Message-id: 20201103114529.638233-2-zhangxinhao1@huawei.com
11
Aborted (core dumped)
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
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
target/arm/translate-a64.c | 4 ++--
41
1 file changed, 11 insertions(+), 4 deletions(-)
13
1 file changed, 2 insertions(+), 2 deletions(-)
42
14
43
diff --git a/hw/display/xlnx_dp.c b/hw/display/xlnx_dp.c
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
44
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/display/xlnx_dp.c
17
--- a/target/arm/translate-a64.c
46
+++ b/hw/display/xlnx_dp.c
18
+++ b/target/arm/translate-a64.c
47
@@ -XXX,XX +XXX,XX @@ static uint8_t xlnx_dp_aux_pop_rx_fifo(XlnxDPState *s)
19
@@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_fp16(DisasContext *s, uint32_t insn)
48
uint8_t ret;
20
gen_helper_advsimd_acgt_f16(tcg_res, tcg_op1, tcg_op2, fpst);
49
21
break;
50
if (fifo8_is_empty(&s->rx_fifo)) {
22
default:
51
- DPRINTF("rx_fifo underflow..\n");
23
- fprintf(stderr, "%s: insn %#04x, fpop %#2x @ %#" PRIx64 "\n",
52
- abort();
24
+ fprintf(stderr, "%s: insn 0x%04x, fpop 0x%2x @ 0x%" PRIx64 "\n",
53
+ qemu_log_mask(LOG_GUEST_ERROR,
25
__func__, insn, fpopcode, s->pc_curr);
54
+ "%s: Reading empty RX_FIFO\n",
26
g_assert_not_reached();
55
+ __func__);
27
}
56
+ /*
28
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
57
+ * The datasheet is not clear about the reset value, it seems
29
case 0x7f: /* FSQRT (vector) */
58
+ * to be unspecified. We choose to return '0'.
30
break;
59
+ */
31
default:
60
+ ret = 0;
32
- fprintf(stderr, "%s: insn %#04x fpop %#2x\n", __func__, insn, fpop);
61
+ } else {
33
+ fprintf(stderr, "%s: insn 0x%04x fpop 0x%2x\n", __func__, insn, fpop);
62
+ ret = fifo8_pop(&s->rx_fifo);
34
g_assert_not_reached();
63
+ DPRINTF("pop 0x%" PRIX8 " from rx_fifo.\n", ret);
64
}
35
}
65
- ret = fifo8_pop(&s->rx_fifo);
66
- DPRINTF("pop 0x%" PRIX8 " from rx_fifo.\n", ret);
67
return ret;
68
}
69
36
70
--
37
--
71
2.20.1
38
2.20.1
72
39
73
40
diff view generated by jsdifflib
New patch
1
From: Xinhao Zhang <zhangxinhao1@huawei.com>
1
2
3
Fix code style. Space required before the open parenthesis '('.
4
5
Signed-off-by: Xinhao Zhang <zhangxinhao1@huawei.com>
6
Signed-off-by: Kai Deng <dengkai1@huawei.com>
7
Message-id: 20201103114529.638233-3-zhangxinhao1@huawei.com
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate.c
17
+++ b/target/arm/translate.c
18
@@ -XXX,XX +XXX,XX @@ static void arm_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
19
- Hardware watchpoints.
20
Hardware breakpoints have already been handled and skip this code.
21
*/
22
- switch(dc->base.is_jmp) {
23
+ switch (dc->base.is_jmp) {
24
case DISAS_NEXT:
25
case DISAS_TOO_MANY:
26
gen_goto_tb(dc, 1, dc->base.pc_next);
27
--
28
2.20.1
29
30
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
We should at least document what this machine is about.
4
the fact (dp && arm_dc_feature(s, ARM_FEATURE_V8)) was supported for
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
4
9
Fixes: https://bugs.launchpad.net/qemu/+bug/1836078
5
Reviewed-by: Graeme Gregory <graeme@nuviainc.com>
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
Message-id: 20201104165254.24822-1-alex.bennee@linaro.org
12
Message-id: 20190711103737.10017-1-alex.bennee@linaro.org
8
Cc: Leif Lindholm <leif@nuviainc.com>
9
Cc: Shashi Mallela <shashi.mallela@linaro.org>
10
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
11
[PMM: fixed filename mismatch]
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
13
---
15
target/arm/cpu.c | 4 ++++
14
docs/system/arm/sbsa.rst | 32 ++++++++++++++++++++++++++++++++
16
1 file changed, 4 insertions(+)
15
docs/system/target-arm.rst | 1 +
16
2 files changed, 33 insertions(+)
17
create mode 100644 docs/system/arm/sbsa.rst
17
18
18
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
19
diff --git a/docs/system/arm/sbsa.rst b/docs/system/arm/sbsa.rst
20
new file mode 100644
21
index XXXXXXX..XXXXXXX
22
--- /dev/null
23
+++ b/docs/system/arm/sbsa.rst
24
@@ -XXX,XX +XXX,XX @@
25
+Arm Server Base System Architecture Reference board (``sbsa-ref``)
26
+==================================================================
27
+
28
+While the `virt` board is a generic board platform that doesn't match
29
+any real hardware the `sbsa-ref` board intends to look like real
30
+hardware. The `Server Base System Architecture
31
+<https://developer.arm.com/documentation/den0029/latest>` defines a
32
+minimum base line of hardware support and importantly how the firmware
33
+reports that to any operating system. It is a static system that
34
+reports a very minimal DT to the firmware for non-discoverable
35
+information about components affected by the qemu command line (i.e.
36
+cpus and memory). As a result it must have a firmware specifically
37
+built to expect a certain hardware layout (as you would in a real
38
+machine).
39
+
40
+It is intended to be a machine for developing firmware and testing
41
+standards compliance with operating systems.
42
+
43
+Supported devices
44
+"""""""""""""""""
45
+
46
+The sbsa-ref board supports:
47
+
48
+ - A configurable number of AArch64 CPUs
49
+ - GIC version 3
50
+ - System bus AHCI controller
51
+ - System bus EHCI controller
52
+ - CDROM and hard disc on AHCI bus
53
+ - E1000E ethernet card on PCIe bus
54
+ - VGA display adaptor on PCIe bus
55
+ - A generic SBSA watchdog device
56
+
57
diff --git a/docs/system/target-arm.rst b/docs/system/target-arm.rst
19
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/cpu.c
59
--- a/docs/system/target-arm.rst
21
+++ b/target/arm/cpu.c
60
+++ b/docs/system/target-arm.rst
22
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
61
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
23
t = FIELD_DP32(t, ID_ISAR6, SPECRES, 1);
62
arm/mps2
24
cpu->isar.id_isar6 = t;
63
arm/musca
25
64
arm/realview
26
+ t = cpu->isar.mvfr1;
65
+ arm/sbsa
27
+ t = FIELD_DP32(t, MVFR1, FPHP, 2); /* v8.0 FP support */
66
arm/versatile
28
+ cpu->isar.mvfr1 = t;
67
arm/vexpress
29
+
68
arm/aspeed
30
t = cpu->isar.mvfr2;
31
t = FIELD_DP32(t, MVFR2, SIMDMISC, 3); /* SIMD MaxNum */
32
t = FIELD_DP32(t, MVFR2, FPMISC, 4); /* FP MaxNum */
33
--
69
--
34
2.20.1
70
2.20.1
35
71
36
72
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
When using a Cortex-A15, the Virt machine does not use any
4
aligned address.
4
MPCore peripherals. Remove the dependency.
5
5
6
>From UG1085 datasheet [*] chapter on 'Quad-SPI Controller':
6
Fixes: 7951c7b7c05 ("hw/arm: Express dependencies of the virt machine with Kconfig")
7
7
Reported-by: Miroslav Rezanina <mrezanin@redhat.com>
8
Transfer Size Limitations
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: 20201107114852.271922-1-philmd@redhat.com
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
12
---
25
hw/ssi/xilinx_spips.c | 4 ++++
13
hw/arm/Kconfig | 1 -
26
1 file changed, 4 insertions(+)
14
1 file changed, 1 deletion(-)
27
15
28
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
16
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
29
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/ssi/xilinx_spips.c
18
--- a/hw/arm/Kconfig
31
+++ b/hw/ssi/xilinx_spips.c
19
+++ b/hw/arm/Kconfig
32
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps lqspi_ops = {
20
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
33
.read_with_attrs = lqspi_read,
21
imply VFIO_PLATFORM
34
.write_with_attrs = lqspi_write,
22
imply VFIO_XGMAC
35
.endianness = DEVICE_NATIVE_ENDIAN,
23
imply TPM_TIS_SYSBUS
36
+ .impl = {
24
- select A15MPCORE
37
+ .min_access_size = 4,
25
select ACPI
38
+ .max_access_size = 4,
26
select ARM_SMMUV3
39
+ },
27
select GPIO_KEY
40
.valid = {
41
.min_access_size = 1,
42
.max_access_size = 4
43
--
28
--
44
2.20.1
29
2.20.1
45
30
46
31
diff view generated by jsdifflib
1
The PL031 RTC tracks the difference between the guest RTC
1
From: Richard Henderson <richard.henderson@linaro.org>
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
2
8
Unfortunately this results in the RTC behaving oddly across
3
The helper function did not get updated when we reorganized
9
a VM state save and restore -- since the VM clock stands still
4
the vector register file for SVE. Since then, the neon dregs
10
across save-then-restore, regardless of how much real world
5
are non-sequential and cannot be simply indexed.
11
time has elapsed, the guest RTC ends up out of sync with the
12
host RTC in the restored VM.
13
6
14
Fix this by migrating the raw tick_offset. To retain migration
7
At the same time, make the helper function operate on 64-bit
15
compatibility as far as possible, we have a new property
8
quantities so that we do not have to call it twice.
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
9
26
Reported-by: Russell King <rmk@armlinux.org.uk>
10
Fixes: c39c2b9043e
11
Reported-by: Ard Biesheuvel <ardb@kernel.org>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
[PMM: use aa32_vfp_dreg() rather than opencoding]
14
Message-id: 20201105171126.88014-1-richard.henderson@linaro.org
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
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
---
17
---
31
include/hw/timer/pl031.h | 2 +
18
target/arm/helper.h | 2 +-
32
hw/core/machine.c | 1 +
19
target/arm/op_helper.c | 23 +++++++++--------
33
hw/timer/pl031.c | 92 ++++++++++++++++++++++++++++++++++++++--
20
target/arm/translate-neon.c.inc | 44 +++++++++++----------------------
34
3 files changed, 91 insertions(+), 4 deletions(-)
21
3 files changed, 29 insertions(+), 40 deletions(-)
35
22
36
diff --git a/include/hw/timer/pl031.h b/include/hw/timer/pl031.h
23
diff --git a/target/arm/helper.h b/target/arm/helper.h
37
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
38
--- a/include/hw/timer/pl031.h
25
--- a/target/arm/helper.h
39
+++ b/include/hw/timer/pl031.h
26
+++ b/target/arm/helper.h
40
@@ -XXX,XX +XXX,XX @@ typedef struct PL031State {
27
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(rsqrte_f32, TCG_CALL_NO_RWG, f32, f32, ptr)
41
*/
28
DEF_HELPER_FLAGS_2(rsqrte_f64, TCG_CALL_NO_RWG, f64, f64, ptr)
42
uint32_t tick_offset_vmstate;
29
DEF_HELPER_FLAGS_1(recpe_u32, TCG_CALL_NO_RWG, i32, i32)
43
uint32_t tick_offset;
30
DEF_HELPER_FLAGS_1(rsqrte_u32, TCG_CALL_NO_RWG, i32, i32)
44
+ bool tick_offset_migrated;
31
-DEF_HELPER_FLAGS_4(neon_tbl, TCG_CALL_NO_RWG, i32, i32, i32, ptr, i32)
45
+ bool migrate_tick_offset;
32
+DEF_HELPER_FLAGS_4(neon_tbl, TCG_CALL_NO_RWG, i64, env, i32, i64, i64)
46
33
47
uint32_t mr;
34
DEF_HELPER_3(shl_cc, i32, env, i32, i32)
48
uint32_t lr;
35
DEF_HELPER_3(shr_cc, i32, env, i32, i32)
49
diff --git a/hw/core/machine.c b/hw/core/machine.c
36
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
50
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
51
--- a/hw/core/machine.c
38
--- a/target/arm/op_helper.c
52
+++ b/hw/core/machine.c
39
+++ b/target/arm/op_helper.c
53
@@ -XXX,XX +XXX,XX @@ GlobalProperty hw_compat_4_0[] = {
40
@@ -XXX,XX +XXX,XX @@ void raise_exception_ra(CPUARMState *env, uint32_t excp, uint32_t syndrome,
54
{ "virtio-gpu-pci", "edid", "false" },
41
cpu_loop_exit_restore(cs, ra);
55
{ "virtio-device", "use-started", "false" },
42
}
56
{ "virtio-balloon-device", "qemu-4-0-config-size", "true" },
43
57
+ { "pl031", "migrate-tick-offset", "false" },
44
-uint32_t HELPER(neon_tbl)(uint32_t ireg, uint32_t def, void *vn,
58
};
45
- uint32_t maxindex)
59
const size_t hw_compat_4_0_len = G_N_ELEMENTS(hw_compat_4_0);
46
+uint64_t HELPER(neon_tbl)(CPUARMState *env, uint32_t desc,
60
47
+ uint64_t ireg, uint64_t def)
61
diff --git a/hw/timer/pl031.c b/hw/timer/pl031.c
48
{
49
- uint32_t val, shift;
50
- uint64_t *table = vn;
51
+ uint64_t tmp, val = 0;
52
+ uint32_t maxindex = ((desc & 3) + 1) * 8;
53
+ uint32_t base_reg = desc >> 2;
54
+ uint32_t shift, index, reg;
55
56
- val = 0;
57
- for (shift = 0; shift < 32; shift += 8) {
58
- uint32_t index = (ireg >> shift) & 0xff;
59
+ for (shift = 0; shift < 64; shift += 8) {
60
+ index = (ireg >> shift) & 0xff;
61
if (index < maxindex) {
62
- uint32_t tmp = (table[index >> 3] >> ((index & 7) << 3)) & 0xff;
63
- val |= tmp << shift;
64
+ reg = base_reg + (index >> 3);
65
+ tmp = *aa32_vfp_dreg(env, reg);
66
+ tmp = ((tmp >> ((index & 7) << 3)) & 0xff) << shift;
67
} else {
68
- val |= def & (0xff << shift);
69
+ tmp = def & (0xffull << shift);
70
}
71
+ val |= tmp;
72
}
73
return val;
74
}
75
diff --git a/target/arm/translate-neon.c.inc b/target/arm/translate-neon.c.inc
62
index XXXXXXX..XXXXXXX 100644
76
index XXXXXXX..XXXXXXX 100644
63
--- a/hw/timer/pl031.c
77
--- a/target/arm/translate-neon.c.inc
64
+++ b/hw/timer/pl031.c
78
+++ b/target/arm/translate-neon.c.inc
65
@@ -XXX,XX +XXX,XX @@ static int pl031_pre_save(void *opaque)
79
@@ -XXX,XX +XXX,XX @@ static bool trans_VEXT(DisasContext *s, arg_VEXT *a)
80
81
static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
66
{
82
{
67
PL031State *s = opaque;
83
- int n;
68
84
- TCGv_i32 tmp, tmp2, tmp3, tmp4;
69
- /* tick_offset is base_time - rtc_clock base time. Instead, we want to
85
- TCGv_ptr ptr1;
70
- * store the base time relative to the QEMU_CLOCK_VIRTUAL for backwards-compatibility. */
86
+ TCGv_i64 val, def;
71
+ /*
87
+ TCGv_i32 desc;
72
+ * The PL031 device model code uses the tick_offset field, which is
88
73
+ * the offset between what the guest RTC should read and what the
89
if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
74
+ * QEMU rtc_clock reads:
90
return false;
75
+ * guest_rtc = rtc_clock + tick_offset
91
@@ -XXX,XX +XXX,XX @@ static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
76
+ * and so
92
return true;
77
+ * tick_offset = guest_rtc - rtc_clock
93
}
78
+ *
94
79
+ * We want to migrate this offset, which sounds straightforward.
95
- n = a->len + 1;
80
+ * Unfortunately older versions of QEMU migrated a conversion of this
96
- if ((a->vn + n) > 32) {
81
+ * offset into an offset from the vm_clock. (This was in turn an
97
+ if ((a->vn + a->len + 1) > 32) {
82
+ * attempt to be compatible with even older QEMU versions, but it
98
/*
83
+ * has incorrect behaviour if the rtc_clock is not the same as the
99
* This is UNPREDICTABLE; we choose to UNDEF to avoid the
84
+ * vm_clock.) So we put the actual tick_offset into a migration
100
* helper function running off the end of the register file.
85
+ * subsection, and the backwards-compatible time-relative-to-vm_clock
101
*/
86
+ * in the main migration state.
102
return false;
87
+ *
103
}
88
+ * Calculate base time relative to QEMU_CLOCK_VIRTUAL:
104
- n <<= 3;
89
+ */
105
- tmp = tcg_temp_new_i32();
90
int64_t delta = qemu_clock_get_ns(rtc_clock) - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
106
- if (a->op) {
91
s->tick_offset_vmstate = s->tick_offset + delta / NANOSECONDS_PER_SECOND;
107
- read_neon_element32(tmp, a->vd, 0, MO_32);
92
108
- } else {
93
return 0;
109
- tcg_gen_movi_i32(tmp, 0);
110
- }
111
- tmp2 = tcg_temp_new_i32();
112
- read_neon_element32(tmp2, a->vm, 0, MO_32);
113
- ptr1 = vfp_reg_ptr(true, a->vn);
114
- tmp4 = tcg_const_i32(n);
115
- gen_helper_neon_tbl(tmp2, tmp2, tmp, ptr1, tmp4);
116
117
+ desc = tcg_const_i32((a->vn << 2) | a->len);
118
+ def = tcg_temp_new_i64();
119
if (a->op) {
120
- read_neon_element32(tmp, a->vd, 1, MO_32);
121
+ read_neon_element64(def, a->vd, 0, MO_64);
122
} else {
123
- tcg_gen_movi_i32(tmp, 0);
124
+ tcg_gen_movi_i64(def, 0);
125
}
126
- tmp3 = tcg_temp_new_i32();
127
- read_neon_element32(tmp3, a->vm, 1, MO_32);
128
- gen_helper_neon_tbl(tmp3, tmp3, tmp, ptr1, tmp4);
129
- tcg_temp_free_i32(tmp);
130
- tcg_temp_free_i32(tmp4);
131
- tcg_temp_free_ptr(ptr1);
132
+ val = tcg_temp_new_i64();
133
+ read_neon_element64(val, a->vm, 0, MO_64);
134
135
- write_neon_element32(tmp2, a->vd, 0, MO_32);
136
- write_neon_element32(tmp3, a->vd, 1, MO_32);
137
- tcg_temp_free_i32(tmp2);
138
- tcg_temp_free_i32(tmp3);
139
+ gen_helper_neon_tbl(val, cpu_env, desc, val, def);
140
+ write_neon_element64(val, a->vd, 0, MO_64);
141
+
142
+ tcg_temp_free_i64(def);
143
+ tcg_temp_free_i64(val);
144
+ tcg_temp_free_i32(desc);
145
return true;
94
}
146
}
95
147
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
--
148
--
199
2.20.1
149
2.20.1
200
150
201
151
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
We can use one MPC per SRAM bank, but we currently only wire the
4
IRQ from the first expansion MPC to the IRQ splitter. Fix that.
5
6
Fixes: bb75e16d5e6 ("hw/arm/iotkit: Wire up MPC interrupt lines")
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20201107193403.436146-2-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/armsse.c | 3 ++-
13
1 file changed, 2 insertions(+), 1 deletion(-)
14
15
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/armsse.c
18
+++ b/hw/arm/armsse.c
19
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
20
qdev_get_gpio_in(dev_splitter, 0));
21
qdev_connect_gpio_out(dev_splitter, 0,
22
qdev_get_gpio_in_named(dev_secctl,
23
- "mpc_status", 0));
24
+ "mpc_status",
25
+ i - IOTS_NUM_EXP_MPC));
26
}
27
28
qdev_connect_gpio_out(dev_splitter, 1,
29
--
30
2.20.1
31
32
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
The system configuration controller (SYSCFG) doesn't have
4
any output IRQ (and the INTC input #71 belongs to the UART6).
5
Remove the invalid code.
6
7
Fixes: db635521a02 ("stm32f205: Add the stm32f205 SoC")
8
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20201107193403.436146-3-f4bug@amsat.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
include/hw/misc/stm32f2xx_syscfg.h | 2 --
14
hw/arm/stm32f205_soc.c | 1 -
15
hw/misc/stm32f2xx_syscfg.c | 2 --
16
3 files changed, 5 deletions(-)
17
18
diff --git a/include/hw/misc/stm32f2xx_syscfg.h b/include/hw/misc/stm32f2xx_syscfg.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/misc/stm32f2xx_syscfg.h
21
+++ b/include/hw/misc/stm32f2xx_syscfg.h
22
@@ -XXX,XX +XXX,XX @@ struct STM32F2XXSyscfgState {
23
uint32_t syscfg_exticr3;
24
uint32_t syscfg_exticr4;
25
uint32_t syscfg_cmpcr;
26
-
27
- qemu_irq irq;
28
};
29
30
#endif /* HW_STM32F2XX_SYSCFG_H */
31
diff --git a/hw/arm/stm32f205_soc.c b/hw/arm/stm32f205_soc.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/arm/stm32f205_soc.c
34
+++ b/hw/arm/stm32f205_soc.c
35
@@ -XXX,XX +XXX,XX @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)
36
}
37
busdev = SYS_BUS_DEVICE(dev);
38
sysbus_mmio_map(busdev, 0, 0x40013800);
39
- sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, 71));
40
41
/* Attach UART (uses USART registers) and USART controllers */
42
for (i = 0; i < STM_NUM_USARTS; i++) {
43
diff --git a/hw/misc/stm32f2xx_syscfg.c b/hw/misc/stm32f2xx_syscfg.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/misc/stm32f2xx_syscfg.c
46
+++ b/hw/misc/stm32f2xx_syscfg.c
47
@@ -XXX,XX +XXX,XX @@ static void stm32f2xx_syscfg_init(Object *obj)
48
{
49
STM32F2XXSyscfgState *s = STM32F2XX_SYSCFG(obj);
50
51
- sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
52
-
53
memory_region_init_io(&s->mmio, obj, &stm32f2xx_syscfg_ops, s,
54
TYPE_STM32F2XX_SYSCFG, 0x400);
55
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio);
56
--
57
2.20.1
58
59
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Lei Sun found while auditing the code that a CPU write would
3
omap2420_mpu_init() introduced in commit 827df9f3c5f ("Add basic
4
trigger a NULL pointer dereference.
4
OMAP2 chip support") takes care of creating the 3 UARTs.
5
5
6
>From UG1085 datasheet [*] AXI writes in this region are ignored
6
Then commit 58a26b477e9 ("Emulate a serial bluetooth HCI with H4+
7
and generates an AXI Slave Error (SLVERR).
7
extensions and attach to n8x0's UART") added n8x0_uart_setup()
8
which create the UART and connects it to an IRQ output,
9
overwritting the existing peripheral and its IRQ connection.
10
This is incorrect.
8
11
9
Fix by implementing the write_with_attrs() handler.
12
Fortunately we don't need to fix this, because commit 6da68df7f9b
10
Return MEMTX_ERROR when the region is accessed (this error maps
13
("hw/arm/nseries: Replace the bluetooth chardev with a "null"
11
to an AXI slave error).
14
chardev") removed the use of this peripheral. We can simply
15
remove the code.
12
16
13
[*] https://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf
17
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
18
Message-id: 20201107193403.436146-4-f4bug@amsat.org
15
Reported-by: Lei Sun <slei.casper@gmail.com>
19
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
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>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
21
---
21
hw/ssi/xilinx_spips.c | 16 ++++++++++++++++
22
hw/arm/nseries.c | 11 -----------
22
1 file changed, 16 insertions(+)
23
1 file changed, 11 deletions(-)
23
24
24
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
25
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
25
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/ssi/xilinx_spips.c
27
--- a/hw/arm/nseries.c
27
+++ b/hw/ssi/xilinx_spips.c
28
+++ b/hw/arm/nseries.c
28
@@ -XXX,XX +XXX,XX @@ static MemTxResult lqspi_read(void *opaque, hwaddr addr, uint64_t *value,
29
@@ -XXX,XX +XXX,XX @@ static void n8x0_cbus_setup(struct n800_s *s)
29
return lqspi_read(opaque, addr, value, size, attrs);
30
cbus_attach(cbus, s->tahvo = tahvo_init(tahvo_irq, 1));
30
}
31
}
31
32
32
+static MemTxResult lqspi_write(void *opaque, hwaddr offset, uint64_t value,
33
-static void n8x0_uart_setup(struct n800_s *s)
33
+ unsigned size, MemTxAttrs attrs)
34
-{
34
+{
35
- Chardev *radio = qemu_chr_new("bt-dummy-uart", "null", NULL);
35
+ /*
36
- /*
36
+ * From UG1085, Chapter 24 (Quad-SPI controllers):
37
- * Note: We used to connect N8X0_BT_RESET_GPIO and N8X0_BT_WKUP_GPIO
37
+ * - Writes are ignored
38
- * here, but this code has been removed with the bluetooth backend.
38
+ * - AXI writes generate an external AXI slave error (SLVERR)
39
- */
39
+ */
40
- omap_uart_attach(s->mpu->uart[BT_UART], radio);
40
+ qemu_log_mask(LOG_GUEST_ERROR, "%s Unexpected %u-bit access to 0x%" PRIx64
41
-}
41
+ " (value: 0x%" PRIx64 "\n",
42
-
42
+ __func__, size << 3, offset, value);
43
static void n8x0_usb_setup(struct n800_s *s)
43
+
44
{
44
+ return MEMTX_ERROR;
45
SysBusDevice *dev;
45
+}
46
@@ -XXX,XX +XXX,XX @@ static void n8x0_init(MachineState *machine,
46
+
47
n8x0_spi_setup(s);
47
static const MemoryRegionOps lqspi_ops = {
48
n8x0_dss_setup(s);
48
.read_with_attrs = lqspi_read,
49
n8x0_cbus_setup(s);
49
+ .write_with_attrs = lqspi_write,
50
- n8x0_uart_setup(s);
50
.endianness = DEVICE_NATIVE_ENDIAN,
51
if (machine_usb(machine)) {
51
.valid = {
52
n8x0_usb_setup(s);
52
.min_access_size = 1,
53
}
53
--
54
--
54
2.20.1
55
2.20.1
55
56
56
57
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
The MusicPal board code connects both of the IRQ outputs of the UART
4
to the same INTC qemu_irq. Connecting two qemu_irqs outputs directly
5
to the same input is not valid as it produces subtly wrong behaviour
6
(for instance if both the IRQ lines are high, and then one goes
7
low, the INTC input will see this as a high-to-low transition
8
even though the second IRQ line should still be holding it high).
9
10
This kind of wiring needs an explicitly created OR gate; add one.
11
12
Inspired-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20201107193403.436146-5-f4bug@amsat.org
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
hw/arm/musicpal.c | 17 +++++++++++++----
19
hw/arm/Kconfig | 1 +
20
2 files changed, 14 insertions(+), 4 deletions(-)
21
22
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
23
index XXXXXXX..XXXXXXX 100644
24
--- a/hw/arm/musicpal.c
25
+++ b/hw/arm/musicpal.c
26
@@ -XXX,XX +XXX,XX @@
27
#include "ui/console.h"
28
#include "hw/i2c/i2c.h"
29
#include "hw/irq.h"
30
+#include "hw/or-irq.h"
31
#include "hw/audio/wm8750.h"
32
#include "sysemu/block-backend.h"
33
#include "sysemu/runstate.h"
34
@@ -XXX,XX +XXX,XX @@
35
#define MP_TIMER4_IRQ 7
36
#define MP_EHCI_IRQ 8
37
#define MP_ETH_IRQ 9
38
-#define MP_UART1_IRQ 11
39
-#define MP_UART2_IRQ 11
40
+#define MP_UART_SHARED_IRQ 11
41
#define MP_GPIO_IRQ 12
42
#define MP_RTC_IRQ 28
43
#define MP_AUDIO_IRQ 30
44
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
45
ARMCPU *cpu;
46
qemu_irq pic[32];
47
DeviceState *dev;
48
+ DeviceState *uart_orgate;
49
DeviceState *i2c_dev;
50
DeviceState *lcd_dev;
51
DeviceState *key_dev;
52
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
53
pic[MP_TIMER2_IRQ], pic[MP_TIMER3_IRQ],
54
pic[MP_TIMER4_IRQ], NULL);
55
56
- serial_mm_init(address_space_mem, MP_UART1_BASE, 2, pic[MP_UART1_IRQ],
57
+ /* Logically OR both UART IRQs together */
58
+ uart_orgate = DEVICE(object_new(TYPE_OR_IRQ));
59
+ object_property_set_int(OBJECT(uart_orgate), "num-lines", 2, &error_fatal);
60
+ qdev_realize_and_unref(uart_orgate, NULL, &error_fatal);
61
+ qdev_connect_gpio_out(DEVICE(uart_orgate), 0, pic[MP_UART_SHARED_IRQ]);
62
+
63
+ serial_mm_init(address_space_mem, MP_UART1_BASE, 2,
64
+ qdev_get_gpio_in(uart_orgate, 0),
65
1825000, serial_hd(0), DEVICE_NATIVE_ENDIAN);
66
- serial_mm_init(address_space_mem, MP_UART2_BASE, 2, pic[MP_UART2_IRQ],
67
+ serial_mm_init(address_space_mem, MP_UART2_BASE, 2,
68
+ qdev_get_gpio_in(uart_orgate, 1),
69
1825000, serial_hd(1), DEVICE_NATIVE_ENDIAN);
70
71
/* Register flash */
72
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/arm/Kconfig
75
+++ b/hw/arm/Kconfig
76
@@ -XXX,XX +XXX,XX @@ config MUSCA
77
78
config MUSICPAL
79
bool
80
+ select OR_IRQ
81
select BITBANG_I2C
82
select MARVELL_88W8618
83
select PTIMER
84
--
85
2.20.1
86
87
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
2
3
We don't need to fill the full pic[] array if we only use
4
few of the interrupt lines. Directly call qdev_get_gpio_in()
5
when necessary.
6
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20201107193403.436146-6-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/musicpal.c | 25 +++++++++++++------------
13
1 file changed, 13 insertions(+), 12 deletions(-)
14
15
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/musicpal.c
18
+++ b/hw/arm/musicpal.c
19
@@ -XXX,XX +XXX,XX @@ static struct arm_boot_info musicpal_binfo = {
20
static void musicpal_init(MachineState *machine)
21
{
22
ARMCPU *cpu;
23
- qemu_irq pic[32];
24
DeviceState *dev;
25
+ DeviceState *pic;
26
DeviceState *uart_orgate;
27
DeviceState *i2c_dev;
28
DeviceState *lcd_dev;
29
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
30
&error_fatal);
31
memory_region_add_subregion(address_space_mem, MP_SRAM_BASE, sram);
32
33
- dev = sysbus_create_simple(TYPE_MV88W8618_PIC, MP_PIC_BASE,
34
+ pic = sysbus_create_simple(TYPE_MV88W8618_PIC, MP_PIC_BASE,
35
qdev_get_gpio_in(DEVICE(cpu), ARM_CPU_IRQ));
36
- for (i = 0; i < 32; i++) {
37
- pic[i] = qdev_get_gpio_in(dev, i);
38
- }
39
- sysbus_create_varargs(TYPE_MV88W8618_PIT, MP_PIT_BASE, pic[MP_TIMER1_IRQ],
40
- pic[MP_TIMER2_IRQ], pic[MP_TIMER3_IRQ],
41
- pic[MP_TIMER4_IRQ], NULL);
42
+ sysbus_create_varargs(TYPE_MV88W8618_PIT, MP_PIT_BASE,
43
+ qdev_get_gpio_in(pic, MP_TIMER1_IRQ),
44
+ qdev_get_gpio_in(pic, MP_TIMER2_IRQ),
45
+ qdev_get_gpio_in(pic, MP_TIMER3_IRQ),
46
+ qdev_get_gpio_in(pic, MP_TIMER4_IRQ), NULL);
47
48
/* Logically OR both UART IRQs together */
49
uart_orgate = DEVICE(object_new(TYPE_OR_IRQ));
50
object_property_set_int(OBJECT(uart_orgate), "num-lines", 2, &error_fatal);
51
qdev_realize_and_unref(uart_orgate, NULL, &error_fatal);
52
- qdev_connect_gpio_out(DEVICE(uart_orgate), 0, pic[MP_UART_SHARED_IRQ]);
53
+ qdev_connect_gpio_out(DEVICE(uart_orgate), 0,
54
+ qdev_get_gpio_in(pic, MP_UART_SHARED_IRQ));
55
56
serial_mm_init(address_space_mem, MP_UART1_BASE, 2,
57
qdev_get_gpio_in(uart_orgate, 0),
58
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
59
OBJECT(get_system_memory()), &error_fatal);
60
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
61
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, MP_ETH_BASE);
62
- sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic[MP_ETH_IRQ]);
63
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
64
+ qdev_get_gpio_in(pic, MP_ETH_IRQ));
65
66
sysbus_create_simple("mv88w8618_wlan", MP_WLAN_BASE, NULL);
67
68
sysbus_create_simple(TYPE_MUSICPAL_MISC, MP_MISC_BASE, NULL);
69
70
dev = sysbus_create_simple(TYPE_MUSICPAL_GPIO, MP_GPIO_BASE,
71
- pic[MP_GPIO_IRQ]);
72
+ qdev_get_gpio_in(pic, MP_GPIO_IRQ));
73
i2c_dev = sysbus_create_simple("gpio_i2c", -1, NULL);
74
i2c = (I2CBus *)qdev_get_child_bus(i2c_dev, "i2c");
75
76
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
77
NULL);
78
sysbus_realize_and_unref(s, &error_fatal);
79
sysbus_mmio_map(s, 0, MP_AUDIO_BASE);
80
- sysbus_connect_irq(s, 0, pic[MP_AUDIO_IRQ]);
81
+ sysbus_connect_irq(s, 0, qdev_get_gpio_in(pic, MP_AUDIO_IRQ));
82
83
musicpal_binfo.ram_size = MP_RAM_DEFAULT_SIZE;
84
arm_load_kernel(cpu, machine, &musicpal_binfo);
85
--
86
2.20.1
87
88
diff view generated by jsdifflib
New patch
1
The nseries machines have a codepath that allows them to load a
2
secondary bootloader. This code wasn't checking that the
3
load_image_targphys() succeeded. Check the return value and report
4
the error to the user.
1
5
6
While we're in the vicinity, fix the comment style of the
7
comment documenting what this image load is doing.
8
9
Fixes: Coverity CID 1192904
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20201103114918.11807-1-peter.maydell@linaro.org
13
---
14
hw/arm/nseries.c | 15 +++++++++++----
15
1 file changed, 11 insertions(+), 4 deletions(-)
16
17
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/nseries.c
20
+++ b/hw/arm/nseries.c
21
@@ -XXX,XX +XXX,XX @@ static void n8x0_init(MachineState *machine,
22
/* No, wait, better start at the ROM. */
23
s->mpu->cpu->env.regs[15] = OMAP2_Q2_BASE + 0x400000;
24
25
- /* This is intended for loading the `secondary.bin' program from
26
+ /*
27
+ * This is intended for loading the `secondary.bin' program from
28
* Nokia images (the NOLO bootloader). The entry point seems
29
* to be at OMAP2_Q2_BASE + 0x400000.
30
*
31
@@ -XXX,XX +XXX,XX @@ static void n8x0_init(MachineState *machine,
32
* for them the entry point needs to be set to OMAP2_SRAM_BASE.
33
*
34
* The code above is for loading the `zImage' file from Nokia
35
- * images. */
36
- load_image_targphys(option_rom[0].name, OMAP2_Q2_BASE + 0x400000,
37
- machine->ram_size - 0x400000);
38
+ * images.
39
+ */
40
+ if (load_image_targphys(option_rom[0].name,
41
+ OMAP2_Q2_BASE + 0x400000,
42
+ machine->ram_size - 0x400000) < 0) {
43
+ error_report("Failed to load secondary bootloader %s",
44
+ option_rom[0].name);
45
+ exit(EXIT_FAILURE);
46
+ }
47
48
n800_setup_nolo_tags(nolo_tags);
49
cpu_physical_memory_write(OMAP2_SRAM_BASE, nolo_tags, 0x10000);
50
--
51
2.20.1
52
53
diff view generated by jsdifflib
1
From: David Engraf <david.engraf@sysgo.com>
1
From: Havard Skinnemoen <hskinnemoen@google.com>
2
2
3
Using the whole 128 MiB flash in non-secure mode is not working because
3
The number of runs is equal to the number of 0-1 and 1-0 transitions,
4
virt_flash_fdt() expects the same address for secure_sysmem and sysmem.
4
plus one. Currently, it's counting the number of times these transitions
5
This is not correctly handled by caller because it forwards NULL for
5
do _not_ happen, plus one.
6
secure_sysmem in non-secure flash mode.
7
6
8
Fixed by using sysmem when secure_sysmem is NULL.
7
Source:
8
https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-22r1a.pdf
9
section 2.3.4 point (3).
9
10
10
Signed-off-by: David Engraf <david.engraf@sysgo.com>
11
Signed-off-by: Havard Skinnemoen <hskinnemoen@google.com>
11
Message-id: 20190712075002.14326-1-david.engraf@sysgo.com
12
Message-id: 20201103011457.2959989-2-hskinnemoen@google.com
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
---
15
hw/arm/virt.c | 2 +-
16
tests/qtest/npcm7xx_rng-test.c | 2 +-
16
1 file changed, 1 insertion(+), 1 deletion(-)
17
1 file changed, 1 insertion(+), 1 deletion(-)
17
18
18
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
19
diff --git a/tests/qtest/npcm7xx_rng-test.c b/tests/qtest/npcm7xx_rng-test.c
19
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/virt.c
21
--- a/tests/qtest/npcm7xx_rng-test.c
21
+++ b/hw/arm/virt.c
22
+++ b/tests/qtest/npcm7xx_rng-test.c
22
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
23
@@ -XXX,XX +XXX,XX @@ static double calc_runs_p(const unsigned long *buf, unsigned int nr_bits)
23
&machine->device_memory->mr);
24
pi = (double)nr_ones / nr_bits;
25
26
for (k = 0; k < nr_bits - 1; k++) {
27
- vn_obs += !(test_bit(k, buf) ^ test_bit(k + 1, buf));
28
+ vn_obs += (test_bit(k, buf) ^ test_bit(k + 1, buf));
24
}
29
}
25
30
vn_obs += 1;
26
- virt_flash_fdt(vms, sysmem, secure_sysmem);
27
+ virt_flash_fdt(vms, sysmem, secure_sysmem ?: sysmem);
28
29
create_gic(vms, pic);
30
31
31
--
32
--
32
2.20.1
33
2.20.1
33
34
34
35
diff view generated by jsdifflib
1
The ARMv5 architecture didn't specify detailed per-feature ID
1
Checks for UNDEF cases should go before the "is VFP enabled?" access
2
registers. Now that we're using the MVFR0 register fields to
2
check, except in special cases. Move a stray UNDEF check in the VTBL
3
gate the existence of VFP instructions, we need to set up
3
trans function up above the access check.
4
the correct values in the cpu->isar structure so that we still
5
provide an FPU to the guest.
6
4
7
This fixes a regression in the arm926 and arm1026 CPUs, which
8
are the only ones that both have VFP and are ARMv5 or earlier.
9
This regression was introduced by the VFP refactoring, and more
10
specifically by commits 1120827fa182f0e76 and 266bd25c485597c,
11
which accidentally disabled VFP short-vector support and
12
double-precision support on these CPUs.
13
14
Fixes: 1120827fa182f0e
15
Fixes: 266bd25c485597c
16
Fixes: https://bugs.launchpad.net/qemu/+bug/1836192
17
Reported-by: Christophe Lyon <christophe.lyon@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Message-id: 20201109145324.2859-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
---
8
---
24
target/arm/cpu.c | 12 ++++++++++++
9
target/arm/translate-neon.c.inc | 8 ++++----
25
1 file changed, 12 insertions(+)
10
1 file changed, 4 insertions(+), 4 deletions(-)
26
11
27
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
12
diff --git a/target/arm/translate-neon.c.inc b/target/arm/translate-neon.c.inc
28
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/cpu.c
14
--- a/target/arm/translate-neon.c.inc
30
+++ b/target/arm/cpu.c
15
+++ b/target/arm/translate-neon.c.inc
31
@@ -XXX,XX +XXX,XX @@ static void arm926_initfn(Object *obj)
16
@@ -XXX,XX +XXX,XX @@ static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
32
* set the field to indicate Jazelle support within QEMU.
17
return false;
33
*/
18
}
34
cpu->isar.id_isar1 = FIELD_DP32(cpu->isar.id_isar1, ID_ISAR1, JAZELLE, 1);
19
35
+ /*
20
- if (!vfp_access_check(s)) {
36
+ * Similarly, we need to set MVFR0 fields to enable double precision
21
- return true;
37
+ * and short vector support even though ARMv5 doesn't have this register.
22
- }
38
+ */
23
-
39
+ cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSHVEC, 1);
24
if ((a->vn + a->len + 1) > 32) {
40
+ cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPDP, 1);
25
/*
41
}
26
* This is UNPREDICTABLE; we choose to UNDEF to avoid the
42
27
@@ -XXX,XX +XXX,XX @@ static bool trans_VTBL(DisasContext *s, arg_VTBL *a)
43
static void arm946_initfn(Object *obj)
28
return false;
44
@@ -XXX,XX +XXX,XX @@ static void arm1026_initfn(Object *obj)
29
}
45
* set the field to indicate Jazelle support within QEMU.
30
46
*/
31
+ if (!vfp_access_check(s)) {
47
cpu->isar.id_isar1 = FIELD_DP32(cpu->isar.id_isar1, ID_ISAR1, JAZELLE, 1);
32
+ return true;
48
+ /*
33
+ }
49
+ * Similarly, we need to set MVFR0 fields to enable double precision
34
+
50
+ * and short vector support even though ARMv5 doesn't have this register.
35
desc = tcg_const_i32((a->vn << 2) | a->len);
51
+ */
36
def = tcg_temp_new_i64();
52
+ cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSHVEC, 1);
37
if (a->op) {
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
--
38
--
58
2.20.1
39
2.20.1
59
40
60
41
diff view generated by jsdifflib