ftmemsim-valgrind/coregrind/pub_core_initimg.h
Nicholas Nethercote 07045477ca Merge the DARWIN branch onto the trunk.
I tried using 'svn merge' to do the merge but it did a terrible job and
there were bazillions of conflicts.  So instead I just took the diff between
the branch and trunk  at r10155, applied the diff to the trunk, 'svn add'ed
the added files (no files needed to be 'svn remove'd) and committed.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10156
2009-05-28 01:53:07 +00:00

212 lines
7.3 KiB
C

/*--------------------------------------------------------------------*/
/*--- 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 ---*/
/*--------------------------------------------------------------------*/