VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/bootsectors/bootsector-pae.asm@ 67954

Last change on this file since 67954 was 66149, checked in by vboxsync, 8 years ago

Added VBox/bios.h and VBox/bios.mac (generated) and changed the bootsector code to try both the VBox and Bochs shutdown ports.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.1 KB
Line 
1; $Id: bootsector-pae.asm 66149 2017-03-16 22:41:19Z vboxsync $
2;; @file
3; Bootsector that switches the CPU info PAE mode.
4;
5
6;
7; Copyright (C) 2007-2016 Oracle Corporation
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17; The contents of this file may alternatively be used under the terms
18; of the Common Development and Distribution License Version 1.0
19; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20; VirtualBox OSE distribution, in which case the provisions of the
21; CDDL are applicable instead of those of the GPL.
22;
23; You may elect to license modified versions of this file under the
24; terms and conditions of either the GPL or the CDDL or both.
25;
26
27%include "iprt/asmdefs.mac"
28%include "iprt/x86.mac"
29%include "VBox/bios.mac"
30
31
32;; The boot sector load address.
33%define BS_ADDR 0x7c00
34%define PDP_ADDR 0x9000
35%define PD_ADDR 0xa000
36
37
38BITS 16
39start:
40 ; Start with a jump just to follow the convention.
41 jmp short the_code
42 nop
43times 3ah db 0
44
45the_code:
46 cli
47 xor edx, edx
48 mov ds, dx ; Use 0 based addresses
49
50 ;
51 ; Create a paging hierarchy
52 ;
53 mov cx, 4
54 xor esi, esi ; physical address
55 mov ebx, PDP_ADDR
56 mov edi, PD_ADDR
57pdptr_loop:
58 ; The page directory pointer entry.
59 mov dword [ebx], edi
60 or word [bx], X86_PDPE_P
61 mov dword [ebx + 4], edx
62
63 ; The page directory.
64pd_loop:
65 mov dword [edi], esi
66 or word [di], X86_PDE4M_P | X86_PDE4M_RW | X86_PDE4M_PS
67 mov dword [edi + 4], 0
68 add esi, 0x00200000 ; 2MB
69 add di, 8
70 test di, 0fffh
71 jnz pd_loop
72
73 add bx, 8
74 loop pdptr_loop
75
76 ;
77 ; Switch to protected mode.
78 ;
79 lgdt [(gdtr - start) + BS_ADDR]
80 lidt [(idtr_null - start) + BS_ADDR]
81
82 mov eax, PDP_ADDR
83 mov cr3, eax
84
85 mov eax, cr4
86 or eax, X86_CR4_PAE | X86_CR4_PSE
87 mov cr4, eax
88
89 mov eax, cr0
90 or eax, X86_CR0_PE | X86_CR0_PG
91 mov cr0, eax
92 jmp far 0x0008:((code32_start - start) + BS_ADDR) ; 8=32-bit CS
93
94BITS 32
95code32_start:
96 mov ax, 0x10
97 mov ds, ax
98 mov es, ax
99 mov fs, ax
100 mov gs, ax
101 mov ax, 0x18
102 mov es, ax
103 mov esp, 0x80000
104
105 ; eye catchers
106 mov eax, 0xCafeBabe
107 mov ebx, eax
108 mov ecx, eax
109 mov edx, eax
110 mov edi, eax
111 mov esi, eax
112 mov ebp, eax
113
114 ;
115 ; Boch shutdown request.
116 ;
117 mov bl, 64
118 mov dx, VBOX_BIOS_SHUTDOWN_PORT
119 mov ax, VBOX_BIOS_OLD_SHUTDOWN_PORT
120retry:
121 mov ecx, 8
122 mov esi, (szShutdown - start) + BS_ADDR
123 rep outsb
124 xchg dx, ax ; alternate between the new (VBox) and old (Bochs) ports.
125 dec bl
126 jnz retry
127 ; Shutdown failed!
128hlt_again:
129 hlt
130 cli
131 jmp hlt_again
132
133 ;
134 ; The GDT.
135 ;
136align 8, db 0
137gdt:
138 dw 0, 0, 0, 0 ; null selector
139 dw 0xffff, 0, 0x9b00, 0x00cf ; 32 bit flat code segment (0x08)
140 dw 0xffff, 0, 0x9300, 0x00cf ; 32 bit flat data segment (0x10)
141 dw 0xffff, 0, 0x9300, 0x00cf ; 32 bit flat stack segment (0x18)
142
143gdtr:
144 dw 8*4-1 ; limit 15:00
145 dw (gdt - start) + BS_ADDR ; base 15:00
146 db 0 ; base 23:16
147 db 0 ; unused
148
149idtr_null:
150 dw 0 ; limit 15:00
151 dw (gdt - start) + BS_ADDR ; base 15:00
152 db 0 ; base 23:16
153 db 0 ; unused
154
155szShutdown:
156 db 'Shutdown', 0
157
158 ;
159 ; Padd the remainder of the sector with zeros and
160 ; end it with the dos signature.
161 ;
162padding:
163times 510 - (padding - start) db 0
164 db 055h, 0aah
165
166
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette