You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
400 lines
9.2 KiB
400 lines
9.2 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
bldrx86.h
|
|
|
|
Abstract:
|
|
|
|
Contains definitions and prototypes specific to the x86 NTLDR.
|
|
|
|
Author:
|
|
|
|
John Vert (jvert) 20-Dec-1993
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _BLDRX86_
|
|
#define _BLDRX86_
|
|
|
|
#include "bldr.h"
|
|
|
|
//
|
|
// Define specific ranges where parts of the system should be loaded
|
|
//
|
|
//
|
|
// X86 is limited to the first 512MB of physical address space
|
|
// We also try to pack kernel and HAL into a single 4MB page
|
|
//
|
|
#define BL_KERNEL_RANGE_LOW (ULONG)((BlVirtualBias) ? _12MB : _4MB )
|
|
#define BL_KERNEL_RANGE_HIGH (ULONG)((BlVirtualBias) ? _16MB : _8MB )
|
|
|
|
//
|
|
// Specific range for the disk cache since this is allocated before the
|
|
// kernel and HAL are loaded and we want to keep its 2MB out of the 4MB
|
|
// page we are trying to cram the kernel and HAL into.
|
|
//
|
|
#define BL_DISK_CACHE_RANGE_LOW (_8MB)
|
|
#define BL_DISK_CACHE_RANGE_HIGH (_16MB)
|
|
|
|
#define BL_DRIVER_RANGE_LOW (ULONG)0
|
|
#define BL_DRIVER_RANGE_HIGH (ULONG)(_512MB)
|
|
|
|
#define BL_DECOMPRESS_RANGE_LOW (ULONG)(0)
|
|
#define BL_DECOMPRESS_RANGE_HIGH (ULONG)(_512MB)
|
|
|
|
#define BL_XIPROM_RANGE_LOW (ULONG)BlUsableBase
|
|
#define BL_XIPROM_RANGE_HIGH (ULONG)(_512MB)
|
|
|
|
#define OLD_ALTERNATE (0xe1000000 - 64 * 1024 * 1024)
|
|
|
|
VOID
|
|
AEInitializeStall(
|
|
VOID
|
|
);
|
|
|
|
ARC_STATUS
|
|
AEInitializeIo(
|
|
IN ULONG DriveId
|
|
);
|
|
|
|
VOID
|
|
AEGetArcDiskInformation(
|
|
VOID
|
|
);
|
|
|
|
PVOID
|
|
FwAllocateHeap(
|
|
IN ULONG Size
|
|
);
|
|
|
|
VOID
|
|
MdShutoffFloppy(
|
|
VOID
|
|
);
|
|
|
|
PCHAR
|
|
BlSelectKernel(
|
|
IN ULONG DriveId,
|
|
IN PCHAR BootFile,
|
|
OUT PCHAR *LoadOptions,
|
|
IN BOOLEAN UseTimeOut
|
|
);
|
|
|
|
|
|
BOOLEAN
|
|
BlDetectHardware(
|
|
IN ULONG DriveId,
|
|
IN PCHAR LoadOptions
|
|
);
|
|
|
|
VOID
|
|
BlStartup(
|
|
IN PCHAR PartitionName
|
|
);
|
|
|
|
//
|
|
// Arc routines for supporting common VGA I/O routines
|
|
//
|
|
#define ARC_DISPLAY_CLEAR_ESCAPE "\033[2J"
|
|
#define ARC_DISPLAY_CLEAR() { \
|
|
ULONG LocalCount; \
|
|
ArcWrite(BlConsoleOutDeviceId, ARC_DISPLAY_CLEAR_ESCAPE, \
|
|
sizeof(ARC_DISPLAY_CLEAR_ESCAPE) - 1, &LocalCount); \
|
|
}
|
|
|
|
#define ARC_DISPLAY_CLEAR_TO_EOD() { \
|
|
ULONG LocalCount; \
|
|
ArcWrite(BlConsoleOutDeviceId, "\033[0J", sizeof("\033[0J") - 1, &LocalCount); \
|
|
}
|
|
|
|
#define ARC_DISPLAY_CLEAR_TO_EOL() { \
|
|
ULONG LocalCount; \
|
|
ArcWrite(BlConsoleOutDeviceId, "\033[0K", sizeof("\033[0K") - 1, &LocalCount); \
|
|
}
|
|
|
|
#define ARC_DISPLAY_ATTRIBUTES_OFF() { \
|
|
ULONG LocalCount; \
|
|
ArcWrite(BlConsoleOutDeviceId, "\033[0m", sizeof("\033[0m") - 1, &LocalCount); \
|
|
}
|
|
|
|
#define ARC_DISPLAY_INVERSE_VIDEO() { \
|
|
ULONG LocalCount; \
|
|
ArcWrite(BlConsoleOutDeviceId, "\033[7m", sizeof("\033[7m") - 1, &LocalCount); \
|
|
}
|
|
|
|
#define ARC_DISPLAY_SET_COLOR(c) { \
|
|
ULONG LocalCount; \
|
|
CHAR LocalBuffer[40]; \
|
|
sprintf(LocalBuffer, "\033[%sm", c); \
|
|
ArcWrite(BlConsoleOutDeviceId, LocalBuffer, strlen(LocalBuffer), &LocalCount); \
|
|
}
|
|
|
|
#define ARC_DISPLAY_POSITION_CURSOR(x, y) { \
|
|
ULONG LocalCount; \
|
|
CHAR LocalBuffer[40]; \
|
|
sprintf(LocalBuffer, "\033[%d;%dH", y + 1, x + 1); \
|
|
ArcWrite(BlConsoleOutDeviceId, LocalBuffer, strlen(LocalBuffer), &LocalCount); \
|
|
}
|
|
|
|
extern BOOLEAN BlTerminalConnected;
|
|
extern ULONG BlTerminalDeviceId;
|
|
extern ULONG BlTerminalDelay;
|
|
|
|
|
|
LOGICAL
|
|
BlTerminalAttached(
|
|
IN ULONG TerminalDeviceId
|
|
);
|
|
|
|
|
|
//
|
|
// Routine for checking if a character is the lead byt to a double-byte
|
|
//
|
|
BOOLEAN
|
|
GrIsDBCSLeadByte(
|
|
IN UCHAR c
|
|
);
|
|
|
|
VOID
|
|
UTF8Encode(
|
|
USHORT InputValue,
|
|
PUCHAR UTF8Encoding
|
|
);
|
|
|
|
VOID
|
|
GetDBCSUtf8Translation(
|
|
PUCHAR InputChar,
|
|
PUCHAR UTF8Encoding
|
|
);
|
|
|
|
|
|
VOID
|
|
GetSBCSUtf8Translation(
|
|
PUCHAR InputChar,
|
|
PUCHAR UTF8Encoding
|
|
);
|
|
|
|
ARC_STATUS
|
|
MempAllocDescriptor(
|
|
IN ULONG StartPage,
|
|
IN ULONG EndPage,
|
|
IN TYPE_OF_MEMORY MemoryType
|
|
);
|
|
|
|
typedef struct {
|
|
ULONG ErrorFlag;
|
|
ULONG Key;
|
|
ULONG Size;
|
|
struct {
|
|
ULONG BaseAddrLow;
|
|
ULONG BaseAddrHigh;
|
|
ULONG SizeLow;
|
|
ULONG SizeHigh;
|
|
ULONG MemoryType;
|
|
} Descriptor;
|
|
} E820FRAME, *PE820FRAME;
|
|
|
|
|
|
// E X T E R N A L S E R V I C E S T A B L E
|
|
//
|
|
// External Services Table - machine dependent services
|
|
// like reading a sector from the disk and finding out how
|
|
// much memory is installed are provided by a lower level
|
|
// module or a ROM BIOS. The EST provides entry points
|
|
// for the OS loader.
|
|
//
|
|
|
|
//**
|
|
// NOTE WELL
|
|
// The offsets of entries in this structure MUST MATCH
|
|
// the offsets of BOTH the ExportEntryTable in ....\startup\i386\sudata.asm
|
|
// AND ...\startrom\i386\sudata.asm. You must change all 3
|
|
// locations together.
|
|
//**
|
|
|
|
typedef struct _EXTERNAL_SERVICES_TABLE {
|
|
VOID (__cdecl * RebootProcessor)(VOID);
|
|
NTSTATUS (__cdecl * DiskIOSystem)(UCHAR,UCHAR,USHORT,USHORT,UCHAR,UCHAR,PUCHAR);
|
|
ULONG (__cdecl * GetKey)(VOID);
|
|
ULONG (__cdecl * GetCounter)(VOID);
|
|
VOID (__cdecl * Reboot)(ULONG);
|
|
VOID (__cdecl * DetectHardware)(ULONG, ULONG, PVOID, PULONG, PCHAR, ULONG);
|
|
VOID (__cdecl * HardwareCursor)(ULONG,ULONG);
|
|
VOID (__cdecl * GetDateTime)(PULONG,PULONG);
|
|
VOID (__cdecl * ComPort)(LONG,ULONG,UCHAR);
|
|
ULONG (__cdecl * GetStallCount)(VOID);
|
|
VOID (__cdecl * InitializeDisplayForNt)(VOID);
|
|
VOID (__cdecl * GetMemoryDescriptor)(P820FRAME);
|
|
NTSTATUS (__cdecl * GetEddsSector)(UCHAR,ULONG,ULONG,USHORT,PUCHAR,UCHAR);
|
|
NTSTATUS (__cdecl * GetElToritoStatus)(PUCHAR,UCHAR);
|
|
BOOLEAN (__cdecl * GetExtendedInt13Params)(PUCHAR,UCHAR);
|
|
USHORT (__cdecl * NetPcRomServices)(ULONG,PVOID);
|
|
VOID (__cdecl * ApmAttemptReconnect)(VOID);
|
|
ULONG (__cdecl * BiosRedirectService)(ULONG);
|
|
} EXTERNAL_SERVICES_TABLE, *PEXTERNAL_SERVICES_TABLE;
|
|
extern PEXTERNAL_SERVICES_TABLE ExternalServicesTable;
|
|
|
|
//**
|
|
// SEE NOTE AT TOP OF STRUCTURE
|
|
//**
|
|
|
|
//
|
|
// External Services Macros
|
|
//
|
|
|
|
#define REBOOT_PROCESSOR (*ExternalServicesTable->RebootProcessor)
|
|
#define GET_SECTOR (*ExternalServicesTable->DiskIOSystem)
|
|
#define RESET_DISK (*ExternalServicesTable->DiskIOSystem)
|
|
#define BIOS_IO (*ExternalServicesTable->DiskIOSystem)
|
|
#define GET_KEY (*ExternalServicesTable->GetKey)
|
|
#define GET_COUNTER (*ExternalServicesTable->GetCounter)
|
|
#define REBOOT (*ExternalServicesTable->Reboot)
|
|
#define DETECT_HARDWARE (*ExternalServicesTable->DetectHardware)
|
|
#define HW_CURSOR (*ExternalServicesTable->HardwareCursor)
|
|
#define GET_DATETIME (*ExternalServicesTable->GetDateTime)
|
|
#define COMPORT (*ExternalServicesTable->ComPort)
|
|
#define GET_STALL_COUNT (*ExternalServicesTable->GetStallCount)
|
|
#define SETUP_DISPLAY_FOR_NT (*ExternalServicesTable->InitializeDisplayForNt)
|
|
#define GET_MEMORY_DESCRIPTOR (*ExternalServicesTable->GetMemoryDescriptor)
|
|
#define GET_EDDS_SECTOR (*ExternalServicesTable->GetEddsSector)
|
|
#define GET_ELTORITO_STATUS (*ExternalServicesTable->GetElToritoStatus)
|
|
#define GET_XINT13_PARAMS (*ExternalServicesTable->GetExtendedInt13Params)
|
|
#define NETPC_ROM_SERVICES (*ExternalServicesTable->NetPcRomServices)
|
|
#define APM_ATTEMPT_RECONNECT (*ExternalServicesTable->ApmAttemptReconnect)
|
|
#define BIOS_REDIRECT_SERVICE (*ExternalServicesTable->BiosRedirectService)
|
|
|
|
//
|
|
// Define special key input values
|
|
//
|
|
#define DOWN_ARROW 0x5000
|
|
#define UP_ARROW 0x4800
|
|
#define HOME_KEY 0x4700
|
|
#define END_KEY 0x4F00
|
|
#define LEFT_KEY 0x4B00
|
|
#define RIGHT_KEY 0x4D00
|
|
#define INS_KEY 0x5200
|
|
#define DEL_KEY 0x5300
|
|
#define BKSP_KEY 0x0E08
|
|
#define TAB_KEY 0x0009
|
|
#define BACKTAB_KEY 0x0F00
|
|
#define F1_KEY 0x3B00
|
|
#define F2_KEY 0x3C00
|
|
#define F3_KEY 0x3D00
|
|
#define F4_KEY 0x3E00
|
|
#define F5_KEY 0x3F00
|
|
#define F6_KEY 0x4000
|
|
#define F7_KEY 0x4100
|
|
#define F8_KEY 0x4200
|
|
#define F10_KEY 0x4400
|
|
#define F11_KEY 0xD900
|
|
#define F12_KEY 0xDA00
|
|
#define ENTER_KEY 0x000D
|
|
#define ESCAPE_KEY 0x011B
|
|
|
|
|
|
|
|
//
|
|
// x86-specific video support
|
|
//
|
|
VOID
|
|
TextGetCursorPosition(
|
|
OUT PULONG X,
|
|
OUT PULONG Y
|
|
);
|
|
|
|
VOID
|
|
TextSetCursorPosition(
|
|
IN ULONG X,
|
|
IN ULONG Y
|
|
);
|
|
|
|
VOID
|
|
TextSetCurrentAttribute(
|
|
IN UCHAR Attribute
|
|
);
|
|
|
|
UCHAR
|
|
TextGetCurrentAttribute(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TextClearDisplay(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TextClearToEndOfDisplay(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TextClearFromStartOfLine(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TextClearToEndOfLine(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TextStringOut(
|
|
IN PUCHAR String
|
|
);
|
|
|
|
PUCHAR
|
|
TextCharOut(
|
|
IN PUCHAR pc
|
|
);
|
|
|
|
VOID
|
|
TextFillAttribute(
|
|
IN UCHAR Attribute,
|
|
IN ULONG Length
|
|
);
|
|
|
|
VOID
|
|
TextGrInitialize(
|
|
IN ULONG DiskId,
|
|
OUT PULONG ImageLength
|
|
);
|
|
|
|
VOID
|
|
TextGrTerminate(
|
|
VOID
|
|
);
|
|
|
|
#define BlPuts(str) TextStringOut(str)
|
|
|
|
ULONG
|
|
BlGetKey(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
BlInputString(
|
|
IN ULONG Prompt,
|
|
IN ULONG CursorX,
|
|
IN ULONG CursorY,
|
|
IN PUCHAR String,
|
|
IN ULONG MaxLength
|
|
);
|
|
|
|
//
|
|
// Watchdog Timer
|
|
//
|
|
|
|
#define X86_WATCHDOG_TIMEOUT (60*5)
|
|
|
|
VOID
|
|
SetX86WatchDog(
|
|
ULONG TimeOut
|
|
);
|
|
|
|
#endif // _BLDRX86_
|