From 7b29897efb400030c4e21777281d9fe673194ac7 Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Tue, 4 Jun 2024 21:04:09 +0200 Subject: [PATCH] Initialize ACPI Timer --- sdk/xtdk/hltypes.h | 16 +++++++++++++- xtoskrnl/hl/acpi.c | 44 +++++++++++++++++++++++++++++++++++++ xtoskrnl/hl/globals.c | 3 +++ xtoskrnl/includes/globals.h | 3 +++ xtoskrnl/includes/hli.h | 4 ++++ 5 files changed, 69 insertions(+), 1 deletion(-) diff --git a/sdk/xtdk/hltypes.h b/sdk/xtdk/hltypes.h index da6fa9e..fcee4e7 100644 --- a/sdk/xtdk/hltypes.h +++ b/sdk/xtdk/hltypes.h @@ -59,6 +59,13 @@ #define ACPI_WSMT_SIGNATURE 0x544D5357 /* Windows SMM Security Mitigation Table */ #define ACPI_XSDT_SIGNATURE 0x54445358 /* eXtended System Descriptor Table */ +/* ACPI FADT flags masks */ +#define ACPI_FADT_32BIT_TIMER (1<<8) + +/* ACPI Timer bit masks */ +#define ACPI_FADT_TIMER_32BIT 0x80000000 +#define ACPI_FADT_TIMER_24BIT 0x00800000 + /* Default serial port settings */ #define COMPORT_CLOCK_RATE 0x1C200 #define COMPORT_WAIT_TIMEOUT 204800 @@ -205,7 +212,7 @@ typedef struct _ACPI_DESCRIPTION_HEADER ULONG CreatorRev; } ACPI_DESCRIPTION_HEADER, *PACPI_DESCRIPTION_HEADER; -/* ACPI cache list */ +/* ACPI cache list structure */ typedef struct _ACPI_CACHE_LIST { LIST_ENTRY ListEntry; @@ -300,6 +307,13 @@ typedef struct _ACPI_FADT GENERIC_ADDRESS SleepStatusReg; } ACPI_FADT, *PACPI_FADT; +/* ACPI Timer information structure */ +typedef struct _ACPI_TIMER_INFO +{ + ULONG TimerPort; + ULONG MsbMask; +} ACPI_TIMER_INFO, *PACPI_TIMER_INFO; + /* Serial (COM) port initial state */ typedef struct _CPPORT { diff --git a/xtoskrnl/hl/acpi.c b/xtoskrnl/hl/acpi.c index 0ccd0c7..028eca4 100644 --- a/xtoskrnl/hl/acpi.c +++ b/xtoskrnl/hl/acpi.c @@ -121,6 +121,9 @@ HlpInitializeAcpi(VOID) return STATUS_NOT_FOUND; } + /* Initialize ACPI timer */ + HlpInitializeAcpiTimer(); + /* Return success */ return STATUS_SUCCESS; } @@ -251,6 +254,47 @@ HlpInitializeAcpiSystemDescriptionTable(OUT PACPI_DESCRIPTION_HEADER *AcpiTable) return STATUS_SUCCESS; } +/** + * Initializes the ACPI Timer. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTAPI +XTSTATUS +HlpInitializeAcpiTimer(VOID) +{ + PACPI_FADT Fadt; + XTSTATUS Status; + + /* Get Fixed ACPI Description Table (FADT) */ + Status = HlGetAcpiTable(ACPI_FADT_SIGNATURE, (PACPI_DESCRIPTION_HEADER*)&Fadt); + if(Status != STATUS_SUCCESS || !Fadt) + { + /* Failed to get FADT, return error */ + return STATUS_NOT_FOUND; + } + + /* Set ACPI timer port address */ + HlpAcpiTimerInfo.TimerPort = Fadt->PmTmrBlkIoPort; + + /* Determine whether 32-bit or 24-bit timer is used */ + if(Fadt->Flags & ACPI_FADT_32BIT_TIMER) + { + /* 32-bit timer */ + HlpAcpiTimerInfo.MsbMask = ACPI_FADT_TIMER_32BIT; + } + else + { + /* 24-bit timer */ + HlpAcpiTimerInfo.MsbMask = ACPI_FADT_TIMER_24BIT; + } + + /* Return success */ + return STATUS_SUCCESS; +} + /** * Queries kernel local ACPI cache in attempt to find a requested ACPI table. * diff --git a/xtoskrnl/hl/globals.c b/xtoskrnl/hl/globals.c index 080df03..e7e45e8 100644 --- a/xtoskrnl/hl/globals.c +++ b/xtoskrnl/hl/globals.c @@ -15,6 +15,9 @@ LIST_ENTRY HlpAcpiCacheList; /* ACPI Root System Description Pointer (RSDP) */ PACPI_RSDP HlpAcpiRsdp; +/* ACPI timer information */ +ACPI_TIMER_INFO HlpAcpiTimerInfo; + /* Active processors count */ KAFFINITY HlpActiveProcessors; diff --git a/xtoskrnl/includes/globals.h b/xtoskrnl/includes/globals.h index 4b11faf..90b9dce 100644 --- a/xtoskrnl/includes/globals.h +++ b/xtoskrnl/includes/globals.h @@ -18,6 +18,9 @@ EXTERN LIST_ENTRY HlpAcpiCacheList; /* ACPI Root System Description Pointer (RSDP) */ EXTERN PACPI_RSDP HlpAcpiRsdp; +/* ACPI timer information */ +EXTERN ACPI_TIMER_INFO HlpAcpiTimerInfo; + /* Active processors count */ EXTERN KAFFINITY HlpActiveProcessors; diff --git a/xtoskrnl/includes/hli.h b/xtoskrnl/includes/hli.h index def5551..1ceecfc 100644 --- a/xtoskrnl/includes/hli.h +++ b/xtoskrnl/includes/hli.h @@ -95,6 +95,10 @@ XTAPI XTSTATUS HlpInitializeAcpiSystemDescriptionTable(OUT PACPI_DESCRIPTION_HEADER *AcpiTable); +XTAPI +XTSTATUS +HlpInitializeAcpiTimer(VOID); + XTAPI XTSTATUS HlpQueryAcpiCache(IN ULONG Signature,