⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x86_emulate.h

📁 xen 3.2.2 源码
💻 H
字号:
/****************************************************************************** * x86_emulate.h *  * Generic x86 (32-bit and 64-bit) instruction decoder and emulator. *  * Copyright (c) 2005-2007 Keir Fraser * Copyright (c) 2005-2007 XenSource Inc. *  * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. *  * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#ifndef __X86_EMULATE_H__#define __X86_EMULATE_H__struct x86_emulate_ctxt;/* Comprehensive enumeration of x86 segment registers. */enum x86_segment {    /* General purpose. */    x86_seg_cs,    x86_seg_ss,    x86_seg_ds,    x86_seg_es,    x86_seg_fs,    x86_seg_gs,    /* System. */    x86_seg_tr,    x86_seg_ldtr,    x86_seg_gdtr,    x86_seg_idtr,    /*     * Dummy: used to emulate direct processor accesses to management     * structures (TSS, GDT, LDT, IDT, etc.) which use linear addressing     * (no segment component) and bypass usual segment- and page-level     * protection checks.     */    x86_seg_none};#define is_x86_user_segment(seg) ((unsigned)(seg) <= x86_seg_gs)/*  * Attribute for segment selector. This is a copy of bit 40:47 & 52:55 of the * segment descriptor. It happens to match the format of an AMD SVM VMCB. */typedef union segment_attributes {    uint16_t bytes;    struct    {        uint16_t type:4;    /* 0;  Bit 40-43 */        uint16_t s:   1;    /* 4;  Bit 44 */        uint16_t dpl: 2;    /* 5;  Bit 45-46 */        uint16_t p:   1;    /* 7;  Bit 47 */        uint16_t avl: 1;    /* 8;  Bit 52 */        uint16_t l:   1;    /* 9;  Bit 53 */        uint16_t db:  1;    /* 10; Bit 54 */        uint16_t g:   1;    /* 11; Bit 55 */    } fields;} __attribute__ ((packed)) segment_attributes_t;/* * Full state of a segment register (visible and hidden portions). * Again, this happens to match the format of an AMD SVM VMCB. */struct segment_register {    uint16_t        sel;    segment_attributes_t attr;    uint32_t        limit;    uint64_t        base;} __attribute__ ((packed));/* * Return codes from state-accessor functions and from x86_emulate(). */ /* Completed successfully. State modified appropriately. */#define X86EMUL_OKAY           0 /* Unhandleable access or emulation. No state modified. */#define X86EMUL_UNHANDLEABLE   1 /* Exception raised and requires delivery. */#define X86EMUL_EXCEPTION      2 /* Retry the emulation for some reason. No state modified. */#define X86EMUL_RETRY          3 /* (cmpxchg accessor): CMPXCHG failed. Maps to X86EMUL_RETRY in caller. */#define X86EMUL_CMPXCHG_FAILED 3/* * These operations represent the instruction emulator's interface to memory. *  * NOTES: *  1. If the access fails (cannot emulate, or a standard access faults) then *     it is up to the memop to propagate the fault to the guest VM via *     some out-of-band mechanism, unknown to the emulator. The memop signals *     failure by returning X86EMUL_EXCEPTION to the emulator, which will *     then immediately bail. *  2. Valid access sizes are 1, 2, 4 and 8 bytes. On x86/32 systems only *     cmpxchg8b_emulated need support 8-byte accesses. *  3. The emulator cannot handle 64-bit mode emulation on an x86/32 system. */struct x86_emulate_ops{    /*     * All functions:     *  @ctxt:  [IN ] Emulation context info as passed to the emulator.     * All memory-access functions:     *  @seg:   [IN ] Segment being dereferenced (specified as x86_seg_??).     *  @offset:[IN ] Offset within segment.     * Read functions:     *  @val:   [OUT] Value read, zero-extended to 'ulong'.     * Write functions:     *  @val:   [IN ] Value to write (low-order bytes used as req'd).     * Variable-length access functions:     *  @bytes: [IN ] Number of bytes to read or write.     */    /* read: Emulate a memory read. */    int (*read)(        enum x86_segment seg,        unsigned long offset,        unsigned long *val,        unsigned int bytes,        struct x86_emulate_ctxt *ctxt);    /*     * insn_fetch: Emulate fetch from instruction byte stream.     *  Parameters are same as for 'read'. @seg is always x86_seg_cs.     */    int (*insn_fetch)(        enum x86_segment seg,        unsigned long offset,        unsigned long *val,        unsigned int bytes,        struct x86_emulate_ctxt *ctxt);    /* write: Emulate a memory write. */    int (*write)(        enum x86_segment seg,        unsigned long offset,        unsigned long val,        unsigned int bytes,        struct x86_emulate_ctxt *ctxt);    /*     * cmpxchg: Emulate an atomic (LOCKed) CMPXCHG operation.     *  @old:   [IN ] Value expected to be current at @addr.     *  @new:   [IN ] Value to write to @addr.     */    int (*cmpxchg)(        enum x86_segment seg,        unsigned long offset,        unsigned long old,        unsigned long new,        unsigned int bytes,        struct x86_emulate_ctxt *ctxt);    /*     * cmpxchg8b: Emulate an atomic (LOCKed) CMPXCHG8B operation.     *  @old:   [IN ] Value expected to be current at @addr.     *  @new:   [IN ] Value to write to @addr.     * NOTES:     *  1. This function is only ever called when emulating a real CMPXCHG8B.     *  2. This function is *never* called on x86/64 systems.     *  2. Not defining this function (i.e., specifying NULL) is equivalent     *     to defining a function that always returns X86EMUL_UNHANDLEABLE.     */    int (*cmpxchg8b)(        enum x86_segment seg,        unsigned long offset,        unsigned long old_lo,        unsigned long old_hi,        unsigned long new_lo,        unsigned long new_hi,        struct x86_emulate_ctxt *ctxt);    /*     * rep_ins: Emulate INS: <src_port> -> <dst_seg:dst_offset>.     *  @bytes_per_rep: [IN ] Bytes transferred per repetition.     *  @reps:  [IN ] Maximum repetitions to be emulated.     *          [OUT] Number of repetitions actually emulated.     */    int (*rep_ins)(        uint16_t src_port,        enum x86_segment dst_seg,        unsigned long dst_offset,        unsigned int bytes_per_rep,        unsigned long *reps,        struct x86_emulate_ctxt *ctxt);    /*     * rep_outs: Emulate OUTS: <src_seg:src_offset> -> <dst_port>.     *  @bytes_per_rep: [IN ] Bytes transferred per repetition.     *  @reps:  [IN ] Maximum repetitions to be emulated.     *          [OUT] Number of repetitions actually emulated.     */    int (*rep_outs)(        enum x86_segment src_seg,        unsigned long src_offset,        uint16_t dst_port,        unsigned int bytes_per_rep,        unsigned long *reps,        struct x86_emulate_ctxt *ctxt);    /*     * rep_movs: Emulate MOVS: <src_seg:src_offset> -> <dst_seg:dst_offset>.     *  @bytes_per_rep: [IN ] Bytes transferred per repetition.     *  @reps:  [IN ] Maximum repetitions to be emulated.     *          [OUT] Number of repetitions actually emulated.     */    int (*rep_movs)(        enum x86_segment src_seg,        unsigned long src_offset,        enum x86_segment dst_seg,        unsigned long dst_offset,        unsigned int bytes_per_rep,        unsigned long *reps,        struct x86_emulate_ctxt *ctxt);    /*     * read_segment: Emulate a read of full context of a segment register.     *  @reg:   [OUT] Contents of segment register (visible and hidden state).     */    int (*read_segment)(        enum x86_segment seg,        struct segment_register *reg,        struct x86_emulate_ctxt *ctxt);    /*     * write_segment: Emulate a read of full context of a segment register.     *  @reg:   [OUT] Contents of segment register (visible and hidden state).     */    int (*write_segment)(        enum x86_segment seg,        struct segment_register *reg,        struct x86_emulate_ctxt *ctxt);    /*     * read_io: Read from I/O port(s).     *  @port:  [IN ] Base port for access.     */    int (*read_io)(        unsigned int port,        unsigned int bytes,        unsigned long *val,        struct x86_emulate_ctxt *ctxt);    /*     * write_io: Write to I/O port(s).     *  @port:  [IN ] Base port for access.     */    int (*write_io)(        unsigned int port,        unsigned int bytes,        unsigned long val,        struct x86_emulate_ctxt *ctxt);    /*     * read_cr: Read from control register.     *  @reg:   [IN ] Register to read (0-15).     */    int (*read_cr)(        unsigned int reg,        unsigned long *val,        struct x86_emulate_ctxt *ctxt);    /*     * write_cr: Write to control register.     *  @reg:   [IN ] Register to write (0-15).     */    int (*write_cr)(        unsigned int reg,        unsigned long val,        struct x86_emulate_ctxt *ctxt);    /*     * read_dr: Read from debug register.     *  @reg:   [IN ] Register to read (0-15).     */    int (*read_dr)(        unsigned int reg,        unsigned long *val,        struct x86_emulate_ctxt *ctxt);    /*     * write_dr: Write to debug register.     *  @reg:   [IN ] Register to write (0-15).     */    int (*write_dr)(        unsigned int reg,        unsigned long val,        struct x86_emulate_ctxt *ctxt);    /*     * read_msr: Read from model-specific register.     *  @reg:   [IN ] Register to read.     */    int (*read_msr)(        unsigned long reg,        uint64_t *val,        struct x86_emulate_ctxt *ctxt);    /*     * write_dr: Write to model-specific register.     *  @reg:   [IN ] Register to write.     */    int (*write_msr)(        unsigned long reg,        uint64_t val,        struct x86_emulate_ctxt *ctxt);    /* write_rflags: Modify privileged bits in RFLAGS. */    int (*write_rflags)(        unsigned long val,        struct x86_emulate_ctxt *ctxt);    /* wbinvd: Write-back and invalidate cache contents. */    int (*wbinvd)(        struct x86_emulate_ctxt *ctxt);    /* cpuid: Emulate CPUID via given set of EAX-EDX inputs/outputs. */    int (*cpuid)(        unsigned int *eax,        unsigned int *ebx,        unsigned int *ecx,        unsigned int *edx,        struct x86_emulate_ctxt *ctxt);    /* hlt: Emulate HLT. */    int (*hlt)(        struct x86_emulate_ctxt *ctxt);    /* inject_hw_exception */    int (*inject_hw_exception)(        uint8_t vector,        uint16_t error_code,        struct x86_emulate_ctxt *ctxt);    /* inject_sw_interrupt */    int (*inject_sw_interrupt)(        uint8_t vector,        uint8_t insn_len,        struct x86_emulate_ctxt *ctxt);    /* load_fpu_ctxt: Load emulated environment's FPU state onto processor. */    void (*load_fpu_ctxt)(        struct x86_emulate_ctxt *ctxt);};struct cpu_user_regs;struct x86_emulate_ctxt{    /* Register state before/after emulation. */    struct cpu_user_regs *regs;    /* Default address size in current execution mode (16, 32, or 64). */    unsigned int addr_size;    /* Stack pointer width in bits (16, 32 or 64). */    unsigned int sp_size;};/* * x86_emulate: Emulate an instruction. * Returns -1 on failure, 0 on success. */intx86_emulate(    struct x86_emulate_ctxt *ctxt,    struct x86_emulate_ops  *ops);/* * Given the 'reg' portion of a ModRM byte, and a register block, return a * pointer into the block that addresses the relevant register. * @highbyte_regs specifies whether to decode AH,CH,DH,BH. */void *decode_register(    uint8_t modrm_reg, struct cpu_user_regs *regs, int highbyte_regs);#endif /* __X86_EMULATE_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -