/** *** Copyright (C) 1996-97 Intel Corporation. All rights reserved. *** *** The information and source code contained herein is the exclusive *** property of Intel Corporation and may not be disclosed, examined *** or reproduced in whole or in part without explicit written authorization *** from the company. **/ /*++ Copyright (c) 1992 Microsoft Corporation Module Name: bootia64.h Abstract: Header file for the Ia64 portions of the common boot library Author: John Vert (jvert) 14-Oct-1993 Revision History: Allen Kay (akay) 26-Jan-1996 Ported to IA-64 --*/ #include "bldria64.h" #include "..\bootlib.h" #include "efi.h" // // Macro definition // extern EfiSt; #define EfiPrint(_X) \ { \ if (IsPsrDtOn()) { \ FlipToPhysical(); \ EfiST->ConOut->OutputString(EfiST->ConOut, (_X)); \ FlipToVirtual(); \ } \ else { \ EfiST->ConOut->OutputString(EfiST->ConOut, (_X)); \ } \ } // // Macro for translation memory size in bytes to page size in TR format // #define MEM_SIZE_TO_PS(MemSize, TrPageSize) \ if (MemSize <= MEM_4K) { \ TrPageSize = PS_4K; \ } else if (MemSize <= MEM_8K) { \ TrPageSize = PS_8K; \ } else if (MemSize <= MEM_16K) { \ TrPageSize = PS_16K; \ } else if (MemSize <= MEM_64K) { \ TrPageSize = PS_64K; \ } else if (MemSize <= MEM_256K) { \ TrPageSize = PS_256K; \ } else if (MemSize <= MEM_1M) { \ TrPageSize = PS_1M; \ } else if (MemSize <= MEM_4M) { \ TrPageSize = PS_4M; \ } else if (MemSize <= MEM_16M) { \ TrPageSize = PS_16M; \ } else if (MemSize <= MEM_64M) { \ TrPageSize = PS_64M; \ } else if (MemSize <= MEM_256M) { \ TrPageSize = PS_256M; \ } extern PMEMORY_DESCRIPTOR MDArray; extern ULONG MaxDescriptors; extern ULONG NumberDescriptors; VOID InitializeMemoryDescriptors ( VOID ); VOID InsertDescriptor ( ULONG BasePage, ULONG NumberOfPages, MEMORY_TYPE MemoryType ); // B O O T C O N T E X T R E C O R D // // Passed to the OS loader by the SU module or bootstrap // code, whatever the case. Constains all the basic machine // and environment information the OS loaders needs to get // itself going. // typedef enum { BootBusAtapi, BootBusScsi, BootBusVendor, BootBusMax } BUS_TYPE; typedef enum { BootMediaHardDisk, BootMediaCdrom, BootMediaFloppyDisk, BootMediaTcpip, BootMediaMax } MEDIA_TYPE; typedef struct _BOOT_DEVICE_ATAPI { UCHAR PrimarySecondary; UCHAR SlaveMaster; USHORT Lun; } BOOT_DEVICE_ATAPI, *PBOOT_DEVICE_ATAPI; typedef struct _BOOT_DEVICE_SCSI { UINT8 Channel; USHORT Pun; USHORT Lun; } BOOT_DEVICE_SCSI, *PBOOT_DEVICE_SCSI; typedef struct _BOOT_DEVICE_FLOPPY { ULONG DriveNumber; } BOOT_DEVICE_FLOPPY, *PBOOT_DEVICE_FLOPPY; typedef struct _BOOT_DEVICE_IPv4 { USHORT RemotePort; USHORT LocalPort; EFI_IPv4_ADDRESS Ip; } BOOT_DEVICE_IPv4, *PBOOT_DEVICE_IPv4; typedef struct { UINT64 Ip[2]; } IPv6_ADDRESS; typedef struct _BOOT_DEVICE_IPv6 { USHORT RemotePort; USHORT LocalPort; IPv6_ADDRESS Ip; } BOOT_DEVICE_IPv6, *PBOOT_DEVICE_IPv6; typedef struct { ULONG Data1; USHORT Data2; USHORT Data3; UCHAR Data4[8]; } BOOT_EFI_GUID; typedef struct _BOOT_DEVICE_UNKNOWN { BOOT_EFI_GUID Guid; UCHAR LegacyDriveLetter; } BOOT_DEVICE_UNKNOWN, *PBOOT_DEVICE_UNKNOWN; typedef union _BOOT_DEVICE { BOOT_DEVICE_ATAPI BootDeviceAtapi; BOOT_DEVICE_SCSI BootDeviceScsi; BOOT_DEVICE_FLOPPY BootDeviceFloppy; BOOT_DEVICE_IPv4 BootDeviceIpv4; BOOT_DEVICE_IPv6 BootDeviceIpv6; BOOT_DEVICE_UNKNOWN BootDeviceUnknown; } BOOT_DEVICE, *PBOOT_DEVICE; typedef struct _BOOT_CONTEXT { ULONG BusType; ULONG MediaType; ULONG PartitionNumber; BOOT_DEVICE BootDevice; PEXTERNAL_SERVICES_TABLE ExternalServicesTable; ULONGLONG MachineType; ULONGLONG OsLoaderStart; ULONGLONG OsLoaderEnd; ULONGLONG ResourceDirectory; ULONGLONG ResourceOffset; ULONGLONG OsLoaderBase; ULONGLONG OsLoaderExports; ULONGLONG BootFlags; } BOOT_CONTEXT, *PBOOT_CONTEXT; // // Common function prototypes // VOID InitializeDisplaySubsystem( VOID ); ARC_STATUS InitializeMemorySubsystem( PBOOT_CONTEXT ); ARC_STATUS XferPhysicalDiskSectors( IN UCHAR Int13UnitNumber, IN ULONGLONG StartSector, IN UCHAR SectorCount, OUT PUCHAR Buffer, IN UCHAR SectorsPerTrack, IN USHORT Heads, IN USHORT Cylinders, IN BOOLEAN AllowExtendedInt13, IN BOOLEAN Write ); #define ReadPhysicalSectors(d,a,n,p,s,h,c,f) \ \ XferPhysicalDiskSectors((d),(a),(n),(p),(s),(h),(c),(f),FALSE) #define WritePhysicalSectors(d,a,n,p,s,h,c,f) \ \ XferPhysicalDiskSectors((d),(a),(n),(p),(s),(h),(c),(f),TRUE) ARC_STATUS XferExtendedPhysicalDiskSectors( IN ULONGLONG DeviceHandle, IN ULONGLONG StartSector, IN USHORT SectorCount, OUT PUCHAR Buffer, IN BOOLEAN Write ); #define ReadExtendedPhysicalSectors(d,a,c,p) \ \ XferExtendedPhysicalDiskSectors((d),(a),(c),(p),FALSE) #define WriteExtendedPhysicalSectors(d,a,c,p) \ \ XferExtendedPhysicalDiskSectors((d),(a),(c),(p),TRUE) VOID ResetDiskSystem( UCHAR Int13UnitNumber ); VOID MdShutoffFloppy( VOID ); BOOLEAN FwGetPathMnemonicKey( IN PCHAR OpenPath, IN PCHAR Mnemonic, IN PULONG Key ); PVOID FwAllocateHeapAligned( IN ULONG Size ); PVOID FwAllocatePool( IN ULONG Size ); PVOID FwAllocateHeapPermanent( IN ULONG NumberPages ); VOID FwStallExecution( IN ULONG Microseconds ); VOID BlGetActivePartition( OUT PUCHAR PartitionName ); VOID BlFillInSystemParameters( IN PBOOT_CONTEXT BootContextRecord ); // // PS/2 ABIOS module (in abiosc.c) // VOID RemapAbiosSelectors( VOID ); // // global data definitions // extern ULONG MachineType; extern PCONFIGURATION_COMPONENT_DATA FwConfigurationTree; extern ULONG HeapUsed; ULONG PalFreeBase; // // page Table definition // #define HYPER_SPACE_BEGIN 0xC0000000 #define HYPER_PAGE_DIR 0xC0300000 #define GetPteOffset(va) \ ( (((ULONG)(va)) << (32-PDI_SHIFT)) >> ((32-PDI_SHIFT) + PTI_SHIFT) ) // // X86 Detection definitions // The size is *ALWAYS* assumed to be 64K. // N.B. The definition *MUST* be the same as the ones defined in // startup\su.inc // #define DETECTION_LOADED_ADDRESS 0x10000 // // We need to allocate permanent and temporary memory for the page directory, // assorted page tables, and the memory descriptors before the blmemory // routines ever get control. So we have two private heaps, one for permanent // data and one for temporary data. There are two descriptors for this. The // permanent heap descriptor starts out as zero-length at P.A. 0x30000. The // temporary heap descriptor immediately follows the permanent heap in memory // and starts out as 128k long. As we allocate permanent pages, we increase // the size of the permanent heap descriptor and increase the base (thereby // decreasing the size) of the temporary heap descriptor) // // So the permanent heap starts at P.A. 0x30000 and grows upwards. The // temporary heap starts at P.A. 0x5C000 and grows downwards. This gives us // a total of 128k of combined permanent and temporary data. // // // Heap starting locations (in pages) // #define PERMANENT_HEAP_START (0x1010000 >> PAGE_SHIFT) #define TEMPORARY_HEAP_START (0x1040000 >> PAGE_SHIFT) // // Useful Macro Definitions // #define ROUND_UP(Num,Size) (((Num) + Size - 1) & ~(Size -1)) typedef union _UCHAR1 { UCHAR Uchar[1]; UCHAR ForceAlignment; } UCHAR1, *PUCHAR1; typedef union _UCHAR2 { UCHAR Uchar[2]; USHORT ForceAlignment; } UCHAR2, *PUCHAR2; typedef union _UCHAR4 { UCHAR Uchar[4]; ULONG ForceAlignment; } UCHAR4, *PUCHAR4; // // This macro copies an unaligned src byte to an aligned dst byte // #define CopyUchar1(Dst,Src) { \ *((UCHAR1 *)(Dst)) = *((UNALIGNED UCHAR1 *)(Src)); \ } // // This macro copies an unaligned src word to an aligned dst word // #define CopyUchar2(Dst,Src) { \ *((UCHAR2 *)(Dst)) = *((UNALIGNED UCHAR2 *)(Src)); \ } // // This macro copies an unaligned src longword to an aligned dsr longword // #define CopyUchar4(Dst,Src) { \ *((UCHAR4 *)(Dst)) = *((UNALIGNED UCHAR4 *)(Src)); \ } // // Global definitions for the BIOS ARC Emulation // // // Defines for the ARC name of console input and output // #define CONSOLE_INPUT_NAME "multi(0)key(0)keyboard(0)" #define CONSOLE_OUTPUT_NAME "multi(0)video(0)monitor(0)" // // Define special character values. // #define ASCI_NUL 0x00 #define ASCI_BEL 0x07 #define ASCI_BS 0x08 #define ASCI_HT 0x09 #define ASCI_LF 0x0A #define ASCI_VT 0x0B #define ASCI_FF 0x0C #define ASCI_CR 0x0D #define ASCI_CSI 0x9B #define ASCI_ESC 0x1B #define ASCI_SYSRQ 0x80 // // Device I/O prototypes // ARC_STATUS BiosPartitionClose( IN ULONG FileId ); ARC_STATUS BiosPartitionOpen( IN PCHAR OpenPath, IN OPEN_MODE OpenMode, OUT PULONG FileId ); ARC_STATUS BiosPartitionRead ( IN ULONG FileId, OUT PVOID Buffer, IN ULONG Length, OUT PULONG Count ); ARC_STATUS BiosPartitionWrite( IN ULONG FileId, OUT PVOID Buffer, IN ULONG Length, OUT PULONG Count ); ARC_STATUS BiosPartitionSeek ( IN ULONG FileId, IN PLARGE_INTEGER Offset, IN SEEK_MODE SeekMode ); ARC_STATUS BiosDiskGetFileInfo( IN ULONG FileId, OUT PFILE_INFORMATION FileInfo ); ARC_STATUS BiosPartitionGetFileInfo( IN ULONG FileId, OUT PFILE_INFORMATION FileInfo ); ARC_STATUS BlArcNotYetImplemented( IN ULONG FileId ); ARC_STATUS BiosConsoleOpen( IN PCHAR OpenPath, IN OPEN_MODE OpenMode, OUT PULONG FileId ); ARC_STATUS BiosConsoleReadStatus( IN ULONG FileId ); ARC_STATUS BiosConsoleRead ( IN ULONG FileId, OUT PUCHAR Buffer, IN ULONG Length, OUT PULONG Count ); ARC_STATUS BiosConsoleWrite ( IN ULONG FileId, OUT PWCHAR Buffer, IN ULONG Length, OUT PULONG Count ); ARC_STATUS BiosDiskOpen( IN ULONG DriveId, IN OPEN_MODE OpenMode, OUT PULONG FileId ); ARC_STATUS BiosDiskRead ( IN ULONG FileId, OUT PVOID Buffer, IN ULONG Length, OUT PULONG Count ); ARC_STATUS BiosElToritoDiskRead( IN ULONG FileId, OUT PVOID Buffer, IN ULONG Length, OUT PULONG Count ); BOOLEAN BlIsElToritoCDBoot( UCHAR DriveNum ); ARC_STATUS BiosDiskWrite( IN ULONG FileId, OUT PVOID Buffer, IN ULONG Length, OUT PULONG Count ); ARC_STATUS HardDiskPartitionOpen( IN ULONG FileId, IN ULONG DiskId, IN UCHAR PartitionNumber ); // // routines that deal with creating arc memory descriptors from // an efi memory map // VOID ConstructArcMemoryDescriptorsWithAllocation( ULONGLONG LowBoundary, ULONGLONG HighBoundary ); VOID ConstructArcMemoryDescriptors( EFI_MEMORY_DESCRIPTOR *EfiMd, MEMORY_DESCRIPTOR *ArcMd, ULONGLONG MemoryMapSize, ULONGLONG DescriptorSize, ULONGLONG LowBoundary, ULONGLONG HighBoundary ); MEMORY_TYPE EfiToArcType ( UINT32 Type ); #ifdef DBG VOID PrintArcMemoryDescriptorList( MEMORY_DESCRIPTOR *ArcMd, ULONG MaxDesc ); #endif