From: Nicholas Nethercote Date: Sat, 18 Jun 2005 03:44:34 +0000 (+0000) Subject: Moved VGA_(getArchAndSubArch) into m_translate and made it local. This X-Git-Tag: svn/VALGRIND_3_0_0~388 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=521eb8fd8084286497fb63026d3fa2dcc1392d74;p=thirdparty%2Fvalgrind.git Moved VGA_(getArchAndSubArch) into m_translate and made it local. This allowed the removal of $ARCH/state.c, hooray! git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3930 --- diff --git a/coregrind/amd64/Makefile.am b/coregrind/amd64/Makefile.am index ccbe24491b..5453d083c1 100644 --- a/coregrind/amd64/Makefile.am +++ b/coregrind/amd64/Makefile.am @@ -3,16 +3,12 @@ include $(top_srcdir)/Makefile.core-AM_CPPFLAGS.am 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 diff --git a/coregrind/amd64/state.c b/coregrind/amd64/state.c deleted file mode 100644 index 31a84fe01e..0000000000 --- a/coregrind/amd64/state.c +++ /dev/null @@ -1,59 +0,0 @@ - -/*--------------------------------------------------------------------*/ -/*--- 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 - -#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 ---*/ -/*--------------------------------------------------------------------*/ diff --git a/coregrind/arm/Makefile.am b/coregrind/arm/Makefile.am index c34202b277..1735781220 100644 --- a/coregrind/arm/Makefile.am +++ b/coregrind/arm/Makefile.am @@ -3,15 +3,11 @@ include $(top_srcdir)/Makefile.core-AM_CPPFLAGS.am 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 diff --git a/coregrind/arm/state.c b/coregrind/arm/state.c deleted file mode 100644 index aca5d1f3d5..0000000000 --- a/coregrind/arm/state.c +++ /dev/null @@ -1,155 +0,0 @@ - -/*--------------------------------------------------------------------*/ -/*--- 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 - -#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 ---*/ -/*--------------------------------------------------------------------*/ diff --git a/coregrind/core.h b/coregrind/core.h index 59f7c8c12c..a7d927befb 100644 --- a/coregrind/core.h +++ b/coregrind/core.h @@ -49,16 +49,6 @@ #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 ------------------------------------------------------------------ */ diff --git a/coregrind/m_translate.c b/coregrind/m_translate.c index 86b127280a..0211808ea8 100644 --- a/coregrind/m_translate.c +++ b/coregrind/m_translate.c @@ -43,11 +43,87 @@ #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 @@ -336,22 +412,6 @@ static Bool chase_into_ok ( Addr64 addr64 ) } } -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, @@ -373,7 +433,7 @@ Bool VG_(translate) ( ThreadId tid, 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"); diff --git a/coregrind/x86/Makefile.am b/coregrind/x86/Makefile.am index 6a698dfe2c..6ed6d13caa 100644 --- a/coregrind/x86/Makefile.am +++ b/coregrind/x86/Makefile.am @@ -3,16 +3,12 @@ include $(top_srcdir)/Makefile.core-AM_CPPFLAGS.am 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 diff --git a/coregrind/x86/state.c b/coregrind/x86/state.c deleted file mode 100644 index 5c0bf65a3f..0000000000 --- a/coregrind/x86/state.c +++ /dev/null @@ -1,93 +0,0 @@ - -/*--------------------------------------------------------------------*/ -/*--- 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 - -#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 ---*/ -/*--------------------------------------------------------------------*/