18bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
28bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn/*--------------------------------------------------------------------*/
38bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn/*--- The translation table and cache.                             ---*/
48bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn/*---                                          pub_core_transtab.h ---*/
58bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn/*--------------------------------------------------------------------*/
68bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
78bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn/*
88bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   This file is part of Valgrind, a dynamic binary instrumentation
98bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   framework.
108bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
11ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Copyright (C) 2000-2017 Julian Seward
128bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn      jseward@acm.org
138bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
148bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   This program is free software; you can redistribute it and/or
158bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   modify it under the terms of the GNU General Public License as
168bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   published by the Free Software Foundation; either version 2 of the
178bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   License, or (at your option) any later version.
188bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
198bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   This program is distributed in the hope that it will be useful, but
208bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   WITHOUT ANY WARRANTY; without even the implied warranty of
218bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
228bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   General Public License for more details.
238bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
248bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   You should have received a copy of the GNU General Public License
258bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   along with this program; if not, write to the Free Software
268bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
278bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   02111-1307, USA.
288bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
298bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn   The GNU General Public License is contained in the file COPYING.
308bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn*/
318bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
328bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn#ifndef __PUB_CORE_TRANSTAB_H
338bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn#define __PUB_CORE_TRANSTAB_H
348bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
358bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn//--------------------------------------------------------------------
368bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn// PURPOSE: This module is responsible for caching translations, and
378bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn// enabling fast look-ups of them.
388bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn//--------------------------------------------------------------------
398bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
402e8f4efe5e30be3bb52cd8fbf37c107de41eb40dnjn#include "pub_core_transtab_asm.h"
415f1aeb620eb5a3aab662f8b949b031a77a0d14feflorian#include "pub_tool_transtab.h"
42de6ffbdebe204905c3bccc2f27f89b76313568e0florian#include "libvex.h"                   // VexGuestExtents
432e8f4efe5e30be3bb52cd8fbf37c107de41eb40dnjn
44291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* The fast-cache for tt-lookup.  Unused entries are denoted by .guest
45291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj   == 1, which is assumed to be a bogus address for all guest code. */
465f76de086a6d643db51e50a4e623df7dfc9b6161sewardjtypedef
475f76de086a6d643db51e50a4e623df7dfc9b6161sewardj   struct {
485f76de086a6d643db51e50a4e623df7dfc9b6161sewardj      Addr guest;
495f76de086a6d643db51e50a4e623df7dfc9b6161sewardj      Addr host;
505f76de086a6d643db51e50a4e623df7dfc9b6161sewardj   }
515f76de086a6d643db51e50a4e623df7dfc9b6161sewardj   FastCacheEntry;
525f76de086a6d643db51e50a4e623df7dfc9b6161sewardj
535f76de086a6d643db51e50a4e623df7dfc9b6161sewardjextern __attribute__((aligned(16)))
545f76de086a6d643db51e50a4e623df7dfc9b6161sewardj       FastCacheEntry VG_(tt_fast) [VG_TT_FAST_SIZE];
555f76de086a6d643db51e50a4e623df7dfc9b6161sewardj
565f76de086a6d643db51e50a4e623df7dfc9b6161sewardj#define TRANSTAB_BOGUS_GUEST_ADDR ((Addr)1)
575f76de086a6d643db51e50a4e623df7dfc9b6161sewardj
588e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe
59924c852b5883a7b42298dc8c7542116bd9a8a485philippe/* Initialises the TC, using VG_(clo_num_transtab_sectors)
60924c852b5883a7b42298dc8c7542116bd9a8a485philippe   and VG_(clo_avg_transtab_entry_size).
618e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe   VG_(clo_num_transtab_sectors) must be >= MIN_N_SECTORS
628e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe   and <= MAX_N_SECTORS. */
638bddf58af8cc7342d4bde6712c5a6a33bf2850d4njnextern void VG_(init_tt_tc)       ( void );
648bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
658e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe
668e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe/* Limits for number of sectors the TC is divided into.  If you need a larger
678e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe   overall translation cache, increase MAX_N_SECTORS. */
688e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe#define MIN_N_SECTORS 2
69ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes#define MAX_N_SECTORS 48
708e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe
71ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes/* Default for the nr of sectors, if not overridden by command line.
728e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe   On Android, space is limited, so try to get by with fewer sectors.
73ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   On other platforms we can go to town.  32 sectors gives theoretical
74ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   capacity of about 880MB of JITted code in 2.1 million translations
758e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe   (realistically, about 2/3 of that) for Memcheck. */
7626ed419d60369d0545510eba0832566e24452e1esewardj#if defined(VGPV_arm_linux_android) \
7726ed419d60369d0545510eba0832566e24452e1esewardj    || defined(VGPV_x86_linux_android) \
7826ed419d60369d0545510eba0832566e24452e1esewardj    || defined(VGPV_mips32_linux_android) \
7926ed419d60369d0545510eba0832566e24452e1esewardj    || defined(VGPV_arm64_linux_android)
80ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes# define N_SECTORS_DEFAULT 12
818e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe#else
82ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes# define N_SECTORS_DEFAULT 32
838e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe#endif
848e1bee406c191820bc3b22bf55cfa69ef5fdcd8bphilippe
858bddf58af8cc7342d4bde6712c5a6a33bf2850d4njnextern
86518850bf0da07ed3e2244e307268ae0fd80e93a8florianvoid VG_(add_to_transtab)( const VexGuestExtents* vge,
87ddd61ff058f02059064e083a8accaefed23d5548florian                           Addr             entry,
8844bd4465581ff28cef83bb39e684a489297d7b71florian                           Addr             code,
8926412bd2c4ef3e55683141f132ebd1eb32d8530bsewardj                           UInt             code_len,
90291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                           Bool             is_self_checking,
91291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                           Int              offs_profInc,
92597314210494248b4fbefd45525a748439629218sewardj                           UInt             n_guest_instrs );
938bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
94523b5b8ca67d2063afd02342d0138b0dc0ed6706philippetypedef UShort SECno; // SECno type identifies a sector
95523b5b8ca67d2063afd02342d0138b0dc0ed6706philippetypedef UShort TTEno; // TTEno type identifies a TT entry in a sector.
96523b5b8ca67d2063afd02342d0138b0dc0ed6706philippe
97523b5b8ca67d2063afd02342d0138b0dc0ed6706philippe// 2 constants that indicates Invalid entries.
98523b5b8ca67d2063afd02342d0138b0dc0ed6706philippe#define INV_SNO ((SECno)0xFFFF)
99523b5b8ca67d2063afd02342d0138b0dc0ed6706philippe#define INV_TTE ((TTEno)0xFFFF)
100523b5b8ca67d2063afd02342d0138b0dc0ed6706philippe
101291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjextern
102291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjvoid VG_(tt_tc_do_chaining) ( void* from__patch_addr,
103523b5b8ca67d2063afd02342d0138b0dc0ed6706philippe                              SECno to_sNo,
104523b5b8ca67d2063afd02342d0138b0dc0ed6706philippe                              TTEno to_tteNo,
105291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                              Bool  to_fastEP );
106291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
10744bd4465581ff28cef83bb39e684a489297d7b71florianextern Bool VG_(search_transtab) ( /*OUT*/Addr*  res_hcode,
108523b5b8ca67d2063afd02342d0138b0dc0ed6706philippe                                   /*OUT*/SECno* res_sNo,
109523b5b8ca67d2063afd02342d0138b0dc0ed6706philippe                                   /*OUT*/TTEno* res_tteNo,
110ddd61ff058f02059064e083a8accaefed23d5548florian                                   Addr          guest_addr,
1118bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn                                   Bool          upd_cache );
1128bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
113ddd61ff058f02059064e083a8accaefed23d5548florianextern void VG_(discard_translations) ( Addr  start, ULong range,
1141636d33c13958b9c0e7d3059cdd5005746418eb2florian                                        const HChar* who );
1158bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
1168bddf58af8cc7342d4bde6712c5a6a33bf2850d4njnextern void VG_(print_tt_tc_stats) ( void );
1178bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
1188bddf58af8cc7342d4bde6712c5a6a33bf2850d4njnextern UInt VG_(get_bbs_translated) ( void );
119ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughesextern UInt VG_(get_bbs_discarded_or_dumped) ( void );
1208bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
1210ec07f32bbbb209d749b9974408e6f025ad40b31sewardj/* Add to / search the auxiliary, small, unredirected translation
1220ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   table. */
1230ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
1240ec07f32bbbb209d749b9974408e6f025ad40b31sewardjextern
125518850bf0da07ed3e2244e307268ae0fd80e93a8florianvoid VG_(add_to_unredir_transtab)( const VexGuestExtents* vge,
126ddd61ff058f02059064e083a8accaefed23d5548florian                                   Addr             entry,
12744bd4465581ff28cef83bb39e684a489297d7b71florian                                   Addr             code,
1281dcee097db02f9ef3ba355162c4373d90d0e895cnjn                                   UInt             code_len );
1290ec07f32bbbb209d749b9974408e6f025ad40b31sewardjextern
13044bd4465581ff28cef83bb39e684a489297d7b71florianBool VG_(search_unredir_transtab) ( /*OUT*/Addr*  result,
131ddd61ff058f02059064e083a8accaefed23d5548florian                                    Addr          guest_addr );
1320ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
13317c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj// SB profiling stuff
1348bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
13517c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardjtypedef struct _SBProfEntry {
136ddd61ff058f02059064e083a8accaefed23d5548florian   Addr   addr;
1372025cf98a3210c175a90fc77cb599cca1643bd68njn   ULong  score;
13817c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj} SBProfEntry;
1392025cf98a3210c175a90fc77cb599cca1643bd68njn
14017c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardjextern ULong VG_(get_SB_profile) ( SBProfEntry tops[], UInt n_tops );
1418bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
1425f1aeb620eb5a3aab662f8b949b031a77a0d14feflorian//  Exported variables
1435f1aeb620eb5a3aab662f8b949b031a77a0d14feflorianextern Bool  VG_(ok_to_discard_translations);
1445f1aeb620eb5a3aab662f8b949b031a77a0d14feflorian
1458bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn#endif   // __PUB_CORE_TRANSTAB_H
1468bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn
1478bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn/*--------------------------------------------------------------------*/
1488bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn/*--- end                                                          ---*/
1498bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn/*--------------------------------------------------------------------*/
150