]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Kludge to work around the problem thatthe /usr/include/sys/user.h on
authorJulian Seward <jseward@acm.org>
Tue, 17 Sep 2002 16:42:36 +0000 (16:42 +0000)
committerJulian Seward <jseward@acm.org>
Tue, 17 Sep 2002 16:42:36 +0000 (16:42 +0000)
R H 6.2 doesn't define struct user_fpxregs_struct (problem appeared
with Jason Molenda's ptrace patch).

MERGE TO ERASER

git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_1_0_BRANCH@1019

vg_syscall_mem.c

index b6e3f027ff7842367169a2ebb7ca2cb2858481d0..1a09d4d8ffac7eee4d1e8b4897bd133623139c66 100644 (file)
@@ -442,9 +442,35 @@ void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid )
 #     endif
 
 #     if defined(__NR_ptrace)
-      case __NR_ptrace: /* syscall 26 */
+      case __NR_ptrace: /* syscall 26 */
          /* long ptrace (enum __ptrace_request request, pid_t pid, 
                          void *addr, void *data); ... sort of. */
+         /* Sigh ... the /usr/include/sys/user.h on R H 6.2 doesn't 
+            define struct user_fpxregs_struct.  On the basis that it 
+            is defined as follows on my R H 7.2 (glibc-2.2.4) box, 
+            I kludge it.
+
+            struct user_fpxregs_struct
+            {
+               unsigned short int cwd;
+               unsigned short int swd;
+               unsigned short int twd;
+               unsigned short int fop;
+               long int fip;
+               long int fcs;
+               long int foo;
+               long int fos;
+               long int mxcsr;
+               long int reserved;
+               long int st_space[32];  8*16 bytes for each FP-reg = 128 bytes
+               long int xmm_space[32]; 8*16 bytes for each XMM-reg = 128 bytes
+               long int padding[56];
+            };
+         */
+         const Int sizeof_struct_user_fpxregs_struct
+            = sizeof(unsigned short) * (1 + 1 + 1 + 1) 
+              + sizeof(long int) * (1 + 1 + 1 + 1 + 1 + 1 + 32 + 32 + 56);
+
          switch (arg1) {
              case 12:   /* PTRACE_GETREGS */
                  must_be_writable (tst, "ptrace(getregs)", arg4, 
@@ -456,9 +482,9 @@ void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid )
                  break;
              case 18:   /* PTRACE_GETFPXREGS */
                  must_be_writable (tst, "ptrace(getfpxregs)", arg4, 
-                                   sizeof (struct user_fpxregs_struct));
+                                   sizeof_struct_user_fpxregs_struct);
                  break;
-            case 1: case 2: case 3:    /* PTRACE_PEEK{TEXT,DATA,USER} */
+             case 1: case 2: case 3:    /* PTRACE_PEEK{TEXT,DATA,USER} */
                  must_be_writable (tst, "ptrace(peek)", arg4, sizeof (long));
                  break;
              case 13:   /* PTRACE_SETREGS */
@@ -471,7 +497,7 @@ void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid )
                  break;
              case 19:   /* PTRACE_SETFPXREGS */
                  must_be_readable (tst, "ptrace(setfpxregs)", arg4, 
-                                   sizeof (struct user_fpxregs_struct));
+                                   sizeof_struct_user_fpxregs_struct);
                  break;
              default:
                  break;
@@ -486,15 +512,16 @@ void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid )
                      make_readable (arg4, sizeof (struct user_fpregs_struct));
                      break;
                  case 18:  /* PTRACE_GETFPXREGS */
-                     make_readable (arg4, sizeof (struct user_fpxregs_struct));
+                     make_readable (arg4, sizeof_struct_user_fpxregs_struct);
                      break;
-                case 1: case 2: case 3:    /* PTRACE_PEEK{TEXT,DATA,USER} */
+                 case 1: case 2: case 3:    /* PTRACE_PEEK{TEXT,DATA,USER} */
                      make_readable (arg4, sizeof (long));
                      break;
                  default:
                      break;
              }
          }
+         }
          break;
 #     endif