mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
eea601f346
* [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 ("").
237 lines
5.8 KiB
C
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_ */
|