Cucumber/Kernel/include/Tier0/smp.h

132 lines
2.7 KiB
C
Raw Normal View History

2011-08-28 11:01:47 +00:00
#ifndef __SMP_H__
#define __SMP_H__
2011-08-28 01:36:23 +00:00
#include "types.h"
2011-08-28 10:56:46 +00:00
// OS structures
typedef enum {
2011-08-28 11:01:47 +00:00
E_SMP_CPU_STATE_DISABLED,
E_SMP_CPU_STATE_HALTED,
E_SMP_CPU_STATE_IDLE,
E_SMP_CPU_STATE_RUNNING
} E_SMP_CPU_STATE;
2011-08-28 10:56:46 +00:00
typedef struct {
u8 ID;
u32 CPUID;
u8 LAPICID;
2011-08-28 11:01:47 +00:00
E_SMP_CPU_STATE State;
2011-08-28 10:56:46 +00:00
u8 Bootstrap : 1;
2011-08-28 11:01:47 +00:00
} T_SMP_CPU;
2011-08-28 10:56:46 +00:00
2011-08-28 11:19:12 +00:00
typedef struct {
u8 ID;
u32 Address;
} T_SMP_IOAPIC;
2011-08-28 10:56:46 +00:00
// BIOS-provided Structures
2011-08-28 01:36:23 +00:00
typedef struct {
s8 Signature[4];
u32 TablePhysical;
u8 Length;
u8 Specification;
u8 Checksum;
2011-08-28 11:01:47 +00:00
} __attribute__((packed)) T_SMP_POINTER;
2011-08-28 01:36:23 +00:00
2011-08-28 02:30:57 +00:00
typedef struct {
u8 Signature[4];
u16 BaseTableLength;
u8 Specification;
u8 Checksum;
u8 OEMName[8];
u8 ProductName[12];
u32 OEMTablePointer;
u16 OEMTableSize;
u16 NumEntries;
u32 LAPICAddress;
u16 ExtendedTableLength;
u8 ExtendedTableChecksum;
u8 Reserved;
2011-08-28 11:01:47 +00:00
} __attribute__((packed)) T_SMP_CONFIGURATION_HEADER;
2011-08-28 02:30:57 +00:00
typedef struct {
u8 EntryType;
u8 LAPICID;
u8 LAPICVersion;
u8 FlagAvailable : 1;
u8 FlagBootstrap : 1;
u8 FlagReserved : 6;
u32 Signature;
u32 CPUID;
u32 Reserved1;
u32 Reserved2;
2011-08-28 11:01:47 +00:00
} __attribute__((packed)) T_SMP_ENTRY_CPU;
2011-08-28 02:30:57 +00:00
2011-08-28 11:19:12 +00:00
typedef struct {
u8 EntryType;
u8 BusID;
u8 BusType[6];
} __attribute__((packed)) T_SMP_ENTRY_BUS;
typedef struct {
u8 EntryType;
u8 ID;
u8 Version;
u8 Available : 1;
u8 Reserved : 7;
u32 Address;
} __attribute__((packed)) T_SMP_ENTRY_IOAPIC;
2011-08-28 16:06:40 +00:00
typedef enum {
E_SMP_INTERRUPT_TYPE_INT = 0,
E_SMP_INTERRUPT_TYPE_NMI = 1,
E_SMP_INTERRUPT_TYPE_SMI = 2,
E_SMP_INTERRUPT_TYPE_ExtINT = 3
} E_SMP_INTERRUPT_TYPE;
typedef enum {
E_SMP_POLARITY_BUS = 0,
E_SMP_POLARITY_HIGH = 1,
E_SMP_POLARITY_RESERVED = 2,
E_SMP_POLARITY_LOW = 3
} E_SMP_POLARITY;
typedef enum {
E_SMP_TRIGGER_MODE_BUS = 0,
E_SMP_TRIGGER_MODE_EDGE = 1,
E_SMP_TRIGGER_MODE_RESERVED = 2,
E_SMP_TRIGGER_MODE_LEVEL = 3
} E_SMP_TRIGGER_MODE;
typedef struct {
u8 EntryType;
E_SMP_INTERRUPT_TYPE InterruptType : 8;
E_SMP_POLARITY Polarity : 2;
E_SMP_TRIGGER_MODE TriggerMode : 2;
u16 Reserved : 12;
u8 SourceBusID;
u8 SourceBusIRQ;
u8 DestinationIOAPICID;
u8 DestinationIOAPICINTIN;
} __attribute__((packed)) T_SMP_ENTRY_IO_INTERRUPT;
typedef struct {
u8 EntryType;
E_SMP_INTERRUPT_TYPE InterruptType : 8; //hack?
E_SMP_POLARITY Polarity : 2;
E_SMP_TRIGGER_MODE TriggerMode : 2;
u16 Reserved : 12;
u8 SourceBusID;
u8 SourceBusIRQ;
u8 DestinationLAPICID;
u8 DestinationLAPICLINTIN;
} __attribute__((packed)) T_SMP_ENTRY_LOCAL_INTERRUPT;
2011-08-28 11:01:47 +00:00
u64 smp_find_pointer(u64 Start, u64 End);
void smp_initialize(void);
void smp_parse_configuration_table(u32 TableAddress);
2011-08-28 01:36:23 +00:00
#endif