diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /roms/ipxe/src/arch/x86/prefix | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip | |
Diffstat (limited to 'roms/ipxe/src/arch/x86/prefix')
| -rw-r--r-- | roms/ipxe/src/arch/x86/prefix/efidrvprefix.c | 46 | ||||
| -rw-r--r-- | roms/ipxe/src/arch/x86/prefix/efiprefix.c | 96 | 
2 files changed, 142 insertions, 0 deletions
| diff --git a/roms/ipxe/src/arch/x86/prefix/efidrvprefix.c b/roms/ipxe/src/arch/x86/prefix/efidrvprefix.c new file mode 100644 index 00000000..3daefd00 --- /dev/null +++ b/roms/ipxe/src/arch/x86/prefix/efidrvprefix.c @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2009 Michael Brown <mbrown@fensystems.co.uk>. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#include <stdlib.h> +#include <ipxe/init.h> +#include <ipxe/efi/efi.h> + +/** + * EFI entry point + * + * @v image_handle	Image handle + * @v systab		System table + * @ret efirc		EFI return status code + */ +EFI_STATUS EFIAPI _efidrv_start ( EFI_HANDLE image_handle, +				  EFI_SYSTEM_TABLE *systab ) { +	EFI_STATUS efirc; + +	/* Initialise EFI environment */ +	if ( ( efirc = efi_init ( image_handle, systab ) ) != 0 ) +		return efirc; + +	/* Initialise iPXE environment */ +	initialise(); +	startup(); + +	return 0; +} diff --git a/roms/ipxe/src/arch/x86/prefix/efiprefix.c b/roms/ipxe/src/arch/x86/prefix/efiprefix.c new file mode 100644 index 00000000..b0bf99c6 --- /dev/null +++ b/roms/ipxe/src/arch/x86/prefix/efiprefix.c @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2009 Michael Brown <mbrown@fensystems.co.uk>. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#include <stdlib.h> +#include <errno.h> +#include <ipxe/device.h> +#include <ipxe/efi/efi.h> +#include <ipxe/efi/efi_driver.h> +#include <ipxe/efi/efi_snp.h> +#include <ipxe/efi/efi_autoboot.h> + +/** + * EFI entry point + * + * @v image_handle	Image handle + * @v systab		System table + * @ret efirc		EFI return status code + */ +EFI_STATUS EFIAPI _efi_start ( EFI_HANDLE image_handle, +			       EFI_SYSTEM_TABLE *systab ) { +	EFI_STATUS efirc; +	int rc; + +	/* Initialise EFI environment */ +	if ( ( efirc = efi_init ( image_handle, systab ) ) != 0 ) +		goto err_init; + +	/* Record autoboot device (if any) */ +	efi_set_autoboot(); + +	/* Claim SNP devices for use by iPXE */ +	efi_snp_claim(); + +	/* Call to main() */ +	if ( ( rc = main() ) != 0 ) { +		efirc = EFIRC ( rc ); +		goto err_main; +	} + + err_main: +	efi_snp_release(); +	efi_loaded_image->Unload ( image_handle ); +	efi_driver_reconnect_all(); + err_init: +	return efirc; +} + +/** + * Probe EFI root bus + * + * @v rootdev		EFI root device + */ +static int efi_probe ( struct root_device *rootdev __unused ) { + +	return efi_driver_connect_all(); +} + +/** + * Remove EFI root bus + * + * @v rootdev		EFI root device + */ +static void efi_remove ( struct root_device *rootdev __unused ) { + +	efi_driver_disconnect_all(); +} + +/** EFI root device driver */ +static struct root_driver efi_root_driver = { +	.probe = efi_probe, +	.remove = efi_remove, +}; + +/** EFI root device */ +struct root_device efi_root_device __root_device = { +	.dev = { .name = "EFI" }, +	.driver = &efi_root_driver, +}; | 
