4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Transition from 16 bit real mode into 32 bit flat protected mode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define SEC_DEFAULT_CR0 0x40000023
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define SEC_DEFAULT_CR4 0x640
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBITS 16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Modified: EAX, EBX
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTransitionFromReal16To32BitFlat:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync debugShowPostCode POSTCODE_16BIT_MODE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cli
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov bx, 0xf000
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ds, bx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov bx, ADDR16_OF(gdtr)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynco32 lgdt [cs:bx]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov eax, SEC_DEFAULT_CR0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov cr0, eax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%ifdef __YASM__ ; VBox
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jmp dword LINEAR_CODE_SEL:ADDR_OF(jumpTo32BitAndLandHere)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jmp LINEAR_CODE_SEL:dword ADDR_OF(jumpTo32BitAndLandHere)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBITS 32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncjumpTo32BitAndLandHere:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov eax, SEC_DEFAULT_CR4
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov cr4, eax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync debugShowPostCode POSTCODE_32BIT_MODE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ax, LINEAR_SEL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ds, ax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov es, ax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov fs, ax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov gs, ax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ss, ax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneTimeCallRet TransitionFromReal16To32BitFlat
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncALIGN 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncgdtr:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dw GDT_END - GDT_BASE - 1 ; GDT limit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dd ADDR_OF(GDT_BASE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncALIGN 16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Macros for GDT entries
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define PRESENT_FLAG(p) (p << 7)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define DPL(dpl) (dpl << 5)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define SYSTEM_FLAG(s) (s << 4)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define DESC_TYPE(t) (t)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Type: data, expand-up, writable, accessed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define DATA32_TYPE 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Type: execute, readable, expand-up, accessed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define CODE32_TYPE 0xb
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Type: execute, readable, expand-up, accessed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define CODE64_TYPE 0xb
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define GRANULARITY_FLAG(g) (g << 7)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define DEFAULT_SIZE32(d) (d << 6)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define CODE64_FLAG(l) (l << 5)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define UPPER_LIMIT(l) (l)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; The Global Descriptor Table (GDT)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGDT_BASE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; null descriptor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNULL_SEL equ $-GDT_BASE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DW 0 ; limit 15:0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DW 0 ; base 15:0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB 0 ; base 23:16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB 0 ; sys flag, dpl, type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB 0 ; limit 19:16, flags
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB 0 ; base 31:24
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; linear data segment descriptor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLINEAR_SEL equ $-GDT_BASE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DW 0xffff ; limit 15:0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DW 0 ; base 15:0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB 0 ; base 23:16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(DATA32_TYPE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB GRANULARITY_FLAG(1)|DEFAULT_SIZE32(1)|CODE64_FLAG(0)|UPPER_LIMIT(0xf)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB 0 ; base 31:24
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; linear code segment descriptor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLINEAR_CODE_SEL equ $-GDT_BASE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DW 0xffff ; limit 15:0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DW 0 ; base 15:0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB 0 ; base 23:16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(CODE32_TYPE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB GRANULARITY_FLAG(1)|DEFAULT_SIZE32(1)|CODE64_FLAG(0)|UPPER_LIMIT(0xf)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB 0 ; base 31:24
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%ifdef ARCH_X64
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; linear code (64-bit) segment descriptor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLINEAR_CODE64_SEL equ $-GDT_BASE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DW 0xffff ; limit 15:0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DW 0 ; base 15:0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB 0 ; base 23:16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(CODE64_TYPE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB GRANULARITY_FLAG(1)|DEFAULT_SIZE32(0)|CODE64_FLAG(1)|UPPER_LIMIT(0xf)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DB 0 ; base 31:24
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGDT_END:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync