Skip to content

Commit c9ba79b

Browse files
committed
Merge tag 'pull-target-arm-20240622' of https://git.linaro.org/people/pmaydell/qemu-arm into staging
target-arm queue: * hw/net/can/xlnx-versal-canfd: Fix sorting of the tx queue * hw/arm/xilinx_zynq: Fix IRQ/FIQ routing * hw/intc/arm_gic: Fix deactivation of SPI lines * hw/timer/a9gtimer: Handle QTest mode in a9_gtimer_get_current_cpu * hw/misc: Set valid access size for Exynos4210 RNG * hw/arm/sbsa-ref: switch to 1GHz timer frequency * hw/arm/sbsa-ref: Enable CPU cluster on ARM sbsa machine * hw/arm/virt: allow creation of a second NonSecure UART * hw/arm/virt: Avoid unexpected warning from Linux guest on host with Fujitsu CPUs * scripts/coverity-scan/COMPONENTS.md: update component regexes * hw/usb/hcd-dwc2: Handle invalid address access in read and write functions * hw/usb/hcd-ohci: Fix ohci_service_td: accept zero-length TDs where CBP=BE+1 # -----BEGIN PGP SIGNATURE----- # # iQJNBAABCAA3FiEE4aXFk81BneKOgxXPPCUl7RQ2DN4FAmZ2vigZHHBldGVyLm1h # eWRlbGxAbGluYXJvLm9yZwAKCRA8JSXtFDYM3mRzD/9+Upo0E9GoNE8FaZYk+xw9 # tB7V0C5RxZCW74ggjsoRSs2Mq45X+jzjT5cmlo3bCyj9z146eyOovcqroJHlggy7 # W3nqE7Yg6tUz6MEbrDq54BVNGmBdwY4kpYr5MvXrhtb9A+/QjaW8MqlmT5NCvUb+ # KZ+i4PTAF5dALCZblnqL5+9RYfwMOeR8R03ZbV2H0OCvO16N1rWsgoRzReVbpmy2 # LEXGber13O7HnSRiMjvxTn92yZBO+tgmLB5w6V4aaYKEhj3B0wTO+GVEUMz0Rmzw # LunrZhtQql9MOrdJIvgPrrFRmGHamnNu3IV0750xrRPQ1mJlVevaaCpl1IlaVeXG # /PnY8HWaDJgwlPMDZVga38KSVQavdC8/Uvdw816a0rBzbclAAUZSNf8cuNeJ7qmk # 2CQp/C8vuarWH0Ut0Qav8uuepd5jDt5TT3crBPhxMRwxsNTsSgjXxe7s3jdVWe2C # +z1sC/KnSmmFUwyu14GA4WsUdz05m4Mmixz4unXemMeexibUA3n4RSTiUYzTNcb4 # NmhEY4WbhuDtnSqqeSFyKtS5WCIG9A8YmcEzHWNsbaZAIEdS5QlxCSocbzG2mO6G # zD/kWMn0nmYWejYgaT3LcL5BvkwmePV6u3jQNmVL8aQgG+OPZh7tvCR2gSMPWpml # Y2pVvKZ+Tcx3GqZOUqKsrA== # =oPnm # -----END PGP SIGNATURE----- # gpg: Signature made Sat 22 Jun 2024 05:06:00 AM PDT # gpg: using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE # gpg: issuer "[email protected]" # gpg: Good signature from "Peter Maydell <[email protected]>" [full] # gpg: aka "Peter Maydell <[email protected]>" [full] # gpg: aka "Peter Maydell <[email protected]>" [full] # gpg: aka "Peter Maydell <[email protected]>" [unknown] * tag 'pull-target-arm-20240622' of https://git.linaro.org/people/pmaydell/qemu-arm: hw/arm/sbsa-ref: Enable CPU cluster on ARM sbsa machine hw/usb/hcd-ohci: Fix ohci_service_td: accept zero-length TDs where CBP=BE+1 hw/misc: Set valid access size for Exynos4210 RNG hw/arm/virt: Avoid unexpected warning from Linux guest on host with Fujitsu CPUs hw/arm/virt: allow creation of a second NonSecure UART hw/arm/virt: Rename VIRT_UART and VIRT_SECURE_UART to VIRT_UART[01] hw/arm/virt: Add serial aliases in DTB hw/usb/hcd-dwc2: Handle invalid address access in read and write functions hw/timer/a9gtimer: Handle QTest mode in a9_gtimer_get_current_cpu scripts/coverity-scan/COMPONENTS.md: Include libqmp in testlibs scripts/coverity-scan/COMPONENTS.md: Fix monitor component scripts/coverity-scan/COMPONENTS.md: Add crypto headers in host/include to the crypto component scripts/coverity-scan/COMPONENTS.md: Fix 'char' component scripts/coverity-scan/COMPONENTS.md: Update paths to match gitlab CI hw/arm/xilinx_zynq: Fix IRQ/FIQ routing hw/intc/arm_gic: Fix deactivation of SPI lines hw/arm/sbsa-ref: switch to 1GHz timer frequency hw/net/can/xlnx-versal-canfd: Fix sorting of the tx queue Signed-off-by: Richard Henderson <[email protected]>
2 parents ffeddb9 + 3b36cea commit c9ba79b

