From 8130443f9ffd64f48a756d440e11d0265925765e Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 30 Jun 2007 14:56:35 +0100 Subject: 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 +++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 54 deletions(-) delete mode 100644 src/arch/i386/include/pxe_callbacks.h (limited to 'src/arch') diff --git a/src/arch/i386/image/pxe_image.c b/src/arch/i386/image/pxe_image.c index 60711edc0..9cf546916 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 c6c1c6d89..dc5853108 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 974a3c30c..000000000 --- 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 7a1851555..8ecacf1d1 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; +} -- cgit v1.2.3-55-g7522