aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Brown <mcb30@etherboot.org>2009-02-24 05:51:21 +0000
committerMichael Brown <mcb30@etherboot.org>2009-02-24 05:57:56 +0000
commit4f3bab1a55359a2623e098a6ed61e8d82145af77 (patch)
tree9f12c983dd2846d5b5f2d0598d928db9add7c51b /src
parent43834f5d25273054679cb67ba7a5870f99b874b4 (diff)
downloadipxe-4f3bab1a55359a2623e098a6ed61e8d82145af77.zip
ipxe-4f3bab1a55359a2623e098a6ed61e8d82145af77.tar.gz
ipxe-4f3bab1a55359a2623e098a6ed61e8d82145af77.tar.bz2
[image] Allow for zero embedded images
Having a default script containing #!gpxe autoboot can cause problems when entering commands to load and start a kernel manually; the default script image will still be present when the kernel is started and so will be treated as an initrd. It is possible to work around this by typing "imgfree" before any other commands, but this is counter-intuitive. Fix by allowing the embedded image list to be empty (in which case we just call autoboot()), and making this the default. Reported by alkisg@gmail.com.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.housekeeping4
-rw-r--r--src/core/main.c16
-rw-r--r--src/hci/commands/image_cmd.c8
-rw-r--r--src/image/default.gpxe2
-rw-r--r--src/image/embedded.c13
-rw-r--r--src/include/gpxe/image.h9
6 files changed, 32 insertions, 20 deletions
diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping
index 2146d9c..2ab842e 100644
--- a/src/Makefile.housekeeping
+++ b/src/Makefile.housekeeping
@@ -286,10 +286,6 @@ CFLAGS += $(EXTRA_CFLAGS)
ASFLAGS += $(EXTRA_ASFLAGS)
LDFLAGS += $(EXTRA_LDFLAGS)
-# Embedded image(s), or default if not set
-#
-EMBEDDED_IMAGE = image/default.gpxe
-
# Inhibit -Werror if NO_WERROR is specified on make command line
#
ifneq ($(NO_WERROR),1)
diff --git a/src/core/main.c b/src/core/main.c
index 8d360c4..bd2428f 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -71,13 +71,17 @@ __asmcall int main ( void ) {
shell();
} else {
/* User doesn't want shell; load and execute the first
- * image. If booting fails (i.e. if the image
- * returns, or fails to execute), offer a second
- * chance to enter the shell for diagnostics.
+ * image, or autoboot() if we have no images. If
+ * booting fails for any reason, offer a second chance
+ * to enter the shell for diagnostics.
*/
- for_each_image ( image ) {
- image_exec ( image );
- break;
+ if ( have_images() ) {
+ for_each_image ( image ) {
+ image_exec ( image );
+ break;
+ }
+ } else {
+ autoboot();
}
if ( shell_banner() )
diff --git a/src/hci/commands/image_cmd.c b/src/hci/commands/image_cmd.c
index befa5a6..6d8b590 100644
--- a/src/hci/commands/image_cmd.c
+++ b/src/hci/commands/image_cmd.c
@@ -222,13 +222,13 @@ static int kernel_exec ( int argc, char **argv ) {
}
/**
- * The "imgauto" command
+ * The "chain" command
*
* @v argc Argument count
* @v argv Argument list
* @ret rc Exit code
*/
-static int imgauto_exec ( int argc, char **argv) {
+static int chain_exec ( int argc, char **argv) {
int rc;
if ( ( rc = imgfetch_core_exec ( NULL, IMG_EXEC, argc, argv ) ) != 0 )
@@ -563,8 +563,8 @@ struct command image_commands[] __command = {
.exec = kernel_exec,
},
{
- .name = "imgauto",
- .exec = imgauto_exec,
+ .name = "chain",
+ .exec = chain_exec,
},
{
.name = "imgload",
diff --git a/src/image/default.gpxe b/src/image/default.gpxe
deleted file mode 100644
index 0b080b5..0000000
--- a/src/image/default.gpxe
+++ /dev/null
@@ -1,2 +0,0 @@
-#!gpxe
-autoboot
diff --git a/src/image/embedded.c b/src/image/embedded.c
index f76ca11..4f76357 100644
--- a/src/image/embedded.c
+++ b/src/image/embedded.c
@@ -16,7 +16,8 @@
*
* @v refcnt Reference counter
*/
-static void embedded_image_free ( struct refcnt *refcnt __unused ) {
+static void __attribute__ (( unused ))
+embedded_image_free ( struct refcnt *refcnt __unused ) {
/* Do nothing */
}
@@ -51,14 +52,18 @@ static struct image embedded_images[] = {
* Register all embedded images
*/
static void embedded_init ( void ) {
- unsigned int i;
+ int i;
struct image *image;
void *data;
int rc;
+ /* Skip if we have no embedded images */
+ if ( ! sizeof ( embedded_images ) )
+ return;
+
/* Fix up data pointers and register images */
- for ( i = 0 ; i < ( sizeof ( embedded_images ) /
- sizeof ( embedded_images[0] ) ) ; i++ ) {
+ for ( i = 0 ; i < ( int ) ( sizeof ( embedded_images ) /
+ sizeof ( embedded_images[0] ) ) ; i++ ) {
image = &embedded_images[i];
/* virt_to_user() cannot be used in a static
diff --git a/src/include/gpxe/image.h b/src/include/gpxe/image.h
index f8b1482..b953e15 100644
--- a/src/include/gpxe/image.h
+++ b/src/include/gpxe/image.h
@@ -133,6 +133,15 @@ extern struct list_head images;
#define for_each_image( image ) \
list_for_each_entry ( (image), &images, list )
+/**
+ * Test for existence of images
+ *
+ * @ret existence Some images exist
+ */
+static inline int have_images ( void ) {
+ return ( ! list_empty ( &images ) );
+}
+
extern struct image * alloc_image ( void );
extern int image_set_uri ( struct image *image, struct uri *uri );
extern int image_set_cmdline ( struct image *image, const char *cmdline );