From 4e4baeba638fc9074666d60233ac53e5570d285c Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 12 Aug 2003 22:00:00 -0400 Subject: [PATCH] Import backup from 2003-08-12 --- bootdef.inc | 9 ++- gdt.inc | 54 ++++++++++++++++ idt.inc | 85 +++++++++++++++++++++++++ kernel.asm | 16 ++++- kernel.c | 6 ++ link.ld | 22 +++++++ stage2.asm | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 366 insertions(+), 6 deletions(-) create mode 100644 gdt.inc create mode 100644 idt.inc create mode 100644 kernel.c create mode 100644 link.ld diff --git a/bootdef.inc b/bootdef.inc index c27e404..6a6b962 100644 --- a/bootdef.inc +++ b/bootdef.inc @@ -7,11 +7,18 @@ %define BOOT_STAGE2_SEG 0x0B00 ;right after KERNEL_SEG %define BOOT_STAGE2_ADD 0xB000 ;address of stage2 to jump to, org at %define BOOT_KERNEL_ADD 0x100000 ;final pmode kernel destination - physical +%define BOOT_RD_ADD 0x200000 ;2mb for ram disk %define BOOT_DATA_SEG 0x9000 ;data gathered by stage2 loader goes here %define BOOT_HASRD 0x0000 ;1 +%define BOOT_VESA 0x0002 ;2 - 0 for console, otherwise VESA mode +%define BOOT_VESA_OEM 0x0004 ;258 - null-terminated OEM identification string +%define BOOT_VESA_VBE 0x0106 ;512 - copy of VESA VBEInfoBlock +%define BOOT_ 0x0306 + -%define BOOT_RD_ADD 0x200000 ;2mb for ram disk %define BOOT_DRIVE 0x7C24 ;1 - boot drive + + diff --git a/gdt.inc b/gdt.inc new file mode 100644 index 0000000..aa5b295 --- /dev/null +++ b/gdt.inc @@ -0,0 +1,54 @@ + + +gdtr: + dw gdt_end-gdt-1 + dd GDT +gdt: + dd 0 + dd 0 +KERNEL_CODE equ $-gdt + dw 0xffff ;limit 15:0 + dw 0x0000 ;base 15:0 + db 0x00 ;base 23:16 + db 0x9A ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) + db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 + db 0x00 ;base 31:24 +KERNEL_DATA equ $-gdt + dw 0xffff ;limit 15:0 + dw 0x0000 ;base 15:0 + db 0x00 ;base 23:16 + db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) + db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 + db 0x00 ;base 31:24 +VESA_CODE equ $-gdt + dw 0xffff ;limit 15:0 + dw 0x0000 ;base 15:0 + db 0x00 ;base 23:16 + db 0x9A ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) + db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16 + db 0x00 ;base 31:24 +VESA_DATA equ $-gdt + dw 0xffff ;limit 15:0 + dw 0x0000 ;base 15:0 + db 0x00 ;base 23:16 + db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) + db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16 + db 0x00 ;base 31:24 +USER_CODE equ $-gdt + dw 0xffff ;limit 15:0 + dw 0x0000 ;base 15:0 + db 0x00 ;base 23:16 + db 0xFA ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) + db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 + db 0x00 ;base 31:24 +USER_DATA equ $-gdt + dw 0xffff ;limit 15:0 + dw 0x0000 ;base 15:0 + db 0x00 ;base 23:16 + db 0xF2 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) + db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 + db 0x00 ;base 31:24 +gdt_end: + + + diff --git a/idt.inc b/idt.inc new file mode 100644 index 0000000..952d072 --- /dev/null +++ b/idt.inc @@ -0,0 +1,85 @@ + +idt_entry: + dw 0 ;offset 15:0 + dw KERNEL_CODE ;base 15:0 + db 0 ;0 + db 0x8E ;[P][DPL][0][TYPE] + dw 0 ;offset 31:16 + +%macro isr_label 1 +isr_%1: + mov eax, %1 + jmp isr_main +%endmacro + +isr_label 0 +isr_label 1 +isr_label 2 +isr_label 3 +isr_label 4 +isr_label 5 +isr_label 6 +isr_label 7 +isr_label 8 +isr_label 9 +isr_label 10 +isr_label 11 +isr_label 12 +isr_label 13 +isr_label 14 +isr_label 15 +isr_label 16 +isr_label 17 +isr_label 18 +isr_label 19 +isr_label 20 +isr_label 21 +isr_label 22 +isr_label 23 +isr_label 24 +isr_label 25 +isr_label 26 +isr_label 27 +isr_label 28 +isr_label 29 +isr_label 30 +isr_label 31 +isr_label 32 +isr_label 33 +isr_label 34 +isr_label 35 +isr_label 36 +isr_label 37 +isr_label 38 +isr_label 39 +isr_label 40 +isr_label 41 +isr_label 42 +isr_label 43 +isr_label 44 +isr_label 45 +isr_label 46 +isr_label 47 +isr_label 48 +isr_label 49 + +isr_main: + pusha + push ds + push es + + push eax + + call _isr + + pop eax + + pop es + pop ds + popa + + iret + + + + diff --git a/kernel.asm b/kernel.asm index 7c230c7..c46028b 100644 --- a/kernel.asm +++ b/kernel.asm @@ -1,10 +1,15 @@ %include "bootdef.inc" +%define GDT 0x140000 +%define IDT 0x150000 + +[global start] +extern _isr + bits 32 -org BOOT_KERNEL_ADD - +start: call cls mov esi, msg @@ -44,3 +49,10 @@ cls_loop: msg: db "This kernel is located at 0x100000! Aren't you glad?", 0 + + +%include "gdt.inc" +%include "idt.inc" + + + diff --git a/kernel.c b/kernel.c new file mode 100644 index 0000000..91e6093 --- /dev/null +++ b/kernel.c @@ -0,0 +1,6 @@ + +void isr(int num) +{ + +} + diff --git a/link.ld b/link.ld new file mode 100644 index 0000000..eddc4fb --- /dev/null +++ b/link.ld @@ -0,0 +1,22 @@ +OUTPUT_FORMAT("binary") +ENTRY(start) +SECTIONS +{ + .text 0x100000 : { + code = .; _code = .; __code = .; + *(.text) + . = ALIGN(4096); + } + .data : { + data = .; _data = .; __data = .; + *(.data) + . = ALIGN(4096); + } + .bss : + { + bss = .; _bss = .; __bss = .; + *(.bss) + . = ALIGN(4096); + } + end = .; _end = .; __end = .; +} diff --git a/stage2.asm b/stage2.asm index c6539f2..0b203b6 100644 --- a/stage2.asm +++ b/stage2.asm @@ -148,7 +148,7 @@ got_rd: mov cx, 80 mov edi, 0xb8000+160*4 filler_loop: - mov word [ds:edi], 0x0400+176 + mov word [ds:edi], 0x0400+177 inc edi inc edi loop filler_loop @@ -190,18 +190,108 @@ copydisk_loop: pop cx loop read_cylinder -no_rd: +;------------------------------------------------------ +no_rd: ;done with ram disk, on to vesa info... xor ax, ax + mov gs, ax mov ds, ax mov ax, 0xb800 mov es, ax + mov di, 160 + mov cx, 2000-80 + mov ax, 0x0700 +cls_vesa_loop: + stosw + loop cls_vesa_loop mov si, txt_vesa - mov di, 160*5 + mov di, 160*1 mov ah, 7 call puts + push di + mov ax, 0x0100 + mov es, ax + xor di, di + mov dword [es:si], "2EBV" + mov ax, 0x4F00 + int 0x10 + pop di + cmp ax, 0x004F + jz vesa_good + mov si, txt_novesa + mov ax, 0xb800 + mov es, ax + mov ah, 7 + call puts + mov ax, BOOT_DATA_SEG + mov ds, ax + mov word [ds:BOOT_VESA], 0 + jmp vesa_done +vesa_good: + mov ax, 0xb800 + mov es, ax + mov ax, 0x0100 + mov ds, ax + xor si, si + mov bx, [4] + mov al, bh + call puthex + mov al, '.' + stosb + mov al, 7 + stosb + mov al, bl + call puthex + cmp bh, 2 + jge vesa_good2 xor ax, ax + mov ds, ax + mov si, txt_vesaold + mov ah, 7 + call puts + mov ax, BOOT_DATA_SEG + mov ds, ax + mov word [ds:BOOT_VESA], 0 + jmp vesa_done +vesa_good2: + mov ebx, [6] ;something like 0x00000E60 + mov edx, [14] + mov si, bx + shr ebx, 16 + mov ds, bx ;ds:si points to null-terminated OEM identification string + mov ah, 2 + push si + call puts + pop si + mov ax, BOOT_DATA_SEG + mov es, ax + mov di, BOOT_VESA_OEM +vesa_copyoem: + lodsb + stosb + or al, al + jnz vesa_copyoem + mov ax, 0x0100 + mov ds, ax + xor si, si + mov di, BOOT_VESA_VBE + mov cx, 512 +vesa_copyvbe: + lodsb + stosb + loop vesa_copyvbe + + mov si, dx + shr edx, 16 + mov ds, dx ;ds:si points to video mode list + + + +;------------------------------------------------------ +vesa_done: + + xor ax, ax ;wait for keypress... int 0x16 jmp go_pm @@ -217,11 +307,95 @@ puts: puts_done: ret +checkvesa: + cmp ax, 0x004F + jnz vesaerror + ret +vesaerror: + mov ax, 0xb800 + mov es, ax + xor ax, ax + mov ds, ax + mov si, txt_vesaerror + mov di, 160*24 + mov ah, 4 + call puts + cli + hlt + +;------------------------------------------------------ +puthex: + ;es:di points to video memory + ;al holds hex value + + push ax + mov ah, al + shr ax, 4 + and al, 0x0F + add al, '0' + cmp al, '9' + jle puthex_goon1 + add al, 'A'-'9'-1 +puthex_goon1: + cmp al, '0' + jz puthex_skipzero + stosb + mov al, 7 + stosb +puthex_skipzero: + pop ax + push ax + and al, 0x0F + add al, '0' + cmp al, '9' + jle puthex_goon2 + add al, 'A'-'9'-1 +puthex_goon2: + stosb + mov al, 7 + stosb + pop ax + ret + +puthex2: + ;es:di points to video memory, always displays 2 characters! + ;al holds hex value + + push ax + mov ah, al + shr ax, 4 + and al, 0x0F + add al, '0' + cmp al, '9' + jle puthex2_goon1 + add al, 'A'-'9'-1 +puthex2_goon1: + stosb + mov al, 7 + stosb + pop ax + push ax + and al, 0x0F + add al, '0' + cmp al, '9' + jle puthex2_goon2 + add al, 'A'-'9'-1 +puthex2_goon2: + stosb + mov al, 7 + stosb + pop ax + ret + +;------------------------------------------------------ txt_welcome: db " Welcome to HOS v", VERSION, "! ", 0 txt_rd1: db "1. Do not load an initial ram disk", 0 txt_rd2: db "2. Load initial ram disk from floppy", 0 txt_input: db "Enter your selection: ", 0 txt_vesa: db "VESA version: ", 0 +txt_vesaerror: db "VESA function call error! Halting system!", 0 +txt_novesa: db "VESA not found. Starting in console mode...", 0 +txt_vesaold: db "VESA version 2.0 required. Starting in console mode...", 0 ;------------------------------------------------------ getCHSfromCluster: