1/*
2 * Copyright 2012, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _BIOS_MODULE_H_
6#define _BIOS_MODULE_H_
7
8
9#include <OS.h>
10#include <module.h>
11
12
13/*!	BIOS call interface.
14
15	This module provides a mechanism to call PC BIOS interrupts (e.g. to use
16	the VESA BIOS).
17
18	Basic usage is as follows:
19	 - Call bios_module_info::prepare(). This sets up memory mappings and
20	   obtains exclusive access to the BIOS (only 1 thread is able to use the
21	   BIOS at a time).
22	 - Allocate memory for data that will be passed to BIOS interrupts using
23	   bios_module_info::allocate_mem(). This returns a virtual address, to
24	   get the physical address to pass to the BIOS use
25	   bios_module_info::physical_address().
26	 - Call the BIOS with bios_module_info::interrupt().
27	 - Get the virtual location of any physical addresses returned using
28	   bios_module_info::virtual_address().
29	 - Release the BIOS and free created memory mappings with
30	   bios_module_info::finish().
31
32*/
33
34
35// Cookie for the BIOS module functions.
36typedef struct BIOSState bios_state;
37
38
39// Registers to pass to a BIOS interrupt.
40struct bios_regs {
41	uint32	eax;
42	uint32	ebx;
43	uint32	ecx;
44	uint32	edx;
45	uint32	edi;
46	uint32	esi;
47	uint32	ebp;
48	uint32	eflags;
49	uint32	ds;
50	uint32	es;
51	uint32	fs;
52	uint32	gs;
53};
54
55
56struct bios_module_info {
57	module_info	info;
58
59	status_t	(*prepare)(bios_state** _state);
60	status_t	(*interrupt)(bios_state* state, uint8 vector, bios_regs* regs);
61	void		(*finish)(bios_state* state);
62
63	// Memory management methods.
64	void*		(*allocate_mem)(bios_state* state, size_t size);
65	uint32		(*physical_address)(bios_state* state, void* virtualAddress);
66	void*		(*virtual_address)(bios_state* state, uint32 physicalAddress);
67};
68
69
70#define B_BIOS_MODULE_NAME "generic/bios/v1"
71
72
73#endif	// _BIOS_MODULE_H_
74