lkml.org 
[lkml]   [2023]   [Feb]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 6/6] x86/hyperv: Fix serial console interrupts for TDX guests
    Date
    When a TDX guest runs on Hyper-V, the UEFI firmware sets the HW_REDUCED
    flag, and consequently ttyS0 interrupts can't work. Fix the issue by
    overriding x86_init.acpi.reduced_hw_early_init().

    Signed-off-by: Dexuan Cui <decui@microsoft.com>

    ---

    This patch appears in the patchset for the first time.

    arch/x86/kernel/cpu/mshyperv.c | 22 ++++++++++++++++++++++
    1 file changed, 22 insertions(+)

    diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
    index 6a57af60ec9f..26490bc5a060 100644
    --- a/arch/x86/kernel/cpu/mshyperv.c
    +++ b/arch/x86/kernel/cpu/mshyperv.c
    @@ -253,6 +253,26 @@ static void __init hv_smp_prepare_cpus(unsigned int max_cpus)
    }
    #endif

    +/*
    + * When a TDX guest runs on Hyper-V, the firmware sets the HW_REDUCED flag: see
    + * acpi_tb_create_local_fadt(). Consequently ttyS0 interrupts can't work because
    + * request_irq() -> ... -> irq_to_desc() returns NULL for ttyS0. This happens
    + * because mp_config_acpi_legacy_irqs() sees a nr_legacy_irqs() of 0, so it
    + * doesn't initialize the array 'mp_irqs[]', and later setup_IO_APIC_irqs() ->
    + * find_irq_entry() fails to find the legacy irqs from the array, and hence
    + * doesn't create the necessary irq description info.
    + *
    + * Copy arch/x86/kernel/acpi/boot.c: acpi_generic_reduced_hw_init() but doesn't
    + * change 'legacy_pic', so it keeps its default value 'default_legacy_pic' in
    + * mp_config_acpi_legacy_irqs(), which sees a non-zero nr_legacy_irqs(), and
    + * eventually serial console interrupts can work properly.
    + */
    +static void __init reduced_hw_init(void)
    +{
    + x86_init.timers.timer_init = x86_init_noop;
    + x86_init.irqs.pre_vector_init = x86_init_noop;
    +}
    +
    static void __init ms_hyperv_init_platform(void)
    {
    int hv_max_functions_eax;
    @@ -367,6 +387,8 @@ static void __init ms_hyperv_init_platform(void)

    /* A TDX VM must use x2APIC and doesn't use lazy EOI */
    ms_hyperv.hints &= ~HV_X64_APIC_ACCESS_RECOMMENDED;
    +
    + x86_init.acpi.reduced_hw_early_init = reduced_hw_init;
    }
    }

    --
    2.25.1
    \
     
     \ /
      Last update: 2023-03-27 00:11    [W:4.120 / U:0.948 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site