* bootstub version 0.01
diff --git a/head.S b/head.S
new file mode 100644
index 0000000..7431584
--- /dev/null
+++ b/head.S
@@ -0,0 +1,58 @@
+/* head.S for bootstub to load protected mode kernel
+ * Copyright (C) 2008 Alek Du <[email protected]>
+ *
+ * Note. When FW hand-off control to bootstub, the CPU is already in protected
+ * Mode with 1. GDT(8)=4G GDT(10)=4G
+ * 2. CS=8, DS=ES=FS=GS=10
+ * 3. Paging mode disabled
+ * 4. Interrupt ENABLED
+ */
+
+/* When bootstub get control, the memory map in DRAM is like:
+ * ~ ~
+ * 0x102000 | initramfs |
+ *+bzImage size +-----------------------+
+ * | bzImage |
+ * 0x102000 +-----------------------+
+ * | boot stub |
+ * 0x101000 +-----------------------+
+ * | free space |
+ * | used as stack |
+ * 0x100100 +-----------------------+
+ * | kernel cmdline |
+ * 0x100000 +-----------------------+
+*/
+
+#include "bootstub.h"
+
+.text
+
+.section ".text.head","ax",@progbits
+ .globl _start
+
+_start:
+ cld
+ cli
+ /* DS=ES=FS=GS=10 */
+ movl 0x2, %eax
+ movl %eax, %ds
+ movl %eax, %es
+ movl %eax, %fs
+ movl %eax, %gs
+ movl %eax, %ss
+ /* setup stack, because we are heading off to "C" */
+ movl $STACK_OFFSET, %esp
+ /* after call main, GDT was set (0x10 and 0x18) IDT was clear
+ * eax will store 32bit entry of bzImage
+ */
+ calll main
+ ljmp $__BOOT_CS,$1f
+1:
+ /* tell kernel where is boot_param */
+ movl $(BOOT_PARAMS_OFFSET), %esi
+ xor %ebp, %ebp
+ xor %edi, %edi
+ xor %ebx, %ebx
+
+ jmpl *%eax # Jump to the 32-bit entrypoint
+