14cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 24cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj/*--------------------------------------------------------------------*/ 34cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj/*--- Notional "implementation" for m_vki. ---*/ 44cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj/*--- m_vki.c ---*/ 54cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj/*--------------------------------------------------------------------*/ 64cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 74cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj/* 84cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj This file is part of Valgrind, a dynamic binary instrumentation 94cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj framework. 104cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 11ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes Copyright (C) 2006-2017 OpenWorks LLP 124cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj info@open-works.co.uk 134cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 144cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj This program is free software; you can redistribute it and/or 154cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj modify it under the terms of the GNU General Public License as 164cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj published by the Free Software Foundation; either version 2 of the 174cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj License, or (at your option) any later version. 184cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 194cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj This program is distributed in the hope that it will be useful, but 204cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj WITHOUT ANY WARRANTY; without even the implied warranty of 214cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 224cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj General Public License for more details. 234cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 244cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj You should have received a copy of the GNU General Public License 254cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj along with this program; if not, write to the Free Software 264cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 274cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 02111-1307, USA. 284cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 294cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj The GNU General Public License is contained in the file COPYING. 304cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj*/ 314cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 324cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj#include "pub_core_basics.h" 33cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#include "pub_core_libcassert.h" 344cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj#include "pub_core_vki.h" /* self */ 354cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 364cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj/* We have pub_{core,tool}_vki.h. This is the matching implementation 374cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj for that interface. In fact there is no implementation, as the 384cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj sole purpose of the module is to export types and constants 39e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj describing the kernel interface, so this file is nearly empty. */ 40e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj 41e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj 42a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes/* ppc32/64, arm64 and mips32/64 (linux) determine page size at startup, 43a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes hence m_vki is the logical place to store that info. */ 44e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj 45cae0cc22b83ffb260ee8379e92099c5a701944cbcarll#if defined(VGP_ppc32_linux) || defined(VGP_ppc64be_linux) \ 46a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes || defined(VGP_ppc64le_linux) || defined(VGP_arm64_linux) \ 47a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes || defined(VGP_mips32_linux) || defined(VGP_mips64_linux) 48e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardjunsigned long VKI_PAGE_SHIFT = 12; 49e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardjunsigned long VKI_PAGE_SIZE = 1UL << 12; 50e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj#endif 514cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 524cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj 53cda2f0fbda4c4b2644babc830244be8aed95de1dnjn/* Do initial consistency checks on some of the definitions to do with 54cda2f0fbda4c4b2644babc830244be8aed95de1dnjn signals (vki_sigset_t and vki_sigaction_{toK,fromK}_t). This stuff 55cda2f0fbda4c4b2644babc830244be8aed95de1dnjn is fragile enough that it's important to check at startup that 56cda2f0fbda4c4b2644babc830244be8aed95de1dnjn the world looks like what we expect it to look like. 57cda2f0fbda4c4b2644babc830244be8aed95de1dnjn 58cda2f0fbda4c4b2644babc830244be8aed95de1dnjn The most important thing is to check that the definition of signal 59cda2f0fbda4c4b2644babc830244be8aed95de1dnjn sets for this platform is right. A signal set consists of some 60cda2f0fbda4c4b2644babc830244be8aed95de1dnjn number _VKI_NSIG_WORDS of 32- or 64-bit words. Because the kernel 61cda2f0fbda4c4b2644babc830244be8aed95de1dnjn itself has some indexing scheme to set/clear individual bits in the 62cda2f0fbda4c4b2644babc830244be8aed95de1dnjn set, we must make sure we use the same layout/scheme: where this 63cda2f0fbda4c4b2644babc830244be8aed95de1dnjn requirement bites us is in the VG_(sigfillset) etc functions in 64cda2f0fbda4c4b2644babc830244be8aed95de1dnjn m_libcsignal.c. So we check carefully here that it's all sensible. 65cda2f0fbda4c4b2644babc830244be8aed95de1dnjn*/ 66cda2f0fbda4c4b2644babc830244be8aed95de1dnjnvoid VG_(vki_do_initial_consistency_checks) ( void ) 67cda2f0fbda4c4b2644babc830244be8aed95de1dnjn{ 68cda2f0fbda4c4b2644babc830244be8aed95de1dnjn /* --- Platform-independent checks on signal sets --- */ 69cda2f0fbda4c4b2644babc830244be8aed95de1dnjn 70cda2f0fbda4c4b2644babc830244be8aed95de1dnjn vki_sigset_t set; 71cda2f0fbda4c4b2644babc830244be8aed95de1dnjn // Set's size must agree with _VKI_NSIG 72cda2f0fbda4c4b2644babc830244be8aed95de1dnjn vg_assert( 8 * sizeof(set) == _VKI_NSIG ); 73cda2f0fbda4c4b2644babc830244be8aed95de1dnjn // Set's word size must agree with _VKI_NSIG_BPW 74cda2f0fbda4c4b2644babc830244be8aed95de1dnjn vg_assert( 8 * sizeof(set.sig[0]) == _VKI_NSIG_BPW ); 75cda2f0fbda4c4b2644babc830244be8aed95de1dnjn // The set elements are 32- or 64-bit 76cda2f0fbda4c4b2644babc830244be8aed95de1dnjn vg_assert( _VKI_NSIG_BPW == 32 || _VKI_NSIG_BPW == 64 ); 77cda2f0fbda4c4b2644babc830244be8aed95de1dnjn 78cda2f0fbda4c4b2644babc830244be8aed95de1dnjn /* --- Platform-specific checks on signal sets --- */ 79cda2f0fbda4c4b2644babc830244be8aed95de1dnjn 808eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# if defined(VGO_linux) || defined(VGO_solaris) 81cda2f0fbda4c4b2644babc830244be8aed95de1dnjn /* nothing to check */ 82f76d27a697a7b0bf3b84490baf60623fc96a23afnjn# elif defined(VGP_x86_darwin) || defined(VGP_amd64_darwin) 83f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(_VKI_NSIG == NSIG); 84f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(_VKI_NSIG == 32); 85f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(_VKI_NSIG_WORDS == 1); 86f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(sizeof(sigset_t) /* defined by Darwin */ 87f76d27a697a7b0bf3b84490baf60623fc96a23afnjn == sizeof(vki_sigset_t) /* what we actually use */); 88cda2f0fbda4c4b2644babc830244be8aed95de1dnjn# else 89cda2f0fbda4c4b2644babc830244be8aed95de1dnjn# error "Unknown plat" 90cda2f0fbda4c4b2644babc830244be8aed95de1dnjn# endif 91cda2f0fbda4c4b2644babc830244be8aed95de1dnjn 92cda2f0fbda4c4b2644babc830244be8aed95de1dnjn /* --- Platform-specific checks on sigactions --- */ 93cda2f0fbda4c4b2644babc830244be8aed95de1dnjn 946e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj# if defined(VGO_linux) 95cda2f0fbda4c4b2644babc830244be8aed95de1dnjn /* the toK- and fromK- forms are identical */ 96cda2f0fbda4c4b2644babc830244be8aed95de1dnjn vg_assert( sizeof(vki_sigaction_toK_t) 97cda2f0fbda4c4b2644babc830244be8aed95de1dnjn == sizeof(vki_sigaction_fromK_t) ); 98f76d27a697a7b0bf3b84490baf60623fc96a23afnjn# elif defined(VGO_darwin) 99f76d27a697a7b0bf3b84490baf60623fc96a23afnjn /* the toK- and fromK- forms differ by one function-pointer field 100f76d27a697a7b0bf3b84490baf60623fc96a23afnjn (sa_tramp) */ 101f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert( sizeof(vki_sigaction_toK_t) 102f76d27a697a7b0bf3b84490baf60623fc96a23afnjn == sizeof(vki_sigaction_fromK_t) + sizeof(void*) ); 103f76d27a697a7b0bf3b84490baf60623fc96a23afnjn 104f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(sizeof(struct sigaction) == sizeof(vki_sigaction_fromK_t)); 105f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(sizeof(struct __sigaction) == sizeof(vki_sigaction_toK_t)); 106f76d27a697a7b0bf3b84490baf60623fc96a23afnjn { struct __sigaction t1; 107f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vki_sigaction_toK_t t2; 108f76d27a697a7b0bf3b84490baf60623fc96a23afnjn struct sigaction f1; 109f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vki_sigaction_fromK_t f2; 110f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(sizeof(t1.sa_handler) == sizeof(t2.ksa_handler)); 111f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(sizeof(t1.sa_tramp) == sizeof(t2.sa_tramp)); 112f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(sizeof(t1.sa_mask) == sizeof(t2.sa_mask)); 113f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(sizeof(t1.sa_flags) == sizeof(t2.sa_flags)); 114f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(sizeof(f1.sa_handler) == sizeof(f2.ksa_handler)); 115f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(sizeof(f1.sa_mask) == sizeof(f2.sa_mask)); 116f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(sizeof(f1.sa_flags) == sizeof(f2.sa_flags)); 117f76d27a697a7b0bf3b84490baf60623fc96a23afnjn# if 0 118f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(offsetof(t1,sa_handler) == offsetof(t2.ksa_handler)); 119f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(offsetof(t1.sa_tramp) == offsetof(t2.sa_tramp)); 120f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(offsetof(t1.sa_mask) == offsetof(t2.sa_mask)); 121f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(offsetof(t1.sa_flags) == offsetof(t2.sa_flags)); 122f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(offsetof(f1.sa_handler) == offsetof(f2.ksa_handler)); 123f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(offsetof(f1.sa_mask) == offsetof(f2.sa_mask)); 124f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(offsetof(f1.sa_flags) == offsetof(f2.sa_flags)); 125f76d27a697a7b0bf3b84490baf60623fc96a23afnjn# endif 126f76d27a697a7b0bf3b84490baf60623fc96a23afnjn } 127f76d27a697a7b0bf3b84490baf60623fc96a23afnjn /* also .. */ 128f76d27a697a7b0bf3b84490baf60623fc96a23afnjn /* VKI_SET_SIGMASK is hardwired into syscall-x86-darwin.S and 129f76d27a697a7b0bf3b84490baf60623fc96a23afnjn syscall-amd64-darwin.S */ 130f76d27a697a7b0bf3b84490baf60623fc96a23afnjn vg_assert(VKI_SIG_SETMASK == 3); 131cda2f0fbda4c4b2644babc830244be8aed95de1dnjn 1328eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# elif defined(VGO_solaris) 1338eb8bab992e3998c33770b0cdb16059a8b918a06sewardj /* the toK- and fromK- forms are identical */ 1348eb8bab992e3998c33770b0cdb16059a8b918a06sewardj vg_assert(sizeof(vki_sigaction_toK_t) 1358eb8bab992e3998c33770b0cdb16059a8b918a06sewardj == sizeof(vki_sigaction_fromK_t)); 1368eb8bab992e3998c33770b0cdb16059a8b918a06sewardj /* VKI_SET_SIGMASK is hardwired into syscall-x86-solaris.S 1378eb8bab992e3998c33770b0cdb16059a8b918a06sewardj and syscall-amd64-solaris.S */ 1388eb8bab992e3998c33770b0cdb16059a8b918a06sewardj vg_assert(VKI_SIG_SETMASK == 3); 1398eb8bab992e3998c33770b0cdb16059a8b918a06sewardj 140cda2f0fbda4c4b2644babc830244be8aed95de1dnjn# else 141cda2f0fbda4c4b2644babc830244be8aed95de1dnjn# error "Unknown OS" 142cda2f0fbda4c4b2644babc830244be8aed95de1dnjn# endif 143cda2f0fbda4c4b2644babc830244be8aed95de1dnjn} 144cda2f0fbda4c4b2644babc830244be8aed95de1dnjn 145cda2f0fbda4c4b2644babc830244be8aed95de1dnjn 1464cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj/*--------------------------------------------------------------------*/ 1474cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj/*--- end m_vki.c ---*/ 1484cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj/*--------------------------------------------------------------------*/ 149