x86bios.h (197571) | x86bios.h (198251) |
---|---|
1/*- 2 * Copyright (c) 2009 Alex Keda <admin@lissyara.su> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * | 1/*- 2 * Copyright (c) 2009 Alex Keda <admin@lissyara.su> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * |
26 * $FreeBSD: head/sys/compat/x86bios/x86bios.h 198251 2009-10-19 20:58:10Z jkim $ |
|
26 */ 27/* 28 * x86 registers were borrowed from x86emu.h x86emu_regs.h 29 * for compatability. | 27 */ 28/* 29 * x86 registers were borrowed from x86emu.h x86emu_regs.h 30 * for compatability. |
30 * 31 * $FreeBSD: head/sys/compat/x86bios/x86bios.h 197571 2009-09-28 08:14:15Z delphij $ | |
32 */ 33 34#ifndef _X86BIOS_H_ | 31 */ 32 33#ifndef _X86BIOS_H_ |
35#define _X86BIOS_H_ | 34#define _X86BIOS_H_ |
36 | 35 |
37#include <sys/types.h> | |
38#include <sys/endian.h> 39#include <sys/systm.h> | 36#include <sys/endian.h> 37#include <sys/systm.h> |
38#include <sys/types.h> |
|
40 41#ifdef __BIG_ENDIAN__ 42 43struct x86_register32 { | 39 40#ifdef __BIG_ENDIAN__ 41 42struct x86_register32 { |
44 uint32_t e_reg; | 43 uint32_t e_reg; |
45}; 46 47struct x86_register16 { | 44}; 45 46struct x86_register16 { |
48 uint16_t filler0; 49 uint16_t x_reg; | 47 uint16_t filler0; 48 uint16_t x_reg; |
50}; 51 52struct x86_register8 { | 49}; 50 51struct x86_register8 { |
53 uint8_t filler0, filler1; 54 uint8_t h_reg, l_reg; | 52 uint8_t filler0; 53 uint8_t filler1; 54 uint8_t h_reg; 55 uint8_t l_reg; |
55}; 56 57#else /* !__BIG_ENDIAN__ */ 58 59struct x86_register32 { | 56}; 57 58#else /* !__BIG_ENDIAN__ */ 59 60struct x86_register32 { |
60 uint32_t e_reg; | 61 uint32_t e_reg; |
61}; 62 63struct x86_register16 { | 62}; 63 64struct x86_register16 { |
64 uint16_t x_reg; | 65 uint16_t x_reg; |
65}; 66 67struct x86_register8 { | 66}; 67 68struct x86_register8 { |
68 uint8_t l_reg, h_reg; | 69 uint8_t l_reg; 70 uint8_t h_reg; |
69}; 70 71#endif /* __BIG_ENDIAN__ */ 72 73union x86_register { 74 struct x86_register32 I32_reg; 75 struct x86_register16 I16_reg; 76 struct x86_register8 I8_reg; 77}; 78 79struct x86regs { | 71}; 72 73#endif /* __BIG_ENDIAN__ */ 74 75union x86_register { 76 struct x86_register32 I32_reg; 77 struct x86_register16 I16_reg; 78 struct x86_register8 I8_reg; 79}; 80 81struct x86regs { |
80 uint16_t padding; /* CS is unused. */ 81 uint16_t register_ds; | 82 uint16_t _pad0; /* CS */ 83 uint16_t _pad1; /* DS */ |
82 uint16_t register_es; 83 uint16_t register_fs; 84 uint16_t register_gs; | 84 uint16_t register_es; 85 uint16_t register_fs; 86 uint16_t register_gs; |
85 uint16_t register_ss; | 87 uint16_t _pad2; /* SS */ |
86 uint32_t register_flags; 87 union x86_register register_a; 88 union x86_register register_b; 89 union x86_register register_c; 90 union x86_register register_d; 91 | 88 uint32_t register_flags; 89 union x86_register register_a; 90 union x86_register register_b; 91 union x86_register register_c; 92 union x86_register register_d; 93 |
92 union x86_register register_sp; | 94 union x86_register _pad3; /* SP */ |
93 union x86_register register_bp; 94 union x86_register register_si; 95 union x86_register register_di; 96}; 97 98typedef struct x86regs x86regs_t; 99 100/* 8 bit registers */ | 95 union x86_register register_bp; 96 union x86_register register_si; 97 union x86_register register_di; 98}; 99 100typedef struct x86regs x86regs_t; 101 102/* 8 bit registers */ |
101#define R_AH register_a.I8_reg.h_reg 102#define R_AL register_a.I8_reg.l_reg 103#define R_BH register_b.I8_reg.h_reg 104#define R_BL register_b.I8_reg.l_reg 105#define R_CH register_c.I8_reg.h_reg 106#define R_CL register_c.I8_reg.l_reg 107#define R_DH register_d.I8_reg.h_reg 108#define R_DL register_d.I8_reg.l_reg | 103#define R_AH register_a.I8_reg.h_reg 104#define R_AL register_a.I8_reg.l_reg 105#define R_BH register_b.I8_reg.h_reg 106#define R_BL register_b.I8_reg.l_reg 107#define R_CH register_c.I8_reg.h_reg 108#define R_CL register_c.I8_reg.l_reg 109#define R_DH register_d.I8_reg.h_reg 110#define R_DL register_d.I8_reg.l_reg |
109 110/* 16 bit registers */ | 111 112/* 16 bit registers */ |
111#define R_AX register_a.I16_reg.x_reg 112#define R_BX register_b.I16_reg.x_reg 113#define R_CX register_c.I16_reg.x_reg 114#define R_DX register_d.I16_reg.x_reg | 113#define R_AX register_a.I16_reg.x_reg 114#define R_BX register_b.I16_reg.x_reg 115#define R_CX register_c.I16_reg.x_reg 116#define R_DX register_d.I16_reg.x_reg |
115 116/* 32 bit extended registers */ | 117 118/* 32 bit extended registers */ |
117#define R_EAX register_a.I32_reg.e_reg 118#define R_EBX register_b.I32_reg.e_reg 119#define R_ECX register_c.I32_reg.e_reg 120#define R_EDX register_d.I32_reg.e_reg | 119#define R_EAX register_a.I32_reg.e_reg 120#define R_EBX register_b.I32_reg.e_reg 121#define R_ECX register_c.I32_reg.e_reg 122#define R_EDX register_d.I32_reg.e_reg |
121 122/* special registers */ | 123 124/* special registers */ |
123#define R_SP register_sp.I16_reg.x_reg 124#define R_BP register_bp.I16_reg.x_reg 125#define R_SI register_si.I16_reg.x_reg 126#define R_DI register_di.I16_reg.x_reg 127#define R_FLG register_flags | 125#define R_BP register_bp.I16_reg.x_reg 126#define R_SI register_si.I16_reg.x_reg 127#define R_DI register_di.I16_reg.x_reg 128#define R_FLG register_flags |
128 129/* special registers */ | 129 130/* special registers */ |
130#define R_ESP register_sp.I32_reg.e_reg 131#define R_EBP register_bp.I32_reg.e_reg 132#define R_ESI register_si.I32_reg.e_reg 133#define R_EDI register_di.I32_reg.e_reg 134#define R_EFLG register_flags | 131#define R_EBP register_bp.I32_reg.e_reg 132#define R_ESI register_si.I32_reg.e_reg 133#define R_EDI register_di.I32_reg.e_reg 134#define R_EFLG register_flags |
135 136/* segment registers */ | 135 136/* segment registers */ |
137#define R_DS register_ds 138#define R_SS register_ss 139#define R_ES register_es 140#define R_FS register_fs 141#define R_GS register_gs | 137#define R_ES register_es 138#define R_FS register_fs 139#define R_GS register_gs |
142 | 140 |
143#define SEG_ADDR(x) (((x) >> 4) & 0x00F000) 144#define SEG_OFF(x) ((x) & 0x0FFFF) 145#define FARP(x) ((le32toh(x) & 0xffff) + ((le32toh(x) >> 12) & 0xffff00)) | 141#define X86BIOS_PHYSTOSEG(x) (((x) >> 4) & 0xffff) 142#define X86BIOS_PHYSTOOFF(x) ((x) & 0x000f) |
146 | 143 |
147#define MAPPED_MEMORY_SIZE (1024 * 1024) 148#define PAGE_RESERV (4096 * 5) 149 | |
150__BEGIN_DECLS | 144__BEGIN_DECLS |
151void *x86bios_alloc(int count, int *segs); 152void x86bios_free(void *pbuf, int count); 153void x86bios_intr(struct x86regs *regs, int intno); 154void *x86bios_offset(uint32_t offs); | 145void *x86bios_alloc(uint32_t *offset, size_t size); 146void x86bios_call(struct x86regs *regs, uint16_t seg, uint16_t off); 147void x86bios_free(void *addr, size_t size); 148uint32_t x86bios_get_intr(int intno); 149void *x86bios_get_orm(uint32_t offset); 150void x86bios_init_regs(struct x86regs *regs); 151void x86bios_intr(struct x86regs *regs, int intno); 152int x86bios_match_device(uint32_t offset, device_t dev); 153void *x86bios_offset(uint32_t offset); |
155__END_DECLS 156 157#endif /* !_X86BIOS_H_ */ | 154__END_DECLS 155 156#endif /* !_X86BIOS_H_ */ |