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