74 lines
1.8 KiB
C
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_
|