summaryrefslogtreecommitdiff
path: root/src/boot.asm
blob: 28d1a89fc0ab92f3c1d3e27872d9e59b541380aa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
bits 16
org 0x7c3e

kernel_sectors equ 64
kernel_segment equ 0x3000

support_flags equ 0x4000
pci_hw_char   equ 0x4001
pci_ver       equ 0x4002
last_pci_bus  equ 0x4004

pci_support equ 0x80
pae_support equ 0x40

  in al, 0x92
  or al, 0x02
  out 0x92, al

  xor ax, ax
  mov ss, ax
  mov sp, 0x7ffc

  mov ah, 0x01
  mov ch, 0x3f
  int 0x10

  mov ax, kernel_segment
  mov es, ax
  mov ax, 0x0200 + kernel_sectors
  xor bx, bx
  mov cx, 0x0002
  xor dh, dh
  int 0x13

  mov ax, 0xb101
  int 0x1a

  cmp edx, 0x20494350
  jne no_pci

  test ah, ah
  jnz no_pci

  mov byte [support_flags], pci_support
  mov byte [pci_hw_char], al
  mov word [pci_ver], bx
  mov byte [last_pci_bus], cl

no_pci:
  mov eax, 1
  cpuid

  test dl, 0x40
  jz no_pae

  or byte [support_flags], pae_support

no_pae:
  mov ax, 0x1000
  mov es, ax
  xor di, di

  mov edx, 0x534d4150
  xor ebx, ebx

mmap_loop:
  mov eax, 0xe820
  mov ecx, 24
  int 0x15

  jc mmap_end
  add di, 24
  test ebx, ebx
  jnz mmap_loop
mmap_end:
  mov word [0x4006], di

  cli

  lgdt [gdt]

  mov eax, cr0
  or al, 0x01
  mov cr0, eax

  jmp 0x10:pmode

bits 32

pmode:
  mov ax, 0x18
  mov ds, ax
  mov ss, ax
  mov esp, 0x00040000

  xor ebp, ebp

  call kernel_segment * 16

halt:
  hlt
  jmp halt

times $$ + 510 - 0x3e - $ - (gdt.e - gdt) db 0

gdt:
  dw .e - .t
  dd .t
.t:
  dq 0x0000_0000_0000_0000;0x00: null
  dq 0x0040_8900_4f98_0068;0x08: tss, 0x4f98
  dq 0x00cf_9a00_0000_ffff;0x10: kernel code
  dq 0x00cf_9200_0000_ffff;0x18: kernel data
  dq 0x00cf_fa00_0000_ffff;0x20: user code
  dq 0x00cf_f200_0000_ffff;0x28: user data
.e:

dw 0xaa55