mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-09 00:46:12 +00:00
111 lines
4.4 KiB
Plaintext
111 lines
4.4 KiB
Plaintext
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!
|
|
|
|
|