;------------------------------------------------------------------------------ ; @file ; Transition from 16 bit real mode into 32 bit flat protected mode ; ; Copyright (c) 2008 - 2022, Intel Corporation. All rights reserved.
; SPDX-License-Identifier: BSD-2-Clause-Patent ; ;------------------------------------------------------------------------------ %define SEC_DEFAULT_CR0 0x40000023 %define SEC_DEFAULT_CR4 0x640 BITS 16 ; ; Modified: EAX, EBX ; ; @param[out] DS Selector allowing flat access to all addresses ; @param[out] ES Selector allowing flat access to all addresses ; @param[out] FS Selector allowing flat access to all addresses ; @param[out] GS Selector allowing flat access to all addresses ; @param[out] SS Selector allowing flat access to all addresses ; TransitionFromReal16To32BitFlat: debugShowPostCode POSTCODE_16BIT_MODE cli mov bx, 0xf000 mov ds, bx mov bx, ADDR16_OF(gdtr) o32 lgdt [cs:bx] mov eax, SEC_DEFAULT_CR0 mov cr0, eax jmp LINEAR_CODE_SEL:dword ADDR_OF(jumpTo32BitAndLandHere) BITS 32 jumpTo32BitAndLandHere: mov eax, SEC_DEFAULT_CR4 mov cr4, eax debugShowPostCode POSTCODE_32BIT_MODE mov ax, LINEAR_SEL mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax OneTimeCallRet TransitionFromReal16To32BitFlat ALIGN 2 gdtr: dw GDT_END - GDT_BASE - 1 ; GDT limit dd ADDR_OF(GDT_BASE) ALIGN 16 ; ; Macros for GDT entries ; %define PRESENT_FLAG(p) (p << 7) %define DPL(dpl) (dpl << 5) %define SYSTEM_FLAG(s) (s << 4) %define DESC_TYPE(t) (t) ; Type: data, expand-up, writable, accessed %define DATA32_TYPE 3 ; Type: execute, readable, expand-up, accessed %define CODE32_TYPE 0xb ; Type: execute, readable, expand-up, accessed %define CODE64_TYPE 0xb %define GRANULARITY_FLAG(g) (g << 7) %define DEFAULT_SIZE32(d) (d << 6) %define CODE64_FLAG(l) (l << 5) %define UPPER_LIMIT(l) (l) ; ; The Global Descriptor Table (GDT) ; GDT_BASE: ; null descriptor NULL_SEL equ $-GDT_BASE ; Selector [0x0] DW 0 ; limit 15:0 DW 0 ; base 15:0 DB 0 ; base 23:16 DB 0 ; sys flag, dpl, type DB 0 ; limit 19:16, flags DB 0 ; base 31:24 ; Spare segment descriptor SPARE1_SEL equ $-GDT_BASE ; Selector [0x8] DW 0 ; limit 15:0 DW 0 ; base 15:0 DB 0 ; base 23:16 DB 0 ; sys flag, dpl, type DB 0 ; limit 19:16, flags DB 0 ; base 31:24 ; linear code segment descriptor LINEAR_CODE_SEL equ $-GDT_BASE ; Selector [0x10] DW 0xffff ; limit 15:0 DW 0 ; base 15:0 DB 0 ; base 23:16 DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(CODE32_TYPE) ; 09Bh DB GRANULARITY_FLAG(1)|DEFAULT_SIZE32(1)|CODE64_FLAG(0)|UPPER_LIMIT(0xf) ; 0CFh DB 0 ; base 31:24 ; linear data segment descriptor LINEAR_SEL equ $-GDT_BASE ; Selector [0x18] DW 0xffff ; limit 15:0 DW 0 ; base 15:0 DB 0 ; base 23:16 DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(DATA32_TYPE) ; 093h DB GRANULARITY_FLAG(1)|DEFAULT_SIZE32(1)|CODE64_FLAG(0)|UPPER_LIMIT(0xf) ; 0CFh DB 0 ; base 31:24 ; Spare segment descriptor SPARE2_SEL equ $-GDT_BASE ; Selector [0x20] DW 0 ; limit 15:0 DW 0 ; base 15:0 DB 0 ; base 23:16 DB 0 ; sys flag, dpl, type DB 0 ; limit 19:16, flags DB 0 ; base 31:24 ; linear code (16-bit) segment descriptor LINEAR_CODE16_SEL equ $-GDT_BASE ; Selector [0x28] DW 0xffff ; limit 15:0 DW 0 ; base 15:0 DB 0 ; base 23:16 DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(CODE32_TYPE) ; 09Bh DB GRANULARITY_FLAG(1)|DEFAULT_SIZE32(0)|CODE64_FLAG(0)|UPPER_LIMIT(0xf) ; 08Fh DB 0 ; base 31:24 ; linear data (16-bit) segment descriptor LINEAR_DATA16_SEL equ $-GDT_BASE ; Selector [0x30] DW 0xffff ; limit 15:0 DW 0 ; base 15:0 DB 0 ; base 23:16 DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(DATA32_TYPE) ; 093h DB 0 DB 0 ; base 31:24 ; linear code (64-bit) segment descriptor LINEAR_CODE64_SEL equ $-GDT_BASE ; Selector [0x38] DW 0xffff ; limit 15:0 DW 0 ; base 15:0 DB 0 ; base 23:16 DB PRESENT_FLAG(1)|DPL(0)|SYSTEM_FLAG(1)|DESC_TYPE(CODE64_TYPE) ; 09Bh DB GRANULARITY_FLAG(1)|DEFAULT_SIZE32(0)|CODE64_FLAG(1)|UPPER_LIMIT(0xf) ; 0AFh DB 0 ; base 31:24 GDT_END: