aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--com32/elflink/ldlinux/Makefile3
-rw-r--r--com32/elflink/ldlinux/adv.c8
-rw-r--r--com32/elflink/ldlinux/advwrite.c (renamed from com32/lib/syslinux/advwrite.c)0
-rw-r--r--com32/elflink/ldlinux/ldlinux.c35
-rw-r--r--com32/elflink/ldlinux/setadv.c (renamed from com32/lib/syslinux/setadv.c)0
-rw-r--r--com32/lib/Makefile2
-rw-r--r--com32/lib/syslinux/adv.c49
-rw-r--r--com32/lib/syslinux/getadv.c68
-rw-r--r--core/comboot.inc8
9 files changed, 51 insertions, 122 deletions
diff --git a/com32/elflink/ldlinux/Makefile b/com32/elflink/ldlinux/Makefile
index 318b3ac4..32780c49 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 be38e89d..b81361f2 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
index 4152eea5..4152eea5 100644
--- a/com32/lib/syslinux/advwrite.c
+++ b/com32/elflink/ldlinux/advwrite.c
diff --git a/com32/elflink/ldlinux/ldlinux.c b/com32/elflink/ldlinux/ldlinux.c
index 67f38c0d..8b5fd301 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
index 40f00a4e..40f00a4e 100644
--- a/com32/lib/syslinux/setadv.c
+++ b/com32/elflink/ldlinux/setadv.c
diff --git a/com32/lib/Makefile b/com32/lib/Makefile
index 5d41d7d9..10fb4deb 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 be38e89d..00000000
--- 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 5578313e..00000000
--- 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 d6f670c9..b0e118ad 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