a41a0e28c2
Not hooked up to the build yet.
68 lines
2.5 KiB
Plaintext
68 lines
2.5 KiB
Plaintext
To port klibc to a new architecture, you need:
|
|
|
|
a) A directory structure
|
|
|
|
Each archtecture has an arch/ directory, which should include an
|
|
MCONFIG and a Makefile.inc file.
|
|
|
|
b) Startup code (arch/*/crt0.S)
|
|
|
|
The crt0.S assembly routine typically corresponds to the following
|
|
pseudo-C code. In addition, each architecture needs any support
|
|
routines that gcc-generated code expects to find in the system library
|
|
-- Alpha, for example, needs divide subroutines.
|
|
|
|
The "getenvtest" test program is a very good test for proper crt0.S
|
|
functionality.
|
|
|
|
|
|
extern __noreturn __libc_init(void *, void *);
|
|
|
|
__noreturn _start(void)
|
|
{
|
|
void *elf_data = get_elf_data_address(); /* Usually the stack address */
|
|
void *atexit_ptr = get_atexit_ptr(); /* Usually in a register */
|
|
|
|
/* Some architectures need this for debugging to work */
|
|
setup_null_stack_frame_if_necessary();
|
|
|
|
__libc_init(elf_data, atexit_ptr);
|
|
}
|
|
|
|
|
|
c) A setenv implementation (arch/*/setjmp.S, arch/*/include/klibc/archsetjmp.h)
|
|
|
|
On most (but not all!) architectures, this entails creating a setjmp
|
|
buffer big enough to hold all callee-saved registers, plus the stack
|
|
pointer and the return address. In setjmp.S you have:
|
|
|
|
* A "setjmp" function that writes out the callee-saved registers, the
|
|
stack pointer and the return address to the buffer pointed to by the
|
|
first argument, and then returns zero normally.
|
|
|
|
On some architectures you need to take some kind of action to make
|
|
sure the contents of the stack is actually manifest in memory and
|
|
not cached in the CPU. In some cases (e.g. on SPARC) this will
|
|
automatically spill the registers onto the stack; then they don't
|
|
need to be spilled into the jmp_buf.
|
|
|
|
* A "longjmp" function that read back these same registers from the
|
|
jmp_buf pointed to by the first argument, and returns the second
|
|
argument *to the address specified in the jmp_buf*.
|
|
|
|
On some architectures you need to take some kind of action to flush
|
|
any cached stack data or return stack.
|
|
|
|
|
|
d) Any support functions needed by gcc, *unless* they are in libgcc
|
|
*and* libgcc is usable for klibc on your particular platform. If
|
|
libgcc isn't usable for klibc (on MIPS, for example, libgcc is
|
|
compiled in a way that is not compatible with klibc) there are
|
|
reasonably good clones of most of the libgcc functions in the libgcc
|
|
directory. To use them, add them to ARCHOBJS in
|
|
arch/*/Makefile.inc.
|
|
|
|
|
|
e) A link location for the shared klibc. This should be specified in
|
|
SHAREDFLAGS in arch/*/MCONFIG.
|