123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611 |
- /*++
- Copyright (c) 2012 Minoca Corp. All Rights Reserved
- Module Name:
- bios.h
- Abstract:
- This header contains definitions for PC/AT BIOS services.
- Author:
- Evan Green 18-Jul-2012
- --*/
- //
- // ------------------------------------------------------------------- Includes
- //
- //
- // ---------------------------------------------------------------- Definitions
- //
- //
- // Define the physical address where the EBDA (Extended BIOS Data Area) address
- // is stored.
- //
- #define EBDA_POINTER_ADDRESS 0x40E
- //
- // Define the address and length of the space to search for the RSDP.
- //
- #define RSDP_SEARCH_ADDRESS (PVOID)0xE0000
- #define RSDP_SEARCH_LENGTH 0x20000
- //
- // Define INT 10 functions.
- //
- #define INT10_SET_CURSOR_POSITION 0x02
- //
- // Define INT 13 functions.
- //
- #define INT13_READ_SECTORS 0x02
- #define INT13_WRITE_SECTORS 0x03
- #define INT13_GET_DRIVE_PARAMETERS 0x08
- #define INT13_EXTENDED_READ 0x42
- #define INT13_EXTENDED_WRITE 0x43
- #define INT13_EXTENDED_GET_DRIVE_PARAMETERS 0x48
- //
- // Define BIOS text mode information.
- //
- #define BIOS_TEXT_VIDEO_BASE 0xB8000
- #define BIOS_TEXT_VIDEO_COLUMNS 80
- #define BIOS_TEXT_VIDEO_ROWS 25
- #define BIOS_TEXT_VIDEO_CELL_WIDTH 2
- //
- // --------------------------------------------------------------------- Macros
- //
- //
- // ------------------------------------------------------ Data Type Definitions
- //
- typedef enum _TEXT_COLOR {
- ColorBlack,
- ColorBlue,
- ColorGreen,
- ColorCyan,
- ColorRed,
- ColorMagenta,
- ColorBrown,
- ColorLightGray,
- ColorDarkGray,
- ColorBrightBlue,
- ColorBrightGreen,
- ColorBrightCyan,
- ColorBrightRed,
- ColorBrightMagenta,
- ColorYellow,
- ColorWhite
- } TEXT_COLOR, *PTEXT_COLOR;
- /*++
- Structure Description:
- This structure defines a disk access packet used in the INT 13 calls.
- Members:
- PacketSize - Stores the packet size of the packet, either 16 (this
- structure) or 24 if there is an additional quad word on the end
- containing the 64-bit transfer buffer.
- Reserved - Stores a reserved value. Set to zero.
- BlockCount - Stores the number of sectors to transfer.
- TransferBuffer - Stores a pointer to the data buffer, as a linear address.
- BlockAddress - Stores the absolute sector number to transfer. The first
- sector is zero.
- --*/
- typedef struct _INT13_DISK_ACCESS_PACKET {
- UCHAR PacketSize;
- UCHAR Reserved;
- USHORT BlockCount;
- ULONG TransferBuffer;
- ULONGLONG BlockAddress;
- } PACKED INT13_DISK_ACCESS_PACKET, *PINT13_DISK_ACCESS_PACKET;
- /*++
- Structure Description:
- This structure defines the structure of the drive parameters returned from
- int 0x13 function AH=0x48 (extended read drive parameters).
- Members:
- PacketSize - Stores the packet size of the packet, 0x1E bytes.
- InformationFlags - Stores various flags about the disk.
- Cylinders - Stores the number of cylinders on the disk (one beyond the last
- valid index).
- Heads - Stores the number of heads on the disk (one beyond the last valid
- index).
- SectorsPerTrack - Stores the number of sectors per track on the disk (the
- last valid index, since sector numbers start with one).
- TotalSectorCount - Stores the absolute number of sectors (one beyond the
- last valid index).
- SectorSize - Stores the number of bytes per sector.
- EnhancedDiskInformation - Stores an optional pointer to the enhanced drive
- information.
- --*/
- typedef struct _INT13_EXTENDED_DRIVE_PARAMETERS {
- USHORT PacketSize;
- USHORT InformationFlags;
- ULONG Cylinders;
- ULONG Heads;
- ULONG SectorsPerTrack;
- ULONGLONG TotalSectorCount;
- USHORT SectorSize;
- ULONG EnhancedDiskInformation;
- } PACKED INT13_EXTENDED_DRIVE_PARAMETERS, *PINT13_EXTENDED_DRIVE_PARAMETERS;
- //
- // -------------------------------------------------------------------- Globals
- //
- //
- // Store the frame buffer attributes.
- //
- extern ULONG FwFrameBufferMode;
- extern PHYSICAL_ADDRESS FwFrameBufferPhysical;
- extern ULONG FwFrameBufferWidth;
- extern ULONG FwFrameBufferHeight;
- extern ULONG FwFrameBufferBitsPerPixel;
- //
- // -------------------------------------------------------- Function Prototypes
- //
- KSTATUS
- FwPcatGetMemoryMap (
- PMEMORY_DESCRIPTOR_LIST MdlOut
- );
- /*++
- Routine Description:
- This routine gets the firmware memory map from the BIOS using int 15 E820
- calls.
- Arguments:
- MdlOut - Supplies a pointer where the memory map information will be
- stored. This buffer must be allocated by the caller.
- Return Value:
- STATUS_SUCCESS if one or more descriptors could be retrieved from the
- firmware.
- STATUS_UNSUCCESSFUL if no descriptors could be obtained from the firmware.
- --*/
- KSTATUS
- FwPcatAllocatePages (
- PULONGLONG Address,
- ULONGLONG Size,
- ULONG Alignment,
- MEMORY_TYPE MemoryType
- );
- /*++
- Routine Description:
- This routine allocates physical pages for use.
- Arguments:
- Address - Supplies a pointer to where the allocation will be returned.
- Size - Supplies the size of the required space.
- Alignment - Supplies the alignment requirement for the allocation, in bytes.
- Valid values are powers of 2. Set to 1 or 0 to specify no alignment
- requirement.
- MemoryType - Supplies the type of memory to mark the allocation as.
- Return Value:
- STATUS_SUCCESS if the allocation was successful.
- STATUS_INVALID_PARAMETER if a page count of 0 was passed or the address
- parameter was not filled out.
- STATUS_NO_MEMORY if the allocation request could not be filled.
- --*/
- KSTATUS
- FwpPcatOpenBootDisk (
- ULONG BootDriveNumber,
- ULONGLONG PartitionOffset,
- PHANDLE Handle
- );
- /*++
- Routine Description:
- This routine attempts to open the boot disk device.
- Arguments:
- BootDriveNumber - Supplies the drive number of the boot device.
- PartitionOffset - Supplies the offset in sectors of the active partition
- on this device, as discovered by earlier loader code.
- Handle - Supplies a pointer where a handle to the opened disk will be
- returned upon success.
- Return Value:
- Status code.
- --*/
- KSTATUS
- FwpPcatOpenPartition (
- UCHAR PartitionId[FIRMWARE_PARTITION_ID_SIZE],
- PHANDLE Handle
- );
- /*++
- Routine Description:
- This routine opens a handle to a disk and partition with the given IDs.
- Arguments:
- PartitionId - Supplies the partition identifier to match against.
- Handle - Supplies a pointer where a handle to the opened disk will be
- returned upon success.
- Return Value:
- Status code.
- --*/
- VOID
- FwpPcatCloseDisk (
- HANDLE DiskHandle
- );
- /*++
- Routine Description:
- This routine closes an open disk.
- Arguments:
- DiskHandle - Supplies a pointer to the open disk handle.
- Return Value:
- None.
- --*/
- KSTATUS
- FwpPcatReadSectors (
- HANDLE DiskHandle,
- ULONGLONG Sector,
- ULONG SectorCount,
- PVOID Buffer
- );
- /*++
- Routine Description:
- This routine uses the BIOS to read sectors off of a disk.
- Arguments:
- DiskHandle - Supplies a handle to the disk to read from.
- Sector - Supplies the zero-based sector number to read from.
- SectorCount - Supplies the number of sectors to read. The supplied buffer
- must be at least this large.
- Buffer - Supplies the buffer where the data read from the disk will be
- returned upon success.
- Return Value:
- STATUS_SUCCESS if the operation completed successfully.
- STATUS_FIRMWARE_ERROR if the BIOS returned an error.
- Other error codes.
- --*/
- KSTATUS
- FwpPcatWriteSectors (
- HANDLE DiskHandle,
- ULONGLONG Sector,
- ULONG SectorCount,
- PVOID Buffer
- );
- /*++
- Routine Description:
- This routine uses the BIOS to write sectors to a disk.
- Arguments:
- DiskHandle - Supplies a handle to the disk to write to.
- Sector - Supplies the zero-based sector number to write to.
- SectorCount - Supplies the number of sectors to write. The supplied buffer
- must be at least this large.
- Buffer - Supplies the buffer containing the data to write to the disk.
- Return Value:
- STATUS_SUCCESS if the operation completed successfully.
- STATUS_FIRMWARE_ERROR if the BIOS returned an error.
- Other error codes.
- --*/
- ULONG
- FwpPcatGetSectorSize (
- HANDLE DiskHandle
- );
- /*++
- Routine Description:
- This routine determines the number of bytes in a sector on the given disk.
- Arguments:
- DiskHandle - Supplies a handle to the disk to query.
- Return Value:
- Returns the number of bytes in a sector on success.
- 0 on error.
- --*/
- ULONGLONG
- FwpPcatGetSectorCount (
- HANDLE DiskHandle
- );
- /*++
- Routine Description:
- This routine determines the number of sectors on the disk.
- Arguments:
- DiskHandle - Supplies a handle to the disk to query.
- Return Value:
- Returns the number of sectors in the disk on success.
- 0 on error.
- --*/
- VOID
- FwpPcatGetDiskInformation (
- HANDLE DiskHandle,
- PULONG DriveNumber,
- PULONGLONG PartitionOffset
- );
- /*++
- Routine Description:
- This routine returns information about an open disk handle.
- Arguments:
- DiskHandle - Supplies a pointer to the open disk handle.
- DriveNumber - Supplies a pointer where the drive number of this disk
- handle will be returned.
- PartitionOffset - Supplies a pointer where the offset in sectors from the
- beginning of the disk to the partition this handle represents will be
- returned.
- Return Value:
- None.
- --*/
- KSTATUS
- FwpPcatInitializeVideo (
- );
- /*++
- Routine Description:
- This routine attempts to initialize the video subsystem on a PCAT machine.
- Arguments:
- None.
- Return Value:
- Status code.
- --*/
- PVOID
- FwPcatFindRsdp (
- VOID
- );
- /*++
- Routine Description:
- This routine attempts to find the ACPI RSDP table pointer on a PC-AT
- compatible system. It looks in the first 1k of the EBDA (Extended BIOS Data
- Area), as well as between the ranges 0xE0000 and 0xFFFFF. This routine
- must be run in physical mode.
- Arguments:
- None.
- Return Value:
- Returns a pointer to the RSDP table on success.
- NULL on failure.
- --*/
- PVOID
- FwPcatFindSmbiosTable (
- VOID
- );
- /*++
- Routine Description:
- This routine attempts to find the SMBIOS table entry point structure.
- Arguments:
- None.
- Return Value:
- Returns a pointer to the SMBIOS entry point structure on success.
- NULL on failure.
- --*/
- KSTATUS
- FwPcatGetCurrentTime (
- PSYSTEM_TIME Time
- );
- /*++
- Routine Description:
- This routine attempts to get the current system time.
- Arguments:
- Time - Supplies a pointer where the current time will be returned.
- Return Value:
- Status code.
- --*/
- KSTATUS
- FwPcatStall (
- ULONG Microseconds
- );
- /*++
- Routine Description:
- This routine performs a short busy stall using INT 0x1A function 0, which
- returns a counter that increments 18.6025 times per second. Callers are
- advised to perform a "warm-up" stall to align to tick boundaries for more
- accurate results.
- Arguments:
- Microseconds - Supplies the number of microseconds to stall for.
- Return Value:
- Status code.
- --*/
- KSTATUS
- FwPcatResetSystem (
- SYSTEM_RESET_TYPE ResetType
- );
- /*++
- Routine Description:
- This routine resets the system.
- Arguments:
- ResetType - Supplies the desired reset type. If the desired reset type is
- not supported, a cold reset will be attempted.
- Return Value:
- Does not return on success, the system is reset.
- STATUS_INVALID_PARAMETER if an invalid reset type was supplied.
- STATUS_NOT_SUPPORTED if the system cannot be reset.
- STATUS_UNSUCCESSFUL if the system did not reset.
- --*/
|