From 2f407d612cff80a297f98ea4173bd2f54176d56c Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Sat, 18 Jun 2005 03:27:58 +0000 Subject: [PATCH] Moved the code trampoline stuff into a new module, m_trampoline. Not certain this was the right thing to do, but that stuff sure as hell didn't fit in any of the existing modules. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3929 --- coregrind/Makefile.am | 2 + coregrind/amd64/Makefile.am | 1 - coregrind/amd64/helpers.S | 96 --------------------- coregrind/core.h | 13 --- coregrind/m_main.c | 1 + coregrind/m_redir.c | 1 + coregrind/m_sigframe/sigframe-amd64-linux.c | 1 + coregrind/m_sigframe/sigframe-x86-linux.c | 1 + coregrind/m_stacktrace.c | 1 + coregrind/{x86/helpers.S => m_trampoline.S} | 58 ++++++++++--- coregrind/pub_core_trampoline.h | 56 ++++++++++++ coregrind/x86/Makefile.am | 1 - 12 files changed, 108 insertions(+), 124 deletions(-) delete mode 100644 coregrind/amd64/helpers.S rename coregrind/{x86/helpers.S => m_trampoline.S} (70%) create mode 100644 coregrind/pub_core_trampoline.h diff --git a/coregrind/Makefile.am b/coregrind/Makefile.am index 3ba22e22d..2f951107d 100644 --- a/coregrind/Makefile.am +++ b/coregrind/Makefile.am @@ -70,6 +70,7 @@ noinst_HEADERS = \ pub_core_syswrap.h \ pub_core_threadmodel.h \ pub_core_tooliface.h \ + pub_core_trampoline.h \ pub_core_translate.h \ pub_core_transtab.h \ pub_core_transtab_asm.h \ @@ -118,6 +119,7 @@ stage2_SOURCES = \ m_syscall.c \ m_threadmodel.c \ m_tooliface.c \ + m_trampoline.S \ m_translate.c \ m_transtab.c \ \ diff --git a/coregrind/amd64/Makefile.am b/coregrind/amd64/Makefile.am index c547581f5..ccbe24491 100644 --- a/coregrind/amd64/Makefile.am +++ b/coregrind/amd64/Makefile.am @@ -11,7 +11,6 @@ CLEANFILES = stage2.lds libarch_a_SOURCES = \ cpuid.S \ - helpers.S \ jmp_with_stack.c \ state.c diff --git a/coregrind/amd64/helpers.S b/coregrind/amd64/helpers.S deleted file mode 100644 index a7609b1b1..000000000 --- a/coregrind/amd64/helpers.S +++ /dev/null @@ -1,96 +0,0 @@ -##--------------------------------------------------------------------## -##--- Support routines for the JITter output. amd64/helpers.S ---## -##--------------------------------------------------------------------## - -/* - This file is part of Valgrind, a dynamic binary instrumentation - framework. - - Copyright (C) 2000-2005 Julian Seward - jseward@acm.org - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. - - The GNU General Public License is contained in the file COPYING. -*/ - -#include "core_asm.h" -#include "vki_unistd.h" - -/* ------------------ SIMULATED CPU HELPERS ------------------ */ -/* A stubs for a return which we want to catch: a signal return. - returns and pthread returns. In the latter case, the thread's - return value is in %EAX, so we pass this as the first argument - to the request. In both cases we use the user request mechanism. - You need to to read the definition of VALGRIND_MAGIC_SEQUENCE - in valgrind.h to make sense of this. - - This isn't used in-place. It is copied into the client address space - at an arbitary address. Therefore, this code must be completely - position-independent. -*/ -.global VG_(trampoline_code_start) -.global VG_(trampoline_code_length) -.global VG_(tramp_rt_sigreturn_offset) -.global VG_(tramp_syscall_offset) -.global VG_(tramp_gettimeofday_offset) -.global VG_(tramp_time_offset) - -VG_(trampoline_code_start): -rt_sigreturn_start: - /* Likewise for rt signal frames */ - movq $__NR_rt_sigreturn, %rax - syscall - ud2 - - # We can point our sysinfo stuff here - .align 16 -syscall_start: - /* unused on amd64 */ - - .align 16 -gettimeofday_start: - movq $__NR_gettimeofday, %rax - syscall - ret - - .align 16 -time_start: - movq $__NR_time, %rax - syscall - ret -tramp_code_end: - -.data -VG_(trampoline_code_length): - .long tramp_code_end - VG_(trampoline_code_start) -VG_(tramp_rt_sigreturn_offset): - .long rt_sigreturn_start - VG_(trampoline_code_start) -VG_(tramp_syscall_offset): - .long syscall_start - VG_(trampoline_code_start) -VG_(tramp_gettimeofday_offset): - .long gettimeofday_start - VG_(trampoline_code_start) -VG_(tramp_time_offset): - .long time_start - VG_(trampoline_code_start) -.text - - -/* Let the linker know we don't need an executable stack */ -.section .note.GNU-stack,"",@progbits - -##--------------------------------------------------------------------## -##--- end ---## -##--------------------------------------------------------------------## diff --git a/coregrind/core.h b/coregrind/core.h index 93d96c51e..59f7c8c12 100644 --- a/coregrind/core.h +++ b/coregrind/core.h @@ -49,19 +49,6 @@ #include "pub_core_scheduler.h" // for types 'ThreadArchState' -/* --------------------------------------------------------------------- - Exports of vg_helpers.S - ------------------------------------------------------------------ */ - -/* Information about trampoline code (for signal return and syscalls) */ -extern const Char VG_(trampoline_code_start); -extern const Int VG_(trampoline_code_length); -extern const Int VG_(tramp_sigreturn_offset); -extern const Int VG_(tramp_rt_sigreturn_offset); -extern const Int VG_(tramp_syscall_offset); -extern const Int VG_(tramp_gettimeofday_offset); -extern const Int VG_(tramp_time_offset); - // --------------------------------------------------------------------- // Architecture-specific things defined in eg. x86/*.c // --------------------------------------------------------------------- diff --git a/coregrind/m_main.c b/coregrind/m_main.c index ddac41279..702df4732 100644 --- a/coregrind/m_main.c +++ b/coregrind/m_main.c @@ -52,6 +52,7 @@ #include "pub_core_signals.h" #include "pub_core_syswrap.h" #include "pub_core_tooliface.h" +#include "pub_core_trampoline.h" #include "pub_core_transtab.h" #include diff --git a/coregrind/m_redir.c b/coregrind/m_redir.c index 1d2f29609..3d5988caa 100644 --- a/coregrind/m_redir.c +++ b/coregrind/m_redir.c @@ -40,6 +40,7 @@ #include "pub_core_options.h" #include "pub_core_redir.h" #include "pub_core_skiplist.h" +#include "pub_core_trampoline.h" #include "pub_core_transtab.h" #include "m_debuginfo/priv_symtab.h" // XXX: bad! diff --git a/coregrind/m_sigframe/sigframe-amd64-linux.c b/coregrind/m_sigframe/sigframe-amd64-linux.c index e5d12cd07..6d0780e2b 100644 --- a/coregrind/m_sigframe/sigframe-amd64-linux.c +++ b/coregrind/m_sigframe/sigframe-amd64-linux.c @@ -39,6 +39,7 @@ #include "pub_core_sigframe.h" #include "pub_core_signals.h" #include "pub_core_tooliface.h" +#include "pub_core_trampoline.h" #include "libvex_guest_amd64.h" diff --git a/coregrind/m_sigframe/sigframe-x86-linux.c b/coregrind/m_sigframe/sigframe-x86-linux.c index cdd4364a9..60006575e 100644 --- a/coregrind/m_sigframe/sigframe-x86-linux.c +++ b/coregrind/m_sigframe/sigframe-x86-linux.c @@ -39,6 +39,7 @@ #include "pub_core_sigframe.h" #include "pub_core_signals.h" #include "pub_core_tooliface.h" +#include "pub_core_trampoline.h" #include "libvex_guest_x86.h" diff --git a/coregrind/m_stacktrace.c b/coregrind/m_stacktrace.c index 8847e0e5b..2f5fb8314 100644 --- a/coregrind/m_stacktrace.c +++ b/coregrind/m_stacktrace.c @@ -37,6 +37,7 @@ #include "pub_core_options.h" #include "pub_core_profile.h" #include "pub_core_stacktrace.h" +#include "pub_core_trampoline.h" /*------------------------------------------------------------*/ /*--- Exported functions. ---*/ diff --git a/coregrind/x86/helpers.S b/coregrind/m_trampoline.S similarity index 70% rename from coregrind/x86/helpers.S rename to coregrind/m_trampoline.S index 354103087..7b07660f9 100644 --- a/coregrind/x86/helpers.S +++ b/coregrind/m_trampoline.S @@ -1,5 +1,6 @@ + ##--------------------------------------------------------------------## -##--- Support routines for the JITter output. x86/helpers.S ---## +##--- Trampoline code page stuff. m_trampoline.S ---## ##--------------------------------------------------------------------## /* @@ -31,15 +32,9 @@ #include "vki_unistd.h" /* ------------------ SIMULATED CPU HELPERS ------------------ */ -/* A stubs for a return which we want to catch: a signal return. - returns and pthread returns. In the latter case, the thread's - return value is in %EAX, so we pass this as the first argument - to the request. In both cases we use the user request mechanism. - You need to to read the definition of VALGRIND_MAGIC_SEQUENCE - in valgrind.h to make sense of this. - - This isn't used in-place. It is copied into the client address space - at an arbitary address. Therefore, this code must be completely +/* Stubs for returns which we want to catch. + This code isn't used in-place. It is copied into the client address + space at an arbitary address. Therefore, this code must be completely position-independent. */ .global VG_(trampoline_code_start) @@ -49,7 +44,8 @@ .global VG_(tramp_syscall_offset) VG_(trampoline_code_start): -sigreturn_start: +#if defined(VGP_x86_linux) + sigreturn_start: /* This is a very specific sequence which GDB uses to recognize signal handler frames. */ popl %eax @@ -57,7 +53,7 @@ sigreturn_start: int $0x80 ud2 -rt_sigreturn_start: + rt_sigreturn_start: /* Likewise for rt signal frames */ movl $__NR_rt_sigreturn, %eax int $0x80 @@ -65,9 +61,41 @@ rt_sigreturn_start: # We can point our sysinfo stuff here .align 16 -syscall_start: + syscall_start: int $0x80 ret + + gettimeofday_start: + time_start: + /* unused on x86 */ + +#elif defined(VGP_amd64_linux) + rt_sigreturn_start: + /* Likewise for rt signal frames */ + movq $__NR_rt_sigreturn, %rax + syscall + ud2 + + .align 16 + gettimeofday_start: + movq $__NR_gettimeofday, %rax + syscall + ret + + .align 16 + time_start: + movq $__NR_time, %rax + syscall + ret + + .align 16 + sigreturn_start: + syscall_start: + /* unused on amd64 */ + +#else +# error Unknown platform +#endif tramp_code_end: .data @@ -79,6 +107,10 @@ VG_(tramp_rt_sigreturn_offset): .long rt_sigreturn_start - VG_(trampoline_code_start) VG_(tramp_syscall_offset): .long syscall_start - VG_(trampoline_code_start) +VG_(tramp_gettimeofday_offset): + .long gettimeofday_start - VG_(trampoline_code_start) +VG_(tramp_time_offset): + .long time_start - VG_(trampoline_code_start) .text diff --git a/coregrind/pub_core_trampoline.h b/coregrind/pub_core_trampoline.h new file mode 100644 index 000000000..50c40f8df --- /dev/null +++ b/coregrind/pub_core_trampoline.h @@ -0,0 +1,56 @@ + +/*--------------------------------------------------------------------*/ +/*--- The trampoline code page. pub_core_trampoline.h ---*/ +/*--------------------------------------------------------------------*/ + +/* + This file is part of Valgrind, a dynamic binary instrumentation + framework. + + Copyright (C) 2000-2005 Julian Seward + jseward@acm.org + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307, USA. + + The GNU General Public License is contained in the file COPYING. +*/ + +#ifndef __PUB_CORE_TRAMPOLINE_H +#define __PUB_CORE_TRAMPOLINE_H + +//-------------------------------------------------------------------- +// PURPOSE: This module defines our trampoline code page, which we copy +// over the client's, for arcane signal return and syscall purposes... +//-------------------------------------------------------------------- + +// Platform-specifics aren't neatly factored out here, since some of the +// constants are not used on all platforms. But it's non-obvious how +// to do it better. + +extern const Char VG_(trampoline_code_start); // x86 + amd64 +extern const Int VG_(trampoline_code_length); // x86 + amd64 + +extern const Int VG_(tramp_sigreturn_offset); // x86 +extern const Int VG_(tramp_rt_sigreturn_offset); // x86 + amd64 +extern const Int VG_(tramp_syscall_offset); // x86 +extern const Int VG_(tramp_gettimeofday_offset); // amd64 +extern const Int VG_(tramp_time_offset); // amd64 + +#endif // __PUB_CORE_TRAMPOLINE_H + +/*--------------------------------------------------------------------*/ +/*--- end ---*/ +/*--------------------------------------------------------------------*/ diff --git a/coregrind/x86/Makefile.am b/coregrind/x86/Makefile.am index d4438ebc4..6a698dfe2 100644 --- a/coregrind/x86/Makefile.am +++ b/coregrind/x86/Makefile.am @@ -11,7 +11,6 @@ CLEANFILES = stage2.lds libarch_a_SOURCES = \ cpuid.S \ - helpers.S \ jmp_with_stack.c \ state.c