1
Arm patch queue -- these are all bug fix patches but we might
1
The following changes since commit aa9e7fa4689d1becb2faf67f65aafcbcf664f1ce:
2
as well put them in to rc0...
3
2
4
thanks
3
Merge tag 'edk2-stable202302-20230320-pull-request' of https://gitlab.com/kraxel/qemu into staging (2023-03-20 13:43:35 +0000)
5
-- PMM
6
7
The following changes since commit 2c8cfc0b52b5a4d123c26c0b5fdf941be24805be:
8
9
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2018-03-19 11:44:26 +0000)
10
4
11
are available in the Git repository at:
5
are available in the Git repository at:
12
6
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180319
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230321
14
8
15
for you to fetch changes up to ff72cb6b46b95bb530787add5277c211af3d31c6:
9
for you to fetch changes up to 5787d17a42f7af4bd117e5d6bfa54b1fdf93c255:
16
10
17
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs (2018-03-19 18:23:24 +0000)
11
target/arm: Don't advertise aarch64-pauth.xml to gdb (2023-03-21 13:19:08 +0000)
18
12
19
----------------------------------------------------------------
13
----------------------------------------------------------------
20
target-arm queue:
14
target-arm queue:
21
* fsl-imx6: Fix incorrect Ethernet interrupt defines
15
* contrib/elf2dmp: Support Windows Server 2022
22
* dump: Update correct kdump phys_base field for AArch64
16
* hw/char/cadence_uart: Fix guards on invalid BRGR/BDIV settings
23
* char: i.MX: Add support for "TX complete" interrupt
17
* target/arm: Add Neoverse-N1 IMPDEF registers
24
* bcm2836/raspi: Fix various bugs resulting in panics trying
18
* hw/usb/imx: Fix out of bounds access in imx_usbphy_read()
25
to boot a Debian Linux kernel on raspi3
19
* docs/system/arm/cpu-features.rst: Fix formatting
20
* target/arm: Don't advertise aarch64-pauth.xml to gdb
26
21
27
----------------------------------------------------------------
22
----------------------------------------------------------------
28
Andrey Smirnov (2):
23
Chen Baozi (1):
29
char: i.MX: Simplify imx_update()
24
target/arm: Add Neoverse-N1 registers
30
char: i.MX: Add support for "TX complete" interrupt
31
25
32
Guenter Roeck (1):
26
Guenter Roeck (1):
33
fsl-imx6: Swap Ethernet interrupt defines
27
hw/usb/imx: Fix out of bounds access in imx_usbphy_read()
34
28
35
Peter Maydell (9):
29
Peter Maydell (3):
36
hw/arm/raspi: Don't do board-setup or secure-boot for raspi3
30
hw/char/cadence_uart: Fix guards on invalid BRGR/BDIV settings
37
hw/arm/boot: assert that secure_boot and secure_board_setup are false for AArch64
31
docs/system/arm/cpu-features.rst: Fix formatting
38
hw/arm/boot: If booting a kernel in EL2, set SCR_EL3.HCE
32
target/arm: Don't advertise aarch64-pauth.xml to gdb
39
hw/arm/bcm2386: Fix parent type of bcm2386
40
hw/arm/bcm2836: Rename bcm2836 type/struct to bcm283x
41
hw/arm/bcm2836: Create proper bcm2837 device
42
hw/arm/bcm2836: Use correct affinity values for BCM2837
43
hw/arm/bcm2836: Hardcode correct CPU type
44
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs
45
33
46
Wei Huang (1):
34
Viktor Prutyanov (3):
47
dump: Update correct kdump phys_base field for AArch64
35
contrib/elf2dmp: fix code style
36
contrib/elf2dmp: move PE dir search to pe_get_data_dir_entry
37
contrib/elf2dmp: add PE name check and Windows Server 2022 support
48
38
49
include/hw/arm/bcm2836.h | 31 +++++++++++++---
39
docs/system/arm/cpu-features.rst | 68 ++++++++++-------------
50
include/hw/arm/fsl-imx6.h | 4 +-
40
contrib/elf2dmp/pe.h | 115 ++++++++++++++++++++++-----------------
51
include/hw/char/imx_serial.h | 3 ++
41
contrib/elf2dmp/addrspace.c | 1 +
52
dump.c | 14 +++++--
42
contrib/elf2dmp/main.c | 108 ++++++++++++++++++++++++------------
53
hw/arm/bcm2836.c | 87 +++++++++++++++++++++++++++++++-------------
43
hw/char/cadence_uart.c | 6 +-
54
hw/arm/boot.c | 12 ++++++
44
hw/usb/imx-usb-phy.c | 19 ++++++-
55
hw/arm/raspi.c | 77 +++++++++++++++++++++++++++++++--------
45
target/arm/cpu64.c | 69 +++++++++++++++++++++++
56
hw/char/imx_serial.c | 44 ++++++++++++++++------
46
target/arm/gdbstub.c | 7 +++
57
hw/net/imx_fec.c | 28 +++++++++++++-
47
8 files changed, 267 insertions(+), 126 deletions(-)
58
9 files changed, 237 insertions(+), 63 deletions(-)
59
diff view generated by jsdifflib
1
The bcm2837 is pretty similar to the bcm2836, but it does have
1
From: Chen Baozi <chenbaozi@phytium.com.cn>
2
some differences. Notably, the MPIDR affinity aff1 values it
3
sets for the CPUs are 0x0, rather than the 0xf that the bcm2836
4
uses, and if this is wrong Linux will not boot.
5
2
6
Rather than trying to have one device with properties that
3
Add implementation defined registers for neoverse-n1 which
7
configure it differently for the two cases, create two
4
would be accessed by TF-A. Since there is no DSU in Qemu,
8
separate QOM devices for the two SoCs. We use the same approach
5
CPUCFR_EL1.SCU bit is set to 1 to avoid DSU registers definition.
9
as hw/arm/aspeed_soc.c and share code and have a data table
10
that might differ per-SoC. For the moment the two types don't
11
actually have different behaviour.
12
6
7
Signed-off-by: Chen Baozi <chenbaozi@phytium.com.cn>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Tested-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
10
Message-id: 20230313033936.585669-1-chenbaozi@phytium.com.cn
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20180313153458.26822-7-peter.maydell@linaro.org
16
---
12
---
17
include/hw/arm/bcm2836.h | 19 +++++++++++++++++++
13
target/arm/cpu64.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++
18
hw/arm/bcm2836.c | 37 ++++++++++++++++++++++++++++++++-----
14
1 file changed, 69 insertions(+)
19
hw/arm/raspi.c | 3 ++-
20
3 files changed, 53 insertions(+), 6 deletions(-)
21
15
22
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
16
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
23
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/bcm2836.h
18
--- a/target/arm/cpu64.c
25
+++ b/include/hw/arm/bcm2836.h
19
+++ b/target/arm/cpu64.c
26
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@
27
21
#include "qemu/osdep.h"
28
#define BCM283X_NCPUS 4
22
#include "qapi/error.h"
29
23
#include "cpu.h"
30
+/* These type names are for specific SoCs; other than instantiating
24
+#include "cpregs.h"
31
+ * them, code using these devices should always handle them via the
25
#include "qemu/module.h"
32
+ * BCM283x base class, so they have no BCM2836(obj) etc macros.
26
#include "sysemu/kvm.h"
33
+ */
27
#include "sysemu/hvf.h"
34
+#define TYPE_BCM2836 "bcm2836"
28
@@ -XXX,XX +XXX,XX @@ static void aarch64_a64fx_initfn(Object *obj)
35
+#define TYPE_BCM2837 "bcm2837"
29
/* TODO: Add A64FX specific HPC extension registers */
36
+
30
}
37
typedef struct BCM283XState {
31
38
/*< private >*/
32
+static const ARMCPRegInfo neoverse_n1_cp_reginfo[] = {
39
DeviceState parent_obj;
33
+ { .name = "ATCR_EL1", .state = ARM_CP_STATE_AA64,
40
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XState {
34
+ .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 7, .opc2 = 0,
41
BCM2835PeripheralState peripherals;
35
+ .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
42
} BCM283XState;
36
+ { .name = "ATCR_EL2", .state = ARM_CP_STATE_AA64,
43
37
+ .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 0,
44
+typedef struct BCM283XInfo BCM283XInfo;
38
+ .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
45
+
39
+ { .name = "ATCR_EL3", .state = ARM_CP_STATE_AA64,
46
+typedef struct BCM283XClass {
40
+ .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 7, .opc2 = 0,
47
+ DeviceClass parent_class;
41
+ .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
48
+ const BCM283XInfo *info;
42
+ { .name = "ATCR_EL12", .state = ARM_CP_STATE_AA64,
49
+} BCM283XClass;
43
+ .opc0 = 3, .opc1 = 5, .crn = 15, .crm = 7, .opc2 = 0,
50
+
44
+ .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
51
+#define BCM283X_CLASS(klass) \
45
+ { .name = "AVTCR_EL2", .state = ARM_CP_STATE_AA64,
52
+ OBJECT_CLASS_CHECK(BCM283XClass, (klass), TYPE_BCM283X)
46
+ .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 1,
53
+#define BCM283X_GET_CLASS(obj) \
47
+ .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
54
+ OBJECT_GET_CLASS(BCM283XClass, (obj), TYPE_BCM283X)
48
+ { .name = "CPUACTLR_EL1", .state = ARM_CP_STATE_AA64,
55
+
49
+ .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 0,
56
#endif /* BCM2836_H */
50
+ .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
57
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
51
+ { .name = "CPUACTLR2_EL1", .state = ARM_CP_STATE_AA64,
58
index XXXXXXX..XXXXXXX 100644
52
+ .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 1,
59
--- a/hw/arm/bcm2836.c
53
+ .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
60
+++ b/hw/arm/bcm2836.c
54
+ { .name = "CPUACTLR3_EL1", .state = ARM_CP_STATE_AA64,
61
@@ -XXX,XX +XXX,XX @@
55
+ .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 2,
62
/* "QA7" (Pi2) interrupt controller and mailboxes etc. */
56
+ .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
63
#define BCM2836_CONTROL_BASE 0x40000000
57
+ /*
64
58
+ * Report CPUCFR_EL1.SCU as 1, as we do not implement the DSU
65
+struct BCM283XInfo {
59
+ * (and in particular its system registers).
66
+ const char *name;
60
+ */
61
+ { .name = "CPUCFR_EL1", .state = ARM_CP_STATE_AA64,
62
+ .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 0, .opc2 = 0,
63
+ .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 4 },
64
+ { .name = "CPUECTLR_EL1", .state = ARM_CP_STATE_AA64,
65
+ .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 4,
66
+ .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0x961563010 },
67
+ { .name = "CPUPCR_EL3", .state = ARM_CP_STATE_AA64,
68
+ .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 1,
69
+ .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
70
+ { .name = "CPUPMR_EL3", .state = ARM_CP_STATE_AA64,
71
+ .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 3,
72
+ .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
73
+ { .name = "CPUPOR_EL3", .state = ARM_CP_STATE_AA64,
74
+ .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 2,
75
+ .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
76
+ { .name = "CPUPSELR_EL3", .state = ARM_CP_STATE_AA64,
77
+ .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 0,
78
+ .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
79
+ { .name = "CPUPWRCTLR_EL1", .state = ARM_CP_STATE_AA64,
80
+ .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 7,
81
+ .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
82
+ { .name = "ERXPFGCDN_EL1", .state = ARM_CP_STATE_AA64,
83
+ .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 2,
84
+ .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
85
+ { .name = "ERXPFGCTL_EL1", .state = ARM_CP_STATE_AA64,
86
+ .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 1,
87
+ .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
88
+ { .name = "ERXPFGF_EL1", .state = ARM_CP_STATE_AA64,
89
+ .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 0,
90
+ .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
67
+};
91
+};
68
+
92
+
69
+static const BCM283XInfo bcm283x_socs[] = {
93
+static void define_neoverse_n1_cp_reginfo(ARMCPU *cpu)
70
+ {
94
+{
71
+ .name = TYPE_BCM2836,
95
+ define_arm_cp_regs(cpu, neoverse_n1_cp_reginfo);
72
+ },
96
+}
73
+ {
74
+ .name = TYPE_BCM2837,
75
+ },
76
+};
77
+
97
+
78
static void bcm2836_init(Object *obj)
98
static void aarch64_neoverse_n1_initfn(Object *obj)
79
{
99
{
80
BCM283XState *s = BCM283X(obj);
100
ARMCPU *cpu = ARM_CPU(obj);
81
@@ -XXX,XX +XXX,XX @@ static Property bcm2836_props[] = {
101
@@ -XXX,XX +XXX,XX @@ static void aarch64_neoverse_n1_initfn(Object *obj)
82
DEFINE_PROP_END_OF_LIST()
102
83
};
103
/* From D5.1 AArch64 PMU register summary */
84
104
cpu->isar.reset_pmcr_el0 = 0x410c3000;
85
-static void bcm2836_class_init(ObjectClass *oc, void *data)
105
+
86
+static void bcm283x_class_init(ObjectClass *oc, void *data)
106
+ define_neoverse_n1_cp_reginfo(cpu);
87
{
88
DeviceClass *dc = DEVICE_CLASS(oc);
89
+ BCM283XClass *bc = BCM283X_CLASS(oc);
90
91
- dc->props = bcm2836_props;
92
+ bc->info = data;
93
dc->realize = bcm2836_realize;
94
+ dc->props = bcm2836_props;
95
}
107
}
96
108
97
-static const TypeInfo bcm2836_type_info = {
109
static void aarch64_host_initfn(Object *obj)
98
+static const TypeInfo bcm283x_type_info = {
99
.name = TYPE_BCM283X,
100
.parent = TYPE_DEVICE,
101
.instance_size = sizeof(BCM283XState),
102
.instance_init = bcm2836_init,
103
- .class_init = bcm2836_class_init,
104
+ .class_size = sizeof(BCM283XClass),
105
+ .abstract = true,
106
};
107
108
static void bcm2836_register_types(void)
109
{
110
- type_register_static(&bcm2836_type_info);
111
+ int i;
112
+
113
+ type_register_static(&bcm283x_type_info);
114
+ for (i = 0; i < ARRAY_SIZE(bcm283x_socs); i++) {
115
+ TypeInfo ti = {
116
+ .name = bcm283x_socs[i].name,
117
+ .parent = TYPE_BCM283X,
118
+ .class_init = bcm283x_class_init,
119
+ .class_data = (void *) &bcm283x_socs[i],
120
+ };
121
+ type_register(&ti);
122
+ }
123
}
124
125
type_init(bcm2836_register_types)
126
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
127
index XXXXXXX..XXXXXXX 100644
128
--- a/hw/arm/raspi.c
129
+++ b/hw/arm/raspi.c
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
131
BusState *bus;
132
DeviceState *carddev;
133
134
- object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM283X);
135
+ object_initialize(&s->soc, sizeof(s->soc),
136
+ version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
137
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
138
&error_abort);
139
140
--
110
--
141
2.16.2
111
2.34.1
142
143
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
The cadence UART attempts to avoid allowing the guest to set invalid
2
baud rate register values in the uart_write() function. However it
3
does the "mask to the size of the register field" and "check for
4
invalid values" in the wrong order, which means that a malicious
5
guest can get a bogus value into the register by setting also some
6
high bits in the value, and cause QEMU to crash by division-by-zero.
2
7
3
Add support for "TX complete"/TXDC interrupt generate by real HW since
8
Do the mask before the bounds check instead of afterwards.
4
it is needed to support guests other than Linux.
5
9
6
Based on the patch by Bill Paul as found here:
10
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1493
7
https://bugs.launchpad.net/qemu/+bug/1753314
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Thomas Huth <thuth@redhat.com>
13
Reviewed-by: Edgar E. Iglesias <edgar@zeroasic.com>
14
Reviewed-by: Wilfred Mallawa <wilfred.mallawa@wdc.com>
15
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
16
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
17
Tested-by: Qiang Liu <cyruscyliu@gmail.com>
18
Message-id: 20230314170804.1196232-1-peter.maydell@linaro.org
19
---
20
hw/char/cadence_uart.c | 6 ++++--
21
1 file changed, 4 insertions(+), 2 deletions(-)
8
22
9
Cc: qemu-devel@nongnu.org
23
diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c
10
Cc: qemu-arm@nongnu.org
11
Cc: Bill Paul <wpaul@windriver.com>
12
Cc: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Bill Paul <wpaul@windriver.com>
14
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
15
Message-id: 20180315191141.6789-2-andrew.smirnov@gmail.com
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
19
include/hw/char/imx_serial.h | 3 +++
20
hw/char/imx_serial.c | 20 +++++++++++++++++---
21
2 files changed, 20 insertions(+), 3 deletions(-)
22
23
diff --git a/include/hw/char/imx_serial.h b/include/hw/char/imx_serial.h
24
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/char/imx_serial.h
25
--- a/hw/char/cadence_uart.c
26
+++ b/include/hw/char/imx_serial.h
26
+++ b/hw/char/cadence_uart.c
27
@@ -XXX,XX +XXX,XX @@
27
@@ -XXX,XX +XXX,XX @@ static MemTxResult uart_write(void *opaque, hwaddr offset,
28
#define UCR2_RXEN (1<<1) /* Receiver enable */
29
#define UCR2_SRST (1<<0) /* Reset complete */
30
31
+#define UCR4_TCEN BIT(3) /* TX complete interrupt enable */
32
+
33
#define UTS1_TXEMPTY (1<<6)
34
#define UTS1_RXEMPTY (1<<5)
35
#define UTS1_TXFULL (1<<4)
36
@@ -XXX,XX +XXX,XX @@ typedef struct IMXSerialState {
37
uint32_t ubmr;
38
uint32_t ubrc;
39
uint32_t ucr3;
40
+ uint32_t ucr4;
41
42
qemu_irq irq;
43
CharBackend chr;
44
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/char/imx_serial.c
47
+++ b/hw/char/imx_serial.c
48
@@ -XXX,XX +XXX,XX @@
49
50
static const VMStateDescription vmstate_imx_serial = {
51
.name = TYPE_IMX_SERIAL,
52
- .version_id = 1,
53
- .minimum_version_id = 1,
54
+ .version_id = 2,
55
+ .minimum_version_id = 2,
56
.fields = (VMStateField[]) {
57
VMSTATE_INT32(readbuff, IMXSerialState),
58
VMSTATE_UINT32(usr1, IMXSerialState),
59
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
60
VMSTATE_UINT32(ubmr, IMXSerialState),
61
VMSTATE_UINT32(ubrc, IMXSerialState),
62
VMSTATE_UINT32(ucr3, IMXSerialState),
63
+ VMSTATE_UINT32(ucr4, IMXSerialState),
64
VMSTATE_END_OF_LIST()
65
},
66
};
67
@@ -XXX,XX +XXX,XX @@ static void imx_update(IMXSerialState *s)
68
* unfortunately.
69
*/
70
mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
71
+ /*
72
+ * TCEN and TXDC are both bit 3
73
+ */
74
+ mask |= s->ucr4 & UCR4_TCEN;
75
+
76
usr2 = s->usr2 & mask;
77
78
qemu_set_irq(s->irq, usr1 || usr2);
79
@@ -XXX,XX +XXX,XX @@ static uint64_t imx_serial_read(void *opaque, hwaddr offset,
80
return s->ucr3;
81
82
case 0x23: /* UCR4 */
83
+ return s->ucr4;
84
+
85
case 0x29: /* BRM Incremental */
86
return 0x0; /* TODO */
87
88
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
89
* qemu_chr_fe_write and background I/O callbacks */
90
qemu_chr_fe_write_all(&s->chr, &ch, 1);
91
s->usr1 &= ~USR1_TRDY;
92
+ s->usr2 &= ~USR2_TXDC;
93
imx_update(s);
94
s->usr1 |= USR1_TRDY;
95
+ s->usr2 |= USR2_TXDC;
96
imx_update(s);
97
}
28
}
98
break;
29
break;
99
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
30
case R_BRGR: /* Baud rate generator */
100
s->ucr3 = value & 0xffff;
31
+ value &= 0xffff;
32
if (value >= 0x01) {
33
- s->r[offset] = value & 0xFFFF;
34
+ s->r[offset] = value;
35
}
101
break;
36
break;
102
37
case R_BDIV: /* Baud rate divider */
103
- case 0x2d: /* UTS1 */
38
+ value &= 0xff;
104
case 0x23: /* UCR4 */
39
if (value >= 0x04) {
105
+ s->ucr4 = value & 0xffff;
40
- s->r[offset] = value & 0xFF;
106
+ imx_update(s);
41
+ s->r[offset] = value;
107
+ break;
42
}
108
+
43
break;
109
+ case 0x2d: /* UTS1 */
44
default:
110
qemu_log_mask(LOG_UNIMP, "[%s]%s: Unimplemented reg 0x%"
111
HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
112
/* TODO */
113
--
45
--
114
2.16.2
46
2.34.1
115
47
116
48
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Viktor Prutyanov <viktor@daynix.com>
2
2
3
Code of imx_update() is slightly confusing since the "flags" variable
3
Originally elf2dmp were added with some code style issues,
4
doesn't really corespond to anything in real hardware and server as a
4
especially in pe.h header, and some were introduced by
5
kitchensink accumulating events normally reported via USR1 and USR2
5
2d0fc797faaa73fbc1d30f5f9e90407bf3dd93f0. Fix them now.
6
registers.
7
6
8
Change the code to explicitly evaluate state of interrupts reported
7
Signed-off-by: Viktor Prutyanov <viktor@daynix.com>
9
via USR1 and USR2 against corresponding masking bits and use the to
8
Reviewed-by: Annie Li <annie.li@oracle.com>
10
detemine if IRQ line should be asserted or not.
9
Message-id: 20230222211246.883679-2-viktor@daynix.com
11
12
NOTE: Check for UTS1_TXEMPTY being set has been dropped for two
13
reasons:
14
15
1. Emulation code implements a single character FIFO, so this flag
16
will always be set since characters are trasmitted as a part of
17
the code emulating "push" into the FIFO
18
19
2. imx_update() is really just a function doing ORing and maksing
20
of reported events, so checking for UTS1_TXEMPTY should happen,
21
if it's ever really needed should probably happen outside of
22
it.
23
24
Cc: qemu-devel@nongnu.org
25
Cc: qemu-arm@nongnu.org
26
Cc: Bill Paul <wpaul@windriver.com>
27
Cc: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
29
Message-id: 20180315191141.6789-1-andrew.smirnov@gmail.com
30
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
---
11
---
33
hw/char/imx_serial.c | 24 ++++++++++++++++--------
12
contrib/elf2dmp/pe.h | 100 ++++++++++++++++++------------------
34
1 file changed, 16 insertions(+), 8 deletions(-)
13
contrib/elf2dmp/addrspace.c | 1 +
14
contrib/elf2dmp/main.c | 9 ++--
15
3 files changed, 57 insertions(+), 53 deletions(-)
35
16
36
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
17
diff --git a/contrib/elf2dmp/pe.h b/contrib/elf2dmp/pe.h
37
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/char/imx_serial.c
19
--- a/contrib/elf2dmp/pe.h
39
+++ b/hw/char/imx_serial.c
20
+++ b/contrib/elf2dmp/pe.h
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
21
@@ -XXX,XX +XXX,XX @@ typedef struct IMAGE_DOS_HEADER {
41
22
} __attribute__ ((packed)) IMAGE_DOS_HEADER;
42
static void imx_update(IMXSerialState *s)
23
24
typedef struct IMAGE_FILE_HEADER {
25
- uint16_t Machine;
26
- uint16_t NumberOfSections;
27
- uint32_t TimeDateStamp;
28
- uint32_t PointerToSymbolTable;
29
- uint32_t NumberOfSymbols;
30
- uint16_t SizeOfOptionalHeader;
31
- uint16_t Characteristics;
32
+ uint16_t Machine;
33
+ uint16_t NumberOfSections;
34
+ uint32_t TimeDateStamp;
35
+ uint32_t PointerToSymbolTable;
36
+ uint32_t NumberOfSymbols;
37
+ uint16_t SizeOfOptionalHeader;
38
+ uint16_t Characteristics;
39
} __attribute__ ((packed)) IMAGE_FILE_HEADER;
40
41
typedef struct IMAGE_DATA_DIRECTORY {
42
- uint32_t VirtualAddress;
43
- uint32_t Size;
44
+ uint32_t VirtualAddress;
45
+ uint32_t Size;
46
} __attribute__ ((packed)) IMAGE_DATA_DIRECTORY;
47
48
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
49
50
typedef struct IMAGE_OPTIONAL_HEADER64 {
51
- uint16_t Magic; /* 0x20b */
52
- uint8_t MajorLinkerVersion;
53
- uint8_t MinorLinkerVersion;
54
- uint32_t SizeOfCode;
55
- uint32_t SizeOfInitializedData;
56
- uint32_t SizeOfUninitializedData;
57
- uint32_t AddressOfEntryPoint;
58
- uint32_t BaseOfCode;
59
- uint64_t ImageBase;
60
- uint32_t SectionAlignment;
61
- uint32_t FileAlignment;
62
- uint16_t MajorOperatingSystemVersion;
63
- uint16_t MinorOperatingSystemVersion;
64
- uint16_t MajorImageVersion;
65
- uint16_t MinorImageVersion;
66
- uint16_t MajorSubsystemVersion;
67
- uint16_t MinorSubsystemVersion;
68
- uint32_t Win32VersionValue;
69
- uint32_t SizeOfImage;
70
- uint32_t SizeOfHeaders;
71
- uint32_t CheckSum;
72
- uint16_t Subsystem;
73
- uint16_t DllCharacteristics;
74
- uint64_t SizeOfStackReserve;
75
- uint64_t SizeOfStackCommit;
76
- uint64_t SizeOfHeapReserve;
77
- uint64_t SizeOfHeapCommit;
78
- uint32_t LoaderFlags;
79
- uint32_t NumberOfRvaAndSizes;
80
- IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
81
+ uint16_t Magic; /* 0x20b */
82
+ uint8_t MajorLinkerVersion;
83
+ uint8_t MinorLinkerVersion;
84
+ uint32_t SizeOfCode;
85
+ uint32_t SizeOfInitializedData;
86
+ uint32_t SizeOfUninitializedData;
87
+ uint32_t AddressOfEntryPoint;
88
+ uint32_t BaseOfCode;
89
+ uint64_t ImageBase;
90
+ uint32_t SectionAlignment;
91
+ uint32_t FileAlignment;
92
+ uint16_t MajorOperatingSystemVersion;
93
+ uint16_t MinorOperatingSystemVersion;
94
+ uint16_t MajorImageVersion;
95
+ uint16_t MinorImageVersion;
96
+ uint16_t MajorSubsystemVersion;
97
+ uint16_t MinorSubsystemVersion;
98
+ uint32_t Win32VersionValue;
99
+ uint32_t SizeOfImage;
100
+ uint32_t SizeOfHeaders;
101
+ uint32_t CheckSum;
102
+ uint16_t Subsystem;
103
+ uint16_t DllCharacteristics;
104
+ uint64_t SizeOfStackReserve;
105
+ uint64_t SizeOfStackCommit;
106
+ uint64_t SizeOfHeapReserve;
107
+ uint64_t SizeOfHeapCommit;
108
+ uint32_t LoaderFlags;
109
+ uint32_t NumberOfRvaAndSizes;
110
+ IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
111
} __attribute__ ((packed)) IMAGE_OPTIONAL_HEADER64;
112
113
typedef struct IMAGE_NT_HEADERS64 {
114
- uint32_t Signature;
115
- IMAGE_FILE_HEADER FileHeader;
116
- IMAGE_OPTIONAL_HEADER64 OptionalHeader;
117
+ uint32_t Signature;
118
+ IMAGE_FILE_HEADER FileHeader;
119
+ IMAGE_OPTIONAL_HEADER64 OptionalHeader;
120
} __attribute__ ((packed)) IMAGE_NT_HEADERS64;
121
122
typedef struct IMAGE_DEBUG_DIRECTORY {
123
- uint32_t Characteristics;
124
- uint32_t TimeDateStamp;
125
- uint16_t MajorVersion;
126
- uint16_t MinorVersion;
127
- uint32_t Type;
128
- uint32_t SizeOfData;
129
- uint32_t AddressOfRawData;
130
- uint32_t PointerToRawData;
131
+ uint32_t Characteristics;
132
+ uint32_t TimeDateStamp;
133
+ uint16_t MajorVersion;
134
+ uint16_t MinorVersion;
135
+ uint32_t Type;
136
+ uint32_t SizeOfData;
137
+ uint32_t AddressOfRawData;
138
+ uint32_t PointerToRawData;
139
} __attribute__ ((packed)) IMAGE_DEBUG_DIRECTORY;
140
141
#define IMAGE_DEBUG_TYPE_CODEVIEW 2
142
diff --git a/contrib/elf2dmp/addrspace.c b/contrib/elf2dmp/addrspace.c
143
index XXXXXXX..XXXXXXX 100644
144
--- a/contrib/elf2dmp/addrspace.c
145
+++ b/contrib/elf2dmp/addrspace.c
146
@@ -XXX,XX +XXX,XX @@
147
static struct pa_block *pa_space_find_block(struct pa_space *ps, uint64_t pa)
43
{
148
{
44
- uint32_t flags;
149
size_t i;
45
+ uint32_t usr1;
150
+
46
+ uint32_t usr2;
151
for (i = 0; i < ps->block_nr; i++) {
47
+ uint32_t mask;
152
if (ps->block[i].paddr <= pa &&
48
153
pa <= ps->block[i].paddr + ps->block[i].size) {
49
- flags = (s->usr1 & s->ucr1) & (USR1_TRDY|USR1_RRDY);
154
diff --git a/contrib/elf2dmp/main.c b/contrib/elf2dmp/main.c
50
- if (s->ucr1 & UCR1_TXMPTYEN) {
155
index XXXXXXX..XXXXXXX 100644
51
- flags |= (s->uts1 & UTS1_TXEMPTY);
156
--- a/contrib/elf2dmp/main.c
52
- } else {
157
+++ b/contrib/elf2dmp/main.c
53
- flags &= ~USR1_TRDY;
158
@@ -XXX,XX +XXX,XX @@ static int fill_header(WinDumpHeader64 *hdr, struct pa_space *ps,
54
- }
159
};
55
+ /*
160
56
+ * Lucky for us TRDY and RRDY has the same offset in both USR1 and
161
for (i = 0; i < ps->block_nr; i++) {
57
+ * UCR1, so we can get away with something as simple as the
162
- h.PhysicalMemoryBlock.NumberOfPages += ps->block[i].size / ELF2DMP_PAGE_SIZE;
58
+ * following:
163
+ h.PhysicalMemoryBlock.NumberOfPages +=
59
+ */
164
+ ps->block[i].size / ELF2DMP_PAGE_SIZE;
60
+ usr1 = s->usr1 & s->ucr1 & (USR1_TRDY | USR1_RRDY);
165
h.PhysicalMemoryBlock.Run[i] = (WinDumpPhyMemRun64) {
61
+ /*
166
.BasePage = ps->block[i].paddr / ELF2DMP_PAGE_SIZE,
62
+ * Bits that we want in USR2 are not as conveniently laid out,
167
.PageCount = ps->block[i].size / ELF2DMP_PAGE_SIZE,
63
+ * unfortunately.
168
};
64
+ */
169
}
65
+ mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
170
66
+ usr2 = s->usr2 & mask;
171
- h.RequiredDumpSpace += h.PhysicalMemoryBlock.NumberOfPages << ELF2DMP_PAGE_BITS;
67
172
+ h.RequiredDumpSpace +=
68
- qemu_set_irq(s->irq, !!flags);
173
+ h.PhysicalMemoryBlock.NumberOfPages << ELF2DMP_PAGE_BITS;
69
+ qemu_set_irq(s->irq, usr1 || usr2);
174
70
}
175
*hdr = h;
71
176
72
static void imx_serial_reset(IMXSerialState *s)
177
@@ -XXX,XX +XXX,XX @@ static int fill_header(WinDumpHeader64 *hdr, struct pa_space *ps,
178
static int fill_context(KDDEBUGGER_DATA64 *kdbg,
179
struct va_space *vs, QEMU_Elf *qe)
180
{
181
- int i;
182
+ int i;
183
+
184
for (i = 0; i < qe->state_nr; i++) {
185
uint64_t Prcb;
186
uint64_t Context;
73
--
187
--
74
2.16.2
188
2.34.1
75
76
diff view generated by jsdifflib
1
The raspi3 has AArch64 CPUs, which means that our smpboot
1
From: Viktor Prutyanov <viktor@daynix.com>
2
code for keeping the secondary CPUs in a pen needs to have
3
a version for A64 as well as A32. Without this, the
4
secondary CPUs go into an infinite loop of taking undefined
5
instruction exceptions.
6
2
3
Move out PE directory search functionality to be reused not only
4
for Debug Directory processing but for arbitrary PE directory.
5
6
Signed-off-by: Viktor Prutyanov <viktor@daynix.com>
7
Reviewed-by: Annie Li <annie.li@oracle.com>
8
Message-id: 20230222211246.883679-3-viktor@daynix.com
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20180313153458.26822-10-peter.maydell@linaro.org
10
---
10
---
11
hw/arm/raspi.c | 41 ++++++++++++++++++++++++++++++++++++++++-
11
contrib/elf2dmp/main.c | 71 +++++++++++++++++++++++++-----------------
12
1 file changed, 40 insertions(+), 1 deletion(-)
12
1 file changed, 42 insertions(+), 29 deletions(-)
13
13
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
14
diff --git a/contrib/elf2dmp/main.c b/contrib/elf2dmp/main.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
16
--- a/contrib/elf2dmp/main.c
17
+++ b/hw/arm/raspi.c
17
+++ b/contrib/elf2dmp/main.c
18
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ static int fill_context(KDDEBUGGER_DATA64 *kdbg,
19
#define BOARDSETUP_ADDR (MVBAR_ADDR + 0x20) /* board setup code */
19
return 0;
20
#define FIRMWARE_ADDR_2 0x8000 /* Pi 2 loads kernel.img here by default */
21
#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
22
+#define SPINTABLE_ADDR 0xd8 /* Pi 3 bootloader spintable */
23
24
/* Table of Linux board IDs for different Pi versions */
25
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
26
@@ -XXX,XX +XXX,XX @@ static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
27
info->smp_loader_start);
28
}
20
}
29
21
30
+static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
22
+static int pe_get_data_dir_entry(uint64_t base, void *start_addr, int idx,
23
+ void *entry, size_t size, struct va_space *vs)
31
+{
24
+{
32
+ /* Unlike the AArch32 version we don't need to call the board setup hook.
25
+ const char e_magic[2] = "MZ";
33
+ * The mechanism for doing the spin-table is also entirely different.
26
+ const char Signature[4] = "PE\0\0";
34
+ * We must have four 64-bit fields at absolute addresses
27
+ IMAGE_DOS_HEADER *dos_hdr = start_addr;
35
+ * 0xd8, 0xe0, 0xe8, 0xf0 in RAM, which are the flag variables for
28
+ IMAGE_NT_HEADERS64 nt_hdrs;
36
+ * our CPUs, and which we must ensure are zero initialized before
29
+ IMAGE_FILE_HEADER *file_hdr = &nt_hdrs.FileHeader;
37
+ * the primary CPU goes into the kernel. We put these variables inside
30
+ IMAGE_OPTIONAL_HEADER64 *opt_hdr = &nt_hdrs.OptionalHeader;
38
+ * a rom blob, so that the reset for ROM contents zeroes them for us.
31
+ IMAGE_DATA_DIRECTORY *data_dir = nt_hdrs.OptionalHeader.DataDirectory;
39
+ */
40
+ static const uint32_t smpboot[] = {
41
+ 0xd2801b05, /* mov x5, 0xd8 */
42
+ 0xd53800a6, /* mrs x6, mpidr_el1 */
43
+ 0x924004c6, /* and x6, x6, #0x3 */
44
+ 0xd503205f, /* spin: wfe */
45
+ 0xf86678a4, /* ldr x4, [x5,x6,lsl #3] */
46
+ 0xb4ffffc4, /* cbz x4, spin */
47
+ 0xd2800000, /* mov x0, #0x0 */
48
+ 0xd2800001, /* mov x1, #0x0 */
49
+ 0xd2800002, /* mov x2, #0x0 */
50
+ 0xd2800003, /* mov x3, #0x0 */
51
+ 0xd61f0080, /* br x4 */
52
+ };
53
+
32
+
54
+ static const uint64_t spintables[] = {
33
+ QEMU_BUILD_BUG_ON(sizeof(*dos_hdr) >= ELF2DMP_PAGE_SIZE);
55
+ 0, 0, 0, 0
56
+ };
57
+
34
+
58
+ rom_add_blob_fixed("raspi_smpboot", smpboot, sizeof(smpboot),
35
+ if (memcmp(&dos_hdr->e_magic, e_magic, sizeof(e_magic))) {
59
+ info->smp_loader_start);
36
+ return 1;
60
+ rom_add_blob_fixed("raspi_spintables", spintables, sizeof(spintables),
37
+ }
61
+ SPINTABLE_ADDR);
38
+
39
+ if (va_space_rw(vs, base + dos_hdr->e_lfanew,
40
+ &nt_hdrs, sizeof(nt_hdrs), 0)) {
41
+ return 1;
42
+ }
43
+
44
+ if (memcmp(&nt_hdrs.Signature, Signature, sizeof(Signature)) ||
45
+ file_hdr->Machine != 0x8664 || opt_hdr->Magic != 0x020b) {
46
+ return 1;
47
+ }
48
+
49
+ if (va_space_rw(vs,
50
+ base + data_dir[idx].VirtualAddress,
51
+ entry, size, 0)) {
52
+ return 1;
53
+ }
54
+
55
+ printf("Data directory entry #%d: RVA = 0x%08"PRIx32"\n", idx,
56
+ (uint32_t)data_dir[idx].VirtualAddress);
57
+
58
+ return 0;
62
+}
59
+}
63
+
60
+
64
static void write_board_setup(ARMCPU *cpu, const struct arm_boot_info *info)
61
static int write_dump(struct pa_space *ps,
62
WinDumpHeader64 *hdr, const char *name)
65
{
63
{
66
arm_write_secure_board_setup_dummy_smc(cpu, info, MVBAR_ADDR);
64
@@ -XXX,XX +XXX,XX @@ static int write_dump(struct pa_space *ps,
67
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
65
static int pe_get_pdb_symstore_hash(uint64_t base, void *start_addr,
68
/* Pi2 and Pi3 requires SMP setup */
66
char *hash, struct va_space *vs)
69
if (version >= 2) {
67
{
70
binfo.smp_loader_start = SMPBOOT_ADDR;
68
- const char e_magic[2] = "MZ";
71
- binfo.write_secondary_boot = write_smpboot;
69
- const char Signature[4] = "PE\0\0";
72
+ if (version == 2) {
70
const char sign_rsds[4] = "RSDS";
73
+ binfo.write_secondary_boot = write_smpboot;
71
- IMAGE_DOS_HEADER *dos_hdr = start_addr;
74
+ } else {
72
- IMAGE_NT_HEADERS64 nt_hdrs;
75
+ binfo.write_secondary_boot = write_smpboot64;
73
- IMAGE_FILE_HEADER *file_hdr = &nt_hdrs.FileHeader;
76
+ }
74
- IMAGE_OPTIONAL_HEADER64 *opt_hdr = &nt_hdrs.OptionalHeader;
77
binfo.secondary_cpu_reset_hook = reset_secondary;
75
- IMAGE_DATA_DIRECTORY *data_dir = nt_hdrs.OptionalHeader.DataDirectory;
76
IMAGE_DEBUG_DIRECTORY debug_dir;
77
OMFSignatureRSDS rsds;
78
char *pdb_name;
79
size_t pdb_name_sz;
80
size_t i;
81
82
- QEMU_BUILD_BUG_ON(sizeof(*dos_hdr) >= ELF2DMP_PAGE_SIZE);
83
-
84
- if (memcmp(&dos_hdr->e_magic, e_magic, sizeof(e_magic))) {
85
- return 1;
86
- }
87
-
88
- if (va_space_rw(vs, base + dos_hdr->e_lfanew,
89
- &nt_hdrs, sizeof(nt_hdrs), 0)) {
90
- return 1;
91
- }
92
-
93
- if (memcmp(&nt_hdrs.Signature, Signature, sizeof(Signature)) ||
94
- file_hdr->Machine != 0x8664 || opt_hdr->Magic != 0x020b) {
95
- return 1;
96
- }
97
-
98
- printf("Debug Directory RVA = 0x%08"PRIx32"\n",
99
- (uint32_t)data_dir[IMAGE_FILE_DEBUG_DIRECTORY].VirtualAddress);
100
-
101
- if (va_space_rw(vs,
102
- base + data_dir[IMAGE_FILE_DEBUG_DIRECTORY].VirtualAddress,
103
- &debug_dir, sizeof(debug_dir), 0)) {
104
+ if (pe_get_data_dir_entry(base, start_addr, IMAGE_FILE_DEBUG_DIRECTORY,
105
+ &debug_dir, sizeof(debug_dir), vs)) {
106
+ eprintf("Failed to get Debug Directory\n");
107
return 1;
78
}
108
}
79
109
80
--
110
--
81
2.16.2
111
2.34.1
82
83
diff view generated by jsdifflib
1
Now we have separate types for BCM2386 and BCM2387, we might as well
1
From: Viktor Prutyanov <viktor@daynix.com>
2
just hard-code the CPU type they use rather than having it passed
3
through as an object property. This then lets us put the initialization
4
of the CPU object in init rather than realize.
5
2
6
Note that this change means that it's no longer possible on
3
Since its inception elf2dmp has checked MZ signatures within an
7
the command line to use -cpu to ask for a different kind of
4
address space above IDT[0] interrupt vector and took first PE image
8
CPU than the SoC supports. This was never a supported thing to
5
found as Windows Kernel.
9
do anyway; we were just not sanity-checking the command line.
6
But in Windows Server 2022 memory dump this address space range is
7
full of invalid PE fragments and the tool must check that PE image
8
is 'ntoskrnl.exe' actually.
9
So, introduce additional validation by checking image name from
10
Export Directory against 'ntoskrnl.exe'.
10
11
11
This does require us to only build the bcm2837 object on
12
Signed-off-by: Viktor Prutyanov <viktor@daynix.com>
12
TARGET_AARCH64 configs, since otherwise it won't instantiate
13
Tested-by: Yuri Benditovich <yuri.benditovich@daynix.com>
13
due to the missing cortex-a53 device and "make check" will fail.
14
Reviewed-by: Annie Li <annie.li@oracle.com>
15
Message-id: 20230222211246.883679-4-viktor@daynix.com
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
contrib/elf2dmp/pe.h | 15 +++++++++++++++
19
contrib/elf2dmp/main.c | 28 ++++++++++++++++++++++++++--
20
2 files changed, 41 insertions(+), 2 deletions(-)
14
21
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
diff --git a/contrib/elf2dmp/pe.h b/contrib/elf2dmp/pe.h
16
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-id: 20180313153458.26822-9-peter.maydell@linaro.org
19
---
20
hw/arm/bcm2836.c | 24 +++++++++++++++---------
21
hw/arm/raspi.c | 2 --
22
2 files changed, 15 insertions(+), 11 deletions(-)
23
24
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
25
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/bcm2836.c
24
--- a/contrib/elf2dmp/pe.h
27
+++ b/hw/arm/bcm2836.c
25
+++ b/contrib/elf2dmp/pe.h
26
@@ -XXX,XX +XXX,XX @@ typedef struct IMAGE_NT_HEADERS64 {
27
IMAGE_OPTIONAL_HEADER64 OptionalHeader;
28
} __attribute__ ((packed)) IMAGE_NT_HEADERS64;
29
30
+typedef struct IMAGE_EXPORT_DIRECTORY {
31
+ uint32_t Characteristics;
32
+ uint32_t TimeDateStamp;
33
+ uint16_t MajorVersion;
34
+ uint16_t MinorVersion;
35
+ uint32_t Name;
36
+ uint32_t Base;
37
+ uint32_t NumberOfFunctions;
38
+ uint32_t NumberOfNames;
39
+ uint32_t AddressOfFunctions;
40
+ uint32_t AddressOfNames;
41
+ uint32_t AddressOfNameOrdinals;
42
+} __attribute__ ((packed)) IMAGE_EXPORT_DIRECTORY;
43
+
44
typedef struct IMAGE_DEBUG_DIRECTORY {
45
uint32_t Characteristics;
46
uint32_t TimeDateStamp;
47
@@ -XXX,XX +XXX,XX @@ typedef struct IMAGE_DEBUG_DIRECTORY {
48
#define IMAGE_DEBUG_TYPE_CODEVIEW 2
49
#endif
50
51
+#define IMAGE_FILE_EXPORT_DIRECTORY 0
52
#define IMAGE_FILE_DEBUG_DIRECTORY 6
53
54
typedef struct guid_t {
55
diff --git a/contrib/elf2dmp/main.c b/contrib/elf2dmp/main.c
56
index XXXXXXX..XXXXXXX 100644
57
--- a/contrib/elf2dmp/main.c
58
+++ b/contrib/elf2dmp/main.c
28
@@ -XXX,XX +XXX,XX @@
59
@@ -XXX,XX +XXX,XX @@
29
60
30
struct BCM283XInfo {
61
#define SYM_URL_BASE "https://msdl.microsoft.com/download/symbols/"
31
const char *name;
62
#define PDB_NAME "ntkrnlmp.pdb"
32
+ const char *cpu_type;
63
+#define PE_NAME "ntoskrnl.exe"
33
int clusterid;
64
34
};
65
#define INITIAL_MXCSR 0x1f80
35
66
36
static const BCM283XInfo bcm283x_socs[] = {
67
@@ -XXX,XX +XXX,XX @@ static int write_dump(struct pa_space *ps,
37
{
68
return fclose(dmp_file);
38
.name = TYPE_BCM2836,
69
}
39
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a15"),
70
40
.clusterid = 0xf,
71
+static bool pe_check_export_name(uint64_t base, void *start_addr,
41
},
72
+ struct va_space *vs)
42
+#ifdef TARGET_AARCH64
73
+{
43
{
74
+ IMAGE_EXPORT_DIRECTORY export_dir;
44
.name = TYPE_BCM2837,
75
+ const char *pe_name;
45
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a53"),
76
+
46
.clusterid = 0x0,
77
+ if (pe_get_data_dir_entry(base, start_addr, IMAGE_FILE_EXPORT_DIRECTORY,
47
},
78
+ &export_dir, sizeof(export_dir), vs)) {
48
+#endif
79
+ return false;
49
};
80
+ }
50
81
+
51
static void bcm2836_init(Object *obj)
82
+ pe_name = va_space_resolve(vs, base + export_dir.Name);
83
+ if (!pe_name) {
84
+ return false;
85
+ }
86
+
87
+ return !strcmp(pe_name, PE_NAME);
88
+}
89
+
90
static int pe_get_pdb_symstore_hash(uint64_t base, void *start_addr,
91
char *hash, struct va_space *vs)
52
{
92
{
53
BCM283XState *s = BCM283X(obj);
93
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
54
+ BCM283XClass *bc = BCM283X_GET_CLASS(obj);
94
uint64_t KdDebuggerDataBlock;
55
+ const BCM283XInfo *info = bc->info;
95
KDDEBUGGER_DATA64 *kdbg;
56
+ int n;
96
uint64_t KdVersionBlock;
57
+
97
+ bool kernel_found = false;
58
+ for (n = 0; n < BCM283X_NCPUS; n++) {
98
59
+ object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
99
if (argc != 3) {
60
+ info->cpu_type);
100
eprintf("usage:\n\t%s elf_file dmp_file\n", argv[0]);
61
+ object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
101
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
62
+ &error_abort);
102
}
63
+ }
103
64
104
if (*(uint16_t *)nt_start_addr == 0x5a4d) { /* MZ */
65
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
105
- break;
66
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
106
+ if (pe_check_export_name(KernBase, nt_start_addr, &vs)) {
67
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
107
+ kernel_found = true;
68
108
+ break;
69
/* common peripherals from bcm2835 */
109
+ }
70
110
}
71
- obj = OBJECT(dev);
111
}
72
- for (n = 0; n < BCM283X_NCPUS; n++) {
112
73
- object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
113
- if (!nt_start_addr) {
74
- s->cpu_type);
114
+ if (!kernel_found) {
75
- object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
115
eprintf("Failed to find NT kernel image\n");
76
- &error_abort);
116
err = 1;
77
- }
117
goto out_ps;
78
-
79
obj = object_property_get_link(OBJECT(dev), "ram", &err);
80
if (obj == NULL) {
81
error_setg(errp, "%s: required ram link not found: %s",
82
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
83
}
84
85
static Property bcm2836_props[] = {
86
- DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
87
DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
88
BCM283X_NCPUS),
89
DEFINE_PROP_END_OF_LIST()
90
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
91
index XXXXXXX..XXXXXXX 100644
92
--- a/hw/arm/raspi.c
93
+++ b/hw/arm/raspi.c
94
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
95
/* Setup the SOC */
96
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram),
97
&error_abort);
98
- object_property_set_str(OBJECT(&s->soc), machine->cpu_type, "cpu-type",
99
- &error_abort);
100
object_property_set_int(OBJECT(&s->soc), smp_cpus, "enabled-cpus",
101
&error_abort);
102
int board_rev = version == 3 ? 0xa02082 : 0xa21041;
103
--
118
--
104
2.16.2
119
2.34.1
105
106
diff view generated by jsdifflib
1
From: Guenter Roeck <linux@roeck-us.net>
1
From: Guenter Roeck <linux@roeck-us.net>
2
2
3
The sabrelite machine model used by qemu-system-arm is based on the
3
The i.MX USB Phy driver does not check register ranges, resulting in out of
4
Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet
4
bounds accesses if an attempt is made to access non-existing PHY registers.
5
controller which is supported in QEMU using the imx_fec.c module
5
Add range check and conditionally report bad accesses to fix the problem.
6
(actually called imx.enet for this model.)
7
6
8
The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the
7
While at it, also conditionally log attempted writes to non-existing or
9
imx.enet device like this:
8
read-only registers.
10
9
11
#define FSL_IMX6_ENET_MAC_1588_IRQ 118
10
Reported-by: Qiang Liu <cyruscyliu@gmail.com>
12
#define FSL_IMX6_ENET_MAC_IRQ 119
13
14
According to https://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf,
15
page 225, in Table 3-1. ARM Cortex A9 domain interrupt summary,
16
interrupts are as follows.
17
18
150 ENET MAC 0 IRQ
19
151 ENET MAC 0 1588 Timer interrupt
20
21
where
22
23
150 - 32 == 118
24
151 - 32 == 119
25
26
In other words, the vector definitions in the fsl-imx6.h file are reversed.
27
28
Fixing the interrupts alone causes problems with older Linux kernels:
29
The Ethernet interface will fail to probe with Linux v4.9 and earlier.
30
Linux v4.1 and earlier will crash due to a bug in Ethernet driver probe
31
error handling. This is a Linux kernel problem, not a qemu problem:
32
the Linux kernel only worked by accident since it requested both interrupts.
33
34
For backward compatibility, generate the Ethernet interrupt on both interrupt
35
lines. This was shown to work from all Linux kernel releases starting with
36
v3.16.
37
38
Link: https://bugs.launchpad.net/qemu/+bug/1753309
39
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
11
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
40
Message-id: 1520723090-22130-1-git-send-email-linux@roeck-us.net
12
Tested-by: Qiang Liu <cyruscyliu@gmail.com>
13
Message-id: 20230316234926.208874-1-linux@roeck-us.net
14
Link: https://gitlab.com/qemu-project/qemu/-/issues/1408
15
Fixes: 0701a5efa015 ("hw/usb: Add basic i.MX USB Phy support")
16
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
41
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
19
---
44
include/hw/arm/fsl-imx6.h | 4 ++--
20
hw/usb/imx-usb-phy.c | 19 +++++++++++++++++--
45
hw/net/imx_fec.c | 28 +++++++++++++++++++++++++++-
21
1 file changed, 17 insertions(+), 2 deletions(-)
46
2 files changed, 29 insertions(+), 3 deletions(-)
47
22
48
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
23
diff --git a/hw/usb/imx-usb-phy.c b/hw/usb/imx-usb-phy.c
49
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/arm/fsl-imx6.h
25
--- a/hw/usb/imx-usb-phy.c
51
+++ b/include/hw/arm/fsl-imx6.h
26
+++ b/hw/usb/imx-usb-phy.c
52
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
27
@@ -XXX,XX +XXX,XX @@
53
#define FSL_IMX6_HDMI_MASTER_IRQ 115
28
#include "qemu/osdep.h"
54
#define FSL_IMX6_HDMI_CEC_IRQ 116
29
#include "hw/usb/imx-usb-phy.h"
55
#define FSL_IMX6_MLB150_LOW_IRQ 117
30
#include "migration/vmstate.h"
56
-#define FSL_IMX6_ENET_MAC_1588_IRQ 118
31
+#include "qemu/log.h"
57
-#define FSL_IMX6_ENET_MAC_IRQ 119
32
#include "qemu/module.h"
58
+#define FSL_IMX6_ENET_MAC_IRQ 118
33
59
+#define FSL_IMX6_ENET_MAC_1588_IRQ 119
34
static const VMStateDescription vmstate_imx_usbphy = {
60
#define FSL_IMX6_PCIE1_IRQ 120
35
@@ -XXX,XX +XXX,XX @@ static uint64_t imx_usbphy_read(void *opaque, hwaddr offset, unsigned size)
61
#define FSL_IMX6_PCIE2_IRQ 121
36
value = s->usbphy[index - 3];
62
#define FSL_IMX6_PCIE3_IRQ 122
37
break;
63
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
38
default:
64
index XXXXXXX..XXXXXXX 100644
39
- value = s->usbphy[index];
65
--- a/hw/net/imx_fec.c
40
+ if (index < USBPHY_MAX) {
66
+++ b/hw/net/imx_fec.c
41
+ value = s->usbphy[index];
67
@@ -XXX,XX +XXX,XX @@ static void imx_enet_write_bd(IMXENETBufDesc *bd, dma_addr_t addr)
42
+ } else {
68
43
+ qemu_log_mask(LOG_GUEST_ERROR,
69
static void imx_eth_update(IMXFECState *s)
44
+ "%s: Read from non-existing USB PHY register 0x%"
70
{
45
+ HWADDR_PRIx "\n",
71
- if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] & ENET_INT_TS_TIMER) {
46
+ __func__, offset);
72
+ /*
47
+ value = 0;
73
+ * Previous versions of qemu had the ENET_INT_MAC and ENET_INT_TS_TIMER
48
+ }
74
+ * interrupts swapped. This worked with older versions of Linux (4.14
49
break;
75
+ * and older) since Linux associated both interrupt lines with Ethernet
50
}
76
+ * MAC interrupts. Specifically,
51
return (uint64_t)value;
77
+ * - Linux 4.15 and later have separate interrupt handlers for the MAC and
52
@@ -XXX,XX +XXX,XX @@ static void imx_usbphy_write(void *opaque, hwaddr offset, uint64_t value,
78
+ * timer interrupts. Those versions of Linux fail with versions of QEMU
53
s->usbphy[index - 3] ^= value;
79
+ * with swapped interrupt assignments.
54
break;
80
+ * - In linux 4.14, both interrupt lines were registered with the Ethernet
55
default:
81
+ * MAC interrupt handler. As a result, all versions of qemu happen to
56
- /* Other registers are read-only */
82
+ * work, though that is accidental.
57
+ /* Other registers are read-only or do not exist */
83
+ * - In Linux 4.9 and older, the timer interrupt was registered directly
58
+ qemu_log_mask(LOG_GUEST_ERROR,
84
+ * with the Ethernet MAC interrupt handler. The MAC interrupt was
59
+ "%s: Write to %s USB PHY register 0x%"
85
+ * redirected to a GPIO interrupt to work around erratum ERR006687.
60
+ HWADDR_PRIx "\n",
86
+ * This was implemented using the SOC's IOMUX block. In qemu, this GPIO
61
+ __func__,
87
+ * interrupt never fired since IOMUX is currently not supported in qemu.
62
+ index >= USBPHY_MAX ? "non-existing" : "read-only",
88
+ * Linux instead received MAC interrupts on the timer interrupt.
63
+ offset);
89
+ * As a result, qemu versions with the swapped interrupt assignment work,
64
break;
90
+ * albeit accidentally, but qemu versions with the correct interrupt
65
}
91
+ * assignment fail.
66
}
92
+ *
93
+ * To ensure that all versions of Linux work, generate ENET_INT_MAC
94
+ * interrrupts on both interrupt lines. This should be changed if and when
95
+ * qemu supports IOMUX.
96
+ */
97
+ if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] &
98
+ (ENET_INT_MAC | ENET_INT_TS_TIMER)) {
99
qemu_set_irq(s->irq[1], 1);
100
} else {
101
qemu_set_irq(s->irq[1], 0);
102
--
67
--
103
2.16.2
68
2.34.1
104
105
diff view generated by jsdifflib
Deleted patch
1
From: Wei Huang <wei@redhat.com>
2
1
3
For guest kernel that supports KASLR, the load address can change every
4
time when guest VM runs. To find the physical base address correctly,
5
current QEMU dump searches VMCOREINFO for the string "NUMBER(phys_base)=".
6
However this string pattern is only available on x86_64. AArch64 uses a
7
different field, called "NUMBER(PHYS_OFFSET)=". This patch makes sure
8
QEMU dump uses the correct string on AArch64.
9
10
Signed-off-by: Wei Huang <wei@redhat.com>
11
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
12
Message-id: 1520615003-20869-1-git-send-email-wei@redhat.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
dump.c | 14 +++++++++++---
16
1 file changed, 11 insertions(+), 3 deletions(-)
17
18
diff --git a/dump.c b/dump.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/dump.c
21
+++ b/dump.c
22
@@ -XXX,XX +XXX,XX @@ static void vmcoreinfo_update_phys_base(DumpState *s)
23
24
lines = g_strsplit((char *)vmci, "\n", -1);
25
for (i = 0; lines[i]; i++) {
26
- if (g_str_has_prefix(lines[i], "NUMBER(phys_base)=")) {
27
- if (qemu_strtou64(lines[i] + 18, NULL, 16,
28
+ const char *prefix = NULL;
29
+
30
+ if (s->dump_info.d_machine == EM_X86_64) {
31
+ prefix = "NUMBER(phys_base)=";
32
+ } else if (s->dump_info.d_machine == EM_AARCH64) {
33
+ prefix = "NUMBER(PHYS_OFFSET)=";
34
+ }
35
+
36
+ if (prefix && g_str_has_prefix(lines[i], prefix)) {
37
+ if (qemu_strtou64(lines[i] + strlen(prefix), NULL, 16,
38
&phys_base) < 0) {
39
- warn_report("Failed to read NUMBER(phys_base)=");
40
+ warn_report("Failed to read %s", prefix);
41
} else {
42
s->dump_info.phys_base = phys_base;
43
}
44
--
45
2.16.2
46
47
diff view generated by jsdifflib
Deleted patch
1
For the rpi1 and 2 we want to boot the Linux kernel via some
2
custom setup code that makes sure that the SMC instruction
3
acts as a no-op, because it's used for cache maintenance.
4
The rpi3 boots AArch64 kernels, which don't need SMC for
5
cache maintenance and always expect to be booted non-secure.
6
Don't fill in the aarch32-specific parts of the binfo struct.
7
1
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20180313153458.26822-2-peter.maydell@linaro.org
12
---
13
hw/arm/raspi.c | 17 +++++++++++++----
14
1 file changed, 13 insertions(+), 4 deletions(-)
15
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
19
+++ b/hw/arm/raspi.c
20
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
21
binfo.board_id = raspi_boardid[version];
22
binfo.ram_size = ram_size;
23
binfo.nb_cpus = smp_cpus;
24
- binfo.board_setup_addr = BOARDSETUP_ADDR;
25
- binfo.write_board_setup = write_board_setup;
26
- binfo.secure_board_setup = true;
27
- binfo.secure_boot = true;
28
+
29
+ if (version <= 2) {
30
+ /* The rpi1 and 2 require some custom setup code to run in Secure
31
+ * mode before booting a kernel (to set up the SMC vectors so
32
+ * that we get a no-op SMC; this is used by Linux to call the
33
+ * firmware for some cache maintenance operations.
34
+ * The rpi3 doesn't need this.
35
+ */
36
+ binfo.board_setup_addr = BOARDSETUP_ADDR;
37
+ binfo.write_board_setup = write_board_setup;
38
+ binfo.secure_board_setup = true;
39
+ binfo.secure_boot = true;
40
+ }
41
42
/* Pi2 and Pi3 requires SMP setup */
43
if (version >= 2) {
44
--
45
2.16.2
46
47
diff view generated by jsdifflib
1
The BCM2837 sets the Aff1 field of the MPIDR affinity values for the
1
The markup for the Arm CPU feature documentation is incorrect,
2
CPUs to 0, whereas the BCM2836 uses 0xf. Set this correctly, as it
2
and results in the HTML not rendering correctly -- the first
3
is required for Linux to boot.
3
line of each description is rendered in boldface as if it
4
were part of the option name.
4
5
6
Reformat to match the styling used in cpu-models-x86.rst.inc.
7
8
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1479
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
10
Message-id: 20230316105808.1414003-1-peter.maydell@linaro.org
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
8
Message-id: 20180313153458.26822-8-peter.maydell@linaro.org
9
---
12
---
10
hw/arm/bcm2836.c | 11 +++++++----
13
docs/system/arm/cpu-features.rst | 68 ++++++++++++++------------------
11
1 file changed, 7 insertions(+), 4 deletions(-)
14
1 file changed, 30 insertions(+), 38 deletions(-)
12
15
13
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
16
diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst
14
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/bcm2836.c
18
--- a/docs/system/arm/cpu-features.rst
16
+++ b/hw/arm/bcm2836.c
19
+++ b/docs/system/arm/cpu-features.rst
17
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ are named with the prefix "kvm-". KVM VCPU features may be probed,
18
21
enabled, and disabled in the same way as other CPU features. Below is
19
struct BCM283XInfo {
22
the list of KVM VCPU features and their descriptions.
20
const char *name;
23
21
+ int clusterid;
24
- kvm-no-adjvtime By default kvm-no-adjvtime is disabled. This
22
};
25
- means that by default the virtual time
23
26
- adjustment is enabled (vtime is not *not*
24
static const BCM283XInfo bcm283x_socs[] = {
27
- adjusted).
25
{
28
+``kvm-no-adjvtime``
26
.name = TYPE_BCM2836,
29
+ By default kvm-no-adjvtime is disabled. This means that by default
27
+ .clusterid = 0xf,
30
+ the virtual time adjustment is enabled (vtime is not *not* adjusted).
28
},
31
29
{
32
- When virtual time adjustment is enabled each
30
.name = TYPE_BCM2837,
33
- time the VM transitions back to running state
31
+ .clusterid = 0x0,
34
- the VCPU's virtual counter is updated to ensure
32
},
35
- stopped time is not counted. This avoids time
33
};
36
- jumps surprising guest OSes and applications,
34
37
- as long as they use the virtual counter for
35
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
38
- timekeeping. However it has the side effect of
36
static void bcm2836_realize(DeviceState *dev, Error **errp)
39
- the virtual and physical counters diverging.
37
{
40
- All timekeeping based on the virtual counter
38
BCM283XState *s = BCM283X(dev);
41
- will appear to lag behind any timekeeping that
39
+ BCM283XClass *bc = BCM283X_GET_CLASS(dev);
42
- does not subtract VM stopped time. The guest
40
+ const BCM283XInfo *info = bc->info;
43
- may resynchronize its virtual counter with
41
Object *obj;
44
- other time sources as needed.
42
Error *err = NULL;
45
+ When virtual time adjustment is enabled each time the VM transitions
43
int n;
46
+ back to running state the VCPU's virtual counter is updated to
44
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
47
+ ensure stopped time is not counted. This avoids time jumps
45
qdev_get_gpio_in_named(DEVICE(&s->control), "gpu-fiq", 0));
48
+ surprising guest OSes and applications, as long as they use the
46
49
+ virtual counter for timekeeping. However it has the side effect of
47
for (n = 0; n < BCM283X_NCPUS; n++) {
50
+ the virtual and physical counters diverging. All timekeeping based
48
- /* Mirror bcm2836, which has clusterid set to 0xf
51
+ on the virtual counter will appear to lag behind any timekeeping
49
- * TODO: this should be converted to a property of ARM_CPU
52
+ that does not subtract VM stopped time. The guest may resynchronize
50
- */
53
+ its virtual counter with other time sources as needed.
51
- s->cpus[n].mp_affinity = 0xF00 | n;
54
52
+ /* TODO: this should be converted to a property of ARM_CPU */
55
- Enable kvm-no-adjvtime to disable virtual time
53
+ s->cpus[n].mp_affinity = (info->clusterid << 8) | n;
56
- adjustment, also restoring the legacy (pre-5.0)
54
57
- behavior.
55
/* set periphbase/CBAR value for CPU-local registers */
58
+ Enable kvm-no-adjvtime to disable virtual time adjustment, also
56
object_property_set_int(OBJECT(&s->cpus[n]),
59
+ restoring the legacy (pre-5.0) behavior.
60
61
- kvm-steal-time Since v5.2, kvm-steal-time is enabled by
62
- default when KVM is enabled, the feature is
63
- supported, and the guest is 64-bit.
64
+``kvm-steal-time``
65
+ Since v5.2, kvm-steal-time is enabled by default when KVM is
66
+ enabled, the feature is supported, and the guest is 64-bit.
67
68
- When kvm-steal-time is enabled a 64-bit guest
69
- can account for time its CPUs were not running
70
- due to the host not scheduling the corresponding
71
- VCPU threads. The accounting statistics may
72
- influence the guest scheduler behavior and/or be
73
- exposed to the guest userspace.
74
+ When kvm-steal-time is enabled a 64-bit guest can account for time
75
+ its CPUs were not running due to the host not scheduling the
76
+ corresponding VCPU threads. The accounting statistics may influence
77
+ the guest scheduler behavior and/or be exposed to the guest
78
+ userspace.
79
80
TCG VCPU Features
81
=================
82
@@ -XXX,XX +XXX,XX @@ TCG VCPU Features
83
TCG VCPU features are CPU features that are specific to TCG.
84
Below is the list of TCG VCPU features and their descriptions.
85
86
- pauth-impdef When ``FEAT_Pauth`` is enabled, either the
87
- *impdef* (Implementation Defined) algorithm
88
- is enabled or the *architected* QARMA algorithm
89
- is enabled. By default the impdef algorithm
90
- is disabled, and QARMA is enabled.
91
+``pauth-impdef``
92
+ When ``FEAT_Pauth`` is enabled, either the *impdef* (Implementation
93
+ Defined) algorithm is enabled or the *architected* QARMA algorithm
94
+ is enabled. By default the impdef algorithm is disabled, and QARMA
95
+ is enabled.
96
97
- The architected QARMA algorithm has good
98
- cryptographic properties, but can be quite slow
99
- to emulate. The impdef algorithm used by QEMU
100
- is non-cryptographic but significantly faster.
101
+ The architected QARMA algorithm has good cryptographic properties,
102
+ but can be quite slow to emulate. The impdef algorithm used by QEMU
103
+ is non-cryptographic but significantly faster.
104
105
SVE CPU Properties
106
==================
57
--
107
--
58
2.16.2
108
2.34.1
59
60
diff view generated by jsdifflib
1
Add some assertions that if we're about to boot an AArch64 kernel,
1
Unfortunately a bug in older versions of gdb means that they will
2
the board code has not mistakenly set either secure_boot or
2
crash if QEMU sends them the aarch64-pauth.xml. This bug is fixed in
3
secure_board_setup. It doesn't make sense to set secure_boot,
3
gdb commit 1ba3a3222039eb25, and there are plans to backport that to
4
because all AArch64 kernels must be booted in non-secure mode.
4
affected gdb release branches, but since the bug affects gdb 9
5
through 12 it is very widely deployed (for instance by distros).
5
6
6
It might in theory make sense to set secure_board_setup, but
7
It is not currently clear what the best way to deal with this is; it
7
we don't currently support that, because only the AArch32
8
has been proposed to define a new XML feature name that old gdb will
8
bootloader[] code calls this hook; bootloader_aarch64[] does not.
9
ignore but newer gdb can handle. Since QEMU's 8.0 release is
9
Since we don't have a current need for this functionality, just
10
imminent and at least one of our CI runners is now falling over this,
10
assert that we don't try to use it. If it's needed we'll add
11
disable the pauth XML for the moment. We can follow up with a more
11
it later.
12
considered fix either in time for 8.0 or else for the 8.1 release.
12
13
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20180313153458.26822-3-peter.maydell@linaro.org
16
---
15
---
17
hw/arm/boot.c | 7 +++++++
16
target/arm/gdbstub.c | 7 +++++++
18
1 file changed, 7 insertions(+)
17
1 file changed, 7 insertions(+)
19
18
20
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
19
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
21
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/boot.c
21
--- a/target/arm/gdbstub.c
23
+++ b/hw/arm/boot.c
22
+++ b/target/arm/gdbstub.c
24
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
23
@@ -XXX,XX +XXX,XX @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
25
} else {
24
aarch64_gdb_set_fpu_reg,
26
env->pstate = PSTATE_MODE_EL1h;
25
34, "aarch64-fpu.xml", 0);
27
}
26
}
28
+ /* AArch64 kernels never boot in secure mode */
27
+#if 0
29
+ assert(!info->secure_boot);
28
+ /*
30
+ /* This hook is only supported for AArch32 currently:
29
+ * GDB versions 9 through 12 have a bug which means they will
31
+ * bootloader_aarch64[] will not call the hook, and
30
+ * crash if they see this XML from QEMU; disable it for the 8.0
32
+ * the code above has already dropped us into EL2 or EL1.
31
+ * release, pending a better solution.
33
+ */
32
+ */
34
+ assert(!info->secure_board_setup);
33
if (isar_feature_aa64_pauth(&cpu->isar)) {
35
}
34
gdb_register_coprocessor(cs, aarch64_gdb_get_pauth_reg,
36
35
aarch64_gdb_set_pauth_reg,
37
/* Set to non-secure if not a secure boot */
36
4, "aarch64-pauth.xml", 0);
37
}
38
+#endif
39
#endif
40
} else {
41
if (arm_feature(env, ARM_FEATURE_NEON)) {
38
--
42
--
39
2.16.2
43
2.34.1
40
41
diff view generated by jsdifflib
Deleted patch
1
If we're directly booting a Linux kernel and the CPU supports both
2
EL3 and EL2, we start the kernel in EL2, as it expects. We must also
3
set the SCR_EL3.HCE bit in this situation, so that the HVC
4
instruction is enabled rather than UNDEFing. Otherwise at least some
5
kernels will panic when trying to initialize KVM in the guest.
6
1
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20180313153458.26822-4-peter.maydell@linaro.org
9
---
10
hw/arm/boot.c | 5 +++++
11
1 file changed, 5 insertions(+)
12
13
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/boot.c
16
+++ b/hw/arm/boot.c
17
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
18
assert(!info->secure_board_setup);
19
}
20
21
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
22
+ /* If we have EL2 then Linux expects the HVC insn to work */
23
+ env->cp15.scr_el3 |= SCR_HCE;
24
+ }
25
+
26
/* Set to non-secure if not a secure boot */
27
if (!info->secure_boot &&
28
(cs != first_cpu || !info->secure_board_setup)) {
29
--
30
2.16.2
31
32
diff view generated by jsdifflib
Deleted patch
1
The TypeInfo and state struct for bcm2386 disagree about what the
2
parent class is -- the TypeInfo says it's TYPE_SYS_BUS_DEVICE,
3
but the BCM2386State struct only defines the parent_obj field
4
as DeviceState. This would have caused problems if anything
5
actually tried to treat the object as a TYPE_SYS_BUS_DEVICE.
6
Fix the TypeInfo to use TYPE_DEVICE as the parent, since we don't
7
need any of the additional functionality TYPE_SYS_BUS_DEVICE
8
provides.
9
1
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180313153458.26822-5-peter.maydell@linaro.org
14
---
15
hw/arm/bcm2836.c | 2 +-
16
1 file changed, 1 insertion(+), 1 deletion(-)
17
18
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/bcm2836.c
21
+++ b/hw/arm/bcm2836.c
22
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
23
24
static const TypeInfo bcm2836_type_info = {
25
.name = TYPE_BCM2836,
26
- .parent = TYPE_SYS_BUS_DEVICE,
27
+ .parent = TYPE_DEVICE,
28
.instance_size = sizeof(BCM2836State),
29
.instance_init = bcm2836_init,
30
.class_init = bcm2836_class_init,
31
--
32
2.16.2
33
34
diff view generated by jsdifflib
Deleted patch
1
Our BCM2836 type is really a generic one that can be any of
2
the bcm283x family. Rename it accordingly. We change only
3
the names which are visible via the header file to the
4
rest of the QEMU code, leaving private function names
5
in bcm2836.c as they are.
6
1
7
This is a preliminary to making bcm283x be an abstract
8
parent class to specific types for the bcm2836 and bcm2837.
9
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180313153458.26822-6-peter.maydell@linaro.org
14
---
15
include/hw/arm/bcm2836.h | 12 ++++++------
16
hw/arm/bcm2836.c | 17 +++++++++--------
17
hw/arm/raspi.c | 16 ++++++++--------
18
3 files changed, 23 insertions(+), 22 deletions(-)
19
20
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/arm/bcm2836.h
23
+++ b/include/hw/arm/bcm2836.h
24
@@ -XXX,XX +XXX,XX @@
25
#include "hw/arm/bcm2835_peripherals.h"
26
#include "hw/intc/bcm2836_control.h"
27
28
-#define TYPE_BCM2836 "bcm2836"
29
-#define BCM2836(obj) OBJECT_CHECK(BCM2836State, (obj), TYPE_BCM2836)
30
+#define TYPE_BCM283X "bcm283x"
31
+#define BCM283X(obj) OBJECT_CHECK(BCM283XState, (obj), TYPE_BCM283X)
32
33
-#define BCM2836_NCPUS 4
34
+#define BCM283X_NCPUS 4
35
36
-typedef struct BCM2836State {
37
+typedef struct BCM283XState {
38
/*< private >*/
39
DeviceState parent_obj;
40
/*< public >*/
41
@@ -XXX,XX +XXX,XX @@ typedef struct BCM2836State {
42
char *cpu_type;
43
uint32_t enabled_cpus;
44
45
- ARMCPU cpus[BCM2836_NCPUS];
46
+ ARMCPU cpus[BCM283X_NCPUS];
47
BCM2836ControlState control;
48
BCM2835PeripheralState peripherals;
49
-} BCM2836State;
50
+} BCM283XState;
51
52
#endif /* BCM2836_H */
53
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/arm/bcm2836.c
56
+++ b/hw/arm/bcm2836.c
57
@@ -XXX,XX +XXX,XX @@
58
59
static void bcm2836_init(Object *obj)
60
{
61
- BCM2836State *s = BCM2836(obj);
62
+ BCM283XState *s = BCM283X(obj);
63
64
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
65
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
66
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
67
68
static void bcm2836_realize(DeviceState *dev, Error **errp)
69
{
70
- BCM2836State *s = BCM2836(dev);
71
+ BCM283XState *s = BCM283X(dev);
72
Object *obj;
73
Error *err = NULL;
74
int n;
75
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
76
/* common peripherals from bcm2835 */
77
78
obj = OBJECT(dev);
79
- for (n = 0; n < BCM2836_NCPUS; n++) {
80
+ for (n = 0; n < BCM283X_NCPUS; n++) {
81
object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
82
s->cpu_type);
83
object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
84
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
85
sysbus_connect_irq(SYS_BUS_DEVICE(&s->peripherals), 1,
86
qdev_get_gpio_in_named(DEVICE(&s->control), "gpu-fiq", 0));
87
88
- for (n = 0; n < BCM2836_NCPUS; n++) {
89
+ for (n = 0; n < BCM283X_NCPUS; n++) {
90
/* Mirror bcm2836, which has clusterid set to 0xf
91
* TODO: this should be converted to a property of ARM_CPU
92
*/
93
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
94
}
95
96
static Property bcm2836_props[] = {
97
- DEFINE_PROP_STRING("cpu-type", BCM2836State, cpu_type),
98
- DEFINE_PROP_UINT32("enabled-cpus", BCM2836State, enabled_cpus, BCM2836_NCPUS),
99
+ DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
100
+ DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
101
+ BCM283X_NCPUS),
102
DEFINE_PROP_END_OF_LIST()
103
};
104
105
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
106
}
107
108
static const TypeInfo bcm2836_type_info = {
109
- .name = TYPE_BCM2836,
110
+ .name = TYPE_BCM283X,
111
.parent = TYPE_DEVICE,
112
- .instance_size = sizeof(BCM2836State),
113
+ .instance_size = sizeof(BCM283XState),
114
.instance_init = bcm2836_init,
115
.class_init = bcm2836_class_init,
116
};
117
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
118
index XXXXXXX..XXXXXXX 100644
119
--- a/hw/arm/raspi.c
120
+++ b/hw/arm/raspi.c
121
@@ -XXX,XX +XXX,XX @@
122
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
123
124
typedef struct RasPiState {
125
- BCM2836State soc;
126
+ BCM283XState soc;
127
MemoryRegion ram;
128
} RasPiState;
129
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
131
BusState *bus;
132
DeviceState *carddev;
133
134
- object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM2836);
135
+ object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM283X);
136
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
137
&error_abort);
138
139
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_init(MachineClass *mc)
140
mc->no_floppy = 1;
141
mc->no_cdrom = 1;
142
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
143
- mc->max_cpus = BCM2836_NCPUS;
144
- mc->min_cpus = BCM2836_NCPUS;
145
- mc->default_cpus = BCM2836_NCPUS;
146
+ mc->max_cpus = BCM283X_NCPUS;
147
+ mc->min_cpus = BCM283X_NCPUS;
148
+ mc->default_cpus = BCM283X_NCPUS;
149
mc->default_ram_size = 1024 * 1024 * 1024;
150
mc->ignore_memory_transaction_failures = true;
151
};
152
@@ -XXX,XX +XXX,XX @@ static void raspi3_machine_init(MachineClass *mc)
153
mc->no_floppy = 1;
154
mc->no_cdrom = 1;
155
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a53");
156
- mc->max_cpus = BCM2836_NCPUS;
157
- mc->min_cpus = BCM2836_NCPUS;
158
- mc->default_cpus = BCM2836_NCPUS;
159
+ mc->max_cpus = BCM283X_NCPUS;
160
+ mc->min_cpus = BCM283X_NCPUS;
161
+ mc->default_cpus = BCM283X_NCPUS;
162
mc->default_ram_size = 1024 * 1024 * 1024;
163
}
164
DEFINE_MACHINE("raspi3", raspi3_machine_init)
165
--
166
2.16.2
167
168
diff view generated by jsdifflib