Merge into main the new state of the operating system/kernel #1
4
Makefile
4
Makefile
@ -5,7 +5,7 @@ CC = ${HOME}/opt/cross/bin/i686-elf-gcc
|
|||||||
CPP = ${HOME}/opt/cross/bin/i686-elf-g++
|
CPP = ${HOME}/opt/cross/bin/i686-elf-g++
|
||||||
CFLAGS = -ffreestanding -O2 -Wall -Wextra
|
CFLAGS = -ffreestanding -O2 -Wall -Wextra
|
||||||
|
|
||||||
OFILES = $(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/io.o $(BUILD_DIR)/MMU.o
|
OFILES = $(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/io.o $(BUILD_DIR)/MMU.o $(BUILD_DIR)/idt.o
|
||||||
|
|
||||||
SRC_DIR = src
|
SRC_DIR = src
|
||||||
BUILD_DIR = build
|
BUILD_DIR = build
|
||||||
@ -57,3 +57,5 @@ $(BUILD_DIR)/io.o:
|
|||||||
$(CPP) -c $(SRC_DIR)/kernel/io.cpp -o $(BUILD_DIR)/io.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/io.cpp -o $(BUILD_DIR)/io.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
$(BUILD_DIR)/MMU.o:
|
$(BUILD_DIR)/MMU.o:
|
||||||
$(CPP) -c $(SRC_DIR)/kernel/MMU.cpp -o $(BUILD_DIR)/MMU.o $(CFLAGS) -fno-exceptions -fno-rtti
|
$(CPP) -c $(SRC_DIR)/kernel/MMU.cpp -o $(BUILD_DIR)/MMU.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||||
|
$(BUILD_DIR)/idt.o:
|
||||||
|
$(CPP) -c $(SRC_DIR)/kernel/idt.cpp -o $(BUILD_DIR)/idt.o $(CFLAGS) -fno-exceptions -fno-rtti
|
@ -20,8 +20,12 @@ stack_bottom:
|
|||||||
.skip 16384 # 16 KiB
|
.skip 16384 # 16 KiB
|
||||||
stack_top:
|
stack_top:
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl idt_flush
|
||||||
|
idt_flush:
|
||||||
|
mov 4(%esp), %eax
|
||||||
|
lidt (%eax)
|
||||||
|
ret
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.globl enablePaging
|
.globl enablePaging
|
||||||
@ -51,20 +55,369 @@ loadPageDirectory:
|
|||||||
.global _start
|
.global _start
|
||||||
.type _start, @function
|
.type _start, @function
|
||||||
_start:
|
_start:
|
||||||
|
/*Setup the stack pointer to point to the beginning of our stack */
|
||||||
|
/* I believe its a hight address growing down to lower adress for the stack on x86*/
|
||||||
|
|
||||||
mov $stack_top, %esp
|
mov $stack_top, %esp
|
||||||
|
call early_main
|
||||||
|
|
||||||
|
load_gdt:
|
||||||
|
lgdt gdt
|
||||||
|
|
||||||
|
# set the segment selecters
|
||||||
|
|
||||||
|
movw $0x10, %ax
|
||||||
|
movw %ax, %ds
|
||||||
|
movw %ax, %es
|
||||||
|
movw %ax, %fs
|
||||||
|
movw %ax, %gs
|
||||||
|
movw %ax, %ss
|
||||||
|
ljmp $0x08, $flush
|
||||||
|
|
||||||
|
flush:
|
||||||
|
#load idt
|
||||||
|
call init_idt
|
||||||
|
|
||||||
|
# Try enable A20
|
||||||
|
# mov $0x2401, %ax
|
||||||
|
# int $0x15
|
||||||
|
|
||||||
|
|
||||||
|
# enable protected mode
|
||||||
|
mov %cr0, %eax
|
||||||
|
or $1, %eax
|
||||||
|
mov %eax, %cr0
|
||||||
|
|
||||||
|
|
||||||
call _init
|
|
||||||
call kernel_main
|
call kernel_main
|
||||||
|
|
||||||
|
|
||||||
cli
|
cli
|
||||||
1: hlt
|
1: hlt
|
||||||
jmp 1b
|
jmp 1b
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Tell processor to use our gdt*/
|
||||||
|
gdt:
|
||||||
|
.word (gdt_end - gdt_start -1) # Size of the GDT in bytes minus 1 for math reasons
|
||||||
|
.int gdt_start # linear address of our GDT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.att_syntax
|
||||||
|
|
||||||
|
|
||||||
.size _start, . - _start
|
.size _start, . - _start
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Interupt handlers
|
||||||
|
*/
|
||||||
|
|
||||||
|
.text
|
||||||
|
.macro irq_NoErrCode code:req
|
||||||
|
.globl irq\code
|
||||||
|
irq\code:
|
||||||
|
cli
|
||||||
|
pushb $0
|
||||||
|
pushb \code
|
||||||
|
jmp irq_common
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.text
|
||||||
|
.macro irq_ErrCode code
|
||||||
|
.globl irq\code
|
||||||
|
irq\code:
|
||||||
|
cli
|
||||||
|
pushb \code
|
||||||
|
jmp irq_common
|
||||||
|
.endm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.globl irq0
|
||||||
|
irq0:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $0
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq1
|
||||||
|
irq1:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $1
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq2
|
||||||
|
irq2:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $2
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq3
|
||||||
|
irq3:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $3
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq4
|
||||||
|
irq4:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $4
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq5
|
||||||
|
irq5:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $5
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq6
|
||||||
|
irq6:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $6
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq7
|
||||||
|
irq7:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $7
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq8
|
||||||
|
irq8:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $8
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq9
|
||||||
|
irq9:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $9
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq10
|
||||||
|
irq10:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $10
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq11
|
||||||
|
irq11:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $11
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq12
|
||||||
|
irq12:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $12
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq13
|
||||||
|
irq13:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $13
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq14
|
||||||
|
irq14:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $14
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq15
|
||||||
|
irq15:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $15
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq16
|
||||||
|
irq16:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $16
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq17
|
||||||
|
irq17:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $17
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq18
|
||||||
|
irq18:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $18
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq19
|
||||||
|
irq19:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $19
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq20
|
||||||
|
irq20:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $20
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq21
|
||||||
|
irq21:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $21
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq22
|
||||||
|
irq22:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $22
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq23
|
||||||
|
irq23:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $23
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq24
|
||||||
|
irq24:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $24
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq25
|
||||||
|
irq25:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $25
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq26
|
||||||
|
irq26:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $26
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq27
|
||||||
|
irq27:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $27
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq28
|
||||||
|
irq28:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $28
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq29
|
||||||
|
irq29:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $29
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq30
|
||||||
|
irq30:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $30
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
.globl irq31
|
||||||
|
irq31:
|
||||||
|
cli
|
||||||
|
push $0
|
||||||
|
push $31
|
||||||
|
jmp irq_common
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.text
|
||||||
|
irq_common:
|
||||||
|
pusha # Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
|
||||||
|
|
||||||
|
|
||||||
|
mov %ds, %ax
|
||||||
|
push %eax
|
||||||
|
|
||||||
|
/* load the kernel data segment descriptor*/
|
||||||
|
|
||||||
|
mov $0x10, %ax
|
||||||
|
mov %ax, %ds
|
||||||
|
mov %ax, %es
|
||||||
|
mov %ax, %fs
|
||||||
|
mov %ax, %gs
|
||||||
|
|
||||||
|
call irq_handler
|
||||||
|
|
||||||
|
pop %eax
|
||||||
|
|
||||||
|
mov %ax, %ds
|
||||||
|
mov %ax, %es
|
||||||
|
mov %ax, %fs
|
||||||
|
mov %ax, %gs
|
||||||
|
|
||||||
|
popa
|
||||||
|
add $8, %esp # cleans push error and irq code
|
||||||
|
sti
|
||||||
|
iret # pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the GDT
|
||||||
|
*/
|
||||||
|
.section .data
|
||||||
|
gdt_start:
|
||||||
|
gdt_null:
|
||||||
|
.long 0x0
|
||||||
|
.long 0x0
|
||||||
|
|
||||||
|
gdt_kcode:
|
||||||
|
.word 0xFFFF # limit
|
||||||
|
.word 0x0 # base
|
||||||
|
.byte 0x0 # base
|
||||||
|
.byte 0b10011010 # 1st flags | type flags
|
||||||
|
.byte 0b11001111 # 2nd flags | limit
|
||||||
|
.byte 0x0 # base
|
||||||
|
|
||||||
|
gdt_kdata:
|
||||||
|
.word 0xFFFF # limit
|
||||||
|
.word 0x0 # base
|
||||||
|
.byte 0x0 # base
|
||||||
|
.byte 0b10010010 # 1st flags | type flags
|
||||||
|
.byte 0b11001111 # 2nd flags | limit
|
||||||
|
.byte 0x0 # base
|
||||||
|
gdt_end:
|
@ -89,4 +89,3 @@ void kterm_writestring(const char* data ){
|
|||||||
AS_KERNEL();
|
AS_KERNEL();
|
||||||
kterm_write(data, strlen(data));
|
kterm_write(data, strlen(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ void kterm_putat(char, uint8_t, size_t, size_t);
|
|||||||
void kterm_put(char);
|
void kterm_put(char);
|
||||||
void kterm_write(const char*, size_t);
|
void kterm_write(const char*, size_t);
|
||||||
void kterm_writestring(const char*);
|
void kterm_writestring(const char*);
|
||||||
|
|
||||||
void kterm_scrollup();
|
void kterm_scrollup();
|
||||||
|
|
||||||
#define KernelTag "[Kernel]: "
|
#define KernelTag "[Kernel]: "
|
||||||
|
29
src/kernel/gdtc.cpp
Normal file
29
src/kernel/gdtc.cpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#include "gdtc.h"
|
||||||
|
|
||||||
|
|
||||||
|
gdtEntry_t gdt[3];
|
||||||
|
|
||||||
|
|
||||||
|
void gdtSetGate(int num, uint64_t base, uint64_t limit, uint8_t access,
|
||||||
|
uint8_t gran){
|
||||||
|
gdt[num].lBase = (base & 0xFFFF);
|
||||||
|
gdt[num].mBase = (base >> 16) & 0xFF;
|
||||||
|
gdt[num].hBase = (base >> 24) & 0xFF;
|
||||||
|
|
||||||
|
gdt[num].lLimit = (limit & 0xFFFF);
|
||||||
|
gdt[num].granularity = ((limit >> 16) & 0x0F);
|
||||||
|
|
||||||
|
gdt[num].granularity |= (gran & 0xF0);
|
||||||
|
gdt[num].access = access;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setupGdt(){
|
||||||
|
gdtPointer.limit = (sizeof(gdtEntry_t) * 3) - 1;
|
||||||
|
gdtPointer.base = &gdt;
|
||||||
|
|
||||||
|
gdtSetGate(0, 0, 0, 0, 0);
|
||||||
|
gdtSetGate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF);
|
||||||
|
gdtSetGate(2, 0, 0xFFFFFFFF, 0x92, 0xCF);
|
||||||
|
|
||||||
|
loadGdt();
|
||||||
|
}
|
20
src/kernel/gdtc.h
Normal file
20
src/kernel/gdtc.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
extern "c"{
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t lLimit;
|
||||||
|
uint16_t lBase;
|
||||||
|
uint8_t mBase;
|
||||||
|
uint8_t access;
|
||||||
|
uint8_t granularity;
|
||||||
|
uint8_t hBase;
|
||||||
|
} gdtEntry_t;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
uint16_t limit;
|
||||||
|
uint32_t base;
|
||||||
|
} gdtPointer;
|
||||||
|
|
||||||
|
extern void loadGdt();
|
||||||
|
void setupGdt();
|
||||||
|
}
|
64
src/kernel/idt.cpp
Normal file
64
src/kernel/idt.cpp
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#include "idt.h"
|
||||||
|
|
||||||
|
IDT_entry idt_table[256];
|
||||||
|
IDT_ptr idt_ptr;
|
||||||
|
|
||||||
|
void set_id_entry (uint8_t num , uint32_t base, uint16_t sel, uint8_t flags){
|
||||||
|
idt_table[num].offset_1 = base & 0xFFFF;
|
||||||
|
idt_table[num].selector = sel;
|
||||||
|
idt_table[num].zero = 0;
|
||||||
|
idt_table[num].type_attr = flags;
|
||||||
|
idt_table[num].offset_2 = (base >> 16) & 0xFFFF;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void irq_handler (registers regs) {
|
||||||
|
kterm_writestring("received interrupt!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void init_idt(){
|
||||||
|
// Initialise the IDT pointer
|
||||||
|
idt_ptr.length = sizeof(IDT_entry) * 255;
|
||||||
|
idt_ptr.base = (uint32_t)&idt_table;
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: Set everything to zero first
|
||||||
|
|
||||||
|
set_id_entry(0, (uint32_t) irq0 , 0x08, 0x8E);
|
||||||
|
set_id_entry(1, (uint32_t) irq1 , 0x08, 0x8E);
|
||||||
|
set_id_entry(2, (uint32_t) irq2 , 0x08, 0x8E);
|
||||||
|
set_id_entry(3, (uint32_t) irq3 , 0x08, 0x8E);
|
||||||
|
set_id_entry(4, (uint32_t) irq4 , 0x08, 0x8E);
|
||||||
|
set_id_entry(5, (uint32_t) irq5 , 0x08, 0x8E);
|
||||||
|
set_id_entry(6, (uint32_t) irq6 , 0x08, 0x8E);
|
||||||
|
set_id_entry(7, (uint32_t) irq7 , 0x08, 0x8E);
|
||||||
|
set_id_entry(8, (uint32_t) irq8 , 0x08, 0x8E);
|
||||||
|
set_id_entry(9, (uint32_t) irq9 , 0x08, 0x8E);
|
||||||
|
set_id_entry(10, (uint32_t) irq10 , 0x08, 0x8E);
|
||||||
|
set_id_entry(11, (uint32_t) irq11 , 0x08, 0x8E);
|
||||||
|
set_id_entry(12, (uint32_t) irq12 , 0x08, 0x8E);
|
||||||
|
set_id_entry(13, (uint32_t) irq13 , 0x08, 0x8E);
|
||||||
|
set_id_entry(14, (uint32_t) irq14 , 0x08, 0x8E);
|
||||||
|
set_id_entry(15, (uint32_t) irq15 , 0x08, 0x8E);
|
||||||
|
set_id_entry(16, (uint32_t) irq16 , 0x08, 0x8E);
|
||||||
|
set_id_entry(17, (uint32_t) irq17 , 0x08, 0x8E);
|
||||||
|
set_id_entry(18, (uint32_t) irq18 , 0x08, 0x8E);
|
||||||
|
set_id_entry(19, (uint32_t) irq19 , 0x08, 0x8E);
|
||||||
|
set_id_entry(20, (uint32_t) irq20 , 0x08, 0x8E);
|
||||||
|
set_id_entry(21, (uint32_t) irq21 , 0x08, 0x8E);
|
||||||
|
set_id_entry(22, (uint32_t) irq22 , 0x08, 0x8E);
|
||||||
|
set_id_entry(23, (uint32_t) irq23 , 0x08, 0x8E);
|
||||||
|
set_id_entry(24, (uint32_t) irq24 , 0x08, 0x8E);
|
||||||
|
set_id_entry(25, (uint32_t) irq25 , 0x08, 0x8E);
|
||||||
|
set_id_entry(26, (uint32_t) irq26 , 0x08, 0x8E);
|
||||||
|
set_id_entry(27, (uint32_t) irq27 , 0x08, 0x8E);
|
||||||
|
set_id_entry(28, (uint32_t) irq28 , 0x08, 0x8E);
|
||||||
|
set_id_entry(29, (uint32_t) irq29 , 0x08, 0x8E);
|
||||||
|
set_id_entry(30, (uint32_t) irq30 , 0x08, 0x8E);
|
||||||
|
set_id_entry(31, (uint32_t) irq31 , 0x08, 0x8E);
|
||||||
|
|
||||||
|
|
||||||
|
idt_flush((uint32_t)&idt_ptr);
|
||||||
|
}
|
70
src/kernel/idt.h
Normal file
70
src/kernel/idt.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "stdint.h"
|
||||||
|
|
||||||
|
extern "C" void kterm_writestring(const char* data );
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
struct __attribute__((__packed__)) IDT_entry {
|
||||||
|
uint16_t offset_1;
|
||||||
|
uint16_t selector;
|
||||||
|
uint8_t zero;
|
||||||
|
uint8_t type_attr;
|
||||||
|
uint16_t offset_2;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct __attribute__((__packed__)) IDT_ptr {
|
||||||
|
unsigned short length;
|
||||||
|
unsigned long base;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct registers {
|
||||||
|
uint32_t ds; // Data segment selector
|
||||||
|
uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; // Pushed by pusha.
|
||||||
|
uint32_t int_no, err_code; // Interrupt number and error code (if applicable)
|
||||||
|
uint32_t eip, cs, eflags, useresp, ss;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
extern void idt_flush(uint32_t);
|
||||||
|
void set_id_entry (uint8_t num , uint32_t base, uint16_t sel, uint8_t flags);
|
||||||
|
void init_idt();
|
||||||
|
|
||||||
|
void irq_handler (registers regs);
|
||||||
|
|
||||||
|
extern void irq0 ();
|
||||||
|
extern void irq1 ();
|
||||||
|
extern void irq2 ();
|
||||||
|
extern void irq3 ();
|
||||||
|
extern void irq4 ();
|
||||||
|
extern void irq5 ();
|
||||||
|
extern void irq6 ();
|
||||||
|
extern void irq7 ();
|
||||||
|
extern void irq8 ();
|
||||||
|
extern void irq9 ();
|
||||||
|
extern void irq10 ();
|
||||||
|
extern void irq11 ();
|
||||||
|
extern void irq12 ();
|
||||||
|
extern void irq13 ();
|
||||||
|
extern void irq14 ();
|
||||||
|
extern void irq15 ();
|
||||||
|
extern void irq16 ();
|
||||||
|
extern void irq17 ();
|
||||||
|
extern void irq18 ();
|
||||||
|
extern void irq19 ();
|
||||||
|
extern void irq20 ();
|
||||||
|
extern void irq21 ();
|
||||||
|
extern void irq22 ();
|
||||||
|
extern void irq23 ();
|
||||||
|
extern void irq24 ();
|
||||||
|
extern void irq25 ();
|
||||||
|
extern void irq26 ();
|
||||||
|
extern void irq27 ();
|
||||||
|
extern void irq28 ();
|
||||||
|
extern void irq29 ();
|
||||||
|
extern void irq30 ();
|
||||||
|
extern void irq31 ();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -74,6 +74,12 @@ char read_serial() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void print_serial(const char* string ){
|
||||||
|
for(size_t i = 0; i < strlen(string); i ++){
|
||||||
|
write_serial(string[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void test_serial(){
|
void test_serial(){
|
||||||
/** Serial test **/
|
/** Serial test **/
|
||||||
kterm_writestring("Writing to COM1 serial port:");
|
kterm_writestring("Writing to COM1 serial port:");
|
||||||
@ -93,11 +99,34 @@ void test_serial(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
|
void early_main(){
|
||||||
|
|
||||||
|
init_serial();
|
||||||
|
print_serial("\033[31;42mEarly main called!\n");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void kernel_main (void) {
|
void kernel_main (void) {
|
||||||
|
|
||||||
|
print_serial("\033[31;42mKernel main called!\n");
|
||||||
|
|
||||||
|
|
||||||
/** initialize terminal interface */
|
/** initialize terminal interface */
|
||||||
kterm_init();
|
kterm_init();
|
||||||
|
|
||||||
|
/** Setup the MMU **/
|
||||||
|
kterm_writestring("Starting MMU...\n");
|
||||||
|
auto mmu = MMU();
|
||||||
|
mmu.enable();
|
||||||
|
kterm_writestring("MMU enabled!\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Wrtite stuff to the screen to test the terminal**/
|
/** Wrtite stuff to the screen to test the terminal**/
|
||||||
kterm_writestring("Hello world!\n");
|
kterm_writestring("Hello world!\n");
|
||||||
kterm_writestring("We got newline support!\n");
|
kterm_writestring("We got newline support!\n");
|
||||||
@ -114,14 +143,11 @@ extern "C" {
|
|||||||
auto testObject = Test();
|
auto testObject = Test();
|
||||||
testObject.printMe();
|
testObject.printMe();
|
||||||
|
|
||||||
/** Setup the MMU **/
|
|
||||||
kterm_writestring("Starting MMU...\n");
|
|
||||||
auto mmu = MMU();
|
|
||||||
mmu.enable();
|
|
||||||
kterm_writestring("MMU enabled!\n");
|
|
||||||
|
|
||||||
|
|
||||||
|
/** test interrupt handlers **/
|
||||||
|
//asm volatile ("int $0x3");
|
||||||
|
|
||||||
|
//asm volatile ("int $0x4");
|
||||||
|
|
||||||
/** Lets start using the serial port for debugging .. **/
|
/** Lets start using the serial port for debugging .. **/
|
||||||
// Hopefully once we go into realmode or do something that
|
// Hopefully once we go into realmode or do something that
|
||||||
@ -129,7 +155,6 @@ extern "C" {
|
|||||||
// some situational awareness
|
// some situational awareness
|
||||||
//Serial serialbus = Serial::init();
|
//Serial serialbus = Serial::init();
|
||||||
|
|
||||||
test_serial();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "../libc/include/string.h"
|
#include "../libc/include/string.h"
|
||||||
#include "arch/i386/tty/kterm.h"
|
#include "arch/i386/tty/kterm.h"
|
||||||
}
|
}
|
||||||
#include "MMU.h"
|
#include "MMU.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
|
#include "idt.h"
|
Loading…
Reference in New Issue
Block a user