File tree

15 files changed

+179
-90
lines changed

15 files changed

+179
-90
lines changed

docs/system/arm/sbsa.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ The devicetree reports:
6262
- platform version
6363
- GIC addresses
6464
- NUMA node id for CPUs and memory
65+
- CPU topology information
6566

6667
Platform version
6768
''''''''''''''''
@@ -88,3 +89,6 @@ Platform version changes:
8889

8990
0.3
9091
The USB controller is an XHCI device, not EHCI.
92+
93+
0.4
94+
CPU topology information is present in devicetree.

docs/system/arm/virt.rst

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ The virt board supports:
2626

2727
- PCI/PCIe devices
2828
- Flash memory
29-
- One PL011 UART
29+
- Either one or two PL011 UARTs for the NonSecure World
3030
- An RTC
3131
- The fw_cfg device that allows a guest to obtain data from QEMU
3232
- A PL061 GPIO controller
@@ -48,6 +48,10 @@ The virt board supports:
4848
- A secure flash memory
4949
- 16MB of secure RAM
5050

51+
The second NonSecure UART only exists if a backend is configured
52+
explicitly (e.g. with a second -serial command line option) and
53+
TrustZone emulation is not enabled.
54+
5155
Supported guest CPU types:
5256

5357
- ``cortex-a7`` (32-bit)

hw/arm/sbsa-ref.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,12 @@
6262

6363
/*
6464
* Generic timer frequency in Hz (which drives both the CPU generic timers
65-
* and the SBSA watchdog-timer). Older versions of the TF-A firmware
66-
* typically used with sbsa-ref (including the binaries in our Avocado test
67-
* Aarch64SbsarefMachine.test_sbsaref_alpine_linux_max_pauth_impdef
68-
* assume it is this value.
65+
* and the SBSA watchdog-timer). Older (<2.11) versions of the TF-A firmware
66+
* assumed 62.5MHz here.
6967
*
70-
* TODO: this value is not architecturally correct for an Armv8.6 or
71-
* better CPU, so we should move to 1GHz once the TF-A fix above has
72-
* made it into a release and into our Avocado test.
68+
* Starting with Armv8.6 CPU 1GHz timer frequency is mandated.
7369
*/
74-
#define SBSA_GTIMER_HZ 62500000
70+
#define SBSA_GTIMER_HZ 1000000000
7571

7672
enum {
7773
SBSA_FLASH,
@@ -223,7 +219,7 @@ static void create_fdt(SBSAMachineState *sms)
223219
* fw compatibility.
224220
*/
225221
qemu_fdt_setprop_cell(fdt, "/", "machine-version-major", 0);
226-
qemu_fdt_setprop_cell(fdt, "/", "machine-version-minor", 3);
222+
qemu_fdt_setprop_cell(fdt, "/", "machine-version-minor", 4);
227223

228224
if (ms->numa_state->have_numa_distance) {
229225
int size = nb_numa_nodes * nb_numa_nodes * 3 * sizeof(uint32_t);
@@ -280,6 +276,14 @@ static void create_fdt(SBSAMachineState *sms)
280276
g_free(nodename);
281277
}
282278

279+
/* Add CPU topology description through fdt node topology. */
280+
qemu_fdt_add_subnode(sms->fdt, "/cpus/topology");
281+
282+
qemu_fdt_setprop_cell(sms->fdt, "/cpus/topology", "sockets", ms->smp.sockets);
283+
qemu_fdt_setprop_cell(sms->fdt, "/cpus/topology", "clusters", ms->smp.clusters);
284+
qemu_fdt_setprop_cell(sms->fdt, "/cpus/topology", "cores", ms->smp.cores);
285+
qemu_fdt_setprop_cell(sms->fdt, "/cpus/topology", "threads", ms->smp.threads);
286+
283287
sbsa_fdt_add_gic_node(sms);
284288
}
285289

@@ -902,6 +906,7 @@ static void sbsa_ref_class_init(ObjectClass *oc, void *data)
902906
mc->default_ram_size = 1 * GiB;
903907
mc->default_ram_id = "sbsa-ref.ram";
904908
mc->default_cpus = 4;
909+
mc->smp_props.clusters_supported = true;
905910
mc->possible_cpu_arch_ids = sbsa_ref_possible_cpu_arch_ids;
906911
mc->cpu_index_to_instance_props = sbsa_ref_cpu_index_to_props;
907912
mc->get_default_cpu_node_id = sbsa_ref_get_default_cpu_node_id;

hw/arm/virt-acpi-build.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ static void acpi_dsdt_add_cpus(Aml *scope, VirtMachineState *vms)
7979
}
8080

8181
static void acpi_dsdt_add_uart(Aml *scope, const MemMapEntry *uart_memmap,
82-
uint32_t uart_irq)
82+
uint32_t uart_irq, int uartidx)
8383
{
84-
Aml *dev = aml_device("COM0");
84+
Aml *dev = aml_device("COM%d", uartidx);
8585
aml_append(dev, aml_name_decl("_HID", aml_string("ARMH0011")));
86-
aml_append(dev, aml_name_decl("_UID", aml_int(0)));
86+
aml_append(dev, aml_name_decl("_UID", aml_int(uartidx)));
8787

8888
Aml *crs = aml_resource_template();
8989
aml_append(crs, aml_memory32_fixed(uart_memmap->base,
@@ -440,10 +440,10 @@ spcr_setup(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
440440
.base_addr.width = 32,
441441
.base_addr.offset = 0,
442442
.base_addr.size = 3,
443-
.base_addr.addr = vms->memmap[VIRT_UART].base,
443+
.base_addr.addr = vms->memmap[VIRT_UART0].base,
444444
.interrupt_type = (1 << 3),/* Bit[3] ARMH GIC interrupt*/
445445
.pc_interrupt = 0, /* IRQ */
446-
.interrupt = (vms->irqmap[VIRT_UART] + ARM_SPI_BASE),
446+
.interrupt = (vms->irqmap[VIRT_UART0] + ARM_SPI_BASE),
447447
.baud_rate = 3, /* 9600 */
448448
.parity = 0, /* No Parity */
449449
.stop_bits = 1, /* 1 Stop bit */
@@ -631,11 +631,11 @@ build_dbg2(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
631631

632632
/* BaseAddressRegister[] */
633633
build_append_gas(table_data, AML_AS_SYSTEM_MEMORY, 32, 0, 3,
634-
vms->memmap[VIRT_UART].base);
634+
vms->memmap[VIRT_UART0].base);
635635

636636
/* AddressSize[] */
637637
build_append_int_noprefix(table_data,
638-
vms->memmap[VIRT_UART].size, 4);
638+
vms->memmap[VIRT_UART0].size, 4);
639639

640640
/* NamespaceString[] */
641641
g_array_append_vals(table_data, name, namespace_length);
@@ -816,8 +816,12 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
816816
*/
817817
scope = aml_scope("\\_SB");
818818
acpi_dsdt_add_cpus(scope, vms);
819-
acpi_dsdt_add_uart(scope, &memmap[VIRT_UART],
820-
(irqmap[VIRT_UART] + ARM_SPI_BASE));
819+
acpi_dsdt_add_uart(scope, &memmap[VIRT_UART0],
820+
(irqmap[VIRT_UART0] + ARM_SPI_BASE), 0);
821+
if (vms->second_ns_uart_present) {
822+
acpi_dsdt_add_uart(scope, &memmap[VIRT_UART1],
823+
(irqmap[VIRT_UART1] + ARM_SPI_BASE), 1);
824+
}
821825
if (vmc->acpi_expose_flash) {
822826
acpi_dsdt_add_flash(scope, &memmap[VIRT_FLASH]);
823827
}

hw/arm/virt.c

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,11 @@ static const MemMapEntry base_memmap[] = {
165165
[VIRT_GIC_ITS] = { 0x08080000, 0x00020000 },
166166
/* This redistributor space allows up to 2*64kB*123 CPUs */
167167
[VIRT_GIC_REDIST] = { 0x080A0000, 0x00F60000 },
168-
[VIRT_UART] = { 0x09000000, 0x00001000 },
168+
[VIRT_UART0] = { 0x09000000, 0x00001000 },
169169
[VIRT_RTC] = { 0x09010000, 0x00001000 },
170170
[VIRT_FW_CFG] = { 0x09020000, 0x00000018 },
171171
[VIRT_GPIO] = { 0x09030000, 0x00001000 },
172-
[VIRT_SECURE_UART] = { 0x09040000, 0x00001000 },
172+
[VIRT_UART1] = { 0x09040000, 0x00001000 },
173173
[VIRT_SMMU] = { 0x09050000, 0x00020000 },
174174
[VIRT_PCDIMM_ACPI] = { 0x09070000, MEMORY_HOTPLUG_IO_LEN },
175175
[VIRT_ACPI_GED] = { 0x09080000, ACPI_GED_EVT_SEL_LEN },
@@ -212,11 +212,11 @@ static MemMapEntry extended_memmap[] = {
212212
};
213213

214214
static const int a15irqmap[] = {
215-
[VIRT_UART] = 1,
215+
[VIRT_UART0] = 1,
216216
[VIRT_RTC] = 2,
217217
[VIRT_PCIE] = 3, /* ... to 6 */
218218
[VIRT_GPIO] = 7,
219-
[VIRT_SECURE_UART] = 8,
219+
[VIRT_UART1] = 8,
220220
[VIRT_ACPI_GED] = 9,
221221
[VIRT_MMIO] = 16, /* ...to 16 + NUM_VIRTIO_TRANSPORTS - 1 */
222222
[VIRT_GIC_V2M] = 48, /* ...to 48 + NUM_GICV2M_SPIS - 1 */
@@ -271,6 +271,17 @@ static void create_fdt(VirtMachineState *vms)
271271
qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2);
272272
qemu_fdt_setprop_string(fdt, "/", "model", "linux,dummy-virt");
273273

274+
/*
275+
* For QEMU, all DMA is coherent. Advertising this in the root node
276+
* has two benefits:
277+
*
278+
* - It avoids potential bugs where we forget to mark a DMA
279+
* capable device as being dma-coherent
280+
* - It avoids spurious warnings from the Linux kernel about
281+
* devices which can't do DMA at all
282+
*/
283+
qemu_fdt_setprop(fdt, "/", "dma-coherent", NULL, 0);
284+
274285
/* /chosen must exist for load_dtb to fill in necessary properties later */
275286
qemu_fdt_add_subnode(fdt, "/chosen");
276287
if (vms->dtb_randomness) {
@@ -284,6 +295,8 @@ static void create_fdt(VirtMachineState *vms)
284295
}
285296
}
286297

298+
qemu_fdt_add_subnode(fdt, "/aliases");
299+
287300
/* Clock node, for the benefit of the UART. The kernel device tree
288301
* binding documentation claims the PL011 node clock properties are
289302
* optional but in practice if you omit them the kernel refuses to
@@ -904,7 +917,7 @@ static void create_gic(VirtMachineState *vms, MemoryRegion *mem)
904917
}
905918

906919
static void create_uart(const VirtMachineState *vms, int uart,
907-
MemoryRegion *mem, Chardev *chr)
920+
MemoryRegion *mem, Chardev *chr, bool secure)
908921
{
909922
char *nodename;
910923
hwaddr base = vms->memmap[uart].base;
@@ -937,9 +950,13 @@ static void create_uart(const VirtMachineState *vms, int uart,
937950
qemu_fdt_setprop(ms->fdt, nodename, "clock-names",
938951
clocknames, sizeof(clocknames));
939952

940-
if (uart == VIRT_UART) {
953+
if (uart == VIRT_UART0) {
941954
qemu_fdt_setprop_string(ms->fdt, "/chosen", "stdout-path", nodename);
955+
qemu_fdt_setprop_string(ms->fdt, "/aliases", "serial0", nodename);
942956
} else {
957+
qemu_fdt_setprop_string(ms->fdt, "/aliases", "serial1", nodename);
958+
}
959+
if (secure) {
943960
/* Mark as not usable by the normal world */
944961
qemu_fdt_setprop_string(ms->fdt, nodename, "status", "disabled");
945962
qemu_fdt_setprop_string(ms->fdt, nodename, "secure-status", "okay");
@@ -2313,11 +2330,41 @@ static void machvirt_init(MachineState *machine)
23132330

23142331
fdt_add_pmu_nodes(vms);
23152332

2316-
create_uart(vms, VIRT_UART, sysmem, serial_hd(0));
2333+
/*
2334+
* The first UART always exists. If the security extensions are
2335+
* enabled, the second UART also always exists. Otherwise, it only exists
2336+
* if a backend is configured explicitly via '-serial <backend>'.
2337+
* This avoids potentially breaking existing user setups that expect
2338+
* only one NonSecure UART to be present (for instance, older EDK2
2339+
* binaries).
2340+
*
2341+
* The nodes end up in the DTB in reverse order of creation, so we must
2342+
* create UART0 last to ensure it appears as the first node in the DTB,
2343+
* for compatibility with guest software that just iterates through the
2344+
* DTB to find the first UART, as older versions of EDK2 do.
2345+
* DTB readers that follow the spec, as Linux does, should honour the
2346+
* aliases node information and /chosen/stdout-path regardless of
2347+
* the order that nodes appear in the DTB.
2348+
*
2349+
* For similar back-compatibility reasons, if UART1 is the secure UART
2350+
* we create it second (and so it appears first in the DTB), because
2351+
* that's what QEMU has always done.
2352+
*/
2353+
if (!vms->secure) {
2354+
Chardev *serial1 = serial_hd(1);
2355+
2356+
if (serial1) {
2357+
vms->second_ns_uart_present = true;
2358+
create_uart(vms, VIRT_UART1, sysmem, serial1, false);
2359+
}
2360+
}
2361+
create_uart(vms, VIRT_UART0, sysmem, serial_hd(0), false);
2362+
if (vms->secure) {
2363+
create_uart(vms, VIRT_UART1, secure_sysmem, serial_hd(1), true);
2364+
}
23172365

23182366
if (vms->secure) {
23192367
create_secure_ram(vms, secure_sysmem, secure_tag_sysmem);
2320-
create_uart(vms, VIRT_SECURE_UART, secure_sysmem, serial_hd(1));
23212368
}
23222369

23232370
if (tag_sysmem) {

hw/arm/xilinx_zynq.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,11 @@ static void zynq_init(MachineState *machine)
252252
zynq_binfo.gic_cpu_if_addr = MPCORE_PERIPHBASE + 0x100;
253253
sysbus_create_varargs("l2x0", MPCORE_PERIPHBASE + 0x2000, NULL);
254254
for (n = 0; n < smp_cpus; n++) {
255+
/* See "hw/intc/arm_gic.h" for the IRQ line association */
255256
DeviceState *cpudev = DEVICE(zynq_machine->cpu[n]);
256-
sysbus_connect_irq(busdev, (2 * n) + 0,
257+
sysbus_connect_irq(busdev, n,
257258
qdev_get_gpio_in(cpudev, ARM_CPU_IRQ));
258-
sysbus_connect_irq(busdev, (2 * n) + 1,
259+
sysbus_connect_irq(busdev, smp_cpus + n,
259260
qdev_get_gpio_in(cpudev, ARM_CPU_FIQ));
260261
}
261262

hw/intc/gic_internal.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,8 @@ static inline void gic_set_active(GICState *s, int irq, int cpu)
280280

281281
static inline void gic_clear_active(GICState *s, int irq, int cpu)
282282
{
283+
unsigned int cm;
284+
283285
if (gic_is_vcpu(cpu)) {
284286
uint32_t *entry = gic_get_lr_entry(s, irq, cpu);
285287
GICH_LR_CLEAR_ACTIVE(*entry);
@@ -301,11 +303,13 @@ static inline void gic_clear_active(GICState *s, int irq, int cpu)
301303
* the GIC is secure.
302304
*/
303305
if (!s->security_extn || GIC_DIST_TEST_GROUP(phys_irq, 1 << rcpu)) {
304-
GIC_DIST_CLEAR_ACTIVE(phys_irq, 1 << rcpu);
306+
cm = phys_irq < GIC_INTERNAL ? 1 << rcpu : ALL_CPU_MASK;
307+
GIC_DIST_CLEAR_ACTIVE(phys_irq, cm);
305308
}
306309
}
307310
} else {
308-
GIC_DIST_CLEAR_ACTIVE(irq, 1 << cpu);
311+
cm = irq < GIC_INTERNAL ? 1 << cpu : ALL_CPU_MASK;
312+
GIC_DIST_CLEAR_ACTIVE(irq, cm);
309313
}
310314
}
311315

hw/misc/exynos4210_rng.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ static const MemoryRegionOps exynos4210_rng_ops = {
217217
.read = exynos4210_rng_read,
218218
.write = exynos4210_rng_write,
219219
.endianness = DEVICE_NATIVE_ENDIAN,
220+
.valid.min_access_size = 4,
221+
.valid.max_access_size = 4,
220222
};
221223

222224
static void exynos4210_rng_reset(DeviceState *dev)

hw/net/can/xlnx-versal-canfd.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1312,7 +1312,10 @@ static gint g_cmp_ids(gconstpointer data1, gconstpointer data2)
13121312
tx_ready_reg_info *tx_reg_1 = (tx_ready_reg_info *) data1;
13131313
tx_ready_reg_info *tx_reg_2 = (tx_ready_reg_info *) data2;
13141314

1315-
return tx_reg_1->can_id - tx_reg_2->can_id;
1315+
if (tx_reg_1->can_id == tx_reg_2->can_id) {
1316+
return (tx_reg_1->reg_num < tx_reg_2->reg_num) ? -1 : 1;
1317+
}
1318+
return (tx_reg_1->can_id < tx_reg_2->can_id) ? -1 : 1;
13161319
}
13171320

13181321
static void free_list(GSList *list)

hw/timer/a9gtimer.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "qemu/log.h"
3333
#include "qemu/module.h"
3434
#include "hw/core/cpu.h"
35+
#include "sysemu/qtest.h"
3536

3637
#ifndef A9_GTIMER_ERR_DEBUG
3738
#define A9_GTIMER_ERR_DEBUG 0
@@ -48,6 +49,10 @@
4849

4950
static inline int a9_gtimer_get_current_cpu(A9GTimerState *s)
5051
{
52+
if (qtest_enabled()) {
53+
return 0;
54+
}
55+
5156
if (current_cpu->cpu_index >= s->num_cpu) {
5257
hw_error("a9gtimer: num-cpu %d but this cpu is %d!\n",
5358
s->num_cpu, current_cpu->cpu_index);

0 commit comments

Comments
 (0)