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