;------------------------------------------------------------------------------\r
+; @file\r
+; Transition from 16 bit real mode into 32 bit flat protected mode\r
;\r
-; Copyright (c) 2008, Intel Corporation\r
+; Copyright (c) 2008 - 2009, Intel Corporation\r
; All rights reserved. This program and the accompanying materials\r
; are licensed and made available under the terms and conditions of the BSD License\r
; which accompanies this distribution. The full text of the license may be found at\r
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
;\r
-; Module Name:\r
-;\r
-; 16RealTo32Flat.asm\r
-;\r
-; Abstract:\r
-;\r
-; Transition from 16 bit real mode into 32 bit flat protected mode\r
-;\r
;------------------------------------------------------------------------------\r
\r
%define SEC_DEFAULT_CR0 0x40000023\r
\r
BITS 16\r
\r
-to32BitFlat:\r
+;\r
+; Modified: EAX, EBX\r
+;\r
+TransitionFromReal16To32BitFlat:\r
\r
- writeToSerialPort '1'\r
- writeToSerialPort '6'\r
- writeToSerialPort ' '\r
+ debugShowPostCode POSTCODE_16BIT_MODE\r
\r
cli\r
\r
mov eax, SEC_DEFAULT_CR0\r
mov cr0, eax\r
\r
-; mov eax, cr0\r
-; or al, 1\r
-; mov cr0, eax\r
-\r
jmp LINEAR_CODE_SEL:dword ADDR_OF(jumpTo32BitAndLandHere)\r
BITS 32\r
jumpTo32BitAndLandHere:\r
mov eax, SEC_DEFAULT_CR4\r
mov cr4, eax\r
\r
- writeToSerialPort '3'\r
- writeToSerialPort '2'\r
- writeToSerialPort ' '\r
+ debugShowPostCode POSTCODE_32BIT_MODE\r
\r
- mov ax, LINEAR_SEL\r
- mov ds, ax\r
- mov es, ax\r
- mov fs, ax\r
- mov gs, ax\r
- mov ss, ax\r
+ mov ax, LINEAR_SEL\r
+ mov ds, ax\r
+ mov es, ax\r
+ mov fs, ax\r
+ mov gs, ax\r
+ mov ss, ax\r
\r
- jmp TransitionFrom16RealTo32FlatComplete\r
+ OneTimeCallRet TransitionFromReal16To32BitFlat\r
\r
ALIGN 2\r
\r
GDT_BASE:\r
; null descriptor\r
NULL_SEL equ $-GDT_BASE\r
- dw 0 ; limit 15:0\r
- dw 0 ; base 15:0\r
- db 0 ; base 23:16\r
- db 0 ; type\r
- db 0 ; limit 19:16, flags\r
- db 0 ; base 31:24\r
+ dw 0 ; limit 15:0\r
+ dw 0 ; base 15:0\r
+ db 0 ; base 23:16\r
+ db 0 ; type\r
+ db 0 ; limit 19:16, flags\r
+ db 0 ; base 31:24\r
\r
; linear data segment descriptor\r
LINEAR_SEL equ $-GDT_BASE\r
- dw 0FFFFh ; limit 0xFFFFF\r
- dw 0 ; base 0\r
- db 0\r
- db 092h ; present, ring 0, data, expand-up, writable\r
- db 0CFh ; page-granular, 32-bit\r
- db 0\r
+ dw 0FFFFh ; limit 0xFFFFF\r
+ dw 0 ; base 0\r
+ db 0\r
+ db 092h ; present, ring 0, data, expand-up, writable\r
+ db 0CFh ; page-granular, 32-bit\r
+ db 0\r
\r
; linear code segment descriptor\r
LINEAR_CODE_SEL equ $-GDT_BASE\r
- dw 0FFFFh ; limit 0xFFFFF\r
- dw 0 ; base 0\r
- db 0\r
- db 09Ah ; present, ring 0, data, expand-up, writable\r
- db 0CFh ; page-granular, 32-bit\r
- db 0\r
+ dw 0FFFFh ; limit 0xFFFFF\r
+ dw 0 ; base 0\r
+ db 0\r
+ db 09Ah ; present, ring 0, data, expand-up, writable\r
+ db 0CFh ; page-granular, 32-bit\r
+ db 0\r
\r
; system data segment descriptor\r
SYS_DATA_SEL equ $-GDT_BASE\r
- dw 0FFFFh ; limit 0xFFFFF\r
- dw 0 ; base 0\r
- db 0\r
- db 092h ; present, ring 0, data, expand-up, writable\r
- db 0CFh ; page-granular, 32-bit\r
- db 0\r
+ dw 0FFFFh ; limit 0xFFFFF\r
+ dw 0 ; base 0\r
+ db 0\r
+ db 092h ; present, ring 0, data, expand-up, writable\r
+ db 0CFh ; page-granular, 32-bit\r
+ db 0\r
\r
; system code segment descriptor\r
SYS_CODE_SEL equ $-GDT_BASE\r
- dw 0FFFFh ; limit 0xFFFFF\r
- dw 0 ; base 0\r
- db 0\r
- db 09Ah ; present, ring 0, data, expand-up, writable\r
- db 0CFh ; page-granular, 32-bit\r
- db 0\r
+ dw 0FFFFh ; limit 0xFFFFF\r
+ dw 0 ; base 0\r
+ db 0\r
+ db 09Ah ; present, ring 0, data, expand-up, writable\r
+ db 0CFh ; page-granular, 32-bit\r
+ db 0\r
\r
; spare segment descriptor\r
LINEAR_CODE64_SEL equ $-GDT_BASE\r
- DW -1 ; LimitLow\r
- DW 0 ; BaseLow\r
- DB 0 ; BaseMid\r
+ DW -1 ; LimitLow\r
+ DW 0 ; BaseLow\r
+ DB 0 ; BaseMid\r
DB 9bh\r
- DB 0afh ; LimitHigh (CS.L=1, CS.D=0)\r
- DB 0 ; BaseHigh\r
+ DB 0afh ; LimitHigh (CS.L=1, CS.D=0)\r
+ DB 0 ; BaseHigh\r
\r
; spare segment descriptor\r
SPARE4_SEL equ $-GDT_BASE\r
- dw 0 ; limit 0xFFFFF\r
- dw 0 ; base 0\r
- db 0\r
- db 0 ; present, ring 0, data, expand-up, writable\r
- db 0 ; page-granular, 32-bit\r
- db 0\r
+ dw 0 ; limit 0xFFFFF\r
+ dw 0 ; base 0\r
+ db 0\r
+ db 0 ; present, ring 0, data, expand-up, writable\r
+ db 0 ; page-granular, 32-bit\r
+ db 0\r
\r
; spare segment descriptor\r
SPARE5_SEL equ $-GDT_BASE\r
- dw 0 ; limit 0xFFFFF\r
- dw 0 ; base 0\r
- db 0\r
- db 0 ; present, ring 0, data, expand-up, writable\r
- db 0 ; page-granular, 32-bit\r
- db 0\r
+ dw 0 ; limit 0xFFFFF\r
+ dw 0 ; base 0\r
+ db 0\r
+ db 0 ; present, ring 0, data, expand-up, writable\r
+ db 0 ; page-granular, 32-bit\r
+ db 0\r
\r
GDT_END:\r
\r