1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
/*--------------------------------------------------------------------*/
/*--- Create initial process image on for the client ---*/
/*--- pub_core_initimg.h ---*/
/*--------------------------------------------------------------------*/
/*
This file is part of Valgrind, a dynamic binary instrumentation
framework.
Copyright (C) 2006-2009 OpenWorks LLP
info@open-works.co.uk
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307, USA.
The GNU General Public License is contained in the file COPYING.
*/
#ifndef __PUB_CORE_INITIMG_H
#define __PUB_CORE_INITIMG_H
//--------------------------------------------------------------------
// PURPOSE: Map the client executable into memory, then set up its
// stack, environment and data section, ready for execution. Quite a
// lot of work on Linux (ELF) but nearly a no-op on AIX (XCOFF) since
// the AIX kernel does most of the work for us.
//--------------------------------------------------------------------
/* These are OS-specific and defined below. */
typedef struct _IICreateImageInfo IICreateImageInfo;
typedef struct _IIFinaliseImageInfo IIFinaliseImageInfo;
/* This is a two stage process. The first stage, which is most of the
work, creates the initial image in memory to the extent possible.
To do this it takes a bundle of information in an IICreateImageInfo
structure, which is gathered in an OS-specific way at startup.
This returns an IIFinaliseImageInfo structure: */
extern
IIFinaliseImageInfo VG_(ii_create_image)( IICreateImageInfo );
/* Just before starting the client, we may need to make final
adjustments to its initial image. Also we need to set up the VEX
guest state for thread 1 (the root thread) and copy in essential
starting values. This is handed the IIFinaliseImageInfo created by
VG_(ii_create_image). */
extern
void VG_(ii_finalise_image)( IIFinaliseImageInfo );
/* Note that both IICreateImageInfo and IIFinaliseImageInfo are
OS-specific. We now go on to give instantiations of them
for supported OSes. */
/* ------------------------- Linux ------------------------- */
#if defined(VGO_linux)
struct _IICreateImageInfo {
/* ------ Mandatory fields ------ */
HChar* toolname;
Addr sp_at_startup;
Addr clstack_top;
/* ------ Per-OS fields ------ */
HChar** argv;
HChar** envp;
};
struct _IIFinaliseImageInfo {
/* ------ Mandatory fields ------ */
SizeT clstack_max_size;
Addr initial_client_SP;
/* ------ Per-OS fields ------ */
Addr initial_client_IP;
Addr initial_client_TOC;
UInt* client_auxv;
};
/* ------------------------- AIX5 ------------------------- */
#elif defined(VGO_aix5)
/* First we need to define this auxiliary structure. */
typedef
struct {
/* NOTE: VG_(ppc32/64_aix5_do_preloads_then_start_client) has
these offsets hardwired in. Do not change them without
changing it too. */
/* system call numbers */
/* 0 */ UInt nr_load; /* is __NR___loadx for 32-bit,
__NR_kload for 64 */
/* 4 */ UInt nr_kwrite;
/* 8 */ UInt nr__exit;
/* offset/length of error message, if the preloads fail */
/* 12 */ UInt off_errmsg;
/* 16 */ UInt len_errmsg;
/* offsets from start of this struct to the the preload file
names */
/* 20 */ UInt off_preloadcorename;
/* 24 */ UInt off_preloadtoolname;
/* 28 */ UInt off_ld_preloadname;
/* Once the preloading is done, we'll need to restore the guest
state to what it needs to be at client startup. Here's the
relevant info. Are ULongs; for 32-bit the data is at the
lsb (high addressed) end. */
/* 32 */ ULong client_start;
/* 40 */ ULong r2;
/* 48 */ ULong r3;
/* 56 */ ULong r4;
/* 64 */ ULong r5;
/* 72 */ ULong r6;
/* 80 */ ULong r7;
/* 88 */ ULong r8;
/* 96 */ ULong r9;
/* 104 */ ULong r10;
/* If the loading fails, we'll want to call a diagnostic
function in C to figure out what happened. Here's it's
function descriptor. Note, this runs on the simd cpu
(a kludge, and will segfault in 64-bit mode). */
/* 112 */ void* p_diagnose_load_failure;
}
AIX5PreloadPage;
struct _IICreateImageInfo {
/* ------ Mandatory fields ------ */
HChar* toolname;
Addr sp_at_startup; /* Not used on AIX. */
Addr clstack_top; /* Not used on AIX. */
/* ------ Per-OS fields ------ */
/* Initial values for guest int registers (GPR0 .. GPR31, PC, CR,
LR, CTR, XER). Passed to us from the launcher. */
ULong* intregs37;
/* AIX5Bootblock*, really */
void* bootblock;
/* Adler32 checksum of uncompressed data of compressed page. */
UInt adler32_exp;
};
struct _IIFinaliseImageInfo {
/* ------ Mandatory fields ------ */
SizeT clstack_max_size;
/* Initial value for SP (which is merely a copy of r1's value,
intregs37[1]). */
Addr initial_client_SP;
/* ------ Per-OS fields ------ */
/* Pointer to the preload page. The preload page and this pointer
to it are set up by VG_(ii_create_image). */
AIX5PreloadPage* preloadpage;
/* Initial values for guest int registers (GPR0 .. GPR31, PC,
CR, LR, CTR, XER). Copied from the CII. */
ULong* intregs37;
/* Address of the page compressed by the launcher. */
Addr compressed_page;
/* Adler32 checksum of uncompressed data of said page. */
UInt adler32_exp;
};
/* ------------------------- Darwin ------------------------- */
#elif defined(VGO_darwin)
struct _IICreateImageInfo {
/* ------ Mandatory fields ------ */
HChar* toolname;
Addr sp_at_startup;
Addr clstack_top;
/* ------ Per-OS fields ------ */
HChar** argv;
HChar** envp;
Addr entry; /* &_start */
Addr init_ip; /* &__dyld_start, or copy of entry */
Addr stack_start; /* stack segment hot */
Addr stack_end; /* stack segment cold */
Addr text; /* executable's Mach header */
Bool dynamic; /* False iff executable is static */
HChar* executable_path; /* path passed to execve() */
};
struct _IIFinaliseImageInfo {
/* ------ Mandatory fields ------ */
SizeT clstack_max_size;
Addr initial_client_SP;
/* ------ Per-OS fields ------ */
Addr initial_client_IP;
};
#else
# error "Unknown OS"
#endif
#endif // __PUB_CORE_INITIMG_H
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/
|