Date: Thu, 6 Aug 2009 13:02:10 GMT From: Stanislav Sedov <stas@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 167063 for review Message-ID: <200908061302.n76D2Aoq042169@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=167063 Change 167063 by stas@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@FreeBSD.org> Copyright (C) 2000-2005 Julian Seward jseward@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 ---*/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908061302.n76D2Aoq042169>