ldlinux: Add support for Auxillary Data Vector
authorMatt Fleming <matt.fleming@linux.intel.com>
Wed, 25 May 2011 07:39:47 +0000 (08:39 +0100)
committerMatt Fleming <matt.fleming@linux.intel.com>
Wed, 25 May 2011 07:44:48 +0000 (08:44 +0100)
Move all the code for the ADV into ldlinux so that it doesn't have any
dependencies on other modules.

We also need a way to initialize the ADV from ldlinux, so add another
vector to the comboot API.

Signed-off-by: Matt Fleming <matt.fleming@linux.intel.com>
com32/elflink/ldlinux/Makefile
com32/elflink/ldlinux/adv.c
com32/elflink/ldlinux/advwrite.c [moved from com32/lib/syslinux/advwrite.c with 100% similarity]
com32/elflink/ldlinux/ldlinux.c
com32/elflink/ldlinux/setadv.c [moved from com32/lib/syslinux/setadv.c with 100% similarity]
com32/lib/Makefile
com32/lib/syslinux/adv.c [deleted file]
com32/lib/syslinux/getadv.c [deleted file]
core/comboot.inc

index 318b3ac..32780c4 100644 (file)
@@ -19,7 +19,8 @@ CFLAGS += -I$(topdir)/core/elflink -I$(topdir)/core/include
 all: ldlinux.c32 ldlinux_lnx.a
 
 ldlinux.c32 : ldlinux.o cli.o readconfig.o refstr.o colors.o getadv.o \
-               adv.o ipappend.o execute.o kernel.o get_key.o 
+               adv.o ipappend.o execute.o kernel.o get_key.o \
+               advwrite.o setadv.o
        $(LD) $(LDFLAGS) -o $@ $^
 
 LNXLIBOBJS = get_key.lo
index be38e89..b81361f 100644 (file)
 
 #include <syslinux/adv.h>
 #include <klibc/compiler.h>
+#include <inttypes.h>
 #include <com32.h>
 
 void *__syslinux_adv_ptr;
 size_t __syslinux_adv_size;
 
