root/headers/os/drivers/bios.h
/*
 * 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_