[SeaBIOS] [PATCH 1/2] seabios: Add Local APIC NMI Structure to ACPI MADT

Kenji Kaneshige kaneshige.kenji at jp.fujitsu.com
Fri Oct 28 14:08:18 CEST 2011


Avi, Jan,

Could you comment on these patches?

Inject-NMI doesn't work on Windows guest without these patches. Windows seems
to setup LVT based on ACPI NMI structure information which is missing in current
seabios. LVT LINT1 are never unmasked by Windows guest without the patches.

Those patches were already reviewed by seabios people, but need ack from qemu/kvm
side.

Regards,
Kenji Kaneshige



(2011/10/10 15:06), Lai Jiangshan wrote:
> From: Kenji Kaneshige<kaneshige.kenji at jp.fujitsu.com>
> 
> ACPI NMI Structure describes LINT pin (LINT0 or LINT1) information to
> which NMI is connected, and it is needed by OS to initialize local APIC.
> 
> Signed-off-by: Kenji Kaneshige<kaneshige.kenji at jp.fujitsu.com>
> Reviewed-by: Lai Jiangshan<laijs at cn.fujitsu.com>
> ---
>   src/acpi.c |   22 ++++++++++++++++++++--
>   1 file changed, 20 insertions(+), 2 deletions(-)
> 
> Index: seabios/src/acpi.c
> ===================================================================
> --- seabios.orig/src/acpi.c
> +++ seabios/src/acpi.c
> @@ -134,6 +134,14 @@ struct madt_intsrcovr {
>       u16 flags;
>   } PACKED;
> 
> +struct madt_local_nmi {
> +    ACPI_SUB_HEADER_DEF
> +    u8  processor_id;           /* ACPI processor id */
> +    u16 flags;                  /* MPS INTI flags */
> +    u8  lint;                   /* Local APIC LINT# */
> +} PACKED;
> +
> +
>   /*
>    * ACPI 2.0 Generic Address Space definition.
>    */
> @@ -288,7 +296,9 @@ build_madt(void)
>       int madt_size = (sizeof(struct multiple_apic_table)
>                        + sizeof(struct madt_processor_apic) * MaxCountCPUs
>                        + sizeof(struct madt_io_apic)
> -                     + sizeof(struct madt_intsrcovr) * 16);
> +                     + sizeof(struct madt_intsrcovr) * 16
> +                     + sizeof(struct madt_local_nmi));
> +
>       struct multiple_apic_table *madt = malloc_high(madt_size);
>       if (!madt) {
>           warn_noalloc();
> @@ -340,7 +350,15 @@ build_madt(void)
>           intsrcovr++;
>       }
> 
> -    build_header((void*)madt, APIC_SIGNATURE, (void*)intsrcovr - (void*)madt, 1);
> +    struct madt_local_nmi *local_nmi = (void*)intsrcovr;
> +    local_nmi->type         = APIC_LOCAL_NMI;
> +    local_nmi->length       = sizeof(*local_nmi);
> +    local_nmi->processor_id = 0xff; /* all processors */
> +    local_nmi->flags        = 0;
> +    local_nmi->lint         = 1; /* LINT1 */
> +    local_nmi++;
> +
> +    build_header((void*)madt, APIC_SIGNATURE, (void*)local_nmi - (void*)madt, 1);
>       return madt;
>   }
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 




More information about the SeaBIOS mailing list