-void __constructor __syslinux_get_adv(void)
+extern void adv_init(void);
+void __constructor __syslinux_init(void)
 {
     static com32sys_t reg;
 
+    /* Initialize the ADV structure */
+    reg.eax.w[0] = 0x0025;
+    __intcall(0x22, &reg, NULL);
+
     reg.eax.w[0] = 0x001c;
     __intcall(0x22, &reg, &reg);
     __syslinux_adv_ptr = MK_PTR(reg.es, reg.ebx.w[0]);
index 67f38c0..8b5fd30 100644 (file)
@@ -7,6 +7,7 @@
 #include "com32.h"
 #include "menu.h"
 #include "config.h"
+#include "syslinux/adv.h"
 
 #include <sys/module.h>
 
@@ -103,11 +104,43 @@ static void enter_cmdline(void)
 
 int main(int argc, char **argv)
 {
+       com32sys_t ireg, oreg;
+       uint8_t *adv;
+       int count = 0;
+
        openconsole(&dev_rawcon_r, &dev_ansiserial_w);
 
        parse_configs(NULL);
 
-       /* TODO: ADV */
+       __syslinux_init();
+       adv = syslinux_getadv(ADV_BOOTONCE, &count);
+       if (adv && count) {
+               /*
+                * We apparently have a boot-once set; clear it and
+                * then execute the boot-once.
+                */
+               uint8_t *src, *dst, *cmdline;
+               int i;
+
+               src = adv;
+               cmdline = dst = malloc(count + 1);
+               if (!dst) {
+                       printf("Failed to allocate memory for ADV\n");
+                       goto cmdline;
+               }
+
+               for (i = 0; i < count; i++)
+                       *dst++ = *src++;
+               *dst = '\0';    /* Null-terminate */
+
+               /* Clear the boot-once data from the ADV */
+               if (!syslinux_setadv(ADV_BOOTONCE, 0, NULL))
+                       syslinux_adv_write();
+
+               load_kernel(cmdline); /* Shouldn't return */
+               goto cmdline;
+       }
+
        /* TODO: Check KbdFlags? */
 
        if (forceprompt)
index 5d41d7d..10fb4de 100644 (file)
@@ -50,8 +50,6 @@ LIBSYSLINUX_OBJS = \
        syslinux/ipappend.o syslinux/dsinfo.o syslinux/version.o        \
        syslinux/pxe_get_cached.o syslinux/pxe_get_nic.o                \
        syslinux/pxe_dns.o                                              \
-       syslinux/adv.o syslinux/advwrite.o syslinux/getadv.o            \
-       syslinux/setadv.o                                               \
        syslinux/video/fontquery.o syslinux/video/forcetext.o           \
        syslinux/video/reportmode.o
 
diff --git a/com32/lib/syslinux/adv.c b/com32/lib/syslinux/adv.c
deleted file mode 100644 (file)
index be38e89..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* ----------------------------------------------------------------------- *
- *
- *   Copyright 2007-2008 H. Peter Anvin - All Rights Reserved
- *
- *   Permission is hereby granted, free of charge, to any person
- *   obtaining a copy of this software and associated documentation
- *   files (the "Software"), to deal in the Software without
- *   restriction, including without limitation the rights to use,
- *   copy, modify, merge, publish, distribute, sublicense, and/or
- *   sell copies of the Software, and to permit persons to whom
- *   the Software is furnished to do so, subject to the following
- *   conditions:
- *
- *   The above copyright notice and this permission notice shall
- *   be included in all copies or substantial portions of the Software.
- *
- *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *   OTHER DEALINGS IN THE SOFTWARE.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * syslinux/adv.c
- *
- * Access the syslinux auxilliary data vector
- */
-
-#include <syslinux/adv.h>
-#include <klibc/compiler.h>
-#include <com32.h>
-
-void *__syslinux_adv_ptr;
-size_t __syslinux_adv_size;
-
-void __constructor __syslinux_get_adv(void)
-{
-    static com32sys_t reg;
-
-    reg.eax.w[0] = 0x001c;
-    __intcall(0x22, &reg, &reg);
-    __syslinux_adv_ptr = MK_PTR(reg.es, reg.ebx.w[0]);
-    __syslinux_adv_size = reg.ecx.w[0];
-}
diff --git a/com32/lib/syslinux/getadv.c b/com32/lib/syslinux/getadv.c
deleted file mode 100644 (file)
index 5578313..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/* ----------------------------------------------------------------------- *
- *
- *   Copyright 2007-2008 H. Peter Anvin - All Rights Reserved
- *
- *   Permission is hereby granted, free of charge, to any person
- *   obtaining a copy of this software and associated documentation
- *   files (the "Software"), to deal in the Software without
- *   restriction, including without limitation the rights to use,
- *   copy, modify, merge, publish, distribute, sublicense, and/or
- *   sell copies of the Software, and to permit persons to whom
- *   the Software is furnished to do so, subject to the following
- *   conditions:
- *
- *   The above copyright notice and this permission notice shall
- *   be included in all copies or substantial portions of the Software.
- *
- *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- *   OTHER DEALINGS IN THE SOFTWARE.
- *
- * ----------------------------------------------------------------------- */
-
-/*
- * syslinux/getadv.c
- *
- * Get a data item from the auxilliary data vector.  Returns a pointer
- * and sets *size on success; NULL on failure.
- */
-
-#include <syslinux/adv.h>
-#include <klibc/compiler.h>
-#include <inttypes.h>
-
-const void *syslinux_getadv(int tag, size_t * size)
-{
-    const uint8_t *p;
-    size_t left;
-
-    p = syslinux_adv_ptr();
-    left = syslinux_adv_size();
-
-    while (left >= 2) {
-       uint8_t ptag = *p++;
-       size_t plen = *p++;
-       left -= 2;
-
-       if (ptag == ADV_END)
-           return NULL;        /* Not found */
-
-       if (left < plen)
-           return NULL;        /* Item overrun */
-
-       if (ptag == tag) {
-           *size = plen;
-           return p;
-       }
-
-       p += plen;
-       left -= plen;
-    }
-
-    return NULL;
-}
index d6f670c..b0e118a 100644 (file)
@@ -915,6 +915,13 @@ comapi_shufraw:
                mov ecx,P_ECX
                jmp shuffle_and_boot_raw
 
+;
+; INT 22h AX=0025h     Initialize the ADV structure
+;
+comapi_initadv:
+               call adv_init
+               ret
+
                section .data16
 
 %macro         int21 2
@@ -974,6 +981,7 @@ int22_table:
                dw comapi_err           ; 0022 close directory
                dw comapi_shufsize      ; 0023 query shuffler size
                dw comapi_shufraw       ; 0024 cleanup, shuffle and boot raw
+               dw comapi_initadv       ; 0025 initialize adv structure
 int22_count    equ ($-int22_table)/2
 
 APIKeyWait     db 0