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 10b3a1e4bffbdbbf38304f216af405009868f43628sewardj Copyright (C) 2000-2015 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" 41535fb1b49a80f2e880f755ee618381de3e222ddfflorian#include "pub_core_basics.h" // UnwindStartRegs 42f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 43265aae7509903e05e907ff0ea4eb2da9446b9763njn// XXX: this is *really* the wrong spot for these things 448eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#if defined(VGP_x86_linux) || defined(VGP_x86_solaris) 456e340c7a2c09971ac5ead854c40bbc0491b67636sewardj# define VG_ELF_DATA2XXX ELFDATA2LSB 46af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_MACHINE EM_386 47af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_CLASS ELFCLASS32 48f1c91e04aa395a74092e26da815dbde4d769ee0asewardj# undef VG_PLAT_USES_PPCTOC 498eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGP_amd64_linux) || defined(VGP_amd64_solaris) 506e340c7a2c09971ac5ead854c40bbc0491b67636sewardj# define VG_ELF_DATA2XXX ELFDATA2LSB 51af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_MACHINE EM_X86_64 52af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_CLASS ELFCLASS64 53f1c91e04aa395a74092e26da815dbde4d769ee0asewardj# undef VG_PLAT_USES_PPCTOC 54f1c91e04aa395a74092e26da815dbde4d769ee0asewardj#elif defined(VGP_ppc32_linux) 556e340c7a2c09971ac5ead854c40bbc0491b67636sewardj# define VG_ELF_DATA2XXX ELFDATA2MSB 56af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_MACHINE EM_PPC 57af839f52d74df156d655201a889954133ab01be7njn# define VG_ELF_CLASS ELFCLASS32 58f1c91e04aa395a74092e26da815dbde4d769ee0asewardj# undef VG_PLAT_USES_PPCTOC 59cae0cc22b83ffb260ee8379e92099c5a701944cbcarll#elif defined(VGP_ppc64be_linux) 602c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_ELF_DATA2XXX ELFDATA2MSB 612c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_ELF_MACHINE EM_PPC64 622c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_ELF_CLASS ELFCLASS64 63f1c91e04aa395a74092e26da815dbde4d769ee0asewardj# define VG_PLAT_USES_PPCTOC 1 64582d58245637ab05272d89fb94b12fd0f18fa0f8carll#elif defined(VGP_ppc64le_linux) 65582d58245637ab05272d89fb94b12fd0f18fa0f8carll# define VG_ELF_DATA2XXX ELFDATA2LSB 66582d58245637ab05272d89fb94b12fd0f18fa0f8carll# define VG_ELF_MACHINE EM_PPC64 67582d58245637ab05272d89fb94b12fd0f18fa0f8carll# define VG_ELF_CLASS ELFCLASS64 68582d58245637ab05272d89fb94b12fd0f18fa0f8carll# undef VG_PLAT_USES_PPCTOC 6959570ffbe31930ab4d678754daaeec0715117a3dsewardj#elif defined(VGP_arm_linux) 7059570ffbe31930ab4d678754daaeec0715117a3dsewardj# define VG_ELF_DATA2XXX ELFDATA2LSB 7159570ffbe31930ab4d678754daaeec0715117a3dsewardj# define VG_ELF_MACHINE EM_ARM 7259570ffbe31930ab4d678754daaeec0715117a3dsewardj# define VG_ELF_CLASS ELFCLASS32 7359570ffbe31930ab4d678754daaeec0715117a3dsewardj# undef VG_PLAT_USES_PPCTOC 74f0c1250e324f6684757c6a15545366447ef1d64fsewardj#elif defined(VGP_arm64_linux) 75f0c1250e324f6684757c6a15545366447ef1d64fsewardj# define VG_ELF_DATA2XXX ELFDATA2LSB 76f0c1250e324f6684757c6a15545366447ef1d64fsewardj# define VG_ELF_MACHINE EM_AARCH64 77f0c1250e324f6684757c6a15545366447ef1d64fsewardj# define VG_ELF_CLASS ELFCLASS64 78f0c1250e324f6684757c6a15545366447ef1d64fsewardj# undef VG_PLAT_USES_PPCTOC 79f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#elif defined(VGO_darwin) 80f76d27a697a7b0bf3b84490baf60623fc96a23afnjn# undef VG_ELF_DATA2XXX 81f76d27a697a7b0bf3b84490baf60623fc96a23afnjn# undef VG_ELF_MACHINE 82f76d27a697a7b0bf3b84490baf60623fc96a23afnjn# undef VG_ELF_CLASS 83f76d27a697a7b0bf3b84490baf60623fc96a23afnjn# undef VG_PLAT_USES_PPCTOC 84b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#elif defined(VGP_s390x_linux) 85b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj# define VG_ELF_DATA2XXX ELFDATA2MSB 86b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj# define VG_ELF_MACHINE EM_S390 87b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj# define VG_ELF_CLASS ELFCLASS64 88b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj# undef VG_PLAT_USES_PPCTOC 895db15403e889d4db339b342bc2a824ef0bfaa654sewardj#elif defined(VGP_mips32_linux) 905db15403e889d4db339b342bc2a824ef0bfaa654sewardj# if defined (VG_LITTLEENDIAN) 915db15403e889d4db339b342bc2a824ef0bfaa654sewardj# define VG_ELF_DATA2XXX ELFDATA2LSB 925db15403e889d4db339b342bc2a824ef0bfaa654sewardj# elif defined (VG_BIGENDIAN) 935db15403e889d4db339b342bc2a824ef0bfaa654sewardj# define VG_ELF_DATA2XXX ELFDATA2MSB 945db15403e889d4db339b342bc2a824ef0bfaa654sewardj# else 955db15403e889d4db339b342bc2a824ef0bfaa654sewardj# error "Unknown endianness" 965db15403e889d4db339b342bc2a824ef0bfaa654sewardj# endif 975db15403e889d4db339b342bc2a824ef0bfaa654sewardj# define VG_ELF_MACHINE EM_MIPS 985db15403e889d4db339b342bc2a824ef0bfaa654sewardj# define VG_ELF_CLASS ELFCLASS32 995db15403e889d4db339b342bc2a824ef0bfaa654sewardj# undef VG_PLAT_USES_PPCTOC 1004df0bfc0614379192c780c944415dc420d9cfe8epetarj#elif defined(VGP_mips64_linux) 1014df0bfc0614379192c780c944415dc420d9cfe8epetarj# if defined (VG_LITTLEENDIAN) 1024df0bfc0614379192c780c944415dc420d9cfe8epetarj# define VG_ELF_DATA2XXX ELFDATA2LSB 1034df0bfc0614379192c780c944415dc420d9cfe8epetarj# elif defined (VG_BIGENDIAN) 1044df0bfc0614379192c780c944415dc420d9cfe8epetarj# define VG_ELF_DATA2XXX ELFDATA2MSB 1054df0bfc0614379192c780c944415dc420d9cfe8epetarj# else 1064df0bfc0614379192c780c944415dc420d9cfe8epetarj# error "Unknown endianness" 1074df0bfc0614379192c780c944415dc420d9cfe8epetarj# endif 1084df0bfc0614379192c780c944415dc420d9cfe8epetarj# define VG_ELF_MACHINE EM_MIPS 1094df0bfc0614379192c780c944415dc420d9cfe8epetarj# define VG_ELF_CLASS ELFCLASS64 1104df0bfc0614379192c780c944415dc420d9cfe8epetarj# undef VG_PLAT_USES_PPCTOC 111112711afefcfcd43680c7c4aa8d38ef180e8811esewardj#elif defined(VGP_tilegx_linux) 112112711afefcfcd43680c7c4aa8d38ef180e8811esewardj# define VG_ELF_DATA2XXX ELFDATA2LSB 113112711afefcfcd43680c7c4aa8d38ef180e8811esewardj #ifndef EM_TILEGX 114112711afefcfcd43680c7c4aa8d38ef180e8811esewardj #define EM_TILEGX 191 115112711afefcfcd43680c7c4aa8d38ef180e8811esewardj #endif 116112711afefcfcd43680c7c4aa8d38ef180e8811esewardj# define VG_ELF_MACHINE EM_TILEGX 117112711afefcfcd43680c7c4aa8d38ef180e8811esewardj# define VG_ELF_CLASS ELFCLASS64 118112711afefcfcd43680c7c4aa8d38ef180e8811esewardj# undef VG_PLAT_USES_PPCTOC 119f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#else 120f1c91e04aa395a74092e26da815dbde4d769ee0asewardj# error Unknown platform 121f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#endif 122f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 123f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#if defined(VGA_x86) 124af839f52d74df156d655201a889954133ab01be7njn# define VG_INSTR_PTR guest_EIP 125af839f52d74df156d655201a889954133ab01be7njn# define VG_STACK_PTR guest_ESP 126af839f52d74df156d655201a889954133ab01be7njn# define VG_FRAME_PTR guest_EBP 127f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#elif defined(VGA_amd64) 128af839f52d74df156d655201a889954133ab01be7njn# define VG_INSTR_PTR guest_RIP 129af839f52d74df156d655201a889954133ab01be7njn# define VG_STACK_PTR guest_RSP 130af839f52d74df156d655201a889954133ab01be7njn# define VG_FRAME_PTR guest_RBP 13185665ca6fa29dd64754dabe50eb98f25896e752acerion#elif defined(VGA_ppc32) 132af839f52d74df156d655201a889954133ab01be7njn# define VG_INSTR_PTR guest_CIA 133af839f52d74df156d655201a889954133ab01be7njn# define VG_STACK_PTR guest_GPR1 134af839f52d74df156d655201a889954133ab01be7njn# define VG_FRAME_PTR guest_GPR1 // No frame ptr for PPC 135cae0cc22b83ffb260ee8379e92099c5a701944cbcarll#elif defined(VGA_ppc64be) || defined(VGA_ppc64le) 1362c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_INSTR_PTR guest_CIA 1372c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_STACK_PTR guest_GPR1 1382c48c7b0a453d32375a4df17e153011b797ef28csewardj# define VG_FRAME_PTR guest_GPR1 // No frame ptr for PPC 13959570ffbe31930ab4d678754daaeec0715117a3dsewardj#elif defined(VGA_arm) 1401dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj# define VG_INSTR_PTR guest_R15T 14159570ffbe31930ab4d678754daaeec0715117a3dsewardj# define VG_STACK_PTR guest_R13 14259570ffbe31930ab4d678754daaeec0715117a3dsewardj# define VG_FRAME_PTR guest_R11 143f0c1250e324f6684757c6a15545366447ef1d64fsewardj#elif defined(VGA_arm64) 144f0c1250e324f6684757c6a15545366447ef1d64fsewardj# define VG_INSTR_PTR guest_PC 1450345188cc1524a809b8d7fe8785e1da098d9cbe4sewardj# define VG_STACK_PTR guest_XSP 1460345188cc1524a809b8d7fe8785e1da098d9cbe4sewardj# define VG_FRAME_PTR guest_X29 // FIXME: is this right? 147b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#elif defined(VGA_s390x) 148b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj# define VG_INSTR_PTR guest_IA 149b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj# define VG_STACK_PTR guest_SP 150b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj# define VG_FRAME_PTR guest_FP 151ccb843b2ba2c176708bfa1764ca8e4db31722e90florian# define VG_FPC_REG guest_fpc 1525db15403e889d4db339b342bc2a824ef0bfaa654sewardj#elif defined(VGA_mips32) 1535db15403e889d4db339b342bc2a824ef0bfaa654sewardj# define VG_INSTR_PTR guest_PC 1545db15403e889d4db339b342bc2a824ef0bfaa654sewardj# define VG_STACK_PTR guest_r29 1555db15403e889d4db339b342bc2a824ef0bfaa654sewardj# define VG_FRAME_PTR guest_r30 1564df0bfc0614379192c780c944415dc420d9cfe8epetarj#elif defined(VGA_mips64) 1574df0bfc0614379192c780c944415dc420d9cfe8epetarj# define VG_INSTR_PTR guest_PC 1584df0bfc0614379192c780c944415dc420d9cfe8epetarj# define VG_STACK_PTR guest_r29 1594df0bfc0614379192c780c944415dc420d9cfe8epetarj# define VG_FRAME_PTR guest_r30 160112711afefcfcd43680c7c4aa8d38ef180e8811esewardj#elif defined(VGA_tilegx) 161112711afefcfcd43680c7c4aa8d38ef180e8811esewardj# define VG_INSTR_PTR guest_pc 162112711afefcfcd43680c7c4aa8d38ef180e8811esewardj# define VG_STACK_PTR guest_r54 163112711afefcfcd43680c7c4aa8d38ef180e8811esewardj# define VG_FRAME_PTR guest_r52 164f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#else 165f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn# error Unknown arch 166f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#endif 167f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 1687821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj 169f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn// Offsets for the Vex state 170af839f52d74df156d655201a889954133ab01be7njn#define VG_O_STACK_PTR (offsetof(VexGuestArchState, VG_STACK_PTR)) 171cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#define VG_O_INSTR_PTR (offsetof(VexGuestArchState, VG_INSTR_PTR)) 1728eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#define VG_O_FRAME_PTR (offsetof(VexGuestArchState, VG_FRAME_PTR)) 173ccb843b2ba2c176708bfa1764ca8e4db31722e90florian#define VG_O_FPC_REG (offsetof(VexGuestArchState, VG_FPC_REG)) 174f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 1757821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj 176e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj//------------------------------------------------------------- 1771dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj// Guest state accessors that are not visible to tools. The only 1781dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj// ones that are visible are get_IP and get_SP. 1791dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj 1801dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj//Addr VG_(get_IP) ( ThreadId tid ); // in pub_tool_machine.h 1811dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj//Addr VG_(get_SP) ( ThreadId tid ); // in pub_tool_machine.h 1821dbd3376656236debf5d35a9b5d8a507a6c307f0sewardjAddr VG_(get_FP) ( ThreadId tid ); 1831dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj 1841dbd3376656236debf5d35a9b5d8a507a6c307f0sewardjvoid VG_(set_IP) ( ThreadId tid, Addr encip ); 1851dbd3376656236debf5d35a9b5d8a507a6c307f0sewardjvoid VG_(set_SP) ( ThreadId tid, Addr sp ); 1861dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj 1871dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj 1881dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj//------------------------------------------------------------- 18959570ffbe31930ab4d678754daaeec0715117a3dsewardj// Get hold of the values needed for a stack unwind, for the specified 19059570ffbe31930ab4d678754daaeec0715117a3dsewardj// (client) thread. 19159570ffbe31930ab4d678754daaeec0715117a3dsewardjvoid VG_(get_UnwindStartRegs) ( /*OUT*/UnwindStartRegs* regs, 19259570ffbe31930ab4d678754daaeec0715117a3dsewardj ThreadId tid ); 19359570ffbe31930ab4d678754daaeec0715117a3dsewardj 19459570ffbe31930ab4d678754daaeec0715117a3dsewardj 19559570ffbe31930ab4d678754daaeec0715117a3dsewardj//------------------------------------------------------------- 196e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* Details about the capabilities of the underlying (host) CPU. These 197e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj details are acquired by (1) enquiring with the CPU at startup, or 1981f0d814045aba94e01e62e04e968ca8b970b3d44cerion (2) from the AT_SYSINFO entries the kernel gave us (ppc cache 199e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj line size). It's a bit nasty in the sense that there's no obvious 200e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj way to stop uses of some of this info before it's ready to go. 201e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 202e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj Current dependencies are: 203e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 204e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj x86: initially: call VG_(machine_get_hwcaps) 205e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 206e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj then safe to use VG_(machine_get_VexArchInfo) 207e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj and VG_(machine_x86_have_mxcsr) 208e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj ------------- 209e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj amd64: initially: call VG_(machine_get_hwcaps) 210e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 211e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj then safe to use VG_(machine_get_VexArchInfo) 212e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj ------------- 213e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj ppc32: initially: call VG_(machine_get_hwcaps) 214e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj call VG_(machine_ppc32_set_clszB) 215e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 216e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj then safe to use VG_(machine_get_VexArchInfo) 2172c36d4285afacafc10232e2f70978e0519216138sewardj and VG_(machine_ppc32_has_FP) 218e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj and VG_(machine_ppc32_has_VMX) 2192c48c7b0a453d32375a4df17e153011b797ef28csewardj ------------- 2202c48c7b0a453d32375a4df17e153011b797ef28csewardj ppc64: initially: call VG_(machine_get_hwcaps) 2212c48c7b0a453d32375a4df17e153011b797ef28csewardj call VG_(machine_ppc64_set_clszB) 2222c48c7b0a453d32375a4df17e153011b797ef28csewardj 2232c48c7b0a453d32375a4df17e153011b797ef28csewardj then safe to use VG_(machine_get_VexArchInfo) 2242c48c7b0a453d32375a4df17e153011b797ef28csewardj and VG_(machine_ppc64_has_VMX) 225a3551be497f6c4afc5dfbbbcd7c7a955a68fb22bsewardj ------------- 226a3551be497f6c4afc5dfbbbcd7c7a955a68fb22bsewardj arm: initially: call VG_(machine_get_hwcaps) 227a3551be497f6c4afc5dfbbbcd7c7a955a68fb22bsewardj call VG_(machine_arm_set_has_NEON) 228a3551be497f6c4afc5dfbbbcd7c7a955a68fb22bsewardj 229a3551be497f6c4afc5dfbbbcd7c7a955a68fb22bsewardj then safe to use VG_(machine_get_VexArchInfo) 2300daa4e31a3407ce0b0db8a90be8dd14bd8eccb35florian ------------- 2310daa4e31a3407ce0b0db8a90be8dd14bd8eccb35florian s390x: initially: call VG_(machine_get_hwcaps) 2320daa4e31a3407ce0b0db8a90be8dd14bd8eccb35florian 2330daa4e31a3407ce0b0db8a90be8dd14bd8eccb35florian then safe to use VG_(machine_get_VexArchInfo) 234e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 235e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj VG_(machine_get_hwcaps) may use signals (although it attempts to 236e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj leave signal state unchanged) and therefore should only be 237e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj called before m_main sets up the client's signal state. 238e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj*/ 239e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 240e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* Determine what insn set and insn set variant the host has, and 241e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj record it. To be called once at system startup. Returns False if 242e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj this a CPU incapable of running Valgrind. */ 243e2d1e670d412ff85c824ba5c043161816b9e26bdsewardjextern Bool VG_(machine_get_hwcaps)( void ); 24410f08cf5b84882eebbb6712a7be890577650e8adsewardj 2457862701c0e3f556e4a0c7ec4074a40526c73a4efflorian/* Determine information about the cache system this host has and 2467862701c0e3f556e4a0c7ec4074a40526c73a4efflorian record it. Returns False, if cache information cannot be auto-detected. */ 2477862701c0e3f556e4a0c7ec4074a40526c73a4efflorianextern Bool VG_(machine_get_cache_info)( VexArchInfo * ); 248e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 249e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* Notify host cpu cache line size, as per above comment. */ 250bc28f66763b196f4107a06d00e5dd17d594b9b94cerion#if defined(VGA_ppc32) 251e2d1e670d412ff85c824ba5c043161816b9e26bdsewardjextern void VG_(machine_ppc32_set_clszB)( Int ); 25210f08cf5b84882eebbb6712a7be890577650e8adsewardj#endif 25310f08cf5b84882eebbb6712a7be890577650e8adsewardj 254cae0cc22b83ffb260ee8379e92099c5a701944cbcarll#if defined(VGA_ppc64be) || defined(VGA_ppc64le) 2552c48c7b0a453d32375a4df17e153011b797ef28csewardjextern void VG_(machine_ppc64_set_clszB)( Int ); 2562c48c7b0a453d32375a4df17e153011b797ef28csewardj#endif 2572c48c7b0a453d32375a4df17e153011b797ef28csewardj 258a3551be497f6c4afc5dfbbbcd7c7a955a68fb22bsewardj#if defined(VGA_arm) 259a3551be497f6c4afc5dfbbbcd7c7a955a68fb22bsewardjextern void VG_(machine_arm_set_has_NEON)( Bool ); 260a3551be497f6c4afc5dfbbbcd7c7a955a68fb22bsewardj#endif 261a3551be497f6c4afc5dfbbbcd7c7a955a68fb22bsewardj 262e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* X86: set to 1 if the host is able to do {ld,st}mxcsr (load/store 263e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj the SSE control/status register), else zero. Is referenced from 264e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj assembly code, so do not change from a 32-bit int. */ 2657821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj#if defined(VGA_x86) 266e2d1e670d412ff85c824ba5c043161816b9e26bdsewardjextern UInt VG_(machine_x86_have_mxcsr); 267e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj#endif 268e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 269e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* PPC32: set to 1 if FP instructions are supported in user-space, 270e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj else 0. Is referenced from assembly code, so do not change from a 271e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj 32-bit int. */ 272e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj#if defined(VGA_ppc32) 2732c36d4285afacafc10232e2f70978e0519216138sewardjextern UInt VG_(machine_ppc32_has_FP); 2747821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj#endif 2757821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj 276e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj/* PPC32: set to 1 if Altivec instructions are supported in 277e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj user-space, else 0. Is referenced from assembly code, so do not 278e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj change from a 32-bit int. */ 279e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj#if defined(VGA_ppc32) 280e2d1e670d412ff85c824ba5c043161816b9e26bdsewardjextern UInt VG_(machine_ppc32_has_VMX); 281e2d1e670d412ff85c824ba5c043161816b9e26bdsewardj#endif 2827821e2ed55ac6c2303eb51a06bafd5baada2423dsewardj 2832c48c7b0a453d32375a4df17e153011b797ef28csewardj/* PPC64: set to 1 if Altivec instructions are supported in 2842c48c7b0a453d32375a4df17e153011b797ef28csewardj user-space, else 0. Is referenced from assembly code, so do not 2852c48c7b0a453d32375a4df17e153011b797ef28csewardj change from a 64-bit int. */ 286cae0cc22b83ffb260ee8379e92099c5a701944cbcarll#if defined(VGA_ppc64be) || defined(VGA_ppc64le) 2872c48c7b0a453d32375a4df17e153011b797ef28csewardjextern ULong VG_(machine_ppc64_has_VMX); 2882c48c7b0a453d32375a4df17e153011b797ef28csewardj#endif 2892c48c7b0a453d32375a4df17e153011b797ef28csewardj 2901dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj#if defined(VGA_arm) 2911dbd3376656236debf5d35a9b5d8a507a6c307f0sewardjextern Int VG_(machine_arm_archlevel); 2921dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj#endif 2931dbd3376656236debf5d35a9b5d8a507a6c307f0sewardj 294f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn#endif // __PUB_CORE_MACHINE_H 295f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn 296f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn/*--------------------------------------------------------------------*/ 297f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn/*--- end ---*/ 298f536bbbd4bf2024926574c5ed99b3e6251c6ff44njn/*--------------------------------------------------------------------*/ 299