david/ipxe
david
/
ipxe
Archived
1
0
Fork 0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/arch/i386/core/hooks.c

86 lines
2.1 KiB
C

#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 );
}
}