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-2013 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 };
92 
93 /* ------------------------- Darwin ------------------------- */
94 
95 #elif defined(VGO_darwin)
96 
97 struct _IICreateImageInfo {
98    /* ------ Mandatory fields ------ */
99    const HChar*  toolname;
100    Addr    sp_at_startup;
101    Addr    clstack_end; // highest stack addressable byte
102    /* ------ Per-OS fields ------ */
103    HChar** argv;
104    HChar** envp;
105    Addr    entry;            /* &_start */
106    Addr    init_ip;          /* &__dyld_start, or copy of entry */
107    Addr    stack_start;      /* stack segment hot */
108    Addr    stack_end;        /* stack segment cold */
109    Addr    text;             /* executable's Mach header */
110    Bool    dynamic;          /* False iff executable is static */
111    HChar*  executable_path;  /* path passed to execve() */
112 };
113 
114 struct _IIFinaliseImageInfo {
115    /* ------ Mandatory fields ------ */
116    SizeT clstack_max_size;
117    Addr  initial_client_SP;
118    /* ------ Per-OS fields ------ */
119    Addr  initial_client_IP;
120 };
121 
122 
123 #else
124 #  error "Unknown OS"
125 #endif
126 
127 
128 #endif   // __PUB_CORE_INITIMG_H
129 
130 /*--------------------------------------------------------------------*/
131 /*--- end                                                          ---*/
132 /*--------------------------------------------------------------------*/
133