pub_core_machine.h revision 2c48c7b0a453d32375a4df17e153011b797ef28c
1f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 2f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn/*--------------------------------------------------------------------*/ 3f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn/*--- Machine-related things. pub_core_machine.h ---*/ 4f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn/*--------------------------------------------------------------------*/ 5f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 6f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn/* 7f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn This file is part of Valgrind, a dynamic binary instrumentation 8f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn framework. 9f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 10f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn Copyright (C) 2000-2005 Julian Seward 11f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn jseward@acm.org 12f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 13f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn This program is free software; you can redistribute it and/or 14f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn modify it under the terms of the GNU General Public License as 15f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn published by the Free Software Foundation; either version 2 of the 16f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn License, or (at your option) any later version. 17f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 18f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn This program is distributed in the hope that it will be useful, but 19f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn WITHOUT ANY WARRANTY; without even the implied warranty of 20f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn General Public License for more details. 22f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 23f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn You should have received a copy of the GNU General Public License 24f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn along with this program; if not, write to the Free Software 25f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 26f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 02111-1307, USA. 27f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 28f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn The GNU General Public License is contained in the file COPYING. 29f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn*/ 30f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 31f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#ifndef __PUB_CORE_MACHINE_H 32f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#define __PUB_CORE_MACHINE_H 33f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 34f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn//-------------------------------------------------------------------- 35f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn// PURPOSE: This module contains code related to the particular 36f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn// architecture, things like accessing guest state, endianness, word size, 37f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn// etc. 38f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn//-------------------------------------------------------------------- 39f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 40f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#include "pub_tool_machine.h" 41f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 42f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#if defined(VGA_x86) 436e340c7a2c09971ac5ead854c40bbc0491b67636sewardj# define VG_ELF_DATA2XXX ELFDATA2LSB 44af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_MACHINE EM_386 45af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_CLASS ELFCLASS32 46f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#elif defined(VGA_amd64) 476e340c7a2c09971ac5ead854c40bbc0491b67636sewardj# define VG_ELF_DATA2XXX ELFDATA2LSB 48af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_MACHINE EM_X86_64 49af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_CLASS ELFCLASS64 5085665ca6fa29dd64754dabe50eb98f25896e752acerion#elif defined(VGA_ppc32) 516e340c7a2c09971ac5ead854c40bbc0491b67636sewardj# define VG_ELF_DATA2XXX ELFDATA2MSB 52af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_MACHINE EM_PPC 53af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_CLASS ELFCLASS32 542c48c7b0a453d32375a4df17e153011b797ef28csewardj#elif defined(VGA_ppc64) 552c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_ELF_DATA2XXX ELFDATA2MSB 562c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_ELF_MACHINE EM_PPC64 572c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_ELF_CLASS ELFCLASS64 58f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#else 59f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn# error Unknown arch 60f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#endif 61f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 62f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#if defined(VGA_x86) 63af839f52d74df156d655201a889954133ab01be7njn# define VG_INSTR_PTR guest_EIP 64af839f52d74df156d655201a889954133ab01be7njn# define VG_STACK_PTR guest_ESP 65af839f52d74df156d655201a889954133ab01be7njn# define VG_FRAME_PTR guest_EBP 66f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#elif defined(VGA_amd64) 67af839f52d74df156d655201a889954133ab01be7njn# define VG_INSTR_PTR guest_RIP 68af839f52d74df156d655201a889954133ab01be7njn# define VG_STACK_PTR guest_RSP 69af839f52d74df156d655201a889954133ab01be7njn# define VG_FRAME_PTR guest_RBP 7085665ca6fa29dd64754dabe50eb98f25896e752acerion#elif defined(VGA_ppc32) 71af839f52d74df156d655201a889954133ab01be7njn# define VG_INSTR_PTR guest_CIA 72af839f52d74df156d655201a889954133ab01be7njn# define VG_STACK_PTR guest_GPR1 73af839f52d74df156d655201a889954133ab01be7njn# define VG_FRAME_PTR guest_GPR1 // No frame ptr for PPC 742c48c7b0a453d32375a4df17e153011b797ef28csewardj#elif defined(VGA_ppc64) 752c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_INSTR_PTR guest_CIA 762c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_STACK_PTR guest_GPR1 772c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_FRAME_PTR guest_GPR1 // No frame ptr for PPC 78f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#else 79f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn# error Unknown arch 80f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#endif 81f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 827821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj 83f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn// Offsets for the Vex state 84af839f52d74df156d655201a889954133ab01be7njn#define VG_O_STACK_PTR (offsetof(VexGuestArchState, VG_STACK_PTR)) 85f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 867821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj 87e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj//------------------------------------------------------------- 88e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* Details about the capabilities of the underlying (host) CPU. These 89e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj details are acquired by (1) enquiring with the CPU at startup, or 90e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj (2) from the AT_SYSINFO entries the kernel gave us (ppc32 cache 91e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj line size). It's a bit nasty in the sense that there's no obvious 92e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj way to stop uses of some of this info before it's ready to go. 93e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 94e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj Current dependencies are: 95e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 96e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj x86: initially: call VG_(machine_get_hwcaps) 97e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 98e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj then safe to use VG_(machine_get_VexArchInfo) 99e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj and VG_(machine_x86_have_mxcsr) 100e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj ------------- 101e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj amd64: initially: call VG_(machine_get_hwcaps) 102e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 103e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj then safe to use VG_(machine_get_VexArchInfo) 104e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj ------------- 105e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj ppc32: initially: call VG_(machine_get_hwcaps) 106e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj call VG_(machine_ppc32_set_clszB) 107e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 108e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj then safe to use VG_(machine_get_VexArchInfo) 1092c36d4285afacafc10232e2f70978e0519216138sewardj and VG_(machine_ppc32_has_FP) 110e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj and VG_(machine_ppc32_has_VMX) 1112c48c7b0a453d32375a4df17e153011b797ef28csewardj ------------- 1122c48c7b0a453d32375a4df17e153011b797ef28csewardj ppc64: initially: call VG_(machine_get_hwcaps) 1132c48c7b0a453d32375a4df17e153011b797ef28csewardj call VG_(machine_ppc64_set_clszB) 1142c48c7b0a453d32375a4df17e153011b797ef28csewardj 1152c48c7b0a453d32375a4df17e153011b797ef28csewardj then safe to use VG_(machine_get_VexArchInfo) 1162c48c7b0a453d32375a4df17e153011b797ef28csewardj and VG_(machine_ppc64_has_VMX) 117e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 118e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj VG_(machine_get_hwcaps) may use signals (although it attempts to 119e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj leave signal state unchanged) and therefore should only be 120e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj called before m_main sets up the client's signal state. 121e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj*/ 122e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 123e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* Determine what insn set and insn set variant the host has, and 124e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj record it. To be called once at system startup. Returns False if 125e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj this a CPU incapable of running Valgrind. */ 126e2d1e670d412ff85c824ba5c043161816b9e26bdsewardjextern Bool VG_(machine_get_hwcaps)( void ); 12710f08cf5b84882eebbb6712a7be890577650e8adsewardj 128e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* Fetch host cpu info, as per above comment. */ 129e2d1e670d412ff85c824ba5c043161816b9e26bdsewardjextern void VG_(machine_get_VexArchInfo)( /*OUT*/VexArch*, 130e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj /*OUT*/VexArchInfo* ); 131e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 132e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* Notify host cpu cache line size, as per above comment. */ 133bc28f66763b196f4107a06d00e5dd17d594b9b94cerion#if defined(VGA_ppc32) 134e2d1e670d412ff85c824ba5c043161816b9e26bdsewardjextern void VG_(machine_ppc32_set_clszB)( Int ); 13510f08cf5b84882eebbb6712a7be890577650e8adsewardj#endif 13610f08cf5b84882eebbb6712a7be890577650e8adsewardj 1372c48c7b0a453d32375a4df17e153011b797ef28csewardj#if defined(VGA_ppc64) 1382c48c7b0a453d32375a4df17e153011b797ef28csewardjextern void VG_(machine_ppc64_set_clszB)( Int ); 1392c48c7b0a453d32375a4df17e153011b797ef28csewardj#endif 1402c48c7b0a453d32375a4df17e153011b797ef28csewardj 141e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* X86: set to 1 if the host is able to do {ld,st}mxcsr (load/store 142e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj the SSE control/status register), else zero. Is referenced from 143e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj assembly code, so do not change from a 32-bit int. */ 1447821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj#if defined(VGA_x86) 145e2d1e670d412ff85c824ba5c043161816b9e26bdsewardjextern UInt VG_(machine_x86_have_mxcsr); 146e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj#endif 147e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 148e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* PPC32: set to 1 if FP instructions are supported in user-space, 149e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj else 0. Is referenced from assembly code, so do not change from a 150e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 32-bit int. */ 151e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj#if defined(VGA_ppc32) 1522c36d4285afacafc10232e2f70978e0519216138sewardjextern UInt VG_(machine_ppc32_has_FP); 1537821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj#endif 1547821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj 155e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* PPC32: set to 1 if Altivec instructions are supported in 156e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj user-space, else 0. Is referenced from assembly code, so do not 157e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj change from a 32-bit int. */ 158e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj#if defined(VGA_ppc32) 159e2d1e670d412ff85c824ba5c043161816b9e26bdsewardjextern UInt VG_(machine_ppc32_has_VMX); 160e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj#endif 1617821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj 1622c48c7b0a453d32375a4df17e153011b797ef28csewardj/* PPC64: set to 1 if Altivec instructions are supported in 1632c48c7b0a453d32375a4df17e153011b797ef28csewardj user-space, else 0. Is referenced from assembly code, so do not 1642c48c7b0a453d32375a4df17e153011b797ef28csewardj change from a 64-bit int. */ 1652c48c7b0a453d32375a4df17e153011b797ef28csewardj#if defined(VGA_ppc64) 1662c48c7b0a453d32375a4df17e153011b797ef28csewardjextern ULong VG_(machine_ppc64_has_VMX); 1672c48c7b0a453d32375a4df17e153011b797ef28csewardj#endif 1682c48c7b0a453d32375a4df17e153011b797ef28csewardj 169f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#endif // __PUB_CORE_MACHINE_H 170f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 171f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn/*--------------------------------------------------------------------*/ 172f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn/*--- end ---*/ 173f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn/*--------------------------------------------------------------------*/ 174