diff options
Diffstat (limited to 'sys/contrib/x86emu/x86emu.h')
-rw-r--r-- | sys/contrib/x86emu/x86emu.h | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/sys/contrib/x86emu/x86emu.h b/sys/contrib/x86emu/x86emu.h new file mode 100644 index 0000000..f25a95b --- /dev/null +++ b/sys/contrib/x86emu/x86emu.h @@ -0,0 +1,184 @@ +/* $NetBSD: x86emu.h,v 1.1 2007/12/01 20:14:10 joerg Exp $ */ +/* $OpenBSD: x86emu.h,v 1.3 2009/06/06 03:45:05 matthieu Exp $ */ +/* $FreeBSD$ */ + +/**************************************************************************** +* +* Realmode X86 Emulator Library +* +* Copyright (C) 1996-1999 SciTech Software, Inc. +* Copyright (C) David Mosberger-Tang +* Copyright (C) 1999 Egbert Eich +* Copyright (C) 2007 Joerg Sonnenberger +* +* ======================================================================== +* +* Permission to use, copy, modify, distribute, and sell this software and +* its documentation for any purpose is hereby granted without fee, +* provided that the above copyright notice appear in all copies and that +* both that copyright notice and this permission notice appear in +* supporting documentation, and that the name of the authors not be used +* in advertising or publicity pertaining to distribution of the software +* without specific, written prior permission. The authors makes no +* representations about the suitability of this software for any purpose. +* It is provided "as is" without express or implied warranty. +* +* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR +* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF +* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +* PERFORMANCE OF THIS SOFTWARE. +* +****************************************************************************/ + +#ifndef __X86EMU_X86EMU_H +#define __X86EMU_X86EMU_H + +#include <sys/types.h> +#include <sys/endian.h> + +#ifdef _KERNEL +#include <sys/systm.h> +#include <machine/setjmp.h> +#else +#include <setjmp.h> +#endif + +/* + * General EAX, EBX, ECX, EDX type registers. Note that for + * portability, and speed, the issue of byte swapping is not addressed + * in the registers. All registers are stored in the default format + * available on the host machine. The only critical issue is that the + * registers should line up EXACTLY in the same manner as they do in + * the 386. That is: + * + * EAX & 0xff === AL + * EAX & 0xffff == AX + * + * etc. The result is that alot of the calculations can then be + * done using the native instruction set fully. + */ + +#ifdef __BIG_ENDIAN__ + +struct x86emu_register32 { + uint32_t e_reg; +}; + +struct x86emu_register16 { + uint16_t filler0; + uint16_t x_reg; +}; + +struct x86emu_register8 { + uint8_t filler0, filler1; + uint8_t h_reg, l_reg; +}; + +#else /* !__BIG_ENDIAN__ */ + +struct x86emu_register32 { + uint32_t e_reg; +}; + +struct x86emu_register16 { + uint16_t x_reg; +}; + +struct x86emu_register8 { + uint8_t l_reg, h_reg; +}; + +#endif /* BIG_ENDIAN */ + +union x86emu_register { + struct x86emu_register32 I32_reg; + struct x86emu_register16 I16_reg; + struct x86emu_register8 I8_reg; +}; + +struct x86emu_regs { + uint16_t register_cs; + uint16_t register_ds; + uint16_t register_es; + uint16_t register_fs; + uint16_t register_gs; + uint16_t register_ss; + uint32_t register_flags; + union x86emu_register register_a; + union x86emu_register register_b; + union x86emu_register register_c; + union x86emu_register register_d; + + union x86emu_register register_sp; + union x86emu_register register_bp; + union x86emu_register register_si; + union x86emu_register register_di; + union x86emu_register register_ip; + + /* + * MODE contains information on: + * REPE prefix 2 bits repe,repne + * SEGMENT overrides 5 bits normal,DS,SS,CS,ES + * Delayed flag set 3 bits (zero, signed, parity) + * reserved 6 bits + * interrupt # 8 bits instruction raised interrupt + * BIOS video segregs 4 bits + * Interrupt Pending 1 bits + * Extern interrupt 1 bits + * Halted 1 bits + */ + uint32_t mode; + volatile int intr; /* mask of pending interrupts */ + uint8_t intno; + uint8_t __pad[3]; +}; + +struct x86emu { + char *mem_base; + size_t mem_size; + void *sys_private; + struct x86emu_regs x86; + + jmp_buf exec_state; + + uint64_t cur_cycles; + + unsigned int cur_mod:2; + unsigned int cur_rl:3; + unsigned int cur_rh:3; + uint32_t cur_offset; + + uint8_t (*emu_rdb)(struct x86emu *, uint32_t addr); + uint16_t (*emu_rdw)(struct x86emu *, uint32_t addr); + uint32_t (*emu_rdl)(struct x86emu *, uint32_t addr); + void (*emu_wrb)(struct x86emu *, uint32_t addr,uint8_t val); + void (*emu_wrw)(struct x86emu *, uint32_t addr, uint16_t val); + void (*emu_wrl)(struct x86emu *, uint32_t addr, uint32_t val); + + uint8_t (*emu_inb)(struct x86emu *, uint16_t addr); + uint16_t (*emu_inw)(struct x86emu *, uint16_t addr); + uint32_t (*emu_inl)(struct x86emu *, uint16_t addr); + void (*emu_outb)(struct x86emu *, uint16_t addr, uint8_t val); + void (*emu_outw)(struct x86emu *, uint16_t addr, uint16_t val); + void (*emu_outl)(struct x86emu *, uint16_t addr, uint32_t val); + + void (*_x86emu_intrTab[256])(struct x86emu *, int); +}; + +__BEGIN_DECLS + +void x86emu_init_default(struct x86emu *); + +/* decode.c */ + +void x86emu_exec(struct x86emu *); +void x86emu_exec_call(struct x86emu *, uint16_t, uint16_t); +void x86emu_exec_intr(struct x86emu *, uint8_t); +void x86emu_halt_sys(struct x86emu *) __dead2; + +__END_DECLS + +#endif /* __X86EMU_X86EMU_H */ |