From 8130443f9ffd64f48a756d440e11d0265925765e Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 30 Jun 2007 14:56:35 +0100 Subject: [PATCH] Separate out pxe_start_nbp() from pxe_image.c into pxe_call.c Implement PXENV_RESTART_TFTP. --- src/arch/i386/image/pxe_image.c | 23 +----------------- src/arch/i386/include/pxe_call.h | 10 ++++++++ src/arch/i386/include/pxe_callbacks.h | 32 -------------------------- src/arch/i386/interface/pxe/pxe_call.c | 25 ++++++++++++++++++++ src/interface/pxe/pxe_preboot.c | 21 ++++++++--------- 5 files changed, 46 insertions(+), 65 deletions(-) delete mode 100644 src/arch/i386/include/pxe_callbacks.h diff --git a/src/arch/i386/image/pxe_image.c b/src/arch/i386/image/pxe_image.c index 60711edc..9cf54691 100644 --- a/src/arch/i386/image/pxe_image.c +++ b/src/arch/i386/image/pxe_image.c @@ -30,12 +30,6 @@ #include #include -/** PXE load address segment */ -#define PXE_LOAD_SEGMENT 0 - -/** PXE load address offset */ -#define PXE_LOAD_OFFSET 0x7c00 - struct image_type pxe_image_type __image_type ( PROBE_PXE ); /** @@ -46,8 +40,6 @@ struct image_type pxe_image_type __image_type ( PROBE_PXE ); */ static int pxe_exec ( struct image *image __unused ) { struct net_device *netdev; - int discard_b, discard_c; - uint16_t rc; /* Ensure that PXE stack is ready to use */ pxe_init_structures(); @@ -59,20 +51,7 @@ static int pxe_exec ( struct image *image __unused ) { break; } - /* Far call to PXE NBP */ - __asm__ __volatile__ ( REAL_CODE ( "pushw %%cx\n\t" - "pushw %%ax\n\t" - "movw %%cx, %%es\n\t" - "lcall $0, $0x7c00\n\t" - "addw $4, %%sp\n\t" ) - : "=a" ( rc ), "=b" ( discard_b ), - "=c" ( discard_c ) - : "a" ( & __from_text16 ( ppxe ) ), - "b" ( & __from_text16 ( pxenv ) ), - "c" ( rm_cs ) - : "edx", "esi", "edi", "ebp", "memory" ); - - return rc; + return pxe_start_nbp(); } /** diff --git a/src/arch/i386/include/pxe_call.h b/src/arch/i386/include/pxe_call.h index c6c1c6d8..dc585310 100644 --- a/src/arch/i386/include/pxe_call.h +++ b/src/arch/i386/include/pxe_call.h @@ -9,6 +9,15 @@ #include #include +/** PXE load address segment */ +#define PXE_LOAD_SEGMENT 0 + +/** PXE load address offset */ +#define PXE_LOAD_OFFSET 0x7c00 + +/** PXE physical load address */ +#define PXE_LOAD_PHYS ( ( PXE_LOAD_SEGMENT << 4 ) + PXE_LOAD_OFFSET ) + /** !PXE structure */ extern struct s_PXE __text16 ( ppxe ); #define ppxe __use_text16 ( ppxe ) @@ -20,5 +29,6 @@ extern struct s_PXENV __text16 ( pxenv ); extern void pxe_hook_int1a ( void ); extern int pxe_unhook_int1a ( void ); extern void pxe_init_structures ( void ); +extern int pxe_start_nbp ( void ); #endif /* _PXE_CALL_H */ diff --git a/src/arch/i386/include/pxe_callbacks.h b/src/arch/i386/include/pxe_callbacks.h deleted file mode 100644 index 974a3c30..00000000 --- a/src/arch/i386/include/pxe_callbacks.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Header for pxe_callbacks.c. - */ - -#ifndef PXE_CALLBACKS_H -#define PXE_CALLBACKS_H - -#include "etherboot.h" -#include "pxe_types.h" - -typedef struct { - SEGOFF16_t orig_retaddr; - UINT16_t opcode; - SEGOFF16_t segoff; -} PACKED pxe_call_params_t; - -/* - * These values are hard-coded into the PXE spec - */ -#define PXE_LOAD_SEGMENT (0x0000) -#define PXE_LOAD_OFFSET (0x7c00) -#define PXE_LOAD_ADDRESS ( ( PXE_LOAD_SEGMENT << 4 ) + PXE_LOAD_OFFSET ) - -/* Function prototypes - */ -extern struct pxe_stack * install_pxe_stack ( void *base ); -extern void use_undi_ds_for_rm_stack ( uint16_t ds ); -extern int hook_pxe_stack ( void ); -extern int unhook_pxe_stack ( void ); -extern void remove_pxe_stack ( void ); -extern int xstartpxe ( void ); - -#endif /* PXE_CALLBACKS_H */ diff --git a/src/arch/i386/interface/pxe/pxe_call.c b/src/arch/i386/interface/pxe/pxe_call.c index 7a185155..8ecacf1d 100644 --- a/src/arch/i386/interface/pxe/pxe_call.c +++ b/src/arch/i386/interface/pxe/pxe_call.c @@ -363,3 +363,28 @@ void pxe_init_structures ( void ) { ppxe.StructCksum -= pxe_checksum ( &ppxe, sizeof ( ppxe ) ); pxenv.Checksum -= pxe_checksum ( &pxenv, sizeof ( pxenv ) ); } + +/** + * Start PXE NBP at 0000:7c00 + * + * @ret rc Return status code + */ +int pxe_start_nbp ( void ) { + int discard_b, discard_c; + uint16_t rc; + + /* Far call to PXE NBP */ + __asm__ __volatile__ ( REAL_CODE ( "pushw %%cx\n\t" + "pushw %%ax\n\t" + "movw %%cx, %%es\n\t" + "lcall $0, $0x7c00\n\t" + "addw $4, %%sp\n\t" ) + : "=a" ( rc ), "=b" ( discard_b ), + "=c" ( discard_c ) + : "a" ( & __from_text16 ( ppxe ) ), + "b" ( & __from_text16 ( pxenv ) ), + "c" ( rm_cs ) + : "edx", "esi", "edi", "ebp", "memory" ); + + return rc; +} diff --git a/src/interface/pxe/pxe_preboot.c b/src/interface/pxe/pxe_preboot.c index a1b16360..b1cc39c0 100644 --- a/src/interface/pxe/pxe_preboot.c +++ b/src/interface/pxe/pxe_preboot.c @@ -30,7 +30,7 @@ #include #include #include "pxe.h" -#include "pxe_callbacks.h" +#include "pxe_call.h" /** * UNLOAD BASE CODE STACK @@ -146,22 +146,21 @@ PXENV_EXIT_t pxenv_get_cached_info ( struct s_PXENV_GET_CACHED_INFO */ PXENV_EXIT_t pxenv_restart_tftp ( struct s_PXENV_TFTP_READ_FILE *restart_tftp ) { - DBG ( "PXENV_RESTART_TFTP" ); + PXENV_EXIT_t tftp_exit; + + DBG ( "PXENV_RESTART_TFTP " ); -#if 0 /* Words cannot describe the complete mismatch between the PXE * specification and any possible version of reality... */ - restart_tftp->Buffer = PXE_LOAD_ADDRESS; /* Fixed by spec, apparently */ - restart_tftp->BufferSize = get_free_base_memory() - PXE_LOAD_ADDRESS; /* Near enough */ - DBG ( "(" ); - tftp_exit = pxe_api_call ( PXENV_TFTP_READ_FILE, (union u_PXENV_ANY*)restart_tftp ); - DBG ( ")" ); - if ( tftp_exit != PXENV_EXIT_SUCCESS ) return tftp_exit; + restart_tftp->Buffer = PXE_LOAD_PHYS; /* Fixed by spec, apparently */ + restart_tftp->BufferSize = ( 0xa0000 - PXE_LOAD_PHYS ); /* Near enough */ + tftp_exit = pxenv_tftp_read_file ( restart_tftp ); + if ( tftp_exit != PXENV_EXIT_SUCCESS ) + return tftp_exit; /* Fire up the new NBP */ - restart_tftp->Status = xstartpxe(); -#endif + restart_tftp->Status = pxe_start_nbp(); /* Not sure what "SUCCESS" actually means, since we can only * return if the new NBP failed to boot...