]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix enough syscall stuff so that simple X applications run (xfontsel,
authorJulian Seward <jseward@acm.org>
Wed, 2 Mar 2005 16:01:23 +0000 (16:01 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 2 Mar 2005 16:01:23 +0000 (16:01 +0000)
xedit).

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3261

NOTES.txt
coregrind/amd64-linux/syscalls.c
coregrind/amd64/helpers.S
coregrind/vg_symtab2.c

index 07018846b8165803cea7d3f5b0aa87f1ba372924..01cdb3bab4ff8ba1f142f70834bf03b3aa6c6b62 100644 (file)
--- a/NOTES.txt
+++ b/NOTES.txt
@@ -37,6 +37,14 @@ mapping.
 There's a whole big #ifdef TEST section in vg_symtab2.c which has
 no apparent purpose.
 
+The redirecting-symtab-loader seems like a good idea on the face
+of it: you can write functions whose name says, in effect
+  "i_am_a_replacement_for_FOO"
+and then all jumps/calls to FOO get redirected there.  Problem is
+that nameing mechanism involves $ signs etc in symbol names, which
+makes it very fragile.  TODO: (1) figure out if we still need
+this, and if so (2) fix.
+
 
 System call handlers
 ~~~~~~~~~~~~~~~~~~~~
@@ -59,5 +67,6 @@ without handing it off to the kernel need to be cleaned up.  The
 "Special" syscall designation no longer really makes sense (it never
 did) and should be removed.
 
-
+Sockets: move the socketcall marshaller from vg_syscalls.c into
+x86-linux/syscalls.c; it is in the wrong place.
 
index a12d9f2bb074ac9713ab0a85767e4043412cf6d1..e386cafe1555983d22d9016f549346ff96c21363 100644 (file)
@@ -202,13 +202,13 @@ PRE(sys_socketcall, MayBlock)
       PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
       break;
 
-//   case VKI_SYS_BIND:
-//      /* int bind(int sockfd, struct sockaddr *my_addr, 
-//      int addrlen); */
-//      PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
-//      generic_PRE_sys_bind( tid, ARG2_0, ARG2_1, ARG2_2 );
-//      break;
-//               
+   case VKI_SYS_BIND:
+      /* int bind(int sockfd, struct sockaddr *my_addr, 
+                  int addrlen); */
+      PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
+      VG_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
+      break;
+               
 //   case VKI_SYS_LISTEN:
 //      /* int listen(int s, int backlog); */
 //      PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
@@ -350,11 +350,11 @@ POST(sys_socketcall)
      SET_RESULT(r);
      break;
 
-//   case VKI_SYS_BIND:
-//      /* int bind(int sockfd, struct sockaddr *my_addr, 
-//                     int addrlen); */
-//      break;
-//               
+   case VKI_SYS_BIND:
+      /* int bind(int sockfd, struct sockaddr *my_addr, 
+                  int addrlen); */
+      break;
+               
 //   case VKI_SYS_LISTEN:
 //      /* int listen(int s, int backlog); */
 //      break;
@@ -448,6 +448,23 @@ POST(sys_recvmsg)
    VG_(generic_POST_sys_recvmsg)(tid, RES,ARG1,ARG2);
 }
 
+PRE(sys_getsockname, MayBlock)
+{
+   VG_(generic_PRE_sys_getsockname)(tid, ARG1,ARG2,ARG3);
+}
+POST(sys_getsockname)
+{
+   VG_(generic_POST_sys_getsockname)(tid, RES,ARG1,ARG2,ARG3);
+}
+
+PRE(sys_getpeername, MayBlock)
+{
+   VG_(generic_PRE_sys_getpeername)(tid, ARG1,ARG2,ARG3);
+}
+POST(sys_getpeername)
+{
+   VG_(generic_POST_sys_getpeername)(tid, RES,ARG1,ARG2,ARG3);
+}
 
 #undef PRE
 #undef POST
