/* * Copyright 2012, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. */ #ifndef _BIOS_MODULE_H_ #define _BIOS_MODULE_H_ #include #include /*! BIOS call interface. This module provides a mechanism to call PC BIOS interrupts (e.g. to use the VESA BIOS). Basic usage is as follows: - Call bios_module_info::prepare(). This sets up memory mappings and obtains exclusive access to the BIOS (only 1 thread is able to use the BIOS at a time). - Allocate memory for data that will be passed to BIOS interrupts using bios_module_info::allocate_mem(). This returns a virtual address, to get the physical address to pass to the BIOS use bios_module_info::physical_address(). - Call the BIOS with bios_module_info::interrupt(). - Get the virtual location of any physical addresses returned using bios_module_info::virtual_address(). - Release the BIOS and free created memory mappings with bios_module_info::finish(). */ // Cookie for the BIOS module functions. typedef struct BIOSState bios_state; // Registers to pass to a BIOS interrupt. struct bios_regs { uint32 eax; uint32 ebx; uint32 ecx; uint32 edx; uint32 edi; uint32 esi; uint32 ebp; uint32 eflags; uint32 ds; uint32 es; uint32 fs; uint32 gs; }; struct bios_module_info { module_info info; status_t (*prepare)(bios_state** _state); status_t (*interrupt)(bios_state* state, uint8 vector, bios_regs* regs); void (*finish)(bios_state* state); // Memory management methods. void* (*allocate_mem)(bios_state* state, size_t size); uint32 (*physical_address)(bios_state* state, void* virtualAddress); void* (*virtual_address)(bios_state* state, uint32 physicalAddress); }; #define B_BIOS_MODULE_NAME "generic/bios/v1" #endif // _BIOS_MODULE_H_