1
target-arm queue: nothing major here, but no point
1
Hi; here's the first target-arm pullreq for the 8.1 cycle.
2
sitting on them waiting for more stuff to come along.
2
Nothing particularly huge in here, just the various things
3
that had accumulated during the freeze.
3
4
4
thanks
5
thanks
5
-- PMM
6
-- PMM
6
7
7
The following changes since commit 1329132d28bf14b9508f7a1f04a2c63422bc3f99:
8
The following changes since commit 2d82c32b2ceaca3dc3da5e36e10976f34bfcb598:
8
9
9
Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (2019-09-26 16:14:03 +0100)
10
Open 8.1 development tree (2023-04-20 10:05:25 +0100)
10
11
11
are available in the Git repository at:
12
are available in the Git repository at:
12
13
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190927
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230420
14
15
15
for you to fetch changes up to e4e34855e658b78ecac50a651cc847662ff02cfd:
16
for you to fetch changes up to 1ed1f338520cda0574b7e04f5e8e85e049740548:
16
17
17
hw/arm/boot: Use the IEC binary prefix definitions (2019-09-27 11:44:39 +0100)
18
arm/mcimx7d-sabre: Set fec2-phy-connected property to false (2023-04-20 10:46:43 +0100)
18
19
19
----------------------------------------------------------------
20
----------------------------------------------------------------
20
target-arm queue:
21
target-arm queue:
21
* Fix the CBAR register implementation for Cortex-A53,
22
* hw/arm: Fix some typos in comments (most found by codespell)
22
Cortex-A57, Cortex-A72
23
* exynos: Fix out-of-bounds access in exynos4210_gcomp_find debug printf
23
* Fix direct booting of Linux kernels on emulated CPUs
24
* Orangepi-PC, Cubieboard: add Allwinner WDT watchdog emulation
24
which have an AArch32 EL3 (incorrect NSACR settings
25
* tests/avocado: Add reboot tests to Cubieboard
25
meant they could not access the FPU)
26
* hw/timer/imx_epit: Fix bugs in timer limit checking
26
* semihosting cleanup: do more work at translate time
27
* target/arm: Remove KVM AArch32 CPU definitions
27
and less work at runtime
28
* hw/arm/virt: Restrict Cortex-A7 check to TCG
29
* target/arm: Initialize debug capabilities only once
30
* target/arm: Implement FEAT_PAN3
31
* docs/devel/kconfig.rst: Fix incorrect markup
32
* target/arm: Report pauth information to gdb as 'pauth_v2'
33
* mcimxd7-sabre, mcimx6ul-evk: Correctly model the way the PHY
34
on the second ethernet device must be configured via the
35
first one
28
36
29
----------------------------------------------------------------
37
----------------------------------------------------------------
30
Alex Bennée (6):
38
Akihiko Odaki (1):
31
tests/tcg: clean-up some comments after the de-tangling
39
target/arm: Initialize debug capabilities only once
32
target/arm: handle M-profile semihosting at translate time
33
target/arm: handle A-profile semihosting at translate time
34
target/arm: remove run time semihosting checks
35
target/arm: remove run-time semihosting checks for linux-user
36
tests/tcg: add linux-user semihosting smoke test for ARM
37
40
38
Luc Michel (1):
41
Axel Heider (2):
39
target/arm: fix CBAR register for AArch64 CPUs
42
hw/timer/imx_epit: don't shadow variable
43
hw/timer/imx_epit: fix limit check
40
44
41
Peter Maydell (1):
45
Feng Jiang (1):
42
hw/arm/boot.c: Set NSACR.{CP11,CP10} for NS kernel boots
46
exynos: Fix out-of-bounds access in exynos4210_gcomp_find debug printf
43
47
44
Philippe Mathieu-Daudé (1):
48
Guenter Roeck (5):
45
hw/arm/boot: Use the IEC binary prefix definitions
49
hw/net/imx_fec: Support two Ethernet interfaces connected to single MDIO bus
50
fsl-imx6ul: Add fec[12]-phy-connected properties
51
arm/mcimx6ul-evk: Set fec1-phy-connected property to false
52
fsl-imx7: Add fec[12]-phy-connected properties
53
arm/mcimx7d-sabre: Set fec2-phy-connected property to false
46
54
47
tests/tcg/Makefile.target | 7 ++-
55
Peter Maydell (5):
48
tests/tcg/aarch64/Makefile.target | 8 ++-
56
target/arm: Pass ARMMMUFaultInfo to merge_syn_data_abort()
49
tests/tcg/arm/Makefile.target | 20 ++++---
57
target/arm: Don't set ISV when reporting stage 1 faults in ESR_EL2
50
linux-user/arm/target_syscall.h | 3 -
58
target/arm: Implement FEAT_PAN3
51
hw/arm/boot.c | 12 ++--
59
docs/devel/kconfig.rst: Fix incorrect markup
52
linux-user/arm/cpu_loop.c | 3 -
60
target/arm: Report pauth information to gdb as 'pauth_v2'
53
target/arm/helper.c | 115 +++++++++++++-------------------------
54
target/arm/m_helper.c | 18 ++----
55
target/arm/translate.c | 30 ++++++++--
56
tests/tcg/arm/semihosting.c | 45 +++++++++++++++
57
10 files changed, 146 insertions(+), 115 deletions(-)
58
create mode 100644 tests/tcg/arm/semihosting.c
59
61
62
Philippe Mathieu-Daudé (2):
63
target/arm: Remove KVM AArch32 CPU definitions
64
hw/arm/virt: Restrict Cortex-A7 check to TCG
65
66
Stefan Weil (1):
67
hw/arm: Fix some typos in comments (most found by codespell)
68
69
Strahinja Jankovic (4):
70
hw/watchdog: Allwinner WDT emulation for system reset
71
hw/arm: Add WDT to Allwinner-A10 and Cubieboard
72
hw/arm: Add WDT to Allwinner-H3 and Orangepi-PC
73
tests/avocado: Add reboot tests to Cubieboard
74
75
docs/devel/kconfig.rst | 2 +-
76
docs/system/arm/cubieboard.rst | 1 +
77
docs/system/arm/emulation.rst | 1 +
78
docs/system/arm/orangepi.rst | 1 +
79
include/hw/arm/allwinner-a10.h | 2 +
80
include/hw/arm/allwinner-h3.h | 5 +-
81
include/hw/arm/fsl-imx6ul.h | 1 +
82
include/hw/arm/fsl-imx7.h | 1 +
83
include/hw/net/imx_fec.h | 2 +
84
include/hw/watchdog/allwinner-wdt.h | 123 +++++++++++
85
target/arm/cpu.h | 5 +
86
target/arm/kvm-consts.h | 9 +-
87
target/arm/kvm_arm.h | 8 +
88
hw/arm/allwinner-a10.c | 7 +
89
hw/arm/allwinner-h3.c | 8 +
90
hw/arm/exynos4210.c | 4 +-
91
hw/arm/fsl-imx6ul.c | 20 ++
92
hw/arm/fsl-imx7.c | 20 ++
93
hw/arm/mcimx6ul-evk.c | 2 +
94
hw/arm/mcimx7d-sabre.c | 2 +
95
hw/arm/musicpal.c | 2 +-
96
hw/arm/omap1.c | 2 +-
97
hw/arm/omap2.c | 2 +-
98
hw/arm/virt-acpi-build.c | 2 +-
99
hw/arm/virt.c | 4 +-
100
hw/arm/xlnx-versal-virt.c | 2 +-
101
hw/net/imx_fec.c | 27 ++-
102
hw/timer/exynos4210_mct.c | 13 +-
103
hw/timer/imx_epit.c | 2 +-
104
hw/watchdog/allwinner-wdt.c | 416 ++++++++++++++++++++++++++++++++++++
105
target/arm/cpu64.c | 2 +-
106
target/arm/cpu_tcg.c | 2 -
107
target/arm/gdbstub.c | 9 +-
108
target/arm/kvm.c | 2 +
109
target/arm/kvm64.c | 18 +-
110
target/arm/ptw.c | 14 +-
111
target/arm/tcg/tlb_helper.c | 26 ++-
112
gdb-xml/aarch64-pauth.xml | 2 +-
113
hw/arm/Kconfig | 4 +-
114
hw/watchdog/Kconfig | 4 +
115
hw/watchdog/meson.build | 1 +
116
hw/watchdog/trace-events | 7 +
117
tests/avocado/boot_linux_console.py | 15 +-
118
43 files changed, 738 insertions(+), 64 deletions(-)
119
create mode 100644 include/hw/watchdog/allwinner-wdt.h
120
create mode 100644 hw/watchdog/allwinner-wdt.c
121
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Stefan Weil <sw@weilnetz.de>
2
2
3
Now we do all our checking at translate time we can make cpu_loop a
3
Signed-off-by: Stefan Weil <sw@weilnetz.de>
4
little bit simpler. We also introduce a simple linux-user semihosting
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
test case to defend the functionality. The out-of-tree softmmu based
5
Message-id: 20230409200526.1156456-1-sw@weilnetz.de
6
semihosting tests are still more comprehensive.
7
8
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20190913151845.12582-6-alex.bennee@linaro.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
7
---
13
linux-user/arm/target_syscall.h | 3 ---
8
hw/arm/exynos4210.c | 4 ++--
14
linux-user/arm/cpu_loop.c | 3 ---
9
hw/arm/musicpal.c | 2 +-
15
2 files changed, 6 deletions(-)
10
hw/arm/omap1.c | 2 +-
11
hw/arm/omap2.c | 2 +-
12
hw/arm/virt-acpi-build.c | 2 +-
13
hw/arm/virt.c | 2 +-
14
hw/arm/xlnx-versal-virt.c | 2 +-
15
hw/arm/Kconfig | 2 +-
16
8 files changed, 9 insertions(+), 9 deletions(-)
16
17
17
diff --git a/linux-user/arm/target_syscall.h b/linux-user/arm/target_syscall.h
18
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
18
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
19
--- a/linux-user/arm/target_syscall.h
20
--- a/hw/arm/exynos4210.c
20
+++ b/linux-user/arm/target_syscall.h
21
+++ b/hw/arm/exynos4210.c
21
@@ -XXX,XX +XXX,XX @@ struct target_pt_regs {
22
@@ -XXX,XX +XXX,XX @@ static int mapline_size(const int *mapline)
22
#define ARM_NR_set_tls     (ARM_NR_BASE + 5)
23
23
#define ARM_NR_get_tls (ARM_NR_BASE + 6)
24
/*
24
25
* Initialize board IRQs.
25
-#define ARM_NR_semihosting     0x123456
26
- * These IRQs contain splitted Int/External Combiner and External Gic IRQs.
26
-#define ARM_NR_thumb_semihosting 0xAB
27
+ * These IRQs contain split Int/External Combiner and External Gic IRQs.
27
-
28
*/
28
#if defined(TARGET_WORDS_BIGENDIAN)
29
static void exynos4210_init_board_irqs(Exynos4210State *s)
29
#define UNAME_MACHINE "armv5teb"
30
{
30
#else
31
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
31
diff --git a/linux-user/arm/cpu_loop.c b/linux-user/arm/cpu_loop.c
32
* - SDMA
33
* - ADMA2
34
*
35
- * As this part of the Exynos4210 is not publically available,
36
+ * As this part of the Exynos4210 is not publicly available,
37
* we used the "HS-MMC Controller S3C2416X RISC Microprocessor"
38
* public datasheet which is very similar (implementing
39
* MMC Specification Version 4.0 being the only difference noted)
40
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
32
index XXXXXXX..XXXXXXX 100644
41
index XXXXXXX..XXXXXXX 100644
33
--- a/linux-user/arm/cpu_loop.c
42
--- a/hw/arm/musicpal.c
34
+++ b/linux-user/arm/cpu_loop.c
43
+++ b/hw/arm/musicpal.c
35
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
44
@@ -XXX,XX +XXX,XX @@
36
45
#define MP_LCD_SPI_CMD 0x00104011
37
if (n == ARM_NR_cacheflush) {
46
#define MP_LCD_SPI_INVALID 0x00000000
38
/* nop */
47
39
- } else if (n == ARM_NR_semihosting
48
-/* Commmands */
40
- || n == ARM_NR_thumb_semihosting) {
49
+/* Commands */
41
- env->regs[0] = do_arm_semihosting (env);
50
#define MP_LCD_INST_SETPAGE0 0xB0
42
} else if (n == 0 || n >= ARM_SYSCALL_BASE || env->thumb) {
51
/* ... */
43
/* linux syscall */
52
#define MP_LCD_INST_SETPAGE7 0xB7
44
if (env->thumb || n == 0) {
53
diff --git a/hw/arm/omap1.c b/hw/arm/omap1.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/arm/omap1.c
56
+++ b/hw/arm/omap1.c
57
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap310_mpu_init(MemoryRegion *dram,
58
s->led[1] = omap_lpg_init(system_memory,
59
0xfffbd800, omap_findclk(s, "clk32-kHz"));
60
61
- /* Register mappings not currenlty implemented:
62
+ /* Register mappings not currently implemented:
63
* MCSI2 Comm    fffb2000 - fffb27ff (not mapped on OMAP310)
64
* MCSI1 Bluetooth    fffb2800 - fffb2fff (not mapped on OMAP310)
65
* USB W2FC        fffb4000 - fffb47ff
66
diff --git a/hw/arm/omap2.c b/hw/arm/omap2.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/arm/omap2.c
69
+++ b/hw/arm/omap2.c
70
@@ -XXX,XX +XXX,XX @@ struct omap_mpu_state_s *omap2420_mpu_init(MemoryRegion *sdram,
71
omap_findclk(s, "func_96m_clk"),
72
omap_findclk(s, "core_l4_iclk"));
73
74
- /* All register mappings (includin those not currenlty implemented):
75
+ /* All register mappings (including those not currently implemented):
76
* SystemControlMod    48000000 - 48000fff
77
* SystemControlL4    48001000 - 48001fff
78
* 32kHz Timer Mod    48004000 - 48004fff
79
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
80
index XXXXXXX..XXXXXXX 100644
81
--- a/hw/arm/virt-acpi-build.c
82
+++ b/hw/arm/virt-acpi-build.c
83
@@ -XXX,XX +XXX,XX @@ static void build_append_gicr(GArray *table_data, uint64_t base, uint32_t size)
84
build_append_int_noprefix(table_data, 0xE, 1); /* Type */
85
build_append_int_noprefix(table_data, 16, 1); /* Length */
86
build_append_int_noprefix(table_data, 0, 2); /* Reserved */
87
- /* Discovery Range Base Addres */
88
+ /* Discovery Range Base Address */
89
build_append_int_noprefix(table_data, base, 8);
90
build_append_int_noprefix(table_data, size, 4); /* Discovery Range Length */
91
}
92
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
93
index XXXXXXX..XXXXXXX 100644
94
--- a/hw/arm/virt.c
95
+++ b/hw/arm/virt.c
96
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
97
int pa_bits;
98
99
/*
100
- * Instanciate a temporary CPU object to find out about what
101
+ * Instantiate a temporary CPU object to find out about what
102
* we are about to deal with. Once this is done, get rid of
103
* the object.
104
*/
105
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
106
index XXXXXXX..XXXXXXX 100644
107
--- a/hw/arm/xlnx-versal-virt.c
108
+++ b/hw/arm/xlnx-versal-virt.c
109
@@ -XXX,XX +XXX,XX @@ static void versal_virt_init(MachineState *machine)
110
fdt_add_clk_node(s, "/clk25", 25000000, s->phandle.clk_25Mhz);
111
112
/* Make the APU cpu address space visible to virtio and other
113
- * modules unaware of muliple address-spaces. */
114
+ * modules unaware of multiple address-spaces. */
115
memory_region_add_subregion_overlap(get_system_memory(),
116
0, &s->soc.fpd.apu.mr, 0);
117
118
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
119
index XXXXXXX..XXXXXXX 100644
120
--- a/hw/arm/Kconfig
121
+++ b/hw/arm/Kconfig
122
@@ -XXX,XX +XXX,XX @@ config OLIMEX_STM32_H405
123
config NSERIES
124
bool
125
select OMAP
126
- select TMP105 # tempature sensor
127
+ select TMP105 # temperature sensor
128
select BLIZZARD # LCD/TV controller
129
select ONENAND
130
select TSC210X # touchscreen/sensors/audio
45
--
131
--
46
2.20.1
132
2.34.1
47
133
48
134
diff view generated by jsdifflib
New patch
1
From: Feng Jiang <jiangfeng@kylinos.cn>
1
2
3
One of the debug printfs in exynos4210_gcomp_find() will
4
access outside the 's->g_timer.reg.comp[]' array if there
5
was no active comparator and 'res' is -1. Add a conditional
6
to avoid this.
7
8
This doesn't happen in normal use because the debug printfs
9
are by default not compiled in.
10
11
Signed-off-by: Feng Jiang <jiangfeng@kylinos.cn>
12
Message-id: 20230404074506.112615-1-jiangfeng@kylinos.cn
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
[PMM: Adjusted commit message to clarify that the overrun
15
only happens if you've enabled debug printfs]
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
hw/timer/exynos4210_mct.c | 13 ++++++++-----
19
1 file changed, 8 insertions(+), 5 deletions(-)
20
21
diff --git a/hw/timer/exynos4210_mct.c b/hw/timer/exynos4210_mct.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/timer/exynos4210_mct.c
24
+++ b/hw/timer/exynos4210_mct.c
25
@@ -XXX,XX +XXX,XX @@ static int32_t exynos4210_gcomp_find(Exynos4210MCTState *s)
26
res = min_comp_i;
27
}
28
29
- DPRINTF("found comparator %d: comp 0x%llx distance 0x%llx, gfrc 0x%llx\n",
30
- res,
31
- s->g_timer.reg.comp[res],
32
- distance_min,
33
- gfrc);
34
+ if (res >= 0) {
35
+ DPRINTF("found comparator %d: "
36
+ "comp 0x%llx distance 0x%llx, gfrc 0x%llx\n",
37
+ res,
38
+ s->g_timer.reg.comp[res],
39
+ distance_min,
40
+ gfrc);
41
+ }
42
43
return res;
44
}
45
--
46
2.34.1
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
2
2
3
We already use semihosting for the system stuff so this is a simple
3
This patch adds basic support for Allwinner WDT.
4
smoke test to ensure we are working OK on linux-user.
4
Both sun4i and sun6i variants are supported.
5
However, interrupt generation is not supported, so WDT can be used only to trigger system reset.
5
6
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
7
Message-id: 20190913151845.12582-7-alex.bennee@linaro.org
8
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
10
Message-id: 20230326202256.22980-2-strahinja.p.jankovic@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
12
---
11
tests/tcg/aarch64/Makefile.target | 5 ++++
13
include/hw/watchdog/allwinner-wdt.h | 123 ++++++++
12
tests/tcg/arm/Makefile.target | 5 ++++
14
hw/watchdog/allwinner-wdt.c | 416 ++++++++++++++++++++++++++++
13
tests/tcg/arm/semihosting.c | 45 +++++++++++++++++++++++++++++++
15
hw/watchdog/Kconfig | 4 +
14
3 files changed, 55 insertions(+)
16
hw/watchdog/meson.build | 1 +
15
create mode 100644 tests/tcg/arm/semihosting.c
17
hw/watchdog/trace-events | 7 +
18
5 files changed, 551 insertions(+)
19
create mode 100644 include/hw/watchdog/allwinner-wdt.h
20
create mode 100644 hw/watchdog/allwinner-wdt.c
16
21
17
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
22
diff --git a/include/hw/watchdog/allwinner-wdt.h b/include/hw/watchdog/allwinner-wdt.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/tests/tcg/aarch64/Makefile.target
20
+++ b/tests/tcg/aarch64/Makefile.target
21
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
22
AARCH64_TESTS += pauth-1 pauth-2
23
run-pauth-%: QEMU_OPTS += -cpu max
24
25
+# Semihosting smoke test for linux-user
26
+AARCH64_TESTS += semihosting
27
+run-semihosting: semihosting
28
+    $(call run-test,$<,$(QEMU) $< 2> $<.err, "$< on $(TARGET_NAME)")
29
+
30
TESTS += $(AARCH64_TESTS)
31
diff --git a/tests/tcg/arm/Makefile.target b/tests/tcg/arm/Makefile.target
32
index XXXXXXX..XXXXXXX 100644
33
--- a/tests/tcg/arm/Makefile.target
34
+++ b/tests/tcg/arm/Makefile.target
35
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
36
    $(call run-test,fcvt,$(QEMU) $<,"$< on $(TARGET_NAME)")
37
    $(call diff-out,fcvt,$(ARM_SRC)/fcvt.ref)
38
39
+# Semihosting smoke test for linux-user
40
+ARM_TESTS += semihosting
41
+run-semihosting: semihosting
42
+    $(call run-test,$<,$(QEMU) $< 2> $<.err, "$< on $(TARGET_NAME)")
43
+
44
TESTS += $(ARM_TESTS)
45
46
# On ARM Linux only supports 4k pages
47
diff --git a/tests/tcg/arm/semihosting.c b/tests/tcg/arm/semihosting.c
48
new file mode 100644
23
new file mode 100644
49
index XXXXXXX..XXXXXXX
24
index XXXXXXX..XXXXXXX
50
--- /dev/null
25
--- /dev/null
51
+++ b/tests/tcg/arm/semihosting.c
26
+++ b/include/hw/watchdog/allwinner-wdt.h
52
@@ -XXX,XX +XXX,XX @@
27
@@ -XXX,XX +XXX,XX @@
53
+/*
28
+/*
54
+ * linux-user semihosting checks
29
+ * Allwinner Watchdog emulation
55
+ *
30
+ *
56
+ * Copyright (c) 2019
31
+ * Copyright (C) 2023 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
57
+ * Written by Alex Bennée <alex.bennee@linaro.org>
32
+ *
58
+ *
33
+ * This file is derived from Allwinner RTC,
59
+ * SPDX-License-Identifier: GPL-3.0-or-later
34
+ * by Niek Linnenbank.
35
+ *
36
+ * This program is free software: you can redistribute it and/or modify
37
+ * it under the terms of the GNU General Public License as published by
38
+ * the Free Software Foundation, either version 2 of the License, or
39
+ * (at your option) any later version.
40
+ *
41
+ * This program is distributed in the hope that it will be useful,
42
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
43
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
44
+ * GNU General Public License for more details.
45
+ *
46
+ * You should have received a copy of the GNU General Public License
47
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
60
+ */
48
+ */
61
+
49
+
62
+#include <stdint.h>
50
+#ifndef HW_WATCHDOG_ALLWINNER_WDT_H
63
+
51
+#define HW_WATCHDOG_ALLWINNER_WDT_H
64
+#define SYS_WRITE0 0x04
52
+
65
+#define SYS_REPORTEXC 0x18
53
+#include "qom/object.h"
66
+
54
+#include "hw/ptimer.h"
67
+void __semi_call(uintptr_t type, uintptr_t arg0)
55
+#include "hw/sysbus.h"
68
+{
56
+
69
+#if defined(__arm__)
57
+/*
70
+ register uintptr_t t asm("r0") = type;
58
+ * This is a model of the Allwinner watchdog.
71
+ register uintptr_t a0 asm("r1") = arg0;
59
+ * Since watchdog registers belong to the timer module (and are shared with the
72
+ asm("svc 0xab"
60
+ * RTC module), the interrupt line from watchdog is not handled right now.
73
+ : /* no return */
61
+ * In QEMU, we just wire up the watchdog reset to watchdog_perform_action(),
74
+ : "r" (t), "r" (a0));
62
+ * at least for the moment.
75
+#else
63
+ */
76
+ register uintptr_t t asm("x0") = type;
64
+
77
+ register uintptr_t a0 asm("x1") = arg0;
65
+#define TYPE_AW_WDT "allwinner-wdt"
78
+ asm("hlt 0xf000"
66
+
79
+ : /* no return */
67
+/** Allwinner WDT sun4i family (A10, A12), also sun7i (A20) */
80
+ : "r" (t), "r" (a0));
68
+#define TYPE_AW_WDT_SUN4I TYPE_AW_WDT "-sun4i"
81
+#endif
69
+
82
+}
70
+/** Allwinner WDT sun6i family and newer (A31, H2+, H3, etc) */
83
+
71
+#define TYPE_AW_WDT_SUN6I TYPE_AW_WDT "-sun6i"
84
+int main(int argc, char *argv[argc])
72
+
85
+{
73
+/** Number of WDT registers */
86
+#if defined(__arm__)
74
+#define AW_WDT_REGS_NUM (5)
87
+ uintptr_t exit_code = 0x20026;
75
+
88
+#else
76
+OBJECT_DECLARE_TYPE(AwWdtState, AwWdtClass, AW_WDT)
89
+ uintptr_t exit_block[2] = {0x20026, 0};
77
+
90
+ uintptr_t exit_code = (uintptr_t) &exit_block;
78
+/**
91
+#endif
79
+ * Allwinner WDT object instance state.
92
+
80
+ */
93
+ __semi_call(SYS_WRITE0, (uintptr_t) "Hello World");
81
+struct AwWdtState {
94
+ __semi_call(SYS_REPORTEXC, exit_code);
82
+ /*< private >*/
95
+ /* if we get here we failed */
83
+ SysBusDevice parent_obj;
96
+ return -1;
84
+
97
+}
85
+ /*< public >*/
86
+ MemoryRegion iomem;
87
+ struct ptimer_state *timer;
88
+
89
+ uint32_t regs[AW_WDT_REGS_NUM];
90
+};
91
+
92
+/**
93
+ * Allwinner WDT class-level struct.
94
+ *
95
+ * This struct is filled by each sunxi device specific code
96
+ * such that the generic code can use this struct to support
97
+ * all devices.
98
+ */
99
+struct AwWdtClass {
100
+ /*< private >*/
101
+ SysBusDeviceClass parent_class;
102
+ /*< public >*/
103
+
104
+ /** Defines device specific register map */
105
+ const uint8_t *regmap;
106
+
107
+ /** Size of the regmap in bytes */
108
+ size_t regmap_size;
109
+
110
+ /**
111
+ * Read device specific register
112
+ *
113
+ * @offset: register offset to read
114
+ * @return true if register read successful, false otherwise
115
+ */
116
+ bool (*read)(AwWdtState *s, uint32_t offset);
117
+
118
+ /**
119
+ * Write device specific register
120
+ *
121
+ * @offset: register offset to write
122
+ * @data: value to set in register
123
+ * @return true if register write successful, false otherwise
124
+ */
125
+ bool (*write)(AwWdtState *s, uint32_t offset, uint32_t data);
126
+
127
+ /**
128
+ * Check if watchdog can generate system reset
129
+ *
130
+ * @return true if watchdog can generate system reset
131
+ */
132
+ bool (*can_reset_system)(AwWdtState *s);
133
+
134
+ /**
135
+ * Check if provided key is valid
136
+ *
137
+ * @value: value written to register
138
+ * @return true if key is valid, false otherwise
139
+ */
140
+ bool (*is_key_valid)(AwWdtState *s, uint32_t val);
141
+
142
+ /**
143
+ * Get current INTV_VALUE setting
144
+ *
145
+ * @return current INTV_VALUE (0-15)
146
+ */
147
+ uint8_t (*get_intv_value)(AwWdtState *s);
148
+};
149
+
150
+#endif /* HW_WATCHDOG_ALLWINNER_WDT_H */
151
diff --git a/hw/watchdog/allwinner-wdt.c b/hw/watchdog/allwinner-wdt.c
152
new file mode 100644
153
index XXXXXXX..XXXXXXX
154
--- /dev/null
155
+++ b/hw/watchdog/allwinner-wdt.c
156
@@ -XXX,XX +XXX,XX @@
157
+/*
158
+ * Allwinner Watchdog emulation
159
+ *
160
+ * Copyright (C) 2023 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
161
+ *
162
+ * This file is derived from Allwinner RTC,
163
+ * by Niek Linnenbank.
164
+ *
165
+ * This program is free software: you can redistribute it and/or modify
166
+ * it under the terms of the GNU General Public License as published by
167
+ * the Free Software Foundation, either version 2 of the License, or
168
+ * (at your option) any later version.
169
+ *
170
+ * This program is distributed in the hope that it will be useful,
171
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
172
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
173
+ * GNU General Public License for more details.
174
+ *
175
+ * You should have received a copy of the GNU General Public License
176
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
177
+ */
178
+
179
+#include "qemu/osdep.h"
180
+#include "qemu/log.h"
181
+#include "qemu/units.h"
182
+#include "qemu/module.h"
183
+#include "trace.h"
184
+#include "hw/sysbus.h"
185
+#include "hw/registerfields.h"
186
+#include "hw/watchdog/allwinner-wdt.h"
187
+#include "sysemu/watchdog.h"
188
+#include "migration/vmstate.h"
189
+
190
+/* WDT registers */
191
+enum {
192
+ REG_IRQ_EN = 0, /* Watchdog interrupt enable */
193
+ REG_IRQ_STA, /* Watchdog interrupt status */
194
+ REG_CTRL, /* Watchdog control register */
195
+ REG_CFG, /* Watchdog configuration register */
196
+ REG_MODE, /* Watchdog mode register */
197
+};
198
+
199
+/* Universal WDT register flags */
200
+#define WDT_RESTART_MASK (1 << 0)
201
+#define WDT_EN_MASK (1 << 0)
202
+
203
+/* sun4i specific WDT register flags */
204
+#define RST_EN_SUN4I_MASK (1 << 1)
205
+#define INTV_VALUE_SUN4I_SHIFT (3)
206
+#define INTV_VALUE_SUN4I_MASK (0xfu << INTV_VALUE_SUN4I_SHIFT)
207
+
208
+/* sun6i specific WDT register flags */
209
+#define RST_EN_SUN6I_MASK (1 << 0)
210
+#define KEY_FIELD_SUN6I_SHIFT (1)
211
+#define KEY_FIELD_SUN6I_MASK (0xfffu << KEY_FIELD_SUN6I_SHIFT)
212
+#define KEY_FIELD_SUN6I (0xA57u)
213
+#define INTV_VALUE_SUN6I_SHIFT (4)
214
+#define INTV_VALUE_SUN6I_MASK (0xfu << INTV_VALUE_SUN6I_SHIFT)
215
+
216
+/* Map of INTV_VALUE to 0.5s units. */
217
+static const uint8_t allwinner_wdt_count_map[] = {
218
+ 1,
219
+ 2,
220
+ 4,
221
+ 6,
222
+ 8,
223
+ 10,
224
+ 12,
225
+ 16,
226
+ 20,
227
+ 24,
228
+ 28,
229
+ 32
230
+};
231
+
232
+/* WDT sun4i register map (offset to name) */
233
+const uint8_t allwinner_wdt_sun4i_regmap[] = {
234
+ [0x0000] = REG_CTRL,
235
+ [0x0004] = REG_MODE,
236
+};
237
+
238
+/* WDT sun6i register map (offset to name) */
239
+const uint8_t allwinner_wdt_sun6i_regmap[] = {
240
+ [0x0000] = REG_IRQ_EN,
241
+ [0x0004] = REG_IRQ_STA,
242
+ [0x0010] = REG_CTRL,
243
+ [0x0014] = REG_CFG,
244
+ [0x0018] = REG_MODE,
245
+};
246
+
247
+static bool allwinner_wdt_sun4i_read(AwWdtState *s, uint32_t offset)
248
+{
249
+ /* no sun4i specific registers currently implemented */
250
+ return false;
251
+}
252
+
253
+static bool allwinner_wdt_sun4i_write(AwWdtState *s, uint32_t offset,
254
+ uint32_t data)
255
+{
256
+ /* no sun4i specific registers currently implemented */
257
+ return false;
258
+}
259
+
260
+static bool allwinner_wdt_sun4i_can_reset_system(AwWdtState *s)
261
+{
262
+ if (s->regs[REG_MODE] & RST_EN_SUN4I_MASK) {
263
+ return true;
264
+ } else {
265
+ return false;
266
+ }
267
+}
268
+
269
+static bool allwinner_wdt_sun4i_is_key_valid(AwWdtState *s, uint32_t val)
270
+{
271
+ /* sun4i has no key */
272
+ return true;
273
+}
274
+
275
+static uint8_t allwinner_wdt_sun4i_get_intv_value(AwWdtState *s)
276
+{
277
+ return ((s->regs[REG_MODE] & INTV_VALUE_SUN4I_MASK) >>
278
+ INTV_VALUE_SUN4I_SHIFT);
279
+}
280
+
281
+static bool allwinner_wdt_sun6i_read(AwWdtState *s, uint32_t offset)
282
+{
283
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
284
+
285
+ switch (c->regmap[offset]) {
286
+ case REG_IRQ_EN:
287
+ case REG_IRQ_STA:
288
+ case REG_CFG:
289
+ return true;
290
+ default:
291
+ break;
292
+ }
293
+ return false;
294
+}
295
+
296
+static bool allwinner_wdt_sun6i_write(AwWdtState *s, uint32_t offset,
297
+ uint32_t data)
298
+{
299
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
300
+
301
+ switch (c->regmap[offset]) {
302
+ case REG_IRQ_EN:
303
+ case REG_IRQ_STA:
304
+ case REG_CFG:
305
+ return true;
306
+ default:
307
+ break;
308
+ }
309
+ return false;
310
+}
311
+
312
+static bool allwinner_wdt_sun6i_can_reset_system(AwWdtState *s)
313
+{
314
+ if (s->regs[REG_CFG] & RST_EN_SUN6I_MASK) {
315
+ return true;
316
+ } else {
317
+ return false;
318
+ }
319
+}
320
+
321
+static bool allwinner_wdt_sun6i_is_key_valid(AwWdtState *s, uint32_t val)
322
+{
323
+ uint16_t key = (val & KEY_FIELD_SUN6I_MASK) >> KEY_FIELD_SUN6I_SHIFT;
324
+ return (key == KEY_FIELD_SUN6I);
325
+}
326
+
327
+static uint8_t allwinner_wdt_sun6i_get_intv_value(AwWdtState *s)
328
+{
329
+ return ((s->regs[REG_MODE] & INTV_VALUE_SUN6I_MASK) >>
330
+ INTV_VALUE_SUN6I_SHIFT);
331
+}
332
+
333
+static void allwinner_wdt_update_timer(AwWdtState *s)
334
+{
335
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
336
+ uint8_t count = c->get_intv_value(s);
337
+
338
+ ptimer_transaction_begin(s->timer);
339
+ ptimer_stop(s->timer);
340
+
341
+ /* Use map to convert. */
342
+ if (count < sizeof(allwinner_wdt_count_map)) {
343
+ ptimer_set_count(s->timer, allwinner_wdt_count_map[count]);
344
+ } else {
345
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: incorrect INTV_VALUE 0x%02x\n",
346
+ __func__, count);
347
+ }
348
+
349
+ ptimer_run(s->timer, 1);
350
+ ptimer_transaction_commit(s->timer);
351
+
352
+ trace_allwinner_wdt_update_timer(count);
353
+}
354
+
355
+static uint64_t allwinner_wdt_read(void *opaque, hwaddr offset,
356
+ unsigned size)
357
+{
358
+ AwWdtState *s = AW_WDT(opaque);
359
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
360
+ uint64_t r;
361
+
362
+ if (offset >= c->regmap_size) {
363
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: out-of-bounds offset 0x%04x\n",
364
+ __func__, (uint32_t)offset);
365
+ return 0;
366
+ }
367
+
368
+ switch (c->regmap[offset]) {
369
+ case REG_CTRL:
370
+ case REG_MODE:
371
+ r = s->regs[c->regmap[offset]];
372
+ break;
373
+ default:
374
+ if (!c->read(s, offset)) {
375
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented register 0x%04x\n",
376
+ __func__, (uint32_t)offset);
377
+ return 0;
378
+ }
379
+ r = s->regs[c->regmap[offset]];
380
+ break;
381
+ }
382
+
383
+ trace_allwinner_wdt_read(offset, r, size);
384
+
385
+ return r;
386
+}
387
+
388
+static void allwinner_wdt_write(void *opaque, hwaddr offset,
389
+ uint64_t val, unsigned size)
390
+{
391
+ AwWdtState *s = AW_WDT(opaque);
392
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
393
+ uint32_t old_val;
394
+
395
+ if (offset >= c->regmap_size) {
396
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: out-of-bounds offset 0x%04x\n",
397
+ __func__, (uint32_t)offset);
398
+ return;
399
+ }
400
+
401
+ trace_allwinner_wdt_write(offset, val, size);
402
+
403
+ switch (c->regmap[offset]) {
404
+ case REG_CTRL:
405
+ if (c->is_key_valid(s, val)) {
406
+ if (val & WDT_RESTART_MASK) {
407
+ /* Kick timer */
408
+ allwinner_wdt_update_timer(s);
409
+ }
410
+ }
411
+ break;
412
+ case REG_MODE:
413
+ old_val = s->regs[REG_MODE];
414
+ s->regs[REG_MODE] = (uint32_t)val;
415
+
416
+ /* Check for rising edge on WDOG_MODE_EN */
417
+ if ((s->regs[REG_MODE] & ~old_val) & WDT_EN_MASK) {
418
+ allwinner_wdt_update_timer(s);
419
+ }
420
+ break;
421
+ default:
422
+ if (!c->write(s, offset, val)) {
423
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented register 0x%04x\n",
424
+ __func__, (uint32_t)offset);
425
+ }
426
+ s->regs[c->regmap[offset]] = (uint32_t)val;
427
+ break;
428
+ }
429
+}
430
+
431
+static const MemoryRegionOps allwinner_wdt_ops = {
432
+ .read = allwinner_wdt_read,
433
+ .write = allwinner_wdt_write,
434
+ .endianness = DEVICE_NATIVE_ENDIAN,
435
+ .valid = {
436
+ .min_access_size = 4,
437
+ .max_access_size = 4,
438
+ },
439
+ .impl.min_access_size = 4,
440
+};
441
+
442
+static void allwinner_wdt_expired(void *opaque)
443
+{
444
+ AwWdtState *s = AW_WDT(opaque);
445
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
446
+
447
+ bool enabled = s->regs[REG_MODE] & WDT_EN_MASK;
448
+ bool reset_enabled = c->can_reset_system(s);
449
+
450
+ trace_allwinner_wdt_expired(enabled, reset_enabled);
451
+
452
+ /* Perform watchdog action if watchdog is enabled and can trigger reset */
453
+ if (enabled && reset_enabled) {
454
+ watchdog_perform_action();
455
+ }
456
+}
457
+
458
+static void allwinner_wdt_reset_enter(Object *obj, ResetType type)
459
+{
460
+ AwWdtState *s = AW_WDT(obj);
461
+
462
+ trace_allwinner_wdt_reset_enter();
463
+
464
+ /* Clear registers */
465
+ memset(s->regs, 0, sizeof(s->regs));
466
+}
467
+
468
+static const VMStateDescription allwinner_wdt_vmstate = {
469
+ .name = "allwinner-wdt",
470
+ .version_id = 1,
471
+ .minimum_version_id = 1,
472
+ .fields = (VMStateField[]) {
473
+ VMSTATE_PTIMER(timer, AwWdtState),
474
+ VMSTATE_UINT32_ARRAY(regs, AwWdtState, AW_WDT_REGS_NUM),
475
+ VMSTATE_END_OF_LIST()
476
+ }
477
+};
478
+
479
+static void allwinner_wdt_init(Object *obj)
480
+{
481
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
482
+ AwWdtState *s = AW_WDT(obj);
483
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
484
+
485
+ /* Memory mapping */
486
+ memory_region_init_io(&s->iomem, OBJECT(s), &allwinner_wdt_ops, s,
487
+ TYPE_AW_WDT, c->regmap_size * 4);
488
+ sysbus_init_mmio(sbd, &s->iomem);
489
+}
490
+
491
+static void allwinner_wdt_realize(DeviceState *dev, Error **errp)
492
+{
493
+ AwWdtState *s = AW_WDT(dev);
494
+
495
+ s->timer = ptimer_init(allwinner_wdt_expired, s,
496
+ PTIMER_POLICY_NO_IMMEDIATE_TRIGGER |
497
+ PTIMER_POLICY_NO_IMMEDIATE_RELOAD |
498
+ PTIMER_POLICY_NO_COUNTER_ROUND_DOWN);
499
+
500
+ ptimer_transaction_begin(s->timer);
501
+ /* Set to 2Hz (0.5s period); other periods are multiples of 0.5s. */
502
+ ptimer_set_freq(s->timer, 2);
503
+ ptimer_set_limit(s->timer, 0xff, 1);
504
+ ptimer_transaction_commit(s->timer);
505
+}
506
+
507
+static void allwinner_wdt_class_init(ObjectClass *klass, void *data)
508
+{
509
+ DeviceClass *dc = DEVICE_CLASS(klass);
510
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
511
+
512
+ rc->phases.enter = allwinner_wdt_reset_enter;
513
+ dc->realize = allwinner_wdt_realize;
514
+ dc->vmsd = &allwinner_wdt_vmstate;
515
+}
516
+
517
+static void allwinner_wdt_sun4i_class_init(ObjectClass *klass, void *data)
518
+{
519
+ AwWdtClass *awc = AW_WDT_CLASS(klass);
520
+
521
+ awc->regmap = allwinner_wdt_sun4i_regmap;
522
+ awc->regmap_size = sizeof(allwinner_wdt_sun4i_regmap);
523
+ awc->read = allwinner_wdt_sun4i_read;
524
+ awc->write = allwinner_wdt_sun4i_write;
525
+ awc->can_reset_system = allwinner_wdt_sun4i_can_reset_system;
526
+ awc->is_key_valid = allwinner_wdt_sun4i_is_key_valid;
527
+ awc->get_intv_value = allwinner_wdt_sun4i_get_intv_value;
528
+}
529
+
530
+static void allwinner_wdt_sun6i_class_init(ObjectClass *klass, void *data)
531
+{
532
+ AwWdtClass *awc = AW_WDT_CLASS(klass);
533
+
534
+ awc->regmap = allwinner_wdt_sun6i_regmap;
535
+ awc->regmap_size = sizeof(allwinner_wdt_sun6i_regmap);
536
+ awc->read = allwinner_wdt_sun6i_read;
537
+ awc->write = allwinner_wdt_sun6i_write;
538
+ awc->can_reset_system = allwinner_wdt_sun6i_can_reset_system;
539
+ awc->is_key_valid = allwinner_wdt_sun6i_is_key_valid;
540
+ awc->get_intv_value = allwinner_wdt_sun6i_get_intv_value;
541
+}
542
+
543
+static const TypeInfo allwinner_wdt_info = {
544
+ .name = TYPE_AW_WDT,
545
+ .parent = TYPE_SYS_BUS_DEVICE,
546
+ .instance_init = allwinner_wdt_init,
547
+ .instance_size = sizeof(AwWdtState),
548
+ .class_init = allwinner_wdt_class_init,
549
+ .class_size = sizeof(AwWdtClass),
550
+ .abstract = true,
551
+};
552
+
553
+static const TypeInfo allwinner_wdt_sun4i_info = {
554
+ .name = TYPE_AW_WDT_SUN4I,
555
+ .parent = TYPE_AW_WDT,
556
+ .class_init = allwinner_wdt_sun4i_class_init,
557
+};
558
+
559
+static const TypeInfo allwinner_wdt_sun6i_info = {
560
+ .name = TYPE_AW_WDT_SUN6I,
561
+ .parent = TYPE_AW_WDT,
562
+ .class_init = allwinner_wdt_sun6i_class_init,
563
+};
564
+
565
+static void allwinner_wdt_register(void)
566
+{
567
+ type_register_static(&allwinner_wdt_info);
568
+ type_register_static(&allwinner_wdt_sun4i_info);
569
+ type_register_static(&allwinner_wdt_sun6i_info);
570
+}
571
+
572
+type_init(allwinner_wdt_register)
573
diff --git a/hw/watchdog/Kconfig b/hw/watchdog/Kconfig
574
index XXXXXXX..XXXXXXX 100644
575
--- a/hw/watchdog/Kconfig
576
+++ b/hw/watchdog/Kconfig
577
@@ -XXX,XX +XXX,XX @@ config WDT_IMX2
578
579
config WDT_SBSA
580
bool
581
+
582
+config ALLWINNER_WDT
583
+ bool
584
+ select PTIMER
585
diff --git a/hw/watchdog/meson.build b/hw/watchdog/meson.build
586
index XXXXXXX..XXXXXXX 100644
587
--- a/hw/watchdog/meson.build
588
+++ b/hw/watchdog/meson.build
589
@@ -XXX,XX +XXX,XX @@
590
softmmu_ss.add(files('watchdog.c'))
591
+softmmu_ss.add(when: 'CONFIG_ALLWINNER_WDT', if_true: files('allwinner-wdt.c'))
592
softmmu_ss.add(when: 'CONFIG_CMSDK_APB_WATCHDOG', if_true: files('cmsdk-apb-watchdog.c'))
593
softmmu_ss.add(when: 'CONFIG_WDT_IB6300ESB', if_true: files('wdt_i6300esb.c'))
594
softmmu_ss.add(when: 'CONFIG_WDT_IB700', if_true: files('wdt_ib700.c'))
595
diff --git a/hw/watchdog/trace-events b/hw/watchdog/trace-events
596
index XXXXXXX..XXXXXXX 100644
597
--- a/hw/watchdog/trace-events
598
+++ b/hw/watchdog/trace-events
599
@@ -XXX,XX +XXX,XX @@
600
# See docs/devel/tracing.rst for syntax documentation.
601
602
+# allwinner-wdt.c
603
+allwinner_wdt_read(uint64_t offset, uint64_t data, unsigned size) "Allwinner watchdog read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
604
+allwinner_wdt_write(uint64_t offset, uint64_t data, unsigned size) "Allwinner watchdog write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
605
+allwinner_wdt_reset_enter(void) "Allwinner watchdog: reset"
606
+allwinner_wdt_update_timer(uint8_t count) "Allwinner watchdog: count %" PRIu8
607
+allwinner_wdt_expired(bool enabled, bool reset_enabled) "Allwinner watchdog: enabled %u reset_enabled %u"
608
+
609
# cmsdk-apb-watchdog.c
610
cmsdk_apb_watchdog_read(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB watchdog read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
611
cmsdk_apb_watchdog_write(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB watchdog write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
98
--
612
--
99
2.20.1
613
2.34.1
100
101
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
2
2
3
As for the other semihosting calls we can resolve this at translate
3
This patch adds WDT to Allwinner-A10 and Cubieboard.
4
time.
4
WDT is added as an overlay to the Timer module memory map.
5
5
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
8
Message-id: 20190913151845.12582-4-alex.bennee@linaro.org
8
Message-id: 20230326202256.22980-3-strahinja.p.jankovic@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/translate.c | 19 +++++++++++++++----
11
docs/system/arm/cubieboard.rst | 1 +
12
1 file changed, 15 insertions(+), 4 deletions(-)
12
include/hw/arm/allwinner-a10.h | 2 ++
13
hw/arm/allwinner-a10.c | 7 +++++++
14
hw/arm/Kconfig | 1 +
15
4 files changed, 11 insertions(+)
13
16
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
17
diff --git a/docs/system/arm/cubieboard.rst b/docs/system/arm/cubieboard.rst
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate.c
19
--- a/docs/system/arm/cubieboard.rst
17
+++ b/target/arm/translate.c
20
+++ b/docs/system/arm/cubieboard.rst
18
@@ -XXX,XX +XXX,XX @@ static bool trans_CBZ(DisasContext *s, arg_CBZ *a)
21
@@ -XXX,XX +XXX,XX @@ Emulated devices:
22
- USB controller
23
- SATA controller
24
- TWI (I2C) controller
25
+- Watchdog timer
26
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
27
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/arm/allwinner-a10.h
29
+++ b/include/hw/arm/allwinner-a10.h
30
@@ -XXX,XX +XXX,XX @@
31
#include "hw/misc/allwinner-a10-ccm.h"
32
#include "hw/misc/allwinner-a10-dramc.h"
33
#include "hw/i2c/allwinner-i2c.h"
34
+#include "hw/watchdog/allwinner-wdt.h"
35
#include "sysemu/block-backend.h"
36
37
#include "target/arm/cpu.h"
38
@@ -XXX,XX +XXX,XX @@ struct AwA10State {
39
AwSdHostState mmc0;
40
AWI2CState i2c0;
41
AwRtcState rtc;
42
+ AwWdtState wdt;
43
MemoryRegion sram_a;
44
EHCISysBusState ehci[AW_A10_NUM_USB];
45
OHCISysBusState ohci[AW_A10_NUM_USB];
46
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/allwinner-a10.c
49
+++ b/hw/arm/allwinner-a10.c
50
@@ -XXX,XX +XXX,XX @@
51
#define AW_A10_EHCI_BASE 0x01c14000
52
#define AW_A10_OHCI_BASE 0x01c14400
53
#define AW_A10_SATA_BASE 0x01c18000
54
+#define AW_A10_WDT_BASE 0x01c20c90
55
#define AW_A10_RTC_BASE 0x01c20d00
56
#define AW_A10_I2C0_BASE 0x01c2ac00
57
58
@@ -XXX,XX +XXX,XX @@ static void aw_a10_init(Object *obj)
59
object_initialize_child(obj, "mmc0", &s->mmc0, TYPE_AW_SDHOST_SUN4I);
60
61
object_initialize_child(obj, "rtc", &s->rtc, TYPE_AW_RTC_SUN4I);
62
+
63
+ object_initialize_child(obj, "wdt", &s->wdt, TYPE_AW_WDT_SUN4I);
19
}
64
}
20
65
21
/*
66
static void aw_a10_realize(DeviceState *dev, Error **errp)
22
- * Supervisor call
67
@@ -XXX,XX +XXX,XX @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
23
+ * Supervisor call - both T32 & A32 come here so we need to check
68
sysbus_realize(SYS_BUS_DEVICE(&s->i2c0), &error_fatal);
24
+ * which mode we are in when checking for semihosting.
69
sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c0), 0, AW_A10_I2C0_BASE);
25
*/
70
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c0), 0, qdev_get_gpio_in(dev, 7));
26
27
static bool trans_SVC(DisasContext *s, arg_SVC *a)
28
{
29
- gen_set_pc_im(s, s->base.pc_next);
30
- s->svc_imm = a->imm;
31
- s->base.is_jmp = DISAS_SWI;
32
+ const uint32_t semihost_imm = s->thumb ? 0xab : 0x123456;
33
+
71
+
34
+ if (!arm_dc_feature(s, ARM_FEATURE_M) && semihosting_enabled() &&
72
+ /* WDT */
35
+#ifndef CONFIG_USER_ONLY
73
+ sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &error_fatal);
36
+ !IS_USER(s) &&
74
+ sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->wdt), 0, AW_A10_WDT_BASE, 1);
37
+#endif
38
+ (a->imm == semihost_imm)) {
39
+ gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST);
40
+ } else {
41
+ gen_set_pc_im(s, s->base.pc_next);
42
+ s->svc_imm = a->imm;
43
+ s->base.is_jmp = DISAS_SWI;
44
+ }
45
return true;
46
}
75
}
47
76
77
static void aw_a10_class_init(ObjectClass *oc, void *data)
78
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
79
index XXXXXXX..XXXXXXX 100644
80
--- a/hw/arm/Kconfig
81
+++ b/hw/arm/Kconfig
82
@@ -XXX,XX +XXX,XX @@ config ALLWINNER_A10
83
select ALLWINNER_A10_PIC
84
select ALLWINNER_A10_CCM
85
select ALLWINNER_A10_DRAMC
86
+ select ALLWINNER_WDT
87
select ALLWINNER_EMAC
88
select ALLWINNER_I2C
89
select AXP209_PMU
48
--
90
--
49
2.20.1
91
2.34.1
50
51
diff view generated by jsdifflib
New patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
2
3
This patch adds WDT to Allwinner-H3 and Orangepi-PC.
4
WDT is added as an overlay to the Timer module memory area.
5
6
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
7
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
8
Message-id: 20230326202256.22980-4-strahinja.p.jankovic@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
docs/system/arm/orangepi.rst | 1 +
12
include/hw/arm/allwinner-h3.h | 5 ++++-
13
hw/arm/allwinner-h3.c | 8 ++++++++
14
hw/arm/Kconfig | 1 +
15
4 files changed, 14 insertions(+), 1 deletion(-)
16
17
diff --git a/docs/system/arm/orangepi.rst b/docs/system/arm/orangepi.rst
18
index XXXXXXX..XXXXXXX 100644
19
--- a/docs/system/arm/orangepi.rst
20
+++ b/docs/system/arm/orangepi.rst
21
@@ -XXX,XX +XXX,XX @@ The Orange Pi PC machine supports the following devices:
22
* System Control module
23
* Security Identifier device
24
* TWI (I2C)
25
+ * Watchdog timer
26
27
Limitations
28
"""""""""""
29
diff --git a/include/hw/arm/allwinner-h3.h b/include/hw/arm/allwinner-h3.h
30
index XXXXXXX..XXXXXXX 100644
31
--- a/include/hw/arm/allwinner-h3.h
32
+++ b/include/hw/arm/allwinner-h3.h
33
@@ -XXX,XX +XXX,XX @@
34
#include "hw/net/allwinner-sun8i-emac.h"
35
#include "hw/rtc/allwinner-rtc.h"
36
#include "hw/i2c/allwinner-i2c.h"
37
+#include "hw/watchdog/allwinner-wdt.h"
38
#include "target/arm/cpu.h"
39
#include "sysemu/block-backend.h"
40
41
@@ -XXX,XX +XXX,XX @@ enum {
42
AW_H3_DEV_RTC,
43
AW_H3_DEV_CPUCFG,
44
AW_H3_DEV_R_TWI,
45
- AW_H3_DEV_SDRAM
46
+ AW_H3_DEV_SDRAM,
47
+ AW_H3_DEV_WDT
48
};
49
50
/** Total number of CPU cores in the H3 SoC */
51
@@ -XXX,XX +XXX,XX @@ struct AwH3State {
52
AWI2CState r_twi;
53
AwSun8iEmacState emac;
54
AwRtcState rtc;
55
+ AwWdtState wdt;
56
GICState gic;
57
MemoryRegion sram_a1;
58
MemoryRegion sram_a2;
59
diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/arm/allwinner-h3.c
62
+++ b/hw/arm/allwinner-h3.c
63
@@ -XXX,XX +XXX,XX @@ const hwaddr allwinner_h3_memmap[] = {
64
[AW_H3_DEV_OHCI3] = 0x01c1d400,
65
[AW_H3_DEV_CCU] = 0x01c20000,
66
[AW_H3_DEV_PIT] = 0x01c20c00,
67
+ [AW_H3_DEV_WDT] = 0x01c20ca0,
68
[AW_H3_DEV_UART0] = 0x01c28000,
69
[AW_H3_DEV_UART1] = 0x01c28400,
70
[AW_H3_DEV_UART2] = 0x01c28800,
71
@@ -XXX,XX +XXX,XX @@ static void allwinner_h3_init(Object *obj)
72
object_initialize_child(obj, "twi1", &s->i2c1, TYPE_AW_I2C_SUN6I);
73
object_initialize_child(obj, "twi2", &s->i2c2, TYPE_AW_I2C_SUN6I);
74
object_initialize_child(obj, "r_twi", &s->r_twi, TYPE_AW_I2C_SUN6I);
75
+
76
+ object_initialize_child(obj, "wdt", &s->wdt, TYPE_AW_WDT_SUN6I);
77
}
78
79
static void allwinner_h3_realize(DeviceState *dev, Error **errp)
80
@@ -XXX,XX +XXX,XX @@ static void allwinner_h3_realize(DeviceState *dev, Error **errp)
81
sysbus_connect_irq(SYS_BUS_DEVICE(&s->r_twi), 0,
82
qdev_get_gpio_in(DEVICE(&s->gic), AW_H3_GIC_SPI_R_TWI));
83
84
+ /* WDT */
85
+ sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &error_fatal);
86
+ sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->wdt), 0,
87
+ s->memmap[AW_H3_DEV_WDT], 1);
88
+
89
/* Unimplemented devices */
90
for (i = 0; i < ARRAY_SIZE(unimplemented); i++) {
91
create_unimplemented_device(unimplemented[i].device_name,
92
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
93
index XXXXXXX..XXXXXXX 100644
94
--- a/hw/arm/Kconfig
95
+++ b/hw/arm/Kconfig
96
@@ -XXX,XX +XXX,XX @@ config ALLWINNER_H3
97
select ALLWINNER_A10_PIT
98
select ALLWINNER_SUN8I_EMAC
99
select ALLWINNER_I2C
100
+ select ALLWINNER_WDT
101
select SERIAL
102
select ARM_TIMER
103
select ARM_GIC
104
--
105
2.34.1
diff view generated by jsdifflib
New patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
2
3
Cubieboard tests end with comment "reboot not functioning; omit test".
4
Fix this so reboot is done at the end of each test.
5
6
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
7
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
8
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
9
Message-id: 20230326202256.22980-5-strahinja.p.jankovic@gmail.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
tests/avocado/boot_linux_console.py | 15 ++++++++++++---
13
1 file changed, 12 insertions(+), 3 deletions(-)
14
15
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/avocado/boot_linux_console.py
18
+++ b/tests/avocado/boot_linux_console.py
19
@@ -XXX,XX +XXX,XX @@ def test_arm_cubieboard_initrd(self):
20
'Allwinner sun4i/sun5i')
21
exec_command_and_wait_for_pattern(self, 'cat /proc/iomem',
22
'system-control@1c00000')
23
- # cubieboard's reboot is not functioning; omit reboot test.
24
+ exec_command_and_wait_for_pattern(self, 'reboot',
25
+ 'reboot: Restarting system')
26
+ # Wait for VM to shut down gracefully
27
+ self.vm.wait()
28
29
def test_arm_cubieboard_sata(self):
30
"""
31
@@ -XXX,XX +XXX,XX @@ def test_arm_cubieboard_sata(self):
32
'Allwinner sun4i/sun5i')
33
exec_command_and_wait_for_pattern(self, 'cat /proc/partitions',
34
'sda')
35
- # cubieboard's reboot is not functioning; omit reboot test.
36
+ exec_command_and_wait_for_pattern(self, 'reboot',
37
+ 'reboot: Restarting system')
38
+ # Wait for VM to shut down gracefully
39
+ self.vm.wait()
40
41
@skipUnless(os.getenv('AVOCADO_ALLOW_LARGE_STORAGE'), 'storage limited')
42
def test_arm_cubieboard_openwrt_22_03_2(self):
43
@@ -XXX,XX +XXX,XX @@ def test_arm_cubieboard_openwrt_22_03_2(self):
44
45
exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo',
46
'Allwinner sun4i/sun5i')
47
- # cubieboard's reboot is not functioning; omit reboot test.
48
+ exec_command_and_wait_for_pattern(self, 'reboot',
49
+ 'reboot: Restarting system')
50
+ # Wait for VM to shut down gracefully
51
+ self.vm.wait()
52
53
@skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout')
54
def test_arm_quanta_gsj(self):
55
--
56
2.34.1
diff view generated by jsdifflib
New patch
1
From: Axel Heider <axel.heider@hensoldt.net>
1
2
3
Fix issue reported by Coverity.
4
5
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
6
Message-id: 168070611775.20412.2883242077302841473-1@git.sr.ht
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
hw/timer/imx_epit.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
12
13
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/timer/imx_epit.c
16
+++ b/hw/timer/imx_epit.c
17
@@ -XXX,XX +XXX,XX @@ static void imx_epit_update_compare_timer(IMXEPITState *s)
18
* the compare value. Otherwise it may fire at most once in the
19
* current round.
20
*/
21
- bool is_oneshot = (limit >= s->cmp);
22
+ is_oneshot = (limit >= s->cmp);
23
if (counter >= s->cmp) {
24
/* The compare timer fires in the current round. */
25
counter -= s->cmp;
26
--
27
2.34.1
diff view generated by jsdifflib
New patch
1
From: Axel Heider <axel.heider@hensoldt.net>
1
2
3
Fix the limit check. If the limit is less than the compare value,
4
the timer can never reach this value, thus it will never fire.
5
6
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1491
7
Signed-off-by: Axel Heider <axel.heider@hensoldt.net>
8
Message-id: 168070611775.20412.2883242077302841473-2@git.sr.ht
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/timer/imx_epit.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
diff --git a/hw/timer/imx_epit.c b/hw/timer/imx_epit.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/timer/imx_epit.c
18
+++ b/hw/timer/imx_epit.c
19
@@ -XXX,XX +XXX,XX @@ static void imx_epit_update_compare_timer(IMXEPITState *s)
20
* the compare value. Otherwise it may fire at most once in the
21
* current round.
22
*/
23
- is_oneshot = (limit >= s->cmp);
24
+ is_oneshot = (limit < s->cmp);
25
if (counter >= s->cmp) {
26
/* The compare timer fires in the current round. */
27
counter -= s->cmp;
28
--
29
2.34.1
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
IEC binary prefixes ease code review: the unit is explicit.
3
Missed in commit 80485d88f9 ("target/arm: Restrict
4
v7A TCG cpus to TCG accel").
4
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
8
Message-id: 20230405100848.76145-2-philmd@linaro.org
7
Reviewed-by: Thomas Huth <thuth@redhat.com>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20190923131108.21459-1-philmd@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
hw/arm/boot.c | 10 +++++-----
11
target/arm/kvm-consts.h | 9 +++------
13
1 file changed, 5 insertions(+), 5 deletions(-)
12
target/arm/cpu_tcg.c | 2 --
13
2 files changed, 3 insertions(+), 8 deletions(-)
14
14
15
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
15
diff --git a/target/arm/kvm-consts.h b/target/arm/kvm-consts.h
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/boot.c
17
--- a/target/arm/kvm-consts.h
18
+++ b/hw/arm/boot.c
18
+++ b/target/arm/kvm-consts.h
19
@@ -XXX,XX +XXX,XX @@ int arm_load_dtb(hwaddr addr, const struct arm_boot_info *binfo,
19
@@ -XXX,XX +XXX,XX @@ MISMATCH_CHECK(QEMU_PSCI_RET_INTERNAL_FAILURE, PSCI_RET_INTERNAL_FAILURE);
20
goto fail;
20
MISMATCH_CHECK(QEMU_PSCI_RET_NOT_PRESENT, PSCI_RET_NOT_PRESENT);
21
}
21
MISMATCH_CHECK(QEMU_PSCI_RET_DISABLED, PSCI_RET_DISABLED);
22
22
23
- if (scells < 2 && binfo->ram_size >= (1ULL << 32)) {
23
-/* Note that KVM uses overlapping values for AArch32 and AArch64
24
+ if (scells < 2 && binfo->ram_size >= 4 * GiB) {
24
- * target CPU numbers. AArch32 targets:
25
/* This is user error so deserves a friendlier error message
25
+/*
26
* than the failure of setprop_sized_cells would provide
26
+ * Note that KVM uses overlapping values for AArch32 and AArch64
27
*/
27
+ * target CPU numbers. AArch64 targets:
28
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
28
*/
29
* we might still make a bad choice here.
29
-#define QEMU_KVM_ARM_TARGET_CORTEX_A15 0
30
*/
30
-#define QEMU_KVM_ARM_TARGET_CORTEX_A7 1
31
info->initrd_start = info->loader_start +
31
-
32
- MIN(info->ram_size / 2, 128 * 1024 * 1024);
32
-/* AArch64 targets: */
33
+ MIN(info->ram_size / 2, 128 * MiB);
33
#define QEMU_KVM_ARM_TARGET_AEM_V8 0
34
if (image_high_addr) {
34
#define QEMU_KVM_ARM_TARGET_FOUNDATION_V8 1
35
info->initrd_start = MAX(info->initrd_start, image_high_addr);
35
#define QEMU_KVM_ARM_TARGET_CORTEX_A57 2
36
}
36
diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
37
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
37
index XXXXXXX..XXXXXXX 100644
38
*
38
--- a/target/arm/cpu_tcg.c
39
* Let's play safe and prealign it to 2MB to give us some space.
39
+++ b/target/arm/cpu_tcg.c
40
*/
40
@@ -XXX,XX +XXX,XX @@ static void cortex_a7_initfn(Object *obj)
41
- align = 2 * 1024 * 1024;
41
set_feature(&cpu->env, ARM_FEATURE_EL2);
42
+ align = 2 * MiB;
42
set_feature(&cpu->env, ARM_FEATURE_EL3);
43
} else {
43
set_feature(&cpu->env, ARM_FEATURE_PMU);
44
/*
44
- cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A7;
45
* Some 32bit kernels will trash anything in the 4K page the
45
cpu->midr = 0x410fc075;
46
* initrd ends in, so make sure the DTB isn't caught up in that.
46
cpu->reset_fpsid = 0x41023075;
47
*/
47
cpu->isar.mvfr0 = 0x10110222;
48
- align = 4096;
48
@@ -XXX,XX +XXX,XX @@ static void cortex_a15_initfn(Object *obj)
49
+ align = 4 * KiB;
49
set_feature(&cpu->env, ARM_FEATURE_EL2);
50
}
50
set_feature(&cpu->env, ARM_FEATURE_EL3);
51
51
set_feature(&cpu->env, ARM_FEATURE_PMU);
52
/* Place the DTB after the initrd in memory with alignment. */
52
- cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A15;
53
@@ -XXX,XX +XXX,XX @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
53
/* r4p0 cpu, not requiring expensive tlb flush errata */
54
info->loader_start + KERNEL_ARGS_ADDR;
54
cpu->midr = 0x414fc0f0;
55
fixupcontext[FIXUP_ARGPTR_HI] =
55
cpu->revidr = 0x0;
56
(info->loader_start + KERNEL_ARGS_ADDR) >> 32;
57
- if (info->ram_size >= (1ULL << 32)) {
58
+ if (info->ram_size >= 4 * GiB) {
59
error_report("RAM size must be less than 4GB to boot"
60
" Linux kernel using ATAGS (try passing a device tree"
61
" using -dtb)");
62
--
56
--
63
2.20.1
57
2.34.1
64
58
65
59
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
These were missed in the recent de-tangling so have been updated to be
3
The Cortex-A7 core is only available when TCG is enabled (see
4
more actuate. I've also built up ARM_TESTS in a manner similar to
4
commit 80485d88f9 "target/arm: Restrict v7A TCG cpus to TCG accel").
5
AARCH64_TESTS for better consistency.
6
5
7
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20190913151845.12582-2-alex.bennee@linaro.org
8
Message-id: 20230405100848.76145-3-philmd@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
tests/tcg/Makefile.target | 7 +++++--
11
hw/arm/virt.c | 2 ++
13
tests/tcg/aarch64/Makefile.target | 3 ++-
12
1 file changed, 2 insertions(+)
14
tests/tcg/arm/Makefile.target | 15 ++++++++-------
15
3 files changed, 15 insertions(+), 10 deletions(-)
16
13
17
diff --git a/tests/tcg/Makefile.target b/tests/tcg/Makefile.target
14
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/tests/tcg/Makefile.target
16
--- a/hw/arm/virt.c
20
+++ b/tests/tcg/Makefile.target
17
+++ b/hw/arm/virt.c
21
@@ -XXX,XX +XXX,XX @@ TIMEOUT=15
18
@@ -XXX,XX +XXX,XX @@ static const int a15irqmap[] = {
22
endif
19
};
23
20
24
ifdef CONFIG_USER_ONLY
21
static const char *valid_cpus[] = {
25
-# The order we include is important. We include multiarch, base arch
22
+#ifdef CONFIG_TCG
26
-# and finally arch if it's not the same as base arch.
23
ARM_CPU_TYPE_NAME("cortex-a7"),
27
+# The order we include is important. We include multiarch first and
24
+#endif
28
+# then the target. If there are common tests shared between
25
ARM_CPU_TYPE_NAME("cortex-a15"),
29
+# sub-targets (e.g. ARM & AArch64) then it is up to
26
ARM_CPU_TYPE_NAME("cortex-a35"),
30
+# $(TARGET_NAME)/Makefile.target to include the common parent
27
ARM_CPU_TYPE_NAME("cortex-a53"),
31
+# architecture in its VPATH.
32
-include $(SRC_PATH)/tests/tcg/multiarch/Makefile.target
33
-include $(SRC_PATH)/tests/tcg/$(TARGET_NAME)/Makefile.target
34
35
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
36
index XXXXXXX..XXXXXXX 100644
37
--- a/tests/tcg/aarch64/Makefile.target
38
+++ b/tests/tcg/aarch64/Makefile.target
39
@@ -XXX,XX +XXX,XX @@ VPATH         += $(ARM_SRC)
40
AARCH64_SRC=$(SRC_PATH)/tests/tcg/aarch64
41
VPATH         += $(AARCH64_SRC)
42
43
-# we don't build any other ARM test
44
+# Float-convert Tests
45
AARCH64_TESTS=fcvt
46
47
fcvt: LDFLAGS+=-lm
48
@@ -XXX,XX +XXX,XX @@ run-fcvt: fcvt
49
    $(call run-test,$<,$(QEMU) $<, "$< on $(TARGET_NAME)")
50
    $(call diff-out,$<,$(AARCH64_SRC)/fcvt.ref)
51
52
+# Pauth Tests
53
AARCH64_TESTS += pauth-1 pauth-2
54
run-pauth-%: QEMU_OPTS += -cpu max
55
56
diff --git a/tests/tcg/arm/Makefile.target b/tests/tcg/arm/Makefile.target
57
index XXXXXXX..XXXXXXX 100644
58
--- a/tests/tcg/arm/Makefile.target
59
+++ b/tests/tcg/arm/Makefile.target
60
@@ -XXX,XX +XXX,XX @@ ARM_SRC=$(SRC_PATH)/tests/tcg/arm
61
# Set search path for all sources
62
VPATH         += $(ARM_SRC)
63
64
-ARM_TESTS=hello-arm test-arm-iwmmxt
65
-
66
-TESTS += $(ARM_TESTS) fcvt
67
-
68
+# Basic Hello World
69
+ARM_TESTS = hello-arm
70
hello-arm: CFLAGS+=-marm -ffreestanding
71
hello-arm: LDFLAGS+=-nostdlib
72
73
+# IWMXT floating point extensions
74
+ARM_TESTS += test-arm-iwmmxt
75
test-arm-iwmmxt: CFLAGS+=-marm -march=iwmmxt -mabi=aapcs -mfpu=fpv4-sp-d16
76
test-arm-iwmmxt: test-arm-iwmmxt.S
77
    $(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)
78
79
-ifeq ($(TARGET_NAME), arm)
80
+# Float-convert Tests
81
+ARM_TESTS += fcvt
82
fcvt: LDFLAGS+=-lm
83
# fcvt: CFLAGS+=-march=armv8.2-a+fp16 -mfpu=neon-fp-armv8
84
-
85
run-fcvt: fcvt
86
    $(call run-test,fcvt,$(QEMU) $<,"$< on $(TARGET_NAME)")
87
    $(call diff-out,fcvt,$(ARM_SRC)/fcvt.ref)
88
-endif
89
+
90
+TESTS += $(ARM_TESTS)
91
92
# On ARM Linux only supports 4k pages
93
EXTRA_RUNS+=run-test-mmap-4096
94
--
28
--
95
2.20.1
29
2.34.1
96
30
97
31
diff view generated by jsdifflib
1
From: Luc Michel <luc.michel@greensocs.com>
1
From: Akihiko Odaki <akihiko.odaki@daynix.com>
2
2
3
For AArch64 CPUs with a CBAR register, we have two views for it:
3
kvm_arm_init_debug() used to be called several times on a SMP system as
4
- in AArch64 state, the CBAR_EL1 register (S3_1_C15_C3_0), returns the
4
kvm_arch_init_vcpu() calls it. Move the call to kvm_arch_init() to make
5
full 64 bits CBAR value
5
sure it will be called only once; otherwise it will overwrite pointers
6
- in AArch32 state, the CBAR register (cp15, opc1=1, CRn=15, CRm=3, opc2=0)
6
to memory allocated with the previous call and leak it.
7
returns a 32 bits view such that:
8
CBAR = CBAR_EL1[31:18] 0..0 CBAR_EL1[43:32]
9
7
10
This commit fixes the current implementation where:
8
Fixes: e4482ab7e3 ("target-arm: kvm - add support for HW assisted debug")
11
- CBAR_EL1 was returning the 32 bits view instead of the full 64 bits
9
Suggested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
12
value,
10
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
13
- CBAR was returning a truncated 32 bits version of the full 64 bits
11
Message-id: 20230405153644.25300-1-akihiko.odaki@daynix.com
14
one, instead of the 32 bits view
15
- CBAR was declared as cp15, opc1=4, CRn=15, CRm=0, opc2=0, which is
16
the CBAR register found in the ARMv7 Cortex-Ax CPUs, but not in
17
ARMv8 CPUs.
18
19
Signed-off-by: Luc Michel <luc.michel@greensocs.com>
20
Message-id: 20190912110103.1417887-1-luc.michel@greensocs.com
21
[PMM: Added a comment about the two different kinds of CBAR]
22
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
14
---
25
target/arm/helper.c | 19 ++++++++++++++++---
15
target/arm/kvm_arm.h | 8 ++++++++
26
1 file changed, 16 insertions(+), 3 deletions(-)
16
target/arm/kvm.c | 2 ++
17
target/arm/kvm64.c | 18 ++++--------------
18
3 files changed, 14 insertions(+), 14 deletions(-)
27
19
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
20
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
29
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/helper.c
22
--- a/target/arm/kvm_arm.h
31
+++ b/target/arm/helper.c
23
+++ b/target/arm/kvm_arm.h
32
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
24
@@ -XXX,XX +XXX,XX @@
25
#define KVM_ARM_VGIC_V2 (1 << 0)
26
#define KVM_ARM_VGIC_V3 (1 << 1)
27
28
+/**
29
+ * kvm_arm_init_debug() - initialize guest debug capabilities
30
+ * @s: KVMState
31
+ *
32
+ * Should be called only once before using guest debug capabilities.
33
+ */
34
+void kvm_arm_init_debug(KVMState *s);
35
+
36
/**
37
* kvm_arm_vcpu_init:
38
* @cs: CPUState
39
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/kvm.c
42
+++ b/target/arm/kvm.c
43
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init(MachineState *ms, KVMState *s)
44
}
33
}
45
}
34
46
35
if (arm_feature(env, ARM_FEATURE_CBAR)) {
47
+ kvm_arm_init_debug(s);
36
+ /*
48
+
37
+ * CBAR is IMPDEF, but common on Arm Cortex-A implementations.
49
return ret;
38
+ * There are two flavours:
50
}
39
+ * (1) older 32-bit only cores have a simple 32-bit CBAR
51
40
+ * (2) 64-bit cores have a 64-bit CBAR visible to AArch64, plus a
52
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
41
+ * 32-bit register visible to AArch32 at a different encoding
53
index XXXXXXX..XXXXXXX 100644
42
+ * to the "flavour 1" register and with the bits rearranged to
54
--- a/target/arm/kvm64.c
43
+ * be able to squash a 64-bit address into the 32-bit view.
55
+++ b/target/arm/kvm64.c
44
+ * We distinguish the two via the ARM_FEATURE_AARCH64 flag, but
56
@@ -XXX,XX +XXX,XX @@ GArray *hw_breakpoints, *hw_watchpoints;
45
+ * in future if we support AArch32-only configs of some of the
57
#define get_hw_bp(i) (&g_array_index(hw_breakpoints, HWBreakpoint, i))
46
+ * AArch64 cores we might need to add a specific feature flag
58
#define get_hw_wp(i) (&g_array_index(hw_watchpoints, HWWatchpoint, i))
47
+ * to indicate cores with "flavour 2" CBAR.
59
48
+ */
60
-/**
49
if (arm_feature(env, ARM_FEATURE_AARCH64)) {
61
- * kvm_arm_init_debug() - check for guest debug capabilities
50
/* 32 bit view is [31:18] 0...0 [43:32]. */
62
- * @cs: CPUState
51
uint32_t cbar32 = (extract64(cpu->reset_cbar, 18, 14) << 18)
63
- *
52
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
64
- * kvm_check_extension returns the number of debug registers we have
53
ARMCPRegInfo cbar_reginfo[] = {
65
- * or 0 if we have none.
54
{ .name = "CBAR",
66
- *
55
.type = ARM_CP_CONST,
67
- */
56
- .cp = 15, .crn = 15, .crm = 0, .opc1 = 4, .opc2 = 0,
68
-static void kvm_arm_init_debug(CPUState *cs)
57
- .access = PL1_R, .resetvalue = cpu->reset_cbar },
69
+void kvm_arm_init_debug(KVMState *s)
58
+ .cp = 15, .crn = 15, .crm = 3, .opc1 = 1, .opc2 = 0,
70
{
59
+ .access = PL1_R, .resetvalue = cbar32 },
71
- have_guest_debug = kvm_check_extension(cs->kvm_state,
60
{ .name = "CBAR_EL1", .state = ARM_CP_STATE_AA64,
72
+ have_guest_debug = kvm_check_extension(s,
61
.type = ARM_CP_CONST,
73
KVM_CAP_SET_GUEST_DEBUG);
62
.opc0 = 3, .opc1 = 1, .crn = 15, .crm = 3, .opc2 = 0,
74
63
- .access = PL1_R, .resetvalue = cbar32 },
75
- max_hw_wps = kvm_check_extension(cs->kvm_state, KVM_CAP_GUEST_DEBUG_HW_WPS);
64
+ .access = PL1_R, .resetvalue = cpu->reset_cbar },
76
+ max_hw_wps = kvm_check_extension(s, KVM_CAP_GUEST_DEBUG_HW_WPS);
65
REGINFO_SENTINEL
77
hw_watchpoints = g_array_sized_new(true, true,
66
};
78
sizeof(HWWatchpoint), max_hw_wps);
67
/* We don't implement a r/w 64 bit CBAR currently */
79
80
- max_hw_bps = kvm_check_extension(cs->kvm_state, KVM_CAP_GUEST_DEBUG_HW_BPS);
81
+ max_hw_bps = kvm_check_extension(s, KVM_CAP_GUEST_DEBUG_HW_BPS);
82
hw_breakpoints = g_array_sized_new(true, true,
83
sizeof(HWBreakpoint), max_hw_bps);
84
return;
85
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init_vcpu(CPUState *cs)
86
}
87
cpu->mp_affinity = mpidr & ARM64_AFFINITY_MASK;
88
89
- kvm_arm_init_debug(cs);
90
-
91
/* Check whether user space can specify guest syndrome value */
92
kvm_arm_init_serror_injection(cs);
93
68
--
94
--
69
2.20.1
95
2.34.1
70
96
71
97
diff view generated by jsdifflib
1
If we're booting a Linux kernel directly into Non-Secure
1
We already pass merge_syn_data_abort() two fields from the
2
state on a CPU which has Secure state, then make sure we
2
ARMMMUFaultInfo struct, and we're about to want to use a third field.
3
set the NSACR CP11 and CP10 bits, so that Non-Secure is allowed
3
Refactor to just pass a pointer to the fault info.
4
to access the FPU. Otherwise an AArch32 kernel will UNDEF as
5
soon as it tries to use the FPU.
6
4
7
It used to not matter that we didn't do this until commit
8
fc1120a7f5f2d4b6, where we implemented actually honouring
9
these NSACR bits.
10
11
The problem only exists for CPUs where EL3 is AArch32; the
12
equivalent AArch64 trap bits are in CPTR_EL3 and are "0 to
13
not trap, 1 to trap", so the reset value of the register
14
permits NS access, unlike NSACR.
15
16
Fixes: fc1120a7f5
17
Fixes: https://bugs.launchpad.net/qemu/+bug/1844597
18
Cc: qemu-stable@nongnu.org
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
Message-id: 20190920174039.3916-1-peter.maydell@linaro.org
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Message-id: 20230331145045.2584941-2-peter.maydell@linaro.org
22
---
9
---
23
hw/arm/boot.c | 2 ++
10
target/arm/tcg/tlb_helper.c | 15 +++++++--------
24
1 file changed, 2 insertions(+)
11
1 file changed, 7 insertions(+), 8 deletions(-)
25
12
26
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
13
diff --git a/target/arm/tcg/tlb_helper.c b/target/arm/tcg/tlb_helper.c
27
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/arm/boot.c
15
--- a/target/arm/tcg/tlb_helper.c
29
+++ b/hw/arm/boot.c
16
+++ b/target/arm/tcg/tlb_helper.c
30
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
17
@@ -XXX,XX +XXX,XX @@ bool arm_s1_regime_using_lpae_format(CPUARMState *env, ARMMMUIdx mmu_idx)
31
(cs != first_cpu || !info->secure_board_setup)) {
18
}
32
/* Linux expects non-secure state */
19
33
env->cp15.scr_el3 |= SCR_NS;
20
static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
34
+ /* Set NSACR.{CP11,CP10} so NS can access the FPU */
21
+ ARMMMUFaultInfo *fi,
35
+ env->cp15.nsacr |= 3 << 10;
22
unsigned int target_el,
36
}
23
- bool same_el, bool ea,
37
}
24
- bool s1ptw, bool is_write,
38
25
+ bool same_el, bool is_write,
26
int fsc)
27
{
28
uint32_t syn;
29
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
30
* ISS encoding for an exception from a Data Abort, the
31
* ISV field.
32
*/
33
- if (!(template_syn & ARM_EL_ISV) || target_el != 2 || s1ptw) {
34
+ if (!(template_syn & ARM_EL_ISV) || target_el != 2 || fi->s1ptw) {
35
syn = syn_data_abort_no_iss(same_el, 0,
36
- ea, 0, s1ptw, is_write, fsc);
37
+ fi->ea, 0, fi->s1ptw, is_write, fsc);
38
} else {
39
/*
40
* Fields: IL, ISV, SAS, SSE, SRT, SF and AR come from the template
41
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
42
*/
43
syn = syn_data_abort_with_iss(same_el,
44
0, 0, 0, 0, 0,
45
- ea, 0, s1ptw, is_write, fsc,
46
+ fi->ea, 0, fi->s1ptw, is_write, fsc,
47
true);
48
/* Merge the runtime syndrome with the template syndrome. */
49
syn |= template_syn;
50
@@ -XXX,XX +XXX,XX @@ void arm_deliver_fault(ARMCPU *cpu, vaddr addr,
51
syn = syn_insn_abort(same_el, fi->ea, fi->s1ptw, fsc);
52
exc = EXCP_PREFETCH_ABORT;
53
} else {
54
- syn = merge_syn_data_abort(env->exception.syndrome, target_el,
55
- same_el, fi->ea, fi->s1ptw,
56
- access_type == MMU_DATA_STORE,
57
+ syn = merge_syn_data_abort(env->exception.syndrome, fi, target_el,
58
+ same_el, access_type == MMU_DATA_STORE,
59
fsc);
60
if (access_type == MMU_DATA_STORE
61
&& arm_feature(env, ARM_FEATURE_V6)) {
39
--
62
--
40
2.20.1
63
2.34.1
41
64
42
65
diff view generated by jsdifflib
New patch
1
The syndrome value reported to ESR_EL2 should only contain the
2
detailed instruction syndrome information when the fault has been
3
caused by a stage 2 abort, not when the fault was a stage 1 abort
4
(i.e. caused by execution at EL2). We were getting this wrong and
5
reporting the detailed ISV information all the time.
1
6
7
Fix the bug by checking fi->stage2. Add a TODO comment noting the
8
cases where we'll have to come back and revisit this when we
9
implement FEAT_LS64 and friends.
10
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20230331145045.2584941-3-peter.maydell@linaro.org
14
---
15
target/arm/tcg/tlb_helper.c | 13 ++++++++++---
16
1 file changed, 10 insertions(+), 3 deletions(-)
17
18
diff --git a/target/arm/tcg/tlb_helper.c b/target/arm/tcg/tlb_helper.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/tcg/tlb_helper.c
21
+++ b/target/arm/tcg/tlb_helper.c
22
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
23
uint32_t syn;
24
25
/*
26
- * ISV is only set for data aborts routed to EL2 and
27
- * never for stage-1 page table walks faulting on stage 2.
28
+ * ISV is only set for stage-2 data aborts routed to EL2 and
29
+ * never for stage-1 page table walks faulting on stage 2
30
+ * or for stage-1 faults.
31
*
32
* Furthermore, ISV is only set for certain kinds of load/stores.
33
* If the template syndrome does not have ISV set, we should leave
34
@@ -XXX,XX +XXX,XX @@ static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
35
* See ARMv8 specs, D7-1974:
36
* ISS encoding for an exception from a Data Abort, the
37
* ISV field.
38
+ *
39
+ * TODO: FEAT_LS64/FEAT_LS64_V/FEAT_SL64_ACCDATA: Translation,
40
+ * Access Flag, and Permission faults caused by LD64B, ST64B,
41
+ * ST64BV, or ST64BV0 insns report syndrome info even for stage-1
42
+ * faults and regardless of the target EL.
43
*/
44
- if (!(template_syn & ARM_EL_ISV) || target_el != 2 || fi->s1ptw) {
45
+ if (!(template_syn & ARM_EL_ISV) || target_el != 2
46
+ || fi->s1ptw || !fi->stage2) {
47
syn = syn_data_abort_no_iss(same_el, 0,
48
fi->ea, 0, fi->s1ptw, is_write, fsc);
49
} else {
50
--
51
2.34.1
diff view generated by jsdifflib
New patch
1
FEAT_PAN3 adds an EPAN bit to SCTLR_EL1 and SCTLR_EL2, which allows
2
the PAN bit to make memory non-privileged-read/write if it is
3
user-executable as well as if it is user-read/write.
1
4
5
Implement this feature and enable it in the AArch64 'max' CPU.
6
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230331145045.2584941-4-peter.maydell@linaro.org
10
---
11
docs/system/arm/emulation.rst | 1 +
12
target/arm/cpu.h | 5 +++++
13
target/arm/cpu64.c | 2 +-
14
target/arm/ptw.c | 14 +++++++++++++-
15
4 files changed, 20 insertions(+), 2 deletions(-)
16
17
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
18
index XXXXXXX..XXXXXXX 100644
19
--- a/docs/system/arm/emulation.rst
20
+++ b/docs/system/arm/emulation.rst
21
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
22
- FEAT_MTE3 (MTE Asymmetric Fault Handling)
23
- FEAT_PAN (Privileged access never)
24
- FEAT_PAN2 (AT S1E1R and AT S1E1W instruction variants affected by PSTATE.PAN)
25
+- FEAT_PAN3 (Support for SCTLR_ELx.EPAN)
26
- FEAT_PAuth (Pointer authentication)
27
- FEAT_PMULL (PMULL, PMULL2 instructions)
28
- FEAT_PMUv3p1 (PMU Extensions v3.1)
29
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/cpu.h
32
+++ b/target/arm/cpu.h
33
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_ats1e1(const ARMISARegisters *id)
34
return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 2;
35
}
36
37
+static inline bool isar_feature_aa64_pan3(const ARMISARegisters *id)
38
+{
39
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 3;
40
+}
41
+
42
static inline bool isar_feature_aa64_hcx(const ARMISARegisters *id)
43
{
44
return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, HCX) != 0;
45
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/arm/cpu64.c
48
+++ b/target/arm/cpu64.c
49
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
50
t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1); /* FEAT_VHE */
51
t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1); /* FEAT_HPDS */
52
t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1); /* FEAT_LOR */
53
- t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 2); /* FEAT_PAN2 */
54
+ t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 3); /* FEAT_PAN3 */
55
t = FIELD_DP64(t, ID_AA64MMFR1, XNX, 1); /* FEAT_XNX */
56
t = FIELD_DP64(t, ID_AA64MMFR1, ETS, 1); /* FEAT_ETS */
57
t = FIELD_DP64(t, ID_AA64MMFR1, HCX, 1); /* FEAT_HCX */
58
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
59
index XXXXXXX..XXXXXXX 100644
60
--- a/target/arm/ptw.c
61
+++ b/target/arm/ptw.c
62
@@ -XXX,XX +XXX,XX @@ static int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0)
63
static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
64
int ap, int ns, int xn, int pxn)
65
{
66
+ ARMCPU *cpu = env_archcpu(env);
67
bool is_user = regime_is_user(env, mmu_idx);
68
int prot_rw, user_rw;
69
bool have_wxn;
70
@@ -XXX,XX +XXX,XX @@ static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
71
if (is_user) {
72
prot_rw = user_rw;
73
} else {
74
+ /*
75
+ * PAN controls can forbid data accesses but don't affect insn fetch.
76
+ * Plain PAN forbids data accesses if EL0 has data permissions;
77
+ * PAN3 forbids data accesses if EL0 has either data or exec perms.
78
+ * Note that for AArch64 the 'user can exec' case is exactly !xn.
79
+ * We make the IMPDEF choices that SCR_EL3.SIF and Realm EL2&0
80
+ * do not affect EPAN.
81
+ */
82
if (user_rw && regime_is_pan(env, mmu_idx)) {
83
- /* PAN forbids data accesses but doesn't affect insn fetch */
84
+ prot_rw = 0;
85
+ } else if (cpu_isar_feature(aa64_pan3, cpu) && is_aa64 &&
86
+ regime_is_pan(env, mmu_idx) &&
87
+ (regime_sctlr(env, mmu_idx) & SCTLR_EPAN) && !xn) {
88
prot_rw = 0;
89
} else {
90
prot_rw = simple_ap_to_rw_prot_is_user(ap, false);
91
--
92
2.34.1
diff view generated by jsdifflib
New patch
1
In rST markup syntax, the inline markup (*italics*, **bold** and
2
``monospaced``) must be separated from the surrending text by
3
non-word characters, otherwise it is not interpreted as markup.
4
To force interpretation as markup in the middle of a word,
5
you need to use a backslash-escaped space (which will not
6
appear as a space in the output).
1
7
8
Fix a missing backslash-space in this file, which meant that the ``
9
after "select" was output literally and the monospacing was
10
incorrectly extended all the way to the end of the next monospaced
11
word.
12
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
15
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
16
Message-id: 20230411105424.3994585-1-peter.maydell@linaro.org
17
---
18
docs/devel/kconfig.rst | 2 +-
19
1 file changed, 1 insertion(+), 1 deletion(-)
20
21
diff --git a/docs/devel/kconfig.rst b/docs/devel/kconfig.rst
22
index XXXXXXX..XXXXXXX 100644
23
--- a/docs/devel/kconfig.rst
24
+++ b/docs/devel/kconfig.rst
25
@@ -XXX,XX +XXX,XX @@ or commenting out lines in the second group.
26
27
It is also possible to run QEMU's configure script with the
28
``--without-default-devices`` option. When this is done, everything defaults
29
-to ``n`` unless it is ``select``ed or explicitly switched on in the
30
+to ``n`` unless it is ``select``\ ed or explicitly switched on in the
31
``.mak`` files. In other words, ``default`` and ``imply`` directives
32
are disabled. When QEMU is built with this option, the user will probably
33
want to change some lines in the first group, for example like this::
34
--
35
2.34.1
36
37
diff view generated by jsdifflib
New patch
1
So that we can avoid the "older gdb crashes" problem described in
2
commit 5787d17a42f7af4 and which caused us to disable reporting pauth
3
information via the gdbstub, newer gdb is going to implement support
4
for recognizing the pauth information via a new feature name:
5
org.gnu.gdb.aarch64.pauth_v2
1
6
7
Older gdb won't recognize this feature name, so we can re-enable the
8
pauth support under the new name without risking them crashing.
9
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20230406150827.3322670-1-peter.maydell@linaro.org
13
---
14
target/arm/gdbstub.c | 9 ++++-----
15
gdb-xml/aarch64-pauth.xml | 2 +-
16
2 files changed, 5 insertions(+), 6 deletions(-)
17
18
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/gdbstub.c
21
+++ b/target/arm/gdbstub.c
22
@@ -XXX,XX +XXX,XX @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
23
aarch64_gdb_set_fpu_reg,
24
34, "aarch64-fpu.xml", 0);
25
}
26
-#if 0
27
/*
28
- * GDB versions 9 through 12 have a bug which means they will
29
- * crash if they see this XML from QEMU; disable it for the 8.0
30
- * release, pending a better solution.
31
+ * Note that we report pauth information via the feature name
32
+ * org.gnu.gdb.aarch64.pauth_v2, not org.gnu.gdb.aarch64.pauth.
33
+ * GDB versions 9 through 12 have a bug where they will crash
34
+ * if they see the latter XML from QEMU.
35
*/
36
if (isar_feature_aa64_pauth(&cpu->isar)) {
37
gdb_register_coprocessor(cs, aarch64_gdb_get_pauth_reg,
38
aarch64_gdb_set_pauth_reg,
39
4, "aarch64-pauth.xml", 0);
40
}
41
-#endif
42
#endif
43
} else {
44
if (arm_feature(env, ARM_FEATURE_NEON)) {
45
diff --git a/gdb-xml/aarch64-pauth.xml b/gdb-xml/aarch64-pauth.xml
46
index XXXXXXX..XXXXXXX 100644
47
--- a/gdb-xml/aarch64-pauth.xml
48
+++ b/gdb-xml/aarch64-pauth.xml
49
@@ -XXX,XX +XXX,XX @@
50
notice and this notice are preserved. -->
51
52
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
53
-<feature name="org.gnu.gdb.aarch64.pauth">
54
+<feature name="org.gnu.gdb.aarch64.pauth_v2">
55
<reg name="pauth_dmask" bitsize="64"/>
56
<reg name="pauth_cmask" bitsize="64"/>
57
<reg name="pauth_dmask_high" bitsize="64"/>
58
--
59
2.34.1
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Guenter Roeck <linux@roeck-us.net>
2
2
3
Now we do all our checking and use a common EXCP_SEMIHOST for
3
The SOC on i.MX6UL and i.MX7 has 2 Ethernet interfaces. The PHY on each may
4
semihosting operations we can make helper code a lot simpler.
4
be connected to separate MDIO busses, or both may be connected on the same
5
MDIO bus using different PHY addresses. Commit 461c51ad4275 ("Add a phy-num
6
property to the i.MX FEC emulator") added support for specifying PHY
7
addresses, but it did not provide support for linking the second PHY on
8
a given MDIO bus to the other Ethernet interface.
5
9
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
10
To be able to support two PHY instances on a single MDIO bus, two properties
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
are needed: First, there needs to be a flag indicating if the MDIO bus on
8
Message-id: 20190913151845.12582-5-alex.bennee@linaro.org
12
a given Ethernet interface is connected. If not, attempts to read from this
13
bus must always return 0xffff. Implement this property as phy-connected.
14
Second, if the MDIO bus on an interface is active, it needs a link to the
15
consumer interface to be able to provide PHY access for it. Implement this
16
property as phy-consumer.
17
18
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
19
Message-id: 20230315145248.1639364-2-linux@roeck-us.net
20
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
22
---
11
target/arm/helper.c | 96 +++++++++++----------------------------------
23
include/hw/net/imx_fec.h | 2 ++
12
1 file changed, 22 insertions(+), 74 deletions(-)
24
hw/net/imx_fec.c | 27 +++++++++++++++++++++++----
25
2 files changed, 25 insertions(+), 4 deletions(-)
13
26
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
27
diff --git a/include/hw/net/imx_fec.h b/include/hw/net/imx_fec.h
15
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.c
29
--- a/include/hw/net/imx_fec.h
17
+++ b/target/arm/helper.c
30
+++ b/include/hw/net/imx_fec.h
18
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
31
@@ -XXX,XX +XXX,XX @@ struct IMXFECState {
19
new_el, env->pc, pstate_read(env));
32
uint32_t phy_int;
20
}
33
uint32_t phy_int_mask;
21
34
uint32_t phy_num;
22
-static inline bool check_for_semihosting(CPUState *cs)
35
+ bool phy_connected;
23
-{
36
+ struct IMXFECState *phy_consumer;
24
+/*
37
25
+ * Do semihosting call and set the appropriate return value. All the
38
bool is_fec;
26
+ * permission and validity checks have been done at translate time.
39
27
+ *
40
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
28
+ * We only see semihosting exceptions in TCG only as they are not
41
index XXXXXXX..XXXXXXX 100644
29
+ * trapped to the hypervisor in KVM.
42
--- a/hw/net/imx_fec.c
30
+ */
43
+++ b/hw/net/imx_fec.c
31
#ifdef CONFIG_TCG
44
@@ -XXX,XX +XXX,XX @@ static uint32_t imx_phy_read(IMXFECState *s, int reg)
32
- /* Check whether this exception is a semihosting call; if so
45
uint32_t val;
33
- * then handle it and return true; otherwise return false.
46
uint32_t phy = reg / 32;
34
- */
47
35
+static void handle_semihosting(CPUState *cs)
48
- if (phy != s->phy_num) {
36
+{
49
- trace_imx_phy_read_num(phy, s->phy_num);
37
ARMCPU *cpu = ARM_CPU(cs);
50
+ if (!s->phy_connected) {
38
CPUARMState *env = &cpu->env;
51
return 0xffff;
39
40
if (is_a64(env)) {
41
- if (cs->exception_index == EXCP_SEMIHOST) {
42
- /* This is always the 64-bit semihosting exception.
43
- * The "is this usermode" and "is semihosting enabled"
44
- * checks have been done at translate time.
45
- */
46
- qemu_log_mask(CPU_LOG_INT,
47
- "...handling as semihosting call 0x%" PRIx64 "\n",
48
- env->xregs[0]);
49
- env->xregs[0] = do_arm_semihosting(env);
50
- return true;
51
- }
52
- return false;
53
+ qemu_log_mask(CPU_LOG_INT,
54
+ "...handling as semihosting call 0x%" PRIx64 "\n",
55
+ env->xregs[0]);
56
+ env->xregs[0] = do_arm_semihosting(env);
57
} else {
58
- uint32_t imm;
59
-
60
- /* Only intercept calls from privileged modes, to provide some
61
- * semblance of security.
62
- */
63
- if (cs->exception_index != EXCP_SEMIHOST &&
64
- (!semihosting_enabled() ||
65
- ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR))) {
66
- return false;
67
- }
68
-
69
- switch (cs->exception_index) {
70
- case EXCP_SEMIHOST:
71
- /* This is always a semihosting call; the "is this usermode"
72
- * and "is semihosting enabled" checks have been done at
73
- * translate time.
74
- */
75
- break;
76
- case EXCP_SWI:
77
- /* Check for semihosting interrupt. */
78
- if (env->thumb) {
79
- imm = arm_lduw_code(env, env->regs[15] - 2, arm_sctlr_b(env))
80
- & 0xff;
81
- if (imm == 0xab) {
82
- break;
83
- }
84
- } else {
85
- imm = arm_ldl_code(env, env->regs[15] - 4, arm_sctlr_b(env))
86
- & 0xffffff;
87
- if (imm == 0x123456) {
88
- break;
89
- }
90
- }
91
- return false;
92
- case EXCP_BKPT:
93
- /* See if this is a semihosting syscall. */
94
- if (env->thumb) {
95
- imm = arm_lduw_code(env, env->regs[15], arm_sctlr_b(env))
96
- & 0xff;
97
- if (imm == 0xab) {
98
- env->regs[15] += 2;
99
- break;
100
- }
101
- }
102
- return false;
103
- default:
104
- return false;
105
- }
106
-
107
qemu_log_mask(CPU_LOG_INT,
108
"...handling as semihosting call 0x%x\n",
109
env->regs[0]);
110
env->regs[0] = do_arm_semihosting(env);
111
- return true;
112
}
52
}
113
-#else
53
114
- return false;
54
+ if (phy != s->phy_num) {
115
-#endif
55
+ if (s->phy_consumer && phy == s->phy_consumer->phy_num) {
116
}
56
+ s = s->phy_consumer;
117
+#endif
57
+ } else {
118
58
+ trace_imx_phy_read_num(phy, s->phy_num);
119
/* Handle a CPU exception for A and R profile CPUs.
59
+ return 0xffff;
120
* Do any appropriate logging, handle PSCI calls, and then hand off
60
+ }
121
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_interrupt(CPUState *cs)
61
+ }
62
+
63
reg %= 32;
64
65
switch (reg) {
66
@@ -XXX,XX +XXX,XX @@ static void imx_phy_write(IMXFECState *s, int reg, uint32_t val)
67
{
68
uint32_t phy = reg / 32;
69
70
- if (phy != s->phy_num) {
71
- trace_imx_phy_write_num(phy, s->phy_num);
72
+ if (!s->phy_connected) {
122
return;
73
return;
123
}
74
}
124
75
125
- /* Semihosting semantics depend on the register width of the
76
+ if (phy != s->phy_num) {
126
- * code that caused the exception, not the target exception level,
77
+ if (s->phy_consumer && phy == s->phy_consumer->phy_num) {
127
- * so must be handled here.
78
+ s = s->phy_consumer;
128
+ /*
79
+ } else {
129
+ * Semihosting semantics depend on the register width of the code
80
+ trace_imx_phy_write_num(phy, s->phy_num);
130
+ * that caused the exception, not the target exception level, so
81
+ return;
131
+ * must be handled here.
82
+ }
132
*/
83
+ }
133
- if (check_for_semihosting(cs)) {
84
+
134
+#ifdef CONFIG_TCG
85
reg %= 32;
135
+ if (cs->exception_index == EXCP_SEMIHOST) {
86
136
+ handle_semihosting(cs);
87
trace_imx_phy_write(val, phy, reg);
137
return;
88
@@ -XXX,XX +XXX,XX @@ static Property imx_eth_properties[] = {
138
}
89
DEFINE_NIC_PROPERTIES(IMXFECState, conf),
139
+#endif
90
DEFINE_PROP_UINT32("tx-ring-num", IMXFECState, tx_ring_num, 1),
140
91
DEFINE_PROP_UINT32("phy-num", IMXFECState, phy_num, 0),
141
/* Hooks may change global state so BQL should be held, also the
92
+ DEFINE_PROP_BOOL("phy-connected", IMXFECState, phy_connected, true),
142
* BQL needs to be held for any modification of
93
+ DEFINE_PROP_LINK("phy-consumer", IMXFECState, phy_consumer, TYPE_IMX_FEC,
94
+ IMXFECState *),
95
DEFINE_PROP_END_OF_LIST(),
96
};
97
143
--
98
--
144
2.20.1
99
2.34.1
145
146
diff view generated by jsdifflib
New patch
1
From: Guenter Roeck <linux@roeck-us.net>
1
2
3
Add fec[12]-phy-connected properties and use it to set phy-connected
4
and phy-consumer properties for imx_fec.
5
6
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
7
Message-id: 20230315145248.1639364-3-linux@roeck-us.net
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
include/hw/arm/fsl-imx6ul.h | 1 +
12
hw/arm/fsl-imx6ul.c | 20 ++++++++++++++++++++
13
2 files changed, 21 insertions(+)
14
15
diff --git a/include/hw/arm/fsl-imx6ul.h b/include/hw/arm/fsl-imx6ul.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/fsl-imx6ul.h
18
+++ b/include/hw/arm/fsl-imx6ul.h
19
@@ -XXX,XX +XXX,XX @@ struct FslIMX6ULState {
20
MemoryRegion ocram_alias;
21
22
uint32_t phy_num[FSL_IMX6UL_NUM_ETHS];
23
+ bool phy_connected[FSL_IMX6UL_NUM_ETHS];
24
};
25
26
enum FslIMX6ULMemoryMap {
27
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/fsl-imx6ul.c
30
+++ b/hw/arm/fsl-imx6ul.c
31
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
32
33
/*
34
* Ethernet
35
+ *
36
+ * We must use two loops since phy_connected affects the other interface
37
+ * and we have to set all properties before calling sysbus_realize().
38
*/
39
+ for (i = 0; i < FSL_IMX6UL_NUM_ETHS; i++) {
40
+ object_property_set_bool(OBJECT(&s->eth[i]), "phy-connected",
41
+ s->phy_connected[i], &error_abort);
42
+ /*
43
+ * If the MDIO bus on this controller is not connected, assume the
44
+ * other controller provides support for it.
45
+ */
46
+ if (!s->phy_connected[i]) {
47
+ object_property_set_link(OBJECT(&s->eth[1 - i]), "phy-consumer",
48
+ OBJECT(&s->eth[i]), &error_abort);
49
+ }
50
+ }
51
+
52
for (i = 0; i < FSL_IMX6UL_NUM_ETHS; i++) {
53
static const hwaddr FSL_IMX6UL_ENETn_ADDR[FSL_IMX6UL_NUM_ETHS] = {
54
FSL_IMX6UL_ENET1_ADDR,
55
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
56
static Property fsl_imx6ul_properties[] = {
57
DEFINE_PROP_UINT32("fec1-phy-num", FslIMX6ULState, phy_num[0], 0),
58
DEFINE_PROP_UINT32("fec2-phy-num", FslIMX6ULState, phy_num[1], 1),
59
+ DEFINE_PROP_BOOL("fec1-phy-connected", FslIMX6ULState, phy_connected[0],
60
+ true),
61
+ DEFINE_PROP_BOOL("fec2-phy-connected", FslIMX6ULState, phy_connected[1],
62
+ true),
63
DEFINE_PROP_END_OF_LIST(),
64
};
65
66
--
67
2.34.1
diff view generated by jsdifflib
New patch
1
From: Guenter Roeck <linux@roeck-us.net>
1
2
3
On mcimx6ul-evk, the MDIO bus is connected to the second Ethernet
4
interface. Set fec1-phy-connected to false to reflect this.
5
6
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
7
Message-id: 20230315145248.1639364-4-linux@roeck-us.net
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/mcimx6ul-evk.c | 2 ++
12
1 file changed, 2 insertions(+)
13
14
diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/mcimx6ul-evk.c
17
+++ b/hw/arm/mcimx6ul-evk.c
18
@@ -XXX,XX +XXX,XX @@ static void mcimx6ul_evk_init(MachineState *machine)
19
object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
20
object_property_set_uint(OBJECT(s), "fec1-phy-num", 2, &error_fatal);
21
object_property_set_uint(OBJECT(s), "fec2-phy-num", 1, &error_fatal);
22
+ object_property_set_bool(OBJECT(s), "fec1-phy-connected", false,
23
+ &error_fatal);
24
qdev_realize(DEVICE(s), NULL, &error_fatal);
25
26
memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_MMDC_ADDR,
27
--
28
2.34.1
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Guenter Roeck <linux@roeck-us.net>
2
2
3
We do this for other semihosting calls so we might as well do it for
3
Add fec[12]-phy-connected properties and use it to set phy-connected
4
M-profile as well.
4
and phy-consumer properties for imx_fec.
5
5
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20230315145248.1639364-5-linux@roeck-us.net
8
Message-id: 20190913151845.12582-3-alex.bennee@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
target/arm/m_helper.c | 18 ++++++------------
11
include/hw/arm/fsl-imx7.h | 1 +
13
target/arm/translate.c | 11 ++++++++++-
12
hw/arm/fsl-imx7.c | 20 ++++++++++++++++++++
14
2 files changed, 16 insertions(+), 13 deletions(-)
13
2 files changed, 21 insertions(+)
15
14
16
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
15
diff --git a/include/hw/arm/fsl-imx7.h b/include/hw/arm/fsl-imx7.h
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/m_helper.c
17
--- a/include/hw/arm/fsl-imx7.h
19
+++ b/target/arm/m_helper.c
18
+++ b/include/hw/arm/fsl-imx7.h
20
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
19
@@ -XXX,XX +XXX,XX @@ struct FslIMX7State {
21
break;
20
ChipideaState usb[FSL_IMX7_NUM_USBS];
22
}
21
DesignwarePCIEHost pcie;
23
break;
22
uint32_t phy_num[FSL_IMX7_NUM_ETHS];
24
+ case EXCP_SEMIHOST:
23
+ bool phy_connected[FSL_IMX7_NUM_ETHS];
25
+ qemu_log_mask(CPU_LOG_INT,
24
};
26
+ "...handling as semihosting call 0x%x\n",
25
27
+ env->regs[0]);
26
enum FslIMX7MemoryMap {
28
+ env->regs[0] = do_arm_semihosting(env);
27
diff --git a/hw/arm/fsl-imx7.c b/hw/arm/fsl-imx7.c
29
+ return;
30
case EXCP_BKPT:
31
- if (semihosting_enabled()) {
32
- int nr;
33
- nr = arm_lduw_code(env, env->regs[15], arm_sctlr_b(env)) & 0xff;
34
- if (nr == 0xab) {
35
- env->regs[15] += 2;
36
- qemu_log_mask(CPU_LOG_INT,
37
- "...handling as semihosting call 0x%x\n",
38
- env->regs[0]);
39
- env->regs[0] = do_arm_semihosting(env);
40
- return;
41
- }
42
- }
43
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_DEBUG, false);
44
break;
45
case EXCP_IRQ:
46
diff --git a/target/arm/translate.c b/target/arm/translate.c
47
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/translate.c
29
--- a/hw/arm/fsl-imx7.c
49
+++ b/target/arm/translate.c
30
+++ b/hw/arm/fsl-imx7.c
50
@@ -XXX,XX +XXX,XX @@ static bool trans_BKPT(DisasContext *s, arg_BKPT *a)
31
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
51
if (!ENABLE_ARCH_5) {
32
52
return false;
33
/*
53
}
34
* Ethernet
54
- gen_exception_bkpt_insn(s, syn_aa32_bkpt(a->imm, false));
35
+ *
55
+ if (arm_dc_feature(s, ARM_FEATURE_M) &&
36
+ * We must use two loops since phy_connected affects the other interface
56
+ semihosting_enabled() &&
37
+ * and we have to set all properties before calling sysbus_realize().
57
+#ifndef CONFIG_USER_ONLY
38
*/
58
+ !IS_USER(s) &&
39
+ for (i = 0; i < FSL_IMX7_NUM_ETHS; i++) {
59
+#endif
40
+ object_property_set_bool(OBJECT(&s->eth[i]), "phy-connected",
60
+ (a->imm == 0xab)) {
41
+ s->phy_connected[i], &error_abort);
61
+ gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST);
42
+ /*
62
+ } else {
43
+ * If the MDIO bus on this controller is not connected, assume the
63
+ gen_exception_bkpt_insn(s, syn_aa32_bkpt(a->imm, false));
44
+ * other controller provides support for it.
45
+ */
46
+ if (!s->phy_connected[i]) {
47
+ object_property_set_link(OBJECT(&s->eth[1 - i]), "phy-consumer",
48
+ OBJECT(&s->eth[i]), &error_abort);
49
+ }
64
+ }
50
+ }
65
return true;
51
+
66
}
52
for (i = 0; i < FSL_IMX7_NUM_ETHS; i++) {
53
static const hwaddr FSL_IMX7_ENETn_ADDR[FSL_IMX7_NUM_ETHS] = {
54
FSL_IMX7_ENET1_ADDR,
55
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
56
static Property fsl_imx7_properties[] = {
57
DEFINE_PROP_UINT32("fec1-phy-num", FslIMX7State, phy_num[0], 0),
58
DEFINE_PROP_UINT32("fec2-phy-num", FslIMX7State, phy_num[1], 1),
59
+ DEFINE_PROP_BOOL("fec1-phy-connected", FslIMX7State, phy_connected[0],
60
+ true),
61
+ DEFINE_PROP_BOOL("fec2-phy-connected", FslIMX7State, phy_connected[1],
62
+ true),
63
DEFINE_PROP_END_OF_LIST(),
64
};
67
65
68
--
66
--
69
2.20.1
67
2.34.1
70
71
diff view generated by jsdifflib
New patch
1
From: Guenter Roeck <linux@roeck-us.net>
1
2
3
On mcimx7d-sabre, the MDIO bus is connected to the first Ethernet
4
interface. Set fec2-phy-connected to false to reflect this.
5
6
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
7
Message-id: 20230315145248.1639364-6-linux@roeck-us.net
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/mcimx7d-sabre.c | 2 ++
12
1 file changed, 2 insertions(+)
13
14
diff --git a/hw/arm/mcimx7d-sabre.c b/hw/arm/mcimx7d-sabre.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/mcimx7d-sabre.c
17
+++ b/hw/arm/mcimx7d-sabre.c
18
@@ -XXX,XX +XXX,XX @@ static void mcimx7d_sabre_init(MachineState *machine)
19
20
s = FSL_IMX7(object_new(TYPE_FSL_IMX7));
21
object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
22
+ object_property_set_bool(OBJECT(s), "fec2-phy-connected", false,
23
+ &error_fatal);
24
qdev_realize(DEVICE(s), NULL, &error_fatal);
25
26
memory_region_add_subregion(get_system_memory(), FSL_IMX7_MMDC_ADDR,
27
--
28
2.34.1
diff view generated by jsdifflib