Skip to content

Commit 104f5b4

Browse files
committed
Enter protected mode before entering long mode
1 parent d31c8d9 commit 104f5b4

File tree

3 files changed

+31
-10
lines changed

3 files changed

+31
-10
lines changed

src/stage_1.s

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ enter_protected_mode:
3434
push ds
3535
push es
3636

37-
lgdt [gdtinfo]
37+
lgdt [gdt32info]
3838

3939
mov eax, cr0
4040
or al, 1 # set protected mode bit
@@ -43,7 +43,7 @@ enter_protected_mode:
4343
jmp protected_mode # tell 386/486 to not crash
4444

4545
protected_mode:
46-
mov bx, 0x8
46+
mov bx, 0x10
4747
mov ds, bx # set data segment
4848
mov es, bx # set extra segment
4949

@@ -183,14 +183,23 @@ no_cpuid_str: .asciz "No CPUID support"
183183
no_int13h_extensions_str: .asciz "No support for int13h extensions"
184184
rest_of_bootloader_load_failed_str: .asciz "Failed to load rest of bootloader"
185185

186-
gdtinfo:
187-
.word gdt_end - gdt - 1 # last byte in table
188-
.word gdt # start of table
186+
gdt32info:
187+
.word gdt32_end - gdt32 - 1 # last byte in table
188+
.word gdt32 # start of table
189189

190-
gdt:
190+
gdt32:
191191
# entry 0 is always unused
192192
.quad 0
193-
flatdesc:
193+
codedesc:
194+
.byte 0xff
195+
.byte 0xff
196+
.byte 0
197+
.byte 0
198+
.byte 0
199+
.byte 0x9a
200+
.byte 0xcf
201+
.byte 0
202+
datadesc:
194203
.byte 0xff
195204
.byte 0xff
196205
.byte 0
@@ -199,7 +208,7 @@ flatdesc:
199208
.byte 0x92
200209
.byte 0xcf
201210
.byte 0
202-
gdt_end:
211+
gdt32_end:
203212

204213
dap: # disk access packet
205214
.byte 0x10 # size of dap

src/stage_2.s

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,16 @@ create_memory_map:
7878
call do_e820
7979

8080
enter_protected_mode_again:
81-
jmp enter_protected_mode_again
81+
cli
82+
lgdt [gdt32info]
83+
mov eax, cr0
84+
or al, 1 # set protected mode bit
85+
mov cr0, eax
8286

87+
push 0x8
8388
lea eax, [stage_3]
84-
jmp eax
89+
push eax
90+
retf
91+
8592
spin32:
8693
jmp spin32

src/stage_3.s

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
no_long_mode_str: .asciz "No long mode support"
66

77
stage_3:
8+
mov bx, 0x10
9+
mov ds, bx # set data segment
10+
mov es, bx # set extra segment
11+
mov ss, bx # set stack segment
12+
813
check_cpu:
914
call check_cpuid
1015
call check_long_mode

0 commit comments

Comments
 (0)