This is a rough guide to porting Valgrind to a new architecture, or a new
operating system.  It's quite preliminary, but should get you started.

[29-May-2005: the stuff about the locations of files is now badly out of
date.  --njn]

-----------------------------------------------------------------------------
Porting Valgrind to a new architecture
-----------------------------------------------------------------------------
Note that this implies both a new architecture, and a new platform (ie. arch/OS
combination).  Please add to this list if it is missing anything.

To begin:

- Create necessary subdirs (copy x86/ and x86-linux/ subdirs).  Yes, even the
  test subdirectories.  (You should make arch-specific tests later to be
  thorough!)  Put in Makefile.am files for them, edit them for the new
  architecture name. 

- Update configure.in (use x86 and x86-linux as a guide).

Once it configures ok, get it to compile:

- Create the Vex guest state type, VexGuest<ARCH>State

- Copy all the arch-specific and platform-specific files into the new
  directories, eg. from x86 and x86-linux.  Files like (this list is not
  exhaustive!):

    include/x86/core_arch.h
    include/x86-linux/core_platform.h
    coregrind/x86/core_arch.h
    coregrind/x86-linux/core_platform.h
    coregrind/x86-linux/vki_arch.h
    coregrind/x86-linux/vki_arch_posixtypes.h

  Edit obvious things like the file headers, and the #ifdef __X86_TOOL_ARCH_H
  guards, so they refer to the new architecture, rather than x86.

  Comment all their contents out.

- Try compiling.  When it falls over on missing functions/types/constants, just
  uncomment and fix up the copied ones.  Just use stubs that fail (immediately
  and obviously! -- use the "I_die_here" macro) for functions and macros to get
  things compiling.

  For the kernel types, you'll have to copy the types from the kernel source.
  Use a recent kernel source, please.  Don't just pull in all the
  corresponding types/macros that x86 provides, otherwise you might end up
  providing more types/macros than the core actually needs;  only pull in types
  as the compiler asks for them.  You'll need a lot of the types in
  vki_arch_posixtypes.h early on.

  You'll need to update the Makefile.am files if you add/remove files.

Once it compiles ok, get it to run:

- Try running.  When it falls over on stub function/macros, implement them
  properly.  The syscall table and syscall wrappers will be painful;  do them
  individually, on demand.

- A lot of the arch-specific stuff has been abstracted out of the core, but
  there undoubtedly remains some arch-specific stuff in there.  Abstract it out
  as necessary, updating the other archs appropriately.

- If it crashes without telling you why, use lots of diagnostic printfs (or
  OINKs) to track down the exact location of the crash.

Once it runs ok:

- Add the arch to the tests/arch_test.c file so the reg test script will work.
  (Don't forget to add it to all_archs[].)  Likewise for os_test.in and
  platform_test.

- Ensure the regression tests work, and add some arch-specific tests to
  none/tests directory.

- Add the relevant entries to valgrind.spec.in (copy the x86 and x86-linux
  ones).

-----------------------------------------------------------------------------
Porting Valgrind to a new OS
-----------------------------------------------------------------------------
Similarly to above, this implies both a new OS, and a new platform.

- Create necessary subdirs (copy linux/ and x86-linux/ subdirs).

- Update configure.in (use linux and x86-linux as a guide).

- Implement all the necessary OS-specific and platform-specific types,
  functions, and macros... use the following as templates:
    
    include/linux/core_os.h
    include/x86-linux/core_platform.h
    coregrind/linux/core_os.h
    coregrind/x86-linux/core_platform.h

- You'll need to copy appropriate kernel types into vki*.h.
  You'll have to ensure that everywhere that vki_*/VKI_* types and constants
  are used, that they are suitable for your new OS, otherwise factor their
  usage out somehow.  This will be painful.

- In particular, you'll need to implement the VGA_(syscall_table).  You may be
  able to reuse some of the generic (eg. POSIX) syscall wrappers, if the types
  match.  Otherwise, you'll have to write your own new wrappers.  Do this
  incrementally, as system calls are hit, otherwise you'll go crazy.

- Probably lots more things;  this list should be added to!


