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