diff options
author | H. Peter Anvin <hpa@zytor.com> | 2011-04-25 20:08:32 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2011-04-25 20:25:02 -0700 |
commit | 3953ca3532ca3281cc248f9985d9276c6f8486f0 (patch) | |
tree | a03065fdb9d42e0d60867136b7abe25bbea99732 /com32 | |
parent | 57b7af7df6599a8cdb318d7adeda1cd6fb981626 (diff) | |
download | syslinux-3953ca3532ca3281cc248f9985d9276c6f8486f0.tar.gz |
Generalize ipappend handling as "sysappend", and move to PM code
Generalize the ipappend handling to cover all the derivatives, and
rename it "sysappend" ("ipappend" is a valid alias for all
derivatives.) Move all the string handling to protected mode.
Currently only pxelinux exports strings, but the plan is to change
that in the future.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'com32')
-rw-r--r-- | com32/gfxboot/gfxboot.c | 2 | ||||
-rw-r--r-- | com32/include/syslinux/config.h | 2 | ||||
-rw-r--r-- | com32/include/syslinux/pmapi.h | 3 | ||||
-rw-r--r-- | com32/include/syslinux/sysappend.h | 44 | ||||
-rw-r--r-- | com32/lib/syslinux/ipappend.c | 21 | ||||
-rw-r--r-- | com32/menu/readconfig.c | 2 |
6 files changed, 55 insertions, 19 deletions
diff --git a/com32/gfxboot/gfxboot.c b/com32/gfxboot/gfxboot.c index 35d180a6..6d85518a 100644 --- a/com32/gfxboot/gfxboot.c +++ b/com32/gfxboot/gfxboot.c @@ -393,7 +393,7 @@ int read_config_file(const char *filename) continue; } - if(!strcasecmp(s, "ipappend")) { + if(!strcasecmp(s, "ipappend") || !strcasecmp(s, "sysappend")) { (menu_ptr ?: menu_default)->ipappend = strdup(t); continue; } diff --git a/com32/include/syslinux/config.h b/com32/include/syslinux/config.h index 79a4750e..2481a95b 100644 --- a/com32/include/syslinux/config.h +++ b/com32/include/syslinux/config.h @@ -39,7 +39,7 @@ #include <com32.h> enum syslinux_filesystem { - SYSLINUX_FS_UNKNOWN = 0x30, + SYSLINUX_FS_UNKNOWN = 0x30, SYSLINUX_FS_SYSLINUX = 0x31, SYSLINUX_FS_PXELINUX = 0x32, SYSLINUX_FS_ISOLINUX = 0x33, diff --git a/com32/include/syslinux/pmapi.h b/com32/include/syslinux/pmapi.h index fa390185..e96b8ec0 100644 --- a/com32/include/syslinux/pmapi.h +++ b/com32/include/syslinux/pmapi.h @@ -74,6 +74,9 @@ struct com32_pmapi { /* Should be "const volatile", but gcc miscompiles that sometimes */ volatile uint32_t *jiffies; volatile uint32_t *ms_timer; + + const int sysappend_count; + const char * const *sysappend_strings; }; #endif /* _SYSLINUX_PMAPI_H */ diff --git a/com32/include/syslinux/sysappend.h b/com32/include/syslinux/sysappend.h new file mode 100644 index 00000000..dcc42dcd --- /dev/null +++ b/com32/include/syslinux/sysappend.h @@ -0,0 +1,44 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2011 Intel Corporation; author: H. Peter Anvin + * + * 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/sysappend.h + * + * List of the Syslinux sysappend strings + */ + +#ifndef _SYSLINUX_SYSAPPEND_H +#define _SYSLINUX_SYSAPPEND_H + +enum syslinux_sysappend { + SYSAPPEND_IP, /* PXELINUX: ip= address */ + SYSAPPEND_BOOTIF, /* PXELINUX: BOOTIF= address */ + SYSAPPEND_UUID, /* System UUID from PXE or DMI */ + SYSAPPEND_MAX /* Total number of strings */ +}; + +#endif diff --git a/com32/lib/syslinux/ipappend.c b/com32/lib/syslinux/ipappend.c index bd000920..678a343b 100644 --- a/com32/lib/syslinux/ipappend.c +++ b/com32/lib/syslinux/ipappend.c @@ -1,6 +1,7 @@ /* ----------------------------------------------------------------------- * * * Copyright 2008 H. Peter Anvin - All Rights Reserved + * Copyright 2011 Intel Corporation; author: H. Peter Anvin * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -31,28 +32,16 @@ * Get ipappend strings */ +#include <syslinux/sysappend.h> #include <syslinux/config.h> +#include <syslinux/pmapi.h> #include <klibc/compiler.h> #include <com32.h> struct syslinux_ipappend_strings __syslinux_ipappend_strings; -static const char *syslinux_ipappend_string_list[32]; void __constructor __syslinux_get_ipappend_strings(void) { - static com32sys_t reg; - int i; - - reg.eax.w[0] = 0x000f; - __intcall(0x22, ®, ®); - - if (!(reg.eflags.l & EFLAGS_CF)) { - __syslinux_ipappend_strings.count = reg.ecx.w[0]; - __syslinux_ipappend_strings.ptr = syslinux_ipappend_string_list; - for (i = 0; i < reg.ecx.w[0]; i++) { - syslinux_ipappend_string_list[i] = - MK_PTR(reg.es, - *(uint16_t *) MK_PTR(reg.es, reg.ebx.w[0] + i * 2)); - } - } + __syslinux_ipappend_strings.count = __com32.cs_pm->sysappend_count; + __syslinux_ipappend_strings.ptr = __com32.cs_pm->sysappend_strings; } diff --git a/com32/menu/readconfig.c b/com32/menu/readconfig.c index 0ac2564a..92887058 100644 --- a/com32/menu/readconfig.c +++ b/com32/menu/readconfig.c @@ -1015,7 +1015,7 @@ do_include: m->ontimeout = refstrdup(skipspace(p + 9)); } else if (looking_at(p, "allowoptions")) { m->allowedit = !!atoi(skipspace(p + 12)); - } else if (looking_at(p, "ipappend")) { + } else if (looking_at(p, "ipappend") || looking_at(p, "sysappend")) { if (ld.label) ld.ipappend = atoi(skipspace(p + 8)); else |