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 * 263219f535SJung-uk Kim * $FreeBSD$ 273d0cd005SXin LI */ 283d0cd005SXin LI /* 2919de5df5SJung-uk Kim * x86 registers were borrowed from x86emu.h x86emu_regs.h 3019de5df5SJung-uk Kim * for compatability. 3119de5df5SJung-uk Kim */ 3219de5df5SJung-uk Kim 3319de5df5SJung-uk Kim #ifndef _X86BIOS_H_ 3419de5df5SJung-uk Kim #define _X86BIOS_H_ 3519de5df5SJung-uk Kim 3619de5df5SJung-uk Kim #include <sys/endian.h> 3719de5df5SJung-uk Kim #include <sys/systm.h> 383219f535SJung-uk Kim #include <sys/types.h> 3919de5df5SJung-uk Kim 4019de5df5SJung-uk Kim #ifdef __BIG_ENDIAN__ 4119de5df5SJung-uk Kim 4219de5df5SJung-uk Kim struct x86_register32 { 4319de5df5SJung-uk Kim uint32_t e_reg; 4419de5df5SJung-uk Kim }; 4519de5df5SJung-uk Kim 4619de5df5SJung-uk Kim struct x86_register16 { 4719de5df5SJung-uk Kim uint16_t filler0; 4819de5df5SJung-uk Kim uint16_t x_reg; 4919de5df5SJung-uk Kim }; 5019de5df5SJung-uk Kim 5119de5df5SJung-uk Kim struct x86_register8 { 523219f535SJung-uk Kim uint8_t filler0; 533219f535SJung-uk Kim uint8_t filler1; 543219f535SJung-uk Kim uint8_t h_reg; 553219f535SJung-uk Kim uint8_t l_reg; 5619de5df5SJung-uk Kim }; 5719de5df5SJung-uk Kim 5819de5df5SJung-uk Kim #else /* !__BIG_ENDIAN__ */ 5919de5df5SJung-uk Kim 6019de5df5SJung-uk Kim struct x86_register32 { 6119de5df5SJung-uk Kim uint32_t e_reg; 6219de5df5SJung-uk Kim }; 6319de5df5SJung-uk Kim 6419de5df5SJung-uk Kim struct x86_register16 { 6519de5df5SJung-uk Kim uint16_t x_reg; 6619de5df5SJung-uk Kim }; 6719de5df5SJung-uk Kim 6819de5df5SJung-uk Kim struct x86_register8 { 693219f535SJung-uk Kim uint8_t l_reg; 703219f535SJung-uk Kim uint8_t h_reg; 7119de5df5SJung-uk Kim }; 7219de5df5SJung-uk Kim 7319de5df5SJung-uk Kim #endif /* __BIG_ENDIAN__ */ 7419de5df5SJung-uk Kim 7519de5df5SJung-uk Kim union x86_register { 7619de5df5SJung-uk Kim struct x86_register32 I32_reg; 7719de5df5SJung-uk Kim struct x86_register16 I16_reg; 7819de5df5SJung-uk Kim struct x86_register8 I8_reg; 7919de5df5SJung-uk Kim }; 8019de5df5SJung-uk Kim 8119de5df5SJung-uk Kim struct x86regs { 823219f535SJung-uk Kim uint16_t _pad0; /* CS */ 833219f535SJung-uk Kim uint16_t _pad1; /* DS */ 8419de5df5SJung-uk Kim uint16_t register_es; 8519de5df5SJung-uk Kim uint16_t register_fs; 8619de5df5SJung-uk Kim uint16_t register_gs; 873219f535SJung-uk Kim uint16_t _pad2; /* SS */ 8819de5df5SJung-uk Kim uint32_t register_flags; 8919de5df5SJung-uk Kim union x86_register register_a; 9019de5df5SJung-uk Kim union x86_register register_b; 9119de5df5SJung-uk Kim union x86_register register_c; 9219de5df5SJung-uk Kim union x86_register register_d; 9319de5df5SJung-uk Kim 943219f535SJung-uk Kim union x86_register _pad3; /* SP */ 9519de5df5SJung-uk Kim union x86_register register_bp; 9619de5df5SJung-uk Kim union x86_register register_si; 9719de5df5SJung-uk Kim union x86_register register_di; 9819de5df5SJung-uk Kim }; 9919de5df5SJung-uk Kim 10019de5df5SJung-uk Kim typedef struct x86regs x86regs_t; 10119de5df5SJung-uk Kim 10219de5df5SJung-uk Kim /* 8 bit registers */ 10319de5df5SJung-uk Kim #define R_AH register_a.I8_reg.h_reg 10419de5df5SJung-uk Kim #define R_AL register_a.I8_reg.l_reg 10519de5df5SJung-uk Kim #define R_BH register_b.I8_reg.h_reg 10619de5df5SJung-uk Kim #define R_BL register_b.I8_reg.l_reg 10719de5df5SJung-uk Kim #define R_CH register_c.I8_reg.h_reg 10819de5df5SJung-uk Kim #define R_CL register_c.I8_reg.l_reg 10919de5df5SJung-uk Kim #define R_DH register_d.I8_reg.h_reg 11019de5df5SJung-uk Kim #define R_DL register_d.I8_reg.l_reg 11119de5df5SJung-uk Kim 11219de5df5SJung-uk Kim /* 16 bit registers */ 11319de5df5SJung-uk Kim #define R_AX register_a.I16_reg.x_reg 11419de5df5SJung-uk Kim #define R_BX register_b.I16_reg.x_reg 11519de5df5SJung-uk Kim #define R_CX register_c.I16_reg.x_reg 11619de5df5SJung-uk Kim #define R_DX register_d.I16_reg.x_reg 11719de5df5SJung-uk Kim 11819de5df5SJung-uk Kim /* 32 bit extended registers */ 11919de5df5SJung-uk Kim #define R_EAX register_a.I32_reg.e_reg 12019de5df5SJung-uk Kim #define R_EBX register_b.I32_reg.e_reg 12119de5df5SJung-uk Kim #define R_ECX register_c.I32_reg.e_reg 12219de5df5SJung-uk Kim #define R_EDX register_d.I32_reg.e_reg 12319de5df5SJung-uk Kim 12419de5df5SJung-uk Kim /* special registers */ 12519de5df5SJung-uk Kim #define R_BP register_bp.I16_reg.x_reg 12619de5df5SJung-uk Kim #define R_SI register_si.I16_reg.x_reg 12719de5df5SJung-uk Kim #define R_DI register_di.I16_reg.x_reg 12819de5df5SJung-uk Kim #define R_FLG register_flags 12919de5df5SJung-uk Kim 13019de5df5SJung-uk Kim /* special registers */ 13119de5df5SJung-uk Kim #define R_EBP register_bp.I32_reg.e_reg 13219de5df5SJung-uk Kim #define R_ESI register_si.I32_reg.e_reg 13319de5df5SJung-uk Kim #define R_EDI register_di.I32_reg.e_reg 13419de5df5SJung-uk Kim #define R_EFLG register_flags 13519de5df5SJung-uk Kim 13619de5df5SJung-uk Kim /* segment registers */ 13719de5df5SJung-uk Kim #define R_ES register_es 13819de5df5SJung-uk Kim #define R_FS register_fs 13919de5df5SJung-uk Kim #define R_GS register_gs 14019de5df5SJung-uk Kim 1413219f535SJung-uk Kim #define X86BIOS_PHYSTOSEG(x) (((x) >> 4) & 0xffff) 1423219f535SJung-uk Kim #define X86BIOS_PHYSTOOFF(x) ((x) & 0x000f) 14319de5df5SJung-uk Kim 14419de5df5SJung-uk Kim __BEGIN_DECLS 145*362487c0SJung-uk Kim void *x86bios_alloc(uint32_t *offset, size_t size, int flags); 1463219f535SJung-uk Kim void x86bios_call(struct x86regs *regs, uint16_t seg, uint16_t off); 1473219f535SJung-uk Kim void x86bios_free(void *addr, size_t size); 1483219f535SJung-uk Kim uint32_t x86bios_get_intr(int intno); 1493219f535SJung-uk Kim void *x86bios_get_orm(uint32_t offset); 1503219f535SJung-uk Kim void x86bios_init_regs(struct x86regs *regs); 151a8672748SJung-uk Kim void x86bios_intr(struct x86regs *regs, int intno); 1523219f535SJung-uk Kim int x86bios_match_device(uint32_t offset, device_t dev); 1533219f535SJung-uk Kim void *x86bios_offset(uint32_t offset); 15419de5df5SJung-uk Kim __END_DECLS 15519de5df5SJung-uk Kim 15619de5df5SJung-uk Kim #endif /* !_X86BIOS_H_ */ 157