summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/include/asm/syslib.h4
-rw-r--r--arch/x86/lib/Makefile1
-rw-r--r--arch/x86/lib/linux_start.S75
3 files changed, 80 insertions, 0 deletions
diff --git a/arch/x86/include/asm/syslib.h b/arch/x86/include/asm/syslib.h
index a1316872c4..eebe1a99c9 100644
--- a/arch/x86/include/asm/syslib.h
+++ b/arch/x86/include/asm/syslib.h
@@ -27,3 +27,7 @@ extern int bios_disk_rw_int13_extensions(int, int, void*) __attribute__((regparm
extern uint16_t bios_get_memsize(void);
#endif
+
+#ifdef CONFIG_CMD_LINUX16
+extern void bios_start_linux(unsigned) __attribute__((regparm(1)));
+#endif
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index 013d369eaa..b67629f115 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -6,3 +6,4 @@ obj-y += gdt.o
obj-$(CONFIG_X86_BIOS_BRINGUP) += memory16.o
obj-$(CONFIG_X86_BIOS_BRINGUP) += traveler.o
obj-$(CONFIG_X86_BIOS_BRINGUP) += bios_disk.o
+obj-$(CONFIG_CMD_LINUX16) += linux_start.o
diff --git a/arch/x86/lib/linux_start.S b/arch/x86/lib/linux_start.S
new file mode 100644
index 0000000000..fac2510d1c
--- /dev/null
+++ b/arch/x86/lib/linux_start.S
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2009 Juergen Beisert, Pengutronix
+ *
+ * Mostly stolen from the GRUB2 project
+ * Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ */
+
+/**
+ * @file
+ * @brief Start the Linux real mode setup code
+ *
+ * Note: These functions are running in flat and real mode. Due to some
+ * other restrictions these routines must running from an address
+ * space below 0x10000
+ */
+
+/*
+ * void bios_start_linux(unsigned segment)
+ *
+ */
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
+ .section .boot.text.bios_start_linux, "ax"
+ .code32
+ .globl bios_start_linux
+ .type bios_start_linux, @function
+
+ .extern prot_to_real
+
+bios_start_linux:
+ /* 'prot_to_real' eats our eax content */
+ movl %eax, %ebx
+ addl $0x20, %eax
+ movw %ax, setup_seg
+
+ call prot_to_real
+
+ .code16
+
+ cli
+ /* all segment registers are using the same segment */
+ movw %bx, %ss
+ movw %bx, %ds
+ movw %bx, %es
+ movw %bx, %fs
+ movw %bx, %gs
+
+ /* stack for the setup code (end of heap) */
+ movw $0x9000, %sp
+
+ /* do an 'ljmp' and never return */
+ .byte 0xea
+ .word 0
+setup_seg:
+ .word 0
+
+ .code32
+
+#endif