-
Notifications
You must be signed in to change notification settings - Fork 642
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[pxe] Provide PXENV_FILE_EXIT_HOOK only for ipxelinux.0 builds
PXENV_FILE_EXIT_HOOK is designed to allow ipxelinux.0 to unload both the iPXE and pxelinux components without affecting the underlying PXE stack. Unfortunately, it causes unexpected behaviour in other situations, such as when loading a non-embedded pxelinux.0 via undionly.kpxe. For example: PXE ROM -> undionly.kpxe -> pxelinux.0 -> chain.c32 to boot hd0 would cause control to return to iPXE instead of booting from the hard disk. In some cases, this would result in a harmless but confusing "No more network devices" message; in other cases stranger things would happen, such as being returned to the iPXE shell prompt. The fundamental problem is that when pxelinux detects PXENV_FILE_EXIT_HOOK, it may attempt to specify an exit hook and then exit back to iPXE, assuming that iPXE will in turn exit cleanly via the specified exit hook. This is not a valid assumption in the general case, since the action of exiting back to iPXE does not directly cause iPXE to exit itself. (In the specific case of ipxelinux.0, this will work since the embedded script exits as soon as pxelinux.0 exits.) Fix the unexpected behaviour in the non-ipxelinux.0 cases by including support for PXENV_FILE_EXIT_HOOK only when using a new .kkkpxe format. The ipxelinux.0 build process should therefore now use undionly.kkkpxe instead of undionly.kkpxe. Signed-off-by: Michael Brown <mcb30@ipxe.org>
- Loading branch information
Showing
6 changed files
with
118 additions
and
53 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
/** @file | ||
* | ||
* PXE exit hook | ||
* | ||
*/ | ||
|
||
/* | ||
* Copyright (C) 2010 Shao Miller <shao.miller@yrdsb.edu.on.ca>. | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License as | ||
* published by the Free Software Foundation; either version 2 of the | ||
* License, or any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
*/ | ||
|
||
FILE_LICENCE ( GPL2_OR_LATER ); | ||
|
||
#include <stdint.h> | ||
#include <realmode.h> | ||
#include <pxe.h> | ||
|
||
/** PXE exit hook */ | ||
extern segoff_t __data16 ( pxe_exit_hook ); | ||
#define pxe_exit_hook __use_data16 ( pxe_exit_hook ) | ||
|
||
/** | ||
* FILE EXIT HOOK | ||
* | ||
* @v file_exit_hook Pointer to a struct | ||
* s_PXENV_FILE_EXIT_HOOK | ||
* @v s_PXENV_FILE_EXIT_HOOK::Hook SEG16:OFF16 to jump to | ||
* @ret #PXENV_EXIT_SUCCESS Successfully set hook | ||
* @ret #PXENV_EXIT_FAILURE We're not an NBP build | ||
* @ret s_PXENV_FILE_EXIT_HOOK::Status PXE status code | ||
* | ||
*/ | ||
static PXENV_EXIT_t | ||
pxenv_file_exit_hook ( struct s_PXENV_FILE_EXIT_HOOK *file_exit_hook ) { | ||
DBG ( "PXENV_FILE_EXIT_HOOK" ); | ||
|
||
/* We'll jump to the specified SEG16:OFF16 during exit */ | ||
pxe_exit_hook.segment = file_exit_hook->Hook.segment; | ||
pxe_exit_hook.offset = file_exit_hook->Hook.offset; | ||
file_exit_hook->Status = PXENV_STATUS_SUCCESS; | ||
return PXENV_EXIT_SUCCESS; | ||
} | ||
|
||
/** PXE file API */ | ||
struct pxe_api_call pxe_file_api_exit_hook __pxe_api_call = | ||
PXE_API_CALL ( PXENV_FILE_EXIT_HOOK, pxenv_file_exit_hook, | ||
struct s_PXENV_FILE_EXIT_HOOK ); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/***************************************************************************** | ||
* PXE prefix that keeps the whole PXE stack present and provides an exit hook | ||
* | ||
* This prefix is essentially intended solely for the case of ipxelinux.0 | ||
***************************************************************************** | ||
*/ | ||
|
||
FILE_LICENCE ( GPL2_OR_LATER ) | ||
|
||
/* Since we have the whole stack, we can use cached DHCP information */ | ||
REQUIRE_OBJECT ( pxeparent_dhcp ) | ||
|
||
/* Provide the PXENV_FILE_EXIT_HOOK API call */ | ||
REQUIRE_OBJECT ( pxe_exit_hook ) | ||
|
||
#define PXELOADER_KEEP_UNDI | ||
#define PXELOADER_KEEP_PXE | ||
#define _pxe_start _kkkpxe_start | ||
#include "pxeprefix.S" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters