Get system information based on the ACPI (currently only number of CPUs)

This commit is contained in:
Rafal Kupiec 2024-06-06 22:05:32 +02:00
parent 829fc49aac
commit 658cb2d3c8
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
5 changed files with 76 additions and 0 deletions

View File

@ -254,6 +254,65 @@ HlpInitializeAcpiSystemDescriptionTable(OUT PACPI_DESCRIPTION_HEADER *AcpiTable)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/**
* Initializes System Information structure based on the ACPI provided data.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTAPI
XTSTATUS
HlpInitializeAcpiSystemInformation(VOID)
{
PUCHAR MadtTable;
PACPI_MADT Madt;
XTSTATUS Status;
ULONG CpuCount;
/* Zero the ACPI system information structure */
RtlZeroMemory(&HlpAcpiSystemInfo, sizeof(ACPI_SYSTEM_INFO));
/* Get Multi-APIC Description Table (MADT) */
Status = HlGetAcpiTable(ACPI_MADT_SIGNATURE, (PACPI_DESCRIPTION_HEADER*)&Madt);
if(Status != STATUS_SUCCESS)
{
/* Failed to get MADT, return error */
return STATUS_NOT_FOUND;
}
/* Set APIC table traverse pointer and initialize number of CPUs */
MadtTable = (PUCHAR)Madt->ApicTables;
CpuCount = 0;
/* Traverse all MADT tables to get number of processors */
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)))
{
/* Make sure, this CPU can be enabled */
if(((PACPI_MADT_TABLE_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;
}
else
{
/* Any other MADT table, try to go to the next one byte-by-byte */
MadtTable += 1;
}
}
/* Return success */
return STATUS_SUCCESS;
}
/** /**
* Initializes the ACPI Timer. * Initializes the ACPI Timer.
* *

View File

@ -15,6 +15,9 @@ LIST_ENTRY HlpAcpiCacheList;
/* ACPI Root System Description Pointer (RSDP) */ /* ACPI Root System Description Pointer (RSDP) */
PACPI_RSDP HlpAcpiRsdp; PACPI_RSDP HlpAcpiRsdp;
/* ACPI system information */
ACPI_SYSTEM_INFO HlpAcpiSystemInfo;
/* ACPI timer information */ /* ACPI timer information */
ACPI_TIMER_INFO HlpAcpiTimerInfo; ACPI_TIMER_INFO HlpAcpiTimerInfo;

View File

@ -29,6 +29,13 @@ HlInitializeSystem(VOID)
return Status; return Status;
} }
/* Get system information from ACPI */
Status = HlpInitializeAcpiSystemInformation();
if(Status != STATUS_SUCCESS)
{
return Status;
}
/* Return success */ /* Return success */
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View File

@ -18,6 +18,9 @@ EXTERN LIST_ENTRY HlpAcpiCacheList;
/* ACPI Root System Description Pointer (RSDP) */ /* ACPI Root System Description Pointer (RSDP) */
EXTERN PACPI_RSDP HlpAcpiRsdp; EXTERN PACPI_RSDP HlpAcpiRsdp;
/* ACPI system information */
EXTERN ACPI_SYSTEM_INFO HlpAcpiSystemInfo;
/* ACPI timer information */ /* ACPI timer information */
EXTERN ACPI_TIMER_INFO HlpAcpiTimerInfo; EXTERN ACPI_TIMER_INFO HlpAcpiTimerInfo;

View File

@ -99,6 +99,10 @@ XTAPI
XTSTATUS XTSTATUS
HlpInitializeAcpiSystemDescriptionTable(OUT PACPI_DESCRIPTION_HEADER *AcpiTable); HlpInitializeAcpiSystemDescriptionTable(OUT PACPI_DESCRIPTION_HEADER *AcpiTable);
XTAPI
XTSTATUS
HlpInitializeAcpiSystemInformation(VOID);
XTAPI XTAPI
XTSTATUS XTSTATUS
HlpInitializeAcpiTimer(VOID); HlpInitializeAcpiTimer(VOID);