Traverse Local x2APIC structures to find all processors
This commit is contained in:
parent
f36b59c961
commit
2f16f4f613
@ -68,15 +68,34 @@
|
||||
#define ACPI_FADT_TIMER_24BIT 0x00800000
|
||||
|
||||
/* ACPI MADT subtable type definitions */
|
||||
#define ACPI_MADT_LOCAL_APIC 0
|
||||
#define ACPI_MADT_IOAPIC 1
|
||||
#define ACPI_MADT_INT_OVERRIDE 2
|
||||
#define ACPI_MADT_NMI_SOURCE 3
|
||||
#define ACPI_MADT_LOCAL_NMI_SOURCE 4
|
||||
#define ACPI_MADT_ADDRESS_EXTENSION 5
|
||||
#define ACPI_MADT_IO_SAPIC 6
|
||||
#define ACPI_MADT_LOCAL_SAPIC 7
|
||||
#define ACPI_MADT_PLATFORM_INTERRUPT_SOURCE 8
|
||||
#define ACPI_MADT_TYPE_LOCAL_APIC 0
|
||||
#define ACPI_MADT_TYPE_IOAPIC 1
|
||||
#define ACPI_MADT_TYPE_INT_OVERRIDE 2
|
||||
#define ACPI_MADT_TYPE_NMI_SOURCE 3
|
||||
#define ACPI_MADT_TYPE_LOCAL_APIC_NMI 4
|
||||
#define ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE 5
|
||||
#define ACPI_MADT_TYPE_IO_SAPIC 6
|
||||
#define ACPI_MADT_TYPE_LOCAL_SAPIC 7
|
||||
#define ACPI_MADT_TYPE_INTERRUPT_SOURCE 8
|
||||
#define ACPI_MADT_TYPE_LOCAL_X2APIC 9
|
||||
#define ACPI_MADT_TYPE_LOCAL_X2APIC_NMI 10
|
||||
#define ACPI_MADT_TYPE_GENERIC_INTERRUPT 11
|
||||
#define ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR 12
|
||||
#define ACPI_MADT_TYPE_GENERIC_MSI_FRAME 13
|
||||
#define ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR 14
|
||||
#define ACPI_MADT_TYPE_GENERIC_TRANSLATOR 15
|
||||
#define ACPI_MADT_TYPE_MULTIPROC_WAKEUP 16
|
||||
#define ACPI_MADT_TYPE_CORE_PIC 17
|
||||
#define ACPI_MADT_TYPE_LIO_PIC 18
|
||||
#define ACPI_MADT_TYPE_HT_PIC 19
|
||||
#define ACPI_MADT_TYPE_EIO_PIC 20
|
||||
#define ACPI_MADT_TYPE_MSI_PIC 21
|
||||
#define ACPI_MADT_TYPE_BIO_PIC 22
|
||||
#define ACPI_MADT_TYPE_LPC_PIC 23
|
||||
#define ACPI_MADT_TYPE_RINTC 24
|
||||
#define ACPI_MADT_TYPE_IMSIC 25
|
||||
#define ACPI_MADT_TYPE_APLIC 26
|
||||
#define ACPI_MADT_TYPE_PLIC 27
|
||||
|
||||
/* ACPI MADT Processor Local APIC Flags */
|
||||
#define ACPI_MADT_PLACE_ENABLED 0 /* Processor Local APIC CPU Enabled */
|
||||
@ -296,13 +315,23 @@ typedef struct _ACPI_MADT
|
||||
} ACPI_MADT, *PACPI_MADT;
|
||||
|
||||
/* ACPI Local APIC MADT subtable structure */
|
||||
typedef struct _ACPI_MADT_TABLE_LOCAL_APIC
|
||||
typedef struct _ACPI_MADT_LOCAL_APIC
|
||||
{
|
||||
ACPI_SUBTABLE_HEADER Header;
|
||||
UCHAR ProcessorId;
|
||||
UCHAR Id;
|
||||
ULONG LapicFlags;
|
||||
} ACPI_MADT_TABLE_LOCAL_APIC, *PACPI_MADT_TABLE_LOCAL_APIC;
|
||||
} ACPI_MADT_LOCAL_APIC, *PACPI_MADT_LOCAL_APIC;
|
||||
|
||||
/* ACPI Local X2APIC MADT subtable structure */
|
||||
typedef struct _ACPI_MADT_LOCAL_X2APIC
|
||||
{
|
||||
ACPI_SUBTABLE_HEADER Header;
|
||||
USHORT Reserved;
|
||||
ULONG Id;
|
||||
ULONG LapicFlags;
|
||||
ULONG ProcessorId;
|
||||
} ACPI_MADT_LOCAL_X2APIC, *PACPI_MADT_LOCAL_X2APIC;
|
||||
|
||||
/* ACPI System Information structure */
|
||||
typedef struct _ACPI_SYSTEM_INFO
|
||||
|
@ -289,18 +289,31 @@ HlpInitializeAcpiSystemInformation(VOID)
|
||||
while(MadtTable <= ((PUCHAR)Madt + Madt->Header.Length))
|
||||
{
|
||||
/* Check if this is a local APIC subtable */
|
||||
if((((PACPI_MADT_TABLE_LOCAL_APIC)MadtTable)->Header.Type == ACPI_MADT_LOCAL_APIC) &&
|
||||
(((PACPI_MADT_TABLE_LOCAL_APIC)MadtTable)->Header.Length == sizeof(ACPI_MADT_TABLE_LOCAL_APIC)))
|
||||
if((((PACPI_MADT_LOCAL_APIC)MadtTable)->Header.Type == ACPI_MADT_TYPE_LOCAL_APIC) &&
|
||||
(((PACPI_MADT_LOCAL_APIC)MadtTable)->Header.Length == sizeof(ACPI_MADT_LOCAL_APIC)))
|
||||
{
|
||||
/* Make sure, this CPU can be enabled */
|
||||
if(((PACPI_MADT_TABLE_LOCAL_APIC)MadtTable)->LapicFlags & ACPI_MADT_PLAOC_ENABLED)
|
||||
if(((PACPI_MADT_LOCAL_APIC)MadtTable)->LapicFlags & ACPI_MADT_PLAOC_ENABLED)
|
||||
{
|
||||
/* Increment number of CPUs */
|
||||
CpuCount++;
|
||||
}
|
||||
|
||||
/* Go to the next MADT table */
|
||||
MadtTable += ((PACPI_MADT_TABLE_LOCAL_APIC)MadtTable)->Header.Length;
|
||||
MadtTable += ((PACPI_MADT_LOCAL_APIC)MadtTable)->Header.Length;
|
||||
}
|
||||
else if((((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Header.Type == ACPI_MADT_TYPE_LOCAL_X2APIC) &&
|
||||
(((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Header.Length == sizeof(ACPI_MADT_LOCAL_X2APIC)))
|
||||
{
|
||||
/* Make sure, this CPU can be enabled */
|
||||
if(((PACPI_MADT_LOCAL_X2APIC)MadtTable)->LapicFlags & ACPI_MADT_PLAOC_ENABLED)
|
||||
{
|
||||
/* Increment number of CPUs */
|
||||
CpuCount++;
|
||||
}
|
||||
|
||||
/* Go to the next MADT table */
|
||||
MadtTable += ((PACPI_MADT_LOCAL_X2APIC)MadtTable)->Header.Length;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user