/////////////////////////////////////////////////////////////////////////////// // // Microsoft Research Singularity // // Copyright (c) Microsoft Corporation. All rights reserved. // // File: AcpiTables.cs // // Note: // Pages 95-104 of ACPI 3.0 Spec. namespace Microsoft.Singularity.Hal.Acpi { using System; using Microsoft.Singularity.Io; public enum FadtFlags : uint { WBINVD = 1u << 0, WBINVD_FLUSH = 1u << 1, PROC_C1 = 1u << 2, P_LVL2_UP = 1u << 3, PWR_BUTTON = 1u << 4, SLP_BUTTON = 1u << 5, FIX_RTC = 1u << 6, RTC_S4 = 1u << 7, TMR_VAL_EXT = 1u << 8, DCK_CAP = 1u << 9, RESET_REG_SUP = 1u << 10, SEALED_CASE = 1u << 11, HEADLESS = 1u << 12, CPU_SW_SLP = 1u << 13, PCI_EXP_WAK = 1u << 14, USE_PLATFORM_CLOCK = 1u << 15, S4_RTC_STS_VALID = 1u << 16, REMOTE_POWER_ON_CAPABLE = 1u << 17, FORCE_APIC_CLUSTER_MODEL = 1u << 18, FORCE_APIC_PHYSICAL_DESTINATION_MODE = 1u << 19, }; public class Fadt { public const string Signature = "FACP"; private IoMemory region; private SystemTableHeader header; public Fadt(IoMemory region, SystemTableHeader header) { this.region = region; this.header = header; } private byte Read8(int offset) { return region.Read8(offset - (int) SystemTableHeader.Length); } private ushort Read16(int offset) { return region.Read16(offset - (int) SystemTableHeader.Length); } private uint Read32(int offset) { return region.Read32(offset - (int) SystemTableHeader.Length); } private ulong Read64(int offset) { return region.Read64(offset - (int) SystemTableHeader.Length); } private Gas ReadGas(int offset) { return new Gas(Read32(offset), Read64(offset + 4)); } // --- BEGIN GENERATED REGION --- public uint FIRMWARE_CTRL { get { return Read32(36); } } public uint DSDT { get { return Read32(40); } } public byte Preferred_PM_Profile { get { return Read8(45); } } public ushort SCI_INT { get { return Read16(46); } } public uint SMI_CMD { get { return Read32(48); } } public byte ACPI_ENABLE { get { return Read8(52); } } public byte ACPI_DISABLE { get { return Read8(53); } } public byte S4BIOS_REQ { get { return Read8(54); } } public byte PSTATE_CNT { get { return Read8(55); } } public uint PM1a_EVT_BLK { get { return Read32(56); } } public uint PM1b_EVT_BLK { get { return Read32(60); } } public uint PM1a_CNT_BLK { get { return Read32(64); } } public uint PM1b_CNT_BLK { get { return Read32(68); } } public uint PM2_CNT_BLK { get { return Read32(72); } } public uint PM_TMR_BLK { get { return Read32(76); } } public uint GPE0_BLK { get { return Read32(80); } } public uint GPE1_BLK { get { return Read32(84); } } public byte PM1_EVT_LEN { get { return Read8(88); } } public byte PM1_CNT_LEN { get { return Read8(89); } } public byte PM2_CNT_LEN { get { return Read8(90); } } public byte PM_TMR_LEN { get { return Read8(91); } } public byte GPE0_BLK_LEN { get { return Read8(92); } } public byte GPE1_BLK_LEN { get { return Read8(93); } } public byte GPE1_BASE { get { return Read8(94); } } public byte CST_CNT { get { return Read8(95); } } public ushort P_LVL2_LAT { get { return Read16(96); } } public ushort P_LVL3_LAT { get { return Read16(98); } } public ushort FLUSH_SIZE { get { return Read16(100); } } public ushort FLUSH_STRIDE { get { return Read16(102); } } public byte DUTY_OFFSET { get { return Read8(104); } } public byte DUTY_WIDTH { get { return Read8(105); } } public byte DAY_ALRM { get { return Read8(106); } } public byte MON_ALRM { get { return Read8(107); } } public byte CENTURY { get { return Read8(108); } } public ushort IAPC_BOOT_ARCH { get { return Read16(109); } } public uint Flags { get { return Read32(112); } } public Gas RESET_REG { get { return ReadGas(116); } } public byte RESET_VALUE { get { return Read8(128); } } public ulong X_FIRMWARE_CTRL { get { return Read64(132); } } public ulong X_DSDT { get { return Read64(140); } } public Gas X_PM1a_EVT_BLK { get { return ReadGas(148); } } public Gas X_PM1b_EVT_BLK { get { return ReadGas(160); } } public Gas X_PM1a_CNT_BLK { get { return ReadGas(172); } } public Gas X_PM1b_CNT_BLK { get { return ReadGas(184); } } public Gas X_PM2_CNT_BLK { get { return ReadGas(196); } } public Gas X_PM_TMR_BLK { get { return ReadGas(208); } } public Gas X_GPE0_BLK { get { return ReadGas(220); } } public Gas X_GPE1_BLK { get { return ReadGas(232); } } // --- END GENERATED REGION --- public static Fadt Create(SystemTableHeader header) { IoMemory region = IoMemory.MapPhysicalMemory(header.PostHeaderAddress, header.PostHeaderLength, true, false); int sum = (header.Checksum + AcpiChecksum.Compute(region)) & 0xff; if (sum != 0) { return null; } return new Fadt(region, header); } } }