164 lines
2.8 KiB
C
164 lines
2.8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1989 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
abios.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains the i386 kernel ABIOS specific header file.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Shie-Lin Tzong (shielint) 22-May-1991
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
// Define public portion of the ABIOS Device Block
|
||
|
|
||
|
|
||
|
typedef struct _KDEVICE_BLOCK {
|
||
|
USHORT Length;
|
||
|
UCHAR Revision;
|
||
|
UCHAR SecondDeviceId;
|
||
|
USHORT LogicalId;
|
||
|
USHORT DeviceId;
|
||
|
USHORT NumberExclusivePortPairs;
|
||
|
USHORT NumberCommonPortPairs;
|
||
|
} KDEVICE_BLOCK, *PKDEVICE_BLOCK;
|
||
|
|
||
|
|
||
|
typedef struct _KABIOS_POINTER {
|
||
|
USHORT Offset;
|
||
|
USHORT Selector;
|
||
|
} KABIOS_POINTER, *PKABIOS_POINTER;
|
||
|
|
||
|
#pragma pack(1)
|
||
|
|
||
|
|
||
|
// ABIOS Function Transfer Table definition
|
||
|
|
||
|
|
||
|
typedef struct _KFUNCTION_TRANSFER_TABLE {
|
||
|
KABIOS_POINTER CommonRoutine[3];
|
||
|
USHORT FunctionCount;
|
||
|
USHORT Reserved;
|
||
|
KABIOS_POINTER SpecificRoutine;
|
||
|
} KFUNCTION_TRANSFER_TABLE, *PKFUNCTION_TRANSFER_TABLE;
|
||
|
|
||
|
|
||
|
|
||
|
// ABIOS Commom Data Area definitions
|
||
|
|
||
|
|
||
|
typedef struct _KDB_FTT_SECTION {
|
||
|
KABIOS_POINTER DeviceBlock;
|
||
|
KABIOS_POINTER FunctionTransferTable;
|
||
|
} KDB_FTT_SECTION, *PKDB_FTT_SECTION;
|
||
|
|
||
|
typedef struct _KCOMMON_DATA_AREA {
|
||
|
USHORT DataPointer0Offset;
|
||
|
USHORT NumberLids;
|
||
|
ULONG Reserved;
|
||
|
PKDB_FTT_SECTION DbFttPointer;
|
||
|
} KCOMMON_DATA_AREA, *PKCOMMON_DATA_AREA;
|
||
|
|
||
|
#pragma pack()
|
||
|
|
||
|
|
||
|
// Available GDT Entry
|
||
|
|
||
|
|
||
|
typedef struct _KFREE_GDT_ENTRY {
|
||
|
struct _KFREE_GDT_ENTRY *Flink;
|
||
|
ULONG BaseMid : 8;
|
||
|
ULONG Type : 5;
|
||
|
ULONG Dpl : 2;
|
||
|
ULONG Present : 1;
|
||
|
ULONG LimitHi : 4;
|
||
|
ULONG Sys : 1;
|
||
|
ULONG Reserved_0 : 1;
|
||
|
ULONG Default_Big : 1;
|
||
|
ULONG Granularity : 1;
|
||
|
ULONG BaseHi : 8;
|
||
|
} KFREE_GDT_ENTRY, *PKFREE_GDT_ENTRY;
|
||
|
|
||
|
|
||
|
// Logical Id table entry
|
||
|
|
||
|
|
||
|
typedef struct _KLID_TABLE_ENTRY {
|
||
|
ULONG Owner;
|
||
|
ULONG OwnerCount;
|
||
|
} KLID_TABLE_ENTRY, *PKLID_TABLE_ENTRY;
|
||
|
|
||
|
#define LID_NO_SPECIFIC_OWNER 0xffffffff
|
||
|
#define NUMBER_LID_TABLE_ENTRIES 1024
|
||
|
|
||
|
|
||
|
// Macro to extract the high byte of a short offset
|
||
|
|
||
|
|
||
|
#define HIGHBYTE(l) ((UCHAR)(((USHORT)(l)>>8) & 0xff))
|
||
|
|
||
|
|
||
|
// Macro to extract the low byte of a short offset
|
||
|
|
||
|
|
||
|
#define LOWBYTE(l) ((UCHAR)(l))
|
||
|
|
||
|
|
||
|
// The following selectors are reserved for 16 bit stack, code and
|
||
|
// ABIOS Common Data Area.
|
||
|
|
||
|
|
||
|
#define KGDT_STACK16 0xf8
|
||
|
#define KGDT_CODE16 0xf0
|
||
|
#define KGDT_CDA16 0xe8
|
||
|
#define KGDT_GDT_ALIAS 0x70
|
||
|
|
||
|
|
||
|
// Misc. definitions
|
||
|
|
||
|
|
||
|
#define RESERVED_GDT_ENTRIES 28
|
||
|
|
||
|
|
||
|
// External references
|
||
|
|
||
|
|
||
|
extern PKFREE_GDT_ENTRY KiAbiosGdtStart;
|
||
|
extern PKFREE_GDT_ENTRY KiAbiosGdtEnd;
|
||
|
extern PUCHAR KiEndOfCode16;
|
||
|
extern ULONG KiStack16GdtEntry;
|
||
|
|
||
|
extern
|
||
|
VOID
|
||
|
KiI386CallAbios(
|
||
|
IN KABIOS_POINTER AbiosFunction,
|
||
|
IN KABIOS_POINTER DeviceBlockPointer,
|
||
|
IN KABIOS_POINTER FunctionTransferTable,
|
||
|
IN KABIOS_POINTER RequestBlock
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
KiInitializeAbiosGdtEntry (
|
||
|
OUT PKGDTENTRY GdtEntry,
|
||
|
IN ULONG Base,
|
||
|
IN ULONG Limit,
|
||
|
IN USHORT Type
|
||
|
);
|
||
|
|
||
|
extern
|
||
|
ULONG
|
||
|
KiAbiosGetGdt (
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
|