1
Mostly just bug fixes. The important one here is
1
A last small test of bug fixes before rc1.
2
hw/intc/arm_gic: Fix interrupt ID in GICD_SGIR register
3
which fixes a buffer overrun that's a security issue if you're running
4
KVM on Arm with kernel-irqchip=off (which hopefully nobody is doing in
5
a security context, because kernel-irqchip=on is the default and the
6
sensible choice for performance).
7
2
3
thanks
8
-- PMM
4
-- PMM
9
5
10
The following changes since commit cf7ca7d5b9faca13f1f8e3ea92cfb2f741eb0c0e:
6
The following changes since commit ed8ad9728a9c0eec34db9dff61dfa2f1dd625637:
11
7
12
Merge remote-tracking branch 'remotes/stefanha-gitlab/tags/tracing-pull-request' into staging (2021-02-01 16:28:00 +0000)
8
Merge tag 'pull-tpm-2023-07-14-1' of https://github.com/stefanberger/qemu-tpm into staging (2023-07-15 14:54:04 +0100)
13
9
14
are available in the Git repository at:
10
are available in the Git repository at:
15
11
16
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20210202-1
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230717
17
13
18
for you to fetch changes up to 14657850c9cc10948551fbb884c30eb5a3a7370a:
14
for you to fetch changes up to c2c1c4a35c7c2b1a4140b0942b9797c857e476a4:
19
15
20
hw/arm: Display CPU type in machine description (2021-02-02 17:53:44 +0000)
16
hw/nvram: Avoid unnecessary Xilinx eFuse backstore write (2023-07-17 11:05:52 +0100)
21
17
22
----------------------------------------------------------------
18
----------------------------------------------------------------
23
target-arm queue:
19
target-arm queue:
24
* hw/intc/arm_gic: Allow to use QTest without crashing
20
* hw/arm/sbsa-ref: set 'slots' property of xhci
25
* hw/char/exynos4210_uart: Fix buffer size reporting with FIFO disabled
21
* linux-user: Remove pointless NULL check in clock_adjtime handling
26
* hw/char/exynos4210_uart: Fix missing call to report ready for input
22
* ptw: Fix S1_ptw_translate() debug path
27
* hw/arm/smmuv3: Fix addr_mask for range-based invalidation
23
* ptw: Account for FEAT_RME when applying {N}SW, SA bits
28
* hw/ssi/imx_spi: Fix various minor bugs
24
* accel/tcg: Zero-pad PC in TCG CPU exec trace lines
29
* hw/intc/arm_gic: Fix interrupt ID in GICD_SGIR register
25
* hw/nvram: Avoid unnecessary Xilinx eFuse backstore write
30
* hw/arm: Add missing Kconfig dependencies
31
* hw/arm: Display CPU type in machine description
32
26
33
----------------------------------------------------------------
27
----------------------------------------------------------------
34
Bin Meng (5):
28
Peter Maydell (5):
35
hw/ssi: imx_spi: Use a macro for number of chip selects supported
29
linux-user: Remove pointless NULL check in clock_adjtime handling
36
hw/ssi: imx_spi: Remove imx_spi_update_irq() in imx_spi_reset()
30
target/arm/ptw.c: Add comments to S1Translate struct fields
37
hw/ssi: imx_spi: Round up the burst length to be multiple of 8
31
target/arm: Fix S1_ptw_translate() debug path
38
hw/ssi: imx_spi: Correct the burst length > 32 bit transfer logic
32
target/arm/ptw.c: Account for FEAT_RME when applying {N}SW, SA bits
39
hw/ssi: imx_spi: Correct tx and rx fifo endianness
33
accel/tcg: Zero-pad PC in TCG CPU exec trace lines
40
34
41
Iris Johnson (2):
35
Tong Ho (1):
42
hw/char/exynos4210_uart: Fix buffer size reporting with FIFO disabled
36
hw/nvram: Avoid unnecessary Xilinx eFuse backstore write
43
hw/char/exynos4210_uart: Fix missing call to report ready for input
44
37
45
Philippe Mathieu-Daudé (12):
38
Yuquan Wang (1):
46
hw/intc/arm_gic: Allow to use QTest without crashing
39
hw/arm/sbsa-ref: set 'slots' property of xhci
47
hw/ssi: imx_spi: Remove pointless variable initialization
48
hw/ssi: imx_spi: Rework imx_spi_reset() to keep CONREG register value
49
hw/ssi: imx_spi: Rework imx_spi_read() to handle block disabled
50
hw/ssi: imx_spi: Rework imx_spi_write() to handle block disabled
51
hw/intc/arm_gic: Fix interrupt ID in GICD_SGIR register
52
hw/arm/stm32f405_soc: Add missing dependency on OR_IRQ
53
hw/arm/exynos4210: Add missing dependency on OR_IRQ
54
hw/arm/xlnx-versal: Versal SoC requires ZDMA
55
hw/arm/xlnx-versal: Versal SoC requires ZynqMP peripherals
56
hw/net/can: ZynqMP CAN device requires PTIMER
57
hw/arm: Display CPU type in machine description
58
40
59
Xuzhou Cheng (1):
41
accel/tcg/cpu-exec.c | 4 +--
60
hw/ssi: imx_spi: Disable chip selects when controller is disabled
42
accel/tcg/translate-all.c | 2 +-
61
43
hw/arm/sbsa-ref.c | 1 +
62
Zenghui Yu (1):
44
hw/nvram/xlnx-efuse.c | 11 ++++--
63
hw/arm/smmuv3: Fix addr_mask for range-based invalidation
45
linux-user/syscall.c | 12 +++----
64
46
target/arm/ptw.c | 90 +++++++++++++++++++++++++++++++++++++++++------
65
include/hw/ssi/imx_spi.h | 5 +-
47
6 files changed, 98 insertions(+), 22 deletions(-)
66
hw/arm/digic_boards.c | 2 +-
67
hw/arm/microbit.c | 2 +-
68
hw/arm/netduino2.c | 2 +-
69
hw/arm/netduinoplus2.c | 2 +-
70
hw/arm/orangepi.c | 2 +-
71
hw/arm/smmuv3.c | 4 +-
72
hw/arm/stellaris.c | 4 +-
73
hw/char/exynos4210_uart.c | 7 ++-
74
hw/intc/arm_gic.c | 5 +-
75
hw/ssi/imx_spi.c | 153 +++++++++++++++++++++++++++++-----------------
76
hw/Kconfig | 1 +
77
hw/arm/Kconfig | 5 ++
78
hw/dma/Kconfig | 3 +
79
hw/dma/meson.build | 2 +-
80
15 files changed, 130 insertions(+), 69 deletions(-)
81
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
1
3
Alexander reported an issue in gic_get_current_cpu() using the
4
fuzzer. Yet another "deref current_cpu with QTest" bug, reproducible
5
doing:
6
7
$ echo readb 0xf03ff000 | qemu-system-arm -M npcm750-evb,accel=qtest -qtest stdio
8
[I 1611849440.651452] OPENED
9
[R +0.242498] readb 0xf03ff000
10
hw/intc/arm_gic.c:63:29: runtime error: member access within null pointer of type 'CPUState' (aka 'struct CPUState')
11
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior hw/intc/arm_gic.c:63:29 in
12
AddressSanitizer:DEADLYSIGNAL
13
=================================================================
14
==3719691==ERROR: AddressSanitizer: SEGV on unknown address 0x0000000082a0 (pc 0x5618790ac882 bp 0x7ffca946f4f0 sp 0x7ffca946f4a0 T0)
15
==3719691==The signal is caused by a READ memory access.
16
#0 0x5618790ac882 in gic_get_current_cpu hw/intc/arm_gic.c:63:29
17
#1 0x5618790a8901 in gic_dist_readb hw/intc/arm_gic.c:955:11
18
#2 0x5618790a7489 in gic_dist_read hw/intc/arm_gic.c:1158:17
19
#3 0x56187adc573b in memory_region_read_with_attrs_accessor softmmu/memory.c:464:9
20
#4 0x56187ad7903a in access_with_adjusted_size softmmu/memory.c:552:18
21
#5 0x56187ad766d6 in memory_region_dispatch_read1 softmmu/memory.c:1426:16
22
#6 0x56187ad758a8 in memory_region_dispatch_read softmmu/memory.c:1449:9
23
#7 0x56187b09e84c in flatview_read_continue softmmu/physmem.c:2822:23
24
#8 0x56187b0a0115 in flatview_read softmmu/physmem.c:2862:12
25
#9 0x56187b09fc9e in address_space_read_full softmmu/physmem.c:2875:18
26
#10 0x56187aa88633 in address_space_read include/exec/memory.h:2489:18
27
#11 0x56187aa88633 in qtest_process_command softmmu/qtest.c:558:13
28
#12 0x56187aa81881 in qtest_process_inbuf softmmu/qtest.c:797:9
29
#13 0x56187aa80e02 in qtest_read softmmu/qtest.c:809:5
30
31
current_cpu is NULL because QTest accelerator does not use CPU.
32
33
Fix by skipping the check and returning the first CPU index when
34
QTest accelerator is used, similarly to commit c781a2cc423
35
("hw/i386/vmport: Allow QTest use without crashing").
36
37
Reported-by: Alexander Bulekov <alxndr@bu.edu>
38
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
39
Reviewed-by: Darren Kenny <darren.kenny@oracle.com>
40
Reviewed-by: Alexander Bulekov <alxndr@bu.edu>
41
Message-id: 20210128161417.3726358-1-philmd@redhat.com
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
44
hw/intc/arm_gic.c | 3 ++-
45
1 file changed, 2 insertions(+), 1 deletion(-)
46
47
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/hw/intc/arm_gic.c
50
+++ b/hw/intc/arm_gic.c
51
@@ -XXX,XX +XXX,XX @@
52
#include "qemu/module.h"
53
#include "trace.h"
54
#include "sysemu/kvm.h"
55
+#include "sysemu/qtest.h"
56
57
/* #define DEBUG_GIC */
58
59
@@ -XXX,XX +XXX,XX @@ static const uint8_t gic_id_gicv2[] = {
60
61
static inline int gic_get_current_cpu(GICState *s)
62
{
63
- if (s->num_cpu > 1) {
64
+ if (!qtest_enabled() && s->num_cpu > 1) {
65
return current_cpu->cpu_index;
66
}
67
return 0;
68
--
69
2.20.1
70
71
diff view generated by jsdifflib
Deleted patch
1
From: Iris Johnson <iris@modwiz.com>
2
1
3
Currently the Exynos 4210 UART code always reports available FIFO space
4
when the backend checks for buffer space. When the FIFO is disabled this
5
is behavior causes the backend chardev code to replace the data before the
6
guest can read it.
7
8
This patch changes adds the logic to report the capacity properly when the
9
FIFO is not being used.
10
11
Buglink: https://bugs.launchpad.net/qemu/+bug/1913344
12
Signed-off-by: Iris Johnson <iris@modwiz.com>
13
Message-id: 20210128033655.1029577-1-iris@modwiz.com
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/char/exynos4210_uart.c | 6 +++++-
18
1 file changed, 5 insertions(+), 1 deletion(-)
19
20
diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/char/exynos4210_uart.c
23
+++ b/hw/char/exynos4210_uart.c
24
@@ -XXX,XX +XXX,XX @@ static int exynos4210_uart_can_receive(void *opaque)
25
{
26
Exynos4210UartState *s = (Exynos4210UartState *)opaque;
27
28
- return fifo_empty_elements_number(&s->rx);
29
+ if (s->reg[I_(UFCON)] & UFCON_FIFO_ENABLE) {
30
+ return fifo_empty_elements_number(&s->rx);
31
+ } else {
32
+ return !(s->reg[I_(UTRSTAT)] & UTRSTAT_Rx_BUFFER_DATA_READY);
33
+ }
34
}
35
36
static void exynos4210_uart_receive(void *opaque, const uint8_t *buf, int size)
37
--
38
2.20.1
39
40
diff view generated by jsdifflib
Deleted patch
1
From: Iris Johnson <iris@modwiz.com>
2
1
3
When the frontend device has no space for a read the fd is removed
4
from polling to allow time for the guest to read and clear the buffer.
5
Without the call to qemu_chr_fe_accept_input(), the poll will not be
6
broken out of when the guest has cleared the buffer causing significant
7
IO delays that get worse with smaller buffers.
8
9
Buglink: https://bugs.launchpad.net/qemu/+bug/1913341
10
Signed-off-by: Iris Johnson <iris@modwiz.com>
11
Message-id: 20210130184016.1787097-1-iris@modwiz.com
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/char/exynos4210_uart.c | 1 +
16
1 file changed, 1 insertion(+)
17
18
diff --git a/hw/char/exynos4210_uart.c b/hw/char/exynos4210_uart.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/char/exynos4210_uart.c
21
+++ b/hw/char/exynos4210_uart.c
22
@@ -XXX,XX +XXX,XX @@ static uint64_t exynos4210_uart_read(void *opaque, hwaddr offset,
23
s->reg[I_(UTRSTAT)] &= ~UTRSTAT_Rx_BUFFER_DATA_READY;
24
res = s->reg[I_(URXH)];
25
}
26
+ qemu_chr_fe_accept_input(&s->chr);
27
exynos4210_uart_update_dmabusy(s);
28
trace_exynos_uart_read(s->channel, offset,
29
exynos4210_uart_regname(offset), res);
30
--
31
2.20.1
32
33
diff view generated by jsdifflib
Deleted patch
1
From: Zenghui Yu <yuzenghui@huawei.com>
2
1
3
When handling guest range-based IOTLB invalidation, we should decode the TG
4
field into the corresponding translation granule size so that we can pass
5
the correct invalidation range to backend. Set @granule to (tg * 2 + 10) to
6
properly emulate the architecture.
7
8
Fixes: d52915616c05 ("hw/arm/smmuv3: Get prepared for range invalidation")
9
Signed-off-by: Zenghui Yu <yuzenghui@huawei.com>
10
Acked-by: Eric Auger <eric.auger@redhat.com>
11
Message-id: 20210130043220.1345-1-yuzenghui@huawei.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/smmuv3.c | 4 +++-
15
1 file changed, 3 insertions(+), 1 deletion(-)
16
17
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/smmuv3.c
20
+++ b/hw/arm/smmuv3.c
21
@@ -XXX,XX +XXX,XX @@ static void smmuv3_notify_iova(IOMMUMemoryRegion *mr,
22
{
23
SMMUDevice *sdev = container_of(mr, SMMUDevice, iommu);
24
IOMMUTLBEvent event;
25
- uint8_t granule = tg;
26
+ uint8_t granule;
27
28
if (!tg) {
29
SMMUEventInfo event = {.inval_ste_allowed = true};
30
@@ -XXX,XX +XXX,XX @@ static void smmuv3_notify_iova(IOMMUMemoryRegion *mr,
31
return;
32
}
33
granule = tt->granule_sz;
34
+ } else {
35
+ granule = tg * 2 + 10;
36
}
37
38
event.type = IOMMU_NOTIFIER_UNMAP;
39
--
40
2.20.1
41
42
diff view generated by jsdifflib
Deleted patch
1
From: Bin Meng <bin.meng@windriver.com>
2
1
3
Avoid using a magic number (4) everywhere for the number of chip
4
selects supported.
5
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Juan Quintela <quintela@redhat.com>
10
Message-id: 20210129132323.30946-2-bmeng.cn@gmail.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
include/hw/ssi/imx_spi.h | 5 ++++-
14
hw/ssi/imx_spi.c | 4 ++--
15
2 files changed, 6 insertions(+), 3 deletions(-)
16
17
diff --git a/include/hw/ssi/imx_spi.h b/include/hw/ssi/imx_spi.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/ssi/imx_spi.h
20
+++ b/include/hw/ssi/imx_spi.h
21
@@ -XXX,XX +XXX,XX @@
22
23
#define EXTRACT(value, name) extract32(value, name##_SHIFT, name##_LENGTH)
24
25
+/* number of chip selects supported */
26
+#define ECSPI_NUM_CS 4
27
+
28
#define TYPE_IMX_SPI "imx.spi"
29
OBJECT_DECLARE_SIMPLE_TYPE(IMXSPIState, IMX_SPI)
30
31
@@ -XXX,XX +XXX,XX @@ struct IMXSPIState {
32
33
qemu_irq irq;
34
35
- qemu_irq cs_lines[4];
36
+ qemu_irq cs_lines[ECSPI_NUM_CS];
37
38
SSIBus *bus;
39
40
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/ssi/imx_spi.c
43
+++ b/hw/ssi/imx_spi.c
44
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
45
46
/* We are in master mode */
47
48
- for (i = 0; i < 4; i++) {
49
+ for (i = 0; i < ECSPI_NUM_CS; i++) {
50
qemu_set_irq(s->cs_lines[i],
51
i == imx_spi_selected_channel(s) ? 0 : 1);
52
}
53
@@ -XXX,XX +XXX,XX @@ static void imx_spi_realize(DeviceState *dev, Error **errp)
54
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
55
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq);
56
57
- for (i = 0; i < 4; ++i) {
58
+ for (i = 0; i < ECSPI_NUM_CS; ++i) {
59
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->cs_lines[i]);
60
}
61
62
--
63
2.20.1
64
65
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Yuquan Wang <wangyuquan1236@phytium.com.cn>
2
2
3
Add a dependency XLNX_ZYNQMP -> PTIMER to fix:
3
This extends the slots of xhci to 64, since the default xhci_sysbus
4
just supports one slot.
4
5
5
/usr/bin/ld:
6
Signed-off-by: Wang Yuquan <wangyuquan1236@phytium.com.cn>
6
libcommon.fa.p/hw_net_can_xlnx-zynqmp-can.c.o: in function `xlnx_zynqmp_can_realize':
7
Signed-off-by: Chen Baozi <chenbaozi@phytium.com.cn>
7
hw/net/can/xlnx-zynqmp-can.c:1082: undefined reference to `ptimer_init'
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
hw/net/can/xlnx-zynqmp-can.c:1085: undefined reference to `ptimer_transaction_begin'
9
Reviewed-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
9
hw/net/can/xlnx-zynqmp-can.c:1087: undefined reference to `ptimer_set_freq'
10
Tested-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
10
hw/net/can/xlnx-zynqmp-can.c:1088: undefined reference to `ptimer_set_limit'
11
Message-id: 20230710063750.473510-2-wangyuquan1236@phytium.com.cn
11
hw/net/can/xlnx-zynqmp-can.c:1089: undefined reference to `ptimer_run'
12
hw/net/can/xlnx-zynqmp-can.c:1090: undefined reference to `ptimer_transaction_commit'
13
libcommon.fa.p/hw_net_can_xlnx-zynqmp-can.c.o:(.data.rel+0x2c8): undefined reference to `vmstate_ptimer'
14
15
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
17
Message-id: 20210131184449.382425-6-f4bug@amsat.org
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
13
---
20
hw/Kconfig | 1 +
14
hw/arm/sbsa-ref.c | 1 +
21
1 file changed, 1 insertion(+)
15
1 file changed, 1 insertion(+)
22
16
23
diff --git a/hw/Kconfig b/hw/Kconfig
17
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
24
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/Kconfig
19
--- a/hw/arm/sbsa-ref.c
26
+++ b/hw/Kconfig
20
+++ b/hw/arm/sbsa-ref.c
27
@@ -XXX,XX +XXX,XX @@ config XLNX_ZYNQMP
21
@@ -XXX,XX +XXX,XX @@ static void create_xhci(const SBSAMachineState *sms)
28
bool
22
hwaddr base = sbsa_ref_memmap[SBSA_XHCI].base;
29
select REGISTER
23
int irq = sbsa_ref_irqmap[SBSA_XHCI];
30
select CAN_BUS
24
DeviceState *dev = qdev_new(TYPE_XHCI_SYSBUS);
31
+ select PTIMER
25
+ qdev_prop_set_uint32(dev, "slots", XHCI_MAXSLOTS);
26
27
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
28
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
32
--
29
--
33
2.20.1
30
2.34.1
34
35
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
In the code for TARGET_NR_clock_adjtime, we set the pointer phtx to
2
the address of the local variable htx. This means it can never be
3
NULL, but later in the code we check it for NULL anyway. Coverity
4
complains about this (CID 1507683) because the NULL check comes after
5
a call to clock_adjtime() that assumes it is non-NULL.
2
6
3
Most of ARM machines display their CPU when QEMU list the available
7
Since phtx is always &htx, and is used only in three places, it's not
4
machines (-M help). Some machines do not. Fix to unify the help
8
really necessary. Remove it, bringing the code structure in to line
5
output.
9
with that for TARGET_NR_clock_adjtime64, which already uses a simple
10
'&htx' when it wants a pointer to 'htx'.
6
11
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20210131184449.382425-7-f4bug@amsat.org
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20230623144410.1837261-1-peter.maydell@linaro.org
13
---
16
---
14
hw/arm/digic_boards.c | 2 +-
17
linux-user/syscall.c | 12 +++++-------
15
hw/arm/microbit.c | 2 +-
18
1 file changed, 5 insertions(+), 7 deletions(-)
16
hw/arm/netduino2.c | 2 +-
17
hw/arm/netduinoplus2.c | 2 +-
18
hw/arm/orangepi.c | 2 +-
19
hw/arm/stellaris.c | 4 ++--
20
6 files changed, 7 insertions(+), 7 deletions(-)
21
19
22
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
20
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
23
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
24
--- a/hw/arm/digic_boards.c
22
--- a/linux-user/syscall.c
25
+++ b/hw/arm/digic_boards.c
23
+++ b/linux-user/syscall.c
26
@@ -XXX,XX +XXX,XX @@ static void canon_a1100_init(MachineState *machine)
24
@@ -XXX,XX +XXX,XX @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
27
25
#if defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME)
28
static void canon_a1100_machine_init(MachineClass *mc)
26
case TARGET_NR_clock_adjtime:
29
{
27
{
30
- mc->desc = "Canon PowerShot A1100 IS";
28
- struct timex htx, *phtx = &htx;
31
+ mc->desc = "Canon PowerShot A1100 IS (ARM946)";
29
+ struct timex htx;
32
mc->init = &canon_a1100_init;
30
33
mc->ignore_memory_transaction_failures = true;
31
- if (target_to_host_timex(phtx, arg2) != 0) {
34
mc->default_ram_size = 64 * MiB;
32
+ if (target_to_host_timex(&htx, arg2) != 0) {
35
diff --git a/hw/arm/microbit.c b/hw/arm/microbit.c
33
return -TARGET_EFAULT;
36
index XXXXXXX..XXXXXXX 100644
34
}
37
--- a/hw/arm/microbit.c
35
- ret = get_errno(clock_adjtime(arg1, phtx));
38
+++ b/hw/arm/microbit.c
36
- if (!is_error(ret) && phtx) {
39
@@ -XXX,XX +XXX,XX @@ static void microbit_machine_class_init(ObjectClass *oc, void *data)
37
- if (host_to_target_timex(arg2, phtx) != 0) {
40
{
38
- return -TARGET_EFAULT;
41
MachineClass *mc = MACHINE_CLASS(oc);
39
- }
42
40
+ ret = get_errno(clock_adjtime(arg1, &htx));
43
- mc->desc = "BBC micro:bit";
41
+ if (!is_error(ret) && host_to_target_timex(arg2, &htx)) {
44
+ mc->desc = "BBC micro:bit (Cortex-M0)";
42
+ return -TARGET_EFAULT;
45
mc->init = microbit_init;
43
}
46
mc->max_cpus = 1;
44
}
47
}
45
return ret;
48
diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/hw/arm/netduino2.c
51
+++ b/hw/arm/netduino2.c
52
@@ -XXX,XX +XXX,XX @@ static void netduino2_init(MachineState *machine)
53
54
static void netduino2_machine_init(MachineClass *mc)
55
{
56
- mc->desc = "Netduino 2 Machine";
57
+ mc->desc = "Netduino 2 Machine (Cortex-M3)";
58
mc->init = netduino2_init;
59
mc->ignore_memory_transaction_failures = true;
60
}
61
diff --git a/hw/arm/netduinoplus2.c b/hw/arm/netduinoplus2.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/hw/arm/netduinoplus2.c
64
+++ b/hw/arm/netduinoplus2.c
65
@@ -XXX,XX +XXX,XX @@ static void netduinoplus2_init(MachineState *machine)
66
67
static void netduinoplus2_machine_init(MachineClass *mc)
68
{
69
- mc->desc = "Netduino Plus 2 Machine";
70
+ mc->desc = "Netduino Plus 2 Machine (Cortex-M4)";
71
mc->init = netduinoplus2_init;
72
}
73
74
diff --git a/hw/arm/orangepi.c b/hw/arm/orangepi.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/hw/arm/orangepi.c
77
+++ b/hw/arm/orangepi.c
78
@@ -XXX,XX +XXX,XX @@ static void orangepi_init(MachineState *machine)
79
80
static void orangepi_machine_init(MachineClass *mc)
81
{
82
- mc->desc = "Orange Pi PC";
83
+ mc->desc = "Orange Pi PC (Cortex-A7)";
84
mc->init = orangepi_init;
85
mc->block_default_type = IF_SD;
86
mc->units_per_default_bus = 1;
87
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
88
index XXXXXXX..XXXXXXX 100644
89
--- a/hw/arm/stellaris.c
90
+++ b/hw/arm/stellaris.c
91
@@ -XXX,XX +XXX,XX @@ static void lm3s811evb_class_init(ObjectClass *oc, void *data)
92
{
93
MachineClass *mc = MACHINE_CLASS(oc);
94
95
- mc->desc = "Stellaris LM3S811EVB";
96
+ mc->desc = "Stellaris LM3S811EVB (Cortex-M3)";
97
mc->init = lm3s811evb_init;
98
mc->ignore_memory_transaction_failures = true;
99
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m3");
100
@@ -XXX,XX +XXX,XX @@ static void lm3s6965evb_class_init(ObjectClass *oc, void *data)
101
{
102
MachineClass *mc = MACHINE_CLASS(oc);
103
104
- mc->desc = "Stellaris LM3S6965EVB";
105
+ mc->desc = "Stellaris LM3S6965EVB (Cortex-M3)";
106
mc->init = lm3s6965evb_init;
107
mc->ignore_memory_transaction_failures = true;
108
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m3");
109
--
46
--
110
2.20.1
47
2.34.1
111
48
112
49
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
Add comments to the in_* fields in the S1Translate struct
2
that explain what they're doing.
2
3
3
The Versal SoC instantiates the TYPE_XLNX_ZYNQMP_RTC object in
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
versal_create_rtc()(). Select CONFIG_XLNX_ZYNQMP to fix:
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20230710152130.3928330-2-peter.maydell@linaro.org
7
---
8
target/arm/ptw.c | 40 ++++++++++++++++++++++++++++++++++++++++
9
1 file changed, 40 insertions(+)
5
10
6
$ make check-qtest-aarch64
11
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
7
...
8
Running test qtest-aarch64/qom-test
9
qemu-system-aarch64: missing object type 'xlnx-zynmp.rtc'
10
Broken pipe
11
12
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Message-id: 20210131184449.382425-5-f4bug@amsat.org
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/arm/Kconfig | 1 +
18
1 file changed, 1 insertion(+)
19
20
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
21
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/Kconfig
13
--- a/target/arm/ptw.c
23
+++ b/hw/arm/Kconfig
14
+++ b/target/arm/ptw.c
24
@@ -XXX,XX +XXX,XX @@ config XLNX_VERSAL
15
@@ -XXX,XX +XXX,XX @@
25
select VIRTIO_MMIO
16
#endif
26
select UNIMP
17
27
select XLNX_ZDMA
18
typedef struct S1Translate {
28
+ select XLNX_ZYNQMP
19
+ /*
29
20
+ * in_mmu_idx : specifies which TTBR, TCR, etc to use for the walk.
30
config NPCM7XX
21
+ * Together with in_space, specifies the architectural translation regime.
31
bool
22
+ */
23
ARMMMUIdx in_mmu_idx;
24
+ /*
25
+ * in_ptw_idx: specifies which mmuidx to use for the actual
26
+ * page table descriptor load operations. This will be one of the
27
+ * ARMMMUIdx_Stage2* or one of the ARMMMUIdx_Phys_* indexes.
28
+ * If a Secure ptw is "downgraded" to NonSecure by an NSTable bit,
29
+ * this field is updated accordingly.
30
+ */
31
ARMMMUIdx in_ptw_idx;
32
+ /*
33
+ * in_space: the security space for this walk. This plus
34
+ * the in_mmu_idx specify the architectural translation regime.
35
+ * If a Secure ptw is "downgraded" to NonSecure by an NSTable bit,
36
+ * this field is updated accordingly.
37
+ *
38
+ * Note that the security space for the in_ptw_idx may be different
39
+ * from that for the in_mmu_idx. We do not need to explicitly track
40
+ * the in_ptw_idx security space because:
41
+ * - if the in_ptw_idx is an ARMMMUIdx_Phys_* then the mmuidx
42
+ * itself specifies the security space
43
+ * - if the in_ptw_idx is an ARMMMUIdx_Stage2* then the security
44
+ * space used for ptw reads is the same as that of the security
45
+ * space of the stage 1 translation for all cases except where
46
+ * stage 1 is Secure; in that case the only possibilities for
47
+ * the ptw read are Secure and NonSecure, and the in_ptw_idx
48
+ * value being Stage2 vs Stage2_S distinguishes those.
49
+ */
50
ARMSecuritySpace in_space;
51
+ /*
52
+ * in_secure: whether the translation regime is a Secure one.
53
+ * This is always equal to arm_space_is_secure(in_space).
54
+ * If a Secure ptw is "downgraded" to NonSecure by an NSTable bit,
55
+ * this field is updated accordingly.
56
+ */
57
bool in_secure;
58
+ /*
59
+ * in_debug: is this a QEMU debug access (gdbstub, etc)? Debug
60
+ * accesses will not update the guest page table access flags
61
+ * and will not change the state of the softmmu TLBs.
62
+ */
63
bool in_debug;
64
/*
65
* If this is stage 2 of a stage 1+2 page table walk, then this must
32
--
66
--
33
2.20.1
67
2.34.1
34
35
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
In commit fe4a5472ccd6 we rearranged the logic in S1_ptw_translate()
2
so that the debug-access "call get_phys_addr_*" codepath is used both
3
when S1 is doing ptw reads from stage 2 and when it is doing ptw
4
reads from physical memory. However, we didn't update the
5
calculation of s2ptw->in_space and s2ptw->in_secure to account for
6
the "ptw reads from physical memory" case. This meant that debug
7
accesses when in Secure state broke.
2
8
3
Usually the approach is that the device on the other end of the line
9
Create a new function S2_security_space() which returns the
4
is going to reset its state anyway, so there's no need to actively
10
correct security space to use for the ptw load, and use it to
5
signal an irq line change during the reset hook.
11
determine the correct .in_secure and .in_space fields for the
12
stage 2 lookup for the ptw load.
6
13
7
Move imx_spi_update_irq() out of imx_spi_reset(), to a new function
14
Reported-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
8
imx_spi_soft_reset() that is called when the controller is disabled.
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
16
Tested-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
10
Signed-off-by: Bin Meng <bin.meng@windriver.com>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Message-id: 20230710152130.3928330-3-peter.maydell@linaro.org
12
Message-id: 20210129132323.30946-3-bmeng.cn@gmail.com
19
Fixes: fe4a5472ccd6 ("target/arm: Use get_phys_addr_with_struct in S1_ptw_translate")
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
21
---
15
hw/ssi/imx_spi.c | 14 ++++++++++----
22
target/arm/ptw.c | 37 ++++++++++++++++++++++++++++++++-----
16
1 file changed, 10 insertions(+), 4 deletions(-)
23
1 file changed, 32 insertions(+), 5 deletions(-)
17
24
18
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
25
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
19
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/ssi/imx_spi.c
27
--- a/target/arm/ptw.c
21
+++ b/hw/ssi/imx_spi.c
28
+++ b/target/arm/ptw.c
22
@@ -XXX,XX +XXX,XX @@ static void imx_spi_reset(DeviceState *dev)
29
@@ -XXX,XX +XXX,XX @@ static bool S2_attrs_are_device(uint64_t hcr, uint8_t attrs)
23
imx_spi_rxfifo_reset(s);
30
}
24
imx_spi_txfifo_reset(s);
25
26
- imx_spi_update_irq(s);
27
-
28
s->burst_length = 0;
29
}
31
}
30
32
31
+static void imx_spi_soft_reset(IMXSPIState *s)
33
+static ARMSecuritySpace S2_security_space(ARMSecuritySpace s1_space,
34
+ ARMMMUIdx s2_mmu_idx)
32
+{
35
+{
33
+ imx_spi_reset(DEVICE(s));
36
+ /*
34
+
37
+ * Return the security space to use for stage 2 when doing
35
+ imx_spi_update_irq(s);
38
+ * the S1 page table descriptor load.
39
+ */
40
+ if (regime_is_stage2(s2_mmu_idx)) {
41
+ /*
42
+ * The security space for ptw reads is almost always the same
43
+ * as that of the security space of the stage 1 translation.
44
+ * The only exception is when stage 1 is Secure; in that case
45
+ * the ptw read might be to the Secure or the NonSecure space
46
+ * (but never Realm or Root), and the s2_mmu_idx tells us which.
47
+ * Root translations are always single-stage.
48
+ */
49
+ if (s1_space == ARMSS_Secure) {
50
+ return arm_secure_to_space(s2_mmu_idx == ARMMMUIdx_Stage2_S);
51
+ } else {
52
+ assert(s2_mmu_idx != ARMMMUIdx_Stage2_S);
53
+ assert(s1_space != ARMSS_Root);
54
+ return s1_space;
55
+ }
56
+ } else {
57
+ /* ptw loads are from phys: the mmu idx itself says which space */
58
+ return arm_phys_to_space(s2_mmu_idx);
59
+ }
36
+}
60
+}
37
+
61
+
38
static uint64_t imx_spi_read(void *opaque, hwaddr offset, unsigned size)
62
/* Translate a S1 pagetable walk through S2 if needed. */
63
static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
64
hwaddr addr, ARMMMUFaultInfo *fi)
39
{
65
{
40
uint32_t value = 0;
66
- ARMSecuritySpace space = ptw->in_space;
41
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
67
bool is_secure = ptw->in_secure;
42
s->regs[ECSPI_CONREG] = value;
68
ARMMMUIdx mmu_idx = ptw->in_mmu_idx;
43
69
ARMMMUIdx s2_mmu_idx = ptw->in_ptw_idx;
44
if (!imx_spi_is_enabled(s)) {
70
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
45
- /* device is disabled, so this is a reset */
71
* From gdbstub, do not use softmmu so that we don't modify the
46
- imx_spi_reset(DEVICE(s));
72
* state of the cpu at all, including softmmu tlb contents.
47
+ /* device is disabled, so this is a soft reset */
73
*/
48
+ imx_spi_soft_reset(s);
74
+ ARMSecuritySpace s2_space = S2_security_space(ptw->in_space, s2_mmu_idx);
49
+
75
S1Translate s2ptw = {
50
return;
76
.in_mmu_idx = s2_mmu_idx,
51
}
77
.in_ptw_idx = ptw_idx_for_stage_2(env, s2_mmu_idx),
52
78
- .in_secure = s2_mmu_idx == ARMMMUIdx_Stage2_S,
79
- .in_space = (s2_mmu_idx == ARMMMUIdx_Stage2_S ? ARMSS_Secure
80
- : space == ARMSS_Realm ? ARMSS_Realm
81
- : ARMSS_NonSecure),
82
+ .in_secure = arm_space_is_secure(s2_space),
83
+ .in_space = s2_space,
84
.in_debug = true,
85
};
86
GetPhysAddrResult s2 = { };
53
--
87
--
54
2.20.1
88
2.34.1
55
56
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
In get_phys_addr_twostage() the code that applies the effects of
2
VSTCR.{SA,SW} and VTCR.{NSA,NSW} only updates result->f.attrs.secure.
3
Now we also have f.attrs.space for FEAT_RME, we need to keep the two
4
in sync.
2
5
3
'burst_length' is cleared in imx_spi_reset(), which is called
6
These bits only have an effect for Secure space translations, not
4
after imx_spi_realize(). Remove the initialization to simplify.
7
for Root, so use the input in_space field to determine whether to
8
apply them rather than the input is_secure. This doesn't actually
9
make a difference because Root translations are never two-stage,
10
but it's a little clearer.
5
11
6
Reviewed-by: Juan Quintela <quintela@redhat.com>
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Bin Meng <bin.meng@windriver.com>
9
Signed-off-by: Bin Meng <bin.meng@windriver.com>
10
Message-id: 20210129132323.30946-4-bmeng.cn@gmail.com
11
Message-Id: <20210115153049.3353008-3-f4bug@amsat.org>
12
Reviewed-by: Bin Meng <bin.meng@windriver.com>
13
Signed-off-by: Bin Meng <bin.meng@windriver.com>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20230710152130.3928330-4-peter.maydell@linaro.org
15
---
15
---
16
hw/ssi/imx_spi.c | 2 --
16
target/arm/ptw.c | 13 ++++++++-----
17
1 file changed, 2 deletions(-)
17
1 file changed, 8 insertions(+), 5 deletions(-)
18
18
19
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
19
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
20
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/ssi/imx_spi.c
21
--- a/target/arm/ptw.c
22
+++ b/hw/ssi/imx_spi.c
22
+++ b/target/arm/ptw.c
23
@@ -XXX,XX +XXX,XX @@ static void imx_spi_realize(DeviceState *dev, Error **errp)
23
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
24
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->cs_lines[i]);
24
hwaddr ipa;
25
}
25
int s1_prot, s1_lgpgsz;
26
26
bool is_secure = ptw->in_secure;
27
- s->burst_length = 0;
27
+ ARMSecuritySpace in_space = ptw->in_space;
28
-
28
bool ret, ipa_secure;
29
fifo32_create(&s->tx_fifo, ECSPI_FIFO_SIZE);
29
ARMCacheAttrs cacheattrs1;
30
fifo32_create(&s->rx_fifo, ECSPI_FIFO_SIZE);
30
ARMSecuritySpace ipa_space;
31
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
32
* Check if IPA translates to secure or non-secure PA space.
33
* Note that VSTCR overrides VTCR and {N}SW overrides {N}SA.
34
*/
35
- result->f.attrs.secure =
36
- (is_secure
37
- && !(env->cp15.vstcr_el2 & (VSTCR_SA | VSTCR_SW))
38
- && (ipa_secure
39
- || !(env->cp15.vtcr_el2 & (VTCR_NSA | VTCR_NSW))));
40
+ if (in_space == ARMSS_Secure) {
41
+ result->f.attrs.secure =
42
+ !(env->cp15.vstcr_el2 & (VSTCR_SA | VSTCR_SW))
43
+ && (ipa_secure
44
+ || !(env->cp15.vtcr_el2 & (VTCR_NSA | VTCR_NSW)));
45
+ result->f.attrs.space = arm_secure_to_space(result->f.attrs.secure);
46
+ }
47
48
return false;
31
}
49
}
32
--
50
--
33
2.20.1
51
2.34.1
34
35
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
When the block is disabled, all registers are reset with the
4
exception of the ECSPI_CONREG. It is initialized to zero
5
when the instance is created.
6
7
Ref: i.MX 6DQ Applications Processor Reference Manual (IMX6DQRM),
8
chapter 21.7.3: Control Register (ECSPIx_CONREG)
9
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Signed-off-by: Bin Meng <bin.meng@windriver.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20210129132323.30946-5-bmeng.cn@gmail.com
14
[bmeng: add a 'common_reset' function that does most of reset operation]
15
Signed-off-by: Bin Meng <bin.meng@windriver.com>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
hw/ssi/imx_spi.c | 32 ++++++++++++++++++++++++--------
19
1 file changed, 24 insertions(+), 8 deletions(-)
20
21
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/ssi/imx_spi.c
24
+++ b/hw/ssi/imx_spi.c
25
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
26
fifo32_num_used(&s->tx_fifo), fifo32_num_used(&s->rx_fifo));
27
}
28
29
-static void imx_spi_reset(DeviceState *dev)
30
+static void imx_spi_common_reset(IMXSPIState *s)
31
{
32
- IMXSPIState *s = IMX_SPI(dev);
33
+ int i;
34
35
- DPRINTF("\n");
36
-
37
- memset(s->regs, 0, sizeof(s->regs));
38
-
39
- s->regs[ECSPI_STATREG] = 0x00000003;
40
+ for (i = 0; i < ARRAY_SIZE(s->regs); i++) {
41
+ switch (i) {
42
+ case ECSPI_CONREG:
43
+ /* CONREG is not updated on soft reset */
44
+ break;
45
+ case ECSPI_STATREG:
46
+ s->regs[i] = 0x00000003;
47
+ break;
48
+ default:
49
+ s->regs[i] = 0;
50
+ break;
51
+ }
52
+ }
53
54
imx_spi_rxfifo_reset(s);
55
imx_spi_txfifo_reset(s);
56
@@ -XXX,XX +XXX,XX @@ static void imx_spi_reset(DeviceState *dev)
57
58
static void imx_spi_soft_reset(IMXSPIState *s)
59
{
60
- imx_spi_reset(DEVICE(s));
61
+ imx_spi_common_reset(s);
62
63
imx_spi_update_irq(s);
64
}
65
66
+static void imx_spi_reset(DeviceState *dev)
67
+{
68
+ IMXSPIState *s = IMX_SPI(dev);
69
+
70
+ imx_spi_common_reset(s);
71
+ s->regs[ECSPI_CONREG] = 0;
72
+}
73
+
74
static uint64_t imx_spi_read(void *opaque, hwaddr offset, unsigned size)
75
{
76
uint32_t value = 0;
77
--
78
2.20.1
79
80
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
In commit f0a08b0913befbd we changed the type of the PC from
2
target_ulong to vaddr. In doing so we inadvertently dropped the
3
zero-padding on the PC in trace lines (the second item inside the []
4
in these lines). They used to look like this on AArch64, for
5
instance:
2
6
3
The Versal SoC instantiates the TYPE_XLNX_ZDMA object in
7
Trace 0: 0x7f2260000100 [00000000/0000000040000000/00000061/ff200000]
4
versal_create_admas(). Introduce the XLNX_ZDMA configuration
5
and select it to fix:
6
8
7
$ qemu-system-aarch64 -M xlnx-versal-virt ...
9
and now they look like this:
8
qemu-system-aarch64: missing object type 'xlnx.zdma'
10
Trace 0: 0x7f4f50000100 [00000000/40000000/00000061/ff200000]
9
11
10
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
and if the PC happens to be somewhere low like 0x5000
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
then the field is shown as /5000/.
12
Message-id: 20210131184449.382425-4-f4bug@amsat.org
14
15
This is because TARGET_FMT_lx is a "%08x" or "%016x" specifier,
16
depending on TARGET_LONG_SIZE, whereas VADDR_PRIx is just PRIx64
17
with no width specifier.
18
19
Restore the zero-padding by adding an 016 width specifier to
20
this tracing and a couple of others that were similarly recently
21
changed to use VADDR_PRIx without a width specifier.
22
23
We can't unfortunately restore the "32-bit guests are padded to
24
8 hex digits and 64-bit guests to 16 hex digits" behaviour so
25
easily.
26
27
Fixes: f0a08b0913befbd ("accel/tcg/cpu-exec.c: Widen pc to vaddr")
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
29
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
30
Reviewed-by: Anton Johansson <anjo@rev.ng>
31
Message-id: 20230711165434.4123674-1-peter.maydell@linaro.org
14
---
32
---
15
hw/arm/Kconfig | 2 ++
33
accel/tcg/cpu-exec.c | 4 ++--
16
hw/dma/Kconfig | 3 +++
34
accel/tcg/translate-all.c | 2 +-
17
hw/dma/meson.build | 2 +-
35
2 files changed, 3 insertions(+), 3 deletions(-)
18
3 files changed, 6 insertions(+), 1 deletion(-)
19
36
20
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
37
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
21
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/Kconfig
39
--- a/accel/tcg/cpu-exec.c
23
+++ b/hw/arm/Kconfig
40
+++ b/accel/tcg/cpu-exec.c
24
@@ -XXX,XX +XXX,XX @@ config XLNX_ZYNQMP_ARM
41
@@ -XXX,XX +XXX,XX @@ static void log_cpu_exec(vaddr pc, CPUState *cpu,
25
select XILINX_AXI
42
if (qemu_log_in_addr_range(pc)) {
26
select XILINX_SPIPS
43
qemu_log_mask(CPU_LOG_EXEC,
27
select XLNX_ZYNQMP
44
"Trace %d: %p [%08" PRIx64
28
+ select XLNX_ZDMA
45
- "/%" VADDR_PRIx "/%08x/%08x] %s\n",
29
46
+ "/%016" VADDR_PRIx "/%08x/%08x] %s\n",
30
config XLNX_VERSAL
47
cpu->cpu_index, tb->tc.ptr, tb->cs_base, pc,
31
bool
48
tb->flags, tb->cflags, lookup_symbol(pc));
32
@@ -XXX,XX +XXX,XX @@ config XLNX_VERSAL
49
33
select CADENCE
50
@@ -XXX,XX +XXX,XX @@ cpu_tb_exec(CPUState *cpu, TranslationBlock *itb, int *tb_exit)
34
select VIRTIO_MMIO
51
if (qemu_loglevel_mask(CPU_LOG_EXEC)) {
35
select UNIMP
52
vaddr pc = log_pc(cpu, last_tb);
36
+ select XLNX_ZDMA
53
if (qemu_log_in_addr_range(pc)) {
37
54
- qemu_log("Stopped execution of TB chain before %p [%"
38
config NPCM7XX
55
+ qemu_log("Stopped execution of TB chain before %p [%016"
39
bool
56
VADDR_PRIx "] %s\n",
40
diff --git a/hw/dma/Kconfig b/hw/dma/Kconfig
57
last_tb->tc.ptr, pc, lookup_symbol(pc));
58
}
59
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
41
index XXXXXXX..XXXXXXX 100644
60
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/dma/Kconfig
61
--- a/accel/tcg/translate-all.c
43
+++ b/hw/dma/Kconfig
62
+++ b/accel/tcg/translate-all.c
44
@@ -XXX,XX +XXX,XX @@ config ZYNQ_DEVCFG
63
@@ -XXX,XX +XXX,XX @@ void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
45
bool
64
if (qemu_loglevel_mask(CPU_LOG_EXEC)) {
46
select REGISTER
65
vaddr pc = log_pc(cpu, tb);
47
66
if (qemu_log_in_addr_range(pc)) {
48
+config XLNX_ZDMA
67
- qemu_log("cpu_io_recompile: rewound execution of TB to %"
49
+ bool
68
+ qemu_log("cpu_io_recompile: rewound execution of TB to %016"
50
+
69
VADDR_PRIx "\n", pc);
51
config STP2000
70
}
52
bool
71
}
53
54
diff --git a/hw/dma/meson.build b/hw/dma/meson.build
55
index XXXXXXX..XXXXXXX 100644
56
--- a/hw/dma/meson.build
57
+++ b/hw/dma/meson.build
58
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_ZYNQ_DEVCFG', if_true: files('xlnx-zynq-devcfg.c'))
59
softmmu_ss.add(when: 'CONFIG_ETRAXFS', if_true: files('etraxfs_dma.c'))
60
softmmu_ss.add(when: 'CONFIG_STP2000', if_true: files('sparc32_dma.c'))
61
softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx_dpdma.c'))
62
-softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zdma.c'))
63
+softmmu_ss.add(when: 'CONFIG_XLNX_ZDMA', if_true: files('xlnx-zdma.c'))
64
softmmu_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_dma.c', 'soc_dma.c'))
65
softmmu_ss.add(when: 'CONFIG_PXA2XX', if_true: files('pxa2xx_dma.c'))
66
softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_dma.c'))
67
--
72
--
68
2.20.1
73
2.34.1
69
74
70
75
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Tong Ho <tong.ho@amd.com>
2
2
3
When the block is disabled, it stay it is 'internal reset logic'
3
Add a check in the bit-set operation to write the backstore
4
(internal clocks are gated off). Reading any register returns
4
only if the affected bit is 0 before.
5
its reset value. Only update this value if the device is enabled.
6
5
7
Ref: i.MX 6DQ Applications Processor Reference Manual (IMX6DQRM),
6
With this in place, there will be no need for callers to
8
chapter 21.7.3: Control Register (ECSPIx_CONREG)
7
do the checking in order to avoid unnecessary writes.
9
8
10
Reviewed-by: Juan Quintela <quintela@redhat.com>
9
Signed-off-by: Tong Ho <tong.ho@amd.com>
11
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Reviewed-by: Bin Meng <bin.meng@windriver.com>
11
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
13
Signed-off-by: Bin Meng <bin.meng@windriver.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
14
Message-id: 20210129132323.30946-6-bmeng.cn@gmail.com
15
Message-Id: <20210115153049.3353008-5-f4bug@amsat.org>
16
Reviewed-by: Bin Meng <bin.meng@windriver.com>
17
Signed-off-by: Bin Meng <bin.meng@windriver.com>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
14
---
20
hw/ssi/imx_spi.c | 60 +++++++++++++++++++++++-------------------------
15
hw/nvram/xlnx-efuse.c | 11 +++++++++--
21
1 file changed, 29 insertions(+), 31 deletions(-)
16
1 file changed, 9 insertions(+), 2 deletions(-)
22
17
23
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
18
diff --git a/hw/nvram/xlnx-efuse.c b/hw/nvram/xlnx-efuse.c
24
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/ssi/imx_spi.c
20
--- a/hw/nvram/xlnx-efuse.c
26
+++ b/hw/ssi/imx_spi.c
21
+++ b/hw/nvram/xlnx-efuse.c
27
@@ -XXX,XX +XXX,XX @@ static uint64_t imx_spi_read(void *opaque, hwaddr offset, unsigned size)
22
@@ -XXX,XX +XXX,XX @@ static bool efuse_ro_bits_find(XlnxEFuse *s, uint32_t k)
28
return 0;
23
24
bool xlnx_efuse_set_bit(XlnxEFuse *s, unsigned int bit)
25
{
26
+ uint32_t set, *row;
27
+
28
if (efuse_ro_bits_find(s, bit)) {
29
g_autofree char *path = object_get_canonical_path(OBJECT(s));
30
31
@@ -XXX,XX +XXX,XX @@ bool xlnx_efuse_set_bit(XlnxEFuse *s, unsigned int bit)
32
return false;
29
}
33
}
30
34
31
- switch (index) {
35
- s->fuse32[bit / 32] |= 1 << (bit % 32);
32
- case ECSPI_RXDATA:
36
- efuse_bdrv_sync(s, bit);
33
- if (!imx_spi_is_enabled(s)) {
37
+ /* Avoid back-end write unless there is a real update */
34
- value = 0;
38
+ row = &s->fuse32[bit / 32];
35
- } else if (fifo32_is_empty(&s->rx_fifo)) {
39
+ set = 1 << (bit % 32);
36
- /* value is undefined */
40
+ if (!(set & *row)) {
37
- value = 0xdeadbeef;
41
+ *row |= set;
38
- } else {
42
+ efuse_bdrv_sync(s, bit);
39
- /* read from the RX FIFO */
43
+ }
40
- value = fifo32_pop(&s->rx_fifo);
44
return true;
41
+ value = s->regs[index];
42
+
43
+ if (imx_spi_is_enabled(s)) {
44
+ switch (index) {
45
+ case ECSPI_RXDATA:
46
+ if (fifo32_is_empty(&s->rx_fifo)) {
47
+ /* value is undefined */
48
+ value = 0xdeadbeef;
49
+ } else {
50
+ /* read from the RX FIFO */
51
+ value = fifo32_pop(&s->rx_fifo);
52
+ }
53
+ break;
54
+ case ECSPI_TXDATA:
55
+ qemu_log_mask(LOG_GUEST_ERROR,
56
+ "[%s]%s: Trying to read from TX FIFO\n",
57
+ TYPE_IMX_SPI, __func__);
58
+
59
+ /* Reading from TXDATA gives 0 */
60
+ break;
61
+ case ECSPI_MSGDATA:
62
+ qemu_log_mask(LOG_GUEST_ERROR,
63
+ "[%s]%s: Trying to read from MSG FIFO\n",
64
+ TYPE_IMX_SPI, __func__);
65
+ /* Reading from MSGDATA gives 0 */
66
+ break;
67
+ default:
68
+ break;
69
}
70
71
- break;
72
- case ECSPI_TXDATA:
73
- qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Trying to read from TX FIFO\n",
74
- TYPE_IMX_SPI, __func__);
75
-
76
- /* Reading from TXDATA gives 0 */
77
-
78
- break;
79
- case ECSPI_MSGDATA:
80
- qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Trying to read from MSG FIFO\n",
81
- TYPE_IMX_SPI, __func__);
82
-
83
- /* Reading from MSGDATA gives 0 */
84
-
85
- break;
86
- default:
87
- value = s->regs[index];
88
- break;
89
+ imx_spi_update_irq(s);
90
}
91
-
92
DPRINTF("reg[%s] => 0x%" PRIx32 "\n", imx_spi_reg_name(index), value);
93
94
- imx_spi_update_irq(s);
95
-
96
return (uint64_t)value;
97
}
45
}
98
46
99
--
47
--
100
2.20.1
48
2.34.1
101
49
102
50
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
When the block is disabled, only the ECSPI_CONREG register can
4
be modified. Setting the EN bit enabled the device, clearing it
5
"disables the block and resets the internal logic with the
6
exception of the ECSPI_CONREG" register.
7
8
Ignore all other registers write except ECSPI_CONREG when the
9
block is disabled.
10
11
Ref: i.MX 6DQ Applications Processor Reference Manual (IMX6DQRM),
12
chapter 21.7.3: Control Register (ECSPIx_CONREG)
13
14
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Signed-off-by: Bin Meng <bin.meng@windriver.com>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Message-id: 20210129132323.30946-7-bmeng.cn@gmail.com
18
Message-Id: <20210115153049.3353008-6-f4bug@amsat.org>
19
Signed-off-by: Bin Meng <bin.meng@windriver.com>
20
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
23
hw/ssi/imx_spi.c | 13 +++++++++----
24
1 file changed, 9 insertions(+), 4 deletions(-)
25
26
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/ssi/imx_spi.c
29
+++ b/hw/ssi/imx_spi.c
30
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
31
DPRINTF("reg[%s] <= 0x%" PRIx32 "\n", imx_spi_reg_name(index),
32
(uint32_t)value);
33
34
+ if (!imx_spi_is_enabled(s)) {
35
+ /* Block is disabled */
36
+ if (index != ECSPI_CONREG) {
37
+ /* Ignore access */
38
+ return;
39
+ }
40
+ }
41
+
42
change_mask = s->regs[index] ^ value;
43
44
switch (index) {
45
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
46
TYPE_IMX_SPI, __func__);
47
break;
48
case ECSPI_TXDATA:
49
- if (!imx_spi_is_enabled(s)) {
50
- /* Ignore writes if device is disabled */
51
- break;
52
- } else if (fifo32_is_full(&s->tx_fifo)) {
53
+ if (fifo32_is_full(&s->tx_fifo)) {
54
/* Ignore writes if queue is full */
55
break;
56
}
57
--
58
2.20.1
59
60
diff view generated by jsdifflib
Deleted patch
1
From: Xuzhou Cheng <xuzhou.cheng@windriver.com>
2
1
3
When a write to ECSPI_CONREG register to disable the SPI controller,
4
imx_spi_soft_reset() is called to reset the controller, but chip
5
select lines should have been disabled, otherwise the state machine
6
of any devices (e.g.: SPI flashes) connected to the SPI master is
7
stuck to its last state and responds incorrectly to any follow-up
8
commands.
9
10
Fixes: c906a3a01582 ("i.MX: Add the Freescale SPI Controller")
11
Signed-off-by: Xuzhou Cheng <xuzhou.cheng@windriver.com>
12
Signed-off-by: Bin Meng <bin.meng@windriver.com>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20210129132323.30946-8-bmeng.cn@gmail.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/ssi/imx_spi.c | 6 ++++++
18
1 file changed, 6 insertions(+)
19
20
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/ssi/imx_spi.c
23
+++ b/hw/ssi/imx_spi.c
24
@@ -XXX,XX +XXX,XX @@ static void imx_spi_common_reset(IMXSPIState *s)
25
26
static void imx_spi_soft_reset(IMXSPIState *s)
27
{
28
+ int i;
29
+
30
imx_spi_common_reset(s);
31
32
imx_spi_update_irq(s);
33
+
34
+ for (i = 0; i < ECSPI_NUM_CS; i++) {
35
+ qemu_set_irq(s->cs_lines[i], 1);
36
+ }
37
}
38
39
static void imx_spi_reset(DeviceState *dev)
40
--
41
2.20.1
42
43
diff view generated by jsdifflib
Deleted patch
1
From: Bin Meng <bin.meng@windriver.com>
2
1
3
Current implementation of the imx spi controller expects the burst
4
length to be multiple of 8, which is the most common use case.
5
6
In case the burst length is not what we expect, log it to give user
7
a chance to notice it, and round it up to be multiple of 8.
8
9
Signed-off-by: Bin Meng <bin.meng@windriver.com>
10
Message-id: 20210129132323.30946-9-bmeng.cn@gmail.com
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/ssi/imx_spi.c | 17 ++++++++++++++++-
15
1 file changed, 16 insertions(+), 1 deletion(-)
16
17
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/ssi/imx_spi.c
20
+++ b/hw/ssi/imx_spi.c
21
@@ -XXX,XX +XXX,XX @@ static uint8_t imx_spi_selected_channel(IMXSPIState *s)
22
23
static uint32_t imx_spi_burst_length(IMXSPIState *s)
24
{
25
- return EXTRACT(s->regs[ECSPI_CONREG], ECSPI_CONREG_BURST_LENGTH) + 1;
26
+ uint32_t burst;
27
+
28
+ burst = EXTRACT(s->regs[ECSPI_CONREG], ECSPI_CONREG_BURST_LENGTH) + 1;
29
+ if (burst % 8) {
30
+ burst = ROUND_UP(burst, 8);
31
+ }
32
+
33
+ return burst;
34
}
35
36
static bool imx_spi_is_enabled(IMXSPIState *s)
37
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
38
IMXSPIState *s = opaque;
39
uint32_t index = offset >> 2;
40
uint32_t change_mask;
41
+ uint32_t burst;
42
43
if (index >= ECSPI_MAX) {
44
qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad register at offset 0x%"
45
@@ -XXX,XX +XXX,XX @@ static void imx_spi_write(void *opaque, hwaddr offset, uint64_t value,
46
case ECSPI_CONREG:
47
s->regs[ECSPI_CONREG] = value;
48
49
+ burst = EXTRACT(s->regs[ECSPI_CONREG], ECSPI_CONREG_BURST_LENGTH) + 1;
50
+ if (burst % 8) {
51
+ qemu_log_mask(LOG_UNIMP,
52
+ "[%s]%s: burst length %d not supported: rounding up to next multiple of 8\n",
53
+ TYPE_IMX_SPI, __func__, burst);
54
+ }
55
+
56
if (!imx_spi_is_enabled(s)) {
57
/* device is disabled, so this is a soft reset */
58
imx_spi_soft_reset(s);
59
--
60
2.20.1
61
62
diff view generated by jsdifflib
Deleted patch
1
From: Bin Meng <bin.meng@windriver.com>
2
1
3
For the ECSPIx_CONREG register BURST_LENGTH field, the manual says:
4
5
0x020 A SPI burst contains the 1 LSB in first word and all 32 bits in second word.
6
0x021 A SPI burst contains the 2 LSB in first word and all 32 bits in second word.
7
8
Current logic uses either s->burst_length or 32, whichever smaller,
9
to determine how many bits it should read from the tx fifo each time.
10
For example, for a 48 bit burst length, current logic transfers the
11
first 32 bit from the first word in the tx fifo, followed by a 16
12
bit from the second word in the tx fifo, which is wrong. The correct
13
logic should be: transfer the first 16 bit from the first word in
14
the tx fifo, followed by a 32 bit from the second word in the tx fifo.
15
16
With this change, SPI flash can be successfully probed by U-Boot on
17
imx6 sabrelite board.
18
19
=> sf probe
20
SF: Detected sst25vf016b with page size 256 Bytes, erase size 4 KiB, total 2 MiB
21
22
Fixes: c906a3a01582 ("i.MX: Add the Freescale SPI Controller")
23
Signed-off-by: Bin Meng <bin.meng@windriver.com>
24
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
25
Message-id: 20210129132323.30946-10-bmeng.cn@gmail.com
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
---
28
hw/ssi/imx_spi.c | 2 +-
29
1 file changed, 1 insertion(+), 1 deletion(-)
30
31
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/ssi/imx_spi.c
34
+++ b/hw/ssi/imx_spi.c
35
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
36
37
DPRINTF("data tx:0x%08x\n", tx);
38
39
- tx_burst = MIN(s->burst_length, 32);
40
+ tx_burst = (s->burst_length % 32) ? : 32;
41
42
rx = 0;
43
44
--
45
2.20.1
46
47
diff view generated by jsdifflib
Deleted patch
1
From: Bin Meng <bin.meng@windriver.com>
2
1
3
The endianness of data exchange between tx and rx fifo is incorrect.
4
Earlier bytes are supposed to show up on MSB and later bytes on LSB,
5
ie: in big endian. The manual does not explicitly say this, but the
6
U-Boot and Linux driver codes have a swap on the data transferred
7
to tx fifo and from rx fifo.
8
9
With this change, U-Boot read from / write to SPI flash tests pass.
10
11
=> sf test 1ff000 1000
12
SPI flash test:
13
0 erase: 0 ticks, 4096000 KiB/s 32768.000 Mbps
14
1 check: 3 ticks, 1333 KiB/s 10.664 Mbps
15
2 write: 235 ticks, 17 KiB/s 0.136 Mbps
16
3 read: 2 ticks, 2000 KiB/s 16.000 Mbps
17
Test passed
18
0 erase: 0 ticks, 4096000 KiB/s 32768.000 Mbps
19
1 check: 3 ticks, 1333 KiB/s 10.664 Mbps
20
2 write: 235 ticks, 17 KiB/s 0.136 Mbps
21
3 read: 2 ticks, 2000 KiB/s 16.000 Mbps
22
23
Fixes: c906a3a01582 ("i.MX: Add the Freescale SPI Controller")
24
Signed-off-by: Bin Meng <bin.meng@windriver.com>
25
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
26
Message-id: 20210129132323.30946-11-bmeng.cn@gmail.com
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
---
29
hw/ssi/imx_spi.c | 7 ++-----
30
1 file changed, 2 insertions(+), 5 deletions(-)
31
32
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/ssi/imx_spi.c
35
+++ b/hw/ssi/imx_spi.c
36
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
37
38
while (!fifo32_is_empty(&s->tx_fifo)) {
39
int tx_burst = 0;
40
- int index = 0;
41
42
if (s->burst_length <= 0) {
43
s->burst_length = imx_spi_burst_length(s);
44
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
45
rx = 0;
46
47
while (tx_burst > 0) {
48
- uint8_t byte = tx & 0xff;
49
+ uint8_t byte = tx >> (tx_burst - 8);
50
51
DPRINTF("writing 0x%02x\n", (uint32_t)byte);
52
53
@@ -XXX,XX +XXX,XX @@ static void imx_spi_flush_txfifo(IMXSPIState *s)
54
55
DPRINTF("0x%02x read\n", (uint32_t)byte);
56
57
- tx = tx >> 8;
58
- rx |= (byte << (index * 8));
59
+ rx = (rx << 8) | byte;
60
61
/* Remove 8 bits from the actual burst */
62
tx_burst -= 8;
63
s->burst_length -= 8;
64
- index++;
65
}
66
67
DPRINTF("data rx:0x%08x\n", rx);
68
--
69
2.20.1
70
71
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
Per the ARM Generic Interrupt Controller Architecture specification
4
(document "ARM IHI 0048B.b (ID072613)"), the SGIINTID field is 4 bit,
5
not 10:
6
7
- 4.3 Distributor register descriptions
8
- 4.3.15 Software Generated Interrupt Register, GICD_SG
9
10
- Table 4-21 GICD_SGIR bit assignments
11
12
The Interrupt ID of the SGI to forward to the specified CPU
13
interfaces. The value of this field is the Interrupt ID, in
14
the range 0-15, for example a value of 0b0011 specifies
15
Interrupt ID 3.
16
17
Correct the irq mask to fix an undefined behavior (which eventually
18
lead to a heap-buffer-overflow, see [Buglink]):
19
20
$ echo 'writel 0x8000f00 0xff4affb0' | qemu-system-aarch64 -M virt,accel=qtest -qtest stdio
21
[I 1612088147.116987] OPENED
22
[R +0.278293] writel 0x8000f00 0xff4affb0
23
../hw/intc/arm_gic.c:1498:13: runtime error: index 944 out of bounds for type 'uint8_t [16][8]'
24
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior ../hw/intc/arm_gic.c:1498:13
25
26
This fixes a security issue when running with KVM on Arm with
27
kernel-irqchip=off. (The default is kernel-irqchip=on, which is
28
unaffected, and which is also the correct choice for performance.)
29
30
Cc: qemu-stable@nongnu.org
31
Fixes: 9ee6e8bb853 ("ARMv7 support.")
32
Buglink: https://bugs.launchpad.net/qemu/+bug/1913916
33
Buglink: https://bugs.launchpad.net/qemu/+bug/1913917
34
Reported-by: Alexander Bulekov <alxndr@bu.edu>
35
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
36
Message-id: 20210131103401.217160-1-f4bug@amsat.org
37
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
38
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
39
---
40
hw/intc/arm_gic.c | 2 +-
41
1 file changed, 1 insertion(+), 1 deletion(-)
42
43
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/intc/arm_gic.c
46
+++ b/hw/intc/arm_gic.c
47
@@ -XXX,XX +XXX,XX @@ static void gic_dist_writel(void *opaque, hwaddr offset,
48
int target_cpu;
49
50
cpu = gic_get_current_cpu(s);
51
- irq = value & 0x3ff;
52
+ irq = value & 0xf;
53
switch ((value >> 24) & 3) {
54
case 0:
55
mask = (value >> 16) & ALL_CPU_MASK;
56
--
57
2.20.1
58
59
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
The STM32F405 SoC uses an OR gate on its ADC IRQs.
4
5
Fixes: 529fc5fd3e1 ("hw/arm: Add the STM32F4xx SoC")
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20210131184449.382425-2-f4bug@amsat.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/Kconfig | 1 +
12
1 file changed, 1 insertion(+)
13
14
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/Kconfig
17
+++ b/hw/arm/Kconfig
18
@@ -XXX,XX +XXX,XX @@ config STM32F205_SOC
19
config STM32F405_SOC
20
bool
21
select ARM_V7M
22
+ select OR_IRQ
23
select STM32F4XX_SYSCFG
24
select STM32F4XX_EXTI
25
26
--
27
2.20.1
28
29
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
The Exynos4210 SoC uses an OR gate on the PL330 IRQ lines.
4
5
Fixes: dab15fbe2ab ("hw/arm/exynos4210: Fix DMA initialization")
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20210131184449.382425-3-f4bug@amsat.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/Kconfig | 1 +
12
1 file changed, 1 insertion(+)
13
14
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/Kconfig
17
+++ b/hw/arm/Kconfig
18
@@ -XXX,XX +XXX,XX @@ config EXYNOS4
19
select PTIMER
20
select SDHCI
21
select USB_EHCI_SYSBUS
22
+ select OR_IRQ
23
24
config HIGHBANK
25
bool
26
--
27
2.20.1
28
29
diff view generated by jsdifflib