/* ----------------------------------------------------------------------- * * * Copyright 2009-2011 Erwan Velu - All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, Inc., 53 Temple Place Ste 330, * Boston MA 02111-1307, USA; either version 2 of the License, or * (at your option) any later version; incorporated herein by reference. * * ----------------------------------------------------------------------- */ #ifndef MADT_H #define MADT_H #include <inttypes.h> #include <stdbool.h> #define MADT "MADT" #define APIC "APIC" enum { PROCESSOR_LOCAL_APIC = 0, IO_APIC = 1, INTERRUPT_SOURCE_OVERRIDE = 2, NMI = 3, LOCAL_APIC_NMI_STRUCTURE = 4, LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE = 5, IO_SAPIC = 6, LOCAL_SAPIC = 7, PLATEFORM_INTERRUPT_SOURCES = 8 }; /* Features flags for * - processor_local_apic flags * - local sapic flags */ #define PROCESSOR_LOCAL_APIC_ENABLE 1 #define MAX_S_L_P 255 typedef struct { uint8_t type; uint8_t length; uint8_t acpi_id; uint8_t apic_id; uint32_t flags; } __attribute__ ((packed)) s_processor_local_apic; #define MAX_IO_APIC 255 typedef struct { uint8_t type; uint8_t length; uint8_t io_apic_id; uint8_t reserved; uint32_t io_apic_address; uint32_t global_system_interrupt_base; } __attribute__ ((packed)) s_io_apic; /* Features flags for * - interrupt_source_override * - nmi */ /* Bits 1&2 must be set to 0 */ #define POLARITY_CONFORM_MASK 0x0 #define POLARITY_ACTIVE_HIGH 0x1 #define POLARITY_RESERVED 0x2 #define POLARITY_ACTIVE_LOW 0x3 /* Bits 3&4 must be set to 0 */ #define TRIGGER_CONFORM_MASK 0x3 #define TRIGGER_EDGE 0x4 #define TRIGGER_RESERVED 0x8 #define TRIGGER_LEVEL 0xA #define MAX_I_S_O 255 typedef struct { uint8_t type; uint8_t length; uint8_t bus; uint8_t source; uint32_t global_system_interrupt; uint16_t flags; } __attribute__ ((packed)) s_interrupt_source_override; typedef struct { uint8_t type; uint8_t length; uint8_t flags; uint32_t global_system_interrupt; } __attribute__ ((packed)) s_nmi; #define MAX_LOCAL_APIC_NMI 255 typedef struct { uint8_t type; uint8_t length; uint8_t acpi_processor_id; uint16_t flags; uint8_t local_apic_lint; } __attribute__ ((packed)) s_local_apic_nmi; #define MAX_L_A_A_O 255 typedef struct { uint8_t type; uint8_t length; uint16_t reserved; uint64_t local_apic_address; } __attribute__ ((packed)) s_local_apic_address_override; #define MAX_IO_SAPIC 255 typedef struct { uint8_t type; uint8_t length; uint8_t io_apic_id; uint8_t reserved; uint32_t global_system_interrupt_base; uint64_t io_sapic_address; } __attribute__ ((packed)) s_io_sapic; #define ACPI_PROCESSOR_UID_STRING_OFFSET 16 #define MAX_LOCAL_SAPIC 255 typedef struct { uint8_t type; uint8_t length; uint8_t acpi_processor_id; uint8_t local_sapic_id; uint8_t local_sapic_eid; uint8_t reserved[3]; uint32_t flags; uint32_t acpi_processor_uid_value; char *acpi_processor_uid_string; } __attribute__ ((packed)) s_local_sapic; typedef struct { uint64_t *address; s_acpi_description_header header; uint32_t local_apic_address; uint32_t flags; s_processor_local_apic processor_local_apic[MAX_S_L_P]; uint8_t processor_local_apic_count; s_io_apic io_apic[MAX_IO_APIC]; uint8_t io_apic_count; s_interrupt_source_override interrupt_source_override[MAX_I_S_O]; uint8_t interrupt_source_override_count; s_nmi nmi[MAX_I_S_O]; uint8_t nmi_count; s_local_apic_nmi local_apic_nmi[MAX_LOCAL_APIC_NMI]; uint8_t local_apic_nmi_count; s_local_apic_address_override local_apic_address_override[MAX_L_A_A_O]; uint8_t local_apic_address_override_count; s_io_sapic io_sapic[MAX_IO_SAPIC]; uint8_t io_sapic_count; s_local_sapic local_sapic[MAX_LOCAL_SAPIC]; uint8_t local_sapic_count; bool valid; } s_madt; void print_madt(s_madt * madt); #endif