noinst_LIBRARIES = libarch.a
-EXTRA_DIST = \
- jmp_with_stack.c
-
BUILT_SOURCES = stage2.lds
CLEANFILES = stage2.lds
libarch_a_SOURCES = \
cpuid.S \
- jmp_with_stack.c \
- state.c
+ jmp_with_stack.c
# Extract ld's default linker script and hack it to our needs
stage2.lds: Makefile
+++ /dev/null
-
-/*--------------------------------------------------------------------*/
-/*--- Arch-specific registers, etc. amd64/state.c ---*/
-/*--------------------------------------------------------------------*/
-
-/*
- 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.h"
-#include "pub_core_libcbase.h"
-#include "pub_core_libcassert.h"
-#include "pub_core_tooliface.h"
-#include <sys/ptrace.h>
-
-#include "libvex_guest_amd64.h"
-
-
-/*------------------------------------------------------------*/
-/*--- Determining arch/subarch. ---*/
-/*------------------------------------------------------------*/
-
-// Returns the architecture and subarchitecture, or indicates
-// that this subarchitecture is unable to run Valgrind
-// Returns False to indicate we cannot proceed further.
-Bool VGA_(getArchAndSubArch)( /*OUT*/VexArch* vex_arch,
- /*OUT*/VexSubArch* vex_subarch )
-{
- vg_assert(VG_(has_cpuid)());
- *vex_arch = VexArchAMD64;
- *vex_subarch = VexSubArch_NONE;
- return True;
-}
-
-
-/*--------------------------------------------------------------------*/
-/*--- end ---*/
-/*--------------------------------------------------------------------*/
noinst_LIBRARIES = libarch.a
-EXTRA_DIST = \
- jmp_with_stack.c \
- libpthread.c
-
BUILT_SOURCES = stage2.lds
CLEANFILES = stage2.lds
libarch_a_SOURCES = \
- state.c
+ jmp_with_stack.c
# Extract ld's default linker script and hack it to our needs
stage2.lds: Makefile
+++ /dev/null
-
-/*--------------------------------------------------------------------*/
-/*--- Arch-specific registers, etc. x86/state.c ---*/
-/*--------------------------------------------------------------------*/
-
-/*
- This file is part of Valgrind, a dynamic binary instrumentation
- framework.
-
- Copyright (C) 2000-2005 Nicholas Nethercote
- njn@valgrind.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.h"
-#include <sys/ptrace.h>
-
-#include "libvex_guest_arm.h"
-
-
-/*------------------------------------------------------------*/
-/*--- Initialising the first thread ---*/
-/*------------------------------------------------------------*/
-
-/* Given a pointer to the ThreadArchState for thread 1 (the root
- thread), initialise the VEX guest state, and copy in essential
- starting values.
-*/
-void VGA_(init_thread1state) ( Addr client_eip,
- Addr esp_at_startup,
- /*MOD*/ ThreadArchState* arch )
-{
- I_die_here;
-#if 0
- // When implementing this, look at x86/state.c
-#endif
-}
-
-
-/*------------------------------------------------------------*/
-/*--- Thread stuff ---*/
-/*------------------------------------------------------------*/
-
-void VGA_(clear_thread)( ThreadArchState *arch )
-{
- I_die_here;
-#if 0
- arch->ldt = NULL;
- VG_(clear_TLS_for_thread)(arch->tls);
-#endif
-}
-
-void VGA_(cleanup_thread) ( ThreadArchState *arch )
-{
- I_die_here;
-#if 0
- /* Deallocate its LDT, if it ever had one. */
- VG_(deallocate_LDT_for_thread)( arch->ldt );
- arch->ldt = NULL;
-
- /* Clear its TLS array. */
- VG_(clear_TLS_for_thread)( arch->tls );
-#endif
-}
-
-void VGA_(setup_child) ( ThreadArchState *regs, ThreadArchState *parent_regs )
-{
- I_die_here;
-#if 0
- // XXX: look at x86/state.c
-#endif
-}
-
-
-/*------------------------------------------------------------*/
-/*--- pointercheck ---*/
-/*------------------------------------------------------------*/
-
-Bool VGA_(setup_pointercheck)(Addr client_base, Addr client_end)
-{
- I_die_here;
-#if 0
- vki_modify_ldt_t ldt = {
- VG_POINTERCHECK_SEGIDX, // entry_number
- VG_(client_base), // base_addr
- (VG_(client_end)-VG_(client_base)) / VKI_PAGE_SIZE, // limit
- 1, // seg_32bit
- 0, // contents: data, RW, non-expanding
- 0, // ! read_exec_only
- 1, // limit_in_pages
- 0, // ! seg not present
- 1, // useable
- };
- int ret = VG_(do_syscall)(__NR_modify_ldt, 1, &ldt, sizeof(ldt));
- if (ret < 0) {
- VG_(message)(Vg_UserMsg,
- "Warning: ignoring --pointercheck=yes, "
- "because modify_ldt failed (errno=%d)", -ret);
- return False;
- } else {
- return True;
- }
-#endif
-}
-
-/*------------------------------------------------------------*/
-/*--- Debugger-related operations ---*/
-/*------------------------------------------------------------*/
-
-Int VGA_(ptrace_setregs_from_tst)(Int pid, ThreadArchState* arch)
-{
- I_die_here;
-#if 0
- struct vki_user_regs_struct regs;
-
- regs.cs = arch->vex.guest_CS;
- regs.ss = arch->vex.guest_SS;
- regs.ds = arch->vex.guest_DS;
- regs.es = arch->vex.guest_ES;
- regs.fs = arch->vex.guest_FS;
- regs.gs = arch->vex.guest_GS;
- regs.eax = arch->vex.guest_EAX;
- regs.ebx = arch->vex.guest_EBX;
- regs.ecx = arch->vex.guest_ECX;
- regs.edx = arch->vex.guest_EDX;
- regs.esi = arch->vex.guest_ESI;
- regs.edi = arch->vex.guest_EDI;
- regs.ebp = arch->vex.guest_EBP;
- regs.esp = arch->vex.guest_ESP;
- regs.eflags = LibVEX_GuestX86_get_eflags(&arch->vex);
- regs.eip = arch->vex.guest_EIP;
-
- return ptrace(PTRACE_SETREGS, pid, NULL, ®s);
-#endif
-}
-
-/*--------------------------------------------------------------------*/
-/*--- end ---*/
-/*--------------------------------------------------------------------*/
#include "pub_core_scheduler.h" // for types 'ThreadArchState'
-// ---------------------------------------------------------------------
-// Architecture-specific things defined in eg. x86/*.c
-// ---------------------------------------------------------------------
-
-// Returns the architecture and subarchitecture, or indicates
-// that this subarchitecture is unable to run Valgrind
-// Returns False to indicate we cannot proceed further.
-extern Bool VGA_(getArchAndSubArch)( /*OUT*/VexArch*,
- /*OUT*/VexSubArch* );
-
/* ---------------------------------------------------------------------
Finally - autoconf-generated settings
------------------------------------------------------------------ */
#include "pub_core_translate.h"
#include "pub_core_transtab.h"
+/*------------------------------------------------------------*/
+/*--- Determining arch/subarch. ---*/
+/*------------------------------------------------------------*/
+
+// Returns the architecture and subarchitecture, or indicates
+// that this subarchitecture is unable to run Valgrind
+// Returns False to indicate we cannot proceed further.
+static Bool getArchAndSubArch( /*OUT*/VexArch* vex_arch,
+ /*OUT*/VexSubArch* vex_subarch )
+{
+#if defined(VGA_x86)
+ Bool have_sse0, have_sse1, have_sse2;
+ UInt eax, ebx, ecx, edx;
+
+ if (!VG_(has_cpuid)())
+ /* we can't do cpuid at all. Give up. */
+ return False;
+
+ VG_(cpuid)(0, &eax, &ebx, &ecx, &edx);
+ if (eax < 1)
+ /* we can't ask for cpuid(x) for x > 0. Give up. */
+ return False;
+
+ /* get capabilities bits into edx */
+ VG_(cpuid)(1, &eax, &ebx, &ecx, &edx);
+
+ have_sse0 = (edx & (1<<24)) != 0; /* True => have fxsave/fxrstor */
+ have_sse1 = (edx & (1<<25)) != 0; /* True => have sse insns */
+ have_sse2 = (edx & (1<<26)) != 0; /* True => have sse2 insns */
+
+ if (have_sse2 && have_sse1 && have_sse0) {
+ *vex_arch = VexArchX86;
+ *vex_subarch = VexSubArchX86_sse2;
+ return True;
+ }
+
+ if (have_sse1 && have_sse0) {
+ *vex_arch = VexArchX86;
+ *vex_subarch = VexSubArchX86_sse1;
+ return True;
+ }
+
+ if (have_sse0) {
+ *vex_arch = VexArchX86;
+ *vex_subarch = VexSubArchX86_sse0;
+ return True;
+ }
+
+ /* we need at least SSE state to operate. */
+ return False;
+#elif defined(VGA_amd64)
+ vg_assert(VG_(has_cpuid)());
+ *vex_arch = VexArchAMD64;
+ *vex_subarch = VexSubArch_NONE;
+ return True;
+#else
+# error Unknown architecture
+#endif
+}
+
/*------------------------------------------------------------*/
/*--- %SP-update pass ---*/
/*------------------------------------------------------------*/
+static Bool need_to_handle_SP_assignment(void)
+{
+ return ( VG_(tdict).track_new_mem_stack_4 ||
+ VG_(tdict).track_die_mem_stack_4 ||
+ VG_(tdict).track_new_mem_stack_8 ||
+ VG_(tdict).track_die_mem_stack_8 ||
+ VG_(tdict).track_new_mem_stack_12 ||
+ VG_(tdict).track_die_mem_stack_12 ||
+ VG_(tdict).track_new_mem_stack_16 ||
+ VG_(tdict).track_die_mem_stack_16 ||
+ VG_(tdict).track_new_mem_stack_32 ||
+ VG_(tdict).track_die_mem_stack_32 ||
+ VG_(tdict).track_new_mem_stack ||
+ VG_(tdict).track_die_mem_stack );
+}
+
/* NOTE: this comment is out of date */
/* For tools that want to know about %ESP changes, this pass adds
}
}
-static Bool need_to_handle_SP_assignment(void)
-{
- return ( VG_(tdict).track_new_mem_stack_4 ||
- VG_(tdict).track_die_mem_stack_4 ||
- VG_(tdict).track_new_mem_stack_8 ||
- VG_(tdict).track_die_mem_stack_8 ||
- VG_(tdict).track_new_mem_stack_12 ||
- VG_(tdict).track_die_mem_stack_12 ||
- VG_(tdict).track_new_mem_stack_16 ||
- VG_(tdict).track_die_mem_stack_16 ||
- VG_(tdict).track_new_mem_stack_32 ||
- VG_(tdict).track_die_mem_stack_32 ||
- VG_(tdict).track_new_mem_stack ||
- VG_(tdict).track_die_mem_stack );
-}
-
Bool VG_(translate) ( ThreadId tid,
Addr64 orig_addr,
Bool debugging_translation,
static Bool vex_init_done = False;
if (!vex_init_done) {
- Bool ok = VGA_(getArchAndSubArch)( &vex_arch, &vex_subarch );
+ Bool ok = getArchAndSubArch( &vex_arch, &vex_subarch );
if (!ok) {
VG_(printf)("\n");
VG_(printf)("valgrind: fatal error: unsupported CPU.\n");
noinst_LIBRARIES = libarch.a
-EXTRA_DIST = \
- jmp_with_stack.c
-
BUILT_SOURCES = stage2.lds
CLEANFILES = stage2.lds
libarch_a_SOURCES = \
cpuid.S \
- jmp_with_stack.c \
- state.c
+ jmp_with_stack.c
# Extract ld's default linker script and hack it to our needs
stage2.lds: Makefile
+++ /dev/null
-
-/*--------------------------------------------------------------------*/
-/*--- Arch-specific registers, etc. x86/state.c ---*/
-/*--------------------------------------------------------------------*/
-
-/*
- This file is part of Valgrind, a dynamic binary instrumentation
- framework.
-
- Copyright (C) 2000-2005 Nicholas Nethercote
- njn@valgrind.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.h"
-#include "pub_core_libcbase.h"
-#include "pub_core_libcassert.h"
-#include "pub_core_tooliface.h"
-#include <sys/ptrace.h>
-
-#include "libvex_guest_x86.h"
-
-
-/*------------------------------------------------------------*/
-/*--- Determining arch/subarch. ---*/
-/*------------------------------------------------------------*/
-
-// Returns the architecture and subarchitecture, or indicates
-// that this subarchitecture is unable to run Valgrind
-// Returns False to indicate we cannot proceed further.
-Bool VGA_(getArchAndSubArch)( /*OUT*/VexArch* vex_arch,
- /*OUT*/VexSubArch* vex_subarch )
-{
- Bool have_sse0, have_sse1, have_sse2;
- UInt eax, ebx, ecx, edx;
-
- if (!VG_(has_cpuid)())
- /* we can't do cpuid at all. Give up. */
- return False;
-
- VG_(cpuid)(0, &eax, &ebx, &ecx, &edx);
- if (eax < 1)
- /* we can't ask for cpuid(x) for x > 0. Give up. */
- return False;
-
- /* get capabilities bits into edx */
- VG_(cpuid)(1, &eax, &ebx, &ecx, &edx);
-
- have_sse0 = (edx & (1<<24)) != 0; /* True => have fxsave/fxrstor */
- have_sse1 = (edx & (1<<25)) != 0; /* True => have sse insns */
- have_sse2 = (edx & (1<<26)) != 0; /* True => have sse2 insns */
-
- if (have_sse2 && have_sse1 && have_sse0) {
- *vex_arch = VexArchX86;
- *vex_subarch = VexSubArchX86_sse2;
- return True;
- }
-
- if (have_sse1 && have_sse0) {
- *vex_arch = VexArchX86;
- *vex_subarch = VexSubArchX86_sse1;
- return True;
- }
-
- if (have_sse0) {
- *vex_arch = VexArchX86;
- *vex_subarch = VexSubArchX86_sse0;
- return True;
- }
-
- /* we need at least SSE state to operate. */
- return False;
-}
-
-/*--------------------------------------------------------------------*/
-/*--- end ---*/
-/*--------------------------------------------------------------------*/