Files
ftmemsim-valgrind/coregrind/x86-linux/core_platform.h
Nicholas Nethercote c4cf15dc21 Arch-abstraction:
- Added include/x86-linux/ and include/linux/ subdirectories, with Makefile.am
  files.

- Overhauled the definitions of kernel types.  include/vg_kerneliface.h is now
  three files, include/linux/vki.h, include/x86-linux/vki_arch.h, and
  include/x86-linux/vki_arch_posixtypes.h.  These files separate the
  common/Linux and x86/Linux parts cleanly.  All code is copied verbatim from
  the relevant kernel headers, except that VKI_/vki_ prefixes are added as
  necessary to distinguish them from glibc types.  (This is done consistently,
  unlike previously when some types did not have the prefixes.)

  All code is clearly marked to show which particular header file it came from,
  and the Linux version used.  (I used 2.6.8.1, the most recent stable release,
  for all of them.)

  A few of the types changed;  this is because they changed between the older
  versions of Linux and the current 2.6.8.1.  I checked that all these changes
  were ok with respect to backwards compatibility for our purposes.

- vg_unsafe.h has been removed;  we are no longer including any kernel headers,
  as we have our own copies for everything.  This is because installed kernel
  headers are not reliable, and often cause compilation problems. (bug
  #92420 is a recent example)

- Removed some no-longer-needed header-presence tests from configure.in.

- Some code in the rest of Valgrind was changed to account for some slight
  changes in the names of our VKI_/vki_ kernel constants and types.

- Updated README_MISSING_SYSCALL_OR_IOCTL accordingly.

- Fixed off-by-one error with VKI_GDT_ENTRY_TLS_MAX (merged from stable branch)

The end result is that the kernel types situation should be much clearer, and
similar files can be created relatively easily for other architectures as
necessary.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2884
2004-10-31 18:48:21 +00:00

127 lines
5.7 KiB
C

/*--------------------------------------------------------------------*/
/*--- x86-Linux-specific stuff for the core. ---*/
/*--- x86-linux/core_platform.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 __X86_LINUX_CORE_PLATFORM_H
#define __X86_LINUX_CORE_PLATFORM_H
//#include "core_platform_asm.h" // platform-specific asm stuff
//#include "platform_arch.h" // platform-specific tool stuff
/* ---------------------------------------------------------------------
Interesting registers
------------------------------------------------------------------ */
// Accessors for the arch_thread_t
#define PLATFORM_SYSCALL_NUM(regs) ((regs).m_eax)
#define PLATFORM_SYSCALL_RET(regs) ((regs).m_eax)
#define PLATFORM_SYSCALL_ARG1(regs) ((regs).m_ebx)
#define PLATFORM_SYSCALL_ARG2(regs) ((regs).m_ecx)
#define PLATFORM_SYSCALL_ARG3(regs) ((regs).m_edx)
#define PLATFORM_SYSCALL_ARG4(regs) ((regs).m_esi)
#define PLATFORM_SYSCALL_ARG5(regs) ((regs).m_edi)
#define PLATFORM_SYSCALL_ARG6(regs) ((regs).m_ebp)
#define PLATFORM_SET_SYSCALL_RESULT(regs, val) ((regs).m_eax = (val))
// Interesting register numbers
#define R_SYSCALL_NUM R_EAX
#define R_SYSCALL_ARG1 R_EBX
#define R_SYSCALL_RET R_EAX
// Setting thread regs and shadow regs from within the core
#define SET_SYSCALL_RETVAL(zztid, zzval) \
SET_THREAD_REG(zztid, zzval, PLATFORM_SYSCALL_RET, R_SYSCALL_RET, \
post_reg_write_syscall_return)
/* ---------------------------------------------------------------------
Exports of vg_ldt.c
------------------------------------------------------------------ */
// XXX: eventually all these should be x86-private, and not visible to the
// core (except maybe do_useseg()?)
/* Simulate the modify_ldt syscall. */
extern Int VG_(sys_modify_ldt) ( ThreadId tid,
Int func, void* ptr, UInt bytecount );
/* Simulate the {get,set}_thread_area syscalls. */
extern Int VG_(sys_set_thread_area) ( ThreadId tid,
vki_modify_ldt_t* info );
extern Int VG_(sys_get_thread_area) ( ThreadId tid,
vki_modify_ldt_t* info );
/* Called from generated code. Given a segment selector and a virtual
address, return a linear address, and do limit checks too. */
extern Addr VG_(do_useseg) ( UInt seg_selector, Addr virtual_addr );
/* ---------------------------------------------------------------------
ucontext stuff
------------------------------------------------------------------ */
#define UCONTEXT_INSTR_PTR(uc) ((uc)->uc_mcontext.eip)
#define UCONTEXT_STACK_PTR(uc) ((uc)->uc_mcontext.esp)
#define UCONTEXT_FRAME_PTR(uc) ((uc)->uc_mcontext.ebp)
#define UCONTEXT_SYSCALL_NUM(uc) ((uc)->uc_mcontext.eax)
/* ---------------------------------------------------------------------
mmap() stuff
------------------------------------------------------------------ */
#define PLATFORM_DO_MMAP(ret, start, length, prot, flags, fd, offset) { \
UWord __args[6]; \
\
__args[0] = (UWord)(start); \
__args[1] = (length); \
__args[2] = (prot); \
__args[3] = (flags); \
__args[4] = (fd); \
__args[5] = (offset); \
\
ret = VG_(do_syscall)(__NR_mmap, (UWord)(&(__args[0])) ); \
}
#define PLATFORM_GET_MMAP_ARGS(tst, a1, a2, a3, a4, a5, a6) do {\
UInt *arg_block = (UInt*)PLATFORM_SYSCALL_ARG1(tst->arch); \
SYSCALL_TRACK( pre_mem_read, tst->tid, "mmap(args)", arg1, 6*sizeof(UWord) ); \
a1 = arg_block[0]; \
a2 = arg_block[1]; \
a3 = arg_block[2]; \
a4 = arg_block[3]; \
a5 = arg_block[4]; \
a6 = arg_block[5]; \
} while (0)
#endif // __X86_LINUX_CORE_PLATFORM_H
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/