lkml.org 
[lkml]   [2023]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 4/9] x86/hyperv: Fix serial console interrupts for fully enlightened TDX guests
    Date
    When a fully enlightened 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().

    Reviewed-by: Michael Kelley <mikelley@microsoft.com>
    Signed-off-by: Dexuan Cui <decui@microsoft.com>
    ---

    Changes in v2: None

    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 2282f91716100..14baa288b1935 100644
    --- a/arch/x86/kernel/cpu/mshyperv.c
    +++ b/arch/x86/kernel/cpu/mshyperv.c
    @@ -323,6 +323,26 @@ static void __init hv_smp_prepare_cpus(unsigned int max_cpus)
    }
    #endif

    +/*
    + * When a fully enlightened TDX VM runs on Hyper-V, the firmware sets the
    + * HW_REDUCED flag: refer to 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.
    + *
    + * Clone arch/x86/kernel/acpi/boot.c: acpi_generic_reduced_hw_init() here,
    + * except don't change 'legacy_pic', which keeps its default value
    + * 'default_legacy_pic'. This way, mp_config_acpi_legacy_irqs() sees a non-zero
    + * nr_legacy_irqs() and eventually serial console interrupts works 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;
    @@ -441,6 +461,8 @@ static void __init ms_hyperv_init_platform(void)

    /* Don't trust Hyper-V's TLB-flushing hypercalls. */
    ms_hyperv.hints &= ~HV_X64_REMOTE_TLB_FLUSH_RECOMMENDED;
    +
    + x86_init.acpi.reduced_hw_early_init = reduced_hw_init;
    }
    }
    }
    --
    2.25.1
    \
     
     \ /
      Last update: 2023-08-20 22:34    [W:5.007 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site