1
Hi; here's the first target-arm pullreq for the 8.1 cycle.
1
A last small test of bug fixes before rc1.
2
Nothing particularly huge in here, just the various things
3
that had accumulated during the freeze.
4
2
5
thanks
3
thanks
6
-- PMM
4
-- PMM
7
5
8
The following changes since commit 2d82c32b2ceaca3dc3da5e36e10976f34bfcb598:
6
The following changes since commit ed8ad9728a9c0eec34db9dff61dfa2f1dd625637:
9
7
10
Open 8.1 development tree (2023-04-20 10:05:25 +0100)
8
Merge tag 'pull-tpm-2023-07-14-1' of https://github.com/stefanberger/qemu-tpm into staging (2023-07-15 14:54:04 +0100)
11
9
12
are available in the Git repository at:
10
are available in the Git repository at:
13
11
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230420
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230717
15
13
16
for you to fetch changes up to 1ed1f338520cda0574b7e04f5e8e85e049740548:
14
for you to fetch changes up to c2c1c4a35c7c2b1a4140b0942b9797c857e476a4:
17
15
18
arm/mcimx7d-sabre: Set fec2-phy-connected property to false (2023-04-20 10:46:43 +0100)
16
hw/nvram: Avoid unnecessary Xilinx eFuse backstore write (2023-07-17 11:05:52 +0100)
19
17
20
----------------------------------------------------------------
18
----------------------------------------------------------------
21
target-arm queue:
19
target-arm queue:
22
* hw/arm: Fix some typos in comments (most found by codespell)
20
* hw/arm/sbsa-ref: set 'slots' property of xhci
23
* exynos: Fix out-of-bounds access in exynos4210_gcomp_find debug printf
21
* linux-user: Remove pointless NULL check in clock_adjtime handling
24
* Orangepi-PC, Cubieboard: add Allwinner WDT watchdog emulation
22
* ptw: Fix S1_ptw_translate() debug path
25
* tests/avocado: Add reboot tests to Cubieboard
23
* ptw: Account for FEAT_RME when applying {N}SW, SA bits
26
* hw/timer/imx_epit: Fix bugs in timer limit checking
24
* accel/tcg: Zero-pad PC in TCG CPU exec trace lines
27
* target/arm: Remove KVM AArch32 CPU definitions
25
* hw/nvram: Avoid unnecessary Xilinx eFuse backstore write
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
36
26
37
----------------------------------------------------------------
27
----------------------------------------------------------------
38
Akihiko Odaki (1):
28
Peter Maydell (5):
39
target/arm: Initialize debug capabilities only once
29
linux-user: Remove pointless NULL check in clock_adjtime handling
30
target/arm/ptw.c: Add comments to S1Translate struct fields
31
target/arm: Fix S1_ptw_translate() debug path
32
target/arm/ptw.c: Account for FEAT_RME when applying {N}SW, SA bits
33
accel/tcg: Zero-pad PC in TCG CPU exec trace lines
40
34
41
Axel Heider (2):
35
Tong Ho (1):
42
hw/timer/imx_epit: don't shadow variable
36
hw/nvram: Avoid unnecessary Xilinx eFuse backstore write
43
hw/timer/imx_epit: fix limit check
44
37
45
Feng Jiang (1):
38
Yuquan Wang (1):
46
exynos: Fix out-of-bounds access in exynos4210_gcomp_find debug printf
39
hw/arm/sbsa-ref: set 'slots' property of xhci
47
40
48
Guenter Roeck (5):
41
accel/tcg/cpu-exec.c | 4 +--
49
hw/net/imx_fec: Support two Ethernet interfaces connected to single MDIO bus
42
accel/tcg/translate-all.c | 2 +-
50
fsl-imx6ul: Add fec[12]-phy-connected properties
43
hw/arm/sbsa-ref.c | 1 +
51
arm/mcimx6ul-evk: Set fec1-phy-connected property to false
44
hw/nvram/xlnx-efuse.c | 11 ++++--
52
fsl-imx7: Add fec[12]-phy-connected properties
45
linux-user/syscall.c | 12 +++----
53
arm/mcimx7d-sabre: Set fec2-phy-connected property to false
46
target/arm/ptw.c | 90 +++++++++++++++++++++++++++++++++++++++++------
54
47
6 files changed, 98 insertions(+), 22 deletions(-)
55
Peter Maydell (5):
56
target/arm: Pass ARMMMUFaultInfo to merge_syn_data_abort()
57
target/arm: Don't set ISV when reporting stage 1 faults in ESR_EL2
58
target/arm: Implement FEAT_PAN3
59
docs/devel/kconfig.rst: Fix incorrect markup
60
target/arm: Report pauth information to gdb as 'pauth_v2'
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: Guenter Roeck <linux@roeck-us.net>
1
From: Yuquan Wang <wangyuquan1236@phytium.com.cn>
2
2
3
On mcimx7d-sabre, the MDIO bus is connected to the first Ethernet
3
This extends the slots of xhci to 64, since the default xhci_sysbus
4
interface. Set fec2-phy-connected to false to reflect this.
4
just supports one slot.
5
5
6
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
6
Signed-off-by: Wang Yuquan <wangyuquan1236@phytium.com.cn>
7
Message-id: 20230315145248.1639364-6-linux@roeck-us.net
7
Signed-off-by: Chen Baozi <chenbaozi@phytium.com.cn>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
10
Tested-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
11
Message-id: 20230710063750.473510-2-wangyuquan1236@phytium.com.cn
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
13
---
11
hw/arm/mcimx7d-sabre.c | 2 ++
14
hw/arm/sbsa-ref.c | 1 +
12
1 file changed, 2 insertions(+)
15
1 file changed, 1 insertion(+)
13
16
14
diff --git a/hw/arm/mcimx7d-sabre.c b/hw/arm/mcimx7d-sabre.c
17
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/mcimx7d-sabre.c
19
--- a/hw/arm/sbsa-ref.c
17
+++ b/hw/arm/mcimx7d-sabre.c
20
+++ b/hw/arm/sbsa-ref.c
18
@@ -XXX,XX +XXX,XX @@ static void mcimx7d_sabre_init(MachineState *machine)
21
@@ -XXX,XX +XXX,XX @@ static void create_xhci(const SBSAMachineState *sms)
19
22
hwaddr base = sbsa_ref_memmap[SBSA_XHCI].base;
20
s = FSL_IMX7(object_new(TYPE_FSL_IMX7));
23
int irq = sbsa_ref_irqmap[SBSA_XHCI];
21
object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
24
DeviceState *dev = qdev_new(TYPE_XHCI_SYSBUS);
22
+ object_property_set_bool(OBJECT(s), "fec2-phy-connected", false,
25
+ qdev_prop_set_uint32(dev, "slots", XHCI_MAXSLOTS);
23
+ &error_fatal);
26
24
qdev_realize(DEVICE(s), NULL, &error_fatal);
27
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
25
28
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
26
memory_region_add_subregion(get_system_memory(), FSL_IMX7_MMDC_ADDR,
27
--
29
--
28
2.34.1
30
2.34.1
diff view generated by jsdifflib
1
In rST markup syntax, the inline markup (*italics*, **bold** and
1
In the code for TARGET_NR_clock_adjtime, we set the pointer phtx to
2
``monospaced``) must be separated from the surrending text by
2
the address of the local variable htx. This means it can never be
3
non-word characters, otherwise it is not interpreted as markup.
3
NULL, but later in the code we check it for NULL anyway. Coverity
4
To force interpretation as markup in the middle of a word,
4
complains about this (CID 1507683) because the NULL check comes after
5
you need to use a backslash-escaped space (which will not
5
a call to clock_adjtime() that assumes it is non-NULL.
6
appear as a space in the output).
7
6
8
Fix a missing backslash-space in this file, which meant that the ``
7
Since phtx is always &htx, and is used only in three places, it's not
9
after "select" was output literally and the monospacing was
8
really necessary. Remove it, bringing the code structure in to line
10
incorrectly extended all the way to the end of the next monospaced
9
with that for TARGET_NR_clock_adjtime64, which already uses a simple
11
word.
10
'&htx' when it wants a pointer to 'htx'.
12
11
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
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>
13
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
16
Message-id: 20230411105424.3994585-1-peter.maydell@linaro.org
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20230623144410.1837261-1-peter.maydell@linaro.org
17
---
16
---
18
docs/devel/kconfig.rst | 2 +-
17
linux-user/syscall.c | 12 +++++-------
19
1 file changed, 1 insertion(+), 1 deletion(-)
18
1 file changed, 5 insertions(+), 7 deletions(-)
20
19
21
diff --git a/docs/devel/kconfig.rst b/docs/devel/kconfig.rst
20
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
22
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
23
--- a/docs/devel/kconfig.rst
22
--- a/linux-user/syscall.c
24
+++ b/docs/devel/kconfig.rst
23
+++ b/linux-user/syscall.c
25
@@ -XXX,XX +XXX,XX @@ or commenting out lines in the second group.
24
@@ -XXX,XX +XXX,XX @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
26
25
#if defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME)
27
It is also possible to run QEMU's configure script with the
26
case TARGET_NR_clock_adjtime:
28
``--without-default-devices`` option. When this is done, everything defaults
27
{
29
-to ``n`` unless it is ``select``ed or explicitly switched on in the
28
- struct timex htx, *phtx = &htx;
30
+to ``n`` unless it is ``select``\ ed or explicitly switched on in the
29
+ struct timex htx;
31
``.mak`` files. In other words, ``default`` and ``imply`` directives
30
32
are disabled. When QEMU is built with this option, the user will probably
31
- if (target_to_host_timex(phtx, arg2) != 0) {
33
want to change some lines in the first group, for example like this::
32
+ if (target_to_host_timex(&htx, arg2) != 0) {
33
return -TARGET_EFAULT;
34
}
35
- ret = get_errno(clock_adjtime(arg1, phtx));
36
- if (!is_error(ret) && phtx) {
37
- if (host_to_target_timex(arg2, phtx) != 0) {
38
- return -TARGET_EFAULT;
39
- }
40
+ ret = get_errno(clock_adjtime(arg1, &htx));
41
+ if (!is_error(ret) && host_to_target_timex(arg2, &htx)) {
42
+ return -TARGET_EFAULT;
43
}
44
}
45
return ret;
34
--
46
--
35
2.34.1
47
2.34.1
36
48
37
49
diff view generated by jsdifflib
1
FEAT_PAN3 adds an EPAN bit to SCTLR_EL1 and SCTLR_EL2, which allows
1
Add comments to the in_* fields in the S1Translate struct
2
the PAN bit to make memory non-privileged-read/write if it is
2
that explain what they're doing.
3
user-executable as well as if it is user-read/write.
4
5
Implement this feature and enable it in the AArch64 'max' CPU.
6
3
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230331145045.2584941-4-peter.maydell@linaro.org
6
Message-id: 20230710152130.3928330-2-peter.maydell@linaro.org
10
---
7
---
11
docs/system/arm/emulation.rst | 1 +
8
target/arm/ptw.c | 40 ++++++++++++++++++++++++++++++++++++++++
12
target/arm/cpu.h | 5 +++++
9
1 file changed, 40 insertions(+)
13
target/arm/cpu64.c | 2 +-
14
target/arm/ptw.c | 14 +++++++++++++-
15
4 files changed, 20 insertions(+), 2 deletions(-)
16
10
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
11
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
59
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
60
--- a/target/arm/ptw.c
13
--- a/target/arm/ptw.c
61
+++ b/target/arm/ptw.c
14
+++ b/target/arm/ptw.c
62
@@ -XXX,XX +XXX,XX @@ static int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0)
15
@@ -XXX,XX +XXX,XX @@
63
static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
16
#endif
64
int ap, int ns, int xn, int pxn)
17
65
{
18
typedef struct S1Translate {
66
+ ARMCPU *cpu = env_archcpu(env);
19
+ /*
67
bool is_user = regime_is_user(env, mmu_idx);
20
+ * in_mmu_idx : specifies which TTBR, TCR, etc to use for the walk.
68
int prot_rw, user_rw;
21
+ * Together with in_space, specifies the architectural translation regime.
69
bool have_wxn;
22
+ */
70
@@ -XXX,XX +XXX,XX @@ static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
23
ARMMMUIdx in_mmu_idx;
71
if (is_user) {
24
+ /*
72
prot_rw = user_rw;
25
+ * in_ptw_idx: specifies which mmuidx to use for the actual
73
} else {
26
+ * page table descriptor load operations. This will be one of the
74
+ /*
27
+ * ARMMMUIdx_Stage2* or one of the ARMMMUIdx_Phys_* indexes.
75
+ * PAN controls can forbid data accesses but don't affect insn fetch.
28
+ * If a Secure ptw is "downgraded" to NonSecure by an NSTable bit,
76
+ * Plain PAN forbids data accesses if EL0 has data permissions;
29
+ * this field is updated accordingly.
77
+ * PAN3 forbids data accesses if EL0 has either data or exec perms.
30
+ */
78
+ * Note that for AArch64 the 'user can exec' case is exactly !xn.
31
ARMMMUIdx in_ptw_idx;
79
+ * We make the IMPDEF choices that SCR_EL3.SIF and Realm EL2&0
32
+ /*
80
+ * do not affect EPAN.
33
+ * in_space: the security space for this walk. This plus
81
+ */
34
+ * the in_mmu_idx specify the architectural translation regime.
82
if (user_rw && regime_is_pan(env, mmu_idx)) {
35
+ * If a Secure ptw is "downgraded" to NonSecure by an NSTable bit,
83
- /* PAN forbids data accesses but doesn't affect insn fetch */
36
+ * this field is updated accordingly.
84
+ prot_rw = 0;
37
+ *
85
+ } else if (cpu_isar_feature(aa64_pan3, cpu) && is_aa64 &&
38
+ * Note that the security space for the in_ptw_idx may be different
86
+ regime_is_pan(env, mmu_idx) &&
39
+ * from that for the in_mmu_idx. We do not need to explicitly track
87
+ (regime_sctlr(env, mmu_idx) & SCTLR_EPAN) && !xn) {
40
+ * the in_ptw_idx security space because:
88
prot_rw = 0;
41
+ * - if the in_ptw_idx is an ARMMMUIdx_Phys_* then the mmuidx
89
} else {
42
+ * itself specifies the security space
90
prot_rw = simple_ap_to_rw_prot_is_user(ap, false);
43
+ * - if the in_ptw_idx is an ARMMMUIdx_Stage2* then the security
44
+ * space used for ptw reads is the same as that of the security
45
+ * space of the stage 1 translation for all cases except where
46
+ * stage 1 is Secure; in that case the only possibilities for
47
+ * the ptw read are Secure and NonSecure, and the in_ptw_idx
48
+ * value being Stage2 vs Stage2_S distinguishes those.
49
+ */
50
ARMSecuritySpace in_space;
51
+ /*
52
+ * in_secure: whether the translation regime is a Secure one.
53
+ * This is always equal to arm_space_is_secure(in_space).
54
+ * If a Secure ptw is "downgraded" to NonSecure by an NSTable bit,
55
+ * this field is updated accordingly.
56
+ */
57
bool in_secure;
58
+ /*
59
+ * in_debug: is this a QEMU debug access (gdbstub, etc)? Debug
60
+ * accesses will not update the guest page table access flags
61
+ * and will not change the state of the softmmu TLBs.
62
+ */
63
bool in_debug;
64
/*
65
* If this is stage 2 of a stage 1+2 page table walk, then this must
91
--
66
--
92
2.34.1
67
2.34.1
diff view generated by jsdifflib
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
1
In commit fe4a5472ccd6 we rearranged the logic in S1_ptw_translate()
2
so that the debug-access "call get_phys_addr_*" codepath is used both
3
when S1 is doing ptw reads from stage 2 and when it is doing ptw
4
reads from physical memory. However, we didn't update the
5
calculation of s2ptw->in_space and s2ptw->in_secure to account for
6
the "ptw reads from physical memory" case. This meant that debug
7
accesses when in Secure state broke.
2
8
3
This patch adds basic support for Allwinner WDT.
9
Create a new function S2_security_space() which returns the
4
Both sun4i and sun6i variants are supported.
10
correct security space to use for the ptw load, and use it to
5
However, interrupt generation is not supported, so WDT can be used only to trigger system reset.
11
determine the correct .in_secure and .in_space fields for the
12
stage 2 lookup for the ptw load.
6
13
7
Signed-off-by: Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
14
Reported-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
8
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Tested-by: Niek Linnenbank <nieklinnenbank@gmail.com>
16
Tested-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
10
Message-id: 20230326202256.22980-2-strahinja.p.jankovic@gmail.com
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Message-id: 20230710152130.3928330-3-peter.maydell@linaro.org
19
Fixes: fe4a5472ccd6 ("target/arm: Use get_phys_addr_with_struct in S1_ptw_translate")
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
21
---
13
include/hw/watchdog/allwinner-wdt.h | 123 ++++++++
22
target/arm/ptw.c | 37 ++++++++++++++++++++++++++++++++-----
14
hw/watchdog/allwinner-wdt.c | 416 ++++++++++++++++++++++++++++
23
1 file changed, 32 insertions(+), 5 deletions(-)
15
hw/watchdog/Kconfig | 4 +
16
hw/watchdog/meson.build | 1 +
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
21
24
22
diff --git a/include/hw/watchdog/allwinner-wdt.h b/include/hw/watchdog/allwinner-wdt.h
25
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
23
new file mode 100644
26
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX
27
--- a/target/arm/ptw.c
25
--- /dev/null
28
+++ b/target/arm/ptw.c
26
+++ b/include/hw/watchdog/allwinner-wdt.h
29
@@ -XXX,XX +XXX,XX @@ static bool S2_attrs_are_device(uint64_t hcr, uint8_t attrs)
27
@@ -XXX,XX +XXX,XX @@
30
}
28
+/*
31
}
29
+ * Allwinner Watchdog emulation
32
30
+ *
33
+static ARMSecuritySpace S2_security_space(ARMSecuritySpace s1_space,
31
+ * Copyright (C) 2023 Strahinja Jankovic <strahinja.p.jankovic@gmail.com>
34
+ ARMMMUIdx s2_mmu_idx)
32
+ *
35
+{
33
+ * This file is derived from Allwinner RTC,
36
+ /*
34
+ * by Niek Linnenbank.
37
+ * Return the security space to use for stage 2 when doing
35
+ *
38
+ * the S1 page table descriptor load.
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/>.
48
+ */
49
+
50
+#ifndef HW_WATCHDOG_ALLWINNER_WDT_H
51
+#define HW_WATCHDOG_ALLWINNER_WDT_H
52
+
53
+#include "qom/object.h"
54
+#include "hw/ptimer.h"
55
+#include "hw/sysbus.h"
56
+
57
+/*
58
+ * This is a model of the Allwinner watchdog.
59
+ * Since watchdog registers belong to the timer module (and are shared with the
60
+ * RTC module), the interrupt line from watchdog is not handled right now.
61
+ * In QEMU, we just wire up the watchdog reset to watchdog_perform_action(),
62
+ * at least for the moment.
63
+ */
64
+
65
+#define TYPE_AW_WDT "allwinner-wdt"
66
+
67
+/** Allwinner WDT sun4i family (A10, A12), also sun7i (A20) */
68
+#define TYPE_AW_WDT_SUN4I TYPE_AW_WDT "-sun4i"
69
+
70
+/** Allwinner WDT sun6i family and newer (A31, H2+, H3, etc) */
71
+#define TYPE_AW_WDT_SUN6I TYPE_AW_WDT "-sun6i"
72
+
73
+/** Number of WDT registers */
74
+#define AW_WDT_REGS_NUM (5)
75
+
76
+OBJECT_DECLARE_TYPE(AwWdtState, AwWdtClass, AW_WDT)
77
+
78
+/**
79
+ * Allwinner WDT object instance state.
80
+ */
81
+struct AwWdtState {
82
+ /*< private >*/
83
+ SysBusDevice parent_obj;
84
+
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
+ */
39
+ */
116
+ bool (*read)(AwWdtState *s, uint32_t offset);
40
+ if (regime_is_stage2(s2_mmu_idx)) {
117
+
41
+ /*
118
+ /**
42
+ * The security space for ptw reads is almost always the same
119
+ * Write device specific register
43
+ * as that of the security space of the stage 1 translation.
120
+ *
44
+ * The only exception is when stage 1 is Secure; in that case
121
+ * @offset: register offset to write
45
+ * the ptw read might be to the Secure or the NonSecure space
122
+ * @data: value to set in register
46
+ * (but never Realm or Root), and the s2_mmu_idx tells us which.
123
+ * @return true if register write successful, false otherwise
47
+ * Root translations are always single-stage.
124
+ */
48
+ */
125
+ bool (*write)(AwWdtState *s, uint32_t offset, uint32_t data);
49
+ if (s1_space == ARMSS_Secure) {
126
+
50
+ return arm_secure_to_space(s2_mmu_idx == ARMMMUIdx_Stage2_S);
127
+ /**
51
+ } else {
128
+ * Check if watchdog can generate system reset
52
+ assert(s2_mmu_idx != ARMMMUIdx_Stage2_S);
129
+ *
53
+ assert(s1_space != ARMSS_Root);
130
+ * @return true if watchdog can generate system reset
54
+ return s1_space;
131
+ */
55
+ }
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 {
56
+ } else {
265
+ return false;
57
+ /* ptw loads are from phys: the mmu idx itself says which space */
58
+ return arm_phys_to_space(s2_mmu_idx);
266
+ }
59
+ }
267
+}
60
+}
268
+
61
+
269
+static bool allwinner_wdt_sun4i_is_key_valid(AwWdtState *s, uint32_t val)
62
/* Translate a S1 pagetable walk through S2 if needed. */
270
+{
63
static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
271
+ /* sun4i has no key */
64
hwaddr addr, ARMMMUFaultInfo *fi)
272
+ return true;
65
{
273
+}
66
- ARMSecuritySpace space = ptw->in_space;
274
+
67
bool is_secure = ptw->in_secure;
275
+static uint8_t allwinner_wdt_sun4i_get_intv_value(AwWdtState *s)
68
ARMMMUIdx mmu_idx = ptw->in_mmu_idx;
276
+{
69
ARMMMUIdx s2_mmu_idx = ptw->in_ptw_idx;
277
+ return ((s->regs[REG_MODE] & INTV_VALUE_SUN4I_MASK) >>
70
@@ -XXX,XX +XXX,XX @@ static bool S1_ptw_translate(CPUARMState *env, S1Translate *ptw,
278
+ INTV_VALUE_SUN4I_SHIFT);
71
* From gdbstub, do not use softmmu so that we don't modify the
279
+}
72
* state of the cpu at all, including softmmu tlb contents.
280
+
73
*/
281
+static bool allwinner_wdt_sun6i_read(AwWdtState *s, uint32_t offset)
74
+ ARMSecuritySpace s2_space = S2_security_space(ptw->in_space, s2_mmu_idx);
282
+{
75
S1Translate s2ptw = {
283
+ const AwWdtClass *c = AW_WDT_GET_CLASS(s);
76
.in_mmu_idx = s2_mmu_idx,
284
+
77
.in_ptw_idx = ptw_idx_for_stage_2(env, s2_mmu_idx),
285
+ switch (c->regmap[offset]) {
78
- .in_secure = s2_mmu_idx == ARMMMUIdx_Stage2_S,
286
+ case REG_IRQ_EN:
79
- .in_space = (s2_mmu_idx == ARMMMUIdx_Stage2_S ? ARMSS_Secure
287
+ case REG_IRQ_STA:
80
- : space == ARMSS_Realm ? ARMSS_Realm
288
+ case REG_CFG:
81
- : ARMSS_NonSecure),
289
+ return true;
82
+ .in_secure = arm_space_is_secure(s2_space),
290
+ default:
83
+ .in_space = s2_space,
291
+ break;
84
.in_debug = true,
292
+ }
85
};
293
+ return false;
86
GetPhysAddrResult s2 = { };
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"
612
--
87
--
613
2.34.1
88
2.34.1
diff view generated by jsdifflib
1
From: Feng Jiang <jiangfeng@kylinos.cn>
1
In get_phys_addr_twostage() the code that applies the effects of
2
VSTCR.{SA,SW} and VTCR.{NSA,NSW} only updates result->f.attrs.secure.
3
Now we also have f.attrs.space for FEAT_RME, we need to keep the two
4
in sync.
2
5
3
One of the debug printfs in exynos4210_gcomp_find() will
6
These bits only have an effect for Secure space translations, not
4
access outside the 's->g_timer.reg.comp[]' array if there
7
for Root, so use the input in_space field to determine whether to
5
was no active comparator and 'res' is -1. Add a conditional
8
apply them rather than the input is_secure. This doesn't actually
6
to avoid this.
9
make a difference because Root translations are never two-stage,
10
but it's a little clearer.
7
11
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>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20230710152130.3928330-4-peter.maydell@linaro.org
17
---
15
---
18
hw/timer/exynos4210_mct.c | 13 ++++++++-----
16
target/arm/ptw.c | 13 ++++++++-----
19
1 file changed, 8 insertions(+), 5 deletions(-)
17
1 file changed, 8 insertions(+), 5 deletions(-)
20
18
21
diff --git a/hw/timer/exynos4210_mct.c b/hw/timer/exynos4210_mct.c
19
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
22
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/timer/exynos4210_mct.c
21
--- a/target/arm/ptw.c
24
+++ b/hw/timer/exynos4210_mct.c
22
+++ b/target/arm/ptw.c
25
@@ -XXX,XX +XXX,XX @@ static int32_t exynos4210_gcomp_find(Exynos4210MCTState *s)
23
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
26
res = min_comp_i;
24
hwaddr ipa;
27
}
25
int s1_prot, s1_lgpgsz;
28
26
bool is_secure = ptw->in_secure;
29
- DPRINTF("found comparator %d: comp 0x%llx distance 0x%llx, gfrc 0x%llx\n",
27
+ ARMSecuritySpace in_space = ptw->in_space;
30
- res,
28
bool ret, ipa_secure;
31
- s->g_timer.reg.comp[res],
29
ARMCacheAttrs cacheattrs1;
32
- distance_min,
30
ARMSecuritySpace ipa_space;
33
- gfrc);
31
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_twostage(CPUARMState *env, S1Translate *ptw,
34
+ if (res >= 0) {
32
* Check if IPA translates to secure or non-secure PA space.
35
+ DPRINTF("found comparator %d: "
33
* Note that VSTCR overrides VTCR and {N}SW overrides {N}SA.
36
+ "comp 0x%llx distance 0x%llx, gfrc 0x%llx\n",
34
*/
37
+ res,
35
- result->f.attrs.secure =
38
+ s->g_timer.reg.comp[res],
36
- (is_secure
39
+ distance_min,
37
- && !(env->cp15.vstcr_el2 & (VSTCR_SA | VSTCR_SW))
40
+ gfrc);
38
- && (ipa_secure
39
- || !(env->cp15.vtcr_el2 & (VTCR_NSA | VTCR_NSW))));
40
+ if (in_space == ARMSS_Secure) {
41
+ result->f.attrs.secure =
42
+ !(env->cp15.vstcr_el2 & (VSTCR_SA | VSTCR_SW))
43
+ && (ipa_secure
44
+ || !(env->cp15.vtcr_el2 & (VTCR_NSA | VTCR_NSW)));
45
+ result->f.attrs.space = arm_secure_to_space(result->f.attrs.secure);
41
+ }
46
+ }
42
47
43
return res;
48
return false;
44
}
49
}
45
--
50
--
46
2.34.1
51
2.34.1
diff view generated by jsdifflib
1
From: Stefan Weil <sw@weilnetz.de>
1
In commit f0a08b0913befbd we changed the type of the PC from
2
target_ulong to vaddr. In doing so we inadvertently dropped the
3
zero-padding on the PC in trace lines (the second item inside the []
4
in these lines). They used to look like this on AArch64, for
5
instance:
2
6
3
Signed-off-by: Stefan Weil <sw@weilnetz.de>
7
Trace 0: 0x7f2260000100 [00000000/0000000040000000/00000061/ff200000]
8
9
and now they look like this:
10
Trace 0: 0x7f4f50000100 [00000000/40000000/00000061/ff200000]
11
12
and if the PC happens to be somewhere low like 0x5000
13
then the field is shown as /5000/.
14
15
This is because TARGET_FMT_lx is a "%08x" or "%016x" specifier,
16
depending on TARGET_LONG_SIZE, whereas VADDR_PRIx is just PRIx64
17
with no width specifier.
18
19
Restore the zero-padding by adding an 016 width specifier to
20
this tracing and a couple of others that were similarly recently
21
changed to use VADDR_PRIx without a width specifier.
22
23
We can't unfortunately restore the "32-bit guests are padded to
24
8 hex digits and 64-bit guests to 16 hex digits" behaviour so
25
easily.
26
27
Fixes: f0a08b0913befbd ("accel/tcg/cpu-exec.c: Widen pc to vaddr")
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
29
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Message-id: 20230409200526.1156456-1-sw@weilnetz.de
30
Reviewed-by: Anton Johansson <anjo@rev.ng>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
31
Message-id: 20230711165434.4123674-1-peter.maydell@linaro.org
7
---
32
---
8
hw/arm/exynos4210.c | 4 ++--
33
accel/tcg/cpu-exec.c | 4 ++--
9
hw/arm/musicpal.c | 2 +-
34
accel/tcg/translate-all.c | 2 +-
10
hw/arm/omap1.c | 2 +-
35
2 files changed, 3 insertions(+), 3 deletions(-)
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(-)
17
36
18
diff --git a/hw/arm/exynos4210.c b/hw/arm/exynos4210.c
37
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
19
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/exynos4210.c
39
--- a/accel/tcg/cpu-exec.c
21
+++ b/hw/arm/exynos4210.c
40
+++ b/accel/tcg/cpu-exec.c
22
@@ -XXX,XX +XXX,XX @@ static int mapline_size(const int *mapline)
41
@@ -XXX,XX +XXX,XX @@ static void log_cpu_exec(vaddr pc, CPUState *cpu,
23
42
if (qemu_log_in_addr_range(pc)) {
24
/*
43
qemu_log_mask(CPU_LOG_EXEC,
25
* Initialize board IRQs.
44
"Trace %d: %p [%08" PRIx64
26
- * These IRQs contain splitted Int/External Combiner and External Gic IRQs.
45
- "/%" VADDR_PRIx "/%08x/%08x] %s\n",
27
+ * These IRQs contain split Int/External Combiner and External Gic IRQs.
46
+ "/%016" VADDR_PRIx "/%08x/%08x] %s\n",
28
*/
47
cpu->cpu_index, tb->tc.ptr, tb->cs_base, pc,
29
static void exynos4210_init_board_irqs(Exynos4210State *s)
48
tb->flags, tb->cflags, lookup_symbol(pc));
30
{
49
31
@@ -XXX,XX +XXX,XX @@ static void exynos4210_realize(DeviceState *socdev, Error **errp)
50
@@ -XXX,XX +XXX,XX @@ cpu_tb_exec(CPUState *cpu, TranslationBlock *itb, int *tb_exit)
32
* - SDMA
51
if (qemu_loglevel_mask(CPU_LOG_EXEC)) {
33
* - ADMA2
52
vaddr pc = log_pc(cpu, last_tb);
34
*
53
if (qemu_log_in_addr_range(pc)) {
35
- * As this part of the Exynos4210 is not publically available,
54
- qemu_log("Stopped execution of TB chain before %p [%"
36
+ * As this part of the Exynos4210 is not publicly available,
55
+ qemu_log("Stopped execution of TB chain before %p [%016"
37
* we used the "HS-MMC Controller S3C2416X RISC Microprocessor"
56
VADDR_PRIx "] %s\n",
38
* public datasheet which is very similar (implementing
57
last_tb->tc.ptr, pc, lookup_symbol(pc));
39
* MMC Specification Version 4.0 being the only difference noted)
58
}
40
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
59
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
41
index XXXXXXX..XXXXXXX 100644
60
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/arm/musicpal.c
61
--- a/accel/tcg/translate-all.c
43
+++ b/hw/arm/musicpal.c
62
+++ b/accel/tcg/translate-all.c
44
@@ -XXX,XX +XXX,XX @@
63
@@ -XXX,XX +XXX,XX @@ void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
45
#define MP_LCD_SPI_CMD 0x00104011
64
if (qemu_loglevel_mask(CPU_LOG_EXEC)) {
46
#define MP_LCD_SPI_INVALID 0x00000000
65
vaddr pc = log_pc(cpu, tb);
47
66
if (qemu_log_in_addr_range(pc)) {
48
-/* Commmands */
67
- qemu_log("cpu_io_recompile: rewound execution of TB to %"
49
+/* Commands */
68
+ qemu_log("cpu_io_recompile: rewound execution of TB to %016"
50
#define MP_LCD_INST_SETPAGE0 0xB0
69
VADDR_PRIx "\n", pc);
51
/* ... */
70
}
52
#define MP_LCD_INST_SETPAGE7 0xB7
71
}
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
131
--
72
--
132
2.34.1
73
2.34.1
133
74
134
75
diff view generated by jsdifflib
Deleted patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
2
1
3
This patch adds WDT to Allwinner-A10 and Cubieboard.
4
WDT is added as an overlay to the Timer module memory map.
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-3-strahinja.p.jankovic@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
docs/system/arm/cubieboard.rst | 1 +
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(+)
16
17
diff --git a/docs/system/arm/cubieboard.rst b/docs/system/arm/cubieboard.rst
18
index XXXXXXX..XXXXXXX 100644
19
--- a/docs/system/arm/cubieboard.rst
20
+++ b/docs/system/arm/cubieboard.rst
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);
64
}
65
66
static void aw_a10_realize(DeviceState *dev, Error **errp)
67
@@ -XXX,XX +XXX,XX @@ static void aw_a10_realize(DeviceState *dev, Error **errp)
68
sysbus_realize(SYS_BUS_DEVICE(&s->i2c0), &error_fatal);
69
sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c0), 0, AW_A10_I2C0_BASE);
70
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c0), 0, qdev_get_gpio_in(dev, 7));
71
+
72
+ /* WDT */
73
+ sysbus_realize(SYS_BUS_DEVICE(&s->wdt), &error_fatal);
74
+ sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->wdt), 0, AW_A10_WDT_BASE, 1);
75
}
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
90
--
91
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
2
1
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
Deleted patch
1
From: Strahinja Jankovic <strahinjapjankovic@gmail.com>
2
1
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
Deleted patch
1
From: Axel Heider <axel.heider@hensoldt.net>
2
1
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
Deleted patch
1
From: Axel Heider <axel.heider@hensoldt.net>
2
1
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
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
3
Missed in commit 80485d88f9 ("target/arm: Restrict
4
v7A TCG cpus to TCG accel").
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20230405100848.76145-2-philmd@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/kvm-consts.h | 9 +++------
12
target/arm/cpu_tcg.c | 2 --
13
2 files changed, 3 insertions(+), 8 deletions(-)
14
15
diff --git a/target/arm/kvm-consts.h b/target/arm/kvm-consts.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/kvm-consts.h
18
+++ b/target/arm/kvm-consts.h
19
@@ -XXX,XX +XXX,XX @@ MISMATCH_CHECK(QEMU_PSCI_RET_INTERNAL_FAILURE, PSCI_RET_INTERNAL_FAILURE);
20
MISMATCH_CHECK(QEMU_PSCI_RET_NOT_PRESENT, PSCI_RET_NOT_PRESENT);
21
MISMATCH_CHECK(QEMU_PSCI_RET_DISABLED, PSCI_RET_DISABLED);
22
23
-/* Note that KVM uses overlapping values for AArch32 and AArch64
24
- * target CPU numbers. AArch32 targets:
25
+/*
26
+ * Note that KVM uses overlapping values for AArch32 and AArch64
27
+ * target CPU numbers. AArch64 targets:
28
*/
29
-#define QEMU_KVM_ARM_TARGET_CORTEX_A15 0
30
-#define QEMU_KVM_ARM_TARGET_CORTEX_A7 1
31
-
32
-/* AArch64 targets: */
33
#define QEMU_KVM_ARM_TARGET_AEM_V8 0
34
#define QEMU_KVM_ARM_TARGET_FOUNDATION_V8 1
35
#define QEMU_KVM_ARM_TARGET_CORTEX_A57 2
36
diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/cpu_tcg.c
39
+++ b/target/arm/cpu_tcg.c
40
@@ -XXX,XX +XXX,XX @@ static void cortex_a7_initfn(Object *obj)
41
set_feature(&cpu->env, ARM_FEATURE_EL2);
42
set_feature(&cpu->env, ARM_FEATURE_EL3);
43
set_feature(&cpu->env, ARM_FEATURE_PMU);
44
- cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A7;
45
cpu->midr = 0x410fc075;
46
cpu->reset_fpsid = 0x41023075;
47
cpu->isar.mvfr0 = 0x10110222;
48
@@ -XXX,XX +XXX,XX @@ static void cortex_a15_initfn(Object *obj)
49
set_feature(&cpu->env, ARM_FEATURE_EL2);
50
set_feature(&cpu->env, ARM_FEATURE_EL3);
51
set_feature(&cpu->env, ARM_FEATURE_PMU);
52
- cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A15;
53
/* r4p0 cpu, not requiring expensive tlb flush errata */
54
cpu->midr = 0x414fc0f0;
55
cpu->revidr = 0x0;
56
--
57
2.34.1
58
59
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
1
3
The Cortex-A7 core is only available when TCG is enabled (see
4
commit 80485d88f9 "target/arm: Restrict v7A TCG cpus to TCG accel").
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20230405100848.76145-3-philmd@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/virt.c | 2 ++
12
1 file changed, 2 insertions(+)
13
14
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/virt.c
17
+++ b/hw/arm/virt.c
18
@@ -XXX,XX +XXX,XX @@ static const int a15irqmap[] = {
19
};
20
21
static const char *valid_cpus[] = {
22
+#ifdef CONFIG_TCG
23
ARM_CPU_TYPE_NAME("cortex-a7"),
24
+#endif
25
ARM_CPU_TYPE_NAME("cortex-a15"),
26
ARM_CPU_TYPE_NAME("cortex-a35"),
27
ARM_CPU_TYPE_NAME("cortex-a53"),
28
--
29
2.34.1
30
31
diff view generated by jsdifflib
1
From: Akihiko Odaki <akihiko.odaki@daynix.com>
1
From: Tong Ho <tong.ho@amd.com>
2
2
3
kvm_arm_init_debug() used to be called several times on a SMP system as
3
Add a check in the bit-set operation to write the backstore
4
kvm_arch_init_vcpu() calls it. Move the call to kvm_arch_init() to make
4
only if the affected bit is 0 before.
5
sure it will be called only once; otherwise it will overwrite pointers
6
to memory allocated with the previous call and leak it.
7
5
8
Fixes: e4482ab7e3 ("target-arm: kvm - add support for HW assisted debug")
6
With this in place, there will be no need for callers to
9
Suggested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
do the checking in order to avoid unnecessary writes.
10
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
8
11
Message-id: 20230405153644.25300-1-akihiko.odaki@daynix.com
9
Signed-off-by: Tong Ho <tong.ho@amd.com>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
14
---
15
target/arm/kvm_arm.h | 8 ++++++++
15
hw/nvram/xlnx-efuse.c | 11 +++++++++--
16
target/arm/kvm.c | 2 ++
16
1 file changed, 9 insertions(+), 2 deletions(-)
17
target/arm/kvm64.c | 18 ++++--------------
18
3 files changed, 14 insertions(+), 14 deletions(-)
19
17
20
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
18
diff --git a/hw/nvram/xlnx-efuse.c b/hw/nvram/xlnx-efuse.c
21
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/kvm_arm.h
20
--- a/hw/nvram/xlnx-efuse.c
23
+++ b/target/arm/kvm_arm.h
21
+++ b/hw/nvram/xlnx-efuse.c
24
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ static bool efuse_ro_bits_find(XlnxEFuse *s, uint32_t k)
25
#define KVM_ARM_VGIC_V2 (1 << 0)
23
26
#define KVM_ARM_VGIC_V3 (1 << 1)
24
bool xlnx_efuse_set_bit(XlnxEFuse *s, unsigned int bit)
27
25
{
28
+/**
26
+ uint32_t set, *row;
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
+
27
+
36
/**
28
if (efuse_ro_bits_find(s, bit)) {
37
* kvm_arm_vcpu_init:
29
g_autofree char *path = object_get_canonical_path(OBJECT(s));
38
* @cs: CPUState
30
39
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
31
@@ -XXX,XX +XXX,XX @@ bool xlnx_efuse_set_bit(XlnxEFuse *s, unsigned int bit)
40
index XXXXXXX..XXXXXXX 100644
32
return false;
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
}
45
}
33
}
46
34
47
+ kvm_arm_init_debug(s);
35
- s->fuse32[bit / 32] |= 1 << (bit % 32);
48
+
36
- efuse_bdrv_sync(s, bit);
49
return ret;
37
+ /* Avoid back-end write unless there is a real update */
38
+ row = &s->fuse32[bit / 32];
39
+ set = 1 << (bit % 32);
40
+ if (!(set & *row)) {
41
+ *row |= set;
42
+ efuse_bdrv_sync(s, bit);
43
+ }
44
return true;
50
}
45
}
51
52
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/target/arm/kvm64.c
55
+++ b/target/arm/kvm64.c
56
@@ -XXX,XX +XXX,XX @@ GArray *hw_breakpoints, *hw_watchpoints;
57
#define get_hw_bp(i) (&g_array_index(hw_breakpoints, HWBreakpoint, i))
58
#define get_hw_wp(i) (&g_array_index(hw_watchpoints, HWWatchpoint, i))
59
60
-/**
61
- * kvm_arm_init_debug() - check for guest debug capabilities
62
- * @cs: CPUState
63
- *
64
- * kvm_check_extension returns the number of debug registers we have
65
- * or 0 if we have none.
66
- *
67
- */
68
-static void kvm_arm_init_debug(CPUState *cs)
69
+void kvm_arm_init_debug(KVMState *s)
70
{
71
- have_guest_debug = kvm_check_extension(cs->kvm_state,
72
+ have_guest_debug = kvm_check_extension(s,
73
KVM_CAP_SET_GUEST_DEBUG);
74
75
- max_hw_wps = kvm_check_extension(cs->kvm_state, KVM_CAP_GUEST_DEBUG_HW_WPS);
76
+ max_hw_wps = kvm_check_extension(s, KVM_CAP_GUEST_DEBUG_HW_WPS);
77
hw_watchpoints = g_array_sized_new(true, true,
78
sizeof(HWWatchpoint), max_hw_wps);
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
46
94
--
47
--
95
2.34.1
48
2.34.1
96
49
97
50
diff view generated by jsdifflib
Deleted patch
1
We already pass merge_syn_data_abort() two fields from the
2
ARMMMUFaultInfo struct, and we're about to want to use a third field.
3
Refactor to just pass a pointer to the fault info.
4
1
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Message-id: 20230331145045.2584941-2-peter.maydell@linaro.org
9
---
10
target/arm/tcg/tlb_helper.c | 15 +++++++--------
11
1 file changed, 7 insertions(+), 8 deletions(-)
12
13
diff --git a/target/arm/tcg/tlb_helper.c b/target/arm/tcg/tlb_helper.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/tcg/tlb_helper.c
16
+++ b/target/arm/tcg/tlb_helper.c
17
@@ -XXX,XX +XXX,XX @@ bool arm_s1_regime_using_lpae_format(CPUARMState *env, ARMMMUIdx mmu_idx)
18
}
19
20
static inline uint32_t merge_syn_data_abort(uint32_t template_syn,
21
+ ARMMMUFaultInfo *fi,
22
unsigned int target_el,
23
- bool same_el, bool ea,
24
- bool s1ptw, bool is_write,
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)) {
62
--
63
2.34.1
64
65
diff view generated by jsdifflib
Deleted 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.
6
1
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
Deleted 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
6
1
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
Deleted patch
1
From: Guenter Roeck <linux@roeck-us.net>
2
1
3
The SOC on i.MX6UL and i.MX7 has 2 Ethernet interfaces. The PHY on each may
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.
9
10
To be able to support two PHY instances on a single MDIO bus, two properties
11
are needed: First, there needs to be a flag indicating if the MDIO bus on
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>
21
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
---
23
include/hw/net/imx_fec.h | 2 ++
24
hw/net/imx_fec.c | 27 +++++++++++++++++++++++----
25
2 files changed, 25 insertions(+), 4 deletions(-)
26
27
diff --git a/include/hw/net/imx_fec.h b/include/hw/net/imx_fec.h
28
index XXXXXXX..XXXXXXX 100644
29
--- a/include/hw/net/imx_fec.h
30
+++ b/include/hw/net/imx_fec.h
31
@@ -XXX,XX +XXX,XX @@ struct IMXFECState {
32
uint32_t phy_int;
33
uint32_t phy_int_mask;
34
uint32_t phy_num;
35
+ bool phy_connected;
36
+ struct IMXFECState *phy_consumer;
37
38
bool is_fec;
39
40
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/net/imx_fec.c
43
+++ b/hw/net/imx_fec.c
44
@@ -XXX,XX +XXX,XX @@ static uint32_t imx_phy_read(IMXFECState *s, int reg)
45
uint32_t val;
46
uint32_t phy = reg / 32;
47
48
- if (phy != s->phy_num) {
49
- trace_imx_phy_read_num(phy, s->phy_num);
50
+ if (!s->phy_connected) {
51
return 0xffff;
52
}
53
54
+ if (phy != s->phy_num) {
55
+ if (s->phy_consumer && phy == s->phy_consumer->phy_num) {
56
+ s = s->phy_consumer;
57
+ } else {
58
+ trace_imx_phy_read_num(phy, s->phy_num);
59
+ return 0xffff;
60
+ }
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) {
73
return;
74
}
75
76
+ if (phy != s->phy_num) {
77
+ if (s->phy_consumer && phy == s->phy_consumer->phy_num) {
78
+ s = s->phy_consumer;
79
+ } else {
80
+ trace_imx_phy_write_num(phy, s->phy_num);
81
+ return;
82
+ }
83
+ }
84
+
85
reg %= 32;
86
87
trace_imx_phy_write(val, phy, reg);
88
@@ -XXX,XX +XXX,XX @@ static Property imx_eth_properties[] = {
89
DEFINE_NIC_PROPERTIES(IMXFECState, conf),
90
DEFINE_PROP_UINT32("tx-ring-num", IMXFECState, tx_ring_num, 1),
91
DEFINE_PROP_UINT32("phy-num", IMXFECState, phy_num, 0),
92
+ DEFINE_PROP_BOOL("phy-connected", IMXFECState, phy_connected, true),
93
+ DEFINE_PROP_LINK("phy-consumer", IMXFECState, phy_consumer, TYPE_IMX_FEC,
94
+ IMXFECState *),
95
DEFINE_PROP_END_OF_LIST(),
96
};
97
98
--
99
2.34.1
diff view generated by jsdifflib
Deleted patch
1
From: Guenter Roeck <linux@roeck-us.net>
2
1
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
Deleted patch
1
From: Guenter Roeck <linux@roeck-us.net>
2
1
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
Deleted patch
1
From: Guenter Roeck <linux@roeck-us.net>
2
1
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-5-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-imx7.h | 1 +
12
hw/arm/fsl-imx7.c | 20 ++++++++++++++++++++
13
2 files changed, 21 insertions(+)
14
15
diff --git a/include/hw/arm/fsl-imx7.h b/include/hw/arm/fsl-imx7.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/fsl-imx7.h
18
+++ b/include/hw/arm/fsl-imx7.h
19
@@ -XXX,XX +XXX,XX @@ struct FslIMX7State {
20
ChipideaState usb[FSL_IMX7_NUM_USBS];
21
DesignwarePCIEHost pcie;
22
uint32_t phy_num[FSL_IMX7_NUM_ETHS];
23
+ bool phy_connected[FSL_IMX7_NUM_ETHS];
24
};
25
26
enum FslIMX7MemoryMap {
27
diff --git a/hw/arm/fsl-imx7.c b/hw/arm/fsl-imx7.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/fsl-imx7.c
30
+++ b/hw/arm/fsl-imx7.c
31
@@ -XXX,XX +XXX,XX @@ static void fsl_imx7_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_IMX7_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_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
};
65
66
--
67
2.34.1
diff view generated by jsdifflib