diff options
Diffstat (limited to 'qemu/roms/ipxe/src/arch/i386/core/runtime.c')
-rw-r--r-- | qemu/roms/ipxe/src/arch/i386/core/runtime.c | 269 |
1 files changed, 0 insertions, 269 deletions
diff --git a/qemu/roms/ipxe/src/arch/i386/core/runtime.c b/qemu/roms/ipxe/src/arch/i386/core/runtime.c deleted file mode 100644 index d160fee04..000000000 --- a/qemu/roms/ipxe/src/arch/i386/core/runtime.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (C) 2011 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. - * - * You can also choose to distribute this program under the terms of - * the Unmodified Binary Distribution Licence (as given in the file - * COPYING.UBDL), provided that you have satisfied its requirements. - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); - -/** @file - * - * Command line and initrd passed to iPXE at runtime - * - */ - -#include <stddef.h> -#include <stdint.h> -#include <stdlib.h> -#include <ctype.h> -#include <errno.h> -#include <assert.h> -#include <ipxe/init.h> -#include <ipxe/image.h> -#include <ipxe/script.h> -#include <ipxe/umalloc.h> -#include <realmode.h> - -/** Command line physical address - * - * This can be set by the prefix. - */ -uint32_t __bss16 ( cmdline_phys ); -#define cmdline_phys __use_data16 ( cmdline_phys ) - -/** initrd physical address - * - * This can be set by the prefix. - */ -uint32_t __bss16 ( initrd_phys ); -#define initrd_phys __use_data16 ( initrd_phys ) - -/** initrd length - * - * This can be set by the prefix. - */ -uint32_t __bss16 ( initrd_len ); -#define initrd_len __use_data16 ( initrd_len ) - -/** Internal copy of the command line */ -static char *cmdline_copy; - -/** Free command line image */ -static void cmdline_image_free ( struct refcnt *refcnt ) { - struct image *image = container_of ( refcnt, struct image, refcnt ); - - DBGC ( image, "RUNTIME freeing command line\n" ); - free ( cmdline_copy ); -} - -/** Embedded script representing the command line */ -static struct image cmdline_image = { - .refcnt = REF_INIT ( cmdline_image_free ), - .name = "<CMDLINE>", - .type = &script_image_type, -}; - -/** Colour for debug messages */ -#define colour &cmdline_image - -/** - * Strip unwanted cruft from command line - * - * @v cmdline Command line - * @v cruft Initial substring of cruft to strip - */ -static void cmdline_strip ( char *cmdline, const char *cruft ) { - char *strip; - char *strip_end; - - /* Find unwanted cruft, if present */ - if ( ! ( strip = strstr ( cmdline, cruft ) ) ) - return; - - /* Strip unwanted cruft */ - strip_end = strchr ( strip, ' ' ); - if ( strip_end ) { - *strip_end = '\0'; - DBGC ( colour, "RUNTIME stripping \"%s\"\n", strip ); - strcpy ( strip, ( strip_end + 1 ) ); - } else { - DBGC ( colour, "RUNTIME stripping \"%s\"\n", strip ); - *strip = '\0'; - } -} - -/** - * Initialise command line - * - * @ret rc Return status code - */ -static int cmdline_init ( void ) { - userptr_t cmdline_user; - char *cmdline; - size_t len; - int rc; - - /* Do nothing if no command line was specified */ - if ( ! cmdline_phys ) { - DBGC ( colour, "RUNTIME found no command line\n" ); - return 0; - } - cmdline_user = phys_to_user ( cmdline_phys ); - len = ( strlen_user ( cmdline_user, 0 ) + 1 /* NUL */ ); - - /* Allocate and copy command line */ - cmdline_copy = malloc ( len ); - if ( ! cmdline_copy ) { - DBGC ( colour, "RUNTIME could not allocate %zd bytes for " - "command line\n", len ); - rc = -ENOMEM; - goto err_alloc_cmdline_copy; - } - cmdline = cmdline_copy; - copy_from_user ( cmdline, cmdline_user, 0, len ); - DBGC ( colour, "RUNTIME found command line \"%s\" at %08x\n", - cmdline, cmdline_phys ); - - /* Mark command line as consumed */ - cmdline_phys = 0; - - /* Strip unwanted cruft from the command line */ - cmdline_strip ( cmdline, "BOOT_IMAGE=" ); - cmdline_strip ( cmdline, "initrd=" ); - while ( isspace ( *cmdline ) ) - cmdline++; - DBGC ( colour, "RUNTIME using command line \"%s\"\n", cmdline ); - - /* Prepare and register image */ - cmdline_image.data = virt_to_user ( cmdline ); - cmdline_image.len = strlen ( cmdline ); - if ( cmdline_image.len ) { - if ( ( rc = register_image ( &cmdline_image ) ) != 0 ) { - DBGC ( colour, "RUNTIME could not register command " - "line: %s\n", strerror ( rc ) ); - goto err_register_image; - } - } - - /* Drop our reference to the image */ - image_put ( &cmdline_image ); - - return 0; - - err_register_image: - image_put ( &cmdline_image ); - err_alloc_cmdline_copy: - return rc; -} - -/** - * Initialise initrd - * - * @ret rc Return status code - */ -static int initrd_init ( void ) { - struct image *image; - int rc; - - /* Do nothing if no initrd was specified */ - if ( ! initrd_phys ) { - DBGC ( colour, "RUNTIME found no initrd\n" ); - return 0; - } - if ( ! initrd_len ) { - DBGC ( colour, "RUNTIME found empty initrd\n" ); - return 0; - } - DBGC ( colour, "RUNTIME found initrd at [%x,%x)\n", - initrd_phys, ( initrd_phys + initrd_len ) ); - - /* Allocate image */ - image = alloc_image ( NULL ); - if ( ! image ) { - DBGC ( colour, "RUNTIME could not allocate image for " - "initrd\n" ); - rc = -ENOMEM; - goto err_alloc_image; - } - if ( ( rc = image_set_name ( image, "<INITRD>" ) ) != 0 ) { - DBGC ( colour, "RUNTIME could not set image name: %s\n", - strerror ( rc ) ); - goto err_set_name; - } - - /* Allocate and copy initrd content */ - image->data = umalloc ( initrd_len ); - if ( ! image->data ) { - DBGC ( colour, "RUNTIME could not allocate %d bytes for " - "initrd\n", initrd_len ); - rc = -ENOMEM; - goto err_umalloc; - } - image->len = initrd_len; - memcpy_user ( image->data, 0, phys_to_user ( initrd_phys ), 0, - initrd_len ); - - /* Mark initrd as consumed */ - initrd_phys = 0; - - /* Register image */ - if ( ( rc = register_image ( image ) ) != 0 ) { - DBGC ( colour, "RUNTIME could not register initrd: %s\n", - strerror ( rc ) ); - goto err_register_image; - } - - /* Drop our reference to the image */ - image_put ( image ); - - return 0; - - err_register_image: - err_umalloc: - err_set_name: - image_put ( image ); - err_alloc_image: - return rc; -} - -/** - * Initialise command line and initrd - * - */ -static void runtime_init ( void ) { - int rc; - - /* Initialise command line */ - if ( ( rc = cmdline_init() ) != 0 ) { - /* No way to report failure */ - return; - } - - /* Initialise initrd */ - if ( ( rc = initrd_init() ) != 0 ) { - /* No way to report failure */ - return; - } -} - -/** Command line and initrd initialisation function */ -struct startup_fn runtime_startup_fn __startup_fn ( STARTUP_NORMAL ) = { - .startup = runtime_init, -}; |