VirtualBox

source: vbox/trunk/src/VBox/Devices/PC/BIOS/pmode.inc@ 49067

Last change on this file since 49067 was 41757, checked in by vboxsync, 13 years ago

BIOS: Load nicer value into DS before exiting PM.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 1.9 KB
Line 
1;; @file
2;; Enter and exit a minimal protected-mode environment.
3;;
4
5;;
6;; Copyright (C) 2004-2011 Oracle Corporation
7;;
8;; This file is part of VirtualBox Open Source Edition (OSE), as
9;; available from http://www.virtualbox.org. This file is free software;
10;; you can redistribute it and/or modify it under the terms of the GNU
11;; General Public License (GPL) as published by the Free Software
12;; Foundation, in version 2 as it comes in the "COPYING" file of the
13;; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14;; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15;;
16
17;; Caveats: May only be called from the F000 segment (16-bit). Does not
18;; switch stacks. Must be run with disabled interrupts(!), any exceptions
19;; will cause a crash. On return from pmode_enter, DS contains a selector
20;; which can address the entire 4GB address space.
21
22public pmode_enter
23public pmode_exit
24public pmbios_gdt_desc
25public pmbios_gdt
26
27pmode_enter proc near
28
29 push cs
30 pop ds
31 .386p
32 lgdt fword ptr [pmbios_gdt_desc]
33 mov eax, cr0
34 or al, 1
35 mov cr0, eax
36; jmp far ptr 20h:really_enter_pm
37 db 0EAh
38 dw really_enter_pm
39 dw 20h
40really_enter_pm:
41 mov ax, 18h
42 mov ds, ax
43 ret
44
45pmode_enter endp
46
47
48pmode_exit proc near
49
50 mov ax, 40h ; Ensure RM limit/attributes
51 mov ds, ax ; (where base = selector << 4)
52
53 mov eax, cr0
54 and al, 0FEh
55 mov cr0, eax
56 .286
57 jmp far ptr really_exit_pm
58really_exit_pm:
59 ret
60
61pmode_exit endp
62
63
64
65pmbios_gdt_desc:
66 dw 40h + 7 ; last selector plus 8 - 1
67 dw pmbios_gdt
68 dw 000Fh
69
70pmbios_gdt:
71 dw 0, 0, 0, 0
72 dw 0, 0, 0, 0
73 dw 0ffffh, 0, 9b00h, 00cfh ; 32-bit code (0x10)
74 dw 0ffffh, 0, 9300h, 00cfh ; 32-bit data (0x18)
75 dw 0ffffh, 0, 9b0fh, 0000h ; 16-bit code, base=0xf0000
76 dw 0ffffh, 0, 9300h, 0000h ; 16-bit data, base=0x0
77 dw 0, 0, 0, 0
78 dw 0, 0, 0, 0
79 dw 0ffffh, 400h, 9300h, 0000h ; 16-bit data, base=0x40
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