Date: Mon, 27 Oct 2008 22:59:48 GMT From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 152065 for review Message-ID: <200810272259.m9RMxmxJ086571@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=152065 Change 152065 by peter@peter_overcee on 2008/10/27 22:59:25 Initial update to get this to compile/link in amd64 on 8.x Affected files ... .. //depot/projects/valgrind/Makefile.am#6 edit .. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-freebsd.c#6 edit .. //depot/projects/valgrind/coregrind/m_debuginfo/debuginfo.c#5 edit .. //depot/projects/valgrind/coregrind/m_machine.c#5 edit .. //depot/projects/valgrind/coregrind/m_sigframe/sigframe-amd64-freebsd.c#2 edit .. //depot/projects/valgrind/coregrind/m_syswrap/syscall-amd64-freebsd.S#2 edit .. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-amd64-freebsd.c#3 edit .. //depot/projects/valgrind/include/vki/vki-amd64-freebsd.h#2 edit Differences ... ==== //depot/projects/valgrind/Makefile.am#6 (text+ko) ==== @@ -221,9 +221,9 @@ valt_load_address_amd64_freebsd.lds: Makefile $(CC) -m64 -Wl,--verbose -nostdlib 2>&1 | sed \ - -e '1,/^=====+$$/d' \ - -e '/^=====+$$/d' \ - -e '/\. = 0x[0-9A-Fa-f]+ \+ SIZEOF_HEADERS/s/0x[0-9A-Fa-f]+/valt_load_address/g' > $@ \ + -e '1,/^=====\+$$/d' \ + -e '/^=====\+$$/d' \ + -e '/\. = 0x[0-9A-Fa-f]\+ + SIZEOF_HEADERS/s/0x[0-9A-Fa-f]\+/valt_load_address/g' > $@ \ || rm -f $@ valt_load_address_x86_linux.lds: Makefile ==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-freebsd.c#6 (text+ko) ==== @@ -358,7 +358,7 @@ Int i; /* Callback function for parsing map */ - static void get_name_for_addr_callback(Addr addr, SizeT len, UInt prot, + void get_name_for_addr_callback(Addr addr, SizeT len, UInt prot, ULong dev, ULong ino, ULong offset, const UChar* filename ) { ==== //depot/projects/valgrind/coregrind/m_debuginfo/debuginfo.c#5 (text+ko) ==== @@ -647,7 +647,7 @@ # if defined(VGP_x86_linux) || defined(VGP_x86_freebsd) is_rx_map = seg->hasR && seg->hasX; is_rw_map = seg->hasR && seg->hasW; -# elif defined(VGP_amd64_linux) \ +# elif defined(VGP_amd64_linux) || defined(VGP_amd64_freebsd) \ || defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux) is_rx_map = seg->hasR && seg->hasX && !seg->hasW; is_rw_map = seg->hasR && seg->hasW && !seg->hasX; ==== //depot/projects/valgrind/coregrind/m_machine.c#5 (text+ko) ==== @@ -104,6 +104,10 @@ VG_(threads)[tid].arch.vex_shadow1.guest_EAX = s1res; VG_(threads)[tid].arch.vex_shadow2.guest_EAX = s2res; /* QQQ: this is very incomplete. EDX and EFL are affected */ +# elif defined(VGP_amd64_freebsd) + VG_(threads)[tid].arch.vex_shadow1.guest_RAX = s1res; + VG_(threads)[tid].arch.vex_shadow2.guest_RAX = s2res; + /* QQQ: this is very incomplete. EDX and EFL are affected */ # else # error "Unknown plat" # endif ==== //depot/projects/valgrind/coregrind/m_sigframe/sigframe-amd64-freebsd.c#2 (text+ko) ==== @@ -30,6 +30,7 @@ */ #include "pub_core_basics.h" +#include "pub_core_vki.h" #include "pub_core_threadstate.h" #include "pub_core_aspacemgr.h" #include "pub_core_libcbase.h" @@ -37,10 +38,10 @@ #include "pub_core_libcprint.h" #include "pub_core_machine.h" #include "pub_core_options.h" -#include "pub_core_sigframe.h" #include "pub_core_signals.h" #include "pub_core_tooliface.h" #include "pub_core_trampoline.h" +#include "pub_core_sigframe.h" /* self */ /* This module creates and removes signal frames for signal deliveries @@ -93,7 +94,8 @@ /* XXX This is wrong. Surely we should store the shadow values into the shadow memory behind the actual values? */ - VexGuestAMD64State vex_shadow; + VexGuestAMD64State vex_shadow1; + VexGuestAMD64State vex_shadow2; /* HACK ALERT */ VexGuestAMD64State vex; @@ -382,7 +384,7 @@ static Bool extend ( ThreadState *tst, Addr addr, SizeT size ) { ThreadId tid = tst->tid; - NSegment *stackseg = NULL; + const NSegment *stackseg = NULL; if (VG_(extend_stack)(addr, tst->client_stack_szB)) { stackseg = VG_(am_find_nsegment)(addr); @@ -413,7 +415,7 @@ /* For tracking memory events, indicate the entire frame has been allocated. */ VG_TRACK( new_mem_stack_signal, addr - VG_STACK_REDZONE_SZB, - size + VG_STACK_REDZONE_SZB ); + size + VG_STACK_REDZONE_SZB, tid ); return True; } @@ -429,7 +431,8 @@ { frame->sigNo_private = sigNo; frame->magicPI = 0x31415927; - frame->vex_shadow = tst->arch.vex_shadow; + frame->vex_shadow1 = tst->arch.vex_shadow1; + frame->vex_shadow2 = tst->arch.vex_shadow2; /* HACK ALERT */ frame->vex = tst->arch.vex; /* end HACK ALERT */ @@ -492,6 +495,7 @@ void VG_(sigframe_create)( ThreadId tid, Addr rsp_top_of_frame, const vki_siginfo_t *siginfo, + const struct vki_ucontext *uc, void *handler, UInt flags, const vki_sigset_t *mask, @@ -547,7 +551,8 @@ } tst->sig_mask = frame->mask; tst->tmp_sig_mask = frame->mask; - tst->arch.vex_shadow = frame->vex_shadow; + tst->arch.vex_shadow1 = frame->vex_shadow1; + tst->arch.vex_shadow2 = frame->vex_shadow2; /* HACK ALERT */ tst->arch.vex = frame->vex; /* end HACK ALERT */ ==== //depot/projects/valgrind/coregrind/m_syswrap/syscall-amd64-freebsd.S#2 (text+ko) ==== @@ -29,7 +29,7 @@ */ #include "pub_core_basics_asm.h" -#include "vki_unistd.h" +#include "pub_core_vkiscnums.h" #include "libvex_guest_offsets.h" ==== //depot/projects/valgrind/coregrind/m_syswrap/syswrap-amd64-freebsd.c#3 (text+ko) ==== @@ -34,6 +34,8 @@ */ #include "pub_core_basics.h" +#include "pub_core_vki.h" +#include "pub_core_vkiscnums.h" #include "pub_core_threadstate.h" #include "pub_core_debuginfo.h" // VG_(di_notify_mmap) #include "pub_core_aspacemgr.h" @@ -43,6 +45,7 @@ #include "pub_core_libcprint.h" #include "pub_core_libcproc.h" #include "pub_core_libcsignal.h" +#include "pub_core_machine.h" #include "pub_core_mallocfree.h" #include "pub_core_options.h" #include "pub_core_scheduler.h" @@ -51,14 +54,13 @@ #include "pub_core_syscall.h" #include "pub_core_syswrap.h" #include "pub_core_tooliface.h" +#include "pub_core_stacks.h" // VG_(register_stack) #include "priv_types_n_macros.h" #include "priv_syswrap-generic.h" /* for decls of generic wrappers */ #include "priv_syswrap-freebsd.h" /* for decls of freebsd-ish wrappers */ #include "priv_syswrap-main.h" -#include "vki_unistd.h" /* for the __NR_* constants */ - /* Simulate C-style return values for pipe(2). This does not belong here at all, it should be in m_libcfile.c. */ @@ -217,7 +219,7 @@ { SysRes r; - PRINT("sys_mmap ( %p, %lu, %d, %d, %d, pad%d, 0x%lx)", + PRINT("sys_mmap ( %#lx, %lu, %ld, %ld, %ld, pad%ld, 0x%lx)", ARG1, (UWord)ARG2, ARG3, ARG4, ARG5, ARG6, ARG7 ); PRE_REG_READ7(long, "mmap", char *, addr, unsigned long, len, int, prot, int, flags, @@ -232,7 +234,7 @@ { SysRes r; - PRINT("sys_mmap ( %p, %lu, %d, %d, %d, 0x%lx)", + PRINT("sys_mmap ( %#lx, %lu, %ld, %ld, %ld, 0x%lx)", ARG1, (UWord)ARG2, ARG3, ARG4, ARG5, ARG6 ); PRE_REG_READ6(long, "mmap", char *, addr, unsigned long, len, int, prot, int, flags, @@ -244,7 +246,7 @@ PRE(sys_lseek) { - PRINT("sys_lseek ( %d, 0x%x, %p, %d )", ARG1,ARG3,ARG4); + PRINT("sys_lseek ( %ld, 0x%lx, %#lx, %ld )", ARG1,ARG2,ARG3,ARG4); PRE_REG_READ4(long, "lseek", unsigned int, fd, int, pad, unsigned long, offset, unsigned int, whence); @@ -252,7 +254,7 @@ PRE(sys_lseek7) { - PRINT("sys_lseek ( %d, 0x%lx, %d )", ARG1,ARG2,ARG3); + PRINT("sys_lseek ( %ld, 0x%lx, %ld )", ARG1,ARG2,ARG3); PRE_REG_READ3(long, "lseek", unsigned int, fd, unsigned long, offset, unsigned int, whence); @@ -261,7 +263,7 @@ PRE(sys_pread) { *flags |= SfMayBlock; - PRINT("sys_read ( %d, %p, %lu, %lu, %lu )", ARG1, ARG2, ARG3, ARG5); + PRINT("sys_read ( %ld, %#lx, %lu, %lu, %lu )", ARG1, ARG2, ARG3, ARG4, ARG5); PRE_REG_READ5(ssize_t, "read", unsigned int, fd, char *, buf, vki_size_t, count, int, pad, unsigned long, off); @@ -281,7 +283,7 @@ PRE(sys_pread7) { *flags |= SfMayBlock; - PRINT("sys_read ( %d, %p, %lu, %lu, %lu )", ARG1, ARG2, ARG3, ARG4); + PRINT("sys_read ( %ld, %#lx, %lu, %lu )", ARG1, ARG2, ARG3, ARG4); PRE_REG_READ4(ssize_t, "read", unsigned int, fd, char *, buf, vki_size_t, count, unsigned long, off); @@ -302,7 +304,7 @@ { Bool ok; *flags |= SfMayBlock; - PRINT("sys_write ( %d, %p, %lu, %lu, %lu )", ARG1, ARG2, ARG3, ARG5); + PRINT("sys_write ( %ld, %#lx, %lu, %lu, %lu )", ARG1, ARG2, ARG3, ARG4, ARG5); PRE_REG_READ5(ssize_t, "write", unsigned int, fd, const char *, buf, vki_size_t, count, int, pad, unsigned long, off); @@ -322,7 +324,7 @@ { Bool ok; *flags |= SfMayBlock; - PRINT("sys_write ( %d, %p, %lu, %lu )", ARG1, ARG2, ARG3, ARG4); + PRINT("sys_write ( %ld, %#lx, %lu, %lu )", ARG1, ARG2, ARG3, ARG4); PRE_REG_READ4(ssize_t, "write", unsigned int, fd, const char *, buf, vki_size_t, count, unsigned long, off); @@ -341,7 +343,7 @@ PRE(sys_ftruncate) { *flags |= SfMayBlock; - PRINT("sys_ftruncate ( %d, %lu )", ARG1,ARG3); + PRINT("sys_ftruncate ( %ld, %lu )", ARG1,ARG3); PRE_REG_READ3(long, "ftruncate", unsigned int, fd, int, pad, unsigned int, length); } @@ -349,7 +351,7 @@ PRE(sys_ftruncate7) { *flags |= SfMayBlock; - PRINT("sys_ftruncate ( %d, %lu )", ARG1,ARG2); + PRINT("sys_ftruncate ( %ld, %lu )", ARG1,ARG2); PRE_REG_READ2(long, "ftruncate", unsigned int, fd, unsigned long, length); } @@ -357,7 +359,7 @@ PRE(sys_truncate) { *flags |= SfMayBlock; - PRINT("sys_truncate ( %p(%s), %lu )", ARG1,ARG1,ARG3); + PRINT("sys_truncate ( %#lx(%s), %lu )", ARG1,(char *)ARG1,ARG3); PRE_REG_READ3(long, "truncate", const char *, path, int, pad, unsigned int, length); PRE_MEM_RASCIIZ( "truncate(path)", ARG1 ); @@ -366,12 +368,49 @@ PRE(sys_truncate7) { *flags |= SfMayBlock; - PRINT("sys_truncate ( %p(%s), %lu )", ARG1,ARG1,ARG2); + PRINT("sys_truncate ( %#lx(%s), %lu )", ARG1,(char *)ARG1,ARG2); PRE_REG_READ2(long, "truncate", const char *, path, unsigned long, length); PRE_MEM_RASCIIZ( "truncate(path)", ARG1 ); } +PRE(sys_sysarch) +{ + ThreadState *tst; + void **p; + + PRINT("sys_sysarch ( %ld, %#lx )", ARG1, ARG2); + PRE_REG_READ2(int, "sysarch", + int, number, void *, args); + switch (ARG1) { + case VKI_AMD64_SET_FSBASE: + PRINT("sys_amd64_set_fsbase ( %#lx )", ARG2); + PRE_REG_READ1(long, "amd64_set_fsbase", void *, base) + + /* On FreeBSD, the syscall loads the %gs selector for us, so do it now. */ + tst = VG_(get_ThreadState)(tid); + p = (void**)ARG2; + tst->arch.vex.guest_FS_ZERO = *p; + /* "do" the syscall ourselves; the kernel never sees it */ + SET_STATUS_Success2(*p, tst->arch.vex.guest_RDX ); + + break; + case VKI_AMD64_GET_FSBASE: + PRINT("sys_amd64_get_fsbase ( %#lx )", ARG2); + PRE_REG_READ1(int, "amd64_get_fsbase", void *, basep) + PRE_MEM_WRITE( "amd64_get_fsbase(basep)", ARG2, sizeof(void *) ); + + /* "do" the syscall ourselves; the kernel never sees it */ + SET_STATUS_Success2( tst->arch.vex.guest_FS_ZERO, tst->arch.vex.guest_RDX ); + POST_MEM_WRITE( ARG2, sizeof(void *) ); + break; + default: + VG_(message) (Vg_UserMsg, "unhandled sysarch cmd %ld", ARG1); + VG_(unimplemented) ("unhandled sysarch cmd"); + break; + } +} + #undef PRE #undef POST ==== //depot/projects/valgrind/include/vki/vki-amd64-freebsd.h#2 (text+ko) ==== @@ -42,6 +42,8 @@ /* PAGE_SHIFT determines the page size */ #define VKI_PAGE_SHIFT 12 #define VKI_PAGE_SIZE (1UL << VKI_PAGE_SHIFT) +#define VKI_MAX_PAGE_SHIFT VKI_PAGE_SHIFT +#define VKI_MAX_PAGE_SIZE VKI_PAGE_SIZE //---------------------------------------------------------------------- // From sys/signal.h @@ -135,43 +137,18 @@ // From linux-2.6.8.1/include/asm-i386/sigcontext.h //---------------------------------------------------------------------- -/* QQQ not right */ -struct _vki_fpreg { - unsigned short significand[4]; - unsigned short exponent; -}; - -/* QQQ not right */ -struct _vki_fpxreg { - unsigned short significand[4]; - unsigned short exponent; - unsigned short padding[3]; -}; - -struct _vki_xmmreg { - unsigned long element[4]; -}; - 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 */ - - /* 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]; + unsigned short cwd; + unsigned short swd; + unsigned short twd; + unsigned short fop; + unsigned long rip; + unsigned long rdp; + unsigned int mxcsr; + unsigned int mxcsr_mask; + unsigned int st_space[32]; /* 8*16 bytes for each FP-reg */ + unsigned int xmm_space[64]; /* 16*16 bytes for each XMM-reg */ + unsigned int reserved2[24]; }; struct vki_sigcontext { @@ -208,38 +185,23 @@ long spare2[8]; }; -#if 0 //---------------------------------------------------------------------- // 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 */ -}; - -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]; + unsigned long fip; + unsigned long fdp; + unsigned int mxcsr; + unsigned int mxcsr_mask; + unsigned int st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */ + unsigned int xmm_space[64]; /* 16*16 bytes for each XMM-reg = 128 bytes */ + unsigned int padding[24]; }; -#endif /* AAA check that this linux layout is appropriate */ @@ -252,7 +214,6 @@ unsigned long ds,es,fs,gs; }; -#if 0 //---------------------------------------------------------------------- // From linux-2.6.8.1/include/asm-i386/elf.h //---------------------------------------------------------------------- @@ -263,10 +224,8 @@ 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 -#endif //---------------------------------------------------------------------- // From linux-2.6.8.1/include/asm-i386/ucontext.h @@ -323,39 +282,6 @@ int __spare__[4]; }; -#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! //----------------------------------------------------------------------
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200810272259.m9RMxmxJ086571>