12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #include "stdint.h"
- #include "stddef.h"
- #include "registers.h"
- #include "string.h"
- #include "hooks.h"
- #include "init.h"
- #include "main.h"
- #include "relocate.h"
- #include "etherboot.h"
-
- /* Symbols defined by the linker */
- extern char _bss[], _ebss[];
-
- /*
- * This file provides the basic entry points from assembly code. See
- * README.i386 for a description of the entry code path.
- *
- */
-
- /*
- * arch_initialise(): perform any required initialisation such as
- * setting up the console device and relocating to high memory. Note
- * that if we relocate to high memory and the prefix is in base
- * memory, then we will need to install a copy of librm in base
- * memory. librm's reset function takes care of this.
- *
- */
-
- #include "librm.h"
-
- void arch_initialise ( struct i386_all_regs *regs __unused ) {
- /* Zero the BSS */
- memset ( _bss, 0, _ebss - _bss );
-
- /* Call all registered initialisation functions.
- */
- call_init_fns ();
-
- /* Relocate to high memory. (This is a no-op under
- * -DKEEP_IT_REAL.)
- */
- relocate();
-
- /* Call all registered reset functions. Note that if librm is
- * included, it is the reset function that will install a
- * fresh copy of librm in base memory. It follows from this
- * that (a) librm must be first in the reset list and (b) you
- * cannot call console output functions between relocate() and
- * call_reset_fns(), because real-mode calls will crash the
- * machine.
- */
- call_reset_fns();
-
- printf ( "init finished\n" );
-
- regs->es = virt_to_phys ( installed_librm ) >> 4;
-
- __asm__ ( "xchgw %bx, %bx" );
- }
-
- /*
- * arch_main() : call main() and then exit via whatever exit mechanism
- * the prefix requested.
- *
- */
- void arch_main ( struct i386_all_regs *regs ) {
- void (*exit_path) ( struct i386_all_regs *regs );
-
- /* Determine exit path requested by prefix */
- exit_path = ( typeof ( exit_path ) ) regs->eax;
-
- /* Call to main() */
- regs->eax = main();
-
- /* Call registered per-object exit functions */
- call_exit_fns ();
-
- if ( exit_path ) {
- /* Prefix requested that we use a particular function
- * as the exit path, so we call this function, which
- * must not return.
- */
- exit_path ( regs );
- }
- }
|