@@ -492,12 +509,12 @@ const struct SyscallTableEntry VGA_(syscall_table)[] = {
    GENXY(__NR_ioctl,             sys_ioctl),          // 16 
    //   (__NR_pread64,           sys_pread64),        // 17 
    //   (__NR_pwrite64,          sys_pwrite64),       // 18 
-   //   (__NR_readv,             sys_readv),          // 19 
+   GENXY(__NR_readv,             sys_readv),          // 19 
 
    GENX_(__NR_writev,            sys_writev),         // 20 
    GENX_(__NR_access,            sys_access),         // 21 
    //   (__NR_pipe,              sys_pipe),           // 22 
-   //   (__NR_select,            sys_select),         // 23 
+   GENX_(__NR_select,            sys_select),         // 23 
    //   (__NR_sched_yield,       sys_sched_yield),    // 24 
 
    //   (__NR_mremap,            sys_mremap),         // 25 
@@ -531,8 +548,8 @@ const struct SyscallTableEntry VGA_(syscall_table)[] = {
    //   (__NR_bind,              sys_bind),           // 49 
 
    //   (__NR_listen,            sys_listen),         // 50 
-   //   (__NR_getsockname,       sys_getsockname),    // 51 
-   //   (__NR_getpeername,       sys_getpeername),    // 52 
+   PLAXY(__NR_getsockname,       sys_getsockname),    // 51 
+   PLAXY(__NR_getpeername,       sys_getpeername),    // 52 
    //   (__NR_socketpair,        sys_socketpair),     // 53 
    PLAX_(__NR_setsockopt,        sys_setsockopt),     // 54
 
@@ -563,11 +580,11 @@ const struct SyscallTableEntry VGA_(syscall_table)[] = {
    //   (__NR_fdatasync,         sys_fdatasync),      // 75 
    //   (__NR_truncate,          sys_truncate),       // 76 
    //   (__NR_ftruncate,         sys_ftruncate),      // 77 
-   //   (__NR_getdents,          sys_getdents),       // 78 
-   //   (__NR_getcwd,            sys_getcwd),         // 79 
+   GENXY(__NR_getdents,          sys_getdents),       // 78 
+   GENXY(__NR_getcwd,            sys_getcwd),         // 79 
 
-   //   (__NR_chdir,             sys_chdir),          // 80 
-   //   (__NR_fchdir,            sys_fchdir),         // 81 
+   GENX_(__NR_chdir,             sys_chdir),          // 80 
+   GENX_(__NR_fchdir,            sys_fchdir),         // 81 
    //   (__NR_rename,            sys_rename),         // 82 
    //   (__NR_mkdir,             sys_mkdir),          // 83 
    //   (__NR_rmdir,             sys_rmdir),          // 84 
@@ -585,7 +602,7 @@ const struct SyscallTableEntry VGA_(syscall_table)[] = {
    //   (__NR_lchown,            sys_lchown),         // 94 
 
    //   (__NR_umask,             sys_umask),          // 95 
-   //   (__NR_gettimeofday,      sys_gettimeofday),   // 96 
+   GENXY(__NR_gettimeofday,      sys_gettimeofday),   // 96 
    GENXY(__NR_getrlimit,         sys_getrlimit),      // 97 
    //   (__NR_getrusage,         sys_getrusage),      // 98 
    //   (__NR_sysinfo,           sys_sysinfo),        // 99 
@@ -711,7 +728,7 @@ const struct SyscallTableEntry VGA_(syscall_table)[] = {
    //   (__NR_fremovexattr,      sys_fremovexattr),   // 199 
 
    //   (__NR_tkill,             sys_tkill),             // 200 
-   //   (__NR_time,              sys_time64),            // 201 
+   GENXY(__NR_time,              sys_time), /*was sys_time64*/ // 201 
    //   (__NR_futex,             sys_futex),             // 202 
    //   (__NR_sched_setaffinity, sys_sched_setaffinity), // 203 
    //   (__NR_sched_getaffinity, sys_sched_getaffinity), // 204 
index fc05795fa3b0f4adcf7441ca8206be9d9c6a9511..864f42fff100656df777f589d3f76d864b0dcee9 100644 (file)
@@ -69,10 +69,7 @@ sigreturn_start:
        # We can point our sysinfo stuff here
        .align 16
 syscall_start:
-       /* Rerouted entry point for __NR_vgettimeofday */
-       movq    $96 /*__NR_gettimeofday*/, %rax
-       syscall
-       ret
+       /* unused on amd64 */
 tramp_code_end:
                        
 .data
index d2d46b6939d59cffa76a5ddb6bc4877a69fb49c3..df034db461092aea128e1c744fa75b00a4bf5541 100644 (file)
@@ -2521,19 +2521,39 @@ static void add_redirect_addr(const Char *from_lib, const Char *from_sym,
    }
 }
 
+
+/* HACK! This should be done properly (see ~/NOTES.txt) */
+#ifdef __amd64__
+/* Rerouted entry points for __NR_vgettimeofday and __NR_vtime.
+     96 == __NR_gettimeofday
+    201 == __NR_time
+*/
+asm(
+"amd64_linux_rerouted__vgettimeofday:\n"
+"      movq    $96, %rax\n"
+"      syscall\n"
+"      ret\n"
+"amd64_linux_rerouted__vtime:\n"
+"      movq    $201, %rax\n"
+"      syscall\n"
+"      ret\n"
+);
+#endif
+
 Addr VG_(code_redirect)(Addr a)
 {
    CodeRedirect *r = VG_(SkipList_Find)(&sk_resolved_redir, &a);
 
 #ifdef __amd64__
-   /* HACK.  0xFFFFFFFFFF600000 is the entry point for 
-      __NR_vgettimeofday.  Therefore the code at 
-      VG_(client_trampoline_code)+VG_(tramp_syscall_offset)
-      must be the magic conversion code to turn it into a normal
-      __NR_gettimeofday call. 
+   /* HACK.  Reroute the amd64-linux vsyscalls.  This should be moved
+      out of here into an amd64-linux specific initialisation routine.
    */
+   extern void amd64_linux_rerouted__vgettimeofday;
+   extern void amd64_linux_rerouted__vtime;
    if (a == 0xFFFFFFFFFF600000ULL)
-      return VG_(client_trampoline_code)+VG_(tramp_syscall_offset);
+      return (Addr)&amd64_linux_rerouted__vgettimeofday;
+   if (a == 0xFFFFFFFFFF600400ULL)
+      return (Addr)&amd64_linux_rerouted__vtime;
 #endif
 
    if (r == NULL || r->from_addr != a)