Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Ported palacios to Kbuild
[palacios.git] / bios / vmxassist / head.S
diff --git a/bios/vmxassist/head.S b/bios/vmxassist/head.S
new file mode 100644 (file)
index 0000000..b183fac
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * head.S: VMXAssist runtime start off.
+ *
+ * Leendert van Doorn, leendert@watson.ibm.com
+ * Copyright (c) 2005, International Business Machines Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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.
+ */
+#include "vm86.h"
+#include "machine.h"
+
+/*
+ * When a partition tries to mask off the CR0_PE bit a world
+ * switch happens to the environment below. The magic indicates
+ * that this is a valid context.
+ */
+#ifdef TEST
+       .byte 0x55, 0xaa
+       .byte 0x80
+       .code16
+       jmp     _start16
+#else
+       jmp     _start
+#endif
+
+       .align  8
+       .long   VMXASSIST_MAGIC
+       .long   newctx                  /* new context */
+       .long   oldctx                  /* old context */
+
+#ifdef TEST
+/*
+ * We are running in 16-bit. Get into the protected mode as soon as
+ * possible. We use our own (minimal) GDT to get started.
+ *
+ * ROM is a misnomer as this code isn't really rommable (although it
+ * only requires a few changes) but it does live in a BIOS ROM segment.
+ * This code allows me to debug vmxassists under (a modified version of)
+ * Bochs and load it as a "optromimage1".
+ */
+       .code16
+       .globl  _start16
+_start16:
+        cli
+
+        /* load our own global descriptor table */
+        data32 addr32 lgdt %cs:(rom_gdtr - TEXTADDR)
+
+        /* go to protected mode */
+        movl    %cr0, %eax
+        orl     $CR0_PE, %eax
+        movl    %eax, %cr0
+        data32  ljmp $0x08, $1f
+
+        .align  32
+        .globl  rom_gdt
+rom_gdt:
+        .word   0, 0            /* 0x00: reserved */
+        .byte   0, 0, 0, 0
+
+        .word   0xFFFF, 0       /* 0x08: CS 32-bit */
+        .byte   0, 0x9A, 0xCF, 0
+
+        .word   0xFFFF, 0       /* 0x10: CS 32-bit */
+        .byte   0, 0x92, 0xCF, 0
+rom_gdt_end:
+
+        .align  4
+        .globl  rom_gdtr
+rom_gdtr:
+        .word   rom_gdt_end - rom_gdt - 1
+        .long   rom_gdt
+
+        .code32
+1:
+        /* welcome to the 32-bit world */
+        movw    $0x10, %ax
+        movw    %ax, %ds
+        movw    %ax, %es
+        movw    %ax, %ss
+        movw    %ax, %fs
+        movw    %ax, %gs
+
+        /* enable Bochs debug facilities */
+        movw    $0x8A00, %dx
+        movw    $0x8A00, %ax
+        outw    %ax, (%dx)
+
+       jmp     _start
+#endif /* TEST */
+
+/*
+ * This is the real start. Control was transfered to this point
+ * with CR0_PE set and executing in some 32-bit segment. We call
+ * main and setup our own environment.
+ */
+       .globl  _start
+       .code32
+_start:
+       cli
+
+       /* save register parameters to C land */
+#ifdef TEST
+       xorl    %edx, %edx
+#endif
+
+       /* clear bss */
+       cld
+       xorb    %al, %al
+       movl    $_bbss, %edi
+       movl    $_ebss, %ecx
+       subl    %edi, %ecx
+       rep     stosb
+
+       movl    %edx, booting_cpu
+       movl    %ebx, booting_vector
+
+       /* make sure we are in a sane world */
+       clts
+
+       /* setup my own stack */
+       movl    $stack_top - 4*4, %esp
+       movl    %esp, %ebp
+
+       /* go ... */
+       call    main
+       jmp     halt
+
+/*
+ * Something bad happened, print invoking %eip and loop forever
+ */
+       .align  4
+       .globl  halt
+halt:
+       push    $halt_msg
+       call    printf
+#ifdef TEST
+        movw    $0x8A00, %dx
+        movw    $0x8AE0, %ax
+        outw    %ax, (%dx)
+#endif
+       cli
+       jmp     .
+
+       .data
+halt_msg:
+       .asciz  "Halt called from %%eip 0x%x\n"
+
+
+/*
+ * Our stack
+ */
+       .bss
+       .align  8
+       .globl  stack, stack_top
+stack:
+       .skip   STACK_SIZE
+stack_top:
+