From: Julian Seward Date: Wed, 2 Mar 2005 16:01:23 +0000 (+0000) Subject: Fix enough syscall stuff so that simple X applications run (xfontsel, X-Git-Tag: svn/VALGRIND_3_0_0~1057 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e00d9e22afb7c83638dbc0659e56af99627c99b;p=thirdparty%2Fvalgrind.git Fix enough syscall stuff so that simple X applications run (xfontsel, xedit). git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3261 --- diff --git a/NOTES.txt b/NOTES.txt index 07018846b8..01cdb3bab4 100644 --- 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. diff --git a/coregrind/amd64-linux/syscalls.c b/coregrind/amd64-linux/syscalls.c index a12d9f2bb0..e386cafe15 100644 --- a/coregrind/amd64-linux/syscalls.c +++ b/coregrind/amd64-linux/syscalls.c @@ -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 diff --git a/coregrind/amd64/helpers.S b/coregrind/amd64/helpers.S index fc05795fa3..864f42fff1 100644 --- a/coregrind/amd64/helpers.S +++ b/coregrind/amd64/helpers.S @@ -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 diff --git a/coregrind/vg_symtab2.c b/coregrind/vg_symtab2.c index d2d46b6939..df034db461 100644 --- a/coregrind/vg_symtab2.c +++ b/coregrind/vg_symtab2.c @@ -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)