476 lines
12 KiB
C++
476 lines
12 KiB
C++
;/*
|
|
;++
|
|
;
|
|
; Copyright (c) 1992 Intel Corporation
|
|
; All rights reserved
|
|
;
|
|
; INTEL CORPORATION PROPRIETARY INFORMATION
|
|
;
|
|
; This software is supplied to Microsoft under the terms
|
|
; of a license agreement with Intel Corporation and may not be
|
|
; copied nor disclosed except in accordance with the terms
|
|
; of that agreement.
|
|
;
|
|
;
|
|
; Module Name:
|
|
;
|
|
; pcmp.inc
|
|
;
|
|
; Abstract:
|
|
;
|
|
; include file for PC+MP system.
|
|
;
|
|
; WARNING: This file is included by both ASM and C files.
|
|
;
|
|
; Author:
|
|
;
|
|
; Ron Mosgrove and Rajesh Shah (Intel) 30-July-1993
|
|
;
|
|
;--
|
|
;
|
|
|
|
if 0 ; Begin C only code */
|
|
|
|
#pragma pack(1)
|
|
|
|
//
|
|
// IMCR (Interrupt Mode Control Register) access definitions
|
|
//
|
|
#define ImcrDisableApic 0x00
|
|
#define ImcrEnableApic 0x01
|
|
#define ImcrRegPortAddr 0x22
|
|
#if defined(NEC_98)
|
|
#define ImcrDataPortAddr 0x700
|
|
#else // defined(NEC_98)
|
|
#define ImcrDataPortAddr 0x23
|
|
#endif // defined(NEC_98)
|
|
#define ImcrPort 0x70
|
|
|
|
// Physical location where the Extended BIOS Data Area segment adress is stored
|
|
#define EBDA_SEGMENT_PTR 0x40e
|
|
#define BASE_MEM_PTR 0x413
|
|
|
|
//
|
|
// The PC+MP configuration table Possible Entry Types
|
|
//
|
|
#define ENTRY_PROCESSOR 0
|
|
#define ENTRY_BUS 1
|
|
#define ENTRY_IOAPIC 2
|
|
#define ENTRY_INTI 3
|
|
#define ENTRY_LINTI 4
|
|
|
|
#define HEADER_SIZE 0x2c
|
|
|
|
// Number of default configurations for PC+MP version 1.1
|
|
#define NUM_DEFAULT_CONFIGS 7
|
|
|
|
//
|
|
// Processor Entry definitions
|
|
//
|
|
|
|
typedef struct _CPUIDENTIFIER {
|
|
ULONG Stepping : 4;
|
|
ULONG Model : 4;
|
|
ULONG Family : 4;
|
|
ULONG Reserved : 20;
|
|
} CPUIDENTIFIER, *PCPUIDENTIFIER;
|
|
|
|
//
|
|
// Bits used in the CpuFlags field of the Processor entry
|
|
//
|
|
#define CPU_DISABLED 0x0 // 1 Bit - CPU Disabled
|
|
#define CPU_ENABLED 0x1 // 1 Bit - CPU Enabled
|
|
#define BSP_CPU 0x2 // Bit #2 - CPU is BSP
|
|
|
|
//
|
|
// APIC Versions used by PC+MP systems - this is used in the
|
|
// Processor entries and the IoApic Entries
|
|
//
|
|
#define APIC_INTEGRATED 0x10 // 8 Bits-Apic Version Register
|
|
#define APIC_82489DX 0x0 // 8 Bits-Apic Version Register
|
|
|
|
typedef struct _PcMpProcessorEntry {
|
|
UCHAR EntryType;
|
|
UCHAR LocalApicId;
|
|
UCHAR LocalApicVersion;
|
|
UCHAR CpuFlags;
|
|
CPUIDENTIFIER CpuIdentification; // CPU Identification
|
|
ULONG FeatureFlags;
|
|
UCHAR Reserved[8];
|
|
} PCMPPROCESSOR , *PPCMPPROCESSOR;
|
|
|
|
//
|
|
// Bus Entry definitions
|
|
//
|
|
|
|
typedef struct _PcMpBusEntry {
|
|
UCHAR EntryType;
|
|
UCHAR BusId;
|
|
CHAR BusType[6];
|
|
} PCMPBUS, *PPCMPBUS;
|
|
|
|
//
|
|
// Io Apic Entry definitions
|
|
//
|
|
// Valid IoApicFlag values
|
|
//
|
|
#define IO_APIC_ENABLED 0x1
|
|
#define IO_APIC_DISABLED 0x0
|
|
|
|
//
|
|
// Default value for Io Apic ID.
|
|
//
|
|
#define IOUNIT_APIC_ID 0xE
|
|
|
|
typedef struct _PcMpIoApicEntry {
|
|
UCHAR EntryType;
|
|
UCHAR IoApicId;
|
|
UCHAR IoApicVersion;
|
|
UCHAR IoApicFlag;
|
|
PVOID IoApicAddress;
|
|
} PCMPIOAPIC, *PPCMPIOAPIC;
|
|
|
|
//
|
|
// Bits that define the Interrupt logically
|
|
//
|
|
typedef struct _PolarityAndLevel {
|
|
USHORT Polarity : 2;
|
|
USHORT Level : 2;
|
|
USHORT Reserved : 12;
|
|
} POLARITYANDLEVEL, *PPOLARITYANDLEVEL;
|
|
|
|
typedef struct _PcMpApicIntiEntry {
|
|
UCHAR EntryType;
|
|
UCHAR IntType;
|
|
POLARITYANDLEVEL Signal;
|
|
UCHAR SourceBusId;
|
|
UCHAR SourceBusIrq;
|
|
UCHAR IoApicId;
|
|
UCHAR IoApicInti;
|
|
} PCMPINTI, *PPCMPINTI;
|
|
|
|
//
|
|
// Local Apic Interrupt Entry definitions
|
|
//
|
|
typedef struct _PcMpLintiEntry {
|
|
UCHAR EntryType;
|
|
UCHAR IntType;
|
|
POLARITYANDLEVEL Signal;
|
|
UCHAR SourceBusId;
|
|
UCHAR SourceBusIrq;
|
|
UCHAR DestLocalApicId;
|
|
UCHAR DestLocalApicInti;
|
|
} PCMPLINTI, *PPCMPLINTI;
|
|
|
|
//
|
|
// The PC+MP table definition
|
|
//
|
|
|
|
struct PcMpTable {
|
|
//
|
|
// PC+MP config table HEADER part (HEADER_SIZE bytes long)
|
|
//
|
|
|
|
ULONG Signature; // Must contain "P","C","M","P"
|
|
USHORT TableLength; // Length including the header
|
|
UCHAR Revision; // Rev 1.0 == 1
|
|
UCHAR Checksum; // Entire table including checksum byte
|
|
CHAR OemId[8]; // OEM defined
|
|
CHAR OemProductId[12]; // OEM defined
|
|
PVOID OemTablePtr; // OEM specific data
|
|
USHORT OemTableSize; // length in bytes of the OEM table
|
|
USHORT NumOfEntries; // Number of entries in the data portion
|
|
PVOID LocalApicAddress; // Physical address of Local units
|
|
USHORT ExtTableLength; // Extension table size
|
|
UCHAR ExtTableChecksum; // Complete checksum including extension table
|
|
UCHAR Reserved; // Not Used
|
|
};
|
|
|
|
//
|
|
// PC+MP Signature used to verify the PC+MP table
|
|
// as valid
|
|
//
|
|
// "P"=50H,"C"=43H,"M"=4dH,"P"=50H
|
|
//
|
|
#define PCMP_SIGNATURE 0x504d4350
|
|
|
|
//
|
|
// PC+MP Signature used to identify the floating pointer
|
|
// structure (in extended BIOS data segment) that contains
|
|
// a pointer to the PC+MP table.
|
|
//
|
|
// "_"=5fH, "M"=4dH, "P"=50H, "_"=5fH
|
|
//
|
|
#define MP_PTR_SIGNATURE 0x5f504d5f
|
|
|
|
//
|
|
// This is the floating pointer structure
|
|
//
|
|
|
|
// For PC+MP version 1.0
|
|
struct PcMpTableLocator {
|
|
ULONG MpPtrSignature; // Must be "_MP_" (0x5f504d5f)
|
|
PUCHAR TablePtr; // ptr to the PC+MP Table
|
|
UCHAR MpTableLength; // Floating pointer structure length
|
|
UCHAR TableRevision; // Rev 1.0 == 1
|
|
UCHAR TableChecksum; // Checksum of PcMpTableLocator
|
|
UCHAR Pad;
|
|
ULONG Reserved;
|
|
};
|
|
|
|
|
|
struct FloatPtrStruct {
|
|
ULONG MpPtrSignature; // Must be "_MP_" (0x5f504d5f)
|
|
PUCHAR TablePtr; // ptr to the PC+MP Table
|
|
UCHAR MpTableLength; // Floating pointer structure length
|
|
UCHAR TableRevision; // Rev 1.0 == 1
|
|
UCHAR TableChecksum; // Checksum of PcMpTableLocator
|
|
UCHAR MpFeatureInfoByte1; // MP feature info. byte 1
|
|
UCHAR MpFeatureInfoByte2; // MP feature info. byte 2
|
|
UCHAR Pad;
|
|
USHORT Reserved;
|
|
};
|
|
|
|
|
|
//
|
|
// Extension table definitions
|
|
//
|
|
|
|
#define EXTTYPE_BUS_ADDRESS_MAP 128
|
|
#define EXTTYPE_BUS_HIERARCHY 129
|
|
#define EXTTYPE_BUS_COMPATIBLE_MAP 130
|
|
#define EXTTYPE_PERSISTENT_STORE 131
|
|
|
|
typedef struct {
|
|
UCHAR Type;
|
|
UCHAR Length;
|
|
union {
|
|
struct {
|
|
UCHAR BusId;
|
|
UCHAR Type;
|
|
LONGLONG Base;
|
|
LONGLONG Length;
|
|
} AddressMap;
|
|
|
|
struct {
|
|
UCHAR BusId;
|
|
UCHAR SubtractiveDecode:1;
|
|
UCHAR ParentBusId;
|
|
} BusHierarchy;
|
|
|
|
struct {
|
|
LONGLONG Address;
|
|
LONGLONG Length;
|
|
} PersistentStore;
|
|
|
|
struct {
|
|
UCHAR BusId;
|
|
UCHAR Modifier:1;
|
|
UCHAR Reserved:7;
|
|
ULONG List;
|
|
} CompatibleMap;
|
|
|
|
} u;
|
|
} MPS_EXTENTRY, *PMPS_EXTENTRY;
|
|
|
|
|
|
#define MPS_ADDRESS_MAP_IO 0
|
|
#define MPS_ADDRESS_MAP_MEMORY 1
|
|
#define MPS_ADDRESS_MAP_PREFETCH_MEMORY 2
|
|
#define MPS_ADDRESS_MAP_UNDEFINED 9
|
|
|
|
//
|
|
// The System configuration table as used by a PC_MP system
|
|
//
|
|
//
|
|
// The offset is relative to the BIOS starting at f0000H
|
|
//
|
|
#define PTR_OFFSET 0x0000e6f5
|
|
#define BIOS_BASE 0x000f0000
|
|
|
|
#define PCMP_IMPLEMENTED 0x01 // In MpFeatureInfoByte1
|
|
#define PCMP_CONFIG_MASK 0x0e // In MpFeatureInfoByte1
|
|
#define IMCR_MASK 0x80 // In MpFeatureInfoByte2
|
|
#define MULT_CLOCKS_MASK 0x40 // In MpFeatureInfoByte2
|
|
|
|
struct SystemConfigTable {
|
|
UCHAR Reserved[PTR_OFFSET];
|
|
USHORT NumOfBytes; // Table can be variable length.
|
|
UCHAR ModelType; // AT=0xfc, unknown board=0xff
|
|
UCHAR SubModelType;
|
|
UCHAR BIOSRevision; // First release = 0x0
|
|
UCHAR FeatureInfoByte[3]; // Standard AT features
|
|
UCHAR MpFeatureInfoByte1; // MP feature info. byte 1
|
|
UCHAR MpFeatureInfoByte2; // MP feature info. byte 2
|
|
} ;
|
|
|
|
#pragma pack()
|
|
|
|
NTSTATUS
|
|
HalpPci2MpsBusNumber(
|
|
IN UCHAR PciBusNumber,
|
|
OUT UCHAR *MpsBusNumber
|
|
);
|
|
|
|
PBUS_HANDLER
|
|
HalpFindIdeBus(
|
|
IN ULONG Vector
|
|
);
|
|
|
|
BOOLEAN
|
|
HalpInterruptsDescribedByMpsTable(
|
|
IN UCHAR MpsBusNumber
|
|
);
|
|
|
|
NTSTATUS
|
|
HalpMpsGetParentBus(
|
|
IN UCHAR MpsBus,
|
|
OUT UCHAR *ParentMpsBus
|
|
);
|
|
|
|
BOOLEAN
|
|
HalpMpsBusIsRootBus(
|
|
IN UCHAR MpsBus
|
|
);
|
|
|
|
VOID
|
|
HalpMPSPCIChildren (
|
|
VOID
|
|
);
|
|
|
|
/*
|
|
endif
|
|
|
|
;
|
|
; IMCR (Interrupt Mode Control Register) access definitions
|
|
;
|
|
|
|
ImcrDisableApic equ 00H
|
|
ImcrEnableApic equ 01H
|
|
ImcrRegPortAddr equ 22H
|
|
ifdef NEC_98
|
|
ImcrDataPortAddr equ 700H
|
|
else ; NEC_98
|
|
ImcrDataPortAddr equ 23H
|
|
endif ; NEC_98
|
|
ImcrPort equ 70H
|
|
|
|
;
|
|
; MP Configuration Table - Built by an MP BIOS for OS Support
|
|
|
|
;
|
|
; PC+MP Signature used to identify the floating pointer
|
|
; structure (in extended BIOS data segment) that contains
|
|
; a pointer to the PC+MP table.
|
|
;
|
|
; "_"=5fH, "M"=4dH, "P"=50H, "_"=5fH
|
|
;
|
|
MP_PTR_SIGNATURE equ 5f504d5fH
|
|
|
|
;
|
|
; PC+MP Signature used to verify the PC+MP table
|
|
; as valid
|
|
;
|
|
; "P"=50H,"C"=43H,"M"=4dH,"P"=50H
|
|
;
|
|
PCMP_SIGNATURE equ 504d4350H
|
|
|
|
;
|
|
; The PC+MP configuration table Possible Entry Types
|
|
;
|
|
ENTRY_PROCESSOR equ 0H
|
|
ENTRY_BUS equ 1H
|
|
ENTRY_IOAPIC equ 2H
|
|
ENTRY_INTI equ 3H
|
|
ENTRY_LINTI equ 4H
|
|
|
|
;
|
|
; Bits used in the CpuFlags field of the Processor entry
|
|
;
|
|
CPU_ENABLED equ 01H
|
|
CPU_DISABLED equ 00H
|
|
BSP_CPU equ 02H
|
|
|
|
;
|
|
; APIC Versions used by PC+MP systems - this is used in the
|
|
; Processor entries and the IoApic Entries
|
|
;
|
|
APIC_INTEGRATED equ 10H
|
|
APIC_82489DX equ 00H
|
|
|
|
|
|
;
|
|
; Macros used in table definitions
|
|
;
|
|
HEADER_SIZE equ 2CH
|
|
|
|
; Number of default configurations for PC+MP version 1.1
|
|
NUM_DEFAULT_CONFIGS equ 7
|
|
|
|
;
|
|
; Io Apic Entry definitions
|
|
;
|
|
IO_APIC_ENABLED equ 01H
|
|
IO_APIC_DISABLED equ 00H
|
|
|
|
;
|
|
; Default value for Io Apic ID.
|
|
;
|
|
IOUNIT_APIC_ID equ 0EH ; ID of the IO Unit
|
|
|
|
PcMpTable struc
|
|
; HEADER portion of the PC+MP config table
|
|
;
|
|
Signature db 4 dup (0) ; Must be "P","C","M","P"
|
|
TableLength dw 0 ; Length in bytes of table
|
|
Revision db 0 ; Table revision #
|
|
Checksum db 0 ; Table checksum
|
|
OemId db 8 dup (0) ; OemId string
|
|
OemProductId db 12 dup (0) ; Oem product id
|
|
OemTablePtr dd 0 ; Ptr to OEM table
|
|
OemTableSize dw 0 ; Size of OEM table
|
|
NumOfEntries dw 0 ; # of entries in table
|
|
LocalApicAddress dd 0 ; Physical address of Local units
|
|
ExtTableLength dw 0 ; Extension table size
|
|
ExtTableChecksum db 0 ; Complete checksum including extension table
|
|
Reserved db 0 ; Not Used
|
|
|
|
PcMpTable ends
|
|
|
|
;
|
|
; Bios Constants. The offset is relative to the BIOS starting at
|
|
; f0000H.
|
|
;
|
|
|
|
PTR_OFFSET equ 0e6f5H
|
|
BIOS_BASE equ 0f0000H
|
|
PCMP_IMPLEMENTED equ 01H
|
|
PCMP_CONFIG_MASK equ 0eH
|
|
IMCR_MASK equ 80H
|
|
MULT_CLOCKS_MASK equ 40H
|
|
|
|
PcMpTableLocator struc
|
|
MpPtrSignature dd 0 ; Must be "_MP_" (0x5f504d5f)
|
|
TablePtr dd 0
|
|
MpTableLength db 0
|
|
TableRevision db 0
|
|
TableChecksum db 0
|
|
Pad db 0
|
|
Reserved dd 0
|
|
PcMpTableLocator ends
|
|
|
|
SystemConfigTable struc
|
|
|
|
db PTR_OFFSET dup (0) ;Skip to 0e6f5
|
|
NumOfBytes db 2 ; Table Length
|
|
ModelType db 0 ; AT=0fc, unknown=0ff
|
|
SubModelType db 0
|
|
BIOSRevision db 0 ; 00=first release
|
|
FeatureInfoByte db 3 dup (0) ; AT features
|
|
MpFeatureInfoByte1 db 0 ; MP feature info. byte 1
|
|
MpFeatureInfoByte2 db 0 ; MP feature info. byte 2
|
|
|
|
SystemConfigTable ends
|
|
|
|
; */
|