From c9447117acf8c9c2cc6acd06e002d25aa9ab5f72 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Tue, 17 Sep 2002 16:42:36 +0000 Subject: [PATCH] Kludge to work around the problem thatthe /usr/include/sys/user.h on 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 | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/vg_syscall_mem.c b/vg_syscall_mem.c index b6e3f027ff..1a09d4d8ff 100644 --- a/vg_syscall_mem.c +++ b/vg_syscall_mem.c @@ -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 -- 2.47.2