More work on interrupt handling, Started timer interrupt implementation, PIC remapped hopefully successfull
This commit is contained in:
parent
28ac6a05af
commit
592db0ebcf
11
Makefile
11
Makefile
@ -5,7 +5,7 @@ CC = ${HOME}/opt/cross/bin/i686-elf-gcc
|
||||
CPP = ${HOME}/opt/cross/bin/i686-elf-g++
|
||||
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 $(BUILD_DIR)/idt.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 $(BUILD_DIR)/pic.o
|
||||
|
||||
SRC_DIR = src
|
||||
BUILD_DIR = build
|
||||
@ -24,7 +24,7 @@ all: clean build
|
||||
build: build_kernel run
|
||||
|
||||
run:
|
||||
$(EMULATOR) -kernel $(BUILD_DIR)/myos.bin -serial stdio -vga std
|
||||
$(EMULATOR) -d int -kernel $(BUILD_DIR)/myos.bin -serial stdio -vga std
|
||||
|
||||
build_kernel: $(OBJ_LINK_LIST)
|
||||
|
||||
@ -55,7 +55,12 @@ $(BUILD_DIR)/crtn.o:
|
||||
|
||||
$(BUILD_DIR)/io.o:
|
||||
$(CPP) -c $(SRC_DIR)/kernel/io.cpp -o $(BUILD_DIR)/io.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||
|
||||
$(BUILD_DIR)/MMU.o:
|
||||
$(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
|
||||
$(CPP) -c $(SRC_DIR)/kernel/arch/i386/idt/idt.cpp -o $(BUILD_DIR)/idt.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||
|
||||
$(BUILD_DIR)/pic.o:
|
||||
$(CPP) -c $(SRC_DIR)/kernel/arch/i386/pic/pic.cpp -o $(BUILD_DIR)/pic.o $(CFLAGS) -fno-exceptions -fno-rtti
|
||||
|
@ -7,6 +7,9 @@ ________________________
|
||||
The first scrolling boot screen. 😲
|
||||
|
||||
|
||||
<img src="screenshots/WIP_interruptHandling.png"></img>
|
||||
W.I.P - Working on interrupt handling
|
||||
|
||||
________________________
|
||||
|
||||
### The goal
|
||||
|
BIN
screenshots/WIP_interruptHandling.png
(Stored with Git LFS)
Normal file
BIN
screenshots/WIP_interruptHandling.png
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -27,251 +27,365 @@ stack_top:
|
||||
*/
|
||||
# NOTE: I have no clue how I should use these macros.
|
||||
# Have tried to use them in a myriad of ways, none would actually work
|
||||
.macro irq_NoErrCode code:req
|
||||
.globl irq\code
|
||||
irq\code:
|
||||
.macro irs_NoErrCode code:req
|
||||
.globl irs\code
|
||||
irs\code:
|
||||
cli
|
||||
pushb $0
|
||||
pushb \code
|
||||
jmp irq_common
|
||||
jmp irs_common
|
||||
.endm
|
||||
|
||||
.macro irq_ErrCode code
|
||||
.globl irq\code
|
||||
irq\code:
|
||||
.macro irs_ErrCode code
|
||||
.globl irs\code
|
||||
irs\code:
|
||||
cli
|
||||
pushb \code
|
||||
jmp irq_common
|
||||
jmp irs_common
|
||||
.endm
|
||||
|
||||
.globl irs0
|
||||
irs0:
|
||||
cli
|
||||
push $0
|
||||
push $0
|
||||
jmp irs_common
|
||||
|
||||
.globl irs1
|
||||
irs1:
|
||||
cli
|
||||
push $0
|
||||
push $1
|
||||
jmp irs_common
|
||||
|
||||
.globl irs2
|
||||
irs2:
|
||||
cli
|
||||
push $0
|
||||
push $2
|
||||
jmp irs_common
|
||||
|
||||
.globl irs3
|
||||
irs3:
|
||||
cli
|
||||
push $0
|
||||
push $3
|
||||
jmp irs_common
|
||||
|
||||
.globl irs4
|
||||
irs4:
|
||||
cli
|
||||
push $0
|
||||
push $4
|
||||
jmp irs_common
|
||||
|
||||
.globl irs5
|
||||
irs5:
|
||||
cli
|
||||
push $0
|
||||
push $5
|
||||
jmp irs_common
|
||||
|
||||
.globl irs6
|
||||
irs6:
|
||||
cli
|
||||
push $0
|
||||
push $6
|
||||
jmp irs_common
|
||||
|
||||
.globl irs7
|
||||
irs7:
|
||||
cli
|
||||
push $0
|
||||
push $7
|
||||
jmp irs_common
|
||||
|
||||
.globl irs8
|
||||
irs8:
|
||||
cli
|
||||
push $0
|
||||
push $8
|
||||
jmp irs_common
|
||||
|
||||
.globl irs9
|
||||
irs9:
|
||||
cli
|
||||
push $0
|
||||
push $9
|
||||
jmp irs_common
|
||||
|
||||
.globl irs10
|
||||
irs10:
|
||||
cli
|
||||
push $0
|
||||
push $10
|
||||
jmp irs_common
|
||||
|
||||
.globl irs11
|
||||
irs11:
|
||||
cli
|
||||
push $0
|
||||
push $11
|
||||
jmp irs_common
|
||||
|
||||
.globl irs12
|
||||
irs12:
|
||||
cli
|
||||
push $0
|
||||
push $12
|
||||
jmp irs_common
|
||||
|
||||
.globl irs13
|
||||
irs13:
|
||||
cli
|
||||
push $13
|
||||
jmp irs_common
|
||||
|
||||
.globl irs14
|
||||
irs14:
|
||||
cli
|
||||
push $0
|
||||
push $14
|
||||
jmp irs_common
|
||||
|
||||
.globl irs15
|
||||
irs15:
|
||||
cli
|
||||
push $0
|
||||
push $15
|
||||
jmp irs_common
|
||||
|
||||
.globl irs16
|
||||
irs16:
|
||||
cli
|
||||
push $0
|
||||
push $16
|
||||
jmp irs_common
|
||||
|
||||
.globl irs17
|
||||
irs17:
|
||||
cli
|
||||
push $0
|
||||
push $17
|
||||
jmp irs_common
|
||||
|
||||
.globl irs18
|
||||
irs18:
|
||||
cli
|
||||
push $0
|
||||
push $18
|
||||
jmp irs_common
|
||||
|
||||
.globl irs19
|
||||
irs19:
|
||||
cli
|
||||
push $0
|
||||
push $19
|
||||
jmp irs_common
|
||||
|
||||
.globl irs20
|
||||
irs20:
|
||||
cli
|
||||
push $0
|
||||
push $20
|
||||
jmp irs_common
|
||||
|
||||
.globl irs21
|
||||
irs21:
|
||||
cli
|
||||
push $0
|
||||
push $21
|
||||
jmp irs_common
|
||||
|
||||
.globl irs22
|
||||
irs22:
|
||||
cli
|
||||
push $0
|
||||
push $22
|
||||
jmp irs_common
|
||||
|
||||
.globl irs23
|
||||
irs23:
|
||||
cli
|
||||
push $0
|
||||
push $23
|
||||
jmp irs_common
|
||||
|
||||
.globl irs24
|
||||
irs24:
|
||||
cli
|
||||
push $0
|
||||
push $24
|
||||
jmp irs_common
|
||||
|
||||
.globl irs25
|
||||
irs25:
|
||||
cli
|
||||
push $0
|
||||
push $25
|
||||
jmp irs_common
|
||||
|
||||
.globl irs26
|
||||
irs26:
|
||||
cli
|
||||
push $0
|
||||
push $26
|
||||
jmp irs_common
|
||||
|
||||
.globl irs27
|
||||
irs27:
|
||||
cli
|
||||
push $0
|
||||
push $27
|
||||
jmp irs_common
|
||||
|
||||
.globl irs28
|
||||
irs28:
|
||||
cli
|
||||
push $0
|
||||
push $28
|
||||
jmp irs_common
|
||||
|
||||
.globl irs29
|
||||
irs29:
|
||||
cli
|
||||
push $0
|
||||
push $29
|
||||
jmp irs_common
|
||||
|
||||
.globl irs30
|
||||
irs30:
|
||||
cli
|
||||
push $0
|
||||
push $30
|
||||
jmp irs_common
|
||||
|
||||
.globl irs31
|
||||
irs31:
|
||||
cli
|
||||
push $0
|
||||
push $31
|
||||
jmp irs_common
|
||||
|
||||
|
||||
|
||||
.globl irq0
|
||||
irq0:
|
||||
cli
|
||||
push $0
|
||||
push $0
|
||||
jmp irq_common
|
||||
push $32
|
||||
jmp irs_common
|
||||
|
||||
.globl irq1
|
||||
irq1:
|
||||
cli
|
||||
push $0
|
||||
push $1
|
||||
jmp irq_common
|
||||
push $33
|
||||
jmp irs_common
|
||||
|
||||
.globl irq2
|
||||
irq2:
|
||||
cli
|
||||
push $0
|
||||
push $2
|
||||
jmp irq_common
|
||||
push $34
|
||||
jmp irs_common
|
||||
|
||||
.globl irq3
|
||||
irq3:
|
||||
cli
|
||||
push $0
|
||||
push $3
|
||||
jmp irq_common
|
||||
push $35
|
||||
jmp irs_common
|
||||
|
||||
.globl irq4
|
||||
irq4:
|
||||
cli
|
||||
push $0
|
||||
push $4
|
||||
jmp irq_common
|
||||
push $36
|
||||
jmp irs_common
|
||||
|
||||
.globl irq5
|
||||
irq5:
|
||||
cli
|
||||
push $0
|
||||
push $5
|
||||
jmp irq_common
|
||||
push $37
|
||||
jmp irs_common
|
||||
|
||||
.globl irq6
|
||||
irq6:
|
||||
cli
|
||||
push $0
|
||||
push $6
|
||||
jmp irq_common
|
||||
push $38
|
||||
jmp irs_common
|
||||
|
||||
.globl irq7
|
||||
irq7:
|
||||
cli
|
||||
push $0
|
||||
push $7
|
||||
jmp irq_common
|
||||
push $39
|
||||
jmp irs_common
|
||||
|
||||
.globl irq8
|
||||
irq8:
|
||||
cli
|
||||
push $0
|
||||
push $8
|
||||
jmp irq_common
|
||||
push $40
|
||||
jmp irs_common
|
||||
|
||||
.globl irq9
|
||||
irq9:
|
||||
cli
|
||||
push $0
|
||||
push $9
|
||||
jmp irq_common
|
||||
push $41
|
||||
jmp irs_common
|
||||
|
||||
.globl irq10
|
||||
irq10:
|
||||
cli
|
||||
push $0
|
||||
push $10
|
||||
jmp irq_common
|
||||
push $42
|
||||
jmp irs_common
|
||||
|
||||
.globl irq11
|
||||
irq11:
|
||||
cli
|
||||
push $0
|
||||
push $11
|
||||
jmp irq_common
|
||||
push $43
|
||||
jmp irs_common
|
||||
|
||||
|
||||
.globl irq12
|
||||
irq12:
|
||||
cli
|
||||
push $0
|
||||
push $12
|
||||
jmp irq_common
|
||||
push $44
|
||||
jmp irs_common
|
||||
|
||||
.globl irq13
|
||||
irq13:
|
||||
cli
|
||||
push $13
|
||||
jmp irq_common
|
||||
push $0
|
||||
push $45
|
||||
jmp irs_common
|
||||
|
||||
.globl irq14
|
||||
irq14:
|
||||
cli
|
||||
push $0
|
||||
push $14
|
||||
jmp irq_common
|
||||
push $46
|
||||
jmp irs_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
|
||||
push $47
|
||||
jmp irs_common
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
irq_common:
|
||||
irs_common:
|
||||
pusha # Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
|
||||
|
||||
|
||||
@ -286,7 +400,7 @@ irq_common:
|
||||
mov %ax, %fs
|
||||
mov %ax, %gs
|
||||
|
||||
call irq_handler
|
||||
call irs_handler
|
||||
|
||||
pop %eax
|
||||
|
||||
@ -296,7 +410,7 @@ irq_common:
|
||||
mov %ax, %gs
|
||||
|
||||
popa
|
||||
add $8, %esp # cleans push error and irq code
|
||||
add $8, %esp # cleans push error and irs code
|
||||
sti
|
||||
iret # pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP
|
||||
|
||||
|
@ -111,10 +111,9 @@ void set_id_entry (uint8_t num , uint32_t base, uint16_t sel, uint8_t flags){
|
||||
};
|
||||
|
||||
|
||||
void irq_handler (registers regs) {
|
||||
void irs_handler (registers regs) {
|
||||
kterm_writestring("received interrupt!\n");
|
||||
|
||||
|
||||
|
||||
printf(" Interrupt number: %d \n", regs.int_no);
|
||||
|
||||
if( regs.int_no == 13){
|
||||
@ -125,6 +124,10 @@ void irq_handler (registers regs) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void init_idt(){
|
||||
// Initialise the IDT pointer
|
||||
idt_ptr.length = sizeof(IDT_entry) * 255;
|
||||
@ -133,57 +136,61 @@ void init_idt(){
|
||||
|
||||
// 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);
|
||||
set_id_entry(0, (uint32_t) irs0 , 0x08, 0x8E);
|
||||
set_id_entry(1, (uint32_t) irs1 , 0x08, 0x8E);
|
||||
set_id_entry(2, (uint32_t) irs2 , 0x08, 0x8E);
|
||||
set_id_entry(3, (uint32_t) irs3 , 0x08, 0x8E);
|
||||
set_id_entry(4, (uint32_t) irs4 , 0x08, 0x8E);
|
||||
set_id_entry(5, (uint32_t) irs5 , 0x08, 0x8E);
|
||||
set_id_entry(6, (uint32_t) irs6 , 0x08, 0x8E);
|
||||
set_id_entry(7, (uint32_t) irs7 , 0x08, 0x8E);
|
||||
set_id_entry(8, (uint32_t) irs8 , 0x08, 0x8E);
|
||||
set_id_entry(9, (uint32_t) irs9 , 0x08, 0x8E);
|
||||
set_id_entry(10, (uint32_t) irs10 , 0x08, 0x8E);
|
||||
set_id_entry(11, (uint32_t) irs11 , 0x08, 0x8E);
|
||||
set_id_entry(12, (uint32_t) irs12 , 0x08, 0x8E);
|
||||
set_id_entry(13, (uint32_t) irs13 , 0x08, 0x8E);
|
||||
set_id_entry(14, (uint32_t) irs14 , 0x08, 0x8E);
|
||||
set_id_entry(15, (uint32_t) irs15 , 0x08, 0x8E);
|
||||
set_id_entry(16, (uint32_t) irs16 , 0x08, 0x8E);
|
||||
set_id_entry(17, (uint32_t) irs17 , 0x08, 0x8E);
|
||||
set_id_entry(18, (uint32_t) irs18 , 0x08, 0x8E);
|
||||
set_id_entry(19, (uint32_t) irs19 , 0x08, 0x8E);
|
||||
set_id_entry(20, (uint32_t) irs20 , 0x08, 0x8E);
|
||||
set_id_entry(21, (uint32_t) irs21 , 0x08, 0x8E);
|
||||
set_id_entry(22, (uint32_t) irs22 , 0x08, 0x8E);
|
||||
set_id_entry(23, (uint32_t) irs23 , 0x08, 0x8E);
|
||||
set_id_entry(24, (uint32_t) irs24 , 0x08, 0x8E);
|
||||
set_id_entry(25, (uint32_t) irs25 , 0x08, 0x8E);
|
||||
set_id_entry(26, (uint32_t) irs26 , 0x08, 0x8E);
|
||||
set_id_entry(27, (uint32_t) irs27 , 0x08, 0x8E);
|
||||
set_id_entry(28, (uint32_t) irs28 , 0x08, 0x8E);
|
||||
set_id_entry(29, (uint32_t) irs29 , 0x08, 0x8E);
|
||||
set_id_entry(30, (uint32_t) irs30 , 0x08, 0x8E);
|
||||
set_id_entry(31, (uint32_t) irs31 , 0x08, 0x8E);
|
||||
|
||||
|
||||
//print_serial("Remapping PIC\n");
|
||||
PIC_remap(0x20, 0x28);
|
||||
|
||||
|
||||
/*
|
||||
// pic IRQ Table
|
||||
set_id_entry(32, (uint32_t)irs0, 0x08, 0x8E);
|
||||
set_id_entry(33, (uint32_t)irs1, 0x08, 0x8E);
|
||||
set_id_entry(34, (uint32_t)irs2, 0x08, 0x8E);
|
||||
set_id_entry(35, (uint32_t)irs3, 0x08, 0x8E);
|
||||
set_id_entry(36, (uint32_t)irs4, 0x08, 0x8E);
|
||||
set_id_entry(37, (uint32_t)irs5, 0x08, 0x8E);
|
||||
set_id_entry(38, (uint32_t)irs6, 0x08, 0x8E);
|
||||
set_id_entry(39, (uint32_t)irs7, 0x08, 0x8E);
|
||||
set_id_entry(40, (uint32_t)irs8, 0x08, 0x8E);
|
||||
set_id_entry(41, (uint32_t)irs9, 0x08, 0x8E);
|
||||
set_id_entry(42, (uint32_t)irs10, 0x08, 0x8E);
|
||||
set_id_entry(43, (uint32_t)irs11, 0x08, 0x8E);
|
||||
set_id_entry(44, (uint32_t)irs12, 0x08, 0x8E);
|
||||
set_id_entry(45, (uint32_t)irs13, 0x08, 0x8E);
|
||||
set_id_entry(46, (uint32_t)irs14, 0x08, 0x8E);
|
||||
set_id_entry(47, (uint32_t)irs15, 0x08, 0x8E);*/
|
||||
set_id_entry(32, (uint32_t)irq0, 0x08, 0x8E);
|
||||
set_id_entry(33, (uint32_t)irq1, 0x08, 0x8E);
|
||||
set_id_entry(34, (uint32_t)irq2, 0x08, 0x8E);
|
||||
set_id_entry(35, (uint32_t)irq3, 0x08, 0x8E);
|
||||
set_id_entry(36, (uint32_t)irq4, 0x08, 0x8E);
|
||||
set_id_entry(37, (uint32_t)irq5, 0x08, 0x8E);
|
||||
set_id_entry(38, (uint32_t)irq6, 0x08, 0x8E);
|
||||
set_id_entry(39, (uint32_t)irq7, 0x08, 0x8E);
|
||||
set_id_entry(40, (uint32_t)irq8, 0x08, 0x8E);
|
||||
set_id_entry(41, (uint32_t)irq9, 0x08, 0x8E);
|
||||
set_id_entry(42, (uint32_t)irq10, 0x08, 0x8E);
|
||||
set_id_entry(43, (uint32_t)irq11, 0x08, 0x8E);
|
||||
set_id_entry(44, (uint32_t)irq12, 0x08, 0x8E);
|
||||
set_id_entry(45, (uint32_t)irq13, 0x08, 0x8E);
|
||||
set_id_entry(46, (uint32_t)irq14, 0x08, 0x8E);
|
||||
set_id_entry(47, (uint32_t)irq15, 0x08, 0x8E);
|
||||
|
||||
|
||||
idt_flush((uint32_t)&idt_ptr);
|
81
src/kernel/arch/i386/idt/idt.h
Normal file
81
src/kernel/arch/i386/idt/idt.h
Normal file
@ -0,0 +1,81 @@
|
||||
#pragma once
|
||||
|
||||
#include "stdint.h"
|
||||
#include "stddef.h"
|
||||
#include "../vga/colors.h"
|
||||
#include "../pic/pic.h";
|
||||
|
||||
#define AS_KERNEL() ( kterm_writestring("[KERNEL]:"))
|
||||
|
||||
extern "C" void kterm_writestring(const char* data );
|
||||
extern "C" void kterm_putat(char, uint8_t, size_t, size_t);
|
||||
extern "C" void kterm_put(char);
|
||||
|
||||
|
||||
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);
|
||||
|
||||
void irs_handler (registers regs);
|
||||
|
||||
extern void irs0 ();
|
||||
extern void irs1 ();
|
||||
extern void irs2 ();
|
||||
extern void irs3 ();
|
||||
extern void irs4 ();
|
||||
extern void irs5 ();
|
||||
extern void irs6 ();
|
||||
extern void irs7 ();
|
||||
extern void irs8 ();
|
||||
extern void irs9 ();
|
||||
extern void irs10 ();
|
||||
extern void irs11 ();
|
||||
extern void irs12 ();
|
||||
extern void irs13 ();
|
||||
extern void irs14 ();
|
||||
extern void irs15 ();
|
||||
extern void irs16 ();
|
||||
extern void irs17 ();
|
||||
extern void irs18 ();
|
||||
extern void irs19 ();
|
||||
extern void irs20 ();
|
||||
extern void irs21 ();
|
||||
extern void irs22 ();
|
||||
extern void irs23 ();
|
||||
extern void irs24 ();
|
||||
extern void irs25 ();
|
||||
extern void irs26 ();
|
||||
extern void irs27 ();
|
||||
extern void irs28 ();
|
||||
extern void irs29 ();
|
||||
extern void irs30 ();
|
||||
extern void irs31 ();
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
62
src/kernel/arch/i386/pic/pic.cpp
Normal file
62
src/kernel/arch/i386/pic/pic.cpp
Normal file
@ -0,0 +1,62 @@
|
||||
#include "pic.h"
|
||||
|
||||
extern "C" void PIC_sendEOI (unsigned char irq){
|
||||
if(irq >= 8)
|
||||
outb(PIC2_COMMAND, PIC_EOI);
|
||||
outb(PIC1_COMMAND, PIC_EOI);
|
||||
}
|
||||
|
||||
/* Helper func */
|
||||
static uint16_t __pic_get_irq_reg(int ocw3)
|
||||
{
|
||||
/* OCW3 to PIC CMD to get the register values. PIC2 is chained, and
|
||||
* represents IRQs 8-15. PIC1 is IRQs 0-7, with 2 being the chain */
|
||||
outb(PIC1_COMMAND, ocw3);
|
||||
outb(PIC2_COMMAND, ocw3);
|
||||
return (inb(PIC2_COMMAND) << 8) | inb(PIC1_COMMAND);
|
||||
}
|
||||
|
||||
/* Returns the combined value of the cascaded PICs irq request register */
|
||||
uint16_t pic_get_irr(void)
|
||||
{
|
||||
return __pic_get_irq_reg(PIC_READ_IRR);
|
||||
}
|
||||
|
||||
/* Returns the combined value of the cascaded PICs in-service register */
|
||||
uint16_t pic_get_isr(void)
|
||||
{
|
||||
return __pic_get_irq_reg(PIC_READ_ISR);
|
||||
}
|
||||
|
||||
|
||||
void PIC_remap (int offset1, int offset2 ){
|
||||
unsigned char a1, a2;
|
||||
|
||||
a1 = inb(PIC1_DATA);
|
||||
a2 = inb(PIC2_DATA);
|
||||
|
||||
|
||||
// Start initialization
|
||||
|
||||
outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4);
|
||||
io_wait();
|
||||
outb(PIC2_COMMAND, ICW1_INIT | ICW1_ICW4);
|
||||
io_wait();
|
||||
outb(PIC1_DATA, offset1);
|
||||
io_wait();
|
||||
outb(PIC2_DATA, offset2);
|
||||
io_wait();
|
||||
outb(PIC1_DATA, 4);
|
||||
io_wait();
|
||||
outb(PIC2_DATA, 2);
|
||||
io_wait();
|
||||
|
||||
outb(PIC1_DATA, ICW4_8086);
|
||||
io_wait();
|
||||
outb(PIC2_DATA, ICW4_8086);
|
||||
io_wait();
|
||||
|
||||
outb(PIC1_DATA, a1);
|
||||
outb(PIC2_DATA, a2);
|
||||
|
||||
}
|
57
src/kernel/arch/i386/pic/pic.h
Normal file
57
src/kernel/arch/i386/pic/pic.h
Normal file
@ -0,0 +1,57 @@
|
||||
#pragma once
|
||||
#include "../../../io.h"
|
||||
|
||||
#define PIC1 0x20 /* IO base address for master PIC */
|
||||
#define PIC2 0xA0 /* IO base address for slave PIC */
|
||||
#define PIC1_COMMAND PIC1
|
||||
#define PIC1_DATA (PIC1+1)
|
||||
#define PIC2_COMMAND PIC2
|
||||
#define PIC2_DATA (PIC2+1)
|
||||
|
||||
|
||||
#define ICW1_ICW4 0x01 /* ICW4 (not) needed */
|
||||
#define ICW1_SINGLE 0x02 /* Single (cascade) mode */
|
||||
#define ICW1_INTERVAL4 0x04 /* Call address interval 4 (8) */
|
||||
#define ICW1_LEVEL 0x08 /* Level triggered (edge) mode */
|
||||
#define ICW1_INIT 0x10 /* Initialization - required! */
|
||||
|
||||
#define ICW4_8086 0x01 /* 8086/88 (MCS-80/85) mode */
|
||||
#define ICW4_AUTO 0x02 /* Auto (normal) EOI */
|
||||
#define ICW4_BUF_SLAVE 0x08 /* Buffered mode/slave */
|
||||
#define ICW4_BUF_MASTER 0x0C /* Buffered mode/master */
|
||||
#define ICW4_SFNM 0x10 /* Special fully nested (not) */
|
||||
|
||||
#define PIC_EOI 0x20
|
||||
#define PIC_READ_IRR 0x0a /* OCW3 irq ready next CMD read */
|
||||
#define PIC_READ_ISR 0x0b /* OCW3 irq service next CMD read */
|
||||
|
||||
extern "C"{
|
||||
|
||||
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 ();
|
||||
|
||||
void PIC_sendEOI (unsigned char irq);
|
||||
|
||||
}
|
||||
|
||||
|
||||
static uint16_t __pic_get_irq_reg(int ocw3);
|
||||
uint16_t pic_get_irr(void);
|
||||
uint16_t pic_get_isr(void);
|
||||
|
||||
|
||||
void PIC_remap (int offset1, int offset2 );
|
@ -1,93 +0,0 @@
|
||||
#pragma once
|
||||
#include "stdint.h"
|
||||
#include "stddef.h"
|
||||
#include "arch/i386/vga/colors.h"
|
||||
|
||||
#define AS_KERNEL() ( kterm_writestring("[KERNEL]:"))
|
||||
|
||||
extern "C" void kterm_writestring(const char* data );
|
||||
extern "C" void kterm_putat(char, uint8_t, size_t, size_t);
|
||||
extern "C" void kterm_put(char);
|
||||
|
||||
|
||||
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 ();
|
||||
/*
|
||||
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 ();*/
|
||||
|
||||
|
||||
|
||||
}
|
@ -9,10 +9,6 @@ void delay(int t){
|
||||
asm("NOP");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class Test {
|
||||
public:
|
||||
Test();
|
||||
@ -20,7 +16,6 @@ class Test {
|
||||
~Test();
|
||||
};
|
||||
|
||||
|
||||
Test::Test(){
|
||||
kterm_writestring("Create a test object\n");
|
||||
};
|
||||
@ -56,7 +51,6 @@ static int init_serial() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int is_transmit_empty() {
|
||||
return inb(PORT + 5) & 0x20;
|
||||
}
|
||||
@ -77,7 +71,6 @@ char read_serial() {
|
||||
return inb(PORT);
|
||||
}
|
||||
|
||||
|
||||
void print_serial(const char* string ){
|
||||
for(size_t i = 0; i < strlen(string); i ++){
|
||||
write_serial(string[i]);
|
||||
@ -102,31 +95,13 @@ void test_serial(){
|
||||
kterm_writestring("\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
extern "C" {
|
||||
|
||||
void early_main(){
|
||||
|
||||
init_serial();
|
||||
print_serial("\033[31;42mEarly main called!\n");
|
||||
|
||||
print_serial("Remapping PIC\n");
|
||||
// remap the PIC IRQ table
|
||||
/*outb(0x20, 0x11);
|
||||
outb(0xA0, 0x11);
|
||||
outb(0x21, 0x20);
|
||||
outb(0xA1, 0x28);
|
||||
outb(0x21, 0x04);
|
||||
outb(0xA1, 0x02);
|
||||
outb(0x21, 0x01);
|
||||
outb(0xA1, 0x01);
|
||||
outb(0x21, 0x0);
|
||||
outb(0xA1, 0x0);*/
|
||||
|
||||
|
||||
print_serial("done... \n");
|
||||
|
||||
|
||||
}
|
||||
|
||||
void kernel_main (void) {
|
||||
@ -162,24 +137,7 @@ extern "C" {
|
||||
auto testObject = Test();
|
||||
testObject.printMe();
|
||||
|
||||
/*IRQ_set_mask(0);
|
||||
IRQ_set_mask(1);
|
||||
IRQ_set_mask(2);
|
||||
IRQ_set_mask(3);
|
||||
IRQ_set_mask(4);
|
||||
IRQ_set_mask(5);
|
||||
IRQ_set_mask(6);
|
||||
IRQ_set_mask(7);
|
||||
IRQ_set_mask(8);
|
||||
IRQ_set_mask(9);
|
||||
IRQ_set_mask(10);
|
||||
IRQ_set_mask(11);
|
||||
IRQ_set_mask(12);
|
||||
IRQ_set_mask(13);
|
||||
IRQ_set_mask(14);
|
||||
IRQ_set_mask(15);
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/** test interrupt handlers **/
|
||||
asm volatile ("int $0x03");
|
||||
|
@ -3,7 +3,7 @@ extern "C" {
|
||||
#include "../libc/include/string.h"
|
||||
#include "arch/i386/tty/kterm.h"
|
||||
}
|
||||
|
||||
#include "arch/i386/idt/idt.h"
|
||||
#include "MMU.h"
|
||||
#include "io.h"
|
||||
#include "idt.h"
|
||||
//#include "pic.h"
|
27
src/kernel/timer.cpp
Normal file
27
src/kernel/timer.cpp
Normal file
@ -0,0 +1,27 @@
|
||||
#include "timer.h"
|
||||
|
||||
uint32_t tick = 0;
|
||||
|
||||
|
||||
static void timer_callback (registers_t regs ){
|
||||
tick ++ ;
|
||||
kterm_writestring ("tick passed!");
|
||||
}
|
||||
|
||||
void init_timer (uint32_t frequency){
|
||||
// register timer callback
|
||||
|
||||
uint32_t divisor = 1193180 / frequency;
|
||||
|
||||
// Send the commmand byte
|
||||
outb(0x43, 0x36);
|
||||
|
||||
// Divisor has to be sent byt-wise , so will send lower then upper bytes
|
||||
uint8_t low = (uint8_t) (divisor & 0xFF);
|
||||
uint8_t high = (uint8_t) ((divisor >> 8) & 0xFF);
|
||||
|
||||
outb(0x40, low);
|
||||
outb(0x40, high);
|
||||
|
||||
|
||||
}
|
6
src/kernel/timer.h
Normal file
6
src/kernel/timer.h
Normal file
@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
void init_timer (uint32_t frequency);
|
Loading…
Reference in New Issue
Block a user