1
A mixed bag, all bug fixes or similar small stuff.
1
Nothing too exciting, but does include the last bits of v8.1M support work.
2
2
3
thanks
4
-- PMM
3
-- PMM
5
4
5
The following changes since commit e79de63ab1bd1f6550e7b915e433bec1ad1a870a:
6
6
7
The following changes since commit 19eb2d4e736dc895f31fbd6b520e514f10cc08e0:
7
Merge remote-tracking branch 'remotes/rth-gitlab/tags/pull-tcg-20210107' into staging (2021-01-07 20:34:05 +0000)
8
9
Merge remote-tracking branch 'remotes/thibault/tags/samuel-thibault' into staging (2019-05-07 10:43:32 +0100)
10
8
11
are available in the Git repository at:
9
are available in the Git repository at:
12
10
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190507
11
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20210108
14
12
15
for you to fetch changes up to 63159601fb3e396b28da14cbb71e50ed3f5a0331:
13
for you to fetch changes up to c9f8511ea8d2b80723af0fea1f716d752c1b5208:
16
14
17
target/arm: Stop using variable length array in dc_zva (2019-05-07 12:55:04 +0100)
15
docs/system: arm: Add sabrelite board description (2021-01-08 15:13:39 +0000)
18
16
19
----------------------------------------------------------------
17
----------------------------------------------------------------
20
target-arm queue:
18
target-arm queue:
21
* Stop using variable length array in dc_zva
19
* intc/arm_gic: Fix gic_irq_signaling_enabled() for vCPUs
22
* Implement M-profile XPSR GE bits
20
* target/arm: Fix MTE0_ACTIVE
23
* Don't enable ARMV7M_EXCP_DEBUG from reset
21
* target/arm: Implement v8.1M and Cortex-M55 model
24
* armv7m_nvic: NS BFAR and BFSR are RAZ/WI if BFHFNMINS == 0
22
* hw/arm/highbank: Drop dead KVM support code
25
* armv7m_nvic: Check subpriority in nvic_recompute_state_secure()
23
* util/qemu-timer: Make timer_free() imply timer_del()
26
* fix various minor issues to allow building for Windows-on-ARM64
24
* various devices: Use ptimer_free() in finalize function
27
* aspeed: Set SDRAM size
25
* docs/system: arm: Add sabrelite board description
28
* Allow system registers for KVM guests to be changed by QEMU code
26
* sabrelite: Minor fixes to allow booting U-Boot
29
* raspi: Diagnose requests for too much RAM
30
* virt: Support firmware configuration with -blockdev
31
27
32
----------------------------------------------------------------
28
----------------------------------------------------------------
33
Cao Jiaxi (4):
29
Andrew Jones (1):
34
QEMU_PACKED: Remove gcc_struct attribute in Windows non x86 targets
30
hw/arm/virt: Remove virt machine state 'smp_cpus'
35
qga: Fix mingw compilation warnings on enum conversion
36
util/cacheinfo: Use uint64_t on LLP64 model to satisfy Windows ARM64
37
osdep: Fix mingw compilation regarding stdio formats
38
31
39
Joel Stanley (1):
32
Bin Meng (4):
40
arm: aspeed: Set SDRAM size
33
hw/misc: imx6_ccm: Update PMU_MISC0 reset value
34
hw/msic: imx6_ccm: Correct register value for silicon type
35
hw/arm: sabrelite: Connect the Ethernet PHY at address 6
36
docs/system: arm: Add sabrelite board description
41
37
42
Markus Armbruster (3):
38
Edgar E. Iglesias (1):
43
pc: Rearrange pc_system_firmware_init()'s legacy -drive loop
39
intc/arm_gic: Fix gic_irq_signaling_enabled() for vCPUs
44
pflash_cfi01: New pflash_cfi01_legacy_drive()
45
hw/arm/virt: Support firmware configuration with -blockdev
46
40
47
Peter Maydell (7):
41
Gan Qixin (7):
48
hw/arm/raspi: Diagnose requests for too much RAM
42
digic-timer: Use ptimer_free() in the finalize function to avoid memleaks
49
arm: Allow system registers for KVM guests to be changed by QEMU code
43
allwinner-a10-pit: Use ptimer_free() in the finalize function to avoid memleaks
50
hw/arm/armv7m_nvic: Check subpriority in nvic_recompute_state_secure()
44
exynos4210_rtc: Use ptimer_free() in the finalize function to avoid memleaks
51
hw/intc/armv7m_nvic: NS BFAR and BFSR are RAZ/WI if BFHFNMINS == 0
45
exynos4210_pwm: Use ptimer_free() in the finalize function to avoid memleaks
52
hw/intc/armv7m_nvic: Don't enable ARMV7M_EXCP_DEBUG from reset
46
mss-timer: Use ptimer_free() in the finalize function to avoid memleaks
53
target/arm: Implement XPSR GE bits
47
musicpal: Use ptimer_free() in the finalize function to avoid memleaks
54
target/arm: Stop using variable length array in dc_zva
48
exynos4210_mct: Use ptimer_free() in the finalize function to avoid memleaks
55
49
56
contrib/libvhost-user/libvhost-user.h | 2 +-
50
Peter Maydell (9):
57
include/hw/arm/aspeed.h | 1 +
51
hw/intc/armv7m_nvic: Correct handling of CCR.BFHFNMIGN
58
include/hw/arm/virt.h | 2 +
52
target/arm: Correct store of FPSCR value via FPCXT_S
59
include/hw/block/flash.h | 1 +
53
target/arm: Implement FPCXT_NS fp system register
60
include/qemu/compiler.h | 2 +-
54
target/arm: Implement Cortex-M55 model
61
include/qemu/osdep.h | 10 +-
55
hw/arm/highbank: Drop dead KVM support code
62
scripts/cocci-macro-file.h | 7 +-
56
util/qemu-timer: Make timer_free() imply timer_del()
63
target/arm/cpu.h | 13 ++-
57
scripts/coccinelle: New script to remove unnecessary timer_del() calls
64
hw/arm/aspeed.c | 8 ++
58
Remove superfluous timer_del() calls
65
hw/arm/raspi.c | 7 ++
59
target/arm: Remove timer_del()/timer_deinit() before timer_free()
66
hw/arm/virt.c | 202 ++++++++++++++++++++++------------
67
hw/block/pflash_cfi01.c | 28 +++++
68
hw/i386/pc_sysfw.c | 18 +--
69
hw/intc/armv7m_nvic.c | 40 ++++++-
70
qga/commands-win32.c | 2 +-
71
target/arm/helper.c | 47 +++++++-
72
target/arm/kvm.c | 8 ++
73
target/arm/kvm32.c | 20 +---
74
target/arm/kvm64.c | 2 +
75
target/arm/machine.c | 2 +-
76
util/cacheinfo.c | 2 +-
77
21 files changed, 294 insertions(+), 130 deletions(-)
78
60
61
Richard Henderson (1):
62
target/arm: Fix MTE0_ACTIVE
63
64
docs/system/arm/sabrelite.rst | 119 ++++++++++++++++++++++++++
65
docs/system/target-arm.rst | 1 +
66
scripts/coccinelle/timer-del-timer-free.cocci | 18 ++++
67
include/hw/arm/virt.h | 3 +-
68
include/qemu/timer.h | 24 +++---
69
block/iscsi.c | 2 -
70
block/nbd.c | 1 -
71
block/qcow2.c | 1 -
72
hw/arm/highbank.c | 14 +--
73
hw/arm/musicpal.c | 12 +++
74
hw/arm/sabrelite.c | 4 +
75
hw/arm/virt-acpi-build.c | 9 +-
76
hw/arm/virt.c | 21 +++--
77
hw/block/nvme.c | 2 -
78
hw/char/serial.c | 2 -
79
hw/char/virtio-serial-bus.c | 2 -
80
hw/ide/core.c | 1 -
81
hw/input/hid.c | 1 -
82
hw/intc/apic.c | 1 -
83
hw/intc/arm_gic.c | 4 +-
84
hw/intc/armv7m_nvic.c | 15 ++++
85
hw/intc/ioapic.c | 1 -
86
hw/ipmi/ipmi_bmc_extern.c | 1 -
87
hw/misc/imx6_ccm.c | 4 +-
88
hw/net/e1000.c | 3 -
89
hw/net/e1000e_core.c | 8 --
90
hw/net/pcnet-pci.c | 1 -
91
hw/net/rtl8139.c | 1 -
92
hw/net/spapr_llan.c | 1 -
93
hw/net/virtio-net.c | 2 -
94
hw/rtc/exynos4210_rtc.c | 9 ++
95
hw/s390x/s390-pci-inst.c | 1 -
96
hw/sd/sd.c | 1 -
97
hw/sd/sdhci.c | 2 -
98
hw/timer/allwinner-a10-pit.c | 11 +++
99
hw/timer/digic-timer.c | 8 ++
100
hw/timer/exynos4210_mct.c | 14 +++
101
hw/timer/exynos4210_pwm.c | 11 +++
102
hw/timer/mss-timer.c | 13 +++
103
hw/usb/dev-hub.c | 1 -
104
hw/usb/hcd-ehci.c | 1 -
105
hw/usb/hcd-ohci-pci.c | 1 -
106
hw/usb/hcd-uhci.c | 1 -
107
hw/usb/hcd-xhci.c | 1 -
108
hw/usb/redirect.c | 1 -
109
hw/vfio/display.c | 1 -
110
hw/virtio/vhost-vsock-common.c | 1 -
111
hw/virtio/virtio-balloon.c | 1 -
112
hw/virtio/virtio-rng.c | 1 -
113
hw/watchdog/wdt_diag288.c | 1 -
114
hw/watchdog/wdt_i6300esb.c | 1 -
115
migration/colo.c | 1 -
116
monitor/hmp-cmds.c | 1 -
117
net/announce.c | 1 -
118
net/colo-compare.c | 1 -
119
net/slirp.c | 1 -
120
replay/replay-debugging.c | 1 -
121
target/arm/cpu.c | 2 -
122
target/arm/cpu_tcg.c | 42 +++++++++
123
target/arm/helper.c | 2 +-
124
target/s390x/cpu.c | 2 -
125
ui/console.c | 1 -
126
ui/spice-core.c | 1 -
127
util/throttle.c | 1 -
128
target/arm/translate-vfp.c.inc | 114 ++++++++++++++++++++++--
129
65 files changed, 421 insertions(+), 111 deletions(-)
130
create mode 100644 docs/system/arm/sabrelite.rst
131
create mode 100644 scripts/coccinelle/timer-del-timer-free.cocci
132
diff view generated by jsdifflib
New patch
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
1
2
3
Correct the indexing into s->cpu_ctlr for vCPUs.
4
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
8
Message-id: 20201214222154.3480243-2-edgar.iglesias@gmail.com
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/intc/arm_gic.c | 4 +++-
12
1 file changed, 3 insertions(+), 1 deletion(-)
13
14
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/intc/arm_gic.c
17
+++ b/hw/intc/arm_gic.c
18
@@ -XXX,XX +XXX,XX @@ static inline void gic_get_best_virq(GICState *s, int cpu,
19
static inline bool gic_irq_signaling_enabled(GICState *s, int cpu, bool virt,
20
int group_mask)
21
{
22
+ int cpu_iface = virt ? (cpu + GIC_NCPU) : cpu;
23
+
24
if (!virt && !(s->ctlr & group_mask)) {
25
return false;
26
}
27
@@ -XXX,XX +XXX,XX @@ static inline bool gic_irq_signaling_enabled(GICState *s, int cpu, bool virt,
28
return false;
29
}
30
31
- if (!(s->cpu_ctlr[cpu] & group_mask)) {
32
+ if (!(s->cpu_ctlr[cpu_iface] & group_mask)) {
33
return false;
34
}
35
36
--
37
2.20.1
38
39
diff view generated by jsdifflib
1
From: Markus Armbruster <armbru@redhat.com>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
The ARM virt machines put firmware in flash memory. To configure it,
3
virt machine's 'smp_cpus' and machine->smp.cpus must always have the
4
you use -drive if=pflash,unit=0,... and optionally -drive
4
same value. And, anywhere we have virt machine state we have machine
5
if=pflash,unit=1,...
5
state. So let's remove the redundancy. Also, to make it easier to see
6
that machine->smp is the true source for "smp_cpus" and "max_cpus",
7
avoid passing them in function parameters, preferring instead to get
8
them from the state.
6
9
7
Why two -drive? This permits setting up one part of the flash memory
10
No functional change intended.
8
read-only, and the other part read/write. It also makes upgrading
9
firmware on the host easier. Below the hood, we get two separate
10
flash devices, because we were too lazy to improve our flash device
11
models to support sector protection.
12
11
13
The problem at hand is to do the same with -blockdev somehow, as one
12
Signed-off-by: Andrew Jones <drjones@redhat.com>
14
more step towards deprecating -drive.
13
Reviewed-by: David Edmondson <david.edmondson@oracle.com>
15
14
Reviewed-by: Ying Fang <fangying1@huawei.com>
16
We recently solved this problem for x86 PC machines, in commit
15
Message-id: 20201215174815.51520-1-drjones@redhat.com
17
ebc29e1beab. See the commit message for design rationale.
16
[PMM: minor formatting tweak to smp_cpus variable declaration]
18
19
This commit solves it for ARM virt basically the same way: new machine
20
properties pflash0, pflash1 forward to the onboard flash devices'
21
properties. Requires creating the onboard devices in the
22
.instance_init() method virt_instance_init(). The existing code to
23
pick up drives defined with -drive if=pflash is replaced by code to
24
desugar into the machine properties.
25
26
There are a few behavioral differences, though:
27
28
* The flash devices are always present (x86: only present if
29
configured)
30
31
* Flash base addresses and sizes are fixed (x86: sizes depend on
32
images, mapped back to back below a fixed address)
33
34
* -bios configures contents of first pflash (x86: -bios configures ROM
35
contents)
36
37
* -bios is rejected when first pflash is also configured with -machine
38
pflash0=... (x86: bios is silently ignored then)
39
40
* -machine pflash1=... does not require -machine pflash0=... (x86: it
41
does).
42
43
The actual code is a bit simpler than for x86 mostly due to the first
44
two differences.
45
46
Before the patch, all the action is in create_flash(), called from the
47
machine's .init() method machvirt_init():
48
49
main()
50
machine_run_board_init()
51
machvirt_init()
52
create_flash()
53
create_one_flash() for flash[0]
54
create
55
configure
56
includes obeying -drive if=pflash,unit=0
57
realize
58
map
59
fall back to -bios
60
create_one_flash() for flash[1]
61
create
62
configure
63
includes obeying -drive if=pflash,unit=1
64
realize
65
map
66
update FDT
67
68
To make the machine properties work, we need to move device creation
69
to its .instance_init() method virt_instance_init().
70
71
Another complication is machvirt_init()'s computation of
72
@firmware_loaded: it predicts what create_flash() will do. Instead of
73
predicting what create_flash()'s replacement virt_firmware_init() will
74
do, I decided to have virt_firmware_init() return what it did.
75
Requires calling it a bit earlier.
76
77
Resulting call tree:
78
79
main()
80
current_machine = object_new()
81
...
82
virt_instance_init()
83
virt_flash_create()
84
virt_flash_create1() for flash[0]
85
create
86
configure: set defaults
87
become child of machine [NEW]
88
add machine prop pflash0 as alias for drive [NEW]
89
virt_flash_create1() for flash[1]
90
create
91
configure: set defaults
92
become child of machine [NEW]
93
add machine prop pflash1 as alias for drive [NEW]
94
for all machine props from the command line: machine_set_property()
95
...
96
property_set_alias() for machine props pflash0, pflash1
97
...
98
set_drive() for cfi.pflash01 prop drive
99
this is how -machine pflash0=... etc set
100
machine_run_board_init(current_machine);
101
virt_firmware_init()
102
pflash_cfi01_legacy_drive()
103
legacy -drive if=pflash,unit=0 and =1 [NEW]
104
virt_flash_map()
105
virt_flash_map1() for flash[0]
106
configure: num-blocks
107
realize
108
map
109
virt_flash_map1() for flash[1]
110
configure: num-blocks
111
realize
112
map
113
fall back to -bios
114
virt_flash_fdt()
115
update FDT
116
117
You have László to thank for making me explain this in detail.
118
119
Signed-off-by: Markus Armbruster <armbru@redhat.com>
120
Acked-by: Laszlo Ersek <lersek@redhat.com>
121
Message-id: 20190416091348.26075-4-armbru@redhat.com
122
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
123
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
124
---
18
---
125
include/hw/arm/virt.h | 2 +
19
include/hw/arm/virt.h | 3 +--
126
hw/arm/virt.c | 202 +++++++++++++++++++++++++++---------------
20
hw/arm/virt-acpi-build.c | 9 +++++----
127
2 files changed, 132 insertions(+), 72 deletions(-)
21
hw/arm/virt.c | 21 ++++++++++-----------
22
3 files changed, 16 insertions(+), 17 deletions(-)
128
23
129
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
24
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
130
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
131
--- a/include/hw/arm/virt.h
26
--- a/include/hw/arm/virt.h
132
+++ b/include/hw/arm/virt.h
27
+++ b/include/hw/arm/virt.h
28
@@ -XXX,XX +XXX,XX @@ struct VirtMachineState {
29
MemMapEntry *memmap;
30
char *pciehb_nodename;
31
const int *irqmap;
32
- int smp_cpus;
33
void *fdt;
34
int fdt_size;
35
uint32_t clock_phandle;
36
@@ -XXX,XX +XXX,XX @@ static inline int virt_gicv3_redist_region_count(VirtMachineState *vms)
37
38
assert(vms->gic_version == VIRT_GIC_VERSION_3);
39
40
- return vms->smp_cpus > redist0_capacity ? 2 : 1;
41
+ return MACHINE(vms)->smp.cpus > redist0_capacity ? 2 : 1;
42
}
43
44
#endif /* QEMU_ARM_VIRT_H */
45
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/hw/arm/virt-acpi-build.c
48
+++ b/hw/arm/virt-acpi-build.c
133
@@ -XXX,XX +XXX,XX @@
49
@@ -XXX,XX +XXX,XX @@
134
#include "qemu/notify.h"
50
135
#include "hw/boards.h"
51
#define ACPI_BUILD_TABLE_SIZE 0x20000
136
#include "hw/arm/arm.h"
52
137
+#include "hw/block/flash.h"
53
-static void acpi_dsdt_add_cpus(Aml *scope, int smp_cpus)
138
#include "sysemu/kvm.h"
54
+static void acpi_dsdt_add_cpus(Aml *scope, VirtMachineState *vms)
139
#include "hw/intc/arm_gicv3_common.h"
55
{
140
56
+ MachineState *ms = MACHINE(vms);
141
@@ -XXX,XX +XXX,XX @@ typedef struct {
57
uint16_t i;
142
Notifier machine_done;
58
143
DeviceState *platform_bus_dev;
59
- for (i = 0; i < smp_cpus; i++) {
144
FWCfgState *fw_cfg;
60
+ for (i = 0; i < ms->smp.cpus; i++) {
145
+ PFlashCFI01 *flash[2];
61
Aml *dev = aml_device("C%.03X", i);
146
bool secure;
62
aml_append(dev, aml_name_decl("_HID", aml_string("ACPI0007")));
147
bool highmem;
63
aml_append(dev, aml_name_decl("_UID", aml_int(i)));
148
bool highmem_ecam;
64
@@ -XXX,XX +XXX,XX @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
65
gicd->base_address = cpu_to_le64(memmap[VIRT_GIC_DIST].base);
66
gicd->version = vms->gic_version;
67
68
- for (i = 0; i < vms->smp_cpus; i++) {
69
+ for (i = 0; i < MACHINE(vms)->smp.cpus; i++) {
70
AcpiMadtGenericCpuInterface *gicc = acpi_data_push(table_data,
71
sizeof(*gicc));
72
ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(i));
73
@@ -XXX,XX +XXX,XX @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
74
* the RTC ACPI device at all when using UEFI.
75
*/
76
scope = aml_scope("\\_SB");
77
- acpi_dsdt_add_cpus(scope, vms->smp_cpus);
78
+ acpi_dsdt_add_cpus(scope, vms);
79
acpi_dsdt_add_uart(scope, &memmap[VIRT_UART],
80
(irqmap[VIRT_UART] + ARM_SPI_BASE));
81
if (vmc->acpi_expose_flash) {
149
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
82
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
150
index XXXXXXX..XXXXXXX 100644
83
index XXXXXXX..XXXXXXX 100644
151
--- a/hw/arm/virt.c
84
--- a/hw/arm/virt.c
152
+++ b/hw/arm/virt.c
85
+++ b/hw/arm/virt.c
153
@@ -XXX,XX +XXX,XX @@
86
@@ -XXX,XX +XXX,XX @@ static void fdt_add_timer_nodes(const VirtMachineState *vms)
154
87
if (vms->gic_version == VIRT_GIC_VERSION_2) {
155
#include "qemu/osdep.h"
88
irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
156
#include "qemu/units.h"
89
GIC_FDT_IRQ_PPI_CPU_WIDTH,
157
+#include "qemu/option.h"
90
- (1 << vms->smp_cpus) - 1);
158
#include "qapi/error.h"
91
+ (1 << MACHINE(vms)->smp.cpus) - 1);
159
#include "hw/sysbus.h"
160
#include "hw/arm/arm.h"
161
@@ -XXX,XX +XXX,XX @@ static void create_virtio_devices(const VirtMachineState *vms, qemu_irq *pic)
162
}
92
}
163
}
93
164
94
qemu_fdt_add_subnode(vms->fdt, "/timer");
165
-static void create_one_flash(const char *name, hwaddr flashbase,
95
@@ -XXX,XX +XXX,XX @@ static void fdt_add_cpu_nodes(const VirtMachineState *vms)
166
- hwaddr flashsize, const char *file,
96
int cpu;
167
- MemoryRegion *sysmem)
97
int addr_cells = 1;
168
+#define VIRT_FLASH_SECTOR_SIZE (256 * KiB)
98
const MachineState *ms = MACHINE(vms);
169
+
99
+ int smp_cpus = ms->smp.cpus;
170
+static PFlashCFI01 *virt_flash_create1(VirtMachineState *vms,
100
171
+ const char *name,
101
/*
172
+ const char *alias_prop_name)
102
* From Documentation/devicetree/bindings/arm/cpus.txt
103
@@ -XXX,XX +XXX,XX @@ static void fdt_add_cpu_nodes(const VirtMachineState *vms)
104
* The simplest way to go is to examine affinity IDs of all our CPUs. If
105
* at least one of them has Aff3 populated, we set #address-cells to 2.
106
*/
107
- for (cpu = 0; cpu < vms->smp_cpus; cpu++) {
108
+ for (cpu = 0; cpu < smp_cpus; cpu++) {
109
ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));
110
111
if (armcpu->mp_affinity & ARM_AFF3_MASK) {
112
@@ -XXX,XX +XXX,XX @@ static void fdt_add_cpu_nodes(const VirtMachineState *vms)
113
qemu_fdt_setprop_cell(vms->fdt, "/cpus", "#address-cells", addr_cells);
114
qemu_fdt_setprop_cell(vms->fdt, "/cpus", "#size-cells", 0x0);
115
116
- for (cpu = vms->smp_cpus - 1; cpu >= 0; cpu--) {
117
+ for (cpu = smp_cpus - 1; cpu >= 0; cpu--) {
118
char *nodename = g_strdup_printf("/cpus/cpu@%d", cpu);
119
ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(cpu));
120
CPUState *cs = CPU(armcpu);
121
@@ -XXX,XX +XXX,XX @@ static void fdt_add_cpu_nodes(const VirtMachineState *vms)
122
qemu_fdt_setprop_string(vms->fdt, nodename, "compatible",
123
armcpu->dtb_compatible);
124
125
- if (vms->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED
126
- && vms->smp_cpus > 1) {
127
+ if (vms->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED && smp_cpus > 1) {
128
qemu_fdt_setprop_string(vms->fdt, nodename,
129
"enable-method", "psci");
130
}
131
@@ -XXX,XX +XXX,XX @@ static void fdt_add_pmu_nodes(const VirtMachineState *vms)
132
if (vms->gic_version == VIRT_GIC_VERSION_2) {
133
irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
134
GIC_FDT_IRQ_PPI_CPU_WIDTH,
135
- (1 << vms->smp_cpus) - 1);
136
+ (1 << MACHINE(vms)->smp.cpus) - 1);
137
}
138
139
qemu_fdt_add_subnode(vms->fdt, "/pmu");
140
@@ -XXX,XX +XXX,XX @@ static void finalize_gic_version(VirtMachineState *vms)
141
* virt_cpu_post_init() must be called after the CPUs have
142
* been realized and the GIC has been created.
143
*/
144
-static void virt_cpu_post_init(VirtMachineState *vms, int max_cpus,
145
- MemoryRegion *sysmem)
146
+static void virt_cpu_post_init(VirtMachineState *vms, MemoryRegion *sysmem)
173
{
147
{
174
- /* Create and map a single flash device. We use the same
148
+ int max_cpus = MACHINE(vms)->smp.max_cpus;
175
- * parameters as the flash devices on the Versatile Express board.
149
bool aarch64, pmu, steal_time;
176
+ /*
150
CPUState *cpu;
177
+ * Create a single flash device. We use the same parameters as
151
178
+ * the flash devices on the Versatile Express board.
179
*/
180
- DriveInfo *dinfo = drive_get_next(IF_PFLASH);
181
DeviceState *dev = qdev_create(NULL, TYPE_PFLASH_CFI01);
182
- SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
183
- const uint64_t sectorlength = 256 * 1024;
184
185
- if (dinfo) {
186
- qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo),
187
- &error_abort);
188
- }
189
-
190
- qdev_prop_set_uint32(dev, "num-blocks", flashsize / sectorlength);
191
- qdev_prop_set_uint64(dev, "sector-length", sectorlength);
192
+ qdev_prop_set_uint64(dev, "sector-length", VIRT_FLASH_SECTOR_SIZE);
193
qdev_prop_set_uint8(dev, "width", 4);
194
qdev_prop_set_uint8(dev, "device-width", 2);
195
qdev_prop_set_bit(dev, "big-endian", false);
196
@@ -XXX,XX +XXX,XX @@ static void create_one_flash(const char *name, hwaddr flashbase,
197
qdev_prop_set_uint16(dev, "id2", 0x00);
198
qdev_prop_set_uint16(dev, "id3", 0x00);
199
qdev_prop_set_string(dev, "name", name);
200
- qdev_init_nofail(dev);
201
-
202
- memory_region_add_subregion(sysmem, flashbase,
203
- sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
204
-
205
- if (file) {
206
- char *fn;
207
- int image_size;
208
-
209
- if (drive_get(IF_PFLASH, 0, 0)) {
210
- error_report("The contents of the first flash device may be "
211
- "specified with -bios or with -drive if=pflash... "
212
- "but you cannot use both options at once");
213
- exit(1);
214
- }
215
- fn = qemu_find_file(QEMU_FILE_TYPE_BIOS, file);
216
- if (!fn) {
217
- error_report("Could not find ROM image '%s'", file);
218
- exit(1);
219
- }
220
- image_size = load_image_mr(fn, sysbus_mmio_get_region(sbd, 0));
221
- g_free(fn);
222
- if (image_size < 0) {
223
- error_report("Could not load ROM image '%s'", file);
224
- exit(1);
225
- }
226
- }
227
+ object_property_add_child(OBJECT(vms), name, OBJECT(dev),
228
+ &error_abort);
229
+ object_property_add_alias(OBJECT(vms), alias_prop_name,
230
+ OBJECT(dev), "drive", &error_abort);
231
+ return PFLASH_CFI01(dev);
232
}
233
234
-static void create_flash(const VirtMachineState *vms,
235
- MemoryRegion *sysmem,
236
- MemoryRegion *secure_sysmem)
237
+static void virt_flash_create(VirtMachineState *vms)
238
{
239
- /* Create two flash devices to fill the VIRT_FLASH space in the memmap.
240
- * Any file passed via -bios goes in the first of these.
241
+ vms->flash[0] = virt_flash_create1(vms, "virt.flash0", "pflash0");
242
+ vms->flash[1] = virt_flash_create1(vms, "virt.flash1", "pflash1");
243
+}
244
+
245
+static void virt_flash_map1(PFlashCFI01 *flash,
246
+ hwaddr base, hwaddr size,
247
+ MemoryRegion *sysmem)
248
+{
249
+ DeviceState *dev = DEVICE(flash);
250
+
251
+ assert(size % VIRT_FLASH_SECTOR_SIZE == 0);
252
+ assert(size / VIRT_FLASH_SECTOR_SIZE <= UINT32_MAX);
253
+ qdev_prop_set_uint32(dev, "num-blocks", size / VIRT_FLASH_SECTOR_SIZE);
254
+ qdev_init_nofail(dev);
255
+
256
+ memory_region_add_subregion(sysmem, base,
257
+ sysbus_mmio_get_region(SYS_BUS_DEVICE(dev),
258
+ 0));
259
+}
260
+
261
+static void virt_flash_map(VirtMachineState *vms,
262
+ MemoryRegion *sysmem,
263
+ MemoryRegion *secure_sysmem)
264
+{
265
+ /*
266
+ * Map two flash devices to fill the VIRT_FLASH space in the memmap.
267
* sysmem is the system memory space. secure_sysmem is the secure view
268
* of the system, and the first flash device should be made visible only
269
* there. The second flash device is visible to both secure and nonsecure.
270
@@ -XXX,XX +XXX,XX @@ static void create_flash(const VirtMachineState *vms,
271
*/
272
hwaddr flashsize = vms->memmap[VIRT_FLASH].size / 2;
273
hwaddr flashbase = vms->memmap[VIRT_FLASH].base;
274
- char *nodename;
275
276
- create_one_flash("virt.flash0", flashbase, flashsize,
277
- bios_name, secure_sysmem);
278
- create_one_flash("virt.flash1", flashbase + flashsize, flashsize,
279
- NULL, sysmem);
280
+ virt_flash_map1(vms->flash[0], flashbase, flashsize,
281
+ secure_sysmem);
282
+ virt_flash_map1(vms->flash[1], flashbase + flashsize, flashsize,
283
+ sysmem);
284
+}
285
+
286
+static void virt_flash_fdt(VirtMachineState *vms,
287
+ MemoryRegion *sysmem,
288
+ MemoryRegion *secure_sysmem)
289
+{
290
+ hwaddr flashsize = vms->memmap[VIRT_FLASH].size / 2;
291
+ hwaddr flashbase = vms->memmap[VIRT_FLASH].base;
292
+ char *nodename;
293
294
if (sysmem == secure_sysmem) {
295
/* Report both flash devices as a single node in the DT */
296
@@ -XXX,XX +XXX,XX @@ static void create_flash(const VirtMachineState *vms,
297
qemu_fdt_setprop_cell(vms->fdt, nodename, "bank-width", 4);
298
g_free(nodename);
299
} else {
300
- /* Report the devices as separate nodes so we can mark one as
301
+ /*
302
+ * Report the devices as separate nodes so we can mark one as
303
* only visible to the secure world.
304
*/
305
nodename = g_strdup_printf("/secflash@%" PRIx64, flashbase);
306
@@ -XXX,XX +XXX,XX @@ static void create_flash(const VirtMachineState *vms,
307
}
308
}
309
310
+static bool virt_firmware_init(VirtMachineState *vms,
311
+ MemoryRegion *sysmem,
312
+ MemoryRegion *secure_sysmem)
313
+{
314
+ int i;
315
+ BlockBackend *pflash_blk0;
316
+
317
+ /* Map legacy -drive if=pflash to machine properties */
318
+ for (i = 0; i < ARRAY_SIZE(vms->flash); i++) {
319
+ pflash_cfi01_legacy_drive(vms->flash[i],
320
+ drive_get(IF_PFLASH, 0, i));
321
+ }
322
+
323
+ virt_flash_map(vms, sysmem, secure_sysmem);
324
+
325
+ pflash_blk0 = pflash_cfi01_get_blk(vms->flash[0]);
326
+
327
+ if (bios_name) {
328
+ char *fname;
329
+ MemoryRegion *mr;
330
+ int image_size;
331
+
332
+ if (pflash_blk0) {
333
+ error_report("The contents of the first flash device may be "
334
+ "specified with -bios or with -drive if=pflash... "
335
+ "but you cannot use both options at once");
336
+ exit(1);
337
+ }
338
+
339
+ /* Fall back to -bios */
340
+
341
+ fname = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
342
+ if (!fname) {
343
+ error_report("Could not find ROM image '%s'", bios_name);
344
+ exit(1);
345
+ }
346
+ mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(vms->flash[0]), 0);
347
+ image_size = load_image_mr(fname, mr);
348
+ g_free(fname);
349
+ if (image_size < 0) {
350
+ error_report("Could not load ROM image '%s'", bios_name);
351
+ exit(1);
352
+ }
353
+ }
354
+
355
+ return pflash_blk0 || bios_name;
356
+}
357
+
358
static FWCfgState *create_fw_cfg(const VirtMachineState *vms, AddressSpace *as)
359
{
360
hwaddr base = vms->memmap[VIRT_FW_CFG].base;
361
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
362
MemoryRegion *secure_sysmem = NULL;
363
int n, virt_max_cpus;
364
MemoryRegion *ram = g_new(MemoryRegion, 1);
365
- bool firmware_loaded = bios_name || drive_get(IF_PFLASH, 0, 0);
366
+ bool firmware_loaded;
367
bool aarch64 = true;
368
369
/*
370
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
152
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
371
exit(1);
153
exit(1);
372
}
154
}
373
155
374
+ if (vms->secure) {
156
- vms->smp_cpus = smp_cpus;
375
+ if (kvm_enabled()) {
157
-
376
+ error_report("mach-virt: KVM does not support Security extensions");
158
if (vms->virt && kvm_enabled()) {
377
+ exit(1);
159
error_report("mach-virt: KVM does not support providing "
378
+ }
160
"Virtualization extensions to the guest CPU");
379
+
380
+ /*
381
+ * The Secure view of the world is the same as the NonSecure,
382
+ * but with a few extra devices. Create it as a container region
383
+ * containing the system memory at low priority; any secure-only
384
+ * devices go in at higher priority and take precedence.
385
+ */
386
+ secure_sysmem = g_new(MemoryRegion, 1);
387
+ memory_region_init(secure_sysmem, OBJECT(machine), "secure-memory",
388
+ UINT64_MAX);
389
+ memory_region_add_subregion_overlap(secure_sysmem, 0, sysmem, -1);
390
+ }
391
+
392
+ firmware_loaded = virt_firmware_init(vms, sysmem,
393
+ secure_sysmem ?: sysmem);
394
+
395
/* If we have an EL3 boot ROM then the assumption is that it will
396
* implement PSCI itself, so disable QEMU's internal implementation
397
* so it doesn't get in the way. Instead of starting secondary
398
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
161
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
399
exit(1);
400
}
401
402
- if (vms->secure) {
403
- if (kvm_enabled()) {
404
- error_report("mach-virt: KVM does not support Security extensions");
405
- exit(1);
406
- }
407
-
408
- /* The Secure view of the world is the same as the NonSecure,
409
- * but with a few extra devices. Create it as a container region
410
- * containing the system memory at low priority; any secure-only
411
- * devices go in at higher priority and take precedence.
412
- */
413
- secure_sysmem = g_new(MemoryRegion, 1);
414
- memory_region_init(secure_sysmem, OBJECT(machine), "secure-memory",
415
- UINT64_MAX);
416
- memory_region_add_subregion_overlap(secure_sysmem, 0, sysmem, -1);
417
- }
418
-
419
create_fdt(vms);
162
create_fdt(vms);
420
163
421
possible_cpus = mc->possible_cpu_arch_ids(machine);
164
possible_cpus = mc->possible_cpu_arch_ids(machine);
165
+ assert(possible_cpus->len == max_cpus);
166
for (n = 0; n < possible_cpus->len; n++) {
167
Object *cpuobj;
168
CPUState *cs;
422
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
169
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
423
&machine->device_memory->mr);
170
424
}
171
create_gic(vms);
425
172
426
- create_flash(vms, sysmem, secure_sysmem ? secure_sysmem : sysmem);
173
- virt_cpu_post_init(vms, possible_cpus->len, sysmem);
427
+ virt_flash_fdt(vms, sysmem, secure_sysmem);
174
+ virt_cpu_post_init(vms, sysmem);
428
175
429
create_gic(vms, pic);
176
fdt_add_pmu_nodes(vms);
430
177
431
@@ -XXX,XX +XXX,XX @@ static void virt_instance_init(Object *obj)
432
NULL);
433
434
vms->irqmap = a15irqmap;
435
+
436
+ virt_flash_create(vms);
437
}
438
439
static const TypeInfo virt_machine_info = {
440
--
178
--
441
2.20.1
179
2.20.1
442
180
443
181
diff view generated by jsdifflib
1
Currently the dc_zva helper function uses a variable length
1
From: Richard Henderson <richard.henderson@linaro.org>
2
array. In fact we know (as the comment above remarks) that
3
the length of this array is bounded because the architecture
4
limits the block size and QEMU limits the target page size.
5
Use a fixed array size and assert that we don't run off it.
6
2
3
In 50244cc76abc we updated mte_check_fail to match the ARM
4
pseudocode, using the correct EL to select the TCF field.
5
But we failed to update MTE0_ACTIVE the same way, which led
6
to g_assert_not_reached().
7
8
Cc: qemu-stable@nongnu.org
9
Buglink: https://bugs.launchpad.net/bugs/1907137
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20201221204426.88514-1-richard.henderson@linaro.org
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20190503120448.13385-1-peter.maydell@linaro.org
12
---
14
---
13
target/arm/helper.c | 8 ++++++--
15
target/arm/helper.c | 2 +-
14
1 file changed, 6 insertions(+), 2 deletions(-)
16
1 file changed, 1 insertion(+), 1 deletion(-)
15
17
16
diff --git a/target/arm/helper.c b/target/arm/helper.c
18
diff --git a/target/arm/helper.c b/target/arm/helper.c
17
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/helper.c
20
--- a/target/arm/helper.c
19
+++ b/target/arm/helper.c
21
+++ b/target/arm/helper.c
20
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
21
#include "qemu/osdep.h"
23
if (FIELD_EX32(flags, TBFLAG_A64, UNPRIV)
22
+#include "qemu/units.h"
24
&& tbid
23
#include "target/arm/idau.h"
25
&& !(env->pstate & PSTATE_TCO)
24
#include "trace.h"
26
- && (sctlr & SCTLR_TCF0)
25
#include "cpu.h"
27
+ && (sctlr & SCTLR_TCF)
26
@@ -XXX,XX +XXX,XX @@ void HELPER(dc_zva)(CPUARMState *env, uint64_t vaddr_in)
28
&& allocation_tag_access_enabled(env, 0, sctlr)) {
27
* We know that in fact for any v8 CPU the page size is at least 4K
29
flags = FIELD_DP32(flags, TBFLAG_A64, MTE0_ACTIVE, 1);
28
* and the block size must be 2K or less, but TARGET_PAGE_SIZE is only
30
}
29
* 1K as an artefact of legacy v5 subpage support being present in the
30
- * same QEMU executable.
31
+ * same QEMU executable. So in practice the hostaddr[] array has
32
+ * two entries, given the current setting of TARGET_PAGE_BITS_MIN.
33
*/
34
int maxidx = DIV_ROUND_UP(blocklen, TARGET_PAGE_SIZE);
35
- void *hostaddr[maxidx];
36
+ void *hostaddr[DIV_ROUND_UP(2 * KiB, 1 << TARGET_PAGE_BITS_MIN)];
37
int try, i;
38
unsigned mmu_idx = cpu_mmu_index(env, false);
39
TCGMemOpIdx oi = make_memop_idx(MO_UB, mmu_idx);
40
41
+ assert(maxidx <= ARRAY_SIZE(hostaddr));
42
+
43
for (try = 0; try < 2; try++) {
44
45
for (i = 0; i < maxidx; i++) {
46
--
31
--
47
2.20.1
32
2.20.1
48
33
49
34
diff view generated by jsdifflib
1
The non-secure versions of the BFAR and BFSR registers are
1
The CCR is a register most of whose bits are banked between security
2
supposed to be RAZ/WI if AICR.BFHFNMINS == 0; we were
2
states but where BFHFNMIGN is not, and we keep it in the non-secure
3
incorrectly allowing NS code to access the real values.
3
entry of the v7m.ccr[] array. The logic which tries to handle this
4
bit fails to implement the "RAZ/WI from Nonsecure if AIRCR.BFHFNMINS
5
is zero" requirement; correct the omission.
4
6
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20190430131439.25251-3-peter.maydell@linaro.org
9
Message-id: 20201210201433.26262-2-peter.maydell@linaro.org
8
---
10
---
9
hw/intc/armv7m_nvic.c | 27 ++++++++++++++++++++++++---
11
hw/intc/armv7m_nvic.c | 15 +++++++++++++++
10
1 file changed, 24 insertions(+), 3 deletions(-)
12
1 file changed, 15 insertions(+)
11
13
12
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
14
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
13
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/intc/armv7m_nvic.c
16
--- a/hw/intc/armv7m_nvic.c
15
+++ b/hw/intc/armv7m_nvic.c
17
+++ b/hw/intc/armv7m_nvic.c
16
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
18
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
17
if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
19
*/
18
goto bad_offset;
20
val = cpu->env.v7m.ccr[attrs.secure];
21
val |= cpu->env.v7m.ccr[M_REG_NS] & R_V7M_CCR_BFHFNMIGN_MASK;
22
+ /* BFHFNMIGN is RAZ/WI from NS if AIRCR.BFHFNMINS is 0 */
23
+ if (!attrs.secure) {
24
+ if (!(cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK)) {
25
+ val &= ~R_V7M_CCR_BFHFNMIGN_MASK;
26
+ }
27
+ }
28
return val;
29
case 0xd24: /* System Handler Control and State (SHCSR) */
30
if (!arm_feature(&cpu->env, ARM_FEATURE_V7)) {
31
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
32
(cpu->env.v7m.ccr[M_REG_NS] & ~R_V7M_CCR_BFHFNMIGN_MASK)
33
| (value & R_V7M_CCR_BFHFNMIGN_MASK);
34
value &= ~R_V7M_CCR_BFHFNMIGN_MASK;
35
+ } else {
36
+ /*
37
+ * BFHFNMIGN is RAZ/WI from NS if AIRCR.BFHFNMINS is 0, so
38
+ * preserve the state currently in the NS element of the array
39
+ */
40
+ if (!(cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK)) {
41
+ value &= ~R_V7M_CCR_BFHFNMIGN_MASK;
42
+ value |= cpu->env.v7m.ccr[M_REG_NS] & R_V7M_CCR_BFHFNMIGN_MASK;
43
+ }
19
}
44
}
20
+ if (!attrs.secure &&
45
21
+ !(s->cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK)) {
46
cpu->env.v7m.ccr[attrs.secure] = value;
22
+ return 0;
23
+ }
24
return cpu->env.v7m.bfar;
25
case 0xd3c: /* Aux Fault Status. */
26
/* TODO: Implement fault status registers. */
27
@@ -XXX,XX +XXX,XX @@ static void nvic_writel(NVICState *s, uint32_t offset, uint32_t value,
28
if (!arm_feature(&cpu->env, ARM_FEATURE_M_MAIN)) {
29
goto bad_offset;
30
}
31
+ if (!attrs.secure &&
32
+ !(s->cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK)) {
33
+ return;
34
+ }
35
cpu->env.v7m.bfar = value;
36
return;
37
case 0xd3c: /* Aux Fault Status. */
38
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_read(void *opaque, hwaddr addr,
39
val = 0;
40
break;
41
};
42
- /* The BFSR bits [15:8] are shared between security states
43
- * and we store them in the NS copy
44
+ /*
45
+ * The BFSR bits [15:8] are shared between security states
46
+ * and we store them in the NS copy. They are RAZ/WI for
47
+ * NS code if AIRCR.BFHFNMINS is 0.
48
*/
49
val = s->cpu->env.v7m.cfsr[attrs.secure];
50
- val |= s->cpu->env.v7m.cfsr[M_REG_NS] & R_V7M_CFSR_BFSR_MASK;
51
+ if (!attrs.secure &&
52
+ !(s->cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK)) {
53
+ val &= ~R_V7M_CFSR_BFSR_MASK;
54
+ } else {
55
+ val |= s->cpu->env.v7m.cfsr[M_REG_NS] & R_V7M_CFSR_BFSR_MASK;
56
+ }
57
val = extract32(val, (offset - 0xd28) * 8, size * 8);
58
break;
59
case 0xfe0 ... 0xfff: /* ID. */
60
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
61
*/
62
value <<= ((offset - 0xd28) * 8);
63
64
+ if (!attrs.secure &&
65
+ !(s->cpu->env.v7m.aircr & R_V7M_AIRCR_BFHFNMINS_MASK)) {
66
+ /* BFSR bits are RAZ/WI for NS if BFHFNMINS is set */
67
+ value &= ~R_V7M_CFSR_BFSR_MASK;
68
+ }
69
+
70
s->cpu->env.v7m.cfsr[attrs.secure] &= ~value;
71
if (attrs.secure) {
72
/* The BFSR bits [15:8] are shared between security states
73
--
47
--
74
2.20.1
48
2.20.1
75
49
76
50
diff view generated by jsdifflib
1
Rule R_CQRV says that if two pending interrupts have the same
1
In commit 64f863baeedc8659 we implemented the v8.1M FPCXT_S register,
2
group priority then ties are broken by looking at the subpriority.
2
but we got the write behaviour wrong. On read, this register reads
3
We had a comment describing this but had forgotten to actually
3
bits [27:0] of FPSCR plus the CONTROL.SFPA bit. On write, it doesn't
4
implement the subpriority comparison. Correct the omission.
4
just write back those bits -- it writes a value to the whole FPSCR,
5
whose upper 4 bits are zeroes.
5
6
6
(The further tie break rules of "lowest exception number" and
7
We also incorrectly implemented the write-to-FPSCR as a simple store
7
"secure before non-secure" are handled implicitly by the order
8
to vfp.xregs; this skips the "update the softfloat flags" part of
8
in which we iterate through the exceptions in the loops.)
9
the vfp_set_fpscr helper so the value would read back correctly but
10
not actually take effect.
11
12
Fix both of these things by doing a complete write to the FPSCR
13
using the helper function.
9
14
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20190430131439.25251-2-peter.maydell@linaro.org
17
Message-id: 20201210201433.26262-3-peter.maydell@linaro.org
13
---
18
---
14
hw/intc/armv7m_nvic.c | 9 +++++++--
19
target/arm/translate-vfp.c.inc | 12 ++++++------
15
1 file changed, 7 insertions(+), 2 deletions(-)
20
1 file changed, 6 insertions(+), 6 deletions(-)
16
21
17
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
22
diff --git a/target/arm/translate-vfp.c.inc b/target/arm/translate-vfp.c.inc
18
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/armv7m_nvic.c
24
--- a/target/arm/translate-vfp.c.inc
20
+++ b/hw/intc/armv7m_nvic.c
25
+++ b/target/arm/translate-vfp.c.inc
21
@@ -XXX,XX +XXX,XX @@ static void nvic_recompute_state_secure(NVICState *s)
26
@@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno,
22
int active_prio = NVIC_NOEXC_PRIO;
27
}
23
int pend_irq = 0;
28
case ARM_VFP_FPCXT_S:
24
bool pending_is_s_banked = false;
29
{
25
+ int pend_subprio = 0;
30
- TCGv_i32 sfpa, control, fpscr;
26
31
- /* Set FPSCR[27:0] and CONTROL.SFPA from value */
27
/* R_CQRV: precedence is by:
32
+ TCGv_i32 sfpa, control;
28
* - lowest group priority; if both the same then
33
+ /*
29
@@ -XXX,XX +XXX,XX @@ static void nvic_recompute_state_secure(NVICState *s)
34
+ * Set FPSCR and CONTROL.SFPA from value; the new FPSCR takes
30
for (i = 1; i < s->num_irq; i++) {
35
+ * bits [27:0] from value and zeroes bits [31:28].
31
for (bank = M_REG_S; bank >= M_REG_NS; bank--) {
36
+ */
32
VecInfo *vec;
37
tmp = loadfn(s, opaque);
33
- int prio;
38
sfpa = tcg_temp_new_i32();
34
+ int prio, subprio;
39
tcg_gen_shri_i32(sfpa, tmp, 31);
35
bool targets_secure;
40
@@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno,
36
41
tcg_gen_deposit_i32(control, control, sfpa,
37
if (bank == M_REG_S) {
42
R_V7M_CONTROL_SFPA_SHIFT, 1);
38
@@ -XXX,XX +XXX,XX @@ static void nvic_recompute_state_secure(NVICState *s)
43
store_cpu_field(control, v7m.control[M_REG_S]);
39
}
44
- fpscr = load_cpu_field(vfp.xregs[ARM_VFP_FPSCR]);
40
45
- tcg_gen_andi_i32(fpscr, fpscr, FPCR_NZCV_MASK);
41
prio = exc_group_prio(s, vec->prio, targets_secure);
46
tcg_gen_andi_i32(tmp, tmp, ~FPCR_NZCV_MASK);
42
- if (vec->enabled && vec->pending && prio < pend_prio) {
47
- tcg_gen_or_i32(fpscr, fpscr, tmp);
43
+ subprio = vec->prio & ~nvic_gprio_mask(s, targets_secure);
48
- store_cpu_field(fpscr, vfp.xregs[ARM_VFP_FPSCR]);
44
+ if (vec->enabled && vec->pending &&
49
+ gen_helper_vfp_set_fpscr(cpu_env, tmp);
45
+ ((prio < pend_prio) ||
50
tcg_temp_free_i32(tmp);
46
+ (prio == pend_prio && prio >= 0 && subprio < pend_subprio))) {
51
tcg_temp_free_i32(sfpa);
47
pend_prio = prio;
52
break;
48
+ pend_subprio = subprio;
49
pend_irq = i;
50
pending_is_s_banked = (bank == M_REG_S);
51
}
52
--
53
--
53
2.20.1
54
2.20.1
54
55
55
56
diff view generated by jsdifflib
1
At the moment the Arm implementations of kvm_arch_{get,put}_registers()
1
Implement the v8.1M FPCXT_NS floating-point system register. This is
2
don't support having QEMU change the values of system registers
2
a little more complicated than FPCXT_S, because it has specific
3
(aka coprocessor registers for AArch32). This is because although
3
handling for "current FP state is inactive", and it only wants to do
4
kvm_arch_get_registers() calls write_list_to_cpustate() to
4
PreserveFPState(), not the full set of actions done by
5
update the CPU state struct fields (so QEMU code can read the
5
ExecuteFPCheck() which vfp_access_check() implements.
6
values in the usual way), kvm_arch_put_registers() does not
7
call write_cpustate_to_list(), meaning that any changes to
8
the CPU state struct fields will not be passed back to KVM.
9
10
The rationale for this design is documented in a comment in the
11
AArch32 kvm_arch_put_registers() -- writing the values in the
12
cpregs list into the CPU state struct is "lossy" because the
13
write of a register might not succeed, and so if we blindly
14
copy the CPU state values back again we will incorrectly
15
change register values for the guest. The assumption was that
16
no QEMU code would need to write to the registers.
17
18
However, when we implemented debug support for KVM guests, we
19
broke that assumption: the code to handle "set the guest up
20
to take a breakpoint exception" does so by updating various
21
guest registers including ESR_EL1.
22
23
Support this by making kvm_arch_put_registers() synchronize
24
CPU state back into the list. We sync only those registers
25
where the initial write succeeds, which should be sufficient.
26
27
This commit is the same as commit 823e1b3818f9b10b824ddc which we
28
had to revert in commit 942f99c825fc94c8b1a4, except that the bug
29
which was preventing EDK2 guest firmware running has been fixed:
30
kvm_arm_reset_vcpu() now calls write_list_to_cpustate().
31
6
32
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
33
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
34
Tested-by: Eric Auger <eric.auger@redhat.com>
9
Message-id: 20201210201433.26262-4-peter.maydell@linaro.org
35
---
10
---
36
target/arm/cpu.h | 9 ++++++++-
11
target/arm/translate-vfp.c.inc | 102 ++++++++++++++++++++++++++++++++-
37
target/arm/helper.c | 27 +++++++++++++++++++++++++--
12
1 file changed, 99 insertions(+), 3 deletions(-)
38
target/arm/kvm.c | 8 ++++++++
39
target/arm/kvm32.c | 20 ++------------------
40
target/arm/kvm64.c | 2 ++
41
target/arm/machine.c | 2 +-
42
6 files changed, 46 insertions(+), 22 deletions(-)
43
13
44
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
14
diff --git a/target/arm/translate-vfp.c.inc b/target/arm/translate-vfp.c.inc
45
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/cpu.h
16
--- a/target/arm/translate-vfp.c.inc
47
+++ b/target/arm/cpu.h
17
+++ b/target/arm/translate-vfp.c.inc
48
@@ -XXX,XX +XXX,XX @@ bool write_list_to_cpustate(ARMCPU *cpu);
18
@@ -XXX,XX +XXX,XX @@ static FPSysRegCheckResult fp_sysreg_checks(DisasContext *s, int regno)
49
/**
19
}
50
* write_cpustate_to_list:
20
break;
51
* @cpu: ARMCPU
21
case ARM_VFP_FPCXT_S:
52
+ * @kvm_sync: true if this is for syncing back to KVM
22
+ case ARM_VFP_FPCXT_NS:
53
*
23
if (!arm_dc_feature(s, ARM_FEATURE_V8_1M)) {
54
* For each register listed in the ARMCPU cpreg_indexes list, write
24
return false;
55
* its value from the ARMCPUState structure into the cpreg_values list.
25
}
56
* This is used to copy info from TCG's working data structures into
26
@@ -XXX,XX +XXX,XX @@ static FPSysRegCheckResult fp_sysreg_checks(DisasContext *s, int regno)
57
* KVM or for outbound migration.
27
return FPSysRegCheckFailed;
58
*
28
}
59
+ * @kvm_sync is true if we are doing this in order to sync the
29
60
+ * register state back to KVM. In this case we will only update
30
- if (!vfp_access_check(s)) {
61
+ * values in the list if the previous list->cpustate sync actually
31
+ /*
62
+ * successfully wrote the CPU state. Otherwise we will keep the value
32
+ * FPCXT_NS is a special case: it has specific handling for
63
+ * that is in the list.
33
+ * "current FP state is inactive", and must do the PreserveFPState()
64
+ *
34
+ * but not the usual full set of actions done by ExecuteFPCheck().
65
* Returns: true if all register values were read correctly,
35
+ * So we don't call vfp_access_check() and the callers must handle this.
66
* false if some register was unknown or could not be read.
36
+ */
67
* Note that we do not stop early on failure -- we will attempt
37
+ if (regno != ARM_VFP_FPCXT_NS && !vfp_access_check(s)) {
68
* reading all registers in the list.
38
return FPSysRegCheckDone;
69
*/
39
}
70
-bool write_cpustate_to_list(ARMCPU *cpu);
40
-
71
+bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync);
41
return FPSysRegCheckContinue;
72
42
}
73
#define ARM_CPUID_TI915T 0x54029152
43
74
#define ARM_CPUID_TI925T 0x54029252
44
+static void gen_branch_fpInactive(DisasContext *s, TCGCond cond,
75
diff --git a/target/arm/helper.c b/target/arm/helper.c
45
+ TCGLabel *label)
76
index XXXXXXX..XXXXXXX 100644
46
+{
77
--- a/target/arm/helper.c
47
+ /*
78
+++ b/target/arm/helper.c
48
+ * FPCXT_NS is a special case: it has specific handling for
79
@@ -XXX,XX +XXX,XX @@ static bool raw_accessors_invalid(const ARMCPRegInfo *ri)
49
+ * "current FP state is inactive", and must do the PreserveFPState()
50
+ * but not the usual full set of actions done by ExecuteFPCheck().
51
+ * We don't have a TB flag that matches the fpInactive check, so we
52
+ * do it at runtime as we don't expect FPCXT_NS accesses to be frequent.
53
+ *
54
+ * Emit code that checks fpInactive and does a conditional
55
+ * branch to label based on it:
56
+ * if cond is TCG_COND_NE then branch if fpInactive != 0 (ie if inactive)
57
+ * if cond is TCG_COND_EQ then branch if fpInactive == 0 (ie if active)
58
+ */
59
+ assert(cond == TCG_COND_EQ || cond == TCG_COND_NE);
60
+
61
+ /* fpInactive = FPCCR_NS.ASPEN == 1 && CONTROL.FPCA == 0 */
62
+ TCGv_i32 aspen, fpca;
63
+ aspen = load_cpu_field(v7m.fpccr[M_REG_NS]);
64
+ fpca = load_cpu_field(v7m.control[M_REG_S]);
65
+ tcg_gen_andi_i32(aspen, aspen, R_V7M_FPCCR_ASPEN_MASK);
66
+ tcg_gen_xori_i32(aspen, aspen, R_V7M_FPCCR_ASPEN_MASK);
67
+ tcg_gen_andi_i32(fpca, fpca, R_V7M_CONTROL_FPCA_MASK);
68
+ tcg_gen_or_i32(fpca, fpca, aspen);
69
+ tcg_gen_brcondi_i32(tcg_invert_cond(cond), fpca, 0, label);
70
+ tcg_temp_free_i32(aspen);
71
+ tcg_temp_free_i32(fpca);
72
+}
73
+
74
static bool gen_M_fp_sysreg_write(DisasContext *s, int regno,
75
76
fp_sysreg_loadfn *loadfn,
77
@@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno,
78
{
79
/* Do a write to an M-profile floating point system register */
80
TCGv_i32 tmp;
81
+ TCGLabel *lab_end = NULL;
82
83
switch (fp_sysreg_checks(s, regno)) {
84
case FPSysRegCheckFailed:
85
@@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno,
86
tcg_temp_free_i32(tmp);
87
break;
88
}
89
+ case ARM_VFP_FPCXT_NS:
90
+ lab_end = gen_new_label();
91
+ /* fpInactive case: write is a NOP, so branch to end */
92
+ gen_branch_fpInactive(s, TCG_COND_NE, lab_end);
93
+ /* !fpInactive: PreserveFPState(), and reads same as FPCXT_S */
94
+ gen_preserve_fp_state(s);
95
+ /* fall through */
96
case ARM_VFP_FPCXT_S:
97
{
98
TCGv_i32 sfpa, control;
99
@@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno,
100
default:
101
g_assert_not_reached();
102
}
103
+ if (lab_end) {
104
+ gen_set_label(lab_end);
105
+ }
80
return true;
106
return true;
81
}
107
}
82
108
83
-bool write_cpustate_to_list(ARMCPU *cpu)
109
@@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_read(DisasContext *s, int regno,
84
+bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync)
85
{
110
{
86
/* Write the coprocessor state from cpu->env to the (index,value) list. */
111
/* Do a read from an M-profile floating point system register */
87
int i;
112
TCGv_i32 tmp;
88
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu)
113
+ TCGLabel *lab_end = NULL;
89
for (i = 0; i < cpu->cpreg_array_len; i++) {
114
+ bool lookup_tb = false;
90
uint32_t regidx = kvm_to_cpreg_id(cpu->cpreg_indexes[i]);
115
91
const ARMCPRegInfo *ri;
116
switch (fp_sysreg_checks(s, regno)) {
92
+ uint64_t newval;
117
case FPSysRegCheckFailed:
93
118
@@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_read(DisasContext *s, int regno,
94
ri = get_arm_cp_reginfo(cpu->cp_regs, regidx);
119
fpscr = load_cpu_field(v7m.fpdscr[M_REG_NS]);
95
if (!ri) {
120
gen_helper_vfp_set_fpscr(cpu_env, fpscr);
96
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu)
121
tcg_temp_free_i32(fpscr);
97
if (ri->type & ARM_CP_NO_RAW) {
122
- gen_lookup_tb(s);
98
continue;
123
+ lookup_tb = true;
99
}
124
+ break;
100
- cpu->cpreg_values[i] = read_raw_cp_reg(&cpu->env, ri);
125
+ }
126
+ case ARM_VFP_FPCXT_NS:
127
+ {
128
+ TCGv_i32 control, sfpa, fpscr, fpdscr, zero;
129
+ TCGLabel *lab_active = gen_new_label();
101
+
130
+
102
+ newval = read_raw_cp_reg(&cpu->env, ri);
131
+ lookup_tb = true;
103
+ if (kvm_sync) {
104
+ /*
105
+ * Only sync if the previous list->cpustate sync succeeded.
106
+ * Rather than tracking the success/failure state for every
107
+ * item in the list, we just recheck "does the raw write we must
108
+ * have made in write_list_to_cpustate() read back OK" here.
109
+ */
110
+ uint64_t oldval = cpu->cpreg_values[i];
111
+
132
+
112
+ if (oldval == newval) {
133
+ gen_branch_fpInactive(s, TCG_COND_EQ, lab_active);
113
+ continue;
134
+ /* fpInactive case: reads as FPDSCR_NS */
114
+ }
135
+ TCGv_i32 tmp = load_cpu_field(v7m.fpdscr[M_REG_NS]);
136
+ storefn(s, opaque, tmp);
137
+ lab_end = gen_new_label();
138
+ tcg_gen_br(lab_end);
115
+
139
+
116
+ write_raw_cp_reg(&cpu->env, ri, oldval);
140
+ gen_set_label(lab_active);
117
+ if (read_raw_cp_reg(&cpu->env, ri) != oldval) {
141
+ /* !fpInactive: Reads the same as FPCXT_S, but side effects differ */
118
+ continue;
142
+ gen_preserve_fp_state(s);
119
+ }
143
+ tmp = tcg_temp_new_i32();
144
+ sfpa = tcg_temp_new_i32();
145
+ fpscr = tcg_temp_new_i32();
146
+ gen_helper_vfp_get_fpscr(fpscr, cpu_env);
147
+ tcg_gen_andi_i32(tmp, fpscr, ~FPCR_NZCV_MASK);
148
+ control = load_cpu_field(v7m.control[M_REG_S]);
149
+ tcg_gen_andi_i32(sfpa, control, R_V7M_CONTROL_SFPA_MASK);
150
+ tcg_gen_shli_i32(sfpa, sfpa, 31 - R_V7M_CONTROL_SFPA_SHIFT);
151
+ tcg_gen_or_i32(tmp, tmp, sfpa);
152
+ tcg_temp_free_i32(control);
153
+ /* Store result before updating FPSCR, in case it faults */
154
+ storefn(s, opaque, tmp);
155
+ /* If SFPA is zero then set FPSCR from FPDSCR_NS */
156
+ fpdscr = load_cpu_field(v7m.fpdscr[M_REG_NS]);
157
+ zero = tcg_const_i32(0);
158
+ tcg_gen_movcond_i32(TCG_COND_EQ, fpscr, sfpa, zero, fpdscr, fpscr);
159
+ gen_helper_vfp_set_fpscr(cpu_env, fpscr);
160
+ tcg_temp_free_i32(zero);
161
+ tcg_temp_free_i32(sfpa);
162
+ tcg_temp_free_i32(fpdscr);
163
+ tcg_temp_free_i32(fpscr);
164
break;
165
}
166
default:
167
g_assert_not_reached();
168
}
120
+
169
+
121
+ write_raw_cp_reg(&cpu->env, ri, newval);
170
+ if (lab_end) {
122
+ }
171
+ gen_set_label(lab_end);
123
+ cpu->cpreg_values[i] = newval;
172
+ }
124
}
173
+ if (lookup_tb) {
125
return ok;
174
+ gen_lookup_tb(s);
175
+ }
176
return true;
126
}
177
}
127
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
178
128
index XXXXXXX..XXXXXXX 100644
129
--- a/target/arm/kvm.c
130
+++ b/target/arm/kvm.c
131
@@ -XXX,XX +XXX,XX @@ void kvm_arm_reset_vcpu(ARMCPU *cpu)
132
fprintf(stderr, "write_kvmstate_to_list failed\n");
133
abort();
134
}
135
+ /*
136
+ * Sync the reset values also into the CPUState. This is necessary
137
+ * because the next thing we do will be a kvm_arch_put_registers()
138
+ * which will update the list values from the CPUState before copying
139
+ * the list values back to KVM. It's OK to ignore failure returns here
140
+ * for the same reason we do so in kvm_arch_get_registers().
141
+ */
142
+ write_list_to_cpustate(cpu);
143
}
144
145
/*
146
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
147
index XXXXXXX..XXXXXXX 100644
148
--- a/target/arm/kvm32.c
149
+++ b/target/arm/kvm32.c
150
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
151
return ret;
152
}
153
154
- /* Note that we do not call write_cpustate_to_list()
155
- * here, so we are only writing the tuple list back to
156
- * KVM. This is safe because nothing can change the
157
- * CPUARMState cp15 fields (in particular gdb accesses cannot)
158
- * and so there are no changes to sync. In fact syncing would
159
- * be wrong at this point: for a constant register where TCG and
160
- * KVM disagree about its value, the preceding write_list_to_cpustate()
161
- * would not have had any effect on the CPUARMState value (since the
162
- * register is read-only), and a write_cpustate_to_list() here would
163
- * then try to write the TCG value back into KVM -- this would either
164
- * fail or incorrectly change the value the guest sees.
165
- *
166
- * If we ever want to allow the user to modify cp15 registers via
167
- * the gdb stub, we would need to be more clever here (for instance
168
- * tracking the set of registers kvm_arch_get_registers() successfully
169
- * managed to update the CPUARMState with, and only allowing those
170
- * to be written back up into the kernel).
171
- */
172
+ write_cpustate_to_list(cpu, true);
173
+
174
if (!write_list_to_kvmstate(cpu, level)) {
175
return EINVAL;
176
}
177
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
178
index XXXXXXX..XXXXXXX 100644
179
--- a/target/arm/kvm64.c
180
+++ b/target/arm/kvm64.c
181
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
182
return ret;
183
}
184
185
+ write_cpustate_to_list(cpu, true);
186
+
187
if (!write_list_to_kvmstate(cpu, level)) {
188
return EINVAL;
189
}
190
diff --git a/target/arm/machine.c b/target/arm/machine.c
191
index XXXXXXX..XXXXXXX 100644
192
--- a/target/arm/machine.c
193
+++ b/target/arm/machine.c
194
@@ -XXX,XX +XXX,XX @@ static int cpu_pre_save(void *opaque)
195
abort();
196
}
197
} else {
198
- if (!write_cpustate_to_list(cpu)) {
199
+ if (!write_cpustate_to_list(cpu, false)) {
200
/* This should never fail. */
201
abort();
202
}
203
--
179
--
204
2.20.1
180
2.20.1
205
181
206
182
diff view generated by jsdifflib
1
In the M-profile architecture, if the CPU implements the DSP extension
1
Now that we have implemented all the features needed by the v8.1M
2
then the XPSR has GE bits, in the same way as the A-profile CPSR. When
2
architecture, we can add the model of the Cortex-M55. This is the
3
we added DSP extension support we forgot to add support for reading
3
configuration without MVE support; we'll add MVE later.
4
and writing the GE bits, which are stored in env->GE. We did put in
5
the code to add XPSR_GE to the mask of bits to update in the v7m_msr
6
helper, but forgot it in v7m_mrs. We also must not allow the XPSR we
7
pull off the stack on exception return to set the nonexistent GE bits.
8
Correct these errors:
9
* read and write env->GE in xpsr_read() and xpsr_write()
10
* only set GE bits on exception return if DSP present
11
* read GE bits for MRS if DSP present
12
4
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-id: 20190430131439.25251-5-peter.maydell@linaro.org
7
Message-id: 20201210201433.26262-5-peter.maydell@linaro.org
16
---
8
---
17
target/arm/cpu.h | 4 ++++
9
target/arm/cpu_tcg.c | 42 ++++++++++++++++++++++++++++++++++++++++++
18
target/arm/helper.c | 12 ++++++++++--
10
1 file changed, 42 insertions(+)
19
2 files changed, 14 insertions(+), 2 deletions(-)
20
11
21
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
12
diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
22
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/cpu.h
14
--- a/target/arm/cpu_tcg.c
24
+++ b/target/arm/cpu.h
15
+++ b/target/arm/cpu_tcg.c
25
@@ -XXX,XX +XXX,XX @@ static inline uint32_t xpsr_read(CPUARMState *env)
16
@@ -XXX,XX +XXX,XX @@ static void cortex_m33_initfn(Object *obj)
26
| (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27)
17
cpu->ctr = 0x8000c000;
27
| (env->thumb << 24) | ((env->condexec_bits & 3) << 25)
28
| ((env->condexec_bits & 0xfc) << 8)
29
+ | (env->GE << 16)
30
| env->v7m.exception;
31
}
18
}
32
19
33
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
20
+static void cortex_m55_initfn(Object *obj)
34
if (mask & XPSR_Q) {
21
+{
35
env->QF = ((val & XPSR_Q) != 0);
22
+ ARMCPU *cpu = ARM_CPU(obj);
36
}
37
+ if (mask & XPSR_GE) {
38
+ env->GE = (val & XPSR_GE) >> 16;
39
+ }
40
if (mask & XPSR_T) {
41
env->thumb = ((val & XPSR_T) != 0);
42
}
43
diff --git a/target/arm/helper.c b/target/arm/helper.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/target/arm/helper.c
46
+++ b/target/arm/helper.c
47
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
48
{
49
CPUARMState *env = &cpu->env;
50
uint32_t excret;
51
- uint32_t xpsr;
52
+ uint32_t xpsr, xpsr_mask;
53
bool ufault = false;
54
bool sfault = false;
55
bool return_to_sp_process;
56
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
57
}
58
*frame_sp_p = frameptr;
59
}
60
+
23
+
61
+ xpsr_mask = ~(XPSR_SPREALIGN | XPSR_SFPA);
24
+ set_feature(&cpu->env, ARM_FEATURE_V8);
62
+ if (!arm_feature(env, ARM_FEATURE_THUMB_DSP)) {
25
+ set_feature(&cpu->env, ARM_FEATURE_V8_1M);
63
+ xpsr_mask &= ~XPSR_GE;
26
+ set_feature(&cpu->env, ARM_FEATURE_M);
64
+ }
27
+ set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
65
/* This xpsr_write() will invalidate frame_sp_p as it may switch stack */
28
+ set_feature(&cpu->env, ARM_FEATURE_M_SECURITY);
66
- xpsr_write(env, xpsr, ~(XPSR_SPREALIGN | XPSR_SFPA));
29
+ set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
67
+ xpsr_write(env, xpsr, xpsr_mask);
30
+ cpu->midr = 0x410fd221; /* r0p1 */
68
31
+ cpu->revidr = 0;
69
if (env->v7m.secure) {
32
+ cpu->pmsav7_dregion = 16;
70
bool sfpa = xpsr & XPSR_SFPA;
33
+ cpu->sau_sregion = 8;
71
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg)
34
+ /*
72
}
35
+ * These are the MVFR* values for the FPU, no MVE configuration;
73
if (!(reg & 4)) {
36
+ * we will update them later when we implement MVE
74
mask |= XPSR_NZCV | XPSR_Q; /* APSR */
37
+ */
75
+ if (arm_feature(env, ARM_FEATURE_THUMB_DSP)) {
38
+ cpu->isar.mvfr0 = 0x10110221;
76
+ mask |= XPSR_GE;
39
+ cpu->isar.mvfr1 = 0x12100011;
77
+ }
40
+ cpu->isar.mvfr2 = 0x00000040;
78
}
41
+ cpu->isar.id_pfr0 = 0x20000030;
79
/* EPSR reads as zero */
42
+ cpu->isar.id_pfr1 = 0x00000230;
80
return xpsr_read(env) & mask;
43
+ cpu->isar.id_dfr0 = 0x10200000;
44
+ cpu->id_afr0 = 0x00000000;
45
+ cpu->isar.id_mmfr0 = 0x00111040;
46
+ cpu->isar.id_mmfr1 = 0x00000000;
47
+ cpu->isar.id_mmfr2 = 0x01000000;
48
+ cpu->isar.id_mmfr3 = 0x00000011;
49
+ cpu->isar.id_isar0 = 0x01103110;
50
+ cpu->isar.id_isar1 = 0x02212000;
51
+ cpu->isar.id_isar2 = 0x20232232;
52
+ cpu->isar.id_isar3 = 0x01111131;
53
+ cpu->isar.id_isar4 = 0x01310132;
54
+ cpu->isar.id_isar5 = 0x00000000;
55
+ cpu->isar.id_isar6 = 0x00000000;
56
+ cpu->clidr = 0x00000000; /* caches not implemented */
57
+ cpu->ctr = 0x8303c003;
58
+}
59
+
60
static const ARMCPRegInfo cortexr5_cp_reginfo[] = {
61
/* Dummy the TCM region regs for the moment */
62
{ .name = "ATCM", .cp = 15, .opc1 = 0, .crn = 9, .crm = 1, .opc2 = 0,
63
@@ -XXX,XX +XXX,XX @@ static const ARMCPUInfo arm_tcg_cpus[] = {
64
.class_init = arm_v7m_class_init },
65
{ .name = "cortex-m33", .initfn = cortex_m33_initfn,
66
.class_init = arm_v7m_class_init },
67
+ { .name = "cortex-m55", .initfn = cortex_m55_initfn,
68
+ .class_init = arm_v7m_class_init },
69
{ .name = "cortex-r5", .initfn = cortex_r5_initfn },
70
{ .name = "cortex-r5f", .initfn = cortex_r5f_initfn },
71
{ .name = "ti925t", .initfn = ti925t_initfn },
81
--
72
--
82
2.20.1
73
2.20.1
83
74
84
75
diff view generated by jsdifflib
1
The M-profile architecture specifies that the DebugMonitor exception
1
Support for running KVM on 32-bit Arm hosts was removed in commit
2
should be initially disabled, not enabled. It should be controlled
2
82bf7ae84ce739e. You can still run a 32-bit guest on a 64-bit Arm
3
by the DEMCR register's MON_EN bit, but we don't implement that
3
host CPU, but because Arm KVM requires the host and guest CPU types
4
register yet (like most of the debug architecture for M-profile).
4
to match, it is not possible to run a guest that requires a Cortex-A9
5
5
or Cortex-A15 CPU there. That means that the code in the
6
Note that BKPT instructions will still work, because they
6
highbank/midway board models to support KVM is no longer used, and we
7
will be escalated to HardFault.
7
can delete it.
8
8
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20190430131439.25251-4-peter.maydell@linaro.org
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20201215144215.28482-1-peter.maydell@linaro.org
12
---
13
---
13
hw/intc/armv7m_nvic.c | 4 +++-
14
hw/arm/highbank.c | 14 ++++----------
14
1 file changed, 3 insertions(+), 1 deletion(-)
15
1 file changed, 4 insertions(+), 10 deletions(-)
15
16
16
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
17
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
17
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/intc/armv7m_nvic.c
19
--- a/hw/arm/highbank.c
19
+++ b/hw/intc/armv7m_nvic.c
20
+++ b/hw/arm/highbank.c
20
@@ -XXX,XX +XXX,XX @@ static void armv7m_nvic_reset(DeviceState *dev)
21
@@ -XXX,XX +XXX,XX @@
21
* the System Handler Control register
22
#include "hw/arm/boot.h"
22
*/
23
#include "hw/loader.h"
23
s->vectors[ARMV7M_EXCP_SVC].enabled = 1;
24
#include "net/net.h"
24
- s->vectors[ARMV7M_EXCP_DEBUG].enabled = 1;
25
-#include "sysemu/kvm.h"
25
s->vectors[ARMV7M_EXCP_PENDSV].enabled = 1;
26
#include "sysemu/runstate.h"
26
s->vectors[ARMV7M_EXCP_SYSTICK].enabled = 1;
27
#include "sysemu/sysemu.h"
27
28
#include "hw/boards.h"
28
+ /* DebugMonitor is enabled via DEMCR.MON_EN */
29
@@ -XXX,XX +XXX,XX @@
29
+ s->vectors[ARMV7M_EXCP_DEBUG].enabled = 0;
30
#include "hw/cpu/a15mpcore.h"
30
+
31
#include "qemu/log.h"
31
resetprio = arm_feature(&s->cpu->env, ARM_FEATURE_V8) ? -4 : -3;
32
#include "qom/object.h"
32
s->vectors[ARMV7M_EXCP_RESET].prio = resetprio;
33
+#include "cpu.h"
33
s->vectors[ARMV7M_EXCP_NMI].prio = -2;
34
35
#define SMP_BOOT_ADDR 0x100
36
#define SMP_BOOT_REG 0x40
37
@@ -XXX,XX +XXX,XX @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
38
highbank_binfo.loader_start = 0;
39
highbank_binfo.write_secondary_boot = hb_write_secondary;
40
highbank_binfo.secondary_cpu_reset_hook = hb_reset_secondary;
41
- if (!kvm_enabled()) {
42
- highbank_binfo.board_setup_addr = BOARD_SETUP_ADDR;
43
- highbank_binfo.write_board_setup = hb_write_board_setup;
44
- highbank_binfo.secure_board_setup = true;
45
- } else {
46
- warn_report("cannot load built-in Monitor support "
47
- "if KVM is enabled. Some guests (such as Linux) "
48
- "may not boot.");
49
- }
50
+ highbank_binfo.board_setup_addr = BOARD_SETUP_ADDR;
51
+ highbank_binfo.write_board_setup = hb_write_board_setup;
52
+ highbank_binfo.secure_board_setup = true;
53
54
arm_load_kernel(ARM_CPU(first_cpu), machine, &highbank_binfo);
55
}
34
--
56
--
35
2.20.1
57
2.20.1
36
58
37
59
diff view generated by jsdifflib
New patch
1
Currently timer_free() is a simple wrapper for g_free(). This means
2
that the timer being freed must not be currently active, as otherwise
3
QEMU might crash later when the active list is processed and still
4
has a pointer to freed memory on it. As a result almost all calls to
5
timer_free() are preceded by a timer_del() call, as can be seen in
6
the output of
7
git grep -B1 '\<timer_free\>'
1
8
9
This is unfortunate API design as it makes it easy to accidentally
10
misuse (by forgetting the timer_del()), and the correct use is
11
annoyingly verbose.
12
13
Make timer_free() imply a timer_del().
14
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Message-id: 20201215154107.3255-2-peter.maydell@linaro.org
19
---
20
include/qemu/timer.h | 24 +++++++++++++-----------
21
1 file changed, 13 insertions(+), 11 deletions(-)
22
23
diff --git a/include/qemu/timer.h b/include/qemu/timer.h
24
index XXXXXXX..XXXXXXX 100644
25
--- a/include/qemu/timer.h
26
+++ b/include/qemu/timer.h
27
@@ -XXX,XX +XXX,XX @@ static inline QEMUTimer *timer_new_ms(QEMUClockType type, QEMUTimerCB *cb,
28
*/
29
void timer_deinit(QEMUTimer *ts);
30
31
-/**
32
- * timer_free:
33
- * @ts: the timer
34
- *
35
- * Free a timer (it must not be on the active list)
36
- */
37
-static inline void timer_free(QEMUTimer *ts)
38
-{
39
- g_free(ts);
40
-}
41
-
42
/**
43
* timer_del:
44
* @ts: the timer
45
@@ -XXX,XX +XXX,XX @@ static inline void timer_free(QEMUTimer *ts)
46
*/
47
void timer_del(QEMUTimer *ts);
48
49
+/**
50
+ * timer_free:
51
+ * @ts: the timer
52
+ *
53
+ * Free a timer. This will call timer_del() for you to remove
54
+ * the timer from the active list if it was still active.
55
+ */
56
+static inline void timer_free(QEMUTimer *ts)
57
+{
58
+ timer_del(ts);
59
+ g_free(ts);
60
+}
61
+
62
/**
63
* timer_mod_ns:
64
* @ts: the timer
65
--
66
2.20.1
67
68
diff view generated by jsdifflib
New patch
1
Now that timer_free() implicitly calls timer_del(), sequences
2
timer_del(mytimer);
3
timer_free(mytimer);
1
4
5
can be simplified to just
6
timer_free(mytimer);
7
8
Add a Coccinelle script to do this transformation.
9
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20201215154107.3255-3-peter.maydell@linaro.org
15
---
16
scripts/coccinelle/timer-del-timer-free.cocci | 18 ++++++++++++++++++
17
1 file changed, 18 insertions(+)
18
create mode 100644 scripts/coccinelle/timer-del-timer-free.cocci
19
20
diff --git a/scripts/coccinelle/timer-del-timer-free.cocci b/scripts/coccinelle/timer-del-timer-free.cocci
21
new file mode 100644
22
index XXXXXXX..XXXXXXX
23
--- /dev/null
24
+++ b/scripts/coccinelle/timer-del-timer-free.cocci
25
@@ -XXX,XX +XXX,XX @@
26
+// Remove superfluous timer_del() calls
27
+//
28
+// Copyright Linaro Limited 2020
29
+// This work is licensed under the terms of the GNU GPLv2 or later.
30
+//
31
+// spatch --macro-file scripts/cocci-macro-file.h \
32
+// --sp-file scripts/coccinelle/timer-del-timer-free.cocci \
33
+// --in-place --dir .
34
+//
35
+// The timer_free() function now implicitly calls timer_del()
36
+// for you, so calls to timer_del() immediately before the
37
+// timer_free() of the same timer can be deleted.
38
+
39
+@@
40
+expression T;
41
+@@
42
+-timer_del(T);
43
+ timer_free(T);
44
--
45
2.20.1
46
47
diff view generated by jsdifflib
New patch
1
This commit is the result of running the timer-del-timer-free.cocci
2
script on the whole source tree.
1
3
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Acked-by: Corey Minyard <cminyard@mvista.com>
6
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20201215154107.3255-4-peter.maydell@linaro.org
10
---
11
block/iscsi.c | 2 --
12
block/nbd.c | 1 -
13
block/qcow2.c | 1 -
14
hw/block/nvme.c | 2 --
15
hw/char/serial.c | 2 --
16
hw/char/virtio-serial-bus.c | 2 --
17
hw/ide/core.c | 1 -
18
hw/input/hid.c | 1 -
19
hw/intc/apic.c | 1 -
20
hw/intc/ioapic.c | 1 -
21
hw/ipmi/ipmi_bmc_extern.c | 1 -
22
hw/net/e1000.c | 3 ---
23
hw/net/e1000e_core.c | 8 --------
24
hw/net/pcnet-pci.c | 1 -
25
hw/net/rtl8139.c | 1 -
26
hw/net/spapr_llan.c | 1 -
27
hw/net/virtio-net.c | 2 --
28
hw/s390x/s390-pci-inst.c | 1 -
29
hw/sd/sd.c | 1 -
30
hw/sd/sdhci.c | 2 --
31
hw/usb/dev-hub.c | 1 -
32
hw/usb/hcd-ehci.c | 1 -
33
hw/usb/hcd-ohci-pci.c | 1 -
34
hw/usb/hcd-uhci.c | 1 -
35
hw/usb/hcd-xhci.c | 1 -
36
hw/usb/redirect.c | 1 -
37
hw/vfio/display.c | 1 -
38
hw/virtio/vhost-vsock-common.c | 1 -
39
hw/virtio/virtio-balloon.c | 1 -
40
hw/virtio/virtio-rng.c | 1 -
41
hw/watchdog/wdt_diag288.c | 1 -
42
hw/watchdog/wdt_i6300esb.c | 1 -
43
migration/colo.c | 1 -
44
monitor/hmp-cmds.c | 1 -
45
net/announce.c | 1 -
46
net/colo-compare.c | 1 -
47
net/slirp.c | 1 -
48
replay/replay-debugging.c | 1 -
49
target/s390x/cpu.c | 2 --
50
ui/console.c | 1 -
51
ui/spice-core.c | 1 -
52
util/throttle.c | 1 -
53
42 files changed, 58 deletions(-)
54
55
diff --git a/block/iscsi.c b/block/iscsi.c
56
index XXXXXXX..XXXXXXX 100644
57
--- a/block/iscsi.c
58
+++ b/block/iscsi.c
59
@@ -XXX,XX +XXX,XX @@ static void iscsi_detach_aio_context(BlockDriverState *bs)
60
iscsilun->events = 0;
61
62
if (iscsilun->nop_timer) {
63
- timer_del(iscsilun->nop_timer);
64
timer_free(iscsilun->nop_timer);
65
iscsilun->nop_timer = NULL;
66
}
67
if (iscsilun->event_timer) {
68
- timer_del(iscsilun->event_timer);
69
timer_free(iscsilun->event_timer);
70
iscsilun->event_timer = NULL;
71
}
72
diff --git a/block/nbd.c b/block/nbd.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/block/nbd.c
75
+++ b/block/nbd.c
76
@@ -XXX,XX +XXX,XX @@ static void nbd_recv_coroutines_wake_all(BDRVNBDState *s)
77
static void reconnect_delay_timer_del(BDRVNBDState *s)
78
{
79
if (s->reconnect_delay_timer) {
80
- timer_del(s->reconnect_delay_timer);
81
timer_free(s->reconnect_delay_timer);
82
s->reconnect_delay_timer = NULL;
83
}
84
diff --git a/block/qcow2.c b/block/qcow2.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/block/qcow2.c
87
+++ b/block/qcow2.c
88
@@ -XXX,XX +XXX,XX @@ static void cache_clean_timer_del(BlockDriverState *bs)
89
{
90
BDRVQcow2State *s = bs->opaque;
91
if (s->cache_clean_timer) {
92
- timer_del(s->cache_clean_timer);
93
timer_free(s->cache_clean_timer);
94
s->cache_clean_timer = NULL;
95
}
96
diff --git a/hw/block/nvme.c b/hw/block/nvme.c
97
index XXXXXXX..XXXXXXX 100644
98
--- a/hw/block/nvme.c
99
+++ b/hw/block/nvme.c
100
@@ -XXX,XX +XXX,XX @@ static uint16_t nvme_io_cmd(NvmeCtrl *n, NvmeRequest *req)
101
static void nvme_free_sq(NvmeSQueue *sq, NvmeCtrl *n)
102
{
103
n->sq[sq->sqid] = NULL;
104
- timer_del(sq->timer);
105
timer_free(sq->timer);
106
g_free(sq->io_req);
107
if (sq->sqid) {
108
@@ -XXX,XX +XXX,XX @@ static uint16_t nvme_get_log(NvmeCtrl *n, NvmeRequest *req)
109
static void nvme_free_cq(NvmeCQueue *cq, NvmeCtrl *n)
110
{
111
n->cq[cq->cqid] = NULL;
112
- timer_del(cq->timer);
113
timer_free(cq->timer);
114
msix_vector_unuse(&n->parent_obj, cq->vector);
115
if (cq->cqid) {
116
diff --git a/hw/char/serial.c b/hw/char/serial.c
117
index XXXXXXX..XXXXXXX 100644
118
--- a/hw/char/serial.c
119
+++ b/hw/char/serial.c
120
@@ -XXX,XX +XXX,XX @@ static void serial_unrealize(DeviceState *dev)
121
122
qemu_chr_fe_deinit(&s->chr, false);
123
124
- timer_del(s->modem_status_poll);
125
timer_free(s->modem_status_poll);
126
127
- timer_del(s->fifo_timeout_timer);
128
timer_free(s->fifo_timeout_timer);
129
130
fifo8_destroy(&s->recv_fifo);
131
diff --git a/hw/char/virtio-serial-bus.c b/hw/char/virtio-serial-bus.c
132
index XXXXXXX..XXXXXXX 100644
133
--- a/hw/char/virtio-serial-bus.c
134
+++ b/hw/char/virtio-serial-bus.c
135
@@ -XXX,XX +XXX,XX @@ static void virtio_serial_post_load_timer_cb(void *opaque)
136
}
137
}
138
g_free(s->post_load->connected);
139
- timer_del(s->post_load->timer);
140
timer_free(s->post_load->timer);
141
g_free(s->post_load);
142
s->post_load = NULL;
143
@@ -XXX,XX +XXX,XX @@ static void virtio_serial_device_unrealize(DeviceState *dev)
144
g_free(vser->ports_map);
145
if (vser->post_load) {
146
g_free(vser->post_load->connected);
147
- timer_del(vser->post_load->timer);
148
timer_free(vser->post_load->timer);
149
g_free(vser->post_load);
150
}
151
diff --git a/hw/ide/core.c b/hw/ide/core.c
152
index XXXXXXX..XXXXXXX 100644
153
--- a/hw/ide/core.c
154
+++ b/hw/ide/core.c
155
@@ -XXX,XX +XXX,XX @@ void ide_init2(IDEBus *bus, qemu_irq irq)
156
157
void ide_exit(IDEState *s)
158
{
159
- timer_del(s->sector_write_timer);
160
timer_free(s->sector_write_timer);
161
qemu_vfree(s->smart_selftest_data);
162
qemu_vfree(s->io_buffer);
163
diff --git a/hw/input/hid.c b/hw/input/hid.c
164
index XXXXXXX..XXXXXXX 100644
165
--- a/hw/input/hid.c
166
+++ b/hw/input/hid.c
167
@@ -XXX,XX +XXX,XX @@ static void hid_idle_timer(void *opaque)
168
static void hid_del_idle_timer(HIDState *hs)
169
{
170
if (hs->idle_timer) {
171
- timer_del(hs->idle_timer);
172
timer_free(hs->idle_timer);
173
hs->idle_timer = NULL;
174
}
175
diff --git a/hw/intc/apic.c b/hw/intc/apic.c
176
index XXXXXXX..XXXXXXX 100644
177
--- a/hw/intc/apic.c
178
+++ b/hw/intc/apic.c
179
@@ -XXX,XX +XXX,XX @@ static void apic_unrealize(DeviceState *dev)
180
{
181
APICCommonState *s = APIC(dev);
182
183
- timer_del(s->timer);
184
timer_free(s->timer);
185
local_apics[s->id] = NULL;
186
}
187
diff --git a/hw/intc/ioapic.c b/hw/intc/ioapic.c
188
index XXXXXXX..XXXXXXX 100644
189
--- a/hw/intc/ioapic.c
190
+++ b/hw/intc/ioapic.c
191
@@ -XXX,XX +XXX,XX @@ static void ioapic_unrealize(DeviceState *dev)
192
{
193
IOAPICCommonState *s = IOAPIC_COMMON(dev);
194
195
- timer_del(s->delayed_ioapic_service_timer);
196
timer_free(s->delayed_ioapic_service_timer);
197
}
198
199
diff --git a/hw/ipmi/ipmi_bmc_extern.c b/hw/ipmi/ipmi_bmc_extern.c
200
index XXXXXXX..XXXXXXX 100644
201
--- a/hw/ipmi/ipmi_bmc_extern.c
202
+++ b/hw/ipmi/ipmi_bmc_extern.c
203
@@ -XXX,XX +XXX,XX @@ static void ipmi_bmc_extern_finalize(Object *obj)
204
{
205
IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(obj);
206
207
- timer_del(ibe->extern_timer);
208
timer_free(ibe->extern_timer);
209
}
210
211
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
212
index XXXXXXX..XXXXXXX 100644
213
--- a/hw/net/e1000.c
214
+++ b/hw/net/e1000.c
215
@@ -XXX,XX +XXX,XX @@ pci_e1000_uninit(PCIDevice *dev)
216
{
217
E1000State *d = E1000(dev);
218
219
- timer_del(d->autoneg_timer);
220
timer_free(d->autoneg_timer);
221
- timer_del(d->mit_timer);
222
timer_free(d->mit_timer);
223
- timer_del(d->flush_queue_timer);
224
timer_free(d->flush_queue_timer);
225
qemu_del_nic(d->nic);
226
}
227
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
228
index XXXXXXX..XXXXXXX 100644
229
--- a/hw/net/e1000e_core.c
230
+++ b/hw/net/e1000e_core.c
231
@@ -XXX,XX +XXX,XX @@ e1000e_intrmgr_pci_unint(E1000ECore *core)
232
{
233
int i;
234
235
- timer_del(core->radv.timer);
236
timer_free(core->radv.timer);
237
- timer_del(core->rdtr.timer);
238
timer_free(core->rdtr.timer);
239
- timer_del(core->raid.timer);
240
timer_free(core->raid.timer);
241
242
- timer_del(core->tadv.timer);
243
timer_free(core->tadv.timer);
244
- timer_del(core->tidv.timer);
245
timer_free(core->tidv.timer);
246
247
- timer_del(core->itr.timer);
248
timer_free(core->itr.timer);
249
250
for (i = 0; i < E1000E_MSIX_VEC_NUM; i++) {
251
- timer_del(core->eitr[i].timer);
252
timer_free(core->eitr[i].timer);
253
}
254
}
255
@@ -XXX,XX +XXX,XX @@ e1000e_core_pci_uninit(E1000ECore *core)
256
{
257
int i;
258
259
- timer_del(core->autoneg_timer);
260
timer_free(core->autoneg_timer);
261
262
e1000e_intrmgr_pci_unint(core);
263
diff --git a/hw/net/pcnet-pci.c b/hw/net/pcnet-pci.c
264
index XXXXXXX..XXXXXXX 100644
265
--- a/hw/net/pcnet-pci.c
266
+++ b/hw/net/pcnet-pci.c
267
@@ -XXX,XX +XXX,XX @@ static void pci_pcnet_uninit(PCIDevice *dev)
268
PCIPCNetState *d = PCI_PCNET(dev);
269
270
qemu_free_irq(d->state.irq);
271
- timer_del(d->state.poll_timer);
272
timer_free(d->state.poll_timer);
273
qemu_del_nic(d->state.nic);
274
}
275
diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
276
index XXXXXXX..XXXXXXX 100644
277
--- a/hw/net/rtl8139.c
278
+++ b/hw/net/rtl8139.c
279
@@ -XXX,XX +XXX,XX @@ static void pci_rtl8139_uninit(PCIDevice *dev)
280
281
g_free(s->cplus_txbuffer);
282
s->cplus_txbuffer = NULL;
283
- timer_del(s->timer);
284
timer_free(s->timer);
285
qemu_del_nic(s->nic);
286
}
287
diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c
288
index XXXXXXX..XXXXXXX 100644
289
--- a/hw/net/spapr_llan.c
290
+++ b/hw/net/spapr_llan.c
291
@@ -XXX,XX +XXX,XX @@ static void spapr_vlan_instance_finalize(Object *obj)
292
}
293
294
if (dev->rxp_timer) {
295
- timer_del(dev->rxp_timer);
296
timer_free(dev->rxp_timer);
297
}
298
}
299
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
300
index XXXXXXX..XXXXXXX 100644
301
--- a/hw/net/virtio-net.c
302
+++ b/hw/net/virtio-net.c
303
@@ -XXX,XX +XXX,XX @@ static void virtio_net_rsc_cleanup(VirtIONet *n)
304
g_free(seg);
305
}
306
307
- timer_del(chain->drain_timer);
308
timer_free(chain->drain_timer);
309
QTAILQ_REMOVE(&n->rsc_chains, chain, next);
310
g_free(chain);
311
@@ -XXX,XX +XXX,XX @@ static void virtio_net_del_queue(VirtIONet *n, int index)
312
313
virtio_del_queue(vdev, index * 2);
314
if (q->tx_timer) {
315
- timer_del(q->tx_timer);
316
timer_free(q->tx_timer);
317
q->tx_timer = NULL;
318
} else {
319
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
320
index XXXXXXX..XXXXXXX 100644
321
--- a/hw/s390x/s390-pci-inst.c
322
+++ b/hw/s390x/s390-pci-inst.c
323
@@ -XXX,XX +XXX,XX @@ void pci_dereg_ioat(S390PCIIOMMU *iommu)
324
void fmb_timer_free(S390PCIBusDevice *pbdev)
325
{
326
if (pbdev->fmb_timer) {
327
- timer_del(pbdev->fmb_timer);
328
timer_free(pbdev->fmb_timer);
329
pbdev->fmb_timer = NULL;
330
}
331
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
332
index XXXXXXX..XXXXXXX 100644
333
--- a/hw/sd/sd.c
334
+++ b/hw/sd/sd.c
335
@@ -XXX,XX +XXX,XX @@ static void sd_instance_finalize(Object *obj)
336
{
337
SDState *sd = SD_CARD(obj);
338
339
- timer_del(sd->ocr_power_timer);
340
timer_free(sd->ocr_power_timer);
341
}
342
343
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
344
index XXXXXXX..XXXXXXX 100644
345
--- a/hw/sd/sdhci.c
346
+++ b/hw/sd/sdhci.c
347
@@ -XXX,XX +XXX,XX @@ void sdhci_initfn(SDHCIState *s)
348
349
void sdhci_uninitfn(SDHCIState *s)
350
{
351
- timer_del(s->insert_timer);
352
timer_free(s->insert_timer);
353
- timer_del(s->transfer_timer);
354
timer_free(s->transfer_timer);
355
356
g_free(s->fifo_buffer);
357
diff --git a/hw/usb/dev-hub.c b/hw/usb/dev-hub.c
358
index XXXXXXX..XXXXXXX 100644
359
--- a/hw/usb/dev-hub.c
360
+++ b/hw/usb/dev-hub.c
361
@@ -XXX,XX +XXX,XX @@ static void usb_hub_unrealize(USBDevice *dev)
362
&s->ports[i].port);
363
}
364
365
- timer_del(s->port_timer);
366
timer_free(s->port_timer);
367
}
368
369
diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
370
index XXXXXXX..XXXXXXX 100644
371
--- a/hw/usb/hcd-ehci.c
372
+++ b/hw/usb/hcd-ehci.c
373
@@ -XXX,XX +XXX,XX @@ void usb_ehci_unrealize(EHCIState *s, DeviceState *dev)
374
trace_usb_ehci_unrealize();
375
376
if (s->frame_timer) {
377
- timer_del(s->frame_timer);
378
timer_free(s->frame_timer);
379
s->frame_timer = NULL;
380
}
381
diff --git a/hw/usb/hcd-ohci-pci.c b/hw/usb/hcd-ohci-pci.c
382
index XXXXXXX..XXXXXXX 100644
383
--- a/hw/usb/hcd-ohci-pci.c
384
+++ b/hw/usb/hcd-ohci-pci.c
385
@@ -XXX,XX +XXX,XX @@ static void usb_ohci_exit(PCIDevice *dev)
386
usb_bus_release(&s->bus);
387
}
388
389
- timer_del(s->eof_timer);
390
timer_free(s->eof_timer);
391
}
392
393
diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
394
index XXXXXXX..XXXXXXX 100644
395
--- a/hw/usb/hcd-uhci.c
396
+++ b/hw/usb/hcd-uhci.c
397
@@ -XXX,XX +XXX,XX @@ static void usb_uhci_exit(PCIDevice *dev)
398
trace_usb_uhci_exit();
399
400
if (s->frame_timer) {
401
- timer_del(s->frame_timer);
402
timer_free(s->frame_timer);
403
s->frame_timer = NULL;
404
}
405
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
406
index XXXXXXX..XXXXXXX 100644
407
--- a/hw/usb/hcd-xhci.c
408
+++ b/hw/usb/hcd-xhci.c
409
@@ -XXX,XX +XXX,XX @@ static void usb_xhci_unrealize(DeviceState *dev)
410
}
411
412
if (xhci->mfwrap_timer) {
413
- timer_del(xhci->mfwrap_timer);
414
timer_free(xhci->mfwrap_timer);
415
xhci->mfwrap_timer = NULL;
416
}
417
diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c
418
index XXXXXXX..XXXXXXX 100644
419
--- a/hw/usb/redirect.c
420
+++ b/hw/usb/redirect.c
421
@@ -XXX,XX +XXX,XX @@ static void usbredir_unrealize(USBDevice *udev)
422
qemu_bh_delete(dev->chardev_close_bh);
423
qemu_bh_delete(dev->device_reject_bh);
424
425
- timer_del(dev->attach_timer);
426
timer_free(dev->attach_timer);
427
428
usbredir_cleanup_device_queues(dev);
429
diff --git a/hw/vfio/display.c b/hw/vfio/display.c
430
index XXXXXXX..XXXXXXX 100644
431
--- a/hw/vfio/display.c
432
+++ b/hw/vfio/display.c
433
@@ -XXX,XX +XXX,XX @@ static void vfio_display_edid_exit(VFIODisplay *dpy)
434
435
g_free(dpy->edid_regs);
436
g_free(dpy->edid_blob);
437
- timer_del(dpy->edid_link_timer);
438
timer_free(dpy->edid_link_timer);
439
}
440
441
diff --git a/hw/virtio/vhost-vsock-common.c b/hw/virtio/vhost-vsock-common.c
442
index XXXXXXX..XXXXXXX 100644
443
--- a/hw/virtio/vhost-vsock-common.c
444
+++ b/hw/virtio/vhost-vsock-common.c
445
@@ -XXX,XX +XXX,XX @@ static void vhost_vsock_common_post_load_timer_cleanup(VHostVSockCommon *vvc)
446
return;
447
}
448
449
- timer_del(vvc->post_load_timer);
450
timer_free(vvc->post_load_timer);
451
vvc->post_load_timer = NULL;
452
}
453
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
454
index XXXXXXX..XXXXXXX 100644
455
--- a/hw/virtio/virtio-balloon.c
456
+++ b/hw/virtio/virtio-balloon.c
457
@@ -XXX,XX +XXX,XX @@ static bool balloon_stats_enabled(const VirtIOBalloon *s)
458
static void balloon_stats_destroy_timer(VirtIOBalloon *s)
459
{
460
if (balloon_stats_enabled(s)) {
461
- timer_del(s->stats_timer);
462
timer_free(s->stats_timer);
463
s->stats_timer = NULL;
464
s->stats_poll_interval = 0;
465
diff --git a/hw/virtio/virtio-rng.c b/hw/virtio/virtio-rng.c
466
index XXXXXXX..XXXXXXX 100644
467
--- a/hw/virtio/virtio-rng.c
468
+++ b/hw/virtio/virtio-rng.c
469
@@ -XXX,XX +XXX,XX @@ static void virtio_rng_device_unrealize(DeviceState *dev)
470
VirtIORNG *vrng = VIRTIO_RNG(dev);
471
472
qemu_del_vm_change_state_handler(vrng->vmstate);
473
- timer_del(vrng->rate_limit_timer);
474
timer_free(vrng->rate_limit_timer);
475
virtio_del_queue(vdev, 0);
476
virtio_cleanup(vdev);
477
diff --git a/hw/watchdog/wdt_diag288.c b/hw/watchdog/wdt_diag288.c
478
index XXXXXXX..XXXXXXX 100644
479
--- a/hw/watchdog/wdt_diag288.c
480
+++ b/hw/watchdog/wdt_diag288.c
481
@@ -XXX,XX +XXX,XX @@ static void wdt_diag288_unrealize(DeviceState *dev)
482
{
483
DIAG288State *diag288 = DIAG288(dev);
484
485
- timer_del(diag288->timer);
486
timer_free(diag288->timer);
487
}
488
489
diff --git a/hw/watchdog/wdt_i6300esb.c b/hw/watchdog/wdt_i6300esb.c
490
index XXXXXXX..XXXXXXX 100644
491
--- a/hw/watchdog/wdt_i6300esb.c
492
+++ b/hw/watchdog/wdt_i6300esb.c
493
@@ -XXX,XX +XXX,XX @@ static void i6300esb_exit(PCIDevice *dev)
494
{
495
I6300State *d = WATCHDOG_I6300ESB_DEVICE(dev);
496
497
- timer_del(d->timer);
498
timer_free(d->timer);
499
}
500
501
diff --git a/migration/colo.c b/migration/colo.c
502
index XXXXXXX..XXXXXXX 100644
503
--- a/migration/colo.c
504
+++ b/migration/colo.c
505
@@ -XXX,XX +XXX,XX @@ out:
506
* error.
507
*/
508
colo_compare_unregister_notifier(&packets_compare_notifier);
509
- timer_del(s->colo_delay_timer);
510
timer_free(s->colo_delay_timer);
511
qemu_event_destroy(&s->colo_checkpoint_event);
512
513
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
514
index XXXXXXX..XXXXXXX 100644
515
--- a/monitor/hmp-cmds.c
516
+++ b/monitor/hmp-cmds.c
517
@@ -XXX,XX +XXX,XX @@ static void hmp_migrate_status_cb(void *opaque)
518
error_report("%s", info->error_desc);
519
}
520
monitor_resume(status->mon);
521
- timer_del(status->timer);
522
timer_free(status->timer);
523
g_free(status);
524
}
525
diff --git a/net/announce.c b/net/announce.c
526
index XXXXXXX..XXXXXXX 100644
527
--- a/net/announce.c
528
+++ b/net/announce.c
529
@@ -XXX,XX +XXX,XX @@ void qemu_announce_timer_del(AnnounceTimer *timer, bool free_named)
530
{
531
bool free_timer = false;
532
if (timer->tm) {
533
- timer_del(timer->tm);
534
timer_free(timer->tm);
535
timer->tm = NULL;
536
}
537
diff --git a/net/colo-compare.c b/net/colo-compare.c
538
index XXXXXXX..XXXXXXX 100644
539
--- a/net/colo-compare.c
540
+++ b/net/colo-compare.c
541
@@ -XXX,XX +XXX,XX @@ static void colo_compare_timer_init(CompareState *s)
542
static void colo_compare_timer_del(CompareState *s)
543
{
544
if (s->packet_check_timer) {
545
- timer_del(s->packet_check_timer);
546
timer_free(s->packet_check_timer);
547
s->packet_check_timer = NULL;
548
}
549
diff --git a/net/slirp.c b/net/slirp.c
550
index XXXXXXX..XXXXXXX 100644
551
--- a/net/slirp.c
552
+++ b/net/slirp.c
553
@@ -XXX,XX +XXX,XX @@ static void *net_slirp_timer_new(SlirpTimerCb cb,
554
555
static void net_slirp_timer_free(void *timer, void *opaque)
556
{
557
- timer_del(timer);
558
timer_free(timer);
559
}
560
561
diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c
562
index XXXXXXX..XXXXXXX 100644
563
--- a/replay/replay-debugging.c
564
+++ b/replay/replay-debugging.c
565
@@ -XXX,XX +XXX,XX @@ static void replay_delete_break(void)
566
assert(replay_mutex_locked());
567
568
if (replay_break_timer) {
569
- timer_del(replay_break_timer);
570
timer_free(replay_break_timer);
571
replay_break_timer = NULL;
572
}
573
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
574
index XXXXXXX..XXXXXXX 100644
575
--- a/target/s390x/cpu.c
576
+++ b/target/s390x/cpu.c
577
@@ -XXX,XX +XXX,XX @@ static void s390_cpu_finalize(Object *obj)
578
#if !defined(CONFIG_USER_ONLY)
579
S390CPU *cpu = S390_CPU(obj);
580
581
- timer_del(cpu->env.tod_timer);
582
timer_free(cpu->env.tod_timer);
583
- timer_del(cpu->env.cpu_timer);
584
timer_free(cpu->env.cpu_timer);
585
586
qemu_unregister_reset(s390_cpu_machine_reset_cb, cpu);
587
diff --git a/ui/console.c b/ui/console.c
588
index XXXXXXX..XXXXXXX 100644
589
--- a/ui/console.c
590
+++ b/ui/console.c
591
@@ -XXX,XX +XXX,XX @@ static void gui_setup_refresh(DisplayState *ds)
592
timer_mod(ds->gui_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME));
593
}
594
if (!need_timer && ds->gui_timer != NULL) {
595
- timer_del(ds->gui_timer);
596
timer_free(ds->gui_timer);
597
ds->gui_timer = NULL;
598
}
599
diff --git a/ui/spice-core.c b/ui/spice-core.c
600
index XXXXXXX..XXXXXXX 100644
601
--- a/ui/spice-core.c
602
+++ b/ui/spice-core.c
603
@@ -XXX,XX +XXX,XX @@ static void timer_cancel(SpiceTimer *timer)
604
605
static void timer_remove(SpiceTimer *timer)
606
{
607
- timer_del(timer->timer);
608
timer_free(timer->timer);
609
g_free(timer);
610
}
611
diff --git a/util/throttle.c b/util/throttle.c
612
index XXXXXXX..XXXXXXX 100644
613
--- a/util/throttle.c
614
+++ b/util/throttle.c
615
@@ -XXX,XX +XXX,XX @@ static void throttle_timer_destroy(QEMUTimer **timer)
616
{
617
assert(*timer != NULL);
618
619
- timer_del(*timer);
620
timer_free(*timer);
621
*timer = NULL;
622
}
623
--
624
2.20.1
625
626
diff view generated by jsdifflib
New patch
1
The Arm CPU finalize function uses a sequence of timer_del(), timer_deinit(),
2
timer_free() to free the timer. The timer_deinit() step in this was always
3
unnecessary, and now the timer_del() is implied by timer_free(), so we can
4
collapse this down to simply calling timer_free().
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: 20201215154107.3255-5-peter.maydell@linaro.org
10
---
11
target/arm/cpu.c | 2 --
12
1 file changed, 2 deletions(-)
13
14
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.c
17
+++ b/target/arm/cpu.c
18
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_finalizefn(Object *obj)
19
}
20
#ifndef CONFIG_USER_ONLY
21
if (cpu->pmu_timer) {
22
- timer_del(cpu->pmu_timer);
23
- timer_deinit(cpu->pmu_timer);
24
timer_free(cpu->pmu_timer);
25
}
26
#endif
27
--
28
2.20.1
29
30
diff view generated by jsdifflib
New patch
1
From: Gan Qixin <ganqixin@huawei.com>
1
2
3
When running device-introspect-test, a memory leak occurred in the
4
digic_timer_init function, so use ptimer_free() in the finalize function to
5
avoid it.
6
7
ASAN shows memory leak stack:
8
9
Indirect leak of 288 byte(s) in 3 object(s) allocated from:
10
#0 0xffffab97e1f0 in __interceptor_calloc (/lib64/libasan.so.5+0xee1f0)
11
#1 0xffffab256800 in g_malloc0 (/lib64/libglib-2.0.so.0+0x56800)
12
#2 0xaaabf555db78 in ptimer_init /qemu/hw/core/ptimer.c:432
13
#3 0xaaabf5b04084 in digic_timer_init /qemu/hw/timer/digic-timer.c:142
14
#4 0xaaabf6339f6c in object_initialize_with_type /qemu/qom/object.c:515
15
#5 0xaaabf633ca04 in object_initialize_child_with_propsv /qemu/qom/object.c:564
16
#6 0xaaabf633cc08 in object_initialize_child_with_props /qemu/qom/object.c:547
17
#7 0xaaabf5b40e84 in digic_init /qemu/hw/arm/digic.c:46
18
#8 0xaaabf6339f6c in object_initialize_with_type /qemu/qom/object.c:515
19
#9 0xaaabf633a1e0 in object_new_with_type /qemu/qom/object.c:729
20
#10 0xaaabf6375e40 in qmp_device_list_properties /qemu/qom/qom-qmp-cmds.c:153
21
#11 0xaaabf653d8ec in qmp_marshal_device_list_properties /qemu/qapi/qapi-commands-qdev.c:59
22
#12 0xaaabf6587d08 in do_qmp_dispatch_bh /qemu/qapi/qmp-dispatch.c:110
23
24
Reported-by: Euler Robot <euler.robot@huawei.com>
25
Signed-off-by: Gan Qixin <ganqixin@huawei.com>
26
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
---
29
hw/timer/digic-timer.c | 8 ++++++++
30
1 file changed, 8 insertions(+)
31
32
diff --git a/hw/timer/digic-timer.c b/hw/timer/digic-timer.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/timer/digic-timer.c
35
+++ b/hw/timer/digic-timer.c
36
@@ -XXX,XX +XXX,XX @@ static void digic_timer_init(Object *obj)
37
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);
38
}
39
40
+static void digic_timer_finalize(Object *obj)
41
+{
42
+ DigicTimerState *s = DIGIC_TIMER(obj);
43
+
44
+ ptimer_free(s->ptimer);
45
+}
46
+
47
static void digic_timer_class_init(ObjectClass *klass, void *class_data)
48
{
49
DeviceClass *dc = DEVICE_CLASS(klass);
50
@@ -XXX,XX +XXX,XX @@ static const TypeInfo digic_timer_info = {
51
.parent = TYPE_SYS_BUS_DEVICE,
52
.instance_size = sizeof(DigicTimerState),
53
.instance_init = digic_timer_init,
54
+ .instance_finalize = digic_timer_finalize,
55
.class_init = digic_timer_class_init,
56
};
57
58
--
59
2.20.1
60
61
diff view generated by jsdifflib
New patch
1
From: Gan Qixin <ganqixin@huawei.com>
1
2
3
When running device-introspect-test, a memory leak occurred in the a10_pit_init
4
function, so use ptimer_free() in the finalize function to avoid it.
5
6
ASAN shows memory leak stack:
7
8
Indirect leak of 288 byte(s) in 6 object(s) allocated from:
9
#0 0xffffab97e1f0 in __interceptor_calloc (/lib64/libasan.so.5+0xee1f0)
10
#1 0xffffab256800 in g_malloc0 (/lib64/libglib-2.0.so.0+0x56800)
11
#2 0xaaabf555db84 in timer_new_full /qemu/include/qemu/timer.h:523
12
#3 0xaaabf555db84 in timer_new /qemu/include/qemu/timer.h:544
13
#4 0xaaabf555db84 in timer_new_ns /qemu/include/qemu/timer.h:562
14
#5 0xaaabf555db84 in ptimer_init /qemu/hw/core/ptimer.c:433
15
#6 0xaaabf57415e8 in a10_pit_init /qemu/hw/timer/allwinner-a10-pit.c:278
16
#7 0xaaabf6339f6c in object_initialize_with_type /qemu/qom/object.c:515
17
#8 0xaaabf633ca04 in object_initialize_child_with_propsv /qemu/qom/object.c:564
18
#9 0xaaabf633cc08 in object_initialize_child_with_props /qemu/qom/object.c:547
19
#10 0xaaabf5b94680 in aw_a10_init /qemu/hw/arm/allwinner-a10.c:49
20
#11 0xaaabf6339f6c in object_initialize_with_type /qemu/qom/object.c:515
21
#12 0xaaabf633a1e0 in object_new_with_type /qemu/qom/object.c:729
22
23
Reported-by: Euler Robot <euler.robot@huawei.com>
24
Signed-off-by: Gan Qixin <ganqixin@huawei.com>
25
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
---
28
hw/timer/allwinner-a10-pit.c | 11 +++++++++++
29
1 file changed, 11 insertions(+)
30
31
diff --git a/hw/timer/allwinner-a10-pit.c b/hw/timer/allwinner-a10-pit.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/timer/allwinner-a10-pit.c
34
+++ b/hw/timer/allwinner-a10-pit.c
35
@@ -XXX,XX +XXX,XX @@ static void a10_pit_init(Object *obj)
36
}
37
}
38
39
+static void a10_pit_finalize(Object *obj)
40
+{
41
+ AwA10PITState *s = AW_A10_PIT(obj);
42
+ int i;
43
+
44
+ for (i = 0; i < AW_A10_PIT_TIMER_NR; i++) {
45
+ ptimer_free(s->timer[i]);
46
+ }
47
+}
48
+
49
static void a10_pit_class_init(ObjectClass *klass, void *data)
50
{
51
DeviceClass *dc = DEVICE_CLASS(klass);
52
@@ -XXX,XX +XXX,XX @@ static const TypeInfo a10_pit_info = {
53
.parent = TYPE_SYS_BUS_DEVICE,
54
.instance_size = sizeof(AwA10PITState),
55
.instance_init = a10_pit_init,
56
+ .instance_finalize = a10_pit_finalize,
57
.class_init = a10_pit_class_init,
58
};
59
60
--
61
2.20.1
62
63
diff view generated by jsdifflib
1
From: Joel Stanley <joel@jms.id.au>
1
From: Gan Qixin <ganqixin@huawei.com>
2
2
3
We currently use Qemu's default of 128MB. As we know how much ram each
3
When running device-introspect-test, a memory leak occurred in the
4
machine ships with, make it easier on users by setting a default.
4
exynos4210_rtc_init function, so use ptimer_free() in the finalize function to
5
avoid it.
5
6
6
It can still be overridden with -m on the command line.
7
ASAN shows memory leak stack:
7
8
8
Signed-off-by: Joel Stanley <joel@jms.id.au>
9
Indirect leak of 96 byte(s) in 1 object(s) allocated from:
9
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
10
#0 0xffffab97e1f0 in __interceptor_calloc (/lib64/libasan.so.5+0xee1f0)
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
#1 0xffffab256800 in g_malloc0 (/lib64/libglib-2.0.so.0+0x56800)
11
Message-id: 20190503022958.1394-1-joel@jms.id.au
12
#2 0xaaabf555db78 in ptimer_init /qemu/hw/core/ptimer.c:432
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
#3 0xaaabf57b3934 in exynos4210_rtc_init /qemu/hw/rtc/exynos4210_rtc.c:567
14
#4 0xaaabf6339f6c in object_initialize_with_type /qemu/qom/object.c:515
15
#5 0xaaabf633a1e0 in object_new_with_type /qemu/qom/object.c:729
16
#6 0xaaabf6375e40 in qmp_device_list_properties /qemu/qom/qom-qmp-cmds.c:153
17
#7 0xaaabf653d8ec in qmp_marshal_device_list_properties /qemu/qapi/qapi-commands-qdev.c:59
18
#8 0xaaabf6587d08 in do_qmp_dispatch_bh /qemu/qapi/qmp-dispatch.c:110
19
#9 0xaaabf6552708 in aio_bh_call /qemu/util/async.c:136
20
#10 0xaaabf6552708 in aio_bh_poll /qemu/util/async.c:164
21
#11 0xaaabf655f19c in aio_dispatch /qemu/util/aio-posix.c:381
22
#12 0xaaabf65523f4 in aio_ctx_dispatch /qemu/util/async.c:306
23
24
Reported-by: Euler Robot <euler.robot@huawei.com>
25
Signed-off-by: Gan Qixin <ganqixin@huawei.com>
26
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
28
---
15
include/hw/arm/aspeed.h | 1 +
29
hw/rtc/exynos4210_rtc.c | 9 +++++++++
16
hw/arm/aspeed.c | 8 ++++++++
30
1 file changed, 9 insertions(+)
17
2 files changed, 9 insertions(+)
18
31
19
diff --git a/include/hw/arm/aspeed.h b/include/hw/arm/aspeed.h
32
diff --git a/hw/rtc/exynos4210_rtc.c b/hw/rtc/exynos4210_rtc.c
20
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/arm/aspeed.h
34
--- a/hw/rtc/exynos4210_rtc.c
22
+++ b/include/hw/arm/aspeed.h
35
+++ b/hw/rtc/exynos4210_rtc.c
23
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedBoardConfig {
36
@@ -XXX,XX +XXX,XX @@ static void exynos4210_rtc_init(Object *obj)
24
const char *spi_model;
37
sysbus_init_mmio(dev, &s->iomem);
25
uint32_t num_cs;
26
void (*i2c_init)(AspeedBoardState *bmc);
27
+ uint32_t ram;
28
} AspeedBoardConfig;
29
30
#define TYPE_ASPEED_MACHINE MACHINE_TYPE_NAME("aspeed")
31
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/arm/aspeed.c
34
+++ b/hw/arm/aspeed.c
35
@@ -XXX,XX +XXX,XX @@
36
#include "sysemu/block-backend.h"
37
#include "hw/loader.h"
38
#include "qemu/error-report.h"
39
+#include "qemu/units.h"
40
41
static struct arm_boot_info aspeed_board_binfo = {
42
.board_id = -1, /* device-tree-only board */
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_class_init(ObjectClass *oc, void *data)
44
mc->no_floppy = 1;
45
mc->no_cdrom = 1;
46
mc->no_parallel = 1;
47
+ if (board->ram) {
48
+ mc->default_ram_size = board->ram;
49
+ }
50
amc->board = board;
51
}
38
}
52
39
53
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
40
+static void exynos4210_rtc_finalize(Object *obj)
54
.spi_model = "mx25l25635e",
41
+{
55
.num_cs = 1,
42
+ Exynos4210RTCState *s = EXYNOS4210_RTC(obj);
56
.i2c_init = palmetto_bmc_i2c_init,
43
+
57
+ .ram = 256 * MiB,
44
+ ptimer_free(s->ptimer);
58
}, {
45
+ ptimer_free(s->ptimer_1Hz);
59
.name = MACHINE_TYPE_NAME("ast2500-evb"),
46
+}
60
.desc = "Aspeed AST2500 EVB (ARM1176)",
47
+
61
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
48
static void exynos4210_rtc_class_init(ObjectClass *klass, void *data)
62
.spi_model = "mx25l25635e",
49
{
63
.num_cs = 1,
50
DeviceClass *dc = DEVICE_CLASS(klass);
64
.i2c_init = ast2500_evb_i2c_init,
51
@@ -XXX,XX +XXX,XX @@ static const TypeInfo exynos4210_rtc_info = {
65
+ .ram = 512 * MiB,
52
.parent = TYPE_SYS_BUS_DEVICE,
66
}, {
53
.instance_size = sizeof(Exynos4210RTCState),
67
.name = MACHINE_TYPE_NAME("romulus-bmc"),
54
.instance_init = exynos4210_rtc_init,
68
.desc = "OpenPOWER Romulus BMC (ARM1176)",
55
+ .instance_finalize = exynos4210_rtc_finalize,
69
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
56
.class_init = exynos4210_rtc_class_init,
70
.spi_model = "mx66l1g45g",
71
.num_cs = 2,
72
.i2c_init = romulus_bmc_i2c_init,
73
+ .ram = 512 * MiB,
74
}, {
75
.name = MACHINE_TYPE_NAME("witherspoon-bmc"),
76
.desc = "OpenPOWER Witherspoon BMC (ARM1176)",
77
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
78
.spi_model = "mx66l1g45g",
79
.num_cs = 2,
80
.i2c_init = witherspoon_bmc_i2c_init,
81
+ .ram = 512 * MiB,
82
},
83
};
57
};
84
58
85
--
59
--
86
2.20.1
60
2.20.1
87
61
88
62
diff view generated by jsdifflib
New patch
1
From: Gan Qixin <ganqixin@huawei.com>
1
2
3
When running device-introspect-test, a memory leak occurred in the
4
exynos4210_pwm_init function, so use ptimer_free() in the finalize function to
5
avoid it.
6
7
ASAN shows memory leak stack:
8
9
Indirect leak of 240 byte(s) in 5 object(s) allocated from:
10
#0 0xffffab97e1f0 in __interceptor_calloc (/lib64/libasan.so.5+0xee1f0)
11
#1 0xffffab256800 in g_malloc0 (/lib64/libglib-2.0.so.0+0x56800)
12
#2 0xaaabf555db84 in timer_new_full /qemu/include/qemu/timer.h:523
13
#3 0xaaabf555db84 in timer_new /qemu/include/qemu/timer.h:544
14
#4 0xaaabf555db84 in timer_new_ns /qemu/include/qemu/timer.h:562
15
#5 0xaaabf555db84 in ptimer_init /qemu/hw/core/ptimer.c:433
16
#6 0xaaabf56a36cc in exynos4210_pwm_init /qemu/hw/timer/exynos4210_pwm.c:401
17
#7 0xaaabf6339f6c in object_initialize_with_type /qemu/qom/object.c:515
18
#8 0xaaabf633a1e0 in object_new_with_type /qemu/qom/object.c:729
19
#9 0xaaabf6375e40 in qmp_device_list_properties /qemu/qom/qom-qmp-cmds.c:153
20
#10 0xaaabf653d8ec in qmp_marshal_device_list_properties /qemu/qapi/qapi-commands-qdev.c:59
21
#11 0xaaabf6587d08 in do_qmp_dispatch_bh /qemu/qapi/qmp-dispatch.c:110
22
#12 0xaaabf6552708 in aio_bh_call /qemu/util/async.c:136
23
24
Reported-by: Euler Robot <euler.robot@huawei.com>
25
Signed-off-by: Gan Qixin <ganqixin@huawei.com>
26
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
---
29
hw/timer/exynos4210_pwm.c | 11 +++++++++++
30
1 file changed, 11 insertions(+)
31
32
diff --git a/hw/timer/exynos4210_pwm.c b/hw/timer/exynos4210_pwm.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/timer/exynos4210_pwm.c
35
+++ b/hw/timer/exynos4210_pwm.c
36
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_init(Object *obj)
37
sysbus_init_mmio(dev, &s->iomem);
38
}
39
40
+static void exynos4210_pwm_finalize(Object *obj)
41
+{
42
+ Exynos4210PWMState *s = EXYNOS4210_PWM(obj);
43
+ int i;
44
+
45
+ for (i = 0; i < EXYNOS4210_PWM_TIMERS_NUM; i++) {
46
+ ptimer_free(s->timer[i].ptimer);
47
+ }
48
+}
49
+
50
static void exynos4210_pwm_class_init(ObjectClass *klass, void *data)
51
{
52
DeviceClass *dc = DEVICE_CLASS(klass);
53
@@ -XXX,XX +XXX,XX @@ static const TypeInfo exynos4210_pwm_info = {
54
.parent = TYPE_SYS_BUS_DEVICE,
55
.instance_size = sizeof(Exynos4210PWMState),
56
.instance_init = exynos4210_pwm_init,
57
+ .instance_finalize = exynos4210_pwm_finalize,
58
.class_init = exynos4210_pwm_class_init,
59
};
60
61
--
62
2.20.1
63
64
diff view generated by jsdifflib
1
From: Cao Jiaxi <driver1998@foxmail.com>
1
From: Gan Qixin <ganqixin@huawei.com>
2
2
3
I encountered the following compilation error on mingw:
3
When running device-introspect-test, a memory leak occurred in the
4
mss_timer_init function, so use ptimer_free() in the finalize function to avoid
5
it.
4
6
5
/mnt/d/qemu/include/qemu/osdep.h:97:9: error: '__USE_MINGW_ANSI_STDIO' macro redefined [-Werror,-Wmacro-redefined]
7
ASAN shows memory leak stack:
6
#define __USE_MINGW_ANSI_STDIO 1
7
^
8
/mnt/d/llvm-mingw/aarch64-w64-mingw32/include/_mingw.h:433:9: note: previous definition is here
9
#define __USE_MINGW_ANSI_STDIO 0 /* was not defined so it should be 0 */
10
8
11
It turns out that __USE_MINGW_ANSI_STDIO must be set before any
9
Indirect leak of 192 byte(s) in 2 object(s) allocated from:
12
system headers are included, not just before stdio.h.
10
#0 0xffffab97e1f0 in __interceptor_calloc (/lib64/libasan.so.5+0xee1f0)
11
#1 0xffffab256800 in g_malloc0 (/lib64/libglib-2.0.so.0+0x56800)
12
#2 0xaaabf555db78 in ptimer_init /qemu/hw/core/ptimer.c:432
13
#3 0xaaabf58a0010 in mss_timer_init /qemu/hw/timer/mss-timer.c:235
14
#4 0xaaabf6339f6c in object_initialize_with_type /qemu/qom/object.c:515
15
#5 0xaaabf633ca04 in object_initialize_child_with_propsv /qemu/qom/object.c:564
16
#6 0xaaabf633cc08 in object_initialize_child_with_props /qemu/qom/object.c:547
17
#7 0xaaabf5b8316c in m2sxxx_soc_initfn /qemu/hw/arm/msf2-soc.c:70
18
#8 0xaaabf6339f6c in object_initialize_with_type /qemu/qom/object.c:515
19
#9 0xaaabf633a1e0 in object_new_with_type /qemu/qom/object.c:729
20
#10 0xaaabf6375e40 in qmp_device_list_properties /qemu/qom/qom-qmp-cmds.c:153
21
#11 0xaaabf653d8ec in qmp_marshal_device_list_properties /qemu/qapi/qapi-commands-qdev.c:59
22
#12 0xaaabf6587d08 in do_qmp_dispatch_bh /qemu/qapi/qmp-dispatch.c:110
13
23
14
Signed-off-by: Cao Jiaxi <driver1998@foxmail.com>
24
Reported-by: Euler Robot <euler.robot@huawei.com>
15
Reviewed-by: Thomas Huth <thuth@redhat.com>
25
Signed-off-by: Gan Qixin <ganqixin@huawei.com>
16
Reviewed-by: Stefan Weil <sw@weilnetz.de>
26
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
17
Message-id: 20190503003719.10233-1-driver1998@foxmail.com
18
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
28
---
21
include/qemu/osdep.h | 10 +++++-----
29
hw/timer/mss-timer.c | 13 +++++++++++++
22
1 file changed, 5 insertions(+), 5 deletions(-)
30
1 file changed, 13 insertions(+)
23
31
24
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
32
diff --git a/hw/timer/mss-timer.c b/hw/timer/mss-timer.c
25
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
26
--- a/include/qemu/osdep.h
34
--- a/hw/timer/mss-timer.c
27
+++ b/include/qemu/osdep.h
35
+++ b/hw/timer/mss-timer.c
28
@@ -XXX,XX +XXX,XX @@ extern int daemon(int, int);
36
@@ -XXX,XX +XXX,XX @@ static void mss_timer_init(Object *obj)
29
#endif
37
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &t->mmio);
30
#endif
38
}
31
39
32
+/* enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later) */
40
+static void mss_timer_finalize(Object *obj)
33
+#ifdef __MINGW32__
41
+{
34
+#define __USE_MINGW_ANSI_STDIO 1
42
+ MSSTimerState *t = MSS_TIMER(obj);
35
+#endif
43
+ int i;
36
+
44
+
37
#include <stdarg.h>
45
+ for (i = 0; i < NUM_TIMERS; i++) {
38
#include <stddef.h>
46
+ struct Msf2Timer *st = &t->timers[i];
39
#include <stdbool.h>
47
+
40
#include <stdint.h>
48
+ ptimer_free(st->ptimer);
41
#include <sys/types.h>
49
+ }
42
#include <stdlib.h>
50
+}
43
-
51
+
44
-/* enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later) */
52
static const VMStateDescription vmstate_timers = {
45
-#ifdef __MINGW32__
53
.name = "mss-timer-block",
46
-#define __USE_MINGW_ANSI_STDIO 1
54
.version_id = 1,
47
-#endif
55
@@ -XXX,XX +XXX,XX @@ static const TypeInfo mss_timer_info = {
48
#include <stdio.h>
56
.parent = TYPE_SYS_BUS_DEVICE,
49
57
.instance_size = sizeof(MSSTimerState),
50
#include <string.h>
58
.instance_init = mss_timer_init,
59
+ .instance_finalize = mss_timer_finalize,
60
.class_init = mss_timer_class_init,
61
};
62
51
--
63
--
52
2.20.1
64
2.20.1
53
65
54
66
diff view generated by jsdifflib
1
From: Cao Jiaxi <driver1998@foxmail.com>
1
From: Gan Qixin <ganqixin@huawei.com>
2
2
3
gcc_struct is for x86 only, and it generates an warning on ARM64 Clang/MinGW targets.
3
When running device-introspect-test, a memory leak occurred in the
4
mv88w8618_pit_init function, so use ptimer_free() in the finalize function to
5
avoid it.
4
6
5
Signed-off-by: Cao Jiaxi <driver1998@foxmail.com>
7
ASAN shows memory leak stack:
6
Reviewed-by: Thomas Huth <thuth@redhat.com>
8
7
Message-id: 20190503003618.10089-1-driver1998@foxmail.com
9
Indirect leak of 192 byte(s) in 4 object(s) allocated from:
8
[PMM: dropped the slirp change as slirp is now a submodule]
10
#0 0xffffab97e1f0 in __interceptor_calloc (/lib64/libasan.so.5+0xee1f0)
11
#1 0xffffab256800 in g_malloc0 (/lib64/libglib-2.0.so.0+0x56800)
12
#2 0xaaabf555db84 in timer_new_full /qemu/include/qemu/timer.h:523
13
#3 0xaaabf555db84 in timer_new /qemu/include/qemu/timer.h:544
14
#4 0xaaabf555db84 in timer_new_ns /qemu/include/qemu/timer.h:562
15
#5 0xaaabf555db84 in ptimer_init /qemu/hw/core/ptimer.c:433
16
#6 0xaaabf5bb2290 in mv88w8618_timer_init /qemu/hw/arm/musicpal.c:862
17
#7 0xaaabf5bb2290 in mv88w8618_pit_init /qemu/hw/arm/musicpal.c:954
18
#8 0xaaabf6339f6c in object_initialize_with_type /qemu/qom/object.c:515
19
#9 0xaaabf633a1e0 in object_new_with_type /qemu/qom/object.c:729
20
#10 0xaaabf6375e40 in qmp_device_list_properties /qemu/qom/qom-qmp-cmds.c:153
21
#11 0xaaabf5a95540 in qdev_device_help /qemu/softmmu/qdev-monitor.c:283
22
#12 0xaaabf5a96940 in qmp_device_add /qemu/softmmu/qdev-monitor.c:801
23
24
Reported-by: Euler Robot <euler.robot@huawei.com>
25
Signed-off-by: Gan Qixin <ganqixin@huawei.com>
26
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
28
---
11
contrib/libvhost-user/libvhost-user.h | 2 +-
29
hw/arm/musicpal.c | 12 ++++++++++++
12
include/qemu/compiler.h | 2 +-
30
1 file changed, 12 insertions(+)
13
scripts/cocci-macro-file.h | 7 ++++++-
14
3 files changed, 8 insertions(+), 3 deletions(-)
15
31
16
diff --git a/contrib/libvhost-user/libvhost-user.h b/contrib/libvhost-user/libvhost-user.h
32
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
17
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
18
--- a/contrib/libvhost-user/libvhost-user.h
34
--- a/hw/arm/musicpal.c
19
+++ b/contrib/libvhost-user/libvhost-user.h
35
+++ b/hw/arm/musicpal.c
20
@@ -XXX,XX +XXX,XX @@ typedef struct VhostUserInflight {
36
@@ -XXX,XX +XXX,XX @@ static void mv88w8618_pit_init(Object *obj)
21
uint16_t queue_size;
37
sysbus_init_mmio(dev, &s->iomem);
22
} VhostUserInflight;
38
}
23
39
24
-#if defined(_WIN32)
40
+static void mv88w8618_pit_finalize(Object *obj)
25
+#if defined(_WIN32) && (defined(__x86_64__) || defined(__i386__))
41
+{
26
# define VU_PACKED __attribute__((gcc_struct, packed))
42
+ SysBusDevice *dev = SYS_BUS_DEVICE(obj);
27
#else
43
+ mv88w8618_pit_state *s = MV88W8618_PIT(dev);
28
# define VU_PACKED __attribute__((packed))
44
+ int i;
29
diff --git a/include/qemu/compiler.h b/include/qemu/compiler.h
30
index XXXXXXX..XXXXXXX 100644
31
--- a/include/qemu/compiler.h
32
+++ b/include/qemu/compiler.h
33
@@ -XXX,XX +XXX,XX @@
34
35
#define QEMU_SENTINEL __attribute__((sentinel))
36
37
-#if defined(_WIN32)
38
+#if defined(_WIN32) && (defined(__x86_64__) || defined(__i386__))
39
# define QEMU_PACKED __attribute__((gcc_struct, packed))
40
#else
41
# define QEMU_PACKED __attribute__((packed))
42
diff --git a/scripts/cocci-macro-file.h b/scripts/cocci-macro-file.h
43
index XXXXXXX..XXXXXXX 100644
44
--- a/scripts/cocci-macro-file.h
45
+++ b/scripts/cocci-macro-file.h
46
@@ -XXX,XX +XXX,XX @@
47
#define QEMU_NORETURN __attribute__ ((__noreturn__))
48
#define QEMU_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
49
#define QEMU_SENTINEL __attribute__((sentinel))
50
-#define QEMU_PACKED __attribute__((gcc_struct, packed))
51
+
45
+
52
+#if defined(_WIN32) && (defined(__x86_64__) || defined(__i386__))
46
+ for (i = 0; i < 4; i++) {
53
+# define QEMU_PACKED __attribute__((gcc_struct, packed))
47
+ ptimer_free(s->timer[i].ptimer);
54
+#else
48
+ }
55
+# define QEMU_PACKED __attribute__((packed))
49
+}
56
+#endif
50
+
57
51
static const VMStateDescription mv88w8618_timer_vmsd = {
58
#define cat(x,y) x ## y
52
.name = "timer",
59
#define cat2(x,y) cat(x,y)
53
.version_id = 1,
54
@@ -XXX,XX +XXX,XX @@ static const TypeInfo mv88w8618_pit_info = {
55
.parent = TYPE_SYS_BUS_DEVICE,
56
.instance_size = sizeof(mv88w8618_pit_state),
57
.instance_init = mv88w8618_pit_init,
58
+ .instance_finalize = mv88w8618_pit_finalize,
59
.class_init = mv88w8618_pit_class_init,
60
};
61
60
--
62
--
61
2.20.1
63
2.20.1
62
64
63
65
diff view generated by jsdifflib
1
From: Markus Armbruster <armbru@redhat.com>
1
From: Gan Qixin <ganqixin@huawei.com>
2
2
3
Factored out of pc_system_firmware_init() so the next commit can reuse
3
When running device-introspect-test, a memory leak occurred in the
4
it in hw/arm/virt.c.
4
exynos4210_mct_init function, so use ptimer_free() in the finalize function to
5
avoid it.
5
6
6
Signed-off-by: Markus Armbruster <armbru@redhat.com>
7
ASAN shows memory leak stack:
7
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
8
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Indirect leak of 96 byte(s) in 1 object(s) allocated from:
9
Message-id: 20190416091348.26075-3-armbru@redhat.com
10
#0 0xffffab97e1f0 in __interceptor_calloc (/lib64/libasan.so.5+0xee1f0)
11
#1 0xffffab256800 in g_malloc0 (/lib64/libglib-2.0.so.0+0x56800)
12
#2 0xaaabf555db78 in ptimer_init /qemu/hw/core/ptimer.c:432
13
#3 0xaaabf56b01a0 in exynos4210_mct_init /qemu/hw/timer/exynos4210_mct.c:1505
14
#4 0xaaabf6339f6c in object_initialize_with_type /qemu/qom/object.c:515
15
#5 0xaaabf633a1e0 in object_new_with_type /qemu/qom/object.c:729
16
#6 0xaaabf6375e40 in qmp_device_list_properties /qemu/qom/qom-qmp-cmds.c:153
17
#7 0xaaabf653d8ec in qmp_marshal_device_list_properties /qemu/qapi/qapi-commands-qdev.c:59
18
#8 0xaaabf6587d08 in do_qmp_dispatch_bh /qemu/qapi/qmp-dispatch.c:110
19
#9 0xaaabf6552708 in aio_bh_call /qemu/util/async.c:136
20
#10 0xaaabf6552708 in aio_bh_poll /qemu/util/async.c:164
21
#11 0xaaabf655f19c in aio_dispatch /qemu/util/aio-posix.c:381
22
#12 0xaaabf65523f4 in aio_ctx_dispatch /qemu/util/async.c:306
23
24
Reported-by: Euler Robot <euler.robot@huawei.com>
25
Signed-off-by: Gan Qixin <ganqixin@huawei.com>
26
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
28
---
12
include/hw/block/flash.h | 1 +
29
hw/timer/exynos4210_mct.c | 14 ++++++++++++++
13
hw/block/pflash_cfi01.c | 28 ++++++++++++++++++++++++++++
30
1 file changed, 14 insertions(+)
14
hw/i386/pc_sysfw.c | 16 ++--------------
15
3 files changed, 31 insertions(+), 14 deletions(-)
16
31
17
diff --git a/include/hw/block/flash.h b/include/hw/block/flash.h
32
diff --git a/hw/timer/exynos4210_mct.c b/hw/timer/exynos4210_mct.c
18
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/block/flash.h
34
--- a/hw/timer/exynos4210_mct.c
20
+++ b/include/hw/block/flash.h
35
+++ b/hw/timer/exynos4210_mct.c
21
@@ -XXX,XX +XXX,XX @@ PFlashCFI01 *pflash_cfi01_register(hwaddr base,
36
@@ -XXX,XX +XXX,XX @@ static void exynos4210_mct_init(Object *obj)
22
int be);
37
sysbus_init_mmio(dev, &s->iomem);
23
BlockBackend *pflash_cfi01_get_blk(PFlashCFI01 *fl);
24
MemoryRegion *pflash_cfi01_get_memory(PFlashCFI01 *fl);
25
+void pflash_cfi01_legacy_drive(PFlashCFI01 *dev, DriveInfo *dinfo);
26
27
/* pflash_cfi02.c */
28
29
diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/block/pflash_cfi01.c
32
+++ b/hw/block/pflash_cfi01.c
33
@@ -XXX,XX +XXX,XX @@
34
#include "qapi/error.h"
35
#include "qemu/timer.h"
36
#include "qemu/bitops.h"
37
+#include "qemu/error-report.h"
38
#include "qemu/host-utils.h"
39
#include "qemu/log.h"
40
+#include "qemu/option.h"
41
#include "hw/sysbus.h"
42
+#include "sysemu/blockdev.h"
43
#include "sysemu/sysemu.h"
44
#include "trace.h"
45
46
@@ -XXX,XX +XXX,XX @@ MemoryRegion *pflash_cfi01_get_memory(PFlashCFI01 *fl)
47
return &fl->mem;
48
}
38
}
49
39
50
+/*
40
+static void exynos4210_mct_finalize(Object *obj)
51
+ * Handle -drive if=pflash for machines that use properties.
52
+ * If @dinfo is null, do nothing.
53
+ * Else if @fl's property "drive" is already set, fatal error.
54
+ * Else set it to the BlockBackend with @dinfo.
55
+ */
56
+void pflash_cfi01_legacy_drive(PFlashCFI01 *fl, DriveInfo *dinfo)
57
+{
41
+{
58
+ Location loc;
42
+ int i;
43
+ Exynos4210MCTState *s = EXYNOS4210_MCT(obj);
59
+
44
+
60
+ if (!dinfo) {
45
+ ptimer_free(s->g_timer.ptimer_frc);
61
+ return;
46
+
47
+ for (i = 0; i < 2; i++) {
48
+ ptimer_free(s->l_timer[i].tick_timer.ptimer_tick);
49
+ ptimer_free(s->l_timer[i].ptimer_frc);
62
+ }
50
+ }
63
+
64
+ loc_push_none(&loc);
65
+ qemu_opts_loc_restore(dinfo->opts);
66
+ if (fl->blk) {
67
+ error_report("clashes with -machine");
68
+ exit(1);
69
+ }
70
+ qdev_prop_set_drive(DEVICE(fl), "drive",
71
+ blk_by_legacy_dinfo(dinfo), &error_fatal);
72
+ loc_pop(&loc);
73
+}
51
+}
74
+
52
+
75
static void postload_update_cb(void *opaque, int running, RunState state)
53
static void exynos4210_mct_class_init(ObjectClass *klass, void *data)
76
{
54
{
77
PFlashCFI01 *pfl = opaque;
55
DeviceClass *dc = DEVICE_CLASS(klass);
78
diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
56
@@ -XXX,XX +XXX,XX @@ static const TypeInfo exynos4210_mct_info = {
79
index XXXXXXX..XXXXXXX 100644
57
.parent = TYPE_SYS_BUS_DEVICE,
80
--- a/hw/i386/pc_sysfw.c
58
.instance_size = sizeof(Exynos4210MCTState),
81
+++ b/hw/i386/pc_sysfw.c
59
.instance_init = exynos4210_mct_init,
82
@@ -XXX,XX +XXX,XX @@ void pc_system_firmware_init(PCMachineState *pcms,
60
+ .instance_finalize = exynos4210_mct_finalize,
83
{
61
.class_init = exynos4210_mct_class_init,
84
PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
62
};
85
int i;
86
- DriveInfo *pflash_drv;
87
BlockBackend *pflash_blk[ARRAY_SIZE(pcms->flash)];
88
- Location loc;
89
90
if (!pcmc->pci_enabled) {
91
old_pc_system_rom_init(rom_memory, true);
92
@@ -XXX,XX +XXX,XX @@ void pc_system_firmware_init(PCMachineState *pcms,
93
94
/* Map legacy -drive if=pflash to machine properties */
95
for (i = 0; i < ARRAY_SIZE(pcms->flash); i++) {
96
- pflash_drv = drive_get(IF_PFLASH, 0, i);
97
- if (pflash_drv) {
98
- loc_push_none(&loc);
99
- qemu_opts_loc_restore(pflash_drv->opts);
100
- if (pflash_cfi01_get_blk(pcms->flash[i])) {
101
- error_report("clashes with -machine");
102
- exit(1);
103
- }
104
- qdev_prop_set_drive(DEVICE(pcms->flash[i]), "drive",
105
- blk_by_legacy_dinfo(pflash_drv), &error_fatal);
106
- loc_pop(&loc);
107
- }
108
+ pflash_cfi01_legacy_drive(pcms->flash[i],
109
+ drive_get(IF_PFLASH, 0, i));
110
pflash_blk[i] = pflash_cfi01_get_blk(pcms->flash[i]);
111
}
112
63
113
--
64
--
114
2.20.1
65
2.20.1
115
66
116
67
diff view generated by jsdifflib
1
From: Cao Jiaxi <driver1998@foxmail.com>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
Windows ARM64 uses LLP64 model, which breaks current assumptions.
3
U-Boot expects PMU_MISC0 register bit 7 is set (see init_bandgap()
4
in arch/arm/mach-imx/mx6/soc.c) during boot. This bit indicates the
5
bandgap has stabilized.
4
6
5
Signed-off-by: Cao Jiaxi <driver1998@foxmail.com>
7
With this change, the latest upstream U-Boot (v2021.01-rc3) for imx6
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
sabrelite board (mx6qsabrelite_defconfig), with a slight change made
7
Reviewed-by: Thomas Huth <thuth@redhat.com>
9
by switching CONFIG_OF_SEPARATE to CONFIG_OF_EMBED, boots to U-Boot
8
Message-id: 20190503003707.10185-1-driver1998@foxmail.com
10
shell on QEMU with the following command:
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
10
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
$ qemu-system-arm -M sabrelite -smp 4 -m 1G -kernel u-boot \
13
-display none -serial null -serial stdio
14
15
Boot log below:
16
17
U-Boot 2021.01-rc3 (Dec 12 2020 - 17:40:02 +0800)
18
19
CPU: Freescale i.MX?? rev1.0 at 792 MHz
20
Reset cause: POR
21
Model: Freescale i.MX6 Quad SABRE Lite Board
22
Board: SABRE Lite
23
I2C: ready
24
DRAM: 1 GiB
25
force_idle_bus: sda=0 scl=0 sda.gp=0x5c scl.gp=0x55
26
force_idle_bus: failed to clear bus, sda=0 scl=0
27
force_idle_bus: sda=0 scl=0 sda.gp=0x6d scl.gp=0x6c
28
force_idle_bus: failed to clear bus, sda=0 scl=0
29
force_idle_bus: sda=0 scl=0 sda.gp=0xcb scl.gp=0x5
30
force_idle_bus: failed to clear bus, sda=0 scl=0
31
MMC: FSL_SDHC: 0, FSL_SDHC: 1
32
Loading Environment from MMC... *** Warning - No block device, using default environment
33
34
In: serial
35
Out: serial
36
Err: serial
37
Net: Board Net Initialization Failed
38
No ethernet found.
39
starting USB...
40
Bus usb@2184000: usb dr_mode not found
41
USB EHCI 1.00
42
Bus usb@2184200: USB EHCI 1.00
43
scanning bus usb@2184000 for devices... 1 USB Device(s) found
44
scanning bus usb@2184200 for devices... 1 USB Device(s) found
45
scanning usb for storage devices... 0 Storage Device(s) found
46
scanning usb for ethernet devices... 0 Ethernet Device(s) found
47
Hit any key to stop autoboot: 0
48
=>
49
50
Signed-off-by: Bin Meng <bin.meng@windriver.com>
51
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
52
Message-id: 20210106063504.10841-2-bmeng.cn@gmail.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
53
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
54
---
13
util/cacheinfo.c | 2 +-
55
hw/misc/imx6_ccm.c | 2 +-
14
1 file changed, 1 insertion(+), 1 deletion(-)
56
1 file changed, 1 insertion(+), 1 deletion(-)
15
57
16
diff --git a/util/cacheinfo.c b/util/cacheinfo.c
58
diff --git a/hw/misc/imx6_ccm.c b/hw/misc/imx6_ccm.c
17
index XXXXXXX..XXXXXXX 100644
59
index XXXXXXX..XXXXXXX 100644
18
--- a/util/cacheinfo.c
60
--- a/hw/misc/imx6_ccm.c
19
+++ b/util/cacheinfo.c
61
+++ b/hw/misc/imx6_ccm.c
20
@@ -XXX,XX +XXX,XX @@ static void sys_cache_info(int *isize, int *dsize)
62
@@ -XXX,XX +XXX,XX @@ static void imx6_ccm_reset(DeviceState *dev)
21
static void arch_cache_info(int *isize, int *dsize)
63
s->analog[PMU_REG_3P0] = 0x00000F74;
22
{
64
s->analog[PMU_REG_2P5] = 0x00005071;
23
if (*isize == 0 || *dsize == 0) {
65
s->analog[PMU_REG_CORE] = 0x00402010;
24
- unsigned long ctr;
66
- s->analog[PMU_MISC0] = 0x04000000;
25
+ uint64_t ctr;
67
+ s->analog[PMU_MISC0] = 0x04000080;
26
68
s->analog[PMU_MISC1] = 0x00000000;
27
/* The real cache geometry is in CCSIDR_EL1/CLIDR_EL1/CSSELR_EL1,
69
s->analog[PMU_MISC2] = 0x00272727;
28
but (at least under Linux) these are marked protected by the
70
29
--
71
--
30
2.20.1
72
2.20.1
31
73
32
74
diff view generated by jsdifflib
1
From: Cao Jiaxi <driver1998@foxmail.com>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
The win2qemu[] is supposed to be the conversion table to convert between
3
Currently when U-Boot boots, it prints "??" for i.MX processor:
4
STORAGE_BUS_TYPE in Windows SDK and GuestDiskBusType in qga.
5
4
6
But it was incorrectly written that it forces to set a GuestDiskBusType
5
CPU: Freescale i.MX?? rev1.0 at 792 MHz
7
value to STORAGE_BUS_TYPE, which generates an enum conversion warning in clang.
8
6
9
Suggested-by: Eric Blake <eblake@redhat.com>
7
The register that was used to determine the silicon type is
10
Signed-off-by: Cao Jiaxi <driver1998@foxmail.com>
8
undocumented in the latest IMX6DQRM (Rev. 6, 05/2020), but we
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
can refer to get_cpu_rev() in arch/arm/mach-imx/mx6/soc.c in
12
Reviewed-by: Thomas Huth <thuth@redhat.com>
10
the U-Boot source codes that USB_ANALOG_DIGPROG is used.
13
Message-id: 20190503003650.10137-1-driver1998@foxmail.com
11
14
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Update its reset value to indicate i.MX6Q.
15
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
14
Signed-off-by: Bin Meng <bin.meng@windriver.com>
15
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
16
Message-id: 20210106063504.10841-3-bmeng.cn@gmail.com
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
---
18
qga/commands-win32.c | 2 +-
19
hw/misc/imx6_ccm.c | 2 +-
19
1 file changed, 1 insertion(+), 1 deletion(-)
20
1 file changed, 1 insertion(+), 1 deletion(-)
20
21
21
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
22
diff --git a/hw/misc/imx6_ccm.c b/hw/misc/imx6_ccm.c
22
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
23
--- a/qga/commands-win32.c
24
--- a/hw/misc/imx6_ccm.c
24
+++ b/qga/commands-win32.c
25
+++ b/hw/misc/imx6_ccm.c
25
@@ -XXX,XX +XXX,XX @@ void qmp_guest_file_flush(int64_t handle, Error **errp)
26
@@ -XXX,XX +XXX,XX @@ static void imx6_ccm_reset(DeviceState *dev)
26
27
s->analog[USB_ANALOG_USB2_VBUS_DETECT] = 0x00000004;
27
#ifdef CONFIG_QGA_NTDDSCSI
28
s->analog[USB_ANALOG_USB2_CHRG_DETECT] = 0x00000000;
28
29
s->analog[USB_ANALOG_USB2_MISC] = 0x00000002;
29
-static STORAGE_BUS_TYPE win2qemu[] = {
30
- s->analog[USB_ANALOG_DIGPROG] = 0x00000000;
30
+static GuestDiskBusType win2qemu[] = {
31
+ s->analog[USB_ANALOG_DIGPROG] = 0x00630000;
31
[BusTypeUnknown] = GUEST_DISK_BUS_TYPE_UNKNOWN,
32
32
[BusTypeScsi] = GUEST_DISK_BUS_TYPE_SCSI,
33
/* all PLLs need to be locked */
33
[BusTypeAtapi] = GUEST_DISK_BUS_TYPE_IDE,
34
s->analog[CCM_ANALOG_PLL_ARM] |= CCM_ANALOG_PLL_LOCK;
34
--
35
--
35
2.20.1
36
2.20.1
36
37
37
38
diff view generated by jsdifflib
1
The Raspberry Pi boards have a physical memory map which does
1
From: Bin Meng <bin.meng@windriver.com>
2
not allow for more than 1GB of RAM. Currently if the user tries
3
to ask for more then we fail in a confusing way:
4
2
5
$ qemu-system-aarch64 --machine raspi3 -m 8G
3
At present, when booting U-Boot on QEMU sabrelite, we see:
6
Unexpected error in visit_type_uintN() at qapi/qapi-visit-core.c:164:
7
qemu-system-aarch64: Parameter 'vcram-base' expects uint32_t
8
Aborted (core dumped)
9
4
10
Catch this earlier and diagnose it with a more friendly message:
5
Net: Board Net Initialization Failed
11
$ qemu-system-aarch64 --machine raspi3 -m 8G
6
No ethernet found.
12
qemu-system-aarch64: Requested ram size is too large for this machine: maximum is 1GB
13
7
14
Fixes: https://bugs.launchpad.net/qemu/+bug/1794187
8
U-Boot scans PHY at address 4/5/6/7 (see board_eth_init() in the
9
U-Boot source: board/boundary/nitrogen6x/nitrogen6x.c). On the real
10
board, the Ethernet PHY is at address 6. Adjust this by updating the
11
"fec-phy-num" property of the fsl_imx6 SoC object.
12
13
With this change, U-Boot sees the PHY but complains MAC address:
14
15
Net: using phy at 6
16
FEC [PRIME]
17
Error: FEC address not set.
18
19
This is due to U-Boot tries to read the MAC address from the fuse,
20
which QEMU does not have any valid content filled in. However this
21
does not prevent the Ethernet from working in QEMU. We just need to
22
set up the MAC address later in the U-Boot command shell, by:
23
24
=> setenv ethaddr 00:11:22:33:44:55
25
26
Signed-off-by: Bin Meng <bin.meng@windriver.com>
27
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
28
Message-id: 20210106063504.10841-4-bmeng.cn@gmail.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
29
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Reviewed-by: Wainer dos Santos Moschetta <wainersm@redhat.com>
19
---
30
---
20
hw/arm/raspi.c | 7 +++++++
31
hw/arm/sabrelite.c | 4 ++++
21
1 file changed, 7 insertions(+)
32
1 file changed, 4 insertions(+)
22
33
23
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
34
diff --git a/hw/arm/sabrelite.c b/hw/arm/sabrelite.c
24
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/arm/raspi.c
36
--- a/hw/arm/sabrelite.c
26
+++ b/hw/arm/raspi.c
37
+++ b/hw/arm/sabrelite.c
27
@@ -XXX,XX +XXX,XX @@
38
@@ -XXX,XX +XXX,XX @@ static void sabrelite_init(MachineState *machine)
28
*/
39
29
40
s = FSL_IMX6(object_new(TYPE_FSL_IMX6));
30
#include "qemu/osdep.h"
41
object_property_add_child(OBJECT(machine), "soc", OBJECT(s));
31
+#include "qemu/units.h"
32
#include "qapi/error.h"
33
#include "qemu-common.h"
34
#include "cpu.h"
35
@@ -XXX,XX +XXX,XX @@ static void raspi_init(MachineState *machine, int version)
36
BusState *bus;
37
DeviceState *carddev;
38
39
+ if (machine->ram_size > 1 * GiB) {
40
+ error_report("Requested ram size is too large for this machine: "
41
+ "maximum is 1GB");
42
+ exit(1);
43
+ }
44
+
42
+
45
object_initialize(&s->soc, sizeof(s->soc),
43
+ /* Ethernet PHY address is 6 */
46
version == 3 ? TYPE_BCM2837 : TYPE_BCM2836);
44
+ object_property_set_int(OBJECT(s), "fec-phy-num", 6, &error_fatal);
47
object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc),
45
+
46
qdev_realize(DEVICE(s), NULL, &error_fatal);
47
48
memory_region_add_subregion(get_system_memory(), FSL_IMX6_MMDC_ADDR,
48
--
49
--
49
2.20.1
50
2.20.1
50
51
51
52
diff view generated by jsdifflib
1
From: Markus Armbruster <armbru@redhat.com>
1
From: Bin Meng <bin.meng@windriver.com>
2
2
3
The loop does two things: map legacy -drive to properties, and collect
3
This adds the target guide for SABRE Lite board, and documents how
4
all the backends for use after the loop. The next patch will factor
4
to boot a Linux kernel and U-Boot bootloader.
5
out the former for reuse in hw/arm/virt.c. To make that easier,
6
rearrange the loop so it does the first thing first, and the second
7
thing second.
8
5
9
Signed-off-by: Markus Armbruster <armbru@redhat.com>
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
10
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Message-id: 20210106063504.10841-5-bmeng.cn@gmail.com
12
Message-id: 20190416091348.26075-2-armbru@redhat.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
10
---
15
hw/i386/pc_sysfw.c | 24 +++++++++++-------------
11
docs/system/arm/sabrelite.rst | 119 ++++++++++++++++++++++++++++++++++
16
1 file changed, 11 insertions(+), 13 deletions(-)
12
docs/system/target-arm.rst | 1 +
13
2 files changed, 120 insertions(+)
14
create mode 100644 docs/system/arm/sabrelite.rst
17
15
18
diff --git a/hw/i386/pc_sysfw.c b/hw/i386/pc_sysfw.c
16
diff --git a/docs/system/arm/sabrelite.rst b/docs/system/arm/sabrelite.rst
17
new file mode 100644
18
index XXXXXXX..XXXXXXX
19
--- /dev/null
20
+++ b/docs/system/arm/sabrelite.rst
21
@@ -XXX,XX +XXX,XX @@
22
+Boundary Devices SABRE Lite (``sabrelite``)
23
+===========================================
24
+
25
+Boundary Devices SABRE Lite i.MX6 Development Board is a low-cost development
26
+platform featuring the powerful Freescale / NXP Semiconductor's i.MX 6 Quad
27
+Applications Processor.
28
+
29
+Supported devices
30
+-----------------
31
+
32
+The SABRE Lite machine supports the following devices:
33
+
34
+ * Up to 4 Cortex A9 cores
35
+ * Generic Interrupt Controller
36
+ * 1 Clock Controller Module
37
+ * 1 System Reset Controller
38
+ * 5 UARTs
39
+ * 2 EPIC timers
40
+ * 1 GPT timer
41
+ * 2 Watchdog timers
42
+ * 1 FEC Ethernet controller
43
+ * 3 I2C controllers
44
+ * 7 GPIO controllers
45
+ * 4 SDHC storage controllers
46
+ * 4 USB 2.0 host controllers
47
+ * 5 ECSPI controllers
48
+ * 1 SST 25VF016B flash
49
+
50
+Please note above list is a complete superset the QEMU SABRE Lite machine can
51
+support. For a normal use case, a device tree blob that represents a real world
52
+SABRE Lite board, only exposes a subset of devices to the guest software.
53
+
54
+Boot options
55
+------------
56
+
57
+The SABRE Lite machine can start using the standard -kernel functionality
58
+for loading a Linux kernel, U-Boot bootloader or ELF executable.
59
+
60
+Running Linux kernel
61
+--------------------
62
+
63
+Linux mainline v5.10 release is tested at the time of writing. To build a Linux
64
+mainline kernel that can be booted by the SABRE Lite machine, simply configure
65
+the kernel using the imx_v6_v7_defconfig configuration:
66
+
67
+.. code-block:: bash
68
+
69
+ $ export ARCH=arm
70
+ $ export CROSS_COMPILE=arm-linux-gnueabihf-
71
+ $ make imx_v6_v7_defconfig
72
+ $ make
73
+
74
+To boot the newly built Linux kernel in QEMU with the SABRE Lite machine, use:
75
+
76
+.. code-block:: bash
77
+
78
+ $ qemu-system-arm -M sabrelite -smp 4 -m 1G \
79
+ -display none -serial null -serial stdio \
80
+ -kernel arch/arm/boot/zImage \
81
+ -dtb arch/arm/boot/dts/imx6q-sabrelite.dtb \
82
+ -initrd /path/to/rootfs.ext4 \
83
+ -append "root=/dev/ram"
84
+
85
+Running U-Boot
86
+--------------
87
+
88
+U-Boot mainline v2020.10 release is tested at the time of writing. To build a
89
+U-Boot mainline bootloader that can be booted by the SABRE Lite machine, use
90
+the mx6qsabrelite_defconfig with similar commands as described above for Linux:
91
+
92
+.. code-block:: bash
93
+
94
+ $ export CROSS_COMPILE=arm-linux-gnueabihf-
95
+ $ make mx6qsabrelite_defconfig
96
+
97
+Note we need to adjust settings by:
98
+
99
+.. code-block:: bash
100
+
101
+ $ make menuconfig
102
+
103
+then manually select the following configuration in U-Boot:
104
+
105
+ Device Tree Control > Provider of DTB for DT Control > Embedded DTB
106
+
107
+To start U-Boot using the SABRE Lite machine, provide the u-boot binary to
108
+the -kernel argument, along with an SD card image with rootfs:
109
+
110
+.. code-block:: bash
111
+
112
+ $ qemu-system-arm -M sabrelite -smp 4 -m 1G \
113
+ -display none -serial null -serial stdio \
114
+ -kernel u-boot
115
+
116
+The following example shows booting Linux kernel from dhcp, and uses the
117
+rootfs on an SD card. This requires some additional command line parameters
118
+for QEMU:
119
+
120
+.. code-block:: none
121
+
122
+ -nic user,tftp=/path/to/kernel/zImage \
123
+ -drive file=sdcard.img,id=rootfs -device sd-card,drive=rootfs
124
+
125
+The directory for the built-in TFTP server should also contain the device tree
126
+blob of the SABRE Lite board. The sample SD card image was populated with the
127
+root file system with one single partition. You may adjust the kernel "root="
128
+boot parameter accordingly.
129
+
130
+After U-Boot boots, type the following commands in the U-Boot command shell to
131
+boot the Linux kernel:
132
+
133
+.. code-block:: none
134
+
135
+ => setenv ethaddr 00:11:22:33:44:55
136
+ => setenv bootfile zImage
137
+ => dhcp
138
+ => tftpboot 14000000 imx6q-sabrelite.dtb
139
+ => setenv bootargs root=/dev/mmcblk3p1
140
+ => bootz 12000000 - 14000000
141
diff --git a/docs/system/target-arm.rst b/docs/system/target-arm.rst
19
index XXXXXXX..XXXXXXX 100644
142
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/i386/pc_sysfw.c
143
--- a/docs/system/target-arm.rst
21
+++ b/hw/i386/pc_sysfw.c
144
+++ b/docs/system/target-arm.rst
22
@@ -XXX,XX +XXX,XX @@ void pc_system_firmware_init(PCMachineState *pcms,
145
@@ -XXX,XX +XXX,XX @@ undocumented; you can get a complete list by running
23
146
arm/versatile
24
/* Map legacy -drive if=pflash to machine properties */
147
arm/vexpress
25
for (i = 0; i < ARRAY_SIZE(pcms->flash); i++) {
148
arm/aspeed
26
- pflash_blk[i] = pflash_cfi01_get_blk(pcms->flash[i]);
149
+ arm/sabrelite
27
pflash_drv = drive_get(IF_PFLASH, 0, i);
150
arm/digic
28
- if (!pflash_drv) {
151
arm/musicpal
29
- continue;
152
arm/gumstix
30
+ if (pflash_drv) {
31
+ loc_push_none(&loc);
32
+ qemu_opts_loc_restore(pflash_drv->opts);
33
+ if (pflash_cfi01_get_blk(pcms->flash[i])) {
34
+ error_report("clashes with -machine");
35
+ exit(1);
36
+ }
37
+ qdev_prop_set_drive(DEVICE(pcms->flash[i]), "drive",
38
+ blk_by_legacy_dinfo(pflash_drv), &error_fatal);
39
+ loc_pop(&loc);
40
}
41
- loc_push_none(&loc);
42
- qemu_opts_loc_restore(pflash_drv->opts);
43
- if (pflash_blk[i]) {
44
- error_report("clashes with -machine");
45
- exit(1);
46
- }
47
- pflash_blk[i] = blk_by_legacy_dinfo(pflash_drv);
48
- qdev_prop_set_drive(DEVICE(pcms->flash[i]),
49
- "drive", pflash_blk[i], &error_fatal);
50
- loc_pop(&loc);
51
+ pflash_blk[i] = pflash_cfi01_get_blk(pcms->flash[i]);
52
}
53
54
/* Reject gaps */
55
--
153
--
56
2.20.1
154
2.20.1
57
155
58
156
diff view generated by jsdifflib