haiku/headers/os/drivers/bios.h

74 lines
1.8 KiB
C

/*
* Copyright 2012, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _BIOS_MODULE_H_
#define _BIOS_MODULE_H_
#include <OS.h>
#include <module.h>
/*! 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_