[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, ®, NULL);
+
reg.eax.w[0] = 0x001c;
__intcall(0x22, ®, ®);
__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, ®, ®);
- __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