Files
ftmemsim-valgrind/coregrind/arm/core_arch.h
Nicholas Nethercote 10b4595add Added beginnings of an AMD64 port, so lots of new files and directories.
It compiles, but aborts immediately if you try to run it.

I didn't include ldt.c;  I'm not sure how the LDT is used on AMD64.  It can be
added later if necessary.

While doing this, did some 64-bit cleanness fixes:
- Added necessary intermediate casts to ULong to avoid warnings when converting
  ThreadId to void* and vice versa, in vg_scheduler.c.
- Fixed VALGRIND_NON_SIMD_CALL[0123] to use 'long' as the return type.
- Fixed VALGRIND_PRINTF{,BACKTRACE} to use unsigned longs instead of unsigned
  ints, as needed.
- Converted some offsets in vg_symtab2.h from "Int" to "OffT".
- Made strlen, strncat, etc, use SizeT instead of 'unsigned int' for the length
  parameter.
- Couple of other minor things.

I had to insert some "#ifdef __amd64__" and "#ifndef __amd64__" guards in
places.  In particular, in vg_mylibc.c, some of our syscall wrappers aren't
appropriate for AMD64 because the syscall numbering is a bit different in
places.  This difference will have to be abstracted out somehow.

Also rewrote the sys_fcntl and sys_fcntl64 wrappers, as required for AMD64.

Also moved the ipc wrapper into x86, since it's not applicable for
AMD64.  However, it is applicable (I think) for ARM, so it would be nice
to work out a way to share syscall wrappers between some, but not all,
archs.  Hmm.  Also now using the real IPC constants rather than magic
numbers in the wrapper.

Other non-AMD64-related fixes:
- ARM: fixed syscall table by accounting for the fact that syscall
  numbers don't start at 0, but rather at 0x900000.
- Converted a few places to use ThreadId instead of 'int' or 'Int' for
  thread IDs.
- Added both AMD64 and ARM (which I'd forgotten) entries to valgrind.spec.in.
- Tweaked comments in various places.




git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3136
2004-11-29 13:54:10 +00:00

129 lines
4.1 KiB
C

/*--------------------------------------------------------------------*/
/*--- Arch-specific stuff for the core. arm/core_arch.h ---*/
/*--------------------------------------------------------------------*/
/*
This file is part of Valgrind, an extensible x86 protected-mode
emulator for monitoring program execution on x86-Unixes.
Copyright (C) 2000-2004 Nicholas Nethercote
njn25@cam.ac.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 __ARM_CORE_ARCH_H
#define __ARM_CORE_ARCH_H
#include "core_arch_asm.h" // arch-specific asm stuff
#include "tool_arch.h" // arch-specific tool stuff
#include "libvex_guest_arm.h"
/* ---------------------------------------------------------------------
Interesting registers
------------------------------------------------------------------ */
// Vex field names
// XXX: Not sure, but I think:
// r11 = frame pointer
// r12 = "implicit parameter" (neither caller-save, nor callee-save)
// r13 = stack pointer
// r14 = link register
// r15 = program counter
#define ARCH_INSTR_PTR guest_R15
#define ARCH_STACK_PTR guest_R13
#define ARCH_FRAME_PTR guest_R11
#define ARCH_CLREQ_ARGS guest_R0
#define ARCH_CLREQ_RET guest_R0
#define ARCH_PTHREQ_RET guest_R0
// Register numbers, for vg_symtab2.c
#define R_STACK_PTR 13
#define R_FRAME_PTR 11
// Stack frame layout and linkage
// XXX ToDo: ???
#define FIRST_STACK_FRAME(ebp) (ebp)
#define STACK_FRAME_RET(ebp) (((UInt*)ebp)[1])
#define STACK_FRAME_NEXT(ebp) (((UInt*)ebp)[0])
// Get stack pointer and frame pointer
#define ARCH_GET_REAL_STACK_PTR(esp) do { \
I_die_here; \
} while (0)
#define ARCH_GET_REAL_FRAME_PTR(ebp) do { \
I_die_here; \
} while (0)
/* ---------------------------------------------------------------------
Elf stuff
------------------------------------------------------------------ */
#define VG_ELF_ENDIANNESS ELFDATA2LSB
#define VG_ELF_MACHINE EM_ARM
#define VG_ELF_CLASS ELFCLASS32
/* ---------------------------------------------------------------------
Architecture-specific part of a ThreadState
------------------------------------------------------------------ */
// Architecture-specific part of a ThreadState
// XXX: eventually this should be made abstract, ie. the fields not visible
// to the core... ??
typedef struct {
/* Saved machine context. */
VexGuestARMState vex;
/* Saved shadow context. */
VexGuestARMState vex_shadow;
/* Spill area. */
UChar vex_spill[LibVEX_N_SPILL_BYTES];
}
ThreadArchState;
typedef VexGuestARMState VexGuestArchState;
/* ---------------------------------------------------------------------
libpthread stuff
------------------------------------------------------------------ */
struct _ThreadArchAux {
// XXX: nothing?
};
/* ---------------------------------------------------------------------
Miscellaneous constants
------------------------------------------------------------------ */
// Valgrind's signal stack size, in words.
#define VG_SIGSTACK_SIZE_W 10000
// Base address of client address space.
#define CLIENT_BASE 0x00000000ul
#endif // __ARM_CORE_ARCH_H
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/