/* * 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: