cosmopolitan/libc/irq/acpi.internal.h
tkchia eea601f346
[metal] Some minor fixes and tweaks (#933)
* [metal] Ensure DF is clear when calling C from exception handler
* [metal] Mark some internal routines and declarations as `@internal`
* [metal] Fix crash under UEFI when command line string is NULL
* [metal] Fix argc & argv[] setting, & VM page freeing, for UEFI

Part of the memory occupied by the argv[] contents was
erroneously used for page tables & then later erroneously
freed.  The symptom was that argv[0] would show up as an
empty string ("").
2023-11-14 15:26:59 -08:00

237 lines
5.8 KiB
C

#ifndef COSMOPOLITAN_LIBC_IRQ_ACPI_INTERNAL_H_
#define COSMOPOLITAN_LIBC_IRQ_ACPI_INTERNAL_H_
#include "libc/intrin/bits.h"
#include "libc/intrin/kprintf.h"
#include "libc/log/color.internal.h"
/**
* @internal
* @fileoverview Declarations for bare metal code to interact with ACPI
*
* @see UEFI Forum, Inc. Advanced Configuration and Power Interface (ACPI)
* Specification, Version 6.5, 2022. https://uefi.org/specifications
* @see Intel Corporation. ACPI Component Architecture: User Guide and
* Programmer Reference, Revision 6.2, 2017. https://acpica.org
*/
/**
* @internal
* AcpiStatus values.
*/
#define kAcpiOk 0x0000
#define kAcpiExNotFound 0x0005
#define kAcpiExBadHeader 0x2002
#define kAcpiExBadChecksum 0x2003
/**
* @internal
* Flags for AcpiTableMadt::Flags.
*/
#define kAcpiMadtPcAtCompat 0x0001
/**
* @internal
* Flags for AcpiTableFadt::BootFlags.
*/
#define kAcpiFadtLegacyDevices 0x0001
#define kAcpiFadt8042 0x0002
#define kAcpiFadtNoVga 0x0004
#define kAcpiFadtNoMsi 0x0008
#define kAcpiFadtNoAspm 0x0010
#define kAcpiFadtNoCmosRtc 0x0020
/**
* @internal
* Values for AcpiSubtableHeader::Type under an AcpiTableMadt.
*/
#define kAcpiMadtLocalApic 0
#define kAcpiMadtIoApic 1
#define kAcpiMadtIntOverride 2
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
/**
* @internal
* Structure of an ACPI Root System Description Pointer (RSDP) table. This
* points to either an RSDT, or an XSDT, or both.
*/
typedef struct {
uint8_t Signature[8];
uint8_t Checksum;
uint8_t OemId[6];
uint8_t Revision;
uint32_t RsdtPhysicalAddress;
uint32_t Length;
uint64_t XsdtPhysicalAddress;
uint8_t ExtendedChecksum;
uint8_t Reserved[3];
} AcpiTableRsdp;
/**
* @internal
* Structure of a System Description Table Header, which appears at the
* beginning of each ACPI system description table.
*/
typedef struct thatispacked {
uint8_t Signature[4];
uint32_t Length;
uint8_t Revision;
uint8_t Checksum;
uint8_t OemId[6];
uint8_t OemTableId[8];
uint32_t OemRevision;
uint8_t AslCompilerId[4];
uint32_t AslCompilerRevision;
} AcpiTableHeader;
/**
* @internal
* ACPI Root System Description Table (RSDT) structure.
*/
typedef struct thatispacked {
AcpiTableHeader Header;
uint32_t TableOffsetEntry[];
} AcpiTableRsdt;
/**
* @internal
* ACPI Extended System Description Table (XSDT) structure.
*/
typedef struct thatispacked {
AcpiTableHeader Header;
uint64_t TableOffsetEntry[];
} AcpiTableXsdt;
typedef struct thatispacked {
uint8_t SpaceId;
uint8_t BitWidth;
uint8_t BitOffset;
uint8_t AccessWidth;
uint64_t Address;
} AcpiGenericAddress;
typedef struct thatispacked {
uint8_t Type;
uint8_t Length;
} AcpiSubtableHeader;
typedef struct thatispacked {
AcpiSubtableHeader Header;
uint8_t Id;
uint8_t Reserved;
uint32_t Address;
uint32_t GlobalIrqBase;
} AcpiMadtIoApic;
/**
* @internal
* ACPI Multiple APIC Description Table (MADT) structure.
*/
typedef struct thatispacked {
AcpiTableHeader Header;
uint32_t Address; /* local APIC address */
uint32_t Flags; /* multiple APIC flags */
char Subtable[]; /* ...interrupt controller structures... */
} AcpiTableMadt;
/**
* @internal
* Fixed ACPI Description Table (FADT) structure.
*/
typedef struct thatispacked {
AcpiTableHeader Header;
uint32_t Facs;
uint32_t Dsdt;
uint8_t Model;
uint8_t PreferredProfile;
uint16_t SciInterrupt;
uint32_t SmiCommand;
uint8_t AcpiEnable;
uint8_t AcpiDisable;
uint8_t S4BiosRequest;
uint8_t PstateControl;
uint32_t Pm1aEventBlock;
uint32_t Pm1bEventBlock;
uint32_t Pm1aControlBlock;
uint32_t Pm1bControlBlock;
uint32_t Pm2ControlBlock;
uint32_t PmTimerBlock;
uint32_t Gpe0Block;
uint32_t Gpe1Block;
uint8_t Pm1EventLength;
uint8_t Pm1ControlLength;
uint8_t Pm2ControlLength;
uint8_t PmTimerLength;
uint8_t Gpe0BlockLength;
uint8_t Gpe1BlockLength;
uint8_t Gpe1Base;
uint8_t CstControl;
uint16_t C2Latency;
uint16_t C3Latency;
uint16_t FlushSize;
uint16_t FlushStride;
uint8_t DutyOffset;
uint8_t DutyWidth;
uint8_t DayAlarm;
uint8_t MonthAlarm;
uint8_t Century;
uint16_t BootFlags;
uint8_t Reserved;
uint32_t Flags;
AcpiGenericAddress ResetRegister;
uint8_t ResetValue;
uint16_t ArmBootFlags;
uint8_t MinorRevision;
uint64_t XFacs;
uint64_t XDsdt;
AcpiGenericAddress XPm1aEventBlock;
AcpiGenericAddress XPm1bEventBlock;
AcpiGenericAddress XPm1aControlBlock;
AcpiGenericAddress XPm1bControlBlock;
AcpiGenericAddress XPm2ControlBlock;
AcpiGenericAddress XPmTimerBlock;
AcpiGenericAddress XGpe0Block;
AcpiGenericAddress XGpe1Block;
AcpiGenericAddress SleepControl;
AcpiGenericAddress SleepStatus;
uint64_t HypervisorId;
} AcpiTableFadt;
/**
* @internal
* ACPI Differentiated System Description Table (DSDT) structure.
*/
typedef struct thatispacked {
AcpiTableHeader Header;
uint8_t Aml[];
} AcpiTableDsdt;
typedef uint32_t AcpiStatus;
extern size_t _AcpiXsdtNumEntries, _AcpiNumIoApics;
extern void **_AcpiXsdtEntries;
extern uint16_t _AcpiBootFlags;
extern uint32_t _AcpiMadtFlags;
extern const AcpiMadtIoApic **_AcpiIoApics;
extern void *_AcpiOsMapUncachedMemory(uintptr_t, size_t);
extern void *_AcpiOsAllocate(size_t);
extern void *_AcpiMapTable(uintptr_t);
extern AcpiStatus _AcpiGetTableImpl(uint32_t, uint32_t, void **);
forceinline bool _AcpiSuccess(AcpiStatus __sta) {
return __sta == kAcpiOk;
}
forceinline AcpiStatus _AcpiGetTable(const char __sig[4], uint32_t __inst,
void **__phdr) {
uint8_t __sig_copy[4] = { __sig[0], __sig[1], __sig[2], __sig[3] };
return _AcpiGetTableImpl(READ32LE(__sig_copy), __inst, __phdr);
}
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_IRQ_ACPI_INTERNAL_H_ */