// // File: src/test/ia32-crt0.S // // Description: Simple startupcode // .text .global _start _start: /* dont' load the stack pointer for our small stack any more! */ /* save environment given from elfexec. the third param is at -8 because there is no return address on the stack. */ mov 8(%esp), %ebx mov %ebx, environ /* initialize libc */ call __libc_init /* Start the constructors of global objects (supporting C++) */ leal __section_ctors_start, %ebx 2: cmp $__section_ctors_end, %ebx je 3f call *(%ebx) add $4,%ebx jmp 2b 3: /* push a return address to catch main ending (should never happen) */ pushl $___return_from_main jmp main /* call main() */ ___return_from_main: pushl %eax /* save return code as a parameter to exit */ /* run the destructors of global objects (supporting C++) */ leal __section_dtors_start, %ebx 5: cmp $__section_dtors_end, %ebx je 6f call *(%ebx) add $4,%ebx jmp 5b 6: /* Kill ourself */ call exit /* Enter kdebug (this is what never should happen) WARNING: only L4Ka::Pistachio KDebug enter */ int $3 jmp 8f mov $7f, %eax .section .rodata 7: .asciz "***System stopped***" .previous 8: jmp 6b /* Loop forever on the enter_kdebug */ .data /* save envp pointer to environment here */ .global environ environ: .long 0 /* symbols which are expected to exist */ .global __heap_start_ptr __heap_start_ptr: .long __elf_end