PERFORCE change 167063 for review
Stanislav Sedov
stas at FreeBSD.org
Thu Aug 6 13:02:11 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167063
Change 167063 by stas at stas_deglitch on 2009/08/06 13:01:34
- Add FreeBSD/i386 coredump handler for valgrind based on amd64
work done by Attilio.
Affected files ...
.. //depot/projects/valgrind/coregrind/Makefile.am#9 edit
.. //depot/projects/valgrind/coregrind/m_coredump/coredump-x86-freebsd.c#5 add
.. //depot/projects/valgrind/include/vki/vki-x86-freebsd.h#7 edit
Differences ...
==== //depot/projects/valgrind/coregrind/Makefile.am#9 (text+ko) ====
@@ -255,7 +255,7 @@
libcoregrind_x86_freebsd_a_SOURCES = \
$(COREGRIND_SOURCES_COMMON) \
$(COREGRIND_FREEBSD_SOURCE) \
- m_coredump/coredump-x86-linux.c \
+ m_coredump/coredump-x86-freebsd.c \
m_dispatch/dispatch-x86-linux.S \
m_sigframe/sigframe-x86-freebsd.c \
m_syswrap/syscall-x86-freebsd.S \
==== //depot/projects/valgrind/include/vki/vki-x86-freebsd.h#7 (text+ko) ====
@@ -1,12 +1,13 @@
/*--------------------------------------------------------------------*/
-/*--- x86/Linux-specific kernel interface. vki-x86-linux.h ---*/
+/*--- x86/FreeBSD-specific kernel interface. vki-x86-freebsd.h ---*/
/*--------------------------------------------------------------------*/
/*
This file is part of Valgrind, a dynamic binary instrumentation
framework.
+ Copyright (C) 2009 Stanislav Sedov <stas at FreeBSD.org>
Copyright (C) 2000-2005 Julian Seward
jseward at acm.org
@@ -28,8 +29,8 @@
The GNU General Public License is contained in the file COPYING.
*/
-#ifndef __VKI_X86_LINUX_H
-#define __VKI_X86_LINUX_H
+#ifndef __VKI_X86_FREEBSD_H
+#define __VKI_X86_FREEBSD_H
//----------------------------------------------------------------------
// From somewhere
@@ -42,63 +43,81 @@
#define VKI_MAX_PAGE_SIZE VKI_PAGE_SIZE
//----------------------------------------------------------------------
-// From sys/signal.h
+// From sys/i386/include/_limits.h and sys/sys/_sigset.h
//----------------------------------------------------------------------
-#define VKI_MINSIGSTKSZ 2048
+#define VKI_MINSIGSTKSZ (512 * 4)
#define _VKI_NSIG 128
-#define _VKI_NSIG_BPW 32
-#define _VKI_NSIG_WORDS (_VKI_NSIG / _VKI_NSIG_BPW)
+#define _VKI_NSIG_BPW ((_VKI_NSIG) / (_VKI_NSIG_WORDS))
+#define _VKI_NSIG_WORDS 4
typedef struct {
vki_uint32_t sig[_VKI_NSIG_WORDS];
} vki_sigset_t;
+
//----------------------------------------------------------------------
-// From linux-2.6.8.1/include/asm-i386/sigcontext.h
+// From sys/i386/include/npx.h
//----------------------------------------------------------------------
-/* QQQ not right */
-struct _vki_fpreg {
- unsigned short significand[4];
- unsigned short exponent;
+struct _vki_env87 {
+ long en_cw;
+ long en_sw;
+ long en_tw;
+ long en_fip;
+ unsigned short en_fcs;
+ unsigned short en_opcode;
+ long en_foo;
+ long en_fos;
+};
+
+struct _vki_fpacc87 {
+ unsigned char fp_bytes[10];
+};
+
+struct _vki_save87 {
+ struct _vki_env87 sv_env;
+ struct _vki_fpacc87 sv_ac[8];
+ unsigned char sv_pad0[4];
+ unsigned char sv_pad[64];
};
-/* QQQ not right */
-struct _vki_fpxreg {
- unsigned short significand[4];
- unsigned short exponent;
- unsigned short padding[3];
+struct _vki_xmmacc {
+ unsigned char xmm_bytes[16];
};
-struct _vki_xmmreg {
- unsigned long element[4];
+struct _vki_envxmm {
+ unsigned short en_cw;
+ unsigned short en_sw;
+ unsigned short en_tw;
+ unsigned short en_opcode;
+ unsigned int en_fip;
+ unsigned short en_fcs;
+ unsigned short en_pad0;
+ unsigned int en_foo;
+ unsigned short en_fos;
+ unsigned short en_pad1;
+ unsigned int en_mxcsr;
+ unsigned int en_mxcsr_mask;
};
-struct _vki_fpstate {
- /* Regular FPU environment */
- unsigned long cw;
- unsigned long sw;
- unsigned long tag;
- unsigned long ipoff;
- unsigned long cssel;
- unsigned long dataoff;
- unsigned long datasel;
- struct _vki_fpreg _st[8];
- unsigned short status;
- unsigned short magic; /* 0xffff = regular FPU data only */
+struct _vki_savexmm {
+ struct _vki_envxmm sv_env;
+ struct {
+ struct _vki_fpacc87 fp_acc;
+ unsigned char fp_pad[6];
+ } sv_fp[8];
+ struct _vki_xmmacc sv_xmm[8];
+ unsigned char sv_pad[224];
+};
- /* FXSR FPU environment */
- unsigned long _fxsr_env[6]; /* FXSR FPU env is ignored */
- unsigned long mxcsr;
- unsigned long reserved;
- struct _vki_fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */
- struct _vki_xmmreg _xmm[8];
- unsigned long padding[56];
+union _vki_fpstate {
+ struct _vki_save87 sv_87;
+ struct _vki_savexmm sv_xmm;
};
-struct vki_sigcontext6 {
+struct vki_sigcontext {
vki_sigset_t sc_mask;
int onstack;
int gs;
@@ -120,130 +139,46 @@
int eflags;
int esp;
int ss;
- int len; /* sizeof (mcontext_t) */
+ int len;
int fpformat;
int ownedfp;
int spare1[1];
- struct _vki_fpstate fpstate;
- int spare2[8];
-};
-
-struct vki_sigcontext {
- vki_sigset_t sc_mask;
- int onstack;
- int gs;
- int fs;
- int es;
- int ds;
- int edi;
- int esi;
- int ebp;
- int isp;
- int ebx;
- int edx;
- int ecx;
- int eax;
- int trapno;
- int err;
- int eip;
- int cs;
- int eflags;
- int esp;
- int ss;
- int sc_fpregs[28];
- int sc_spare[17];
+ union _vki_fpstate fpstate __aligned(16);
+ int fsbase;
+ int gsbase;
+ int spare2[6];
};
-//----------------------------------------------------------------------
-// From linux-2.6.8.1/include/asm-i386/user.h
-//----------------------------------------------------------------------
-
-struct vki_user_i387_struct {
- long cwd;
- long swd;
- long twd;
- long fip;
- long fcs;
- long foo;
- long fos;
- long st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */
- long ex_sw;
- char pad[64];
-};
-
-struct vki_user_fxsr_struct {
- unsigned short cwd;
- unsigned short swd;
- unsigned short twd;
- unsigned short fop;
- long fip;
- long fcs;
- long foo;
- long fos;
- long mxcsr;
- long reserved;
- long st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */
- long xmm_space[32]; /* 8*16 bytes for each XMM-reg = 128 bytes */
- long padding[56];
-};
-
-/*
- * This is the old layout of "struct pt_regs", and
- * is still the layout used by user mode.
- */
struct vki_user_regs_struct {
- int fs, es, ds;
- int edi, esi, ebp, isp, ebx, edx, ecx, eax;
- int trapno, err, eip, cs, eflags, esp, ss, gs;
+ unsigned int fs;
+ unsigned int es;
+ unsigned int ds;
+ unsigned int edi;
+ unsigned int esi;
+ unsigned int ebp;
+ unsigned int isp;
+ unsigned int ebx;
+ unsigned int edx;
+ unsigned int ecx;
+ unsigned int eax;
+ unsigned int trapno;
+ unsigned int err;
+ unsigned int eip;
+ unsigned int cs;
+ unsigned int eflags;
+ unsigned int esp;
+ unsigned int ss;
+ unsigned int gs;
};
+typedef unsigned int vki_elf_greg_t;
+typedef union _vki_fpstate vki_elf_fpregset_t;
+typedef union _vki_fpstate vki_elf_fpxregset_t;
-//----------------------------------------------------------------------
-// From linux-2.6.8.1/include/asm-i386/elf.h
-//----------------------------------------------------------------------
-
-typedef unsigned long vki_elf_greg_t;
-
+#define VKI_AT_SYSINFO 32
#define VKI_ELF_NGREG (sizeof (struct vki_user_regs_struct) / sizeof(vki_elf_greg_t))
typedef vki_elf_greg_t vki_elf_gregset_t[VKI_ELF_NGREG];
-typedef struct vki_user_i387_struct vki_elf_fpregset_t;
-typedef struct vki_user_fxsr_struct vki_elf_fpxregset_t;
-
-#define VKI_AT_SYSINFO 32
-
-//----------------------------------------------------------------------
-// From linux-2.6.8.1/include/asm-i386/ucontext.h
-//----------------------------------------------------------------------
-
-struct vki_mcontext6 {
- int onstack;
- int gs;
- int fs;
- int es;
- int ds;
- int edi;
- int esi;
- int ebp;
- int isp;
- int ebx;
- int edx;
- int ecx;
- int eax;
- int trapno;
- int err;
- int eip;
- int cs;
- int eflags;
- int esp;
- int ss;
- int len;
- int fpformat;
- int ownedfp;
- int spare1[1];
- struct _vki_fpstate fpstate;
- int spare2[8];
-};
#define VKI_FPFMT_NODEV 0x10000
#define VKI_FPFMT_387 0x10001
#define VKI_FPFMT_XMM 0x10002
@@ -273,48 +208,18 @@
int eflags;
int esp;
int ss;
- int fpregs[28];
- int spare[17];
+
+ int len;
+ int fpformat;
+ int ownedfp;
+ int spare1[1];
+ union _vki_fpstate fpstate __aligned(16);
+ int fsbase;
+ int gsbase;
+ int spare2[6];
};
-#if 0
-
-//----------------------------------------------------------------------
-// From linux-2.6.8.1/include/asm-i386/ldt.h
-//----------------------------------------------------------------------
-
-/* [[Nb: This is the structure passed to the modify_ldt syscall. Just so as
- to confuse and annoy everyone, this is _not_ the same as an
- VgLdtEntry and has to be translated into such. The logic for doing
- so, in vg_ldt.c, is copied from the kernel sources.]] */
-struct vki_user_desc {
- unsigned int entry_number;
- unsigned long base_addr;
- unsigned int limit;
- unsigned int seg_32bit:1;
- unsigned int contents:2;
- unsigned int read_exec_only:1;
- unsigned int limit_in_pages:1;
- unsigned int seg_not_present:1;
- unsigned int useable:1;
- // [[Nb: this field is not in the kernel sources, but it has always
- // been in the Valgrind sources so I will keep it there in case it's
- // important... this is an x86-defined data structure so who
- // knows; maybe it's important to set this field to zero at some
- // point. --njn]]
- unsigned int reserved:25;
-};
-
-// [[Nb: for our convenience within Valgrind, use a more specific name]]
-typedef struct vki_user_desc vki_modify_ldt_t;
-
-#endif
-
-//----------------------------------------------------------------------
-// And that's it!
-//----------------------------------------------------------------------
-
-#endif // __VKI_X86_LINUX_H
+#endif // __VKI_X86_FREEBSD_H
/*--------------------------------------------------------------------*/
/*--- end ---*/
More information about the p4-projects
mailing list