3 ; Copyright (c) 2001,2004 David H. Hovemeyer <daveho@cs.umd.edu>
6 ; This is free software. You are permitted to use,
7 ; redistribute, and modify it as specified in the file "COPYING".
9 ; A lot of this code is adapted from Kernel Toolkit 0.2
10 ; and Linux version 2.2.x, so the following copyrights apply:
12 ; Copyright (C) 1991, 1992 Linus Torvalds
13 ; modified by Drew Eckhardt
14 ; modified by Bruce Evans (bde)
15 ; adapted for Kernel Toolkit by Luigi Sgro
20 ; DON'T EVER INCLUDE CODE AT THE TOP LEVEL AGAIN
28 ; Redefine the data segment so we can access variables
29 ; declared in this file.
39 ; Use int 15h to find out size of extended memory in KB.
40 ; Extended memory is the memory above 1MB. So by
41 ; adding 1MB to this amount, we get the total amount
42 ; of system memory. We can only detect 64MB this way,
43 ; but that's OK for now.
46 ;add ax, 1024 ; 1024 KB == 1 MB
49 add ax, 1024 ; 1024 KB == 1 MB
50 mov [mem_size_kbytes], ax
51 mov [mem_size_eblocks], bx
53 ; Kill the floppy motor.
58 ; Block interrupts, since we can't meaningfully handle them yet
59 ; and we no longer need BIOS services.
62 ; Set up IDT and GDT registers
66 ; Initialize the interrupt controllers, and enable the
71 ; Switch to protected mode!
75 ; Jump to 32 bit code.
76 jmp dword KERNEL_CS:(SETUPSEG << 4) + setup_32
82 ; set up data segment registers
90 ; Create the stack for the initial kernel thread.
91 mov esp, KERN_STACK + 4096
93 ; Build Boot_Info struct on stack.
94 ; Note that we push the fields on in reverse order,
95 ; since the stack grows downwards.
97 mov ax, [(SETUPSEG<<4)+mem_size_kbytes]
99 mov bx, [(SETUPSEG<<4)+mem_size_eblocks]
103 push dword 8 ; bootInfoSize
105 ; Pass pointer to Boot_Info struct as argument to kernel
109 ; Push return address to make this look like a call
111 push dword (SETUPSEG<<4)+.returnAddr
115 ; Far jump into kernel
116 jmp KERNEL_CS:ENTRY_POINT
119 ; We shouldn't return here.
132 ; Kill the floppy motor.
133 ; This code was shamelessly stolen from Linux.
141 ; Initialize master and slave PIC!
143 out 0x20, al ; ICW1 to master
145 out 0xA0, al ; ICW1 to slave
148 out 0x21, al ; ICW2 to master
151 out 0xA1, al ; ICW2 to slave
154 out 0x21, al ; ICW3 to master
157 out 0xA1, al ; ICW3 to slave
160 out 0x21, al ; ICW4 to master
162 out 0xA1, al ; ICW4 to slave
164 mov al, 0xff ; mask all ints in slave
165 out 0xA1, al ; OCW1 to slave
167 mov al, 0xfb ; mask all ints but 2 in master
168 out 0x21, al ; OCW1 to master
172 ; Linux uses this code.
173 ; The idea is that some systems issue port I/O instructions
174 ; faster than the device hardware can deal with them.
179 ; Enable the A20 address line, so we can correctly address
191 ; ----------------------------------------------------------------------
193 ; ----------------------------------------------------------------------
195 mem_size_kbytes: dw 0
196 mem_size_eblocks: dw 0
198 ; ----------------------------------------------------------------------
199 ; The GDT. Creates flat 32-bit address space for the kernel
200 ; code, data, and stack. Note that this GDT is just used
201 ; to create an environment where we can start running 32 bit
202 ; code. The kernel will create and manage its own GDT.
203 ; ----------------------------------------------------------------------
205 ; GDT initialization stuff
206 NUM_GDT_ENTRIES equ 3 ; number of entries in GDT
207 GDT_ENTRY_SZ equ 8 ; size of a single GDT entry
211 ; Descriptor 0 is not used
217 ; Descriptor 1: kernel code segment
218 dw 0xFFFF ; bytes 0 and 1 of segment size
219 dw 0x0000 ; bytes 0 and 1 of segment base address
220 db 0x00 ; byte 2 of segment base address
221 db 0x9A ; present, DPL=0, non-system, code, non-conforming,
222 ; readable, not accessed
223 db 0xCF ; granularity=page, 32 bit code, upper nibble of size
224 db 0x00 ; byte 3 of segment base address
226 ; Descriptor 2: kernel data and stack segment
227 ; NOTE: what Intel calls an "expand-up" segment
228 ; actually means that the stack will grow DOWN,
229 ; towards lower memory. So, we can use this descriptor
230 ; for both data and stack references.
231 dw 0xFFFF ; bytes 0 and 1 of segment size
232 dw 0x0000 ; bytes 0 and 1 of segment base address
233 db 0x00 ; byte 2 of segment base address
234 db 0x92 ; present, DPL=0, non-system, data, expand-up,
235 ; writable, not accessed
236 db 0xCF ; granularity=page, big, upper nibble of size
237 db 0x00 ; byte 3 of segment base address
240 dw NUM_GDT_ENTRIES*GDT_ENTRY_SZ ; limit
241 dd (SETUPSEG<<4) + GDT ; base address