mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 18:13:01 +00:00
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:
parent
cbab2cf707
commit
2f407d612c
@ -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 \
|
||||
\
|
||||
|
||||
@ -11,7 +11,6 @@ CLEANFILES = stage2.lds
|
||||
|
||||
libarch_a_SOURCES = \
|
||||
cpuid.S \
|
||||
helpers.S \
|
||||
jmp_with_stack.c \
|
||||
state.c
|
||||
|
||||
|
||||
@ -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 ---##
|
||||
##--------------------------------------------------------------------##
|
||||
@ -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
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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!
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
|
||||
@ -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. ---*/
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
56
coregrind/pub_core_trampoline.h
Normal file
56
coregrind/pub_core_trampoline.h
Normal 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 ---*/
|
||||
/*--------------------------------------------------------------------*/
|
||||
@ -11,7 +11,6 @@ CLEANFILES = stage2.lds
|
||||
|
||||
libarch_a_SOURCES = \
|
||||
cpuid.S \
|
||||
helpers.S \
|
||||
jmp_with_stack.c \
|
||||
state.c
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user