• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*--------------------------------------------------------------------*/
3 /*--- Create initial process image on for the client               ---*/
4 /*---                                           pub_core_initimg.h ---*/
5 /*--------------------------------------------------------------------*/
6 
7 /*
8    This file is part of Valgrind, a dynamic binary instrumentation
9    framework.
10 
11    Copyright (C) 2006-2017 OpenWorks LLP
12       info@open-works.co.uk
13 
14    This program is free software; you can redistribute it and/or
15    modify it under the terms of the GNU General Public License as
16    published by the Free Software Foundation; either version 2 of the
17    License, or (at your option) any later version.
18 
19    This program is distributed in the hope that it will be useful, but
20    WITHOUT ANY WARRANTY; without even the implied warranty of
21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22    General Public License for more details.
23 
24    You should have received a copy of the GNU General Public License
25    along with this program; if not, write to the Free Software
26    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27    02111-1307, USA.
28 
29    The GNU General Public License is contained in the file COPYING.
30 */
31 
32 #ifndef __PUB_CORE_INITIMG_H
33 #define __PUB_CORE_INITIMG_H
34 
35 #include "pub_core_basics.h"      // Addr
36 #include "libvex.h"
37 
38 //--------------------------------------------------------------------
39 // PURPOSE: Map the client executable into memory, then set up its
40 // stack, environment and data section, ready for execution.  Quite a
41 // lot of work on Linux (ELF).
42 //--------------------------------------------------------------------
43 
44 /* These are OS-specific and defined below. */
45 typedef  struct _IICreateImageInfo    IICreateImageInfo;
46 typedef  struct _IIFinaliseImageInfo  IIFinaliseImageInfo;
47 
48 /* This is a two stage process.  The first stage, which is most of the
49    work, creates the initial image in memory to the extent possible.
50    To do this it takes a bundle of information in an IICreateImageInfo
51    structure, which is gathered in an OS-specific way at startup.
52    This returns an IIFinaliseImageInfo structure: */
53 extern
54 IIFinaliseImageInfo VG_(ii_create_image)( IICreateImageInfo,
55                                           const VexArchInfo* vex_archinfo );
56 
57 /* Just before starting the client, we may need to make final
58    adjustments to its initial image.  Also we need to set up the VEX
59    guest state for thread 1 (the root thread) and copy in essential
60    starting values.  This is handed the IIFinaliseImageInfo created by
61    VG_(ii_create_image). */
62 extern
63 void VG_(ii_finalise_image)( IIFinaliseImageInfo );
64 
65 /* Note that both IICreateImageInfo and IIFinaliseImageInfo are
66    OS-specific.  We now go on to give instantiations of them
67    for supported OSes. */
68 
69 /* ------------------------- Linux ------------------------- */
70 
71 #if defined(VGO_linux)
72 
73 struct _IICreateImageInfo {
74    /* ------ Mandatory fields ------ */
75    const HChar*  toolname;
76    Addr    sp_at_startup;
77    Addr    clstack_end; // Highest stack addressable byte
78    /* ------ Per-OS fields ------ */
79    HChar** argv;
80    HChar** envp;
81 };
82 
83 struct _IIFinaliseImageInfo {
84    /* ------ Mandatory fields ------ */
85    SizeT clstack_max_size;
86    Addr  initial_client_SP;
87    /* ------ Per-OS fields ------ */
88    Addr  initial_client_IP;
89    Addr  initial_client_TOC;
90    UInt* client_auxv;
91    /* ------ Arch-specific ELF loading state ------ */
92    struct vki_arch_elf_state arch_elf_state;
93 };
94 
95 /* ------------------------- Darwin ------------------------- */
96 
97 #elif defined(VGO_darwin)
98 
99 struct _IICreateImageInfo {
100    /* ------ Mandatory fields ------ */
101    const HChar*  toolname;
102    Addr    sp_at_startup;
103    Addr    clstack_end; // highest stack addressable byte
104    /* ------ Per-OS fields ------ */
105    HChar** argv;
106    HChar** envp;
107    Addr    entry;            /* &_start */
108    Addr    init_ip;          /* &__dyld_start, or copy of entry */
109    Addr    stack_start;      /* stack segment hot */
110    Addr    stack_end;        /* stack segment cold */
111    Addr    text;             /* executable's Mach header */
112    Bool    dynamic;          /* False iff executable is static */
113    HChar*  executable_path;  /* path passed to execve() */
114 };
115 
116 struct _IIFinaliseImageInfo {
117    /* ------ Mandatory fields ------ */
118    SizeT clstack_max_size;
119    Addr  initial_client_SP;
120    /* ------ Per-OS fields ------ */
121    Addr  initial_client_IP;
122 };
123 
124 /* ------------------------- Solaris ------------------------- */
125 
126 #elif defined(VGO_solaris)
127 
128 struct _IICreateImageInfo {
129    /* ------ Mandatory fields ------ */
130    const HChar* toolname;
131    Addr    sp_at_startup;
132    Addr    clstack_end; /* highest stack addressable byte */
133    /* ------ Per-OS fields ------ */
134    HChar** argv;
135    HChar** envp;
136 };
137 
138 struct _IIFinaliseImageInfo {
139    /* ------ Mandatory fields ------ */
140    SizeT clstack_max_size;
141    Addr  initial_client_SP;
142    /* ------ Per-OS fields ------ */
143    Addr  initial_client_IP;
144    Addr  initial_client_TOC;
145    UInt* client_auxv;
146    Addr  initial_client_TP; /* thread pointer */
147 };
148 
149 #else
150 #  error "Unknown OS"
151 #endif
152 
153 
154 #endif   // __PUB_CORE_INITIMG_H
155 
156 /*--------------------------------------------------------------------*/
157 /*--- end                                                          ---*/
158 /*--------------------------------------------------------------------*/
159