[syslinux:elflink] ldlinux: Add support for Auxillary Data Vector

syslinux-bot for Matt Fleming matt.fleming at linux.intel.com
Fri May 27 17:15:19 PDT 2011


Commit-ID:  565952b9d86d769471d500caab5ebba9bc36c363
Gitweb:     http://syslinux.zytor.com/commit/565952b9d86d769471d500caab5ebba9bc36c363
Author:     Matt Fleming <matt.fleming at linux.intel.com>
AuthorDate: Wed, 25 May 2011 08:39:47 +0100
Committer:  Matt Fleming <matt.fleming at linux.intel.com>
CommitDate: Wed, 25 May 2011 08:44:48 +0100

ldlinux: Add support for Auxillary Data Vector

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 at linux.intel.com>


---
 com32/elflink/ldlinux/Makefile                     |    3 +-
 com32/elflink/ldlinux/adv.c                        |    8 ++-
 com32/{lib/syslinux => elflink/ldlinux}/advwrite.c |    0
 com32/elflink/ldlinux/ldlinux.c                    |   35 ++++++++++-
 com32/{lib/syslinux => elflink/ldlinux}/setadv.c   |    0
 com32/lib/Makefile                                 |    2 -
 com32/lib/syslinux/adv.c                           |   49 --------------
 com32/lib/syslinux/getadv.c                        |   68 --------------------
 core/comboot.inc                                   |    8 ++
 9 files changed, 51 insertions(+), 122 deletions(-)

diff --git a/com32/elflink/ldlinux/Makefile b/com32/elflink/ldlinux/Makefile
index 318b3ac..32780c4 100644
--- a/com32/elflink/ldlinux/Makefile
+++ b/com32/elflink/ldlinux/Makefile
@@ -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
diff --git a/com32/elflink/ldlinux/adv.c b/com32/elflink/ldlinux/adv.c
index be38e89..b81361f 100644
--- a/com32/elflink/ldlinux/adv.c
+++ b/com32/elflink/ldlinux/adv.c
@@ -33,15 +33,21 @@
 
 #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]);
diff --git a/com32/lib/syslinux/advwrite.c b/com32/elflink/ldlinux/advwrite.c
similarity index 100%
rename from com32/lib/syslinux/advwrite.c
rename to com32/elflink/ldlinux/advwrite.c
diff --git a/com32/elflink/ldlinux/ldlinux.c b/com32/elflink/ldlinux/ldlinux.c
index 67f38c0..8b5fd30 100644
--- a/com32/elflink/ldlinux/ldlinux.c
+++ b/com32/elflink/ldlinux/ldlinux.c
@@ -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)
diff --git a/com32/lib/syslinux/setadv.c b/com32/elflink/ldlinux/setadv.c
similarity index 100%
rename from com32/lib/syslinux/setadv.c
rename to com32/elflink/ldlinux/setadv.c
diff --git a/com32/lib/Makefile b/com32/lib/Makefile
index 5d41d7d..10fb4de 100644
--- a/com32/lib/Makefile
+++ b/com32/lib/Makefile
@@ -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
index be38e89..0000000
--- a/com32/lib/syslinux/adv.c
+++ /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
index 5578313..0000000
--- a/com32/lib/syslinux/getadv.c
+++ /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;
-}
diff --git a/core/comboot.inc b/core/comboot.inc
index d6f670c..b0e118a 100644
--- a/core/comboot.inc
+++ b/core/comboot.inc
@@ -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



More information about the Syslinux-commits mailing list