mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
hw/arm/virt: Wire up non-secure EL2 virtual timer IRQ
Armv8.1+ CPUs have the Virtual Host Extension (VHE) which adds a non-secure EL2 virtual timer. We implemented the timer itself in the CPU model, but never wired up its IRQ line to the GIC. Wire up the IRQ line (this is always safe whether the CPU has the interrupt or not, since it always creates the outbound IRQ line). Report it to the guest via dtb and ACPI if the CPU has the feature. The DTB binding is documented in the kernel's Documentation/devicetree/bindings/timer/arm\,arch_timer.yaml and the ACPI table entries are documented in the ACPI specification version 6.3 or later. Because the IRQ line ACPI binding is new in 6.3, we need to bump the FADT table rev to show that we might be using 6.3 features. Note that exposing this IRQ in the DTB will trigger a bug in EDK2 versions prior to edk2-stable202311, for users who use the virt board with 'virtualization=on' to enable EL2 emulation and are booting an EDK2 guest BIOS, if that EDK2 has assertions enabled. The effect is that EDK2 will assert on bootup: ASSERT [ArmTimerDxe] /home/kraxel/projects/qemu/roms/edk2/ArmVirtPkg/Library/ArmVirtTimerFdtClientLib/ArmVirtTimerFdtClientLib.c(72): PropSize == 36 || PropSize == 48 If you see that assertion you should do one of: * update your EDK2 binaries to edk2-stable202311 or newer * use the 'virt-8.2' versioned machine type * not use 'virtualization=on' (The versions shipped with QEMU itself have the fix.) Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Ard Biesheuvel <ardb@kernel.org> Message-id: 20240122143537.233498-3-peter.maydell@linaro.org
This commit is contained in:
parent
6c1c2e912f
commit
1ec896fe7c
3 changed files with 67 additions and 15 deletions
|
@ -533,8 +533,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
|||
}
|
||||
|
||||
/*
|
||||
* ACPI spec, Revision 5.1
|
||||
* 5.2.24 Generic Timer Description Table (GTDT)
|
||||
* ACPI spec, Revision 6.5
|
||||
* 5.2.25 Generic Timer Description Table (GTDT)
|
||||
*/
|
||||
static void
|
||||
build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
|
@ -548,7 +548,7 @@ build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
|||
uint32_t irqflags = vmc->claim_edge_triggered_timers ?
|
||||
1 : /* Interrupt is Edge triggered */
|
||||
0; /* Interrupt is Level triggered */
|
||||
AcpiTable table = { .sig = "GTDT", .rev = 2, .oem_id = vms->oem_id,
|
||||
AcpiTable table = { .sig = "GTDT", .rev = 3, .oem_id = vms->oem_id,
|
||||
.oem_table_id = vms->oem_table_id };
|
||||
|
||||
acpi_table_begin(&table, table_data);
|
||||
|
@ -584,7 +584,15 @@ build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
|||
build_append_int_noprefix(table_data, 0, 4);
|
||||
/* Platform Timer Offset */
|
||||
build_append_int_noprefix(table_data, 0, 4);
|
||||
|
||||
if (vms->ns_el2_virt_timer_irq) {
|
||||
/* Virtual EL2 Timer GSIV */
|
||||
build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL2_VIRT_IRQ, 4);
|
||||
/* Virtual EL2 Timer Flags */
|
||||
build_append_int_noprefix(table_data, irqflags, 4);
|
||||
} else {
|
||||
build_append_int_noprefix(table_data, 0, 4);
|
||||
build_append_int_noprefix(table_data, 0, 4);
|
||||
}
|
||||
acpi_table_end(linker, &table);
|
||||
}
|
||||
|
||||
|
@ -771,10 +779,10 @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
|||
static void build_fadt_rev6(GArray *table_data, BIOSLinker *linker,
|
||||
VirtMachineState *vms, unsigned dsdt_tbl_offset)
|
||||
{
|
||||
/* ACPI v6.0 */
|
||||
/* ACPI v6.3 */
|
||||
AcpiFadtData fadt = {
|
||||
.rev = 6,
|
||||
.minor_ver = 0,
|
||||
.minor_ver = 3,
|
||||
.flags = 1 << ACPI_FADT_F_HW_REDUCED_ACPI,
|
||||
.xdsdt_tbl_offset = &dsdt_tbl_offset,
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue