PERFORCE change 167531 for review

Stanislav Sedov stas at FreeBSD.org
Thu Aug 20 12:19:37 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=167531

Change 167531 by stas at stas_yandex on 2009/08/20 12:19:11

	- Fix syscalls on amd64.

Affected files ...

.. //depot/projects/valgrind/coregrind/m_libcfile.c#9 edit
.. //depot/projects/valgrind/coregrind/m_syscall.c#11 edit
.. //depot/projects/valgrind/coregrind/m_syswrap/syscall-amd64-freebsd.S#7 edit
.. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-freebsd.c#34 edit
.. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-main.c#16 edit
.. //depot/projects/valgrind/include/pub_tool_basics.h#5 edit
.. //depot/projects/valgrind/include/vki/vki-scnums-freebsd.h#4 edit

Differences ...

==== //depot/projects/valgrind/coregrind/m_libcfile.c#9 (text+ko) ====

@@ -234,14 +234,13 @@
 
 OffT VG_(lseek) ( Int fd, OffT offset, Int whence )
 {
-#  if defined(VGO_linux) || defined(VGO_aix5) || defined(VGP_amd64_darwin)
+#  if defined(VGO_linux) || defined(VGO_aix5) || defined(VGP_amd64_darwin) || \
+      defined(VGP_amd64_freebsd)
    SysRes res = VG_(do_syscall3)(__NR_lseek, fd, offset, whence);
    vg_assert(sizeof(OffT) == sizeof(Word));
-#  elif defined(VGP_x86_darwin)
+#  elif defined(VGP_x86_darwin) || defined (VGP_x86_freebsd)
    SysRes res = VG_(do_syscall4)(__NR_lseek, fd, 
                                  offset & 0xffffffff, offset >> 32, whence);
-#  elif defined(VGO_freebsd)
-   SysRes res = VG_(do_syscall4)(__NR_lseek, fd, 0, offset, whence);
 #  else
 #    error "Unknown plat"
 #  endif

==== //depot/projects/valgrind/coregrind/m_syscall.c#11 (text+ko) ====

@@ -462,10 +462,6 @@
 );
 
 #elif defined(VGP_amd64_freebsd)
-/* This is similar to amd64-linux, except that we have to deal with
-   7 args potentially.  (mmap takes 7)
- */
-// AAA: fix 7th arg!
 extern UWord do_syscall_WRK (
           UWord syscall_no,    /* %rdi */
           UWord a1,            /* %rsi */
@@ -484,28 +480,32 @@
 "do_syscall_WRK:\n"
         /* Convert function calling convention --> syscall calling
            convention */
+"      pushq   %rbp\n"
+"      movq    %rsp, %rbp\n"
 "      movq    %rdi, %rax\n"    /* syscall_no */
 "      movq    %rsi, %rdi\n"    /* a1 */
 "      movq    %rdx, %rsi\n"    /* a2 */
 "      movq    %rcx, %rdx\n"    /* a3 */
 "      movq    %r8,  %r10\n"    /* a4 */
 "      movq    %r9,  %r8\n"     /* a5 */
-"      movq    8(%rsp), %r9\n"  /* a6 last arg from stack */
-"      movq    16(%rsp), %r11\n" /* a7 from stack */
-"      movq    24(%rsp), %rcx\n" /* a8 from stack */
-"      pushq  %rcx\n"
+"      movq    16(%rbp), %r9\n"  /* a6 last arg from stack, account for %rbp */
+"      movq    24(%rbp), %r11\n" /* a7 from stack */
+"      pushq  %r11\n"
+"      movq    32(%rbp), %r11\n" /* a8 from stack */
 "      pushq  %r11\n"
 "      subq    $8,%rsp\n"      /* fake return addr */
 "      syscall\n"
 "      jb      1f\n"
-"      addq    $24,%rsp\n"
-"      movq    40(%rsp),%rsi\n"
+"      movq    48(%rbp),%rsi\n"
 "      movq    %rdx, (%rsi)\n"
+"      movq    %rbp, %rsp\n"
+"      popq    %rbp\n"
 "      ret\n"
 "1:\n"
-"      addq    $24,%rsp\n"
-"      movq    32(%rsp), %rsi\n"
+"      movq    40(%rbp), %rsi\n"
 "      movl    $1,(%rsi)\n"
+"      movq    %rbp, %rsp\n"
+"      popq    %rbp\n"
 "      ret\n"
 ".previous\n"
 );
@@ -815,7 +815,7 @@
 
 #  elif defined(VGP_x86_freebsd)
    ULong val;
-   UInt err;
+   UInt err = 0;
    val = do_syscall_WRK(sysno, a1, a2, a3, a4, a5,
                         a6, a7, a8, &err);
    return VG_(mk_SysRes_x86_freebsd)( (UInt)val, (UInt)(val>>32), err);
@@ -823,10 +823,10 @@
 #  elif defined(VGP_amd64_freebsd)
    UWord val;
    UWord val2 = 0;
-   UInt err;
+   UInt err = 0;
    val = do_syscall_WRK(sysno, a1, a2, a3, a4, a5,
                         a6, a7, a8, &err, &val2);
-   return VG_(mk_SysRes_amd64_freebsd)( val, val2, err);
+   return VG_(mk_SysRes_amd64_freebsd)( val, val2, err ? True : False);
 
 #  elif defined(VGP_ppc32_linux)
    ULong ret     = do_syscall_WRK(sysno,a1,a2,a3,a4,a5,a6);

==== //depot/projects/valgrind/coregrind/m_syswrap/syscall-amd64-freebsd.S#7 (text+ko) ====

@@ -108,7 +108,7 @@
         movq    OFFSET_amd64_RDI(%r11), %rdi
         movq    OFFSET_amd64_RSI(%r11), %rsi
         movq    OFFSET_amd64_RDX(%r11), %rdx
-        movq    OFFSET_amd64_RCX(%r11), %r10 /* rcx is passed in r10 instead */
+        movq    OFFSET_amd64_R10(%r11), %r10
         movq    OFFSET_amd64_R8(%r11), %r8
         movq    OFFSET_amd64_R9(%r11), %r9
         /* 2 stack parameters plus return address (ignored by syscall) */
@@ -138,7 +138,7 @@
 	movq    %rdx, OFFSET_amd64_RDX(%r11)    /* save back to RDX */
 
 	/* save carry flag to VEX */
-	xor     %rax, %rax
+	xorq    %rax, %rax
 	movb    0(%rsp), %al
 	movq    %rax, %rdi      /* arg1 = new flag */
 	movq    %r11, %rsi      /* arg2 = vex state */

==== //depot/projects/valgrind/coregrind/m_syswrap/syswrap-freebsd.c#34 (text+ko) ====

@@ -3300,7 +3300,7 @@
    BSDXY(__NR_getdirentries,		sys_getdirentries),		// 196
    BSDX_(__NR_mmap,			sys_mmap),			// 197
    // __syscall (handled specially)					// 198
-   BSDX_(__NR_lseek,			sys_lseek),			// 199
+   BSDX_(__NR_lseek6,			sys_lseek),			// 199
 
    BSDX_(__NR_truncate,			sys_truncate),			// 200
    BSDX_(__NR_ftruncate,		sys_ftruncate),			// 201
@@ -3649,7 +3649,7 @@
 
    BSDX_(__NR_pwrite7,			sys_pwrite7),			// 476
    BSDX_(__NR_mmap7,			sys_mmap7),			// 477
-   BSDX_(__NR_lseek7,			sys_lseek7),			// 478
+   BSDX_(__NR_lseek,			sys_lseek),			// 478
    BSDX_(__NR_truncate7,		sys_truncate7),			// 479
 
    BSDX_(__NR_ftruncate7,		sys_ftruncate7),		// 480

==== //depot/projects/valgrind/coregrind/m_syswrap/syswrap-main.c#16 (text+ko) ====

@@ -77,7 +77,7 @@
 
    DARWIN:
    x86    eax +4   +8   +12  +16  +20  +24  +28  +32  edx:eax, eflags.c
-   amd64  rax rdi  rsi  rdx  rcx  r8   r9   +8   +16  rdx:rax, rflags.c
+   amd64  rax rdi  rsi  rdx  r10  r8   r9   +8   +16  rdx:rax, rflags.c
 
    For x86-darwin and x86-freebsd, "+N" denotes "in memory at N(%esp)";
    ditto amd64-darwin/amd64-freebsd.  Apparently 0(%esp) is some kind of return address
@@ -529,7 +529,7 @@
       canonical->arg1  = gst->guest_RDI;
       canonical->arg2  = gst->guest_RSI;
       canonical->arg3  = gst->guest_RDX;
-      canonical->arg4  = gst->guest_RCX;
+      canonical->arg4  = gst->guest_R10;
       canonical->arg5  = gst->guest_R8;
       canonical->arg6  = gst->guest_R9;
       canonical->arg7  = stack[1];
@@ -538,7 +538,7 @@
       // stack[0] is return address
       canonical->arg1  = gst->guest_RSI;
       canonical->arg2  = gst->guest_RDX;
-      canonical->arg3  = gst->guest_RCX;
+      canonical->arg3  = gst->guest_R10;
       canonical->arg4  = gst->guest_R8;
       canonical->arg5  = gst->guest_R9;
       canonical->arg6  = stack[1];
@@ -778,7 +778,7 @@
       gst->guest_RDI = VG_FREEBSD_SYSNO_INDEX(canonical->sysno);
       gst->guest_RSI = canonical->arg1;
       gst->guest_RDX = canonical->arg2;
-      gst->guest_RCX = canonical->arg3;
+      gst->guest_R10 = canonical->arg3;
       gst->guest_R8  = canonical->arg4;
       gst->guest_R9  = canonical->arg5;
       stack[1]       = canonical->arg6;
@@ -790,7 +790,7 @@
       gst->guest_RDI = VG_FREEBSD_SYSNO_INDEX(canonical->sysno);
       gst->guest_RSI = canonical->arg1;
       gst->guest_RDX = canonical->arg2;
-      gst->guest_RCX = canonical->arg3;
+      gst->guest_R10 = canonical->arg3;
       gst->guest_R8  = canonical->arg4;
       gst->guest_R9  = canonical->arg5;
       stack[1]       = canonical->arg6;
@@ -802,7 +802,7 @@
       gst->guest_RDI = canonical->arg1;
       gst->guest_RSI = canonical->arg2;
       gst->guest_RDX = canonical->arg3;
-      gst->guest_RCX = canonical->arg4;
+      gst->guest_R10 = canonical->arg4;
       gst->guest_R8  = canonical->arg5;
       gst->guest_R9  = canonical->arg6;
       stack[1]       = canonical->arg7;
@@ -1268,7 +1268,7 @@
    layout->o_arg1   = OFFSET_amd64_RDI;
    layout->o_arg2   = OFFSET_amd64_RSI;
    layout->o_arg3   = OFFSET_amd64_RDX;
-   layout->o_arg4   = OFFSET_amd64_RCX;
+   layout->o_arg4   = OFFSET_amd64_R10;
    layout->o_arg5   = OFFSET_amd64_R8;
    layout->o_arg6   = OFFSET_amd64_R9;
    layout->s_arg7   = sizeof(UWord) * 1;

==== //depot/projects/valgrind/include/pub_tool_basics.h#5 (text+ko) ====

@@ -117,7 +117,7 @@
 #if defined(VGO_linux) || defined(VGO_aix5)
 typedef Word                   OffT;      // 32             64
 #elif defined(VGO_freebsd)
-typedef Word                   OffT;      // 32             64
+typedef Long                   OffT;      // 64             64
 #elif defined(VGO_darwin)
 typedef Long                   OffT;      // 64             64
 #else

==== //depot/projects/valgrind/include/vki/vki-scnums-freebsd.h#4 (text+ko) ====

@@ -176,7 +176,7 @@
 #define	__NR_getdirentries	196
 #define	__NR_mmap		197
 #define	__NR___syscall		198
-#define	__NR_lseek		199
+#define	__NR_lseek6		199
 #define	__NR_truncate		200
 #define	__NR_ftruncate		201
 #define	__NR___sysctl		202
@@ -388,7 +388,7 @@
 #define	__NR_pread7		475
 #define	__NR_pwrite7		476
 #define	__NR_mmap7		477
-#define	__NR_lseek7		478
+#define	__NR_lseek		478
 #define	__NR_truncate7		479
 #define	__NR_ftruncate7		480
 #define	__NR_thr_kill2		481


More information about the p4-projects mailing list