aboutsummaryrefslogtreecommitdiffstats
path: root/com32
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2007-03-14 21:50:36 -0700
committerH. Peter Anvin <hpa@zytor.com>2007-03-14 21:50:36 -0700
commita80b07e7fb8feec668a435101659e3ed94015a23 (patch)
treee756f82c2156a7d1a813d142a2541b696004a153 /com32
parentab6acefe649751b072fd9be21ff5de7733c1370e (diff)
downloadsyslinux-a80b07e7fb8feec668a435101659e3ed94015a23.tar.gz
syslinux-a80b07e7fb8feec668a435101659e3ed94015a23.tar.xz
syslinux-a80b07e7fb8feec668a435101659e3ed94015a23.zip
Add a register-setting shuffle and boot for real mode; clean up headers.syslinux-3.40-pre14
- Add an API function to shuffle and boot which sets *all* RM registers; - Move those structures to <syslinux/bootpm.h> and <syslinux/bootrm.h>
Diffstat (limited to 'com32')
-rw-r--r--com32/include/com32.h2
-rw-r--r--com32/include/syslinux/bootpm.h53
-rw-r--r--com32/include/syslinux/bootrm.h66
-rw-r--r--com32/include/syslinux/movebits.h11
-rw-r--r--com32/lib/syslinux/shuffle_pm.c1
-rw-r--r--com32/lib/syslinux/shuffle_rm.c18
-rw-r--r--com32/modules/elf.c1
7 files changed, 136 insertions, 16 deletions
diff --git a/com32/include/com32.h b/com32/include/com32.h
index 16cd792b..f1df2d61 100644
--- a/com32/include/com32.h
+++ b/com32/include/com32.h
@@ -39,7 +39,7 @@ typedef struct {
reg32_t edi; /* Offset 8 */
reg32_t esi; /* Offset 12 */
reg32_t ebp; /* Offset 16 */
- reg32_t _unused; /* Offset 20 */
+ reg32_t _unused_esp; /* Offset 20 */
reg32_t ebx; /* Offset 24 */
reg32_t edx; /* Offset 28 */
reg32_t ecx; /* Offset 32 */
diff --git a/com32/include/syslinux/bootpm.h b/com32/include/syslinux/bootpm.h
new file mode 100644
index 00000000..6064ea96
--- /dev/null
+++ b/com32/include/syslinux/bootpm.h
@@ -0,0 +1,53 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2007 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/bootpm.h
+ *
+ * Data structures for shuffle and boot to protected mode
+ */
+
+#ifndef _SYSLINUX_BOOTPM_H
+#define _SYSLINUX_BOOTPM_H
+
+#include <stdint.h>
+
+struct syslinux_pm_regs {
+ uint32_t eax; /* Offset 0 */
+ uint32_t ecx; /* Offset 4 */
+ uint32_t edx; /* Offset 8 */
+ uint32_t ebx; /* Offset 12 */
+ uint32_t esp; /* Offset 16 */
+ uint32_t ebp; /* Offset 20 */
+ uint32_t esi; /* Offset 24 */
+ uint32_t edi; /* Offset 28 */
+
+ uint32_t eip; /* Offset 32 */
+};
+
+#endif /* _SYSLINUX_BOOTPM_H */
+
diff --git a/com32/include/syslinux/bootrm.h b/com32/include/syslinux/bootrm.h
new file mode 100644
index 00000000..d7df9fae
--- /dev/null
+++ b/com32/include/syslinux/bootrm.h
@@ -0,0 +1,66 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2007 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/bootrm.h
+ *
+ * Data structures for shuffle and boot to protected mode
+ */
+
+#ifndef _SYSLINUX_BOOTRM_H
+#define _SYSLINUX_BOOTRM_H
+
+#include <stdint.h>
+#include <com32.h>
+
+/* This register set is used by the shuffle and boot interface. It is
+ a completely different structure from what the __intcall() and
+ __farcall() interfaces use! */
+struct syslinux_rm_regs {
+ uint16_t es; /* Offset 0 */
+ uint16_t _unused_cs; /* Offset 2 */
+ uint16_t ds; /* Offset 4 */
+ uint16_t ss; /* Offset 6 */
+ uint16_t fs; /* Offset 8 */
+ uint16_t gs; /* Offset 10 */
+
+ reg32_t eax; /* Offset 12 */
+ reg32_t ecx; /* Offset 16 */
+ reg32_t edx; /* Offset 20 */
+ reg32_t ebx; /* Offset 24 */
+ reg32_t esp; /* Offset 28 */
+ reg32_t ebp; /* Offset 32 */
+ reg32_t esi; /* Offset 36 */
+ reg32_t edi; /* Offset 40 */
+
+ uint16_t ip; /* Offset 44 */
+ uint16_t cs; /* Offset 46 */
+};
+
+
+#endif /* _SYSLINUX_BOOTRM_H */
+
diff --git a/com32/include/syslinux/movebits.h b/com32/include/syslinux/movebits.h
index 3a03c622..60fcebd7 100644
--- a/com32/include/syslinux/movebits.h
+++ b/com32/include/syslinux/movebits.h
@@ -43,11 +43,9 @@ struct syslinux_memmap {
};
-struct syslinux_pm_regs {
- uint32_t eax, ecx, edx, ebx;
- uint32_t esp, ebp, esi, edi;
- uint32_t eip;
-};
+/* Defined in <syslinux/bootpm.h> and <syslinux/bootrm.h> respectively */
+struct syslinux_pm_regs;
+struct syslinux_rm_regs;
/*
* moves is computed from "fraglist" and "memmap". Areas that are
@@ -70,8 +68,7 @@ int syslinux_prepare_shuffle(struct syslinux_movelist *fraglist,
int syslinux_shuffle_boot_rm(struct syslinux_movelist *fraglist,
struct syslinux_memmap *memmap,
uint16_t bootflags,
- uint32_t edx, uint32_t esi, uint16_t ds,
- uint16_t cs, uint16_t ip);
+ struct syslinux_rm_regs *regs);
int syslinux_shuffle_boot_pm(struct syslinux_movelist *fraglist,
struct syslinux_memmap *memmap,
uint16_t bootflags,
diff --git a/com32/lib/syslinux/shuffle_pm.c b/com32/lib/syslinux/shuffle_pm.c
index f8af66ad..c49ff917 100644
--- a/com32/lib/syslinux/shuffle_pm.c
+++ b/com32/lib/syslinux/shuffle_pm.c
@@ -36,6 +36,7 @@
#include <com32.h>
#include <string.h>
#include <syslinux/movebits.h>
+#include <syslinux/bootpm.h>
int syslinux_shuffle_boot_pm(struct syslinux_movelist *fraglist,
struct syslinux_memmap *memmap,
diff --git a/com32/lib/syslinux/shuffle_rm.c b/com32/lib/syslinux/shuffle_rm.c
index e676e1dd..e87028aa 100644
--- a/com32/lib/syslinux/shuffle_rm.c
+++ b/com32/lib/syslinux/shuffle_rm.c
@@ -28,7 +28,7 @@
/*
* shuffle_rm.c
*
- * Shuffle and boot to real mode code
+ * Shuffle and boot to protected mode code
*/
#include <stdlib.h>
@@ -36,31 +36,33 @@
#include <com32.h>
#include <string.h>
#include <syslinux/movebits.h>
+#include <syslinux/bootrm.h>
int syslinux_shuffle_boot_rm(struct syslinux_movelist *fraglist,
struct syslinux_memmap *memmap,
uint16_t bootflags,
- uint32_t edx, uint32_t esi, uint16_t ds,
- uint16_t cs, uint16_t ip)
+ struct syslinux_rm_regs *regs)
{
int nd;
com32sys_t ireg;
+ char *regbuf;
nd = syslinux_prepare_shuffle(fraglist, memmap);
if (nd < 0)
return -1;
+ regbuf = (char *)__com32.cs_bounce + (12*nd);
+ memcpy(regbuf, regs, sizeof(*regs));
+
memset(&ireg, 0, sizeof ireg);
- ireg.eax.w[0] = 0x0012;
+ ireg.eax.w[0] = 0x001b;
ireg.edx.w[0] = bootflags;
ireg.es = SEG(__com32.cs_bounce);
ireg.edi.l = OFFS(__com32.cs_bounce);
ireg.ecx.l = nd;
- ireg.ebx.l = edx;
- ireg.esi.l = esi;
- ireg.ds = ds;
- ireg.ebp.l = (cs << 16) + ip;
+ ireg.ds = SEG(regbuf);
+ ireg.esi.l = OFFS(regbuf);
__intcall(0x22, &ireg, NULL);
return -1; /* Too many descriptors? */
diff --git a/com32/modules/elf.c b/com32/modules/elf.c
index a049bc83..bdbf6e5d 100644
--- a/com32/modules/elf.c
+++ b/com32/modules/elf.c
@@ -44,6 +44,7 @@
#include <syslinux/loadfile.h>
#include <syslinux/movebits.h>
+#include <syslinux/bootpm.h>
/* If we don't have this much memory for the stack, signal failure */
#define MIN_STACK 512