119de5df5SJung-uk Kim /*- 23d0cd005SXin LI * Copyright (c) 2009 Alex Keda <admin@lissyara.su> 33d0cd005SXin LI * All rights reserved. 419de5df5SJung-uk Kim * 53d0cd005SXin LI * Redistribution and use in source and binary forms, with or without 63d0cd005SXin LI * modification, are permitted provided that the following conditions 73d0cd005SXin LI * are met: 83d0cd005SXin LI * 1. Redistributions of source code must retain the above copyright 93d0cd005SXin LI * notice, this list of conditions and the following disclaimer. 103d0cd005SXin LI * 2. Redistributions in binary form must reproduce the above copyright 113d0cd005SXin LI * notice, this list of conditions and the following disclaimer in the 123d0cd005SXin LI * documentation and/or other materials provided with the distribution. 133d0cd005SXin LI * 143d0cd005SXin LI * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 153d0cd005SXin LI * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 163d0cd005SXin LI * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 173d0cd005SXin LI * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 183d0cd005SXin LI * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 193d0cd005SXin LI * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 203d0cd005SXin LI * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 213d0cd005SXin LI * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 223d0cd005SXin LI * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 233d0cd005SXin LI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 243d0cd005SXin LI * SUCH DAMAGE. 253d0cd005SXin LI */ 263d0cd005SXin LI /* 2719de5df5SJung-uk Kim * x86 registers were borrowed from x86emu.h x86emu_regs.h 28*2bede1b8SPedro F. Giffuni * for compatibility. 2919de5df5SJung-uk Kim */ 3019de5df5SJung-uk Kim 3119de5df5SJung-uk Kim #ifndef _X86BIOS_H_ 3219de5df5SJung-uk Kim #define _X86BIOS_H_ 3319de5df5SJung-uk Kim 3419de5df5SJung-uk Kim #include <sys/endian.h> 3519de5df5SJung-uk Kim #include <sys/systm.h> 363219f535SJung-uk Kim #include <sys/types.h> 3719de5df5SJung-uk Kim 3819de5df5SJung-uk Kim #ifdef __BIG_ENDIAN__ 3919de5df5SJung-uk Kim 4019de5df5SJung-uk Kim struct x86_register32 { 4119de5df5SJung-uk Kim uint32_t e_reg; 4219de5df5SJung-uk Kim }; 4319de5df5SJung-uk Kim 4419de5df5SJung-uk Kim struct x86_register16 { 4519de5df5SJung-uk Kim uint16_t filler0; 4619de5df5SJung-uk Kim uint16_t x_reg; 4719de5df5SJung-uk Kim }; 4819de5df5SJung-uk Kim 4919de5df5SJung-uk Kim struct x86_register8 { 503219f535SJung-uk Kim uint8_t filler0; 513219f535SJung-uk Kim uint8_t filler1; 523219f535SJung-uk Kim uint8_t h_reg; 533219f535SJung-uk Kim uint8_t l_reg; 5419de5df5SJung-uk Kim }; 5519de5df5SJung-uk Kim 5619de5df5SJung-uk Kim #else /* !__BIG_ENDIAN__ */ 5719de5df5SJung-uk Kim 5819de5df5SJung-uk Kim struct x86_register32 { 5919de5df5SJung-uk Kim uint32_t e_reg; 6019de5df5SJung-uk Kim }; 6119de5df5SJung-uk Kim 6219de5df5SJung-uk Kim struct x86_register16 { 6319de5df5SJung-uk Kim uint16_t x_reg; 6419de5df5SJung-uk Kim }; 6519de5df5SJung-uk Kim 6619de5df5SJung-uk Kim struct x86_register8 { 673219f535SJung-uk Kim uint8_t l_reg; 683219f535SJung-uk Kim uint8_t h_reg; 6919de5df5SJung-uk Kim }; 7019de5df5SJung-uk Kim 7119de5df5SJung-uk Kim #endif /* __BIG_ENDIAN__ */ 7219de5df5SJung-uk Kim 7319de5df5SJung-uk Kim union x86_register { 7419de5df5SJung-uk Kim struct x86_register32 I32_reg; 7519de5df5SJung-uk Kim struct x86_register16 I16_reg; 7619de5df5SJung-uk Kim struct x86_register8 I8_reg; 7719de5df5SJung-uk Kim }; 7819de5df5SJung-uk Kim 7919de5df5SJung-uk Kim struct x86regs { 803219f535SJung-uk Kim uint16_t _pad0; /* CS */ 813219f535SJung-uk Kim uint16_t _pad1; /* DS */ 8219de5df5SJung-uk Kim uint16_t register_es; 8319de5df5SJung-uk Kim uint16_t register_fs; 8419de5df5SJung-uk Kim uint16_t register_gs; 853219f535SJung-uk Kim uint16_t _pad2; /* SS */ 8619de5df5SJung-uk Kim uint32_t register_flags; 8719de5df5SJung-uk Kim union x86_register register_a; 8819de5df5SJung-uk Kim union x86_register register_b; 8919de5df5SJung-uk Kim union x86_register register_c; 9019de5df5SJung-uk Kim union x86_register register_d; 9119de5df5SJung-uk Kim 923219f535SJung-uk Kim union x86_register _pad3; /* SP */ 9319de5df5SJung-uk Kim union x86_register register_bp; 9419de5df5SJung-uk Kim union x86_register register_si; 9519de5df5SJung-uk Kim union x86_register register_di; 9619de5df5SJung-uk Kim }; 9719de5df5SJung-uk Kim 9819de5df5SJung-uk Kim typedef struct x86regs x86regs_t; 9919de5df5SJung-uk Kim 10019de5df5SJung-uk Kim /* 8 bit registers */ 10119de5df5SJung-uk Kim #define R_AH register_a.I8_reg.h_reg 10219de5df5SJung-uk Kim #define R_AL register_a.I8_reg.l_reg 10319de5df5SJung-uk Kim #define R_BH register_b.I8_reg.h_reg 10419de5df5SJung-uk Kim #define R_BL register_b.I8_reg.l_reg 10519de5df5SJung-uk Kim #define R_CH register_c.I8_reg.h_reg 10619de5df5SJung-uk Kim #define R_CL register_c.I8_reg.l_reg 10719de5df5SJung-uk Kim #define R_DH register_d.I8_reg.h_reg 10819de5df5SJung-uk Kim #define R_DL register_d.I8_reg.l_reg 10919de5df5SJung-uk Kim 11019de5df5SJung-uk Kim /* 16 bit registers */ 11119de5df5SJung-uk Kim #define R_AX register_a.I16_reg.x_reg 11219de5df5SJung-uk Kim #define R_BX register_b.I16_reg.x_reg 11319de5df5SJung-uk Kim #define R_CX register_c.I16_reg.x_reg 11419de5df5SJung-uk Kim #define R_DX register_d.I16_reg.x_reg 11519de5df5SJung-uk Kim 11619de5df5SJung-uk Kim /* 32 bit extended registers */ 11719de5df5SJung-uk Kim #define R_EAX register_a.I32_reg.e_reg 11819de5df5SJung-uk Kim #define R_EBX register_b.I32_reg.e_reg 11919de5df5SJung-uk Kim #define R_ECX register_c.I32_reg.e_reg 12019de5df5SJung-uk Kim #define R_EDX register_d.I32_reg.e_reg 12119de5df5SJung-uk Kim 12219de5df5SJung-uk Kim /* special registers */ 12319de5df5SJung-uk Kim #define R_BP register_bp.I16_reg.x_reg 12419de5df5SJung-uk Kim #define R_SI register_si.I16_reg.x_reg 12519de5df5SJung-uk Kim #define R_DI register_di.I16_reg.x_reg 12619de5df5SJung-uk Kim #define R_FLG register_flags 12719de5df5SJung-uk Kim 12819de5df5SJung-uk Kim /* special registers */ 12919de5df5SJung-uk Kim #define R_EBP register_bp.I32_reg.e_reg 13019de5df5SJung-uk Kim #define R_ESI register_si.I32_reg.e_reg 13119de5df5SJung-uk Kim #define R_EDI register_di.I32_reg.e_reg 13219de5df5SJung-uk Kim #define R_EFLG register_flags 13319de5df5SJung-uk Kim 13419de5df5SJung-uk Kim /* segment registers */ 13519de5df5SJung-uk Kim #define R_ES register_es 13619de5df5SJung-uk Kim #define R_FS register_fs 13719de5df5SJung-uk Kim #define R_GS register_gs 13819de5df5SJung-uk Kim 139439f3d8bSJung-uk Kim #define X86BIOS_PHYSTOSEG(x) (((x) >> 4) & 0xff00) 140439f3d8bSJung-uk Kim #define X86BIOS_PHYSTOOFF(x) ((x) & 0x0fff) 14119de5df5SJung-uk Kim 14219de5df5SJung-uk Kim __BEGIN_DECLS 143362487c0SJung-uk Kim void *x86bios_alloc(uint32_t *offset, size_t size, int flags); 1443219f535SJung-uk Kim void x86bios_call(struct x86regs *regs, uint16_t seg, uint16_t off); 1453219f535SJung-uk Kim void x86bios_free(void *addr, size_t size); 1463219f535SJung-uk Kim uint32_t x86bios_get_intr(int intno); 1473219f535SJung-uk Kim void *x86bios_get_orm(uint32_t offset); 1483219f535SJung-uk Kim void x86bios_init_regs(struct x86regs *regs); 149a8672748SJung-uk Kim void x86bios_intr(struct x86regs *regs, int intno); 1503219f535SJung-uk Kim int x86bios_match_device(uint32_t offset, device_t dev); 1513219f535SJung-uk Kim void *x86bios_offset(uint32_t offset); 15297e6525dSJung-uk Kim void x86bios_set_intr(int intno, uint32_t saddr); 15319de5df5SJung-uk Kim __END_DECLS 15419de5df5SJung-uk Kim 15519de5df5SJung-uk Kim #endif /* !_X86BIOS_H_ */ 156