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
This commit is contained in:
Nicholas Nethercote 2005-06-18 03:27:58 +00:00
parent cbab2cf707
commit 2f407d612c
12 changed files with 108 additions and 124 deletions

View File

@ -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 \
\

View File

@ -11,7 +11,6 @@ CLEANFILES = stage2.lds
libarch_a_SOURCES = \
cpuid.S \
helpers.S \
jmp_with_stack.c \
state.c

View File

@ -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 ---##
##--------------------------------------------------------------------##

View File

@ -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
// ---------------------------------------------------------------------

View File

@ -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 <dirent.h>

View File

@ -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!

View File

@ -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"

View File

@ -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"

View File

@ -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. ---*/

View File

@ -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

View File

@ -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 ---*/
/*--------------------------------------------------------------------*/

View File

@ -11,7 +11,6 @@ CLEANFILES = stage2.lds
libarch_a_SOURCES = \
cpuid.S \
helpers.S \
jmp_with_stack.c \
state.c