|
From: <wol...@us...> - 2002-08-25 11:47:52
|
Update of /cvsroot/subtrick/TiTan/src/boot/kernelinit
In directory usw-pr-cvs1:/tmp/cvs-serv21464/src/boot/kernelinit
Added Files:
kernelinit.asm
Log Message:
Changed System To Protected Mode
Detecting 386 Processor
Detecting Physical Memory
Opening the A20 Gate
--- NEW FILE: kernelinit.asm ---
; kernelinit : kernel initialization file or as we can say system
; initialization file
;
; Contains : Checking +386 Processor : Amgad Madkour
; Changing System to protected mode : Amgad Madkour
; Opening A20 Gate : Amgad Madkour
; Code Heirarchy And On Screen Printing : Ayman El Sayed
; Detecting Physical Memory : Ayman El Sayed
; OS Stack Setting : Ayman El Sayed
;
; Assembler : Nasm (Netwide Assembler)
; Links : Sloader (Secondary Loader)
; Part Of The TiTan OS Project
; Reference : Intel Programming Reference (Found On The TiTan Web Site)
; Christopher Geise "Protected Mode" (Found On TiTan Web Site)
%include "kernelinit.s"
jmp SEG_KINIT:kstart
;extern printcolor
N equ 0xD
L equ 0xA
welcome db " >> Welcome To TiTan OS<< ",N,L,'$'
prog db " Starting Kernel Initialization ... ",N,L,'$'
kmsg db " Checking Processor Type : ",'$'
notsupported db " sorry not supported ",N,L,'$'
is386 db " 386+ ","Detected"
db " [ ",0x5,"O",0x5,"K ]",N,L,'$'
no386 db " not 386 GoodBye"
db " [ ",0x6,"F",0x6,"A",0x6,"I",0x6,"L",0x6,"E",0x6,"D ]",N,L,'$'
v86mode db " You are currently running in V86 mode",
db " [ ",0x6,"F",0x6,"A",0x6,"I",0x6,"L",0x6,"E",0x6,"D ]",N,L,'$'
nov86 db " V86 Mode Disabled"
db " [ ",0x5,"O",0x5,"K ]",N,L,'$'
checkmode db " Checking Running Modes : ",'$'
protected db " Changing to protected mode : ",'$'
eA20 db " Enabling A20 Gate : ",N,L,'$'
MEMz db " Total Availble Memory : "
val times 6 db 0
db 'k'
db " [ ",0x5,"O",0x5,"K ]",N,L,'$'
kstart:
mov ax,cs
mov ds,ax
mov es,ax
setgraph :
mov ah,00h
mov al,10h
int 0x10
mov si,welcome
call printcolor
mov si,prog
call printcolor
mov si,kmsg
call printcolor
jmp processorcheck
hang : jmp hang
;; if char-1 = 0x5 print green(char) ,if char-1 = 0x6 print red(char),
;; else print white(char)
printcolor :
lodsb
cmp al,'$'
je printret
mov bl,0Fh
cmp al,5h
je green
cmp al,6h
je red
back: mov ah,0Eh
xor bh,bh
int 0x10
jmp printcolor
green :
mov al,[si]
mov bl,02h
inc si
jmp back
red :
mov al,[si]
mov bl,04h
inc si
jmp back
printret : ret
;;Checking for 386;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
processorcheck:
pushf
xor ah,ah
push ax
popf
pushf
pop ax
and ah,0f0h
cmp ah,0f0h
je printno386
mov si,is386
call printcolor
jmp modesrunning
printno386:
mov si,no386
call printcolor
jmp hang
;-----------------------------------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Checks if we are running in Real Mode;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
modesrunning:
mov si,checkmode
call printcolor
mov eax,cr0
and al,1
smsw ax ;this is a better alternate way
test al,1 ;2nd step
jnz unreal
mov si,nov86
call printcolor
jmp detectMEM
unreal:
mov si,v86mode
call printcolor
jmp hang
;-------------------------------------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
detectMEM :
xor eax,eax
xor ebx,ebx
push ds
push es
mov ax,0xe801
int 0x15
here : and edx,0xffff
shl edx,6
and ecx,0xffff
add edx,ecx
mov eax,edx
mov si,val
mov ebx,10
xor edx,edx
mov cx,6
repeat: mov dl,0
div ebx
add dl,30h
mov [si],dl
inc si
loop repeat
mov si,val
push si
reverse: mov al,[si]
inc si
mov ah,[si]
inc si
mov bl,[si]
inc si
mov bh,[si]
inc si
mov cl,[si]
inc si
mov ch,[si]
pop si
mov [si],ch
inc si
mov [si],cl
inc si
mov [si],bh
inc si
mov [si],bl
inc si
mov [si],ah
inc si
mov [si],al
mov si,MEMz
call printcolor
jmp protectedmode
;Protected Mode Code------------------------------------------------------------------------------
protectedmode:
xor ebx,ebx
mov bx,cs
shl ebx,4
mov eax,ebx
mov [gdt1 + 2],ax
mov [gdt2 + 2],ax
shr eax,16
mov [gdt1 + 4],al
mov [gdt2 + 4],al
mov [gdt1 + 7],ah
mov [gdt2 + 7],ah
; point gdtr to the gdt, point idtr to the idt
add ebx,gdt
mov [gdtr + 2],ebx
add ebx,idt - gdt
mov [idtr + 2],ebx
; disable interrupts
cli
; load GDT and IDT for full protected mode
lgdt [gdtr]
lidt [idtr]
; set PE [protected mode enable] bit and go
mov eax,cr0
or al,1
mov cr0,eax
jmp SYS_CODE_SEL:do_pm
;to define that you are working in 32 bit now
;if we remove this we would get a segmentation fault
[BITS 32]
do_pm:
mov ax,SYS_DATA_SEL
mov ds,ax
mov ss,ax
nop
mov es,ax
mov fs,ax
mov gs,ax
; I want here to print 'protected' label defined above
jmp A20
;Enabling A20 Gate--------------------------------------------------------------------------------
A20:
; i want to print here 'eA20' label defined above
; then please see the 'success' and 'failed' label defined below
pusha
; Make sure interrupts are disabled
cli
mov cx, 5
trial1:
;; Wait
waitc1:
xor ax, ax
in al, 64h
bt ax, 1
jc waitc1
;read output port.
mov al, 0D0h
out 64h,al
;; Wait for the controller to be ready with a byte of data
waitd1:
xor AX, AX
in al, 64h
bt ax, 0
jnc waitd1
;; Read the current port status from port 60h
xor ax, ax
in al, 60h
;; Save value
push eax
waitc2:
in al, 64h
bt ax, 1
jc waitc2
mov al, 0D1h
out 64h, al
waitc3:
xor ax, ax
in al, 64h
bt ax, 1
jc waitc3
pop eax
; A20 enable
or al, 00000010b
out 60h, al
;RECHECK
; Wait
waitc4:
xor ax, ax
in al, 64h
bt ax, 1
jc waitc4
;read output port.
mov al, 0D0h
out 64h, al
;wait
waitd2:
xor ax, ax
in al, 64h
bt ax, 0
jnc waitd2
; Read port
xor AX, AX
in AL, 60h
bt AX, 1
;; If carry is on, A20 is on.
jc success
loop trial1
;else?
jmp fail
success:
jmp hang
fail:
jmp hang
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;default interrupt handler
handler: cli
mov ax,LINEAR_SEL
mov gs,ax
mov byte[gs:0xB8090],'!'
jmp $
;Example : Handler for interrupt
;handler for int0x20
isr20: pusha
push gs
;print something !
pop gs
popa
iret
;32-bit linear base address of GDT and IDT-----------------------------------
gdtr: dw gdt_end - gdt - 1 ; GDT limit
dd gdt ; linear, physical address of GDT
idtr: dw idt_end - idt - 1 ; IDT limit
dd idt ; linear, physical address of IDT
;--------------------------------------------------------------------------------
;Global descriptor table (GDT)
; null descriptor
gdt: dw 0 ; limit 15:0
dw 0 ; base 15:0
db 0 ; base 23:16
db 0 ; type
db 0 ; limit 19:16, flags
db 0 ; base 31:24
; linear data segment descriptor
LINEAR_SEL equ $-gdt
dw 0xFFFF ; limit 0xFFFFF
dw 0 ; base 0
db 0
db 0x92 ; present, ring 0, data, expand-up, writable
db 0xCF ; page-granular, 32-bit
db 0
; code segment descriptor
SYS_CODE_SEL equ $-gdt
gdt1: dw 0xFFFF
dw 0 ; (base gets set above)
db 0
db 0x9A ; present, ring 0, code, non-conforming, readable
db 0xCF
db 0
; data segment descriptor
SYS_DATA_SEL equ $-gdt
gdt2: dw 0xFFFF
dw 0 ; (base gets set above)
db 0
db 0x92 ; present, ring 0, data, expand-up, writable
db 0xCF
db 0
gdt_end:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;------------------------------------------------------------------------------------------
;interrupt descriptor table (IDT)
; 32 reserved interrupts:
idt: dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0 ; entry point 31:16 (XXX - unhand >> 16)
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
dw handler ; entry point 15:0
dw SYS_CODE_SEL ; selector
db 0 ; word count
db 0x8E ; type (32-bit Ring 0 interrupt gate)
dw 0
; user interrupt handler
dw isr20
dw SYS_CODE_SEL
db 0
db 0x8E
dw 0
idt_end:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
times 1512-($-$$) db 0 ; complete the code in bytes
|