mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-09 00:46:12 +00:00
278 lines
8.8 KiB
C
278 lines
8.8 KiB
C
/*
|
|
This file is part of Valgrind, a dynamic binary instrumentation
|
|
framework.
|
|
|
|
Copyright (C) 2012-2015 Citrix
|
|
|
|
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.
|
|
|
|
The GNU General Public License is contained in the file COPYING.
|
|
*/
|
|
|
|
/* Contributed by Andrew Cooper <andrew.cooper3@citrix.com>
|
|
and Ian Campbell <ian.campbell@citrix.com> */
|
|
|
|
#ifndef __VKI_XEN_X86_H
|
|
#define __VKI_XEN_X86_H
|
|
|
|
#if defined(__i386__)
|
|
#define ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type) \
|
|
typedef struct { type *p; } \
|
|
__vki_xen_guest_handle_ ## name; \
|
|
typedef struct { union { type *p; vki_xen_uint64_aligned_t q; }; } \
|
|
__vki_xen_guest_handle_64_ ## name
|
|
#define vki_xen_uint64_aligned_t vki_uint64_t __attribute__((aligned(8)))
|
|
#define __VKI_XEN_GUEST_HANDLE_64(name) __vki_xen_guest_handle_64_ ## name
|
|
#define VKI_XEN_GUEST_HANDLE_64(name) __VKI_XEN_GUEST_HANDLE_64(name)
|
|
#else
|
|
#define ___DEFINE_VKI_XEN_GUEST_HANDLE(name, type) \
|
|
typedef struct { type *p; } __vki_xen_guest_handle_ ## name
|
|
#define vki_xen_uint64_aligned_t vki_uint64_t
|
|
#define __DEFINE_VKI_XEN_GUEST_HANDLE(name, type) \
|
|
___DEFINE_VKI_XEN_GUEST_HANDLE(name, type); \
|
|
___DEFINE_VKI_XEN_GUEST_HANDLE(const_##name, const type)
|
|
#define DEFINE_VKI_XEN_GUEST_HANDLE(name) __DEFINE_VKI_XEN_GUEST_HANDLE(name, name)
|
|
#define VKI_XEN_GUEST_HANDLE_64(name) VKI_XEN_GUEST_HANDLE(name)
|
|
#endif
|
|
|
|
#define __VKI_XEN_GUEST_HANDLE(name) __vki_xen_guest_handle_ ## name
|
|
#define VKI_XEN_GUEST_HANDLE(name) __VKI_XEN_GUEST_HANDLE(name)
|
|
|
|
typedef unsigned long vki_xen_pfn_t;
|
|
typedef unsigned long vki_xen_ulong_t;
|
|
|
|
#if defined(__i386__)
|
|
struct vki_xen_cpu_user_regs {
|
|
vki_uint32_t ebx;
|
|
vki_uint32_t ecx;
|
|
vki_uint32_t edx;
|
|
vki_uint32_t esi;
|
|
vki_uint32_t edi;
|
|
vki_uint32_t ebp;
|
|
vki_uint32_t eax;
|
|
vki_uint16_t error_code; /* private */
|
|
vki_uint16_t entry_vector; /* private */
|
|
vki_uint32_t eip;
|
|
vki_uint16_t cs;
|
|
vki_uint8_t saved_upcall_mask;
|
|
vki_uint8_t _pad0;
|
|
vki_uint32_t eflags; /* eflags.IF == !saved_upcall_mask */
|
|
vki_uint32_t esp;
|
|
vki_uint16_t ss, _pad1;
|
|
vki_uint16_t es, _pad2;
|
|
vki_uint16_t ds, _pad3;
|
|
vki_uint16_t fs, _pad4;
|
|
vki_uint16_t gs, _pad5;
|
|
};
|
|
#else
|
|
struct vki_xen_cpu_user_regs {
|
|
vki_uint64_t r15;
|
|
vki_uint64_t r14;
|
|
vki_uint64_t r13;
|
|
vki_uint64_t r12;
|
|
vki_uint64_t rbp;
|
|
vki_uint64_t rbx;
|
|
vki_uint64_t r11;
|
|
vki_uint64_t r10;
|
|
vki_uint64_t r9;
|
|
vki_uint64_t r8;
|
|
vki_uint64_t rax;
|
|
vki_uint64_t rcx;
|
|
vki_uint64_t rdx;
|
|
vki_uint64_t rsi;
|
|
vki_uint64_t rdi;
|
|
vki_uint32_t error_code; /* private */
|
|
vki_uint32_t entry_vector; /* private */
|
|
vki_uint64_t rip;
|
|
vki_uint16_t cs, _pad0[1];
|
|
vki_uint8_t saved_upcall_mask;
|
|
vki_uint8_t _pad1[3];
|
|
vki_uint64_t rflags; /* rflags.IF == !saved_upcall_mask */
|
|
vki_uint64_t rsp;
|
|
vki_uint16_t ss, _pad2[3];
|
|
vki_uint16_t es, _pad3[3];
|
|
vki_uint16_t ds, _pad4[3];
|
|
vki_uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base. */
|
|
vki_uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
|
|
};
|
|
#endif
|
|
|
|
struct vki_xen_trap_info {
|
|
vki_uint8_t vector; /* exception vector */
|
|
vki_uint8_t flags; /* 0-3: privilege level; 4: clear event enable? */
|
|
vki_uint16_t cs; /* code selector */
|
|
unsigned long address; /* code offset */
|
|
};
|
|
|
|
struct vki_xen_vcpu_guest_context {
|
|
/* FPU registers come first so they can be aligned for FXSAVE/FXRSTOR. */
|
|
struct { char x[512]; } fpu_ctxt; /* User-level FPU registers */
|
|
unsigned long flags; /* VGCF_* flags */
|
|
struct vki_xen_cpu_user_regs user_regs; /* User-level CPU registers */
|
|
struct vki_xen_trap_info trap_ctxt[256];/* Virtual IDT */
|
|
unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents) */
|
|
unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */
|
|
unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */
|
|
/* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */
|
|
unsigned long ctrlreg[8]; /* CR0-CR7 (control registers) */
|
|
unsigned long debugreg[8]; /* DB0-DB7 (debug registers) */
|
|
#ifdef __i386__
|
|
unsigned long event_callback_cs; /* CS:EIP of event callback */
|
|
unsigned long event_callback_eip;
|
|
unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */
|
|
unsigned long failsafe_callback_eip;
|
|
#else
|
|
unsigned long event_callback_eip;
|
|
unsigned long failsafe_callback_eip;
|
|
unsigned long syscall_callback_eip;
|
|
#endif
|
|
unsigned long vm_assist; /* VMASST_TYPE_* bitmap */
|
|
#ifdef __x86_64__
|
|
/* Segment base addresses. */
|
|
vki_uint64_t fs_base;
|
|
vki_uint64_t gs_base_kernel;
|
|
vki_uint64_t gs_base_user;
|
|
#endif
|
|
};
|
|
typedef struct vki_xen_vcpu_guest_context vki_xen_vcpu_guest_context_t;
|
|
DEFINE_VKI_XEN_GUEST_HANDLE(vki_xen_vcpu_guest_context_t);
|
|
|
|
|
|
/* HVM_SAVE types and declarations for getcontext_partial */
|
|
# define VKI_DECLARE_HVM_SAVE_TYPE(_x, _code, _type) \
|
|
struct __VKI_HVM_SAVE_TYPE_##_x { _type t; char c[_code]; char cpt[1];}
|
|
|
|
#define VKI_HVM_SAVE_TYPE(_x) typeof (((struct __VKI_HVM_SAVE_TYPE_##_x *)(0))->t)
|
|
#define VKI_HVM_SAVE_LENGTH(_x) (sizeof (VKI_HVM_SAVE_TYPE(_x)))
|
|
#define VKI_HVM_SAVE_CODE(_x) (sizeof (((struct __VKI_HVM_SAVE_TYPE_##_x *)(0))->c))
|
|
|
|
struct vki_hvm_hw_cpu {
|
|
vki_uint8_t fpu_regs[512];
|
|
|
|
vki_uint64_t rax;
|
|
vki_uint64_t rbx;
|
|
vki_uint64_t rcx;
|
|
vki_uint64_t rdx;
|
|
vki_uint64_t rbp;
|
|
vki_uint64_t rsi;
|
|
vki_uint64_t rdi;
|
|
vki_uint64_t rsp;
|
|
vki_uint64_t r8;
|
|
vki_uint64_t r9;
|
|
vki_uint64_t r10;
|
|
vki_uint64_t r11;
|
|
vki_uint64_t r12;
|
|
vki_uint64_t r13;
|
|
vki_uint64_t r14;
|
|
vki_uint64_t r15;
|
|
|
|
vki_uint64_t rip;
|
|
vki_uint64_t rflags;
|
|
|
|
vki_uint64_t cr0;
|
|
vki_uint64_t cr2;
|
|
vki_uint64_t cr3;
|
|
vki_uint64_t cr4;
|
|
|
|
vki_uint64_t dr0;
|
|
vki_uint64_t dr1;
|
|
vki_uint64_t dr2;
|
|
vki_uint64_t dr3;
|
|
vki_uint64_t dr6;
|
|
vki_uint64_t dr7;
|
|
|
|
vki_uint32_t cs_sel;
|
|
vki_uint32_t ds_sel;
|
|
vki_uint32_t es_sel;
|
|
vki_uint32_t fs_sel;
|
|
vki_uint32_t gs_sel;
|
|
vki_uint32_t ss_sel;
|
|
vki_uint32_t tr_sel;
|
|
vki_uint32_t ldtr_sel;
|
|
|
|
vki_uint32_t cs_limit;
|
|
vki_uint32_t ds_limit;
|
|
vki_uint32_t es_limit;
|
|
vki_uint32_t fs_limit;
|
|
vki_uint32_t gs_limit;
|
|
vki_uint32_t ss_limit;
|
|
vki_uint32_t tr_limit;
|
|
vki_uint32_t ldtr_limit;
|
|
vki_uint32_t idtr_limit;
|
|
vki_uint32_t gdtr_limit;
|
|
|
|
vki_uint64_t cs_base;
|
|
vki_uint64_t ds_base;
|
|
vki_uint64_t es_base;
|
|
vki_uint64_t fs_base;
|
|
vki_uint64_t gs_base;
|
|
vki_uint64_t ss_base;
|
|
vki_uint64_t tr_base;
|
|
vki_uint64_t ldtr_base;
|
|
vki_uint64_t idtr_base;
|
|
vki_uint64_t gdtr_base;
|
|
|
|
vki_uint32_t cs_arbytes;
|
|
vki_uint32_t ds_arbytes;
|
|
vki_uint32_t es_arbytes;
|
|
vki_uint32_t fs_arbytes;
|
|
vki_uint32_t gs_arbytes;
|
|
vki_uint32_t ss_arbytes;
|
|
vki_uint32_t tr_arbytes;
|
|
vki_uint32_t ldtr_arbytes;
|
|
|
|
vki_uint64_t sysenter_cs;
|
|
vki_uint64_t sysenter_esp;
|
|
vki_uint64_t sysenter_eip;
|
|
|
|
/* msr for em64t */
|
|
vki_uint64_t shadow_gs;
|
|
|
|
/* msr content saved/restored. */
|
|
vki_uint64_t msr_flags;
|
|
vki_uint64_t msr_lstar;
|
|
vki_uint64_t msr_star;
|
|
vki_uint64_t msr_cstar;
|
|
vki_uint64_t msr_syscall_mask;
|
|
vki_uint64_t msr_efer;
|
|
vki_uint64_t msr_tsc_aux;
|
|
|
|
/* guest's idea of what rdtsc() would return */
|
|
vki_uint64_t tsc;
|
|
|
|
/* pending event, if any */
|
|
union {
|
|
vki_uint32_t pending_event;
|
|
struct {
|
|
vki_uint8_t pending_vector:8;
|
|
vki_uint8_t pending_type:3;
|
|
vki_uint8_t pending_error_valid:1;
|
|
vki_uint32_t pending_reserved:19;
|
|
vki_uint8_t pending_valid:1;
|
|
};
|
|
};
|
|
/* error code for pending event */
|
|
vki_uint32_t error_code;
|
|
};
|
|
|
|
VKI_DECLARE_HVM_SAVE_TYPE(CPU, 2, struct vki_hvm_hw_cpu);
|
|
|
|
#endif // __VKI_XEN_H
|
|
|
|
/*--------------------------------------------------------------------*/
|
|
/*--- end ---*/
|
|
/*--------------------------------------------------------------------*/
|