1
Arm patch queue -- these are all bug fix patches but we might
1
More accumulated patches from during the freeze...
2
as well put them in to rc0...
3
2
4
thanks
3
The following changes since commit c83fcfaf8a54d0d034bd0edf7bbb3b0d16669be9:
5
-- PMM
6
4
7
The following changes since commit 2c8cfc0b52b5a4d123c26c0b5fdf941be24805be:
5
Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2021-08-26' into staging (2021-08-26 13:42:34 +0100)
8
9
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2018-03-19 11:44:26 +0000)
10
6
11
are available in the Git repository at:
7
are available in the Git repository at:
12
8
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180319
9
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20210826
14
10
15
for you to fetch changes up to ff72cb6b46b95bb530787add5277c211af3d31c6:
11
for you to fetch changes up to d2e6f370138a7f32bc28b20dcd55374b7a638f39:
16
12
17
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs (2018-03-19 18:23:24 +0000)
13
hw/arm/xlnx-zynqmp: Add unimplemented APU mmio (2021-08-26 17:02:01 +0100)
18
14
19
----------------------------------------------------------------
15
----------------------------------------------------------------
20
target-arm queue:
16
target-arm queue:
21
* fsl-imx6: Fix incorrect Ethernet interrupt defines
17
* hw/dma/xlnx-zdma, xlnx_csu_dma: Require 'dma' link property to be set
22
* dump: Update correct kdump phys_base field for AArch64
18
* hw/arm/Kconfig: no need to enable ACPI_MEMORY_HOTPLUG/ACPI_NVDIMM explicitly
23
* char: i.MX: Add support for "TX complete" interrupt
19
* target/arm/cpu: Introduce sve_vq_supported bitmap
24
* bcm2836/raspi: Fix various bugs resulting in panics trying
20
* docs/specs: Convert ACPI spec docs to rST
25
to boot a Debian Linux kernel on raspi3
21
* arch_init: Clean up and refactoring
22
* hw/core/loader: In gunzip(), check index is in range before use, not after
23
* softmmu/physmem.c: Remove unneeded NULL check in qemu_ram_alloc_from_fd()
24
* softmmu/physmem.c: Check return value from realpath()
25
* Zero-initialize sockaddr_in structs
26
* raspi: Use error_fatal for SoC realize errors, not error_abort
27
* target/arm: Avoid assertion trying to use KVM and multiple ASes
28
* target/arm: Implement HSTR.TTEE
29
* target/arm: Implement HSTR.TJDBX
30
* target/arm: Do hflags rebuild in cpsr_write()
31
* hw/arm/xlnx-versal, xlnx-zynqmp: Add unimplemented APU mmio
26
32
27
----------------------------------------------------------------
33
----------------------------------------------------------------
28
Andrey Smirnov (2):
34
Andrew Jones (4):
29
char: i.MX: Simplify imx_update()
35
target/arm/cpu: Introduce sve_vq_supported bitmap
30
char: i.MX: Add support for "TX complete" interrupt
36
target/arm/kvm64: Ensure sve vls map is completely clear
37
target/arm/cpu64: Replace kvm_supported with sve_vq_supported
38
target/arm/cpu64: Validate sve vector lengths are supported
31
39
32
Guenter Roeck (1):
40
Ani Sinha (1):
33
fsl-imx6: Swap Ethernet interrupt defines
41
hw/arm/Kconfig: no need to enable ACPI_MEMORY_HOTPLUG/ACPI_NVDIMM explicitly
34
42
35
Peter Maydell (9):
43
Peter Maydell (26):
36
hw/arm/raspi: Don't do board-setup or secure-boot for raspi3
44
docs/specs/acpu_cpu_hotplug: Convert to rST
37
hw/arm/boot: assert that secure_boot and secure_board_setup are false for AArch64
45
docs/specs/acpi_mem_hotplug: Convert to rST
38
hw/arm/boot: If booting a kernel in EL2, set SCR_EL3.HCE
46
docs/specs/acpi_pci_hotplug: Convert to rST
39
hw/arm/bcm2386: Fix parent type of bcm2386
47
docs/specs/acpi_nvdimm: Convert to rST
40
hw/arm/bcm2836: Rename bcm2836 type/struct to bcm283x
48
MAINTAINERS: Add ACPI specs documents to ACPI and NVDIMM sections
41
hw/arm/bcm2836: Create proper bcm2837 device
49
softmmu: Use accel_find("xen") instead of xen_available()
42
hw/arm/bcm2836: Use correct affinity values for BCM2837
50
monitor: Use accel_find("kvm") instead of kvm_available()
43
hw/arm/bcm2836: Hardcode correct CPU type
51
softmmu/arch_init.c: Trim down include list
44
hw/arm/raspi: Provide spin-loop code for AArch64 CPUs
52
meson.build: Define QEMU_ARCH in config-target.h
53
arch_init.h: Add QEMU_ARCH_HEXAGON
54
arch_init.h: Move QEMU_ARCH_VIRTIO_* to qdev-monitor.c
55
arch_init.h: Don't include arch_init.h unnecessarily
56
stubs: Remove unused arch_type.c stub
57
hw/core/loader: In gunzip(), check index is in range before use, not after
58
softmmu/physmem.c: Remove unneeded NULL check in qemu_ram_alloc_from_fd()
59
softmmu/physmem.c: Check return value from realpath()
60
net: Zero sockaddr_in in parse_host_port()
61
gdbstub: Zero-initialize sockaddr structs
62
tests/qtest/ipmi-bt-test: Zero-initialize sockaddr struct
63
tests/tcg/multiarch/linux-test: Zero-initialize sockaddr structs
64
raspi: Use error_fatal for SoC realize errors, not error_abort
65
target/arm: Avoid assertion trying to use KVM and multiple ASes
66
hw/arm/virt: Delete EL3 error checksnow provided in CPU realize
67
target/arm: Implement HSTR.TTEE
68
target/arm: Implement HSTR.TJDBX
69
target/arm: Do hflags rebuild in cpsr_write()
45
70
46
Wei Huang (1):
71
Philippe Mathieu-Daudé (4):
47
dump: Update correct kdump phys_base field for AArch64
72
hw/arm/xlnx-zynqmp: Realize qspi controller *after* qspi_dma
73
hw/dma/xlnx_csu_dma: Run trivial checks early in realize()
74
hw/dma/xlnx_csu_dma: Always expect 'dma' link property to be set
75
hw/dma/xlnx-zdma Always expect 'dma' link property to be set
48
76
49
include/hw/arm/bcm2836.h | 31 +++++++++++++---
77
Tong Ho (2):
50
include/hw/arm/fsl-imx6.h | 4 +-
78
hw/arm/xlnx-versal: Add unimplemented APU mmio
51
include/hw/char/imx_serial.h | 3 ++
79
hw/arm/xlnx-zynqmp: Add unimplemented APU mmio
52
dump.c | 14 +++++--
53
hw/arm/bcm2836.c | 87 +++++++++++++++++++++++++++++++-------------
54
hw/arm/boot.c | 12 ++++++
55
hw/arm/raspi.c | 77 +++++++++++++++++++++++++++++++--------
56
hw/char/imx_serial.c | 44 ++++++++++++++++------
57
hw/net/imx_fec.c | 28 +++++++++++++-
58
9 files changed, 237 insertions(+), 63 deletions(-)
59
80
81
docs/specs/acpi_cpu_hotplug.rst | 235 +++++++++++++++++++++
82
docs/specs/acpi_cpu_hotplug.txt | 160 --------------
83
docs/specs/acpi_mem_hotplug.rst | 128 +++++++++++
84
docs/specs/acpi_mem_hotplug.txt | 94 ---------
85
docs/specs/acpi_nvdimm.rst | 228 ++++++++++++++++++++
86
docs/specs/acpi_nvdimm.txt | 188 -----------------
87
.../{acpi_pci_hotplug.txt => acpi_pci_hotplug.rst} | 37 ++--
88
docs/specs/index.rst | 4 +
89
meson.build | 2 +
90
include/hw/arm/xlnx-versal.h | 2 +
91
include/hw/arm/xlnx-zynqmp.h | 7 +
92
include/hw/dma/xlnx-zdma.h | 2 +-
93
include/hw/dma/xlnx_csu_dma.h | 2 +-
94
include/sysemu/arch_init.h | 15 +-
95
target/arm/cpu.h | 17 +-
96
target/arm/helper.h | 2 +
97
target/arm/syndrome.h | 7 +
98
blockdev.c | 1 -
99
gdbstub.c | 4 +-
100
hw/arm/raspi.c | 2 +-
101
hw/arm/virt.c | 5 -
102
hw/arm/xlnx-versal.c | 4 +
103
hw/arm/xlnx-zynqmp.c | 86 ++++++--
104
hw/core/loader.c | 35 ++-
105
hw/dma/xlnx-zdma.c | 24 +--
106
hw/dma/xlnx_csu_dma.c | 31 ++-
107
hw/i386/pc.c | 1 -
108
hw/i386/pc_piix.c | 1 -
109
hw/i386/pc_q35.c | 1 -
110
hw/mips/jazz.c | 1 -
111
hw/mips/malta.c | 1 -
112
hw/ppc/prep.c | 1 -
113
hw/riscv/sifive_e.c | 1 -
114
hw/riscv/sifive_u.c | 1 -
115
hw/riscv/spike.c | 1 -
116
hw/riscv/virt.c | 1 -
117
linux-user/arm/signal.c | 2 -
118
monitor/qmp-cmds.c | 3 +-
119
net/net.c | 2 +
120
softmmu/arch_init.c | 66 ------
121
softmmu/physmem.c | 5 +-
122
softmmu/qdev-monitor.c | 9 +
123
softmmu/vl.c | 6 +-
124
stubs/arch_type.c | 4 -
125
target/arm/cpu.c | 23 ++
126
target/arm/cpu64.c | 118 +++++------
127
target/arm/helper.c | 40 +++-
128
target/arm/kvm64.c | 2 +-
129
target/arm/op_helper.c | 16 ++
130
target/arm/translate.c | 12 ++
131
target/ppc/cpu_init.c | 1 -
132
target/s390x/cpu-sysemu.c | 1 -
133
tests/qtest/ipmi-bt-test.c | 2 +-
134
tests/tcg/multiarch/linux-test.c | 4 +-
135
MAINTAINERS | 5 +
136
hw/arm/Kconfig | 2 -
137
stubs/meson.build | 1 -
138
57 files changed, 949 insertions(+), 707 deletions(-)
139
create mode 100644 docs/specs/acpi_cpu_hotplug.rst
140
delete mode 100644 docs/specs/acpi_cpu_hotplug.txt
141
create mode 100644 docs/specs/acpi_mem_hotplug.rst
142
delete mode 100644 docs/specs/acpi_mem_hotplug.txt
143
create mode 100644 docs/specs/acpi_nvdimm.rst
144
delete mode 100644 docs/specs/acpi_nvdimm.txt
145
rename docs/specs/{acpi_pci_hotplug.txt => acpi_pci_hotplug.rst} (51%)
146
delete mode 100644 stubs/arch_type.c
147
diff view generated by jsdifflib
1
Now we have separate types for BCM2386 and BCM2387, we might as well
1
From: Philippe Mathieu-Daudé <philmd@redhat.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
If we link QOM object (a) as a property of QOM object (b),
7
the command line to use -cpu to ask for a different kind of
4
we must set the property *before* (b) is realized.
8
CPU than the SoC supports. This was never a supported thing to
9
do anyway; we were just not sanity-checking the command line.
10
5
11
This does require us to only build the bcm2837 object on
6
Move QSPI realization *after* QSPI DMA.
12
TARGET_AARCH64 configs, since otherwise it won't instantiate
13
due to the missing cortex-a53 device and "make check" will fail.
14
7
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-id: 20210819163422.2863447-2-philmd@redhat.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
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
---
12
---
20
hw/arm/bcm2836.c | 24 +++++++++++++++---------
13
hw/arm/xlnx-zynqmp.c | 42 ++++++++++++++++++++----------------------
21
hw/arm/raspi.c | 2 --
14
1 file changed, 20 insertions(+), 22 deletions(-)
22
2 files changed, 15 insertions(+), 11 deletions(-)
23
15
24
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
16
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
25
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/bcm2836.c
18
--- a/hw/arm/xlnx-zynqmp.c
27
+++ b/hw/arm/bcm2836.c
19
+++ b/hw/arm/xlnx-zynqmp.c
28
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
29
21
g_free(bus_name);
30
struct BCM283XInfo {
22
}
31
const char *name;
23
32
+ const char *cpu_type;
24
- if (!sysbus_realize(SYS_BUS_DEVICE(&s->qspi), errp)) {
33
int clusterid;
25
- return;
34
};
26
- }
35
27
- sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 0, QSPI_ADDR);
36
static const BCM283XInfo bcm283x_socs[] = {
28
- sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 1, LQSPI_ADDR);
37
{
29
- sysbus_connect_irq(SYS_BUS_DEVICE(&s->qspi), 0, gic_spi[QSPI_IRQ]);
38
.name = TYPE_BCM2836,
30
-
39
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a15"),
31
- for (i = 0; i < XLNX_ZYNQMP_NUM_QSPI_BUS; i++) {
40
.clusterid = 0xf,
32
- gchar *bus_name;
41
},
33
- gchar *target_bus;
42
+#ifdef TARGET_AARCH64
34
-
43
{
35
- /* Alias controller SPI bus to the SoC itself */
44
.name = TYPE_BCM2837,
36
- bus_name = g_strdup_printf("qspi%d", i);
45
+ .cpu_type = ARM_CPU_TYPE_NAME("cortex-a53"),
37
- target_bus = g_strdup_printf("spi%d", i);
46
.clusterid = 0x0,
38
- object_property_add_alias(OBJECT(s), bus_name,
47
},
39
- OBJECT(&s->qspi), target_bus);
48
+#endif
40
- g_free(bus_name);
49
};
41
- g_free(target_bus);
50
51
static void bcm2836_init(Object *obj)
52
{
53
BCM283XState *s = BCM283X(obj);
54
+ BCM283XClass *bc = BCM283X_GET_CLASS(obj);
55
+ const BCM283XInfo *info = bc->info;
56
+ int n;
57
+
58
+ for (n = 0; n < BCM283X_NCPUS; n++) {
59
+ object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
60
+ info->cpu_type);
61
+ object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
62
+ &error_abort);
63
+ }
64
65
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
66
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
67
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
68
69
/* common peripherals from bcm2835 */
70
71
- obj = OBJECT(dev);
72
- for (n = 0; n < BCM283X_NCPUS; n++) {
73
- object_initialize(&s->cpus[n], sizeof(s->cpus[n]),
74
- s->cpu_type);
75
- object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]),
76
- &error_abort);
77
- }
42
- }
78
-
43
-
79
obj = object_property_get_link(OBJECT(dev), "ram", &err);
44
if (!sysbus_realize(SYS_BUS_DEVICE(&s->dp), errp)) {
80
if (obj == NULL) {
45
return;
81
error_setg(errp, "%s: required ram link not found: %s",
46
}
82
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
47
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
48
49
sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi_dma), 0, QSPI_DMA_ADDR);
50
sysbus_connect_irq(SYS_BUS_DEVICE(&s->qspi_dma), 0, gic_spi[QSPI_IRQ]);
51
- object_property_set_link(OBJECT(&s->qspi), "stream-connected-dma",
52
- OBJECT(&s->qspi_dma), errp);
53
+
54
+ if (!object_property_set_link(OBJECT(&s->qspi), "stream-connected-dma",
55
+ OBJECT(&s->qspi_dma), errp)) {
56
+ return;
57
+ }
58
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->qspi), errp)) {
59
+ return;
60
+ }
61
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 0, QSPI_ADDR);
62
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 1, LQSPI_ADDR);
63
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->qspi), 0, gic_spi[QSPI_IRQ]);
64
+
65
+ for (i = 0; i < XLNX_ZYNQMP_NUM_QSPI_BUS; i++) {
66
+ g_autofree gchar *bus_name = g_strdup_printf("qspi%d", i);
67
+ g_autofree gchar *target_bus = g_strdup_printf("spi%d", i);
68
+
69
+ /* Alias controller SPI bus to the SoC itself */
70
+ object_property_add_alias(OBJECT(s), bus_name,
71
+ OBJECT(&s->qspi), target_bus);
72
+ }
83
}
73
}
84
74
85
static Property bcm2836_props[] = {
75
static Property xlnx_zynqmp_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
--
76
--
104
2.16.2
77
2.20.1
105
78
106
79
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
If some property are not set, we'll return indicating a failure,
4
so it is pointless to allocate / initialize some fields too early.
5
Move the trivial checks earlier in realize().
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-id: 20210819163422.2863447-3-philmd@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/dma/xlnx_csu_dma.c | 10 +++++-----
13
1 file changed, 5 insertions(+), 5 deletions(-)
14
15
diff --git a/hw/dma/xlnx_csu_dma.c b/hw/dma/xlnx_csu_dma.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/dma/xlnx_csu_dma.c
18
+++ b/hw/dma/xlnx_csu_dma.c
19
@@ -XXX,XX +XXX,XX @@ static void xlnx_csu_dma_realize(DeviceState *dev, Error **errp)
20
XlnxCSUDMA *s = XLNX_CSU_DMA(dev);
21
RegisterInfoArray *reg_array;
22
23
+ if (!s->is_dst && !s->tx_dev) {
24
+ error_setg(errp, "zynqmp.csu-dma: Stream not connected");
25
+ return;
26
+ }
27
+
28
reg_array =
29
register_init_block32(dev, xlnx_csu_dma_regs_info[!!s->is_dst],
30
XLNX_CSU_DMA_R_MAX,
31
@@ -XXX,XX +XXX,XX @@ static void xlnx_csu_dma_realize(DeviceState *dev, Error **errp)
32
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
33
sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq);
34
35
- if (!s->is_dst && !s->tx_dev) {
36
- error_setg(errp, "zynqmp.csu-dma: Stream not connected");
37
- return;
38
- }
39
-
40
s->src_timer = ptimer_init(xlnx_csu_dma_src_timeout_hit,
41
s, PTIMER_POLICY_DEFAULT);
42
43
--
44
2.20.1
45
46
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
Simplify by always passing a MemoryRegion property to the device.
4
Doing so we can move the AddressSpace field to the device struct,
5
removing need for heap allocation.
6
7
Update the Xilinx ZynqMP SoC model to pass the default system
8
memory instead of a NULL value.
9
10
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Message-id: 20210819163422.2863447-4-philmd@redhat.com
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
include/hw/dma/xlnx_csu_dma.h | 2 +-
17
hw/arm/xlnx-zynqmp.c | 4 ++++
18
hw/dma/xlnx_csu_dma.c | 21 ++++++++++-----------
19
3 files changed, 15 insertions(+), 12 deletions(-)
20
21
diff --git a/include/hw/dma/xlnx_csu_dma.h b/include/hw/dma/xlnx_csu_dma.h
22
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/dma/xlnx_csu_dma.h
24
+++ b/include/hw/dma/xlnx_csu_dma.h
25
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxCSUDMA {
26
MemoryRegion iomem;
27
MemTxAttrs attr;
28
MemoryRegion *dma_mr;
29
- AddressSpace *dma_as;
30
+ AddressSpace dma_as;
31
qemu_irq irq;
32
StreamSink *tx_dev; /* Used as generic StreamSink */
33
ptimer_state *src_timer;
34
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/arm/xlnx-zynqmp.c
37
+++ b/hw/arm/xlnx-zynqmp.c
38
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
39
gic_spi[adma_ch_intr[i]]);
40
}
41
42
+ if (!object_property_set_link(OBJECT(&s->qspi_dma), "dma",
43
+ OBJECT(system_memory), errp)) {
44
+ return;
45
+ }
46
if (!sysbus_realize(SYS_BUS_DEVICE(&s->qspi_dma), errp)) {
47
return;
48
}
49
diff --git a/hw/dma/xlnx_csu_dma.c b/hw/dma/xlnx_csu_dma.c
50
index XXXXXXX..XXXXXXX 100644
51
--- a/hw/dma/xlnx_csu_dma.c
52
+++ b/hw/dma/xlnx_csu_dma.c
53
@@ -XXX,XX +XXX,XX @@ static uint32_t xlnx_csu_dma_read(XlnxCSUDMA *s, uint8_t *buf, uint32_t len)
54
for (i = 0; i < len && (result == MEMTX_OK); i += s->width) {
55
uint32_t mlen = MIN(len - i, s->width);
56
57
- result = address_space_rw(s->dma_as, addr, s->attr,
58
+ result = address_space_rw(&s->dma_as, addr, s->attr,
59
buf + i, mlen, false);
60
}
61
} else {
62
- result = address_space_rw(s->dma_as, addr, s->attr, buf, len, false);
63
+ result = address_space_rw(&s->dma_as, addr, s->attr, buf, len, false);
64
}
65
66
if (result == MEMTX_OK) {
67
@@ -XXX,XX +XXX,XX @@ static uint32_t xlnx_csu_dma_write(XlnxCSUDMA *s, uint8_t *buf, uint32_t len)
68
for (i = 0; i < len && (result == MEMTX_OK); i += s->width) {
69
uint32_t mlen = MIN(len - i, s->width);
70
71
- result = address_space_rw(s->dma_as, addr, s->attr,
72
+ result = address_space_rw(&s->dma_as, addr, s->attr,
73
buf, mlen, true);
74
buf += mlen;
75
}
76
} else {
77
- result = address_space_rw(s->dma_as, addr, s->attr, buf, len, true);
78
+ result = address_space_rw(&s->dma_as, addr, s->attr, buf, len, true);
79
}
80
81
if (result != MEMTX_OK) {
82
@@ -XXX,XX +XXX,XX @@ static void xlnx_csu_dma_realize(DeviceState *dev, Error **errp)
83
return;
84
}
85
86
+ if (!s->dma_mr) {
87
+ error_setg(errp, TYPE_XLNX_CSU_DMA " 'dma' link not set");
88
+ return;
89
+ }
90
+ address_space_init(&s->dma_as, s->dma_mr, "csu-dma");
91
+
92
reg_array =
93
register_init_block32(dev, xlnx_csu_dma_regs_info[!!s->is_dst],
94
XLNX_CSU_DMA_R_MAX,
95
@@ -XXX,XX +XXX,XX @@ static void xlnx_csu_dma_realize(DeviceState *dev, Error **errp)
96
s->src_timer = ptimer_init(xlnx_csu_dma_src_timeout_hit,
97
s, PTIMER_POLICY_DEFAULT);
98
99
- if (s->dma_mr) {
100
- s->dma_as = g_malloc0(sizeof(AddressSpace));
101
- address_space_init(s->dma_as, s->dma_mr, NULL);
102
- } else {
103
- s->dma_as = &address_space_memory;
104
- }
105
-
106
s->attr = MEMTXATTRS_UNSPECIFIED;
107
108
s->r_size_last_word = 0;
109
--
110
2.20.1
111
112
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
Code of imx_update() is slightly confusing since the "flags" variable
3
Simplify by always passing a MemoryRegion property to the device.
4
doesn't really corespond to anything in real hardware and server as a
4
Doing so we can move the AddressSpace field to the device struct,
5
kitchensink accumulating events normally reported via USR1 and USR2
5
removing need for heap allocation.
6
registers.
7
6
8
Change the code to explicitly evaluate state of interrupts reported
7
Update the Xilinx ZynqMP / Versal SoC models to pass the default
9
via USR1 and USR2 against corresponding masking bits and use the to
8
system memory instead of a NULL value.
10
detemine if IRQ line should be asserted or not.
11
9
12
NOTE: Check for UTS1_TXEMPTY being set has been dropped for two
10
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
13
reasons:
11
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
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>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Message-id: 20210819163422.2863447-5-philmd@redhat.com
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
---
15
---
33
hw/char/imx_serial.c | 24 ++++++++++++++++--------
16
include/hw/dma/xlnx-zdma.h | 2 +-
34
1 file changed, 16 insertions(+), 8 deletions(-)
17
hw/arm/xlnx-versal.c | 2 ++
18
hw/arm/xlnx-zynqmp.c | 8 ++++++++
19
hw/dma/xlnx-zdma.c | 24 ++++++++++++------------
20
4 files changed, 23 insertions(+), 13 deletions(-)
35
21
36
diff --git a/hw/char/imx_serial.c b/hw/char/imx_serial.c
22
diff --git a/include/hw/dma/xlnx-zdma.h b/include/hw/dma/xlnx-zdma.h
37
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/char/imx_serial.c
24
--- a/include/hw/dma/xlnx-zdma.h
39
+++ b/hw/char/imx_serial.c
25
+++ b/include/hw/dma/xlnx-zdma.h
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_imx_serial = {
26
@@ -XXX,XX +XXX,XX @@ struct XlnxZDMA {
41
27
MemoryRegion iomem;
42
static void imx_update(IMXSerialState *s)
28
MemTxAttrs attr;
43
{
29
MemoryRegion *dma_mr;
44
- uint32_t flags;
30
- AddressSpace *dma_as;
45
+ uint32_t usr1;
31
+ AddressSpace dma_as;
46
+ uint32_t usr2;
32
qemu_irq irq_zdma_ch_imr;
47
+ uint32_t mask;
33
48
34
struct {
49
- flags = (s->usr1 & s->ucr1) & (USR1_TRDY|USR1_RRDY);
35
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
50
- if (s->ucr1 & UCR1_TXMPTYEN) {
36
index XXXXXXX..XXXXXXX 100644
51
- flags |= (s->uts1 & UTS1_TXEMPTY);
37
--- a/hw/arm/xlnx-versal.c
38
+++ b/hw/arm/xlnx-versal.c
39
@@ -XXX,XX +XXX,XX @@ static void versal_create_admas(Versal *s, qemu_irq *pic)
40
TYPE_XLNX_ZDMA);
41
dev = DEVICE(&s->lpd.iou.adma[i]);
42
object_property_set_int(OBJECT(dev), "bus-width", 128, &error_abort);
43
+ object_property_set_link(OBJECT(dev), "dma",
44
+ OBJECT(get_system_memory()), &error_fatal);
45
sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
46
47
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
48
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/hw/arm/xlnx-zynqmp.c
51
+++ b/hw/arm/xlnx-zynqmp.c
52
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
53
errp)) {
54
return;
55
}
56
+ if (!object_property_set_link(OBJECT(&s->gdma[i]), "dma",
57
+ OBJECT(system_memory), errp)) {
58
+ return;
59
+ }
60
if (!sysbus_realize(SYS_BUS_DEVICE(&s->gdma[i]), errp)) {
61
return;
62
}
63
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
64
}
65
66
for (i = 0; i < XLNX_ZYNQMP_NUM_ADMA_CH; i++) {
67
+ if (!object_property_set_link(OBJECT(&s->adma[i]), "dma",
68
+ OBJECT(system_memory), errp)) {
69
+ return;
70
+ }
71
if (!sysbus_realize(SYS_BUS_DEVICE(&s->adma[i]), errp)) {
72
return;
73
}
74
diff --git a/hw/dma/xlnx-zdma.c b/hw/dma/xlnx-zdma.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/hw/dma/xlnx-zdma.c
77
+++ b/hw/dma/xlnx-zdma.c
78
@@ -XXX,XX +XXX,XX @@ static bool zdma_load_descriptor(XlnxZDMA *s, uint64_t addr,
79
return false;
80
}
81
82
- descr->addr = address_space_ldq_le(s->dma_as, addr, s->attr, NULL);
83
- descr->size = address_space_ldl_le(s->dma_as, addr + 8, s->attr, NULL);
84
- descr->attr = address_space_ldl_le(s->dma_as, addr + 12, s->attr, NULL);
85
+ descr->addr = address_space_ldq_le(&s->dma_as, addr, s->attr, NULL);
86
+ descr->size = address_space_ldl_le(&s->dma_as, addr + 8, s->attr, NULL);
87
+ descr->attr = address_space_ldl_le(&s->dma_as, addr + 12, s->attr, NULL);
88
return true;
89
}
90
91
@@ -XXX,XX +XXX,XX @@ static void zdma_update_descr_addr(XlnxZDMA *s, bool type,
92
} else {
93
addr = zdma_get_regaddr64(s, basereg);
94
addr += sizeof(s->dsc_dst);
95
- next = address_space_ldq_le(s->dma_as, addr, s->attr, NULL);
96
+ next = address_space_ldq_le(&s->dma_as, addr, s->attr, NULL);
97
}
98
99
zdma_put_regaddr64(s, basereg, next);
100
@@ -XXX,XX +XXX,XX @@ static void zdma_write_dst(XlnxZDMA *s, uint8_t *buf, uint32_t len)
101
}
102
}
103
104
- address_space_write(s->dma_as, s->dsc_dst.addr, s->attr, buf, dlen);
105
+ address_space_write(&s->dma_as, s->dsc_dst.addr, s->attr, buf, dlen);
106
if (burst_type == AXI_BURST_INCR) {
107
s->dsc_dst.addr += dlen;
108
}
109
@@ -XXX,XX +XXX,XX @@ static void zdma_process_descr(XlnxZDMA *s)
110
len = s->cfg.bus_width / 8;
111
}
112
} else {
113
- address_space_read(s->dma_as, src_addr, s->attr, s->buf, len);
114
+ address_space_read(&s->dma_as, src_addr, s->attr, s->buf, len);
115
if (burst_type == AXI_BURST_INCR) {
116
src_addr += len;
117
}
118
@@ -XXX,XX +XXX,XX @@ static void zdma_realize(DeviceState *dev, Error **errp)
119
XlnxZDMA *s = XLNX_ZDMA(dev);
120
unsigned int i;
121
122
+ if (!s->dma_mr) {
123
+ error_setg(errp, TYPE_XLNX_ZDMA " 'dma' link not set");
124
+ return;
125
+ }
126
+ address_space_init(&s->dma_as, s->dma_mr, "zdma-dma");
127
+
128
for (i = 0; i < ARRAY_SIZE(zdma_regs_info); ++i) {
129
RegisterInfo *r = &s->regs_info[zdma_regs_info[i].addr / 4];
130
131
@@ -XXX,XX +XXX,XX @@ static void zdma_realize(DeviceState *dev, Error **errp)
132
};
133
}
134
135
- if (s->dma_mr) {
136
- s->dma_as = g_malloc0(sizeof(AddressSpace));
137
- address_space_init(s->dma_as, s->dma_mr, NULL);
52
- } else {
138
- } else {
53
- flags &= ~USR1_TRDY;
139
- s->dma_as = &address_space_memory;
54
- }
140
- }
55
+ /*
141
s->attr = MEMTXATTRS_UNSPECIFIED;
56
+ * Lucky for us TRDY and RRDY has the same offset in both USR1 and
57
+ * UCR1, so we can get away with something as simple as the
58
+ * following:
59
+ */
60
+ usr1 = s->usr1 & s->ucr1 & (USR1_TRDY | USR1_RRDY);
61
+ /*
62
+ * Bits that we want in USR2 are not as conveniently laid out,
63
+ * unfortunately.
64
+ */
65
+ mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
66
+ usr2 = s->usr2 & mask;
67
68
- qemu_set_irq(s->irq, !!flags);
69
+ qemu_set_irq(s->irq, usr1 || usr2);
70
}
142
}
71
143
72
static void imx_serial_reset(IMXSerialState *s)
73
--
144
--
74
2.16.2
145
2.20.1
75
146
76
147
diff view generated by jsdifflib
New patch
1
From: Ani Sinha <ani@anisinha.ca>
1
2
3
Since commit
4
36b79e3219d ("hw/acpi/Kconfig: Add missing Kconfig dependencies (build error)"),
5
ACPI_MEMORY_HOTPLUG and ACPI_NVDIMM is implicitly turned on when
6
ACPI_HW_REDUCED is selected. ACPI_HW_REDUCED is already enabled. No need to
7
turn on ACPI_MEMORY_HOTPLUG or ACPI_NVDIMM explicitly. This is a minor cleanup.
8
9
Signed-off-by: Ani Sinha <ani@anisinha.ca>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20210819162637.518507-1-ani@anisinha.ca
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/arm/Kconfig | 2 --
15
1 file changed, 2 deletions(-)
16
17
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/Kconfig
20
+++ b/hw/arm/Kconfig
21
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
22
select ACPI_PCI
23
select MEM_DEVICE
24
select DIMM
25
- select ACPI_MEMORY_HOTPLUG
26
select ACPI_HW_REDUCED
27
- select ACPI_NVDIMM
28
select ACPI_APEI
29
30
config CHEETAH
31
--
32
2.20.1
33
34
diff view generated by jsdifflib
New patch
1
From: Andrew Jones <drjones@redhat.com>
1
2
3
Allow CPUs that support SVE to specify which SVE vector lengths they
4
support by setting them in this bitmap. Currently only the 'max' and
5
'host' CPU types supports SVE and 'host' requires KVM which obtains
6
its supported bitmap from the host. So, we only need to initialize the
7
bitmap for 'max' with TCG. And, since 'max' should support all SVE
8
vector lengths we simply fill the bitmap. Future CPU types may have
9
less trivial maps though.
10
11
Signed-off-by: Andrew Jones <drjones@redhat.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20210823160647.34028-2-drjones@redhat.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
target/arm/cpu.h | 4 ++++
18
target/arm/cpu64.c | 2 ++
19
2 files changed, 6 insertions(+)
20
21
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/cpu.h
24
+++ b/target/arm/cpu.h
25
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
26
* While processing properties during initialization, corresponding
27
* sve_vq_init bits are set for bits in sve_vq_map that have been
28
* set by properties.
29
+ *
30
+ * Bits set in sve_vq_supported represent valid vector lengths for
31
+ * the CPU type.
32
*/
33
DECLARE_BITMAP(sve_vq_map, ARM_MAX_VQ);
34
DECLARE_BITMAP(sve_vq_init, ARM_MAX_VQ);
35
+ DECLARE_BITMAP(sve_vq_supported, ARM_MAX_VQ);
36
37
/* Generic timer counter frequency, in Hz */
38
uint64_t gt_cntfrq_hz;
39
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/cpu64.c
42
+++ b/target/arm/cpu64.c
43
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
44
/* Default to PAUTH on, with the architected algorithm. */
45
qdev_property_add_static(DEVICE(obj), &arm_cpu_pauth_property);
46
qdev_property_add_static(DEVICE(obj), &arm_cpu_pauth_impdef_property);
47
+
48
+ bitmap_fill(cpu->sve_vq_supported, ARM_MAX_VQ);
49
}
50
51
aarch64_add_sve_properties(obj);
52
--
53
2.20.1
54
55
diff view generated by jsdifflib
New patch
1
From: Andrew Jones <drjones@redhat.com>
1
2
3
bitmap_clear() only clears the given range. While the given
4
range should be sufficient in this case we might as well be
5
100% sure all bits are zeroed by using bitmap_zero().
6
7
Signed-off-by: Andrew Jones <drjones@redhat.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20210823160647.34028-3-drjones@redhat.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/kvm64.c | 2 +-
14
1 file changed, 1 insertion(+), 1 deletion(-)
15
16
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/kvm64.c
19
+++ b/target/arm/kvm64.c
20
@@ -XXX,XX +XXX,XX @@ void kvm_arm_sve_get_vls(CPUState *cs, unsigned long *map)
21
uint32_t vq = 0;
22
int i, j;
23
24
- bitmap_clear(map, 0, ARM_MAX_VQ);
25
+ bitmap_zero(map, ARM_MAX_VQ);
26
27
/*
28
* KVM ensures all host CPUs support the same set of vector lengths.
29
--
30
2.20.1
31
32
diff view generated by jsdifflib
New patch
1
From: Andrew Jones <drjones@redhat.com>
1
2
3
Now that we have an ARMCPU member sve_vq_supported we no longer
4
need the local kvm_supported bitmap for KVM's supported vector
5
lengths.
6
7
Signed-off-by: Andrew Jones <drjones@redhat.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20210823160647.34028-4-drjones@redhat.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/cpu64.c | 19 +++++++++++--------
14
1 file changed, 11 insertions(+), 8 deletions(-)
15
16
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/cpu64.c
19
+++ b/target/arm/cpu64.c
20
@@ -XXX,XX +XXX,XX @@ void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
21
* any of the above. Finally, if SVE is not disabled, then at least one
22
* vector length must be enabled.
23
*/
24
- DECLARE_BITMAP(kvm_supported, ARM_MAX_VQ);
25
DECLARE_BITMAP(tmp, ARM_MAX_VQ);
26
uint32_t vq, max_vq = 0;
27
28
- /* Collect the set of vector lengths supported by KVM. */
29
- bitmap_zero(kvm_supported, ARM_MAX_VQ);
30
+ /*
31
+ * CPU models specify a set of supported vector lengths which are
32
+ * enabled by default. Attempting to enable any vector length not set
33
+ * in the supported bitmap results in an error. When KVM is enabled we
34
+ * fetch the supported bitmap from the host.
35
+ */
36
if (kvm_enabled() && kvm_arm_sve_supported()) {
37
- kvm_arm_sve_get_vls(CPU(cpu), kvm_supported);
38
+ kvm_arm_sve_get_vls(CPU(cpu), cpu->sve_vq_supported);
39
} else if (kvm_enabled()) {
40
assert(!cpu_isar_feature(aa64_sve, cpu));
41
}
42
@@ -XXX,XX +XXX,XX @@ void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
43
* For KVM we have to automatically enable all supported unitialized
44
* lengths, even when the smaller lengths are not all powers-of-two.
45
*/
46
- bitmap_andnot(tmp, kvm_supported, cpu->sve_vq_init, max_vq);
47
+ bitmap_andnot(tmp, cpu->sve_vq_supported, cpu->sve_vq_init, max_vq);
48
bitmap_or(cpu->sve_vq_map, cpu->sve_vq_map, tmp, max_vq);
49
} else {
50
/* Propagate enabled bits down through required powers-of-two. */
51
@@ -XXX,XX +XXX,XX @@ void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
52
/* Disabling a supported length disables all larger lengths. */
53
for (vq = 1; vq <= ARM_MAX_VQ; ++vq) {
54
if (test_bit(vq - 1, cpu->sve_vq_init) &&
55
- test_bit(vq - 1, kvm_supported)) {
56
+ test_bit(vq - 1, cpu->sve_vq_supported)) {
57
break;
58
}
59
}
60
max_vq = vq <= ARM_MAX_VQ ? vq - 1 : ARM_MAX_VQ;
61
- bitmap_andnot(cpu->sve_vq_map, kvm_supported,
62
+ bitmap_andnot(cpu->sve_vq_map, cpu->sve_vq_supported,
63
cpu->sve_vq_init, max_vq);
64
if (max_vq == 0 || bitmap_empty(cpu->sve_vq_map, max_vq)) {
65
error_setg(errp, "cannot disable sve%d", vq * 128);
66
@@ -XXX,XX +XXX,XX @@ void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
67
68
if (kvm_enabled()) {
69
/* Ensure the set of lengths matches what KVM supports. */
70
- bitmap_xor(tmp, cpu->sve_vq_map, kvm_supported, max_vq);
71
+ bitmap_xor(tmp, cpu->sve_vq_map, cpu->sve_vq_supported, max_vq);
72
if (!bitmap_empty(tmp, max_vq)) {
73
vq = find_last_bit(tmp, max_vq) + 1;
74
if (test_bit(vq - 1, cpu->sve_vq_map)) {
75
--
76
2.20.1
77
78
diff view generated by jsdifflib
1
From: Wei Huang <wei@redhat.com>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
For guest kernel that supports KASLR, the load address can change every
3
Future CPU types may specify which vector lengths are supported.
4
time when guest VM runs. To find the physical base address correctly,
4
We can apply nearly the same logic to validate those lengths
5
current QEMU dump searches VMCOREINFO for the string "NUMBER(phys_base)=".
5
as we do for KVM's supported vector lengths. We merge the code
6
However this string pattern is only available on x86_64. AArch64 uses a
6
where we can, but unfortunately can't completely merge it because
7
different field, called "NUMBER(PHYS_OFFSET)=". This patch makes sure
7
KVM requires all vector lengths, power-of-two or not, smaller than
8
QEMU dump uses the correct string on AArch64.
8
the maximum enabled length to also be enabled. The architecture
9
only requires all the power-of-two lengths, though, so TCG will
10
only enforce that.
9
11
10
Signed-off-by: Wei Huang <wei@redhat.com>
12
Signed-off-by: Andrew Jones <drjones@redhat.com>
11
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 1520615003-20869-1-git-send-email-wei@redhat.com
14
Message-id: 20210823160647.34028-5-drjones@redhat.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
16
---
15
dump.c | 14 +++++++++++---
17
target/arm/cpu64.c | 101 ++++++++++++++++++++-------------------------
16
1 file changed, 11 insertions(+), 3 deletions(-)
18
1 file changed, 45 insertions(+), 56 deletions(-)
17
19
18
diff --git a/dump.c b/dump.c
20
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
19
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
20
--- a/dump.c
22
--- a/target/arm/cpu64.c
21
+++ b/dump.c
23
+++ b/target/arm/cpu64.c
22
@@ -XXX,XX +XXX,XX @@ static void vmcoreinfo_update_phys_base(DumpState *s)
24
@@ -XXX,XX +XXX,XX @@ void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
23
25
break;
24
lines = g_strsplit((char *)vmci, "\n", -1);
26
}
25
for (i = 0; lines[i]; i++) {
27
}
26
- if (g_str_has_prefix(lines[i], "NUMBER(phys_base)=")) {
28
- max_vq = vq <= ARM_MAX_VQ ? vq - 1 : ARM_MAX_VQ;
27
- if (qemu_strtou64(lines[i] + 18, NULL, 16,
29
- bitmap_andnot(cpu->sve_vq_map, cpu->sve_vq_supported,
28
+ const char *prefix = NULL;
30
- cpu->sve_vq_init, max_vq);
29
+
31
- if (max_vq == 0 || bitmap_empty(cpu->sve_vq_map, max_vq)) {
30
+ if (s->dump_info.d_machine == EM_X86_64) {
32
- error_setg(errp, "cannot disable sve%d", vq * 128);
31
+ prefix = "NUMBER(phys_base)=";
33
- error_append_hint(errp, "Disabling sve%d results in all "
32
+ } else if (s->dump_info.d_machine == EM_AARCH64) {
34
- "vector lengths being disabled.\n",
33
+ prefix = "NUMBER(PHYS_OFFSET)=";
35
- vq * 128);
36
- error_append_hint(errp, "With SVE enabled, at least one "
37
- "vector length must be enabled.\n");
38
- return;
39
- }
40
} else {
41
/* Disabling a power-of-two disables all larger lengths. */
42
- if (test_bit(0, cpu->sve_vq_init)) {
43
- error_setg(errp, "cannot disable sve128");
44
- error_append_hint(errp, "Disabling sve128 results in all "
45
- "vector lengths being disabled.\n");
46
- error_append_hint(errp, "With SVE enabled, at least one "
47
- "vector length must be enabled.\n");
48
- return;
49
- }
50
- for (vq = 2; vq <= ARM_MAX_VQ; vq <<= 1) {
51
+ for (vq = 1; vq <= ARM_MAX_VQ; vq <<= 1) {
52
if (test_bit(vq - 1, cpu->sve_vq_init)) {
53
break;
54
}
55
}
56
- max_vq = vq <= ARM_MAX_VQ ? vq - 1 : ARM_MAX_VQ;
57
- bitmap_complement(cpu->sve_vq_map, cpu->sve_vq_init, max_vq);
34
+ }
58
+ }
35
+
59
+
36
+ if (prefix && g_str_has_prefix(lines[i], prefix)) {
60
+ max_vq = vq <= ARM_MAX_VQ ? vq - 1 : ARM_MAX_VQ;
37
+ if (qemu_strtou64(lines[i] + strlen(prefix), NULL, 16,
61
+ bitmap_andnot(cpu->sve_vq_map, cpu->sve_vq_supported,
38
&phys_base) < 0) {
62
+ cpu->sve_vq_init, max_vq);
39
- warn_report("Failed to read NUMBER(phys_base)=");
63
+ if (max_vq == 0 || bitmap_empty(cpu->sve_vq_map, max_vq)) {
40
+ warn_report("Failed to read %s", prefix);
64
+ error_setg(errp, "cannot disable sve%d", vq * 128);
65
+ error_append_hint(errp, "Disabling sve%d results in all "
66
+ "vector lengths being disabled.\n",
67
+ vq * 128);
68
+ error_append_hint(errp, "With SVE enabled, at least one "
69
+ "vector length must be enabled.\n");
70
+ return;
71
}
72
73
max_vq = find_last_bit(cpu->sve_vq_map, max_vq) + 1;
74
@@ -XXX,XX +XXX,XX @@ void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
75
assert(max_vq != 0);
76
bitmap_clear(cpu->sve_vq_map, max_vq, ARM_MAX_VQ - max_vq);
77
78
- if (kvm_enabled()) {
79
- /* Ensure the set of lengths matches what KVM supports. */
80
- bitmap_xor(tmp, cpu->sve_vq_map, cpu->sve_vq_supported, max_vq);
81
- if (!bitmap_empty(tmp, max_vq)) {
82
- vq = find_last_bit(tmp, max_vq) + 1;
83
- if (test_bit(vq - 1, cpu->sve_vq_map)) {
84
- if (cpu->sve_max_vq) {
85
- error_setg(errp, "cannot set sve-max-vq=%d",
86
- cpu->sve_max_vq);
87
- error_append_hint(errp, "This KVM host does not support "
88
- "the vector length %d-bits.\n",
89
- vq * 128);
90
- error_append_hint(errp, "It may not be possible to use "
91
- "sve-max-vq with this KVM host. Try "
92
- "using only sve<N> properties.\n");
93
- } else {
94
- error_setg(errp, "cannot enable sve%d", vq * 128);
95
- error_append_hint(errp, "This KVM host does not support "
96
- "the vector length %d-bits.\n",
97
- vq * 128);
98
- }
99
+ /* Ensure the set of lengths matches what is supported. */
100
+ bitmap_xor(tmp, cpu->sve_vq_map, cpu->sve_vq_supported, max_vq);
101
+ if (!bitmap_empty(tmp, max_vq)) {
102
+ vq = find_last_bit(tmp, max_vq) + 1;
103
+ if (test_bit(vq - 1, cpu->sve_vq_map)) {
104
+ if (cpu->sve_max_vq) {
105
+ error_setg(errp, "cannot set sve-max-vq=%d", cpu->sve_max_vq);
106
+ error_append_hint(errp, "This CPU does not support "
107
+ "the vector length %d-bits.\n", vq * 128);
108
+ error_append_hint(errp, "It may not be possible to use "
109
+ "sve-max-vq with this CPU. Try "
110
+ "using only sve<N> properties.\n");
41
} else {
111
} else {
42
s->dump_info.phys_base = phys_base;
112
+ error_setg(errp, "cannot enable sve%d", vq * 128);
113
+ error_append_hint(errp, "This CPU does not support "
114
+ "the vector length %d-bits.\n", vq * 128);
115
+ }
116
+ return;
117
+ } else {
118
+ if (kvm_enabled()) {
119
error_setg(errp, "cannot disable sve%d", vq * 128);
120
error_append_hint(errp, "The KVM host requires all "
121
"supported vector lengths smaller "
122
"than %d bits to also be enabled.\n",
123
max_vq * 128);
124
- }
125
- return;
126
- }
127
- } else {
128
- /* Ensure all required powers-of-two are enabled. */
129
- for (vq = pow2floor(max_vq); vq >= 1; vq >>= 1) {
130
- if (!test_bit(vq - 1, cpu->sve_vq_map)) {
131
- error_setg(errp, "cannot disable sve%d", vq * 128);
132
- error_append_hint(errp, "sve%d is required as it "
133
- "is a power-of-two length smaller than "
134
- "the maximum, sve%d\n",
135
- vq * 128, max_vq * 128);
136
return;
137
+ } else {
138
+ /* Ensure all required powers-of-two are enabled. */
139
+ for (vq = pow2floor(max_vq); vq >= 1; vq >>= 1) {
140
+ if (!test_bit(vq - 1, cpu->sve_vq_map)) {
141
+ error_setg(errp, "cannot disable sve%d", vq * 128);
142
+ error_append_hint(errp, "sve%d is required as it "
143
+ "is a power-of-two length smaller "
144
+ "than the maximum, sve%d\n",
145
+ vq * 128, max_vq * 128);
146
+ return;
147
+ }
148
+ }
43
}
149
}
150
}
151
}
44
--
152
--
45
2.16.2
153
2.20.1
46
154
47
155
diff view generated by jsdifflib
New patch
1
Do a basic conversion of the acpi_cpu_hotplug spec document to rST.
1
2
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
5
Message-id: 20210727170414.3368-2-peter.maydell@linaro.org
6
---
7
docs/specs/acpi_cpu_hotplug.rst | 235 ++++++++++++++++++++++++++++++++
8
docs/specs/acpi_cpu_hotplug.txt | 160 ----------------------
9
docs/specs/index.rst | 1 +
10
3 files changed, 236 insertions(+), 160 deletions(-)
11
create mode 100644 docs/specs/acpi_cpu_hotplug.rst
12
delete mode 100644 docs/specs/acpi_cpu_hotplug.txt
13
14
diff --git a/docs/specs/acpi_cpu_hotplug.rst b/docs/specs/acpi_cpu_hotplug.rst
15
new file mode 100644
16
index XXXXXXX..XXXXXXX
17
--- /dev/null
18
+++ b/docs/specs/acpi_cpu_hotplug.rst
19
@@ -XXX,XX +XXX,XX @@
20
+QEMU<->ACPI BIOS CPU hotplug interface
21
+======================================
22
+
23
+QEMU supports CPU hotplug via ACPI. This document
24
+describes the interface between QEMU and the ACPI BIOS.
25
+
26
+ACPI BIOS GPE.2 handler is dedicated for notifying OS about CPU hot-add
27
+and hot-remove events.
28
+
29
+
30
+Legacy ACPI CPU hotplug interface registers
31
+-------------------------------------------
32
+
33
+CPU present bitmap for:
34
+
35
+- ICH9-LPC (IO port 0x0cd8-0xcf7, 1-byte access)
36
+- PIIX-PM (IO port 0xaf00-0xaf1f, 1-byte access)
37
+- One bit per CPU. Bit position reflects corresponding CPU APIC ID. Read-only.
38
+- The first DWORD in bitmap is used in write mode to switch from legacy
39
+ to modern CPU hotplug interface, write 0 into it to do switch.
40
+
41
+QEMU sets corresponding CPU bit on hot-add event and issues SCI
42
+with GPE.2 event set. CPU present map is read by ACPI BIOS GPE.2 handler
43
+to notify OS about CPU hot-add events. CPU hot-remove isn't supported.
44
+
45
+
46
+Modern ACPI CPU hotplug interface registers
47
+-------------------------------------------
48
+
49
+Register block base address:
50
+
51
+- ICH9-LPC IO port 0x0cd8
52
+- PIIX-PM IO port 0xaf00
53
+
54
+Register block size:
55
+
56
+- ACPI_CPU_HOTPLUG_REG_LEN = 12
57
+
58
+All accesses to registers described below, imply little-endian byte order.
59
+
60
+Reserved registers behavior:
61
+
62
+- write accesses are ignored
63
+- read accesses return all bits set to 0.
64
+
65
+The last stored value in 'CPU selector' must refer to a possible CPU, otherwise
66
+
67
+- reads from any register return 0
68
+- writes to any other register are ignored until valid value is stored into it
69
+
70
+On QEMU start, 'CPU selector' is initialized to a valid value, on reset it
71
+keeps the current value.
72
+
73
+Read access behavior
74
+^^^^^^^^^^^^^^^^^^^^
75
+
76
+offset [0x0-0x3]
77
+ Command data 2: (DWORD access)
78
+
79
+ If value last stored in 'Command field' is:
80
+
81
+ 0:
82
+ reads as 0x0
83
+ 3:
84
+ upper 32 bits of architecture specific CPU ID value
85
+ other values:
86
+ reserved
87
+
88
+offset [0x4]
89
+ CPU device status fields: (1 byte access)
90
+
91
+ bits:
92
+
93
+ 0:
94
+ Device is enabled and may be used by guest
95
+ 1:
96
+ Device insert event, used to distinguish device for which
97
+ no device check event to OSPM was issued.
98
+ It's valid only when bit 0 is set.
99
+ 2:
100
+ Device remove event, used to distinguish device for which
101
+ no device eject request to OSPM was issued. Firmware must
102
+ ignore this bit.
103
+ 3:
104
+ reserved and should be ignored by OSPM
105
+ 4:
106
+ if set to 1, OSPM requests firmware to perform device eject.
107
+ 5-7:
108
+ reserved and should be ignored by OSPM
109
+
110
+offset [0x5-0x7]
111
+ reserved
112
+
113
+offset [0x8]
114
+ Command data: (DWORD access)
115
+
116
+ If value last stored in 'Command field' is one of:
117
+
118
+ 0:
119
+ contains 'CPU selector' value of a CPU with pending event[s]
120
+ 3:
121
+ lower 32 bits of architecture specific CPU ID value
122
+ (in x86 case: APIC ID)
123
+ otherwise:
124
+ contains 0
125
+
126
+Write access behavior
127
+^^^^^^^^^^^^^^^^^^^^^
128
+
129
+offset [0x0-0x3]
130
+ CPU selector: (DWORD access)
131
+
132
+ Selects active CPU device. All following accesses to other
133
+ registers will read/store data from/to selected CPU.
134
+ Valid values: [0 .. max_cpus)
135
+
136
+offset [0x4]
137
+ CPU device control fields: (1 byte access)
138
+
139
+ bits:
140
+
141
+ 0:
142
+ reserved, OSPM must clear it before writing to register.
143
+ 1:
144
+ if set to 1 clears device insert event, set by OSPM
145
+ after it has emitted device check event for the
146
+ selected CPU device
147
+ 2:
148
+ if set to 1 clears device remove event, set by OSPM
149
+ after it has emitted device eject request for the
150
+ selected CPU device.
151
+ 3:
152
+ if set to 1 initiates device eject, set by OSPM when it
153
+ triggers CPU device removal and calls _EJ0 method or by firmware
154
+ when bit #4 is set. In case bit #4 were set, it's cleared as
155
+ part of device eject.
156
+ 4:
157
+ if set to 1, OSPM hands over device eject to firmware.
158
+ Firmware shall issue device eject request as described above
159
+ (bit #3) and OSPM should not touch device eject bit (#3) in case
160
+ it's asked firmware to perform CPU device eject.
161
+ 5-7:
162
+ reserved, OSPM must clear them before writing to register
163
+
164
+offset[0x5]
165
+ Command field: (1 byte access)
166
+
167
+ value:
168
+
169
+ 0:
170
+ selects a CPU device with inserting/removing events and
171
+ following reads from 'Command data' register return
172
+ selected CPU ('CPU selector' value).
173
+ If no CPU with events found, the current 'CPU selector' doesn't
174
+ change and corresponding insert/remove event flags are not modified.
175
+
176
+ 1:
177
+ following writes to 'Command data' register set OST event
178
+ register in QEMU
179
+ 2:
180
+ following writes to 'Command data' register set OST status
181
+ register in QEMU
182
+ 3:
183
+ following reads from 'Command data' and 'Command data 2' return
184
+ architecture specific CPU ID value for currently selected CPU.
185
+ other values:
186
+ reserved
187
+
188
+offset [0x6-0x7]
189
+ reserved
190
+
191
+offset [0x8]
192
+ Command data: (DWORD access)
193
+
194
+ If last stored 'Command field' value is:
195
+
196
+ 1:
197
+ stores value into OST event register
198
+ 2:
199
+ stores value into OST status register, triggers
200
+ ACPI_DEVICE_OST QMP event from QEMU to external applications
201
+ with current values of OST event and status registers.
202
+ other values:
203
+ reserved
204
+
205
+Typical usecases
206
+----------------
207
+
208
+(x86) Detecting and enabling modern CPU hotplug interface
209
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
210
+
211
+QEMU starts with legacy CPU hotplug interface enabled. Detecting and
212
+switching to modern interface is based on the 2 legacy CPU hotplug features:
213
+
214
+#. Writes into CPU bitmap are ignored.
215
+#. CPU bitmap always has bit #0 set, corresponding to boot CPU.
216
+
217
+Use following steps to detect and enable modern CPU hotplug interface:
218
+
219
+#. Store 0x0 to the 'CPU selector' register, attempting to switch to modern mode
220
+#. Store 0x0 to the 'CPU selector' register, to ensure valid selector value
221
+#. Store 0x0 to the 'Command field' register
222
+#. Read the 'Command data 2' register.
223
+ If read value is 0x0, the modern interface is enabled.
224
+ Otherwise legacy or no CPU hotplug interface available
225
+
226
+Get a cpu with pending event
227
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
228
+
229
+#. Store 0x0 to the 'CPU selector' register.
230
+#. Store 0x0 to the 'Command field' register.
231
+#. Read the 'CPU device status fields' register.
232
+#. If both bit #1 and bit #2 are clear in the value read, there is no CPU
233
+ with a pending event and selected CPU remains unchanged.
234
+#. Otherwise, read the 'Command data' register. The value read is the
235
+ selector of the CPU with the pending event (which is already selected).
236
+
237
+Enumerate CPUs present/non present CPUs
238
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
239
+
240
+#. Set the present CPU count to 0.
241
+#. Set the iterator to 0.
242
+#. Store 0x0 to the 'CPU selector' register, to ensure that it's in
243
+ a valid state and that access to other registers won't be ignored.
244
+#. Store 0x0 to the 'Command field' register to make 'Command data'
245
+ register return 'CPU selector' value of selected CPU
246
+#. Read the 'CPU device status fields' register.
247
+#. If bit #0 is set, increment the present CPU count.
248
+#. Increment the iterator.
249
+#. Store the iterator to the 'CPU selector' register.
250
+#. Read the 'Command data' register.
251
+#. If the value read is not zero, goto 05.
252
+#. Otherwise store 0x0 to the 'CPU selector' register, to put it
253
+ into a valid state and exit.
254
+ The iterator at this point equals "max_cpus".
255
diff --git a/docs/specs/acpi_cpu_hotplug.txt b/docs/specs/acpi_cpu_hotplug.txt
256
deleted file mode 100644
257
index XXXXXXX..XXXXXXX
258
--- a/docs/specs/acpi_cpu_hotplug.txt
259
+++ /dev/null
260
@@ -XXX,XX +XXX,XX @@
261
-QEMU<->ACPI BIOS CPU hotplug interface
262
---------------------------------------
263
-
264
-QEMU supports CPU hotplug via ACPI. This document
265
-describes the interface between QEMU and the ACPI BIOS.
266
-
267
-ACPI BIOS GPE.2 handler is dedicated for notifying OS about CPU hot-add
268
-and hot-remove events.
269
-
270
-============================================
271
-Legacy ACPI CPU hotplug interface registers:
272
---------------------------------------------
273
-CPU present bitmap for:
274
- ICH9-LPC (IO port 0x0cd8-0xcf7, 1-byte access)
275
- PIIX-PM (IO port 0xaf00-0xaf1f, 1-byte access)
276
- One bit per CPU. Bit position reflects corresponding CPU APIC ID. Read-only.
277
- The first DWORD in bitmap is used in write mode to switch from legacy
278
- to modern CPU hotplug interface, write 0 into it to do switch.
279
----------------------------------------------------------------
280
-QEMU sets corresponding CPU bit on hot-add event and issues SCI
281
-with GPE.2 event set. CPU present map is read by ACPI BIOS GPE.2 handler
282
-to notify OS about CPU hot-add events. CPU hot-remove isn't supported.
283
-
284
-=====================================
285
-Modern ACPI CPU hotplug interface registers:
286
--------------------------------------
287
-Register block base address:
288
- ICH9-LPC IO port 0x0cd8
289
- PIIX-PM IO port 0xaf00
290
-Register block size:
291
- ACPI_CPU_HOTPLUG_REG_LEN = 12
292
-
293
-All accesses to registers described below, imply little-endian byte order.
294
-
295
-Reserved resisters behavior:
296
- - write accesses are ignored
297
- - read accesses return all bits set to 0.
298
-
299
-The last stored value in 'CPU selector' must refer to a possible CPU, otherwise
300
- - reads from any register return 0
301
- - writes to any other register are ignored until valid value is stored into it
302
-On QEMU start, 'CPU selector' is initialized to a valid value, on reset it
303
-keeps the current value.
304
-
305
-read access:
306
- offset:
307
- [0x0-0x3] Command data 2: (DWORD access)
308
- if value last stored in 'Command field':
309
- 0: reads as 0x0
310
- 3: upper 32 bits of architecture specific CPU ID value
311
- other values: reserved
312
- [0x4] CPU device status fields: (1 byte access)
313
- bits:
314
- 0: Device is enabled and may be used by guest
315
- 1: Device insert event, used to distinguish device for which
316
- no device check event to OSPM was issued.
317
- It's valid only when bit 0 is set.
318
- 2: Device remove event, used to distinguish device for which
319
- no device eject request to OSPM was issued. Firmware must
320
- ignore this bit.
321
- 3: reserved and should be ignored by OSPM
322
- 4: if set to 1, OSPM requests firmware to perform device eject.
323
- 5-7: reserved and should be ignored by OSPM
324
- [0x5-0x7] reserved
325
- [0x8] Command data: (DWORD access)
326
- contains 0 unless value last stored in 'Command field' is one of:
327
- 0: contains 'CPU selector' value of a CPU with pending event[s]
328
- 3: lower 32 bits of architecture specific CPU ID value
329
- (in x86 case: APIC ID)
330
-
331
-write access:
332
- offset:
333
- [0x0-0x3] CPU selector: (DWORD access)
334
- selects active CPU device. All following accesses to other
335
- registers will read/store data from/to selected CPU.
336
- Valid values: [0 .. max_cpus)
337
- [0x4] CPU device control fields: (1 byte access)
338
- bits:
339
- 0: reserved, OSPM must clear it before writing to register.
340
- 1: if set to 1 clears device insert event, set by OSPM
341
- after it has emitted device check event for the
342
- selected CPU device
343
- 2: if set to 1 clears device remove event, set by OSPM
344
- after it has emitted device eject request for the
345
- selected CPU device.
346
- 3: if set to 1 initiates device eject, set by OSPM when it
347
- triggers CPU device removal and calls _EJ0 method or by firmware
348
- when bit #4 is set. In case bit #4 were set, it's cleared as
349
- part of device eject.
350
- 4: if set to 1, OSPM hands over device eject to firmware.
351
- Firmware shall issue device eject request as described above
352
- (bit #3) and OSPM should not touch device eject bit (#3) in case
353
- it's asked firmware to perform CPU device eject.
354
- 5-7: reserved, OSPM must clear them before writing to register
355
- [0x5] Command field: (1 byte access)
356
- value:
357
- 0: selects a CPU device with inserting/removing events and
358
- following reads from 'Command data' register return
359
- selected CPU ('CPU selector' value).
360
- If no CPU with events found, the current 'CPU selector' doesn't
361
- change and corresponding insert/remove event flags are not modified.
362
- 1: following writes to 'Command data' register set OST event
363
- register in QEMU
364
- 2: following writes to 'Command data' register set OST status
365
- register in QEMU
366
- 3: following reads from 'Command data' and 'Command data 2' return
367
- architecture specific CPU ID value for currently selected CPU.
368
- other values: reserved
369
- [0x6-0x7] reserved
370
- [0x8] Command data: (DWORD access)
371
- if last stored 'Command field' value:
372
- 1: stores value into OST event register
373
- 2: stores value into OST status register, triggers
374
- ACPI_DEVICE_OST QMP event from QEMU to external applications
375
- with current values of OST event and status registers.
376
- other values: reserved
377
-
378
-Typical usecases:
379
- - (x86) Detecting and enabling modern CPU hotplug interface.
380
- QEMU starts with legacy CPU hotplug interface enabled. Detecting and
381
- switching to modern interface is based on the 2 legacy CPU hotplug features:
382
- 1. Writes into CPU bitmap are ignored.
383
- 2. CPU bitmap always has bit#0 set, corresponding to boot CPU.
384
-
385
- Use following steps to detect and enable modern CPU hotplug interface:
386
- 1. Store 0x0 to the 'CPU selector' register,
387
- attempting to switch to modern mode
388
- 2. Store 0x0 to the 'CPU selector' register,
389
- to ensure valid selector value
390
- 3. Store 0x0 to the 'Command field' register,
391
- 4. Read the 'Command data 2' register.
392
- If read value is 0x0, the modern interface is enabled.
393
- Otherwise legacy or no CPU hotplug interface available
394
-
395
- - Get a cpu with pending event
396
- 1. Store 0x0 to the 'CPU selector' register.
397
- 2. Store 0x0 to the 'Command field' register.
398
- 3. Read the 'CPU device status fields' register.
399
- 4. If both bit#1 and bit#2 are clear in the value read, there is no CPU
400
- with a pending event and selected CPU remains unchanged.
401
- 5. Otherwise, read the 'Command data' register. The value read is the
402
- selector of the CPU with the pending event (which is already
403
- selected).
404
-
405
- - Enumerate CPUs present/non present CPUs
406
- 01. Set the present CPU count to 0.
407
- 02. Set the iterator to 0.
408
- 03. Store 0x0 to the 'CPU selector' register, to ensure that it's in
409
- a valid state and that access to other registers won't be ignored.
410
- 04. Store 0x0 to the 'Command field' register to make 'Command data'
411
- register return 'CPU selector' value of selected CPU
412
- 05. Read the 'CPU device status fields' register.
413
- 06. If bit#0 is set, increment the present CPU count.
414
- 07. Increment the iterator.
415
- 08. Store the iterator to the 'CPU selector' register.
416
- 09. Read the 'Command data' register.
417
- 10. If the value read is not zero, goto 05.
418
- 11. Otherwise store 0x0 to the 'CPU selector' register, to put it
419
- into a valid state and exit.
420
- The iterator at this point equals "max_cpus".
421
diff --git a/docs/specs/index.rst b/docs/specs/index.rst
422
index XXXXXXX..XXXXXXX 100644
423
--- a/docs/specs/index.rst
424
+++ b/docs/specs/index.rst
425
@@ -XXX,XX +XXX,XX @@ guest hardware that is specific to QEMU.
426
acpi_hw_reduced_hotplug
427
tpm
428
acpi_hest_ghes
429
+ acpi_cpu_hotplug
430
--
431
2.20.1
432
433
diff view generated by jsdifflib
New patch
1
1
Convert the acpi memory hotplug spec to rST.
2
3
Note that this includes converting a lot of weird whitespace
4
characters to plain old spaces (the rST parser does not like
5
whatever the old ones were).
6
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
9
Message-id: 20210727170414.3368-3-peter.maydell@linaro.org
10
---
11
docs/specs/acpi_mem_hotplug.rst | 128 ++++++++++++++++++++++++++++++++
12
docs/specs/acpi_mem_hotplug.txt | 94 -----------------------
13
docs/specs/index.rst | 1 +
14
3 files changed, 129 insertions(+), 94 deletions(-)
15
create mode 100644 docs/specs/acpi_mem_hotplug.rst
16
delete mode 100644 docs/specs/acpi_mem_hotplug.txt
17
18
diff --git a/docs/specs/acpi_mem_hotplug.rst b/docs/specs/acpi_mem_hotplug.rst
19
new file mode 100644
20
index XXXXXXX..XXXXXXX
21
--- /dev/null
22
+++ b/docs/specs/acpi_mem_hotplug.rst
23
@@ -XXX,XX +XXX,XX @@
24
+QEMU<->ACPI BIOS memory hotplug interface
25
+=========================================
26
+
27
+ACPI BIOS GPE.3 handler is dedicated for notifying OS about memory hot-add
28
+and hot-remove events.
29
+
30
+Memory hot-plug interface (IO port 0xa00-0xa17, 1-4 byte access)
31
+----------------------------------------------------------------
32
+
33
+Read access behavior
34
+^^^^^^^^^^^^^^^^^^^^
35
+
36
+[0x0-0x3]
37
+ Lo part of memory device phys address
38
+[0x4-0x7]
39
+ Hi part of memory device phys address
40
+[0x8-0xb]
41
+ Lo part of memory device size in bytes
42
+[0xc-0xf]
43
+ Hi part of memory device size in bytes
44
+[0x10-0x13]
45
+ Memory device proximity domain
46
+[0x14]
47
+ Memory device status fields
48
+
49
+ bits:
50
+
51
+ 0:
52
+ Device is enabled and may be used by guest
53
+ 1:
54
+ Device insert event, used to distinguish device for which
55
+ no device check event to OSPM was issued.
56
+ It's valid only when bit 1 is set.
57
+ 2:
58
+ Device remove event, used to distinguish device for which
59
+ no device eject request to OSPM was issued.
60
+ 3-7:
61
+ reserved and should be ignored by OSPM
62
+
63
+[0x15-0x17]
64
+ reserved
65
+
66
+Write access behavior
67
+^^^^^^^^^^^^^^^^^^^^^
68
+
69
+
70
+[0x0-0x3]
71
+ Memory device slot selector, selects active memory device.
72
+ All following accesses to other registers in 0xa00-0xa17
73
+ region will read/store data from/to selected memory device.
74
+[0x4-0x7]
75
+ OST event code reported by OSPM
76
+[0x8-0xb]
77
+ OST status code reported by OSPM
78
+[0xc-0x13]
79
+ reserved, writes into it are ignored
80
+[0x14]
81
+ Memory device control fields
82
+
83
+ bits:
84
+
85
+ 0:
86
+ reserved, OSPM must clear it before writing to register.
87
+ Due to BUG in versions prior 2.4 that field isn't cleared
88
+ when other fields are written. Keep it reserved and don't
89
+ try to reuse it.
90
+ 1:
91
+ if set to 1 clears device insert event, set by OSPM
92
+ after it has emitted device check event for the
93
+ selected memory device
94
+ 2:
95
+ if set to 1 clears device remove event, set by OSPM
96
+ after it has emitted device eject request for the
97
+ selected memory device
98
+ 3:
99
+ if set to 1 initiates device eject, set by OSPM when it
100
+ triggers memory device removal and calls _EJ0 method
101
+ 4-7:
102
+ reserved, OSPM must clear them before writing to register
103
+
104
+Selecting memory device slot beyond present range has no effect on platform:
105
+
106
+- write accesses to memory hot-plug registers not documented above are ignored
107
+- read accesses to memory hot-plug registers not documented above return
108
+ all bits set to 1.
109
+
110
+Memory hot remove process diagram
111
+---------------------------------
112
+
113
+::
114
+
115
+ +-------------+ +-----------------------+ +------------------+
116
+ | 1. QEMU | | 2. QEMU | |3. QEMU |
117
+ | device_del +---->+ device unplug request +----->+Send SCI to guest,|
118
+ | | | cb | |return control to |
119
+ | | | | |management |
120
+ +-------------+ +-----------------------+ +------------------+
121
+
122
+ +---------------------------------------------------------------------+
123
+
124
+ +---------------------+ +-------------------------+
125
+ | OSPM: | remove event | OSPM: |
126
+ | send Eject Request, | | Scan memory devices |
127
+ | clear remove event +<-------------+ for event flags |
128
+ | | | |
129
+ +---------------------+ +-------------------------+
130
+ |
131
+ |
132
+ +---------v--------+ +-----------------------+
133
+ | Guest OS: | success | OSPM: |
134
+ | process Ejection +----------->+ Execute _EJ0 method, |
135
+ | request | | set eject bit in flags|
136
+ +------------------+ +-----------------------+
137
+ |failure |
138
+ v v
139
+ +------------------------+ +-----------------------+
140
+ | OSPM: | | QEMU: |
141
+ | set OST event & status | | call device unplug cb |
142
+ | fields | | |
143
+ +------------------------+ +-----------------------+
144
+ | |
145
+ v v
146
+ +------------------+ +-------------------+
147
+ |QEMU: | |QEMU: |
148
+ |Send OST QMP event| |Send device deleted|
149
+ | | |QMP event |
150
+ +------------------+ | |
151
+ +-------------------+
152
diff --git a/docs/specs/acpi_mem_hotplug.txt b/docs/specs/acpi_mem_hotplug.txt
153
deleted file mode 100644
154
index XXXXXXX..XXXXXXX
155
--- a/docs/specs/acpi_mem_hotplug.txt
156
+++ /dev/null
157
@@ -XXX,XX +XXX,XX @@
158
-QEMU<->ACPI BIOS memory hotplug interface
159
---------------------------------------
160
-
161
-ACPI BIOS GPE.3 handler is dedicated for notifying OS about memory hot-add
162
-and hot-remove events.
163
-
164
-Memory hot-plug interface (IO port 0xa00-0xa17, 1-4 byte access):
165
----------------------------------------------------------------
166
-0xa00:
167
- read access:
168
- [0x0-0x3] Lo part of memory device phys address
169
- [0x4-0x7] Hi part of memory device phys address
170
- [0x8-0xb] Lo part of memory device size in bytes
171
- [0xc-0xf] Hi part of memory device size in bytes
172
- [0x10-0x13] Memory device proximity domain
173
- [0x14] Memory device status fields
174
- bits:
175
- 0: Device is enabled and may be used by guest
176
- 1: Device insert event, used to distinguish device for which
177
- no device check event to OSPM was issued.
178
- It's valid only when bit 1 is set.
179
- 2: Device remove event, used to distinguish device for which
180
- no device eject request to OSPM was issued.
181
- 3-7: reserved and should be ignored by OSPM
182
- [0x15-0x17] reserved
183
-
184
- write access:
185
- [0x0-0x3] Memory device slot selector, selects active memory device.
186
- All following accesses to other registers in 0xa00-0xa17
187
- region will read/store data from/to selected memory device.
188
- [0x4-0x7] OST event code reported by OSPM
189
- [0x8-0xb] OST status code reported by OSPM
190
- [0xc-0x13] reserved, writes into it are ignored
191
- [0x14] Memory device control fields
192
- bits:
193
- 0: reserved, OSPM must clear it before writing to register.
194
- Due to BUG in versions prior 2.4 that field isn't cleared
195
- when other fields are written. Keep it reserved and don't
196
- try to reuse it.
197
- 1: if set to 1 clears device insert event, set by OSPM
198
- after it has emitted device check event for the
199
- selected memory device
200
- 2: if set to 1 clears device remove event, set by OSPM
201
- after it has emitted device eject request for the
202
- selected memory device
203
- 3: if set to 1 initiates device eject, set by OSPM when it
204
- triggers memory device removal and calls _EJ0 method
205
- 4-7: reserved, OSPM must clear them before writing to register
206
-
207
-Selecting memory device slot beyond present range has no effect on platform:
208
- - write accesses to memory hot-plug registers not documented above are
209
- ignored
210
- - read accesses to memory hot-plug registers not documented above return
211
- all bits set to 1.
212
-
213
-Memory hot remove process diagram:
214
-----------------------------------
215
- +-------------+     +-----------------------+      +------------------+     
216
- |  1. QEMU    |     | 2. QEMU               |      |3. QEMU           |     
217
- |  device_del +---->+ device unplug request +----->+Send SCI to guest,|     
218
- |             |     |         cb            |      |return control to |     
219
- +-------------+     +-----------------------+      |management        |     
220
-                                                    +------------------+     
221
-                                                                             
222
- +---------------------------------------------------------------------+     
223
-                                                                             
224
- +---------------------+              +-------------------------+            
225
- | OSPM:               | remove event | OSPM:                   |            
226
- | send Eject Request, |              | Scan memory devices     |            
227
- | clear remove event  +<-------------+ for event flags         |            
228
- |                     |              |                         |            
229
- +---------------------+              +-------------------------+            
230
-           |                                                                 
231
-           |                                                                 
232
- +---------v--------+            +-----------------------+                   
233
- | Guest OS:        |  success   | OSPM:                 |                   
234
- | process Ejection +----------->+ Execute _EJ0 method,  |                   
235
- | request          |            | set eject bit in flags|                   
236
- +------------------+            +-----------------------+                   
237
-           |failure                         |                                
238
-           v                                v                                
239
- +------------------------+      +-----------------------+                   
240
- | OSPM:                  |      | QEMU:                 |                   
241
- | set OST event & status |      | call device unplug cb |                   
242
- | fields                 |      |                       |                   
243
- +------------------------+      +-----------------------+                   
244
-          |                                  |                               
245
-          v                                  v                               
246
- +------------------+              +-------------------+                     
247
- |QEMU:             |              |QEMU:              |                     
248
- |Send OST QMP event|              |Send device deleted|                     
249
- |                  |              |QMP event          |                     
250
- +------------------+              |                   |                     
251
-                                   +-------------------+
252
diff --git a/docs/specs/index.rst b/docs/specs/index.rst
253
index XXXXXXX..XXXXXXX 100644
254
--- a/docs/specs/index.rst
255
+++ b/docs/specs/index.rst
256
@@ -XXX,XX +XXX,XX @@ guest hardware that is specific to QEMU.
257
tpm
258
acpi_hest_ghes
259
acpi_cpu_hotplug
260
+ acpi_mem_hotplug
261
--
262
2.20.1
263
264
diff view generated by jsdifflib
New patch
1
Convert the PCI hotplug spec document to rST.
1
2
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
5
---
6
...i_pci_hotplug.txt => acpi_pci_hotplug.rst} | 37 ++++++++++---------
7
docs/specs/index.rst | 1 +
8
2 files changed, 21 insertions(+), 17 deletions(-)
9
rename docs/specs/{acpi_pci_hotplug.txt => acpi_pci_hotplug.rst} (51%)
10
11
diff --git a/docs/specs/acpi_pci_hotplug.txt b/docs/specs/acpi_pci_hotplug.rst
12
similarity index 51%
13
rename from docs/specs/acpi_pci_hotplug.txt
14
rename to docs/specs/acpi_pci_hotplug.rst
15
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/specs/acpi_pci_hotplug.txt
17
+++ b/docs/specs/acpi_pci_hotplug.rst
18
@@ -XXX,XX +XXX,XX @@
19
QEMU<->ACPI BIOS PCI hotplug interface
20
---------------------------------------
21
+======================================
22
23
QEMU supports PCI hotplug via ACPI, for PCI bus 0. This document
24
describes the interface between QEMU and the ACPI BIOS.
25
26
-ACPI GPE block (IO ports 0xafe0-0xafe3, byte access):
27
------------------------------------------
28
+ACPI GPE block (IO ports 0xafe0-0xafe3, byte access)
29
+----------------------------------------------------
30
31
Generic ACPI GPE block. Bit 1 (GPE.1) used to notify PCI hotplug/eject
32
event to ACPI BIOS, via SCI interrupt.
33
34
-PCI slot injection notification pending (IO port 0xae00-0xae03, 4-byte access):
35
----------------------------------------------------------------
36
+PCI slot injection notification pending (IO port 0xae00-0xae03, 4-byte access)
37
+------------------------------------------------------------------------------
38
+
39
Slot injection notification pending. One bit per slot.
40
41
Read by ACPI BIOS GPE.1 handler to notify OS of injection
42
events. Read-only.
43
44
-PCI slot removal notification (IO port 0xae04-0xae07, 4-byte access):
45
------------------------------------------------------
46
+PCI slot removal notification (IO port 0xae04-0xae07, 4-byte access)
47
+--------------------------------------------------------------------
48
+
49
Slot removal notification pending. One bit per slot.
50
51
Read by ACPI BIOS GPE.1 handler to notify OS of removal
52
events. Read-only.
53
54
-PCI device eject (IO port 0xae08-0xae0b, 4-byte access):
55
-----------------------------------------
56
+PCI device eject (IO port 0xae08-0xae0b, 4-byte access)
57
+-------------------------------------------------------
58
59
Write: Used by ACPI BIOS _EJ0 method to request device removal.
60
One bit per slot.
61
62
Read: Hotplug features register. Used by platform to identify features
63
available. Current base feature set (no bits set):
64
- - Read-only "up" register @0xae00, 4-byte access, bit per slot
65
- - Read-only "down" register @0xae04, 4-byte access, bit per slot
66
- - Read/write "eject" register @0xae08, 4-byte access,
67
- write: bit per slot eject, read: hotplug feature set
68
- - Read-only hotplug capable register @0xae0c, 4-byte access, bit per slot
69
70
-PCI removability status (IO port 0xae0c-0xae0f, 4-byte access):
71
------------------------------------------------
72
+- Read-only "up" register @0xae00, 4-byte access, bit per slot
73
+- Read-only "down" register @0xae04, 4-byte access, bit per slot
74
+- Read/write "eject" register @0xae08, 4-byte access,
75
+ write: bit per slot eject, read: hotplug feature set
76
+- Read-only hotplug capable register @0xae0c, 4-byte access, bit per slot
77
+
78
+PCI removability status (IO port 0xae0c-0xae0f, 4-byte access)
79
+--------------------------------------------------------------
80
81
Used by ACPI BIOS _RMV method to indicate removability status to OS. One
82
-bit per slot. Read-only
83
+bit per slot. Read-only.
84
diff --git a/docs/specs/index.rst b/docs/specs/index.rst
85
index XXXXXXX..XXXXXXX 100644
86
--- a/docs/specs/index.rst
87
+++ b/docs/specs/index.rst
88
@@ -XXX,XX +XXX,XX @@ guest hardware that is specific to QEMU.
89
acpi_hest_ghes
90
acpi_cpu_hotplug
91
acpi_mem_hotplug
92
+ acpi_pci_hotplug
93
--
94
2.20.1
95
96
diff view generated by jsdifflib
New patch
1
Convert the ACPI NVDIMM spec document to rST.
1
2
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
5
Message-id: 20210727170414.3368-5-peter.maydell@linaro.org
6
---
7
docs/specs/acpi_nvdimm.rst | 228 +++++++++++++++++++++++++++++++++++++
8
docs/specs/acpi_nvdimm.txt | 188 ------------------------------
9
docs/specs/index.rst | 1 +
10
3 files changed, 229 insertions(+), 188 deletions(-)
11
create mode 100644 docs/specs/acpi_nvdimm.rst
12
delete mode 100644 docs/specs/acpi_nvdimm.txt
13
14
diff --git a/docs/specs/acpi_nvdimm.rst b/docs/specs/acpi_nvdimm.rst
15
new file mode 100644
16
index XXXXXXX..XXXXXXX
17
--- /dev/null
18
+++ b/docs/specs/acpi_nvdimm.rst
19
@@ -XXX,XX +XXX,XX @@
20
+QEMU<->ACPI BIOS NVDIMM interface
21
+=================================
22
+
23
+QEMU supports NVDIMM via ACPI. This document describes the basic concepts of
24
+NVDIMM ACPI and the interface between QEMU and the ACPI BIOS.
25
+
26
+NVDIMM ACPI Background
27
+----------------------
28
+
29
+NVDIMM is introduced in ACPI 6.0 which defines an NVDIMM root device under
30
+_SB scope with a _HID of "ACPI0012". For each NVDIMM present or intended
31
+to be supported by platform, platform firmware also exposes an ACPI
32
+Namespace Device under the root device.
33
+
34
+The NVDIMM child devices under the NVDIMM root device are defined with _ADR
35
+corresponding to the NFIT device handle. The NVDIMM root device and the
36
+NVDIMM devices can have device specific methods (_DSM) to provide additional
37
+functions specific to a particular NVDIMM implementation.
38
+
39
+This is an example from ACPI 6.0, a platform contains one NVDIMM::
40
+
41
+ Scope (\_SB){
42
+ Device (NVDR) // Root device
43
+ {
44
+ Name (_HID, "ACPI0012")
45
+ Method (_STA) {...}
46
+ Method (_FIT) {...}
47
+ Method (_DSM, ...) {...}
48
+ Device (NVD)
49
+ {
50
+ Name(_ADR, h) //where h is NFIT Device Handle for this NVDIMM
51
+ Method (_DSM, ...) {...}
52
+ }
53
+ }
54
+ }
55
+
56
+Methods supported on both NVDIMM root device and NVDIMM device
57
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
58
+
59
+_DSM (Device Specific Method)
60
+ It is a control method that enables devices to provide device specific
61
+ control functions that are consumed by the device driver.
62
+ The NVDIMM DSM specification can be found at
63
+ http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf
64
+
65
+ Arguments:
66
+
67
+ Arg0
68
+ A Buffer containing a UUID (16 Bytes)
69
+ Arg1
70
+ An Integer containing the Revision ID (4 Bytes)
71
+ Arg2
72
+ An Integer containing the Function Index (4 Bytes)
73
+ Arg3
74
+ A package containing parameters for the function specified by the
75
+ UUID, Revision ID, and Function Index
76
+
77
+ Return Value:
78
+
79
+ If Function Index = 0, a Buffer containing a function index bitfield.
80
+ Otherwise, the return value and type depends on the UUID, revision ID
81
+ and function index which are described in the DSM specification.
82
+
83
+Methods on NVDIMM ROOT Device
84
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
85
+
86
+_FIT(Firmware Interface Table)
87
+ It evaluates to a buffer returning data in the format of a series of NFIT
88
+ Type Structure.
89
+
90
+ Arguments: None
91
+
92
+ Return Value:
93
+ A Buffer containing a list of NFIT Type structure entries.
94
+
95
+ The detailed definition of the structure can be found at ACPI 6.0: 5.2.25
96
+ NVDIMM Firmware Interface Table (NFIT).
97
+
98
+QEMU NVDIMM Implementation
99
+--------------------------
100
+
101
+QEMU uses 4 bytes IO Port starting from 0x0a18 and a RAM-based memory page
102
+for NVDIMM ACPI.
103
+
104
+Memory:
105
+ QEMU uses BIOS Linker/loader feature to ask BIOS to allocate a memory
106
+ page and dynamically patch its address into an int32 object named "MEMA"
107
+ in ACPI.
108
+
109
+ This page is RAM-based and it is used to transfer data between _DSM
110
+ method and QEMU. If ACPI has control, this pages is owned by ACPI which
111
+ writes _DSM input data to it, otherwise, it is owned by QEMU which
112
+ emulates _DSM access and writes the output data to it.
113
+
114
+ ACPI writes _DSM Input Data (based on the offset in the page):
115
+
116
+ [0x0 - 0x3]
117
+ 4 bytes, NVDIMM Device Handle.
118
+
119
+ The handle is completely QEMU internal thing, the values in
120
+ range [1, 0xFFFF] indicate nvdimm device. Other values are
121
+ reserved for other purposes.
122
+
123
+ Reserved handles:
124
+
125
+ - 0 is reserved for nvdimm root device named NVDR.
126
+ - 0x10000 is reserved for QEMU internal DSM function called on
127
+ the root device.
128
+
129
+ [0x4 - 0x7]
130
+ 4 bytes, Revision ID, that is the Arg1 of _DSM method.
131
+
132
+ [0x8 - 0xB]
133
+ 4 bytes. Function Index, that is the Arg2 of _DSM method.
134
+
135
+ [0xC - 0xFFF]
136
+ 4084 bytes, the Arg3 of _DSM method.
137
+
138
+ QEMU writes Output Data (based on the offset in the page):
139
+
140
+ [0x0 - 0x3]
141
+ 4 bytes, the length of result
142
+
143
+ [0x4 - 0xFFF]
144
+ 4092 bytes, the DSM result filled by QEMU
145
+
146
+IO Port 0x0a18 - 0xa1b:
147
+ ACPI writes the address of the memory page allocated by BIOS to this
148
+ port then QEMU gets the control and fills the result in the memory page.
149
+
150
+ Write Access:
151
+
152
+ [0x0a18 - 0xa1b]
153
+ 4 bytes, the address of the memory page allocated by BIOS.
154
+
155
+_DSM process diagram
156
+--------------------
157
+
158
+"MEMA" indicates the address of memory page allocated by BIOS.
159
+
160
+::
161
+
162
+ +----------------------+ +-----------------------+
163
+ | 1. OSPM | | 2. OSPM |
164
+ | save _DSM input data | | write "MEMA" to | Exit to QEMU
165
+ | to the page +----->| IO port 0x0a18 +------------+
166
+ | indicated by "MEMA" | | | |
167
+ +----------------------+ +-----------------------+ |
168
+ |
169
+ v
170
+ +--------------------+ +-----------+ +------------------+--------+
171
+ | 5 QEMU | | 4 QEMU | | 3. QEMU |
172
+ | write _DSM result | | emulate | | get _DSM input data from |
173
+ | to the page +<------+ _DSM +<-----+ the page indicated by the |
174
+ | | | | | value from the IO port |
175
+ +--------+-----------+ +-----------+ +---------------------------+
176
+ |
177
+ | Enter Guest
178
+ |
179
+ v
180
+ +--------------------------+ +--------------+
181
+ | 6 OSPM | | 7 OSPM |
182
+ | result size is returned | | _DSM return |
183
+ | by reading DSM +----->+ |
184
+ | result from the page | | |
185
+ +--------------------------+ +--------------+
186
+
187
+NVDIMM hotplug
188
+--------------
189
+
190
+ACPI BIOS GPE.4 handler is dedicated for notifying OS about nvdimm device
191
+hot-add event.
192
+
193
+QEMU internal use only _DSM functions
194
+-------------------------------------
195
+
196
+Read FIT
197
+^^^^^^^^
198
+
199
+_FIT method uses _DSM method to fetch NFIT structures blob from QEMU
200
+in 1 page sized increments which are then concatenated and returned
201
+as _FIT method result.
202
+
203
+Input parameters:
204
+
205
+Arg0
206
+ UUID {set to 648B9CF2-CDA1-4312-8AD9-49C4AF32BD62}
207
+Arg1
208
+ Revision ID (set to 1)
209
+Arg2
210
+ Function Index, 0x1
211
+Arg3
212
+ A package containing a buffer whose layout is as follows:
213
+
214
+ +----------+--------+--------+-------------------------------------------+
215
+ | Field | Length | Offset | Description |
216
+ +----------+--------+--------+-------------------------------------------+
217
+ | offset | 4 | 0 | offset in QEMU's NFIT structures blob to |
218
+ | | | | read from |
219
+ +----------+--------+--------+-------------------------------------------+
220
+
221
+Output layout in the dsm memory page:
222
+
223
+ +----------+--------+--------+-------------------------------------------+
224
+ | Field | Length | Offset | Description |
225
+ +----------+--------+--------+-------------------------------------------+
226
+ | length | 4 | 0 | length of entire returned data |
227
+ | | | | (including this header) |
228
+ +----------+--------+--------+-------------------------------------------+
229
+ | | | | return status codes |
230
+ | | | | |
231
+ | | | | - 0x0 - success |
232
+ | | | | - 0x100 - error caused by NFIT update |
233
+ | status | 4 | 4 | while read by _FIT wasn't completed |
234
+ | | | | - other codes follow Chapter 3 in |
235
+ | | | | DSM Spec Rev1 |
236
+ +----------+--------+--------+-------------------------------------------+
237
+ | fit data | Varies | 8 | contains FIT data. This field is present |
238
+ | | | | if status field is 0. |
239
+ +----------+--------+--------+-------------------------------------------+
240
+
241
+The FIT offset is maintained by the OSPM itself, current offset plus
242
+the size of the fit data returned by the function is the next offset
243
+OSPM should read. When all FIT data has been read out, zero fit data
244
+size is returned.
245
+
246
+If it returns status code 0x100, OSPM should restart to read FIT (read
247
+from offset 0 again).
248
diff --git a/docs/specs/acpi_nvdimm.txt b/docs/specs/acpi_nvdimm.txt
249
deleted file mode 100644
250
index XXXXXXX..XXXXXXX
251
--- a/docs/specs/acpi_nvdimm.txt
252
+++ /dev/null
253
@@ -XXX,XX +XXX,XX @@
254
-QEMU<->ACPI BIOS NVDIMM interface
255
----------------------------------
256
-
257
-QEMU supports NVDIMM via ACPI. This document describes the basic concepts of
258
-NVDIMM ACPI and the interface between QEMU and the ACPI BIOS.
259
-
260
-NVDIMM ACPI Background
261
-----------------------
262
-NVDIMM is introduced in ACPI 6.0 which defines an NVDIMM root device under
263
-_SB scope with a _HID of “ACPI0012”. For each NVDIMM present or intended
264
-to be supported by platform, platform firmware also exposes an ACPI
265
-Namespace Device under the root device.
266
-
267
-The NVDIMM child devices under the NVDIMM root device are defined with _ADR
268
-corresponding to the NFIT device handle. The NVDIMM root device and the
269
-NVDIMM devices can have device specific methods (_DSM) to provide additional
270
-functions specific to a particular NVDIMM implementation.
271
-
272
-This is an example from ACPI 6.0, a platform contains one NVDIMM:
273
-
274
-Scope (\_SB){
275
- Device (NVDR) // Root device
276
- {
277
- Name (_HID, “ACPI0012”)
278
- Method (_STA) {...}
279
- Method (_FIT) {...}
280
- Method (_DSM, ...) {...}
281
- Device (NVD)
282
- {
283
- Name(_ADR, h) //where h is NFIT Device Handle for this NVDIMM
284
- Method (_DSM, ...) {...}
285
- }
286
- }
287
-}
288
-
289
-Method supported on both NVDIMM root device and NVDIMM device
290
-_DSM (Device Specific Method)
291
- It is a control method that enables devices to provide device specific
292
- control functions that are consumed by the device driver.
293
- The NVDIMM DSM specification can be found at:
294
- http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf
295
-
296
- Arguments:
297
- Arg0 – A Buffer containing a UUID (16 Bytes)
298
- Arg1 – An Integer containing the Revision ID (4 Bytes)
299
- Arg2 – An Integer containing the Function Index (4 Bytes)
300
- Arg3 – A package containing parameters for the function specified by the
301
- UUID, Revision ID, and Function Index
302
-
303
- Return Value:
304
- If Function Index = 0, a Buffer containing a function index bitfield.
305
- Otherwise, the return value and type depends on the UUID, revision ID
306
- and function index which are described in the DSM specification.
307
-
308
-Methods on NVDIMM ROOT Device
309
-_FIT(Firmware Interface Table)
310
- It evaluates to a buffer returning data in the format of a series of NFIT
311
- Type Structure.
312
-
313
- Arguments: None
314
-
315
- Return Value:
316
- A Buffer containing a list of NFIT Type structure entries.
317
-
318
- The detailed definition of the structure can be found at ACPI 6.0: 5.2.25
319
- NVDIMM Firmware Interface Table (NFIT).
320
-
321
-QEMU NVDIMM Implementation
322
-==========================
323
-QEMU uses 4 bytes IO Port starting from 0x0a18 and a RAM-based memory page
324
-for NVDIMM ACPI.
325
-
326
-Memory:
327
- QEMU uses BIOS Linker/loader feature to ask BIOS to allocate a memory
328
- page and dynamically patch its address into an int32 object named "MEMA"
329
- in ACPI.
330
-
331
- This page is RAM-based and it is used to transfer data between _DSM
332
- method and QEMU. If ACPI has control, this pages is owned by ACPI which
333
- writes _DSM input data to it, otherwise, it is owned by QEMU which
334
- emulates _DSM access and writes the output data to it.
335
-
336
- ACPI writes _DSM Input Data (based on the offset in the page):
337
- [0x0 - 0x3]: 4 bytes, NVDIMM Device Handle.
338
-
339
- The handle is completely QEMU internal thing, the values in
340
- range [1, 0xFFFF] indicate nvdimm device. Other values are
341
- reserved for other purposes.
342
-
343
- Reserved handles:
344
- 0 is reserved for nvdimm root device named NVDR.
345
- 0x10000 is reserved for QEMU internal DSM function called on
346
- the root device.
347
-
348
- [0x4 - 0x7]: 4 bytes, Revision ID, that is the Arg1 of _DSM method.
349
- [0x8 - 0xB]: 4 bytes. Function Index, that is the Arg2 of _DSM method.
350
- [0xC - 0xFFF]: 4084 bytes, the Arg3 of _DSM method.
351
-
352
- QEMU Writes Output Data (based on the offset in the page):
353
- [0x0 - 0x3]: 4 bytes, the length of result
354
- [0x4 - 0xFFF]: 4092 bytes, the DSM result filled by QEMU
355
-
356
-IO Port 0x0a18 - 0xa1b:
357
- ACPI writes the address of the memory page allocated by BIOS to this
358
- port then QEMU gets the control and fills the result in the memory page.
359
-
360
- write Access:
361
- [0x0a18 - 0xa1b]: 4 bytes, the address of the memory page allocated
362
- by BIOS.
363
-
364
-_DSM process diagram:
365
----------------------
366
-"MEMA" indicates the address of memory page allocated by BIOS.
367
-
368
- +----------------------+   +-----------------------+
369
- |   1. OSPM   |      | 2. OSPM |
370
- | save _DSM input data | | write "MEMA" to | Exit to QEMU
371
- | to the page +----->| IO port 0x0a18 +------------+
372
- | indicated by "MEMA" | | | |
373
- +----------------------+ +-----------------------+ |
374
-  |
375
-  v
376
- +------------- ----+ +-----------+ +------------------+--------+
377
- | 5 QEMU | | 4 QEMU | | 3. QEMU |
378
- | write _DSM result | | emulate | | get _DSM input data from |
379
- | to the page +<------+ _DSM +<-----+ the page indicated by the |
380
- | | | | | value from the IO port |
381
- +--------+-----------+ +-----------+ +---------------------------+
382
- |
383
- | Enter Guest
384
- |
385
- v
386
- +--------------------------+ +--------------+
387
- | 6 OSPM | | 7 OSPM |
388
- | result size is returned | | _DSM return |
389
- | by reading DSM +----->+ |
390
- | result from the page | | |
391
- +--------------------------+ +--------------+
392
-
393
-NVDIMM hotplug
394
---------------
395
-ACPI BIOS GPE.4 handler is dedicated for notifying OS about nvdimm device
396
-hot-add event.
397
-
398
-QEMU internal use only _DSM function
399
-------------------------------------
400
-1) Read FIT
401
- _FIT method uses _DSM method to fetch NFIT structures blob from QEMU
402
- in 1 page sized increments which are then concatenated and returned
403
- as _FIT method result.
404
-
405
- Input parameters:
406
- Arg0 – UUID {set to 648B9CF2-CDA1-4312-8AD9-49C4AF32BD62}
407
- Arg1 – Revision ID (set to 1)
408
- Arg2 - Function Index, 0x1
409
- Arg3 - A package containing a buffer whose layout is as follows:
410
-
411
- +----------+--------+--------+-------------------------------------------+
412
- | Field | Length | Offset | Description |
413
- +----------+--------+--------+-------------------------------------------+
414
- | offset | 4 | 0 | offset in QEMU's NFIT structures blob to |
415
- | | | | read from |
416
- +----------+--------+--------+-------------------------------------------+
417
-
418
- Output layout in the dsm memory page:
419
- +----------+--------+--------+-------------------------------------------+
420
- | Field | Length | Offset | Description |
421
- +----------+--------+--------+-------------------------------------------+
422
- | length | 4 | 0 | length of entire returned data |
423
- | | | | (including this header) |
424
- +----------+-----------------+-------------------------------------------+
425
- | | | | return status codes |
426
- | | | | 0x0 - success |
427
- | | | | 0x100 - error caused by NFIT update while |
428
- | status | 4 | 4 | read by _FIT wasn't completed, other |
429
- | | | | codes follow Chapter 3 in DSM Spec Rev1 |
430
- +----------+-----------------+-------------------------------------------+
431
- | fit data | Varies | 8 | contains FIT data, this field is present |
432
- | | | | if status field is 0; |
433
- +----------+--------+--------+-------------------------------------------+
434
-
435
- The FIT offset is maintained by the OSPM itself, current offset plus
436
- the size of the fit data returned by the function is the next offset
437
- OSPM should read. When all FIT data has been read out, zero fit data
438
- size is returned.
439
-
440
- If it returns status code 0x100, OSPM should restart to read FIT (read
441
- from offset 0 again).
442
diff --git a/docs/specs/index.rst b/docs/specs/index.rst
443
index XXXXXXX..XXXXXXX 100644
444
--- a/docs/specs/index.rst
445
+++ b/docs/specs/index.rst
446
@@ -XXX,XX +XXX,XX @@ guest hardware that is specific to QEMU.
447
acpi_cpu_hotplug
448
acpi_mem_hotplug
449
acpi_pci_hotplug
450
+ acpi_nvdimm
451
--
452
2.20.1
453
454
diff view generated by jsdifflib
1
If we're directly booting a Linux kernel and the CPU supports both
1
Add entries for the ACPI specs documents in docs/specs to
2
EL3 and EL2, we start the kernel in EL2, as it expects. We must also
2
appropriate sections of MAINTAINERS.
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
3
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20180313153458.26822-4-peter.maydell@linaro.org
5
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
6
Message-id: 20210727170414.3368-6-peter.maydell@linaro.org
9
---
7
---
10
hw/arm/boot.c | 5 +++++
8
MAINTAINERS | 5 +++++
11
1 file changed, 5 insertions(+)
9
1 file changed, 5 insertions(+)
12
10
13
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
11
diff --git a/MAINTAINERS b/MAINTAINERS
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/boot.c
13
--- a/MAINTAINERS
16
+++ b/hw/arm/boot.c
14
+++ b/MAINTAINERS
17
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
15
@@ -XXX,XX +XXX,XX @@ F: qapi/acpi.json
18
assert(!info->secure_board_setup);
16
F: tests/qtest/bios-tables-test*
19
}
17
F: tests/qtest/acpi-utils.[hc]
20
18
F: tests/data/acpi/
21
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
19
+F: docs/specs/acpi_cpu_hotplug.rst
22
+ /* If we have EL2 then Linux expects the HVC insn to work */
20
+F: docs/specs/acpi_mem_hotplug.rst
23
+ env->cp15.scr_el3 |= SCR_HCE;
21
+F: docs/specs/acpi_pci_hotplug.rst
24
+ }
22
+F: docs/specs/acpi_hw_reduced_hotplug.rst
25
+
23
26
/* Set to non-secure if not a secure boot */
24
ACPI/HEST/GHES
27
if (!info->secure_boot &&
25
R: Dongjiu Geng <gengdongjiu1@gmail.com>
28
(cs != first_cpu || !info->secure_board_setup)) {
26
@@ -XXX,XX +XXX,XX @@ F: hw/acpi/nvdimm.c
27
F: hw/mem/nvdimm.c
28
F: include/hw/mem/nvdimm.h
29
F: docs/nvdimm.txt
30
+F: docs/specs/acpi_nvdimm.rst
31
32
e1000x
33
M: Dmitry Fleytman <dmitry.fleytman@gmail.com>
29
--
34
--
30
2.16.2
35
2.20.1
31
36
32
37
diff view generated by jsdifflib
New patch
1
The xen_available() function is used only to produce an error
2
for some Xen-specific command line options in QEMU binaries where
3
Xen support was not compiled in: it just returns the value of
4
the CONFIG_XEN define.
1
5
6
Now that accelerators are QOM classes, we can check for
7
"does this binary have Xen compiled in" with accel_find("xen"),
8
and drop the xen_available() function.
9
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20210730105947.28215-2-peter.maydell@linaro.org
13
---
14
include/sysemu/arch_init.h | 1 -
15
softmmu/arch_init.c | 9 ---------
16
softmmu/vl.c | 6 +++---
17
3 files changed, 3 insertions(+), 13 deletions(-)
18
19
diff --git a/include/sysemu/arch_init.h b/include/sysemu/arch_init.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/include/sysemu/arch_init.h
22
+++ b/include/sysemu/arch_init.h
23
@@ -XXX,XX +XXX,XX @@ enum {
24
extern const uint32_t arch_type;
25
26
int kvm_available(void);
27
-int xen_available(void);
28
29
/* default virtio transport per architecture */
30
#define QEMU_ARCH_VIRTIO_PCI (QEMU_ARCH_ALPHA | QEMU_ARCH_ARM | \
31
diff --git a/softmmu/arch_init.c b/softmmu/arch_init.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/softmmu/arch_init.c
34
+++ b/softmmu/arch_init.c
35
@@ -XXX,XX +XXX,XX @@ int kvm_available(void)
36
return 0;
37
#endif
38
}
39
-
40
-int xen_available(void)
41
-{
42
-#ifdef CONFIG_XEN
43
- return 1;
44
-#else
45
- return 0;
46
-#endif
47
-}
48
diff --git a/softmmu/vl.c b/softmmu/vl.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/softmmu/vl.c
51
+++ b/softmmu/vl.c
52
@@ -XXX,XX +XXX,XX @@ void qemu_init(int argc, char **argv, char **envp)
53
has_defaults = 0;
54
break;
55
case QEMU_OPTION_xen_domid:
56
- if (!(xen_available())) {
57
+ if (!(accel_find("xen"))) {
58
error_report("Option not supported for this target");
59
exit(1);
60
}
61
xen_domid = atoi(optarg);
62
break;
63
case QEMU_OPTION_xen_attach:
64
- if (!(xen_available())) {
65
+ if (!(accel_find("xen"))) {
66
error_report("Option not supported for this target");
67
exit(1);
68
}
69
xen_mode = XEN_ATTACH;
70
break;
71
case QEMU_OPTION_xen_domid_restrict:
72
- if (!(xen_available())) {
73
+ if (!(accel_find("xen"))) {
74
error_report("Option not supported for this target");
75
exit(1);
76
}
77
--
78
2.20.1
79
80
diff view generated by jsdifflib
New patch
1
The kvm_available() function reports whether KVM support was
2
compiled into the QEMU binary; it returns the value of the
3
CONFIG_KVM define.
1
4
5
The only place in the codebase where we use this function is
6
in qmp_query_kvm(). Now that accelerators are based on QOM
7
classes we can instead use accel_find("kvm") and remove the
8
kvm_available() function.
9
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20210730105947.28215-3-peter.maydell@linaro.org
13
---
14
include/sysemu/arch_init.h | 2 --
15
monitor/qmp-cmds.c | 2 +-
16
softmmu/arch_init.c | 9 ---------
17
3 files changed, 1 insertion(+), 12 deletions(-)
18
19
diff --git a/include/sysemu/arch_init.h b/include/sysemu/arch_init.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/include/sysemu/arch_init.h
22
+++ b/include/sysemu/arch_init.h
23
@@ -XXX,XX +XXX,XX @@ enum {
24
25
extern const uint32_t arch_type;
26
27
-int kvm_available(void);
28
-
29
/* default virtio transport per architecture */
30
#define QEMU_ARCH_VIRTIO_PCI (QEMU_ARCH_ALPHA | QEMU_ARCH_ARM | \
31
QEMU_ARCH_HPPA | QEMU_ARCH_I386 | \
32
diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/monitor/qmp-cmds.c
35
+++ b/monitor/qmp-cmds.c
36
@@ -XXX,XX +XXX,XX @@ KvmInfo *qmp_query_kvm(Error **errp)
37
KvmInfo *info = g_malloc0(sizeof(*info));
38
39
info->enabled = kvm_enabled();
40
- info->present = kvm_available();
41
+ info->present = accel_find("kvm");
42
43
return info;
44
}
45
diff --git a/softmmu/arch_init.c b/softmmu/arch_init.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/softmmu/arch_init.c
48
+++ b/softmmu/arch_init.c
49
@@ -XXX,XX +XXX,XX @@ int graphic_depth = 32;
50
#endif
51
52
const uint32_t arch_type = QEMU_ARCH;
53
-
54
-int kvm_available(void)
55
-{
56
-#ifdef CONFIG_KVM
57
- return 1;
58
-#else
59
- return 0;
60
-#endif
61
-}
62
--
63
2.20.1
64
65
diff view generated by jsdifflib
New patch
1
arch_init.c does very little but has a long list of #include lines.
2
Remove all the unnecessary ones.
1
3
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20210730105947.28215-4-peter.maydell@linaro.org
7
---
8
softmmu/arch_init.c | 7 -------
9
1 file changed, 7 deletions(-)
10
11
diff --git a/softmmu/arch_init.c b/softmmu/arch_init.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/softmmu/arch_init.c
14
+++ b/softmmu/arch_init.c
15
@@ -XXX,XX +XXX,XX @@
16
*/
17
#include "qemu/osdep.h"
18
#include "sysemu/arch_init.h"
19
-#include "hw/pci/pci.h"
20
-#include "hw/audio/soundhw.h"
21
-#include "qapi/error.h"
22
-#include "qemu/config-file.h"
23
-#include "qemu/error-report.h"
24
-#include "hw/acpi/acpi.h"
25
-#include "qemu/help_option.h"
26
27
#ifdef TARGET_SPARC
28
int graphic_width = 1024;
29
--
30
2.20.1
31
32
diff view generated by jsdifflib
New patch
1
Instead of using an ifdef ladder in arch_init.c (which we then have
2
to manually update every time we add or remove a target
3
architecture), have meson.build put "#define QEMU_ARCH QEMU_ARCH_FOO"
4
in the config-target.h file.
1
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20210730105947.28215-5-peter.maydell@linaro.org
10
---
11
meson.build | 2 ++
12
softmmu/arch_init.c | 41 -----------------------------------------
13
2 files changed, 2 insertions(+), 41 deletions(-)
14
15
diff --git a/meson.build b/meson.build
16
index XXXXXXX..XXXXXXX 100644
17
--- a/meson.build
18
+++ b/meson.build
19
@@ -XXX,XX +XXX,XX @@ foreach target : target_dirs
20
config_target_data.set(k, v)
21
endif
22
endforeach
23
+ config_target_data.set('QEMU_ARCH',
24
+ 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
25
config_target_h += {target: configure_file(output: target + '-config-target.h',
26
configuration: config_target_data)}
27
28
diff --git a/softmmu/arch_init.c b/softmmu/arch_init.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/softmmu/arch_init.c
31
+++ b/softmmu/arch_init.c
32
@@ -XXX,XX +XXX,XX @@ int graphic_height = 600;
33
int graphic_depth = 32;
34
#endif
35
36
-
37
-#if defined(TARGET_ALPHA)
38
-#define QEMU_ARCH QEMU_ARCH_ALPHA
39
-#elif defined(TARGET_ARM)
40
-#define QEMU_ARCH QEMU_ARCH_ARM
41
-#elif defined(TARGET_CRIS)
42
-#define QEMU_ARCH QEMU_ARCH_CRIS
43
-#elif defined(TARGET_HPPA)
44
-#define QEMU_ARCH QEMU_ARCH_HPPA
45
-#elif defined(TARGET_I386)
46
-#define QEMU_ARCH QEMU_ARCH_I386
47
-#elif defined(TARGET_M68K)
48
-#define QEMU_ARCH QEMU_ARCH_M68K
49
-#elif defined(TARGET_MICROBLAZE)
50
-#define QEMU_ARCH QEMU_ARCH_MICROBLAZE
51
-#elif defined(TARGET_MIPS)
52
-#define QEMU_ARCH QEMU_ARCH_MIPS
53
-#elif defined(TARGET_NIOS2)
54
-#define QEMU_ARCH QEMU_ARCH_NIOS2
55
-#elif defined(TARGET_OPENRISC)
56
-#define QEMU_ARCH QEMU_ARCH_OPENRISC
57
-#elif defined(TARGET_PPC)
58
-#define QEMU_ARCH QEMU_ARCH_PPC
59
-#elif defined(TARGET_RISCV)
60
-#define QEMU_ARCH QEMU_ARCH_RISCV
61
-#elif defined(TARGET_RX)
62
-#define QEMU_ARCH QEMU_ARCH_RX
63
-#elif defined(TARGET_S390X)
64
-#define QEMU_ARCH QEMU_ARCH_S390X
65
-#elif defined(TARGET_SH4)
66
-#define QEMU_ARCH QEMU_ARCH_SH4
67
-#elif defined(TARGET_SPARC)
68
-#define QEMU_ARCH QEMU_ARCH_SPARC
69
-#elif defined(TARGET_TRICORE)
70
-#define QEMU_ARCH QEMU_ARCH_TRICORE
71
-#elif defined(TARGET_XTENSA)
72
-#define QEMU_ARCH QEMU_ARCH_XTENSA
73
-#elif defined(TARGET_AVR)
74
-#define QEMU_ARCH QEMU_ARCH_AVR
75
-#endif
76
-
77
const uint32_t arch_type = QEMU_ARCH;
78
--
79
2.20.1
80
81
diff view generated by jsdifflib
1
Add some assertions that if we're about to boot an AArch64 kernel,
1
When Hexagon was added we forgot to add it to the QEMU_ARCH_*
2
the board code has not mistakenly set either secure_boot or
2
enumeration. This doesn't cause a visible effect because at the
3
secure_board_setup. It doesn't make sense to set secure_boot,
3
moment Hexagon is linux-user only and the QEMU_ARCH_* constants are
4
because all AArch64 kernels must be booted in non-secure mode.
4
only used in softmmu, but we might as well add it in, since it's the
5
5
only architecture currently missing from the list.
6
It might in theory make sense to set secure_board_setup, but
7
we don't currently support that, because only the AArch32
8
bootloader[] code calls this hook; bootloader_aarch64[] does not.
9
Since we don't have a current need for this functionality, just
10
assert that we don't try to use it. If it's needed we'll add
11
it later.
12
6
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20180313153458.26822-3-peter.maydell@linaro.org
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
11
Message-id: 20210730105947.28215-6-peter.maydell@linaro.org
16
---
12
---
17
hw/arm/boot.c | 7 +++++++
13
include/sysemu/arch_init.h | 1 +
18
1 file changed, 7 insertions(+)
14
1 file changed, 1 insertion(+)
19
15
20
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
16
diff --git a/include/sysemu/arch_init.h b/include/sysemu/arch_init.h
21
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/boot.c
18
--- a/include/sysemu/arch_init.h
23
+++ b/hw/arm/boot.c
19
+++ b/include/sysemu/arch_init.h
24
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
20
@@ -XXX,XX +XXX,XX @@ enum {
25
} else {
21
QEMU_ARCH_RISCV = (1 << 19),
26
env->pstate = PSTATE_MODE_EL1h;
22
QEMU_ARCH_RX = (1 << 20),
27
}
23
QEMU_ARCH_AVR = (1 << 21),
28
+ /* AArch64 kernels never boot in secure mode */
24
+ QEMU_ARCH_HEXAGON = (1 << 22),
29
+ assert(!info->secure_boot);
25
30
+ /* This hook is only supported for AArch32 currently:
26
QEMU_ARCH_NONE = (1 << 31),
31
+ * bootloader_aarch64[] will not call the hook, and
27
};
32
+ * the code above has already dropped us into EL2 or EL1.
33
+ */
34
+ assert(!info->secure_board_setup);
35
}
36
37
/* Set to non-secure if not a secure boot */
38
--
28
--
39
2.16.2
29
2.20.1
40
30
41
31
diff view generated by jsdifflib
New patch
1
The QEMU_ARCH_VIRTIO_* defines are used only in one file,
2
qdev-monitor.c. Move them to that file.
1
3
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Markus Armbruster <armbru@redhat.com>
7
Message-id: 20210730105947.28215-7-peter.maydell@linaro.org
8
---
9
include/sysemu/arch_init.h | 9 ---------
10
softmmu/qdev-monitor.c | 9 +++++++++
11
2 files changed, 9 insertions(+), 9 deletions(-)
12
13
diff --git a/include/sysemu/arch_init.h b/include/sysemu/arch_init.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/include/sysemu/arch_init.h
16
+++ b/include/sysemu/arch_init.h
17
@@ -XXX,XX +XXX,XX @@ enum {
18
19
extern const uint32_t arch_type;
20
21
-/* default virtio transport per architecture */
22
-#define QEMU_ARCH_VIRTIO_PCI (QEMU_ARCH_ALPHA | QEMU_ARCH_ARM | \
23
- QEMU_ARCH_HPPA | QEMU_ARCH_I386 | \
24
- QEMU_ARCH_MIPS | QEMU_ARCH_PPC | \
25
- QEMU_ARCH_RISCV | QEMU_ARCH_SH4 | \
26
- QEMU_ARCH_SPARC | QEMU_ARCH_XTENSA)
27
-#define QEMU_ARCH_VIRTIO_CCW (QEMU_ARCH_S390X)
28
-#define QEMU_ARCH_VIRTIO_MMIO (QEMU_ARCH_M68K)
29
-
30
#endif
31
diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/softmmu/qdev-monitor.c
34
+++ b/softmmu/qdev-monitor.c
35
@@ -XXX,XX +XXX,XX @@ typedef struct QDevAlias
36
uint32_t arch_mask;
37
} QDevAlias;
38
39
+/* default virtio transport per architecture */
40
+#define QEMU_ARCH_VIRTIO_PCI (QEMU_ARCH_ALPHA | QEMU_ARCH_ARM | \
41
+ QEMU_ARCH_HPPA | QEMU_ARCH_I386 | \
42
+ QEMU_ARCH_MIPS | QEMU_ARCH_PPC | \
43
+ QEMU_ARCH_RISCV | QEMU_ARCH_SH4 | \
44
+ QEMU_ARCH_SPARC | QEMU_ARCH_XTENSA)
45
+#define QEMU_ARCH_VIRTIO_CCW (QEMU_ARCH_S390X)
46
+#define QEMU_ARCH_VIRTIO_MMIO (QEMU_ARCH_M68K)
47
+
48
/* Please keep this table sorted by typename. */
49
static const QDevAlias qdev_alias_table[] = {
50
{ "AC97", "ac97" }, /* -soundhw name */
51
--
52
2.20.1
53
54
diff view generated by jsdifflib
1
The BCM2837 sets the Aff1 field of the MPIDR affinity values for the
1
arch_init.h only defines the QEMU_ARCH_* enumeration and the
2
CPUs to 0, whereas the BCM2836 uses 0xf. Set this correctly, as it
2
arch_type global. Don't include it in files that don't use those.
3
is required for Linux to boot.
4
3
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20180313153458.26822-8-peter.maydell@linaro.org
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20210730105947.28215-8-peter.maydell@linaro.org
9
---
9
---
10
hw/arm/bcm2836.c | 11 +++++++----
10
blockdev.c | 1 -
11
1 file changed, 7 insertions(+), 4 deletions(-)
11
hw/i386/pc.c | 1 -
12
hw/i386/pc_piix.c | 1 -
13
hw/i386/pc_q35.c | 1 -
14
hw/mips/jazz.c | 1 -
15
hw/mips/malta.c | 1 -
16
hw/ppc/prep.c | 1 -
17
hw/riscv/sifive_e.c | 1 -
18
hw/riscv/sifive_u.c | 1 -
19
hw/riscv/spike.c | 1 -
20
hw/riscv/virt.c | 1 -
21
monitor/qmp-cmds.c | 1 -
22
target/ppc/cpu_init.c | 1 -
23
target/s390x/cpu-sysemu.c | 1 -
24
14 files changed, 14 deletions(-)
12
25
13
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
26
diff --git a/blockdev.c b/blockdev.c
14
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/bcm2836.c
28
--- a/blockdev.c
16
+++ b/hw/arm/bcm2836.c
29
+++ b/blockdev.c
17
@@ -XXX,XX +XXX,XX @@
30
@@ -XXX,XX +XXX,XX @@
18
31
#include "sysemu/iothread.h"
19
struct BCM283XInfo {
32
#include "block/block_int.h"
20
const char *name;
33
#include "block/trace.h"
21
+ int clusterid;
34
-#include "sysemu/arch_init.h"
22
};
35
#include "sysemu/runstate.h"
23
36
#include "sysemu/replay.h"
24
static const BCM283XInfo bcm283x_socs[] = {
37
#include "qemu/cutils.h"
25
{
38
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
26
.name = TYPE_BCM2836,
39
index XXXXXXX..XXXXXXX 100644
27
+ .clusterid = 0xf,
40
--- a/hw/i386/pc.c
28
},
41
+++ b/hw/i386/pc.c
29
{
42
@@ -XXX,XX +XXX,XX @@
30
.name = TYPE_BCM2837,
43
#include "hw/xen/start_info.h"
31
+ .clusterid = 0x0,
44
#include "ui/qemu-spice.h"
32
},
45
#include "exec/memory.h"
33
};
46
-#include "sysemu/arch_init.h"
34
47
#include "qemu/bitmap.h"
35
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
48
#include "qemu/config-file.h"
36
static void bcm2836_realize(DeviceState *dev, Error **errp)
49
#include "qemu/error-report.h"
37
{
50
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
38
BCM283XState *s = BCM283X(dev);
51
index XXXXXXX..XXXXXXX 100644
39
+ BCM283XClass *bc = BCM283X_GET_CLASS(dev);
52
--- a/hw/i386/pc_piix.c
40
+ const BCM283XInfo *info = bc->info;
53
+++ b/hw/i386/pc_piix.c
41
Object *obj;
54
@@ -XXX,XX +XXX,XX @@
42
Error *err = NULL;
55
#include "sysemu/kvm.h"
43
int n;
56
#include "hw/kvm/clock.h"
44
@@ -XXX,XX +XXX,XX @@ static void bcm2836_realize(DeviceState *dev, Error **errp)
57
#include "hw/sysbus.h"
45
qdev_get_gpio_in_named(DEVICE(&s->control), "gpu-fiq", 0));
58
-#include "sysemu/arch_init.h"
46
59
#include "hw/i2c/smbus_eeprom.h"
47
for (n = 0; n < BCM283X_NCPUS; n++) {
60
#include "hw/xen/xen-x86.h"
48
- /* Mirror bcm2836, which has clusterid set to 0xf
61
#include "exec/memory.h"
49
- * TODO: this should be converted to a property of ARM_CPU
62
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
50
- */
63
index XXXXXXX..XXXXXXX 100644
51
- s->cpus[n].mp_affinity = 0xF00 | n;
64
--- a/hw/i386/pc_q35.c
52
+ /* TODO: this should be converted to a property of ARM_CPU */
65
+++ b/hw/i386/pc_q35.c
53
+ s->cpus[n].mp_affinity = (info->clusterid << 8) | n;
66
@@ -XXX,XX +XXX,XX @@
54
67
#include "qemu/osdep.h"
55
/* set periphbase/CBAR value for CPU-local registers */
68
#include "qemu/units.h"
56
object_property_set_int(OBJECT(&s->cpus[n]),
69
#include "hw/loader.h"
70
-#include "sysemu/arch_init.h"
71
#include "hw/i2c/smbus_eeprom.h"
72
#include "hw/rtc/mc146818rtc.h"
73
#include "sysemu/kvm.h"
74
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/hw/mips/jazz.c
77
+++ b/hw/mips/jazz.c
78
@@ -XXX,XX +XXX,XX @@
79
#include "hw/isa/isa.h"
80
#include "hw/block/fdc.h"
81
#include "sysemu/sysemu.h"
82
-#include "sysemu/arch_init.h"
83
#include "hw/boards.h"
84
#include "net/net.h"
85
#include "hw/scsi/esp.h"
86
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/hw/mips/malta.c
89
+++ b/hw/mips/malta.c
90
@@ -XXX,XX +XXX,XX @@
91
#include "hw/mips/mips.h"
92
#include "hw/mips/cpudevs.h"
93
#include "hw/pci/pci.h"
94
-#include "sysemu/arch_init.h"
95
#include "qemu/log.h"
96
#include "hw/mips/bios.h"
97
#include "hw/ide.h"
98
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
99
index XXXXXXX..XXXXXXX 100644
100
--- a/hw/ppc/prep.c
101
+++ b/hw/ppc/prep.c
102
@@ -XXX,XX +XXX,XX @@
103
#include "hw/rtc/mc146818rtc.h"
104
#include "hw/isa/pc87312.h"
105
#include "hw/qdev-properties.h"
106
-#include "sysemu/arch_init.h"
107
#include "sysemu/kvm.h"
108
#include "sysemu/reset.h"
109
#include "trace.h"
110
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
111
index XXXXXXX..XXXXXXX 100644
112
--- a/hw/riscv/sifive_e.c
113
+++ b/hw/riscv/sifive_e.c
114
@@ -XXX,XX +XXX,XX @@
115
#include "hw/intc/sifive_plic.h"
116
#include "hw/misc/sifive_e_prci.h"
117
#include "chardev/char.h"
118
-#include "sysemu/arch_init.h"
119
#include "sysemu/sysemu.h"
120
121
static const MemMapEntry sifive_e_memmap[] = {
122
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
123
index XXXXXXX..XXXXXXX 100644
124
--- a/hw/riscv/sifive_u.c
125
+++ b/hw/riscv/sifive_u.c
126
@@ -XXX,XX +XXX,XX @@
127
#include "hw/intc/sifive_plic.h"
128
#include "chardev/char.h"
129
#include "net/eth.h"
130
-#include "sysemu/arch_init.h"
131
#include "sysemu/device_tree.h"
132
#include "sysemu/runstate.h"
133
#include "sysemu/sysemu.h"
134
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
135
index XXXXXXX..XXXXXXX 100644
136
--- a/hw/riscv/spike.c
137
+++ b/hw/riscv/spike.c
138
@@ -XXX,XX +XXX,XX @@
139
#include "hw/char/riscv_htif.h"
140
#include "hw/intc/sifive_clint.h"
141
#include "chardev/char.h"
142
-#include "sysemu/arch_init.h"
143
#include "sysemu/device_tree.h"
144
#include "sysemu/sysemu.h"
145
146
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
147
index XXXXXXX..XXXXXXX 100644
148
--- a/hw/riscv/virt.c
149
+++ b/hw/riscv/virt.c
150
@@ -XXX,XX +XXX,XX @@
151
#include "hw/intc/sifive_plic.h"
152
#include "hw/misc/sifive_test.h"
153
#include "chardev/char.h"
154
-#include "sysemu/arch_init.h"
155
#include "sysemu/device_tree.h"
156
#include "sysemu/sysemu.h"
157
#include "hw/pci/pci.h"
158
diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
159
index XXXXXXX..XXXXXXX 100644
160
--- a/monitor/qmp-cmds.c
161
+++ b/monitor/qmp-cmds.c
162
@@ -XXX,XX +XXX,XX @@
163
#include "sysemu/kvm.h"
164
#include "sysemu/runstate.h"
165
#include "sysemu/runstate-action.h"
166
-#include "sysemu/arch_init.h"
167
#include "sysemu/blockdev.h"
168
#include "sysemu/block-backend.h"
169
#include "qapi/error.h"
170
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
171
index XXXXXXX..XXXXXXX 100644
172
--- a/target/ppc/cpu_init.c
173
+++ b/target/ppc/cpu_init.c
174
@@ -XXX,XX +XXX,XX @@
175
#include "disas/dis-asm.h"
176
#include "exec/gdbstub.h"
177
#include "kvm_ppc.h"
178
-#include "sysemu/arch_init.h"
179
#include "sysemu/cpus.h"
180
#include "sysemu/hw_accel.h"
181
#include "sysemu/tcg.h"
182
diff --git a/target/s390x/cpu-sysemu.c b/target/s390x/cpu-sysemu.c
183
index XXXXXXX..XXXXXXX 100644
184
--- a/target/s390x/cpu-sysemu.c
185
+++ b/target/s390x/cpu-sysemu.c
186
@@ -XXX,XX +XXX,XX @@
187
188
#include "hw/s390x/pv.h"
189
#include "hw/boards.h"
190
-#include "sysemu/arch_init.h"
191
#include "sysemu/sysemu.h"
192
#include "sysemu/tcg.h"
193
#include "hw/core/sysemu-cpu-ops.h"
57
--
194
--
58
2.16.2
195
2.20.1
59
196
60
197
diff view generated by jsdifflib
New patch
1
We added a stub for the arch_type global in commit 5964ed56d9a1 so
2
that we could compile blockdev.c into the tools. However, in commit
3
9db1d3a2be9bf we removed the only use of arch_type from blockdev.c.
4
The stub is therefore no longer needed, and we can delete it again,
5
together with the QEMU_ARCH_NONE value that only the stub was using.
1
6
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20210730105947.28215-9-peter.maydell@linaro.org
11
---
12
include/sysemu/arch_init.h | 2 --
13
stubs/arch_type.c | 4 ----
14
stubs/meson.build | 1 -
15
3 files changed, 7 deletions(-)
16
delete mode 100644 stubs/arch_type.c
17
18
diff --git a/include/sysemu/arch_init.h b/include/sysemu/arch_init.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/include/sysemu/arch_init.h
21
+++ b/include/sysemu/arch_init.h
22
@@ -XXX,XX +XXX,XX @@ enum {
23
QEMU_ARCH_RX = (1 << 20),
24
QEMU_ARCH_AVR = (1 << 21),
25
QEMU_ARCH_HEXAGON = (1 << 22),
26
-
27
- QEMU_ARCH_NONE = (1 << 31),
28
};
29
30
extern const uint32_t arch_type;
31
diff --git a/stubs/arch_type.c b/stubs/arch_type.c
32
deleted file mode 100644
33
index XXXXXXX..XXXXXXX
34
--- a/stubs/arch_type.c
35
+++ /dev/null
36
@@ -XXX,XX +XXX,XX @@
37
-#include "qemu/osdep.h"
38
-#include "sysemu/arch_init.h"
39
-
40
-const uint32_t arch_type = QEMU_ARCH_NONE;
41
diff --git a/stubs/meson.build b/stubs/meson.build
42
index XXXXXXX..XXXXXXX 100644
43
--- a/stubs/meson.build
44
+++ b/stubs/meson.build
45
@@ -XXX,XX +XXX,XX @@
46
-stub_ss.add(files('arch_type.c'))
47
stub_ss.add(files('bdrv-next-monitor-owned.c'))
48
stub_ss.add(files('blk-commit-all.c'))
49
stub_ss.add(files('blk-exp-close-all.c'))
50
--
51
2.20.1
52
53
diff view generated by jsdifflib
New patch
1
The gunzip() function reads various fields from a passed in source
2
buffer in order to skip a header before passing the actual compressed
3
data to the zlib inflate() function. It does check whether the
4
passed in buffer is too small, but unfortunately it checks that only
5
after reading bytes from the src buffer, so it could read off the end
6
of the buffer.
1
7
8
You can see this with valgrind:
9
10
$ printf "%b" '\x1f\x8b' > /tmp/image
11
$ valgrind qemu-system-aarch64 -display none -M virt -cpu max -kernel /tmp/image
12
[...]
13
==19224== Invalid read of size 1
14
==19224== at 0x67302E: gunzip (loader.c:558)
15
==19224== by 0x673907: load_image_gzipped_buffer (loader.c:788)
16
==19224== by 0xA18032: load_aarch64_image (boot.c:932)
17
==19224== by 0xA18489: arm_setup_direct_kernel_boot (boot.c:1063)
18
==19224== by 0xA18D90: arm_load_kernel (boot.c:1317)
19
==19224== by 0x9F3651: machvirt_init (virt.c:2114)
20
==19224== by 0x794B7A: machine_run_board_init (machine.c:1272)
21
==19224== by 0xD5CAD3: qemu_init_board (vl.c:2618)
22
==19224== by 0xD5CCA6: qmp_x_exit_preconfig (vl.c:2692)
23
==19224== by 0xD5F32E: qemu_init (vl.c:3713)
24
==19224== by 0x5ADDB1: main (main.c:49)
25
==19224== Address 0x3802a873 is 0 bytes after a block of size 3 alloc'd
26
==19224== at 0x4C31B0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
27
==19224== by 0x61E7657: g_file_get_contents (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5600.4)
28
==19224== by 0x673895: load_image_gzipped_buffer (loader.c:771)
29
==19224== by 0xA18032: load_aarch64_image (boot.c:932)
30
==19224== by 0xA18489: arm_setup_direct_kernel_boot (boot.c:1063)
31
==19224== by 0xA18D90: arm_load_kernel (boot.c:1317)
32
==19224== by 0x9F3651: machvirt_init (virt.c:2114)
33
==19224== by 0x794B7A: machine_run_board_init (machine.c:1272)
34
==19224== by 0xD5CAD3: qemu_init_board (vl.c:2618)
35
==19224== by 0xD5CCA6: qmp_x_exit_preconfig (vl.c:2692)
36
==19224== by 0xD5F32E: qemu_init (vl.c:3713)
37
==19224== by 0x5ADDB1: main (main.c:49)
38
39
Check that we have enough bytes of data to read the header bytes that
40
we read before we read them.
41
42
Fixes: Coverity 1458997
43
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
44
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
45
Message-id: 20210812141803.20913-1-peter.maydell@linaro.org
46
---
47
hw/core/loader.c | 35 +++++++++++++++++++++++++----------
48
1 file changed, 25 insertions(+), 10 deletions(-)
49
50
diff --git a/hw/core/loader.c b/hw/core/loader.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/core/loader.c
53
+++ b/hw/core/loader.c
54
@@ -XXX,XX +XXX,XX @@ ssize_t gunzip(void *dst, size_t dstlen, uint8_t *src, size_t srclen)
55
56
/* skip header */
57
i = 10;
58
+ if (srclen < 4) {
59
+ goto toosmall;
60
+ }
61
flags = src[3];
62
if (src[2] != DEFLATED || (flags & RESERVED) != 0) {
63
puts ("Error: Bad gzipped data\n");
64
return -1;
65
}
66
- if ((flags & EXTRA_FIELD) != 0)
67
+ if ((flags & EXTRA_FIELD) != 0) {
68
+ if (srclen < 12) {
69
+ goto toosmall;
70
+ }
71
i = 12 + src[10] + (src[11] << 8);
72
- if ((flags & ORIG_NAME) != 0)
73
- while (src[i++] != 0)
74
- ;
75
- if ((flags & COMMENT) != 0)
76
- while (src[i++] != 0)
77
- ;
78
- if ((flags & HEAD_CRC) != 0)
79
+ }
80
+ if ((flags & ORIG_NAME) != 0) {
81
+ while (i < srclen && src[i++] != 0) {
82
+ /* do nothing */
83
+ }
84
+ }
85
+ if ((flags & COMMENT) != 0) {
86
+ while (i < srclen && src[i++] != 0) {
87
+ /* do nothing */
88
+ }
89
+ }
90
+ if ((flags & HEAD_CRC) != 0) {
91
i += 2;
92
+ }
93
if (i >= srclen) {
94
- puts ("Error: gunzip out of data in header\n");
95
- return -1;
96
+ goto toosmall;
97
}
98
99
s.zalloc = zalloc;
100
@@ -XXX,XX +XXX,XX @@ ssize_t gunzip(void *dst, size_t dstlen, uint8_t *src, size_t srclen)
101
inflateEnd(&s);
102
103
return dstbytes;
104
+
105
+toosmall:
106
+ puts("Error: gunzip out of data in header\n");
107
+ return -1;
108
}
109
110
/* Load a U-Boot image. */
111
--
112
2.20.1
113
114
diff view generated by jsdifflib
New patch
1
In the alignment check added to qemu_ram_alloc_from_fd() in commit
2
ce317be98db0dfdfa, the condition includes a check that 'mr' is not
3
NULL. This check is unnecessary because we can assume that the
4
caller always passes us a valid MemoryRegion, and indeed later in the
5
function we assume mr is not NULL when we pass it to file_ram_alloc()
6
as new_block->mr. Remove it.
1
7
8
Fixes: Coverity 1459867
9
Fixes: ce317be98d ("exec: fetch the alignment of Linux devdax pmem character device nodes")
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Jingqi Liu <jingqi.liu@intel.com>
12
Message-id: 20210812150624.29139-1-peter.maydell@linaro.org
13
---
14
softmmu/physmem.c | 2 +-
15
1 file changed, 1 insertion(+), 1 deletion(-)
16
17
diff --git a/softmmu/physmem.c b/softmmu/physmem.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/softmmu/physmem.c
20
+++ b/softmmu/physmem.c
21
@@ -XXX,XX +XXX,XX @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
22
}
23
24
file_align = get_file_align(fd);
25
- if (file_align > 0 && mr && file_align > mr->align) {
26
+ if (file_align > 0 && file_align > mr->align) {
27
error_setg(errp, "backing store align 0x%" PRIx64
28
" is larger than 'align' option 0x%" PRIx64,
29
file_align, mr->align);
30
--
31
2.20.1
32
33
diff view generated by jsdifflib
New patch
1
The realpath() function can return NULL on error, so we need to check
2
for it to avoid crashing when we try to strstr() into it.
3
This can happen if we run out of memory, or if /sys/ is not mounted,
4
among other situations.
1
5
6
Fixes: Coverity 1459913, 1460474
7
Fixes: ce317be98db0 ("exec: fetch the alignment of Linux devdax pmem character device nodes")
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Jingqi Liu <jingqi.liu@intel.com>
10
Message-id: 20210812151525.31456-1-peter.maydell@linaro.org
11
---
12
softmmu/physmem.c | 3 +++
13
1 file changed, 3 insertions(+)
14
15
diff --git a/softmmu/physmem.c b/softmmu/physmem.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/softmmu/physmem.c
18
+++ b/softmmu/physmem.c
19
@@ -XXX,XX +XXX,XX @@ static int64_t get_file_align(int fd)
20
path = g_strdup_printf("/sys/dev/char/%d:%d",
21
major(st.st_rdev), minor(st.st_rdev));
22
rpath = realpath(path, NULL);
23
+ if (!rpath) {
24
+ return -errno;
25
+ }
26
27
rc = daxctl_new(&ctx);
28
if (rc) {
29
--
30
2.20.1
31
32
diff view generated by jsdifflib
New patch
1
We don't currently zero-initialize the 'struct sockaddr_in' that
2
parse_host_port() fills in, so any fields we don't explicitly
3
initialize might be left as random garbage. POSIX states that
4
implementations may define extensions in sockaddr_in, and that those
5
extensions must not trigger if zero-initialized. So not zero
6
initializing might result in inadvertently triggering an impdef
7
extension.
1
8
9
memset() the sockaddr_in before we start to fill it in.
10
11
Fixes: Coverity CID 1005338
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Eric Blake <eblake@redhat.com>
14
Message-id: 20210813150506.7768-2-peter.maydell@linaro.org
15
---
16
net/net.c | 2 ++
17
1 file changed, 2 insertions(+)
18
19
diff --git a/net/net.c b/net/net.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/net/net.c
22
+++ b/net/net.c
23
@@ -XXX,XX +XXX,XX @@ int parse_host_port(struct sockaddr_in *saddr, const char *str,
24
const char *addr, *p, *r;
25
int port, ret = 0;
26
27
+ memset(saddr, 0, sizeof(*saddr));
28
+
29
substrings = g_strsplit(str, ":", 2);
30
if (!substrings || !substrings[0] || !substrings[1]) {
31
error_setg(errp, "host address '%s' doesn't contain ':' "
32
--
33
2.20.1
34
35
diff view generated by jsdifflib
New patch
1
Zero-initialize sockaddr_in and sockaddr_un structs that we're about
2
to fill in and pass to bind() or connect(), to ensure we don't leave
3
possible implementation-defined extension fields as uninitialized
4
garbage.
1
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Eric Blake <eblake@redhat.com>
8
Message-id: 20210813150506.7768-3-peter.maydell@linaro.org
9
---
10
gdbstub.c | 4 ++--
11
1 file changed, 2 insertions(+), 2 deletions(-)
12
13
diff --git a/gdbstub.c b/gdbstub.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/gdbstub.c
16
+++ b/gdbstub.c
17
@@ -XXX,XX +XXX,XX @@ static bool gdb_accept_socket(int gdb_fd)
18
19
static int gdbserver_open_socket(const char *path)
20
{
21
- struct sockaddr_un sockaddr;
22
+ struct sockaddr_un sockaddr = {};
23
int fd, ret;
24
25
fd = socket(AF_UNIX, SOCK_STREAM, 0);
26
@@ -XXX,XX +XXX,XX @@ static int gdbserver_open_socket(const char *path)
27
28
static bool gdb_accept_tcp(int gdb_fd)
29
{
30
- struct sockaddr_in sockaddr;
31
+ struct sockaddr_in sockaddr = {};
32
socklen_t len;
33
int fd;
34
35
--
36
2.20.1
37
38
diff view generated by jsdifflib
1
The TypeInfo and state struct for bcm2386 disagree about what the
1
Zero-initialize the sockaddr_in struct that we're about to fill in
2
parent class is -- the TypeInfo says it's TYPE_SYS_BUS_DEVICE,
2
and pass to bind(), to ensure we don't leave possible
3
but the BCM2386State struct only defines the parent_obj field
3
implementation-defined extension fields as uninitialized garbage.
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
4
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
6
Reviewed-by: Eric Blake <eblake@redhat.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Corey Minyard <cminyard@mvista.com>
13
Message-id: 20180313153458.26822-5-peter.maydell@linaro.org
8
Acked-by: Thomas Huth <thuth@redhat.com>
9
Message-id: 20210813150506.7768-4-peter.maydell@linaro.org
14
---
10
---
15
hw/arm/bcm2836.c | 2 +-
11
tests/qtest/ipmi-bt-test.c | 2 +-
16
1 file changed, 1 insertion(+), 1 deletion(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
17
13
18
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
14
diff --git a/tests/qtest/ipmi-bt-test.c b/tests/qtest/ipmi-bt-test.c
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/bcm2836.c
16
--- a/tests/qtest/ipmi-bt-test.c
21
+++ b/hw/arm/bcm2836.c
17
+++ b/tests/qtest/ipmi-bt-test.c
22
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
18
@@ -XXX,XX +XXX,XX @@ static void test_enable_irq(void)
23
19
*/
24
static const TypeInfo bcm2836_type_info = {
20
static void open_socket(void)
25
.name = TYPE_BCM2836,
21
{
26
- .parent = TYPE_SYS_BUS_DEVICE,
22
- struct sockaddr_in myaddr;
27
+ .parent = TYPE_DEVICE,
23
+ struct sockaddr_in myaddr = {};
28
.instance_size = sizeof(BCM2836State),
24
socklen_t addrlen;
29
.instance_init = bcm2836_init,
25
30
.class_init = bcm2836_class_init,
26
myaddr.sin_family = AF_INET;
31
--
27
--
32
2.16.2
28
2.20.1
33
29
34
30
diff view generated by jsdifflib
New patch
1
Zero-initialize sockaddr_in and sockaddr_un structs that we're about
2
to fill in and pass to bind() or connect(), to ensure we don't leave
3
possible implementation-defined extension fields as uninitialized
4
garbage.
1
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Eric Blake <eblake@redhat.com>
8
Message-id: 20210813150506.7768-5-peter.maydell@linaro.org
9
---
10
tests/tcg/multiarch/linux-test.c | 4 ++--
11
1 file changed, 2 insertions(+), 2 deletions(-)
12
13
diff --git a/tests/tcg/multiarch/linux-test.c b/tests/tcg/multiarch/linux-test.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/tcg/multiarch/linux-test.c
16
+++ b/tests/tcg/multiarch/linux-test.c
17
@@ -XXX,XX +XXX,XX @@ static void test_time(void)
18
static int server_socket(void)
19
{
20
int val, fd;
21
- struct sockaddr_in sockaddr;
22
+ struct sockaddr_in sockaddr = {};
23
24
/* server socket */
25
fd = chk_error(socket(PF_INET, SOCK_STREAM, 0));
26
@@ -XXX,XX +XXX,XX @@ static int server_socket(void)
27
static int client_socket(uint16_t port)
28
{
29
int fd;
30
- struct sockaddr_in sockaddr;
31
+ struct sockaddr_in sockaddr = {};
32
33
/* server socket */
34
fd = chk_error(socket(PF_INET, SOCK_STREAM, 0));
35
--
36
2.20.1
37
38
diff view generated by jsdifflib
1
For the rpi1 and 2 we want to boot the Linux kernel via some
1
The SoC realize can fail for legitimate reasons, because it propagates
2
custom setup code that makes sure that the SMC instruction
2
errors up from CPU realize, which in turn can be provoked by user
3
acts as a no-op, because it's used for cache maintenance.
3
error in setting commandline options. Use error_fatal so we report
4
The rpi3 boots AArch64 kernels, which don't need SMC for
4
the error message to the user and exit, rather than asserting
5
cache maintenance and always expect to be booted non-secure.
5
via error_abort.
6
Don't fill in the aarch32-specific parts of the binfo struct.
7
6
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20180313153458.26822-2-peter.maydell@linaro.org
10
Message-id: 20210816135842.25302-2-peter.maydell@linaro.org
12
---
11
---
13
hw/arm/raspi.c | 17 +++++++++++++----
12
hw/arm/raspi.c | 2 +-
14
1 file changed, 13 insertions(+), 4 deletions(-)
13
1 file changed, 1 insertion(+), 1 deletion(-)
15
14
16
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
15
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/raspi.c
17
--- a/hw/arm/raspi.c
19
+++ b/hw/arm/raspi.c
18
+++ b/hw/arm/raspi.c
20
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
19
@@ -XXX,XX +XXX,XX @@ static void raspi_machine_init(MachineState *machine)
21
binfo.board_id = raspi_boardid[version];
20
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(machine->ram));
22
binfo.ram_size = ram_size;
21
object_property_set_int(OBJECT(&s->soc), "board-rev", board_rev,
23
binfo.nb_cpus = smp_cpus;
22
&error_abort);
24
- binfo.board_setup_addr = BOARDSETUP_ADDR;
23
- qdev_realize(DEVICE(&s->soc), NULL, &error_abort);
25
- binfo.write_board_setup = write_board_setup;
24
+ qdev_realize(DEVICE(&s->soc), NULL, &error_fatal);
26
- binfo.secure_board_setup = true;
25
27
- binfo.secure_boot = true;
26
/* Create and plug in the SD cards */
28
+
27
di = drive_get_next(IF_SD);
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
--
28
--
45
2.16.2
29
2.20.1
46
30
47
31
diff view generated by jsdifflib
New patch
1
KVM cannot support multiple address spaces per CPU; if you try to
2
create more than one then cpu_address_space_init() will assert.
1
3
4
In the Arm CPU realize function, detect the configurations which
5
would cause us to need more than one AS, and cleanly fail the
6
realize rather than blundering on into the assertion. This
7
turns this:
8
$ qemu-system-aarch64 -enable-kvm -display none -cpu max -machine raspi3b
9
qemu-system-aarch64: ../../softmmu/physmem.c:747: cpu_address_space_init: Assertion `asidx == 0 || !kvm_enabled()' failed.
10
Aborted
11
12
into:
13
$ qemu-system-aarch64 -enable-kvm -display none -machine raspi3b
14
qemu-system-aarch64: Cannot enable KVM when guest CPU has EL3 enabled
15
16
and this:
17
$ qemu-system-aarch64 -enable-kvm -display none -machine mps3-an524
18
qemu-system-aarch64: ../../softmmu/physmem.c:747: cpu_address_space_init: Assertion `asidx == 0 || !kvm_enabled()' failed.
19
Aborted
20
21
into:
22
$ qemu-system-aarch64 -enable-kvm -display none -machine mps3-an524
23
qemu-system-aarch64: Cannot enable KVM when using an M-profile guest CPU
24
25
Fixes: https://gitlab.com/qemu-project/qemu/-/issues/528
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
28
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
29
Message-id: 20210816135842.25302-3-peter.maydell@linaro.org
30
---
31
target/arm/cpu.c | 23 +++++++++++++++++++++++
32
1 file changed, 23 insertions(+)
33
34
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/cpu.c
37
+++ b/target/arm/cpu.c
38
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
39
}
40
}
41
42
+ if (kvm_enabled()) {
43
+ /*
44
+ * Catch all the cases which might cause us to create more than one
45
+ * address space for the CPU (otherwise we will assert() later in
46
+ * cpu_address_space_init()).
47
+ */
48
+ if (arm_feature(env, ARM_FEATURE_M)) {
49
+ error_setg(errp,
50
+ "Cannot enable KVM when using an M-profile guest CPU");
51
+ return;
52
+ }
53
+ if (cpu->has_el3) {
54
+ error_setg(errp,
55
+ "Cannot enable KVM when guest CPU has EL3 enabled");
56
+ return;
57
+ }
58
+ if (cpu->tag_memory) {
59
+ error_setg(errp,
60
+ "Cannot enable KVM when guest CPUs has MTE enabled");
61
+ return;
62
+ }
63
+ }
64
+
65
{
66
uint64_t scale;
67
68
--
69
2.20.1
70
71
diff view generated by jsdifflib
New patch
1
Now that the CPU realize function will fail cleanly if we ask for EL3
2
when KVM is enabled, we don't need to check for errors explicitly in
3
the virt board code. The reported message is slightly different;
4
it is now:
5
qemu-system-aarch64: Cannot enable KVM when guest CPU has EL3 enabled
6
instead of:
7
qemu-system-aarch64: mach-virt: KVM does not support Security extensions
1
8
9
We don't delete the MTE check because there the logic is more
10
complex; deleting the check would work but makes the error message
11
less helpful, as it would read:
12
qemu-system-aarch64: MTE requested, but not supported by the guest CPU
13
instead of:
14
qemu-system-aarch64: mach-virt: KVM does not support providing MTE to the guest CPU
15
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
Message-id: 20210816135842.25302-4-peter.maydell@linaro.org
20
---
21
hw/arm/virt.c | 5 -----
22
1 file changed, 5 deletions(-)
23
24
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/arm/virt.c
27
+++ b/hw/arm/virt.c
28
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
29
}
30
31
if (vms->secure) {
32
- if (kvm_enabled()) {
33
- error_report("mach-virt: KVM does not support Security extensions");
34
- exit(1);
35
- }
36
-
37
/*
38
* The Secure view of the world is the same as the NonSecure,
39
* but with a few extra devices. Create it as a container region
40
--
41
2.20.1
42
43
diff view generated by jsdifflib
1
The raspi3 has AArch64 CPUs, which means that our smpboot
1
In v7, the HSTR register has a TTEE bit which allows EL0/EL1 accesses
2
code for keeping the secondary CPUs in a pen needs to have
2
to the Thumb2EE TEECR and TEEHBR registers to be trapped to the
3
a version for A64 as well as A32. Without this, the
3
hypervisor. Implement these traps.
4
secondary CPUs go into an infinite loop of taking undefined
5
instruction exceptions.
6
4
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180313153458.26822-10-peter.maydell@linaro.org
7
Message-id: 20210816180305.20137-2-peter.maydell@linaro.org
10
---
8
---
11
hw/arm/raspi.c | 41 ++++++++++++++++++++++++++++++++++++++++-
9
target/arm/cpu.h | 2 ++
12
1 file changed, 40 insertions(+), 1 deletion(-)
10
target/arm/helper.c | 18 ++++++++++++++++--
11
2 files changed, 18 insertions(+), 2 deletions(-)
13
12
14
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
13
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/raspi.c
15
--- a/target/arm/cpu.h
17
+++ b/hw/arm/raspi.c
16
+++ b/target/arm/cpu.h
18
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
19
#define BOARDSETUP_ADDR (MVBAR_ADDR + 0x20) /* board setup code */
18
#define SCR_ENSCXT (1U << 25)
20
#define FIRMWARE_ADDR_2 0x8000 /* Pi 2 loads kernel.img here by default */
19
#define SCR_ATA (1U << 26)
21
#define FIRMWARE_ADDR_3 0x80000 /* Pi 3 loads kernel.img here by default */
20
22
+#define SPINTABLE_ADDR 0xd8 /* Pi 3 bootloader spintable */
21
+#define HSTR_TTEE (1 << 16)
23
22
+
24
/* Table of Linux board IDs for different Pi versions */
23
/* Return the current FPSCR value. */
25
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
24
uint32_t vfp_get_fpscr(CPUARMState *env);
26
@@ -XXX,XX +XXX,XX @@ static void write_smpboot(ARMCPU *cpu, const struct arm_boot_info *info)
25
void vfp_set_fpscr(CPUARMState *env, uint32_t val);
27
info->smp_loader_start);
26
diff --git a/target/arm/helper.c b/target/arm/helper.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/target/arm/helper.c
29
+++ b/target/arm/helper.c
30
@@ -XXX,XX +XXX,XX @@ static void teecr_write(CPUARMState *env, const ARMCPRegInfo *ri,
31
env->teecr = value;
28
}
32
}
29
33
30
+static void write_smpboot64(ARMCPU *cpu, const struct arm_boot_info *info)
34
+static CPAccessResult teecr_access(CPUARMState *env, const ARMCPRegInfo *ri,
35
+ bool isread)
31
+{
36
+{
32
+ /* Unlike the AArch32 version we don't need to call the board setup hook.
37
+ /*
33
+ * The mechanism for doing the spin-table is also entirely different.
38
+ * HSTR.TTEE only exists in v7A, not v8A, but v8A doesn't have T2EE
34
+ * We must have four 64-bit fields at absolute addresses
39
+ * at all, so we don't need to check whether we're v8A.
35
+ * 0xd8, 0xe0, 0xe8, 0xf0 in RAM, which are the flag variables for
36
+ * our CPUs, and which we must ensure are zero initialized before
37
+ * the primary CPU goes into the kernel. We put these variables inside
38
+ * a rom blob, so that the reset for ROM contents zeroes them for us.
39
+ */
40
+ */
40
+ static const uint32_t smpboot[] = {
41
+ if (arm_current_el(env) < 2 && !arm_is_secure_below_el3(env) &&
41
+ 0xd2801b05, /* mov x5, 0xd8 */
42
+ (env->cp15.hstr_el2 & HSTR_TTEE)) {
42
+ 0xd53800a6, /* mrs x6, mpidr_el1 */
43
+ return CP_ACCESS_TRAP_EL2;
43
+ 0x924004c6, /* and x6, x6, #0x3 */
44
+ }
44
+ 0xd503205f, /* spin: wfe */
45
+ return CP_ACCESS_OK;
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
+
54
+ static const uint64_t spintables[] = {
55
+ 0, 0, 0, 0
56
+ };
57
+
58
+ rom_add_blob_fixed("raspi_smpboot", smpboot, sizeof(smpboot),
59
+ info->smp_loader_start);
60
+ rom_add_blob_fixed("raspi_spintables", spintables, sizeof(spintables),
61
+ SPINTABLE_ADDR);
62
+}
46
+}
63
+
47
+
64
static void write_board_setup(ARMCPU *cpu, const struct arm_boot_info *info)
48
static CPAccessResult teehbr_access(CPUARMState *env, const ARMCPRegInfo *ri,
49
bool isread)
65
{
50
{
66
arm_write_secure_board_setup_dummy_smc(cpu, info, MVBAR_ADDR);
51
if (arm_current_el(env) == 0 && (env->teecr & 1)) {
67
@@ -XXX,XX +XXX,XX @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
52
return CP_ACCESS_TRAP;
68
/* Pi2 and Pi3 requires SMP setup */
69
if (version >= 2) {
70
binfo.smp_loader_start = SMPBOOT_ADDR;
71
- binfo.write_secondary_boot = write_smpboot;
72
+ if (version == 2) {
73
+ binfo.write_secondary_boot = write_smpboot;
74
+ } else {
75
+ binfo.write_secondary_boot = write_smpboot64;
76
+ }
77
binfo.secondary_cpu_reset_hook = reset_secondary;
78
}
53
}
79
54
- return CP_ACCESS_OK;
55
+ return teecr_access(env, ri, isread);
56
}
57
58
static const ARMCPRegInfo t2ee_cp_reginfo[] = {
59
{ .name = "TEECR", .cp = 14, .crn = 0, .crm = 0, .opc1 = 6, .opc2 = 0,
60
.access = PL1_RW, .fieldoffset = offsetof(CPUARMState, teecr),
61
.resetvalue = 0,
62
- .writefn = teecr_write },
63
+ .writefn = teecr_write, .accessfn = teecr_access },
64
{ .name = "TEEHBR", .cp = 14, .crn = 1, .crm = 0, .opc1 = 6, .opc2 = 0,
65
.access = PL0_RW, .fieldoffset = offsetof(CPUARMState, teehbr),
66
.accessfn = teehbr_access, .resetvalue = 0 },
80
--
67
--
81
2.16.2
68
2.20.1
82
69
83
70
diff view generated by jsdifflib
1
Our BCM2836 type is really a generic one that can be any of
1
In v7A, the HSTR register has a TJDBX bit which traps NS EL0/EL1
2
the bcm283x family. Rename it accordingly. We change only
2
access to the JOSCR and JMCR trivial Jazelle registers, and also BXJ.
3
the names which are visible via the header file to the
3
Implement these traps. In v8A this HSTR bit doesn't exist, so don't
4
rest of the QEMU code, leaving private function names
4
trap for v8A CPUs.
5
in bcm2836.c as they are.
6
7
This is a preliminary to making bcm283x be an abstract
8
parent class to specific types for the bcm2836 and bcm2837.
9
5
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Andrew Baumann <Andrew.Baumann@microsoft.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210816180305.20137-3-peter.maydell@linaro.org
13
Message-id: 20180313153458.26822-6-peter.maydell@linaro.org
14
---
9
---
15
include/hw/arm/bcm2836.h | 12 ++++++------
10
target/arm/cpu.h | 1 +
16
hw/arm/bcm2836.c | 17 +++++++++--------
11
target/arm/helper.h | 2 ++
17
hw/arm/raspi.c | 16 ++++++++--------
12
target/arm/syndrome.h | 7 +++++++
18
3 files changed, 23 insertions(+), 22 deletions(-)
13
target/arm/helper.c | 17 +++++++++++++++++
14
target/arm/op_helper.c | 16 ++++++++++++++++
15
target/arm/translate.c | 12 ++++++++++++
16
6 files changed, 55 insertions(+)
19
17
20
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
21
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/arm/bcm2836.h
20
--- a/target/arm/cpu.h
23
+++ b/include/hw/arm/bcm2836.h
21
+++ b/target/arm/cpu.h
24
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
25
#include "hw/arm/bcm2835_peripherals.h"
23
#define SCR_ATA (1U << 26)
26
#include "hw/intc/bcm2836_control.h"
24
27
25
#define HSTR_TTEE (1 << 16)
28
-#define TYPE_BCM2836 "bcm2836"
26
+#define HSTR_TJDBX (1 << 17)
29
-#define BCM2836(obj) OBJECT_CHECK(BCM2836State, (obj), TYPE_BCM2836)
27
30
+#define TYPE_BCM283X "bcm283x"
28
/* Return the current FPSCR value. */
31
+#define BCM283X(obj) OBJECT_CHECK(BCM283XState, (obj), TYPE_BCM283X)
29
uint32_t vfp_get_fpscr(CPUARMState *env);
32
30
diff --git a/target/arm/helper.h b/target/arm/helper.h
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
31
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/arm/bcm2836.c
32
--- a/target/arm/helper.h
56
+++ b/hw/arm/bcm2836.c
33
+++ b/target/arm/helper.h
57
@@ -XXX,XX +XXX,XX @@
34
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_2(v7m_vlldm, void, env, i32)
58
35
59
static void bcm2836_init(Object *obj)
36
DEF_HELPER_2(v8m_stackcheck, void, env, i32)
37
38
+DEF_HELPER_FLAGS_2(check_bxj_trap, TCG_CALL_NO_WG, void, env, i32)
39
+
40
DEF_HELPER_4(access_check_cp_reg, void, env, ptr, i32, i32)
41
DEF_HELPER_3(set_cp_reg, void, env, ptr, i32)
42
DEF_HELPER_2(get_cp_reg, i32, env, ptr)
43
diff --git a/target/arm/syndrome.h b/target/arm/syndrome.h
44
index XXXXXXX..XXXXXXX 100644
45
--- a/target/arm/syndrome.h
46
+++ b/target/arm/syndrome.h
47
@@ -XXX,XX +XXX,XX @@ enum arm_exception_class {
48
EC_ADVSIMDFPACCESSTRAP = 0x07,
49
EC_FPIDTRAP = 0x08,
50
EC_PACTRAP = 0x09,
51
+ EC_BXJTRAP = 0x0a,
52
EC_CP14RRTTRAP = 0x0c,
53
EC_BTITRAP = 0x0d,
54
EC_ILLEGALSTATE = 0x0e,
55
@@ -XXX,XX +XXX,XX @@ static inline uint32_t syn_btitrap(int btype)
56
return (EC_BTITRAP << ARM_EL_EC_SHIFT) | btype;
57
}
58
59
+static inline uint32_t syn_bxjtrap(int cv, int cond, int rm)
60
+{
61
+ return (EC_BXJTRAP << ARM_EL_EC_SHIFT) | ARM_EL_IL |
62
+ (cv << 24) | (cond << 20) | rm;
63
+}
64
+
65
static inline uint32_t syn_insn_abort(int same_el, int ea, int s1ptw, int fsc)
60
{
66
{
61
- BCM2836State *s = BCM2836(obj);
67
return (EC_INSNABORT << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT)
62
+ BCM283XState *s = BCM283X(obj);
68
diff --git a/target/arm/helper.c b/target/arm/helper.c
63
69
index XXXXXXX..XXXXXXX 100644
64
object_initialize(&s->control, sizeof(s->control), TYPE_BCM2836_CONTROL);
70
--- a/target/arm/helper.c
65
object_property_add_child(obj, "control", OBJECT(&s->control), NULL);
71
+++ b/target/arm/helper.c
66
@@ -XXX,XX +XXX,XX @@ static void bcm2836_init(Object *obj)
72
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_jazelle(CPUARMState *env, const ARMCPRegInfo *ri,
67
73
return CP_ACCESS_OK;
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
}
74
}
95
75
96
static Property bcm2836_props[] = {
76
+static CPAccessResult access_joscr_jmcr(CPUARMState *env,
97
- DEFINE_PROP_STRING("cpu-type", BCM2836State, cpu_type),
77
+ const ARMCPRegInfo *ri, bool isread)
98
- DEFINE_PROP_UINT32("enabled-cpus", BCM2836State, enabled_cpus, BCM2836_NCPUS),
78
+{
99
+ DEFINE_PROP_STRING("cpu-type", BCM283XState, cpu_type),
79
+ /*
100
+ DEFINE_PROP_UINT32("enabled-cpus", BCM283XState, enabled_cpus,
80
+ * HSTR.TJDBX traps JOSCR and JMCR accesses, but it exists only
101
+ BCM283X_NCPUS),
81
+ * in v7A, not in v8A.
102
DEFINE_PROP_END_OF_LIST()
82
+ */
83
+ if (!arm_feature(env, ARM_FEATURE_V8) &&
84
+ arm_current_el(env) < 2 && !arm_is_secure_below_el3(env) &&
85
+ (env->cp15.hstr_el2 & HSTR_TJDBX)) {
86
+ return CP_ACCESS_TRAP_EL2;
87
+ }
88
+ return CP_ACCESS_OK;
89
+}
90
+
91
static const ARMCPRegInfo jazelle_regs[] = {
92
{ .name = "JIDR",
93
.cp = 14, .crn = 0, .crm = 0, .opc1 = 7, .opc2 = 0,
94
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo jazelle_regs[] = {
95
.type = ARM_CP_CONST, .resetvalue = 0 },
96
{ .name = "JOSCR",
97
.cp = 14, .crn = 1, .crm = 0, .opc1 = 7, .opc2 = 0,
98
+ .accessfn = access_joscr_jmcr,
99
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
100
{ .name = "JMCR",
101
.cp = 14, .crn = 2, .crm = 0, .opc1 = 7, .opc2 = 0,
102
+ .accessfn = access_joscr_jmcr,
103
.access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
104
REGINFO_SENTINEL
103
};
105
};
104
106
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
105
@@ -XXX,XX +XXX,XX @@ static void bcm2836_class_init(ObjectClass *oc, void *data)
107
index XXXXXXX..XXXXXXX 100644
108
--- a/target/arm/op_helper.c
109
+++ b/target/arm/op_helper.c
110
@@ -XXX,XX +XXX,XX @@ void HELPER(setend)(CPUARMState *env)
111
arm_rebuild_hflags(env);
106
}
112
}
107
113
108
static const TypeInfo bcm2836_type_info = {
114
+void HELPER(check_bxj_trap)(CPUARMState *env, uint32_t rm)
109
- .name = TYPE_BCM2836,
115
+{
110
+ .name = TYPE_BCM283X,
116
+ /*
111
.parent = TYPE_DEVICE,
117
+ * Only called if in NS EL0 or EL1 for a BXJ for a v7A CPU;
112
- .instance_size = sizeof(BCM2836State),
118
+ * check if HSTR.TJDBX means we need to trap to EL2.
113
+ .instance_size = sizeof(BCM283XState),
119
+ */
114
.instance_init = bcm2836_init,
120
+ if (env->cp15.hstr_el2 & HSTR_TJDBX) {
115
.class_init = bcm2836_class_init,
121
+ /*
116
};
122
+ * We know the condition code check passed, so take the IMPDEF
117
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
123
+ * choice to always report CV=1 COND 0xe
124
+ */
125
+ uint32_t syn = syn_bxjtrap(1, 0xe, rm);
126
+ raise_exception_ra(env, EXCP_HYP_TRAP, syn, 2, GETPC());
127
+ }
128
+}
129
+
130
#ifndef CONFIG_USER_ONLY
131
/* Function checks whether WFx (WFI/WFE) instructions are set up to be trapped.
132
* The function returns the target EL (1-3) if the instruction is to be trapped;
133
diff --git a/target/arm/translate.c b/target/arm/translate.c
118
index XXXXXXX..XXXXXXX 100644
134
index XXXXXXX..XXXXXXX 100644
119
--- a/hw/arm/raspi.c
135
--- a/target/arm/translate.c
120
+++ b/hw/arm/raspi.c
136
+++ b/target/arm/translate.c
121
@@ -XXX,XX +XXX,XX @@
137
@@ -XXX,XX +XXX,XX @@ static bool trans_BXJ(DisasContext *s, arg_BXJ *a)
122
static const int raspi_boardid[] = {[1] = 0xc42, [2] = 0xc43, [3] = 0xc44};
138
if (!ENABLE_ARCH_5J || arm_dc_feature(s, ARM_FEATURE_M)) {
123
139
return false;
124
typedef struct RasPiState {
140
}
125
- BCM2836State soc;
141
+ /*
126
+ BCM283XState soc;
142
+ * v7A allows BXJ to be trapped via HSTR.TJDBX. We don't waste a
127
MemoryRegion ram;
143
+ * TBFLAGS bit on a basically-never-happens case, so call a helper
128
} RasPiState;
144
+ * function to check for the trap and raise the exception if needed
129
145
+ * (passing it the register number for the syndrome value).
130
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
146
+ * v8A doesn't have this HSTR bit.
131
BusState *bus;
147
+ */
132
DeviceState *carddev;
148
+ if (!arm_dc_feature(s, ARM_FEATURE_V8) &&
133
149
+ arm_dc_feature(s, ARM_FEATURE_EL2) &&
134
- object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM2836);
150
+ s->current_el < 2 && s->ns) {
135
+ object_initialize(&s->soc, sizeof(s->soc), TYPE_BCM283X);
151
+ gen_helper_check_bxj_trap(cpu_env, tcg_constant_i32(a->rm));
136
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
152
+ }
137
&error_abort);
153
/* Trivial implementation equivalent to bx. */
138
154
gen_bx(s, load_reg(s, a->rm));
139
@@ -XXX,XX +XXX,XX @@ static void raspi2_machine_init(MachineClass *mc)
155
return true;
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
--
156
--
166
2.16.2
157
2.20.1
167
158
168
159
diff view generated by jsdifflib
1
The bcm2837 is pretty similar to the bcm2836, but it does have
1
Currently we rely on all the callsites of cpsr_write() to rebuild the
2
some differences. Notably, the MPIDR affinity aff1 values it
2
cached hflags if they change one of the CPSR bits which we use as a
3
sets for the CPUs are 0x0, rather than the 0xf that the bcm2836
3
TB flag and cache in hflags. This is a bit awkward when we want to
4
uses, and if this is wrong Linux will not boot.
4
change the set of CPSR bits that we cache, because it means we need
5
to re-audit all the cpsr_write() callsites to see which flags they
6
are writing and whether they now need to rebuild the hflags.
5
7
6
Rather than trying to have one device with properties that
8
Switch instead to making cpsr_write() call arm_rebuild_hflags()
7
configure it differently for the two cases, create two
9
itself if one of the bits being changed is a cached bit.
8
separate QOM devices for the two SoCs. We use the same approach
10
9
as hw/arm/aspeed_soc.c and share code and have a data table
11
We don't do the rebuild for the CPSRWriteRaw write type, because that
10
that might differ per-SoC. For the moment the two types don't
12
kind of write is generally doing something special anyway. For the
11
actually have different behaviour.
13
CPSRWriteRaw callsites in the KVM code and inbound migration we
14
definitely don't want to recalculate the hflags; the callsites in
15
boot.c and arm-powerctl.c have to do a rebuild-hflags call themselves
16
anyway because of other CPU state changes they make.
17
18
This allows us to drop explicit arm_rebuild_hflags() calls in a
19
couple of places where the only reason we needed to call it was the
20
CPSR write.
21
22
This fixes a bug where we were incorrectly failing to rebuild hflags
23
in the code path for a gdbstub write to CPSR, which meant that you
24
could make QEMU assert by breaking into a running guest, altering the
25
CPSR to change the value of, for example, CPSR.E, and then
26
continuing.
12
27
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20180313153458.26822-7-peter.maydell@linaro.org
30
Message-id: 20210817201843.3829-1-peter.maydell@linaro.org
16
---
31
---
17
include/hw/arm/bcm2836.h | 19 +++++++++++++++++++
32
target/arm/cpu.h | 10 ++++++++--
18
hw/arm/bcm2836.c | 37 ++++++++++++++++++++++++++++++++-----
33
linux-user/arm/signal.c | 2 --
19
hw/arm/raspi.c | 3 ++-
34
target/arm/helper.c | 5 +++++
20
3 files changed, 53 insertions(+), 6 deletions(-)
35
3 files changed, 13 insertions(+), 4 deletions(-)
21
36
22
diff --git a/include/hw/arm/bcm2836.h b/include/hw/arm/bcm2836.h
37
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
23
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/bcm2836.h
39
--- a/target/arm/cpu.h
25
+++ b/include/hw/arm/bcm2836.h
40
+++ b/target/arm/cpu.h
26
@@ -XXX,XX +XXX,XX @@
41
@@ -XXX,XX +XXX,XX @@ uint32_t cpsr_read(CPUARMState *env);
27
42
typedef enum CPSRWriteType {
28
#define BCM283X_NCPUS 4
43
CPSRWriteByInstr = 0, /* from guest MSR or CPS */
29
44
CPSRWriteExceptionReturn = 1, /* from guest exception return insn */
30
+/* These type names are for specific SoCs; other than instantiating
45
- CPSRWriteRaw = 2, /* trust values, do not switch reg banks */
31
+ * them, code using these devices should always handle them via the
46
+ CPSRWriteRaw = 2,
32
+ * BCM283x base class, so they have no BCM2836(obj) etc macros.
47
+ /* trust values, no reg bank switch, no hflags rebuild */
48
CPSRWriteByGDBStub = 3, /* from the GDB stub */
49
} CPSRWriteType;
50
51
-/* Set the CPSR. Note that some bits of mask must be all-set or all-clear.*/
52
+/*
53
+ * Set the CPSR. Note that some bits of mask must be all-set or all-clear.
54
+ * This will do an arm_rebuild_hflags() if any of the bits in @mask
55
+ * correspond to TB flags bits cached in the hflags, unless @write_type
56
+ * is CPSRWriteRaw.
33
+ */
57
+ */
34
+#define TYPE_BCM2836 "bcm2836"
58
void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask,
35
+#define TYPE_BCM2837 "bcm2837"
59
CPSRWriteType write_type);
36
+
60
37
typedef struct BCM283XState {
61
diff --git a/linux-user/arm/signal.c b/linux-user/arm/signal.c
38
/*< private >*/
39
DeviceState parent_obj;
40
@@ -XXX,XX +XXX,XX @@ typedef struct BCM283XState {
41
BCM2835PeripheralState peripherals;
42
} BCM283XState;
43
44
+typedef struct BCM283XInfo BCM283XInfo;
45
+
46
+typedef struct BCM283XClass {
47
+ DeviceClass parent_class;
48
+ const BCM283XInfo *info;
49
+} BCM283XClass;
50
+
51
+#define BCM283X_CLASS(klass) \
52
+ OBJECT_CLASS_CHECK(BCM283XClass, (klass), TYPE_BCM283X)
53
+#define BCM283X_GET_CLASS(obj) \
54
+ OBJECT_GET_CLASS(BCM283XClass, (obj), TYPE_BCM283X)
55
+
56
#endif /* BCM2836_H */
57
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
58
index XXXXXXX..XXXXXXX 100644
62
index XXXXXXX..XXXXXXX 100644
59
--- a/hw/arm/bcm2836.c
63
--- a/linux-user/arm/signal.c
60
+++ b/hw/arm/bcm2836.c
64
+++ b/linux-user/arm/signal.c
61
@@ -XXX,XX +XXX,XX @@
65
@@ -XXX,XX +XXX,XX @@ setup_return(CPUARMState *env, struct target_sigaction *ka,
62
/* "QA7" (Pi2) interrupt controller and mailboxes etc. */
66
env->regs[14] = retcode;
63
#define BCM2836_CONTROL_BASE 0x40000000
67
env->regs[15] = handler & (thumb ? ~1 : ~3);
64
68
cpsr_write(env, cpsr, CPSR_IT | CPSR_T | CPSR_E, CPSRWriteByInstr);
65
+struct BCM283XInfo {
69
- arm_rebuild_hflags(env);
66
+ const char *name;
70
67
+};
71
return 0;
68
+
72
}
69
+static const BCM283XInfo bcm283x_socs[] = {
73
@@ -XXX,XX +XXX,XX @@ restore_sigcontext(CPUARMState *env, struct target_sigcontext *sc)
70
+ {
74
__get_user(env->regs[15], &sc->arm_pc);
71
+ .name = TYPE_BCM2836,
75
__get_user(cpsr, &sc->arm_cpsr);
72
+ },
76
cpsr_write(env, cpsr, CPSR_USER | CPSR_EXEC, CPSRWriteByInstr);
73
+ {
77
- arm_rebuild_hflags(env);
74
+ .name = TYPE_BCM2837,
78
75
+ },
79
err |= !valid_user_regs(env);
76
+};
80
77
+
81
diff --git a/target/arm/helper.c b/target/arm/helper.c
78
static void bcm2836_init(Object *obj)
82
index XXXXXXX..XXXXXXX 100644
83
--- a/target/arm/helper.c
84
+++ b/target/arm/helper.c
85
@@ -XXX,XX +XXX,XX @@ void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask,
86
CPSRWriteType write_type)
79
{
87
{
80
BCM283XState *s = BCM283X(obj);
88
uint32_t changed_daif;
81
@@ -XXX,XX +XXX,XX @@ static Property bcm2836_props[] = {
89
+ bool rebuild_hflags = (write_type != CPSRWriteRaw) &&
82
DEFINE_PROP_END_OF_LIST()
90
+ (mask & (CPSR_M | CPSR_E | CPSR_IL));
83
};
91
84
92
if (mask & CPSR_NZCV) {
85
-static void bcm2836_class_init(ObjectClass *oc, void *data)
93
env->ZF = (~val) & CPSR_Z;
86
+static void bcm283x_class_init(ObjectClass *oc, void *data)
94
@@ -XXX,XX +XXX,XX @@ void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask,
87
{
95
}
88
DeviceClass *dc = DEVICE_CLASS(oc);
96
mask &= ~CACHED_CPSR_BITS;
89
+ BCM283XClass *bc = BCM283X_CLASS(oc);
97
env->uncached_cpsr = (env->uncached_cpsr & ~mask) | (val & mask);
90
98
+ if (rebuild_hflags) {
91
- dc->props = bcm2836_props;
99
+ arm_rebuild_hflags(env);
92
+ bc->info = data;
93
dc->realize = bcm2836_realize;
94
+ dc->props = bcm2836_props;
95
}
96
97
-static const TypeInfo bcm2836_type_info = {
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
+ }
100
+ }
123
}
101
}
124
102
125
type_init(bcm2836_register_types)
103
/* Sign/zero extend */
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
--
104
--
141
2.16.2
105
2.20.1
142
106
143
107
diff view generated by jsdifflib
1
From: Andrey Smirnov <andrew.smirnov@gmail.com>
1
From: Tong Ho <tong.ho@xilinx.com>
2
2
3
Add support for "TX complete"/TXDC interrupt generate by real HW since
3
Add unimplemented APU mmio region to xlnx-versal for booting
4
it is needed to support guests other than Linux.
4
bare-metal guests built with standalone bsp, which access the
5
region from one of the following places:
6
https://github.com/Xilinx/embeddedsw/blob/release-2020.2/lib/bsp/standalone/src/arm/ARMv8/64bit/armclang/boot.S#L139
7
https://github.com/Xilinx/embeddedsw/blob/release-2020.2/lib/bsp/standalone/src/arm/ARMv8/64bit/gcc/boot.S#L183
5
8
6
Based on the patch by Bill Paul as found here:
9
Acked-by: Alistair Francis <alistair.francis@wdc.com>
7
https://bugs.launchpad.net/qemu/+bug/1753314
10
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
11
Signed-off-by: Tong Ho <tong.ho@xilinx.com>
9
Cc: qemu-devel@nongnu.org
12
Message-id: 20210823173818.201259-2-tong.ho@xilinx.com
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>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
---
14
---
19
include/hw/char/imx_serial.h | 3 +++
15
include/hw/arm/xlnx-versal.h | 2 ++
20
hw/char/imx_serial.c | 20 +++++++++++++++++---
16
hw/arm/xlnx-versal.c | 2 ++
21
2 files changed, 20 insertions(+), 3 deletions(-)
17
2 files changed, 4 insertions(+)
22
18
23
diff --git a/include/hw/char/imx_serial.h b/include/hw/char/imx_serial.h
19
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
24
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/char/imx_serial.h
21
--- a/include/hw/arm/xlnx-versal.h
26
+++ b/include/hw/char/imx_serial.h
22
+++ b/include/hw/arm/xlnx-versal.h
27
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ struct Versal {
28
#define UCR2_RXEN (1<<1) /* Receiver enable */
24
#define MM_IOU_SCNTRS_SIZE 0x10000
29
#define UCR2_SRST (1<<0) /* Reset complete */
25
#define MM_FPD_CRF 0xfd1a0000U
30
26
#define MM_FPD_CRF_SIZE 0x140000
31
+#define UCR4_TCEN BIT(3) /* TX complete interrupt enable */
27
+#define MM_FPD_FPD_APU 0xfd5c0000
32
+
28
+#define MM_FPD_FPD_APU_SIZE 0x100
33
#define UTS1_TXEMPTY (1<<6)
29
34
#define UTS1_RXEMPTY (1<<5)
30
#define MM_PMC_SD0 0xf1040000U
35
#define UTS1_TXFULL (1<<4)
31
#define MM_PMC_SD0_SIZE 0x10000
36
@@ -XXX,XX +XXX,XX @@ typedef struct IMXSerialState {
32
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
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
33
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/char/imx_serial.c
34
--- a/hw/arm/xlnx-versal.c
47
+++ b/hw/char/imx_serial.c
35
+++ b/hw/arm/xlnx-versal.c
48
@@ -XXX,XX +XXX,XX @@
36
@@ -XXX,XX +XXX,XX @@ static void versal_unimp(Versal *s)
49
37
MM_CRL, MM_CRL_SIZE);
50
static const VMStateDescription vmstate_imx_serial = {
38
versal_unimp_area(s, "crf", &s->mr_ps,
51
.name = TYPE_IMX_SERIAL,
39
MM_FPD_CRF, MM_FPD_CRF_SIZE);
52
- .version_id = 1,
40
+ versal_unimp_area(s, "apu", &s->mr_ps,
53
- .minimum_version_id = 1,
41
+ MM_FPD_FPD_APU, MM_FPD_FPD_APU_SIZE);
54
+ .version_id = 2,
42
versal_unimp_area(s, "crp", &s->mr_ps,
55
+ .minimum_version_id = 2,
43
MM_PMC_CRP, MM_PMC_CRP_SIZE);
56
.fields = (VMStateField[]) {
44
versal_unimp_area(s, "iou-scntr", &s->mr_ps,
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
}
98
break;
99
@@ -XXX,XX +XXX,XX @@ static void imx_serial_write(void *opaque, hwaddr offset,
100
s->ucr3 = value & 0xffff;
101
break;
102
103
- case 0x2d: /* UTS1 */
104
case 0x23: /* UCR4 */
105
+ s->ucr4 = value & 0xffff;
106
+ imx_update(s);
107
+ break;
108
+
109
+ case 0x2d: /* UTS1 */
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.20.1
115
47
116
48
diff view generated by jsdifflib
1
From: Guenter Roeck <linux@roeck-us.net>
1
From: Tong Ho <tong.ho@xilinx.com>
2
2
3
The sabrelite machine model used by qemu-system-arm is based on the
3
Add unimplemented APU mmio region to xlnx-zynqmp for booting
4
Freescale/NXP i.MX6Q processor. This SoC has an on-board ethernet
4
bare-metal guests built with standalone bsp, which access the
5
controller which is supported in QEMU using the imx_fec.c module
5
region from one of the following places:
6
(actually called imx.enet for this model.)
6
https://github.com/Xilinx/embeddedsw/blob/release-2020.2/lib/bsp/standalone/src/arm/ARMv8/64bit/armclang/boot.S#L139
7
https://github.com/Xilinx/embeddedsw/blob/release-2020.2/lib/bsp/standalone/src/arm/ARMv8/64bit/gcc/boot.S#L183
7
8
8
The include/hw/arm/fsm-imx6.h file defines the interrupt vectors for the
9
Acked-by: Alistair Francis <alistair.francis@wdc.com>
9
imx.enet device like this:
10
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
10
11
Signed-off-by: Tong Ho <tong.ho@xilinx.com>
11
#define FSL_IMX6_ENET_MAC_1588_IRQ 118
12
Message-id: 20210823173818.201259-3-tong.ho@xilinx.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>
40
Message-id: 1520723090-22130-1-git-send-email-linux@roeck-us.net
41
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
42
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
43
---
14
---
44
include/hw/arm/fsl-imx6.h | 4 ++--
15
include/hw/arm/xlnx-zynqmp.h | 7 +++++++
45
hw/net/imx_fec.c | 28 +++++++++++++++++++++++++++-
16
hw/arm/xlnx-zynqmp.c | 32 ++++++++++++++++++++++++++++++++
46
2 files changed, 29 insertions(+), 3 deletions(-)
17
2 files changed, 39 insertions(+)
47
18
48
diff --git a/include/hw/arm/fsl-imx6.h b/include/hw/arm/fsl-imx6.h
19
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
49
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
50
--- a/include/hw/arm/fsl-imx6.h
21
--- a/include/hw/arm/xlnx-zynqmp.h
51
+++ b/include/hw/arm/fsl-imx6.h
22
+++ b/include/hw/arm/xlnx-zynqmp.h
52
@@ -XXX,XX +XXX,XX @@ typedef struct FslIMX6State {
23
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPState, XLNX_ZYNQMP)
53
#define FSL_IMX6_HDMI_MASTER_IRQ 115
24
#define XLNX_ZYNQMP_MAX_RAM_SIZE (XLNX_ZYNQMP_MAX_LOW_RAM_SIZE + \
54
#define FSL_IMX6_HDMI_CEC_IRQ 116
25
XLNX_ZYNQMP_MAX_HIGH_RAM_SIZE)
55
#define FSL_IMX6_MLB150_LOW_IRQ 117
26
56
-#define FSL_IMX6_ENET_MAC_1588_IRQ 118
27
+/*
57
-#define FSL_IMX6_ENET_MAC_IRQ 119
28
+ * Unimplemented mmio regions needed to boot some images.
58
+#define FSL_IMX6_ENET_MAC_IRQ 118
29
+ */
59
+#define FSL_IMX6_ENET_MAC_1588_IRQ 119
30
+#define XLNX_ZYNQMP_NUM_UNIMP_AREAS 1
60
#define FSL_IMX6_PCIE1_IRQ 120
31
+
61
#define FSL_IMX6_PCIE2_IRQ 121
32
struct XlnxZynqMPState {
62
#define FSL_IMX6_PCIE3_IRQ 122
33
/*< private >*/
63
diff --git a/hw/net/imx_fec.c b/hw/net/imx_fec.c
34
DeviceState parent_obj;
35
@@ -XXX,XX +XXX,XX @@ struct XlnxZynqMPState {
36
MemoryRegion *ddr_ram;
37
MemoryRegion ddr_ram_low, ddr_ram_high;
38
39
+ MemoryRegion mr_unimp[XLNX_ZYNQMP_NUM_UNIMP_AREAS];
40
+
41
CadenceGEMState gem[XLNX_ZYNQMP_NUM_GEMS];
42
CadenceUARTState uart[XLNX_ZYNQMP_NUM_UARTS];
43
XlnxZynqMPCANState can[XLNX_ZYNQMP_NUM_CAN];
44
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
64
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
65
--- a/hw/net/imx_fec.c
46
--- a/hw/arm/xlnx-zynqmp.c
66
+++ b/hw/net/imx_fec.c
47
+++ b/hw/arm/xlnx-zynqmp.c
67
@@ -XXX,XX +XXX,XX @@ static void imx_enet_write_bd(IMXENETBufDesc *bd, dma_addr_t addr)
48
@@ -XXX,XX +XXX,XX @@
68
49
#include "qemu/module.h"
69
static void imx_eth_update(IMXFECState *s)
50
#include "hw/arm/xlnx-zynqmp.h"
51
#include "hw/intc/arm_gic_common.h"
52
+#include "hw/misc/unimp.h"
53
#include "hw/boards.h"
54
#include "sysemu/kvm.h"
55
#include "sysemu/sysemu.h"
56
@@ -XXX,XX +XXX,XX @@
57
#define DPDMA_ADDR 0xfd4c0000
58
#define DPDMA_IRQ 116
59
60
+#define APU_ADDR 0xfd5c0000
61
+#define APU_SIZE 0x100
62
+
63
#define IPI_ADDR 0xFF300000
64
#define IPI_IRQ 64
65
66
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
67
qdev_realize(DEVICE(&s->rpu_cluster), NULL, &error_fatal);
68
}
69
70
+static void xlnx_zynqmp_create_unimp_mmio(XlnxZynqMPState *s)
71
+{
72
+ static const struct UnimpInfo {
73
+ const char *name;
74
+ hwaddr base;
75
+ hwaddr size;
76
+ } unimp_areas[ARRAY_SIZE(s->mr_unimp)] = {
77
+ { .name = "apu", APU_ADDR, APU_SIZE },
78
+ };
79
+ unsigned int nr;
80
+
81
+ for (nr = 0; nr < ARRAY_SIZE(unimp_areas); nr++) {
82
+ const struct UnimpInfo *info = &unimp_areas[nr];
83
+ DeviceState *dev = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
84
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
85
+
86
+ assert(info->name && info->base && info->size > 0);
87
+ qdev_prop_set_string(dev, "name", info->name);
88
+ qdev_prop_set_uint64(dev, "size", info->size);
89
+ object_property_add_child(OBJECT(s), info->name, OBJECT(dev));
90
+
91
+ sysbus_realize_and_unref(sbd, &error_fatal);
92
+ sysbus_mmio_map(sbd, 0, info->base);
93
+ }
94
+}
95
+
96
static void xlnx_zynqmp_init(Object *obj)
70
{
97
{
71
- if (s->regs[ENET_EIR] & s->regs[ENET_EIMR] & ENET_INT_TS_TIMER) {
98
MachineState *ms = MACHINE(qdev_get_machine());
72
+ /*
99
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
73
+ * Previous versions of qemu had the ENET_INT_MAC and ENET_INT_TS_TIMER
100
sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, RTC_ADDR);
74
+ * interrupts swapped. This worked with older versions of Linux (4.14
101
sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0, gic_spi[RTC_IRQ]);
75
+ * and older) since Linux associated both interrupt lines with Ethernet
102
76
+ * MAC interrupts. Specifically,
103
+ xlnx_zynqmp_create_unimp_mmio(s);
77
+ * - Linux 4.15 and later have separate interrupt handlers for the MAC and
104
+
78
+ * timer interrupts. Those versions of Linux fail with versions of QEMU
105
for (i = 0; i < XLNX_ZYNQMP_NUM_GDMA_CH; i++) {
79
+ * with swapped interrupt assignments.
106
if (!object_property_set_uint(OBJECT(&s->gdma[i]), "bus-width", 128,
80
+ * - In linux 4.14, both interrupt lines were registered with the Ethernet
107
errp)) {
81
+ * MAC interrupt handler. As a result, all versions of qemu happen to
82
+ * work, though that is accidental.
83
+ * - In Linux 4.9 and older, the timer interrupt was registered directly
84
+ * with the Ethernet MAC interrupt handler. The MAC interrupt was
85
+ * redirected to a GPIO interrupt to work around erratum ERR006687.
86
+ * This was implemented using the SOC's IOMUX block. In qemu, this GPIO
87
+ * interrupt never fired since IOMUX is currently not supported in qemu.
88
+ * Linux instead received MAC interrupts on the timer interrupt.
89
+ * As a result, qemu versions with the swapped interrupt assignment work,
90
+ * albeit accidentally, but qemu versions with the correct interrupt
91
+ * assignment fail.
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
--
108
--
103
2.16.2
109
2.20.1
104
110
105
111
diff view generated by jsdifflib