blob: 7d8e32963e8959e5df073b5bdcf23d647a5f44a4 [file] [log] [blame]
/*--------------------------------------------------------------------*/
/*--- 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-2008 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;
};
#else
# error "Unknown OS"
#endif
#endif // __PUB_CORE_INITIMG_H
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/