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 \
m_syscall.c \
m_threadmodel.c \
m_tooliface.c \
+ m_trampoline.S \
m_translate.c \
m_transtab.c \
\
libarch_a_SOURCES = \
cpuid.S \
- helpers.S \
jmp_with_stack.c \
state.c
+++ /dev/null
-##--------------------------------------------------------------------##
-##--- 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 ---##
-##--------------------------------------------------------------------##
#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
// ---------------------------------------------------------------------
#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>
#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!
#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"
#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"
#include "pub_core_options.h"
#include "pub_core_profile.h"
#include "pub_core_stacktrace.h"
+#include "pub_core_trampoline.h"
/*------------------------------------------------------------*/
/*--- Exported functions. ---*/
+
##--------------------------------------------------------------------##
-##--- Support routines for the JITter output. x86/helpers.S ---##
+##--- Trampoline code page stuff. m_trampoline.S ---##
##--------------------------------------------------------------------##
/*
#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)
.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
int $0x80
ud2
-rt_sigreturn_start:
+ rt_sigreturn_start:
/* Likewise for rt signal frames */
movl $__NR_rt_sigreturn, %eax
int $0x80
# 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
.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
--- /dev/null
+
+/*--------------------------------------------------------------------*/
+/*--- 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 ---*/
+/*--------------------------------------------------------------------*/
libarch_a_SOURCES = \
cpuid.S \
- helpers.S \
jmp_with_stack.c \
state.c