/*++ 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_