+++ /dev/null
-/*
- * 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:
-