Merge into main the new state of the operating system/kernel #1
11
Makefile
11
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 $(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
|
SRC_DIR = src
|
||||||
BUILD_DIR = build
|
BUILD_DIR = build
|
||||||
@ -24,7 +24,7 @@ all: clean build
|
|||||||
build: build_kernel run
|
build: build_kernel run
|
||||||
|
|
||||||
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)
|
build_kernel: $(OBJ_LINK_LIST)
|
||||||
|
|
||||||
@ -55,7 +55,12 @@ $(BUILD_DIR)/crtn.o:
|
|||||||
|
|
||||||
$(BUILD_DIR)/io.o:
|
$(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:
|
$(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. 😲
|
The first scrolling boot screen. 😲
|
||||||
|
|
||||||
|
|
||||||
|
<img src="screenshots/WIP_interruptHandling.png"></img>
|
||||||
|
W.I.P - Working on interrupt handling
|
||||||
|
|
||||||
________________________
|
________________________
|
||||||
|
|
||||||
### The goal
|
### The goal
|
||||||
|
BIN
screenshots/WIP_interruptHandling.png
Normal file
BIN
screenshots/WIP_interruptHandling.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
@ -27,251 +27,365 @@ stack_top:
|
|||||||
*/
|
*/
|
||||||
# NOTE: I have no clue how I should use these macros.
|
# 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
|
# Have tried to use them in a myriad of ways, none would actually work
|
||||||
.macro irq_NoErrCode code:req
|
.macro irs_NoErrCode code:req
|
||||||
.globl irq\code
|
.globl irs\code
|
||||||
irq\code:
|
irs\code:
|
||||||
cli
|
cli
|
||||||
pushb $0
|
pushb $0
|
||||||
pushb \code
|
pushb \code
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro irq_ErrCode code
|
.macro irs_ErrCode code
|
||||||
.globl irq\code
|
.globl irs\code
|
||||||
irq\code:
|
irs\code:
|
||||||
cli
|
cli
|
||||||
pushb \code
|
pushb \code
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
.endm
|
.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
|
.globl irq0
|
||||||
irq0:
|
irq0:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $0
|
push $32
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq1
|
.globl irq1
|
||||||
irq1:
|
irq1:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $1
|
push $33
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq2
|
.globl irq2
|
||||||
irq2:
|
irq2:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $2
|
push $34
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq3
|
.globl irq3
|
||||||
irq3:
|
irq3:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $3
|
push $35
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq4
|
.globl irq4
|
||||||
irq4:
|
irq4:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $4
|
push $36
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq5
|
.globl irq5
|
||||||
irq5:
|
irq5:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $5
|
push $37
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq6
|
.globl irq6
|
||||||
irq6:
|
irq6:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $6
|
push $38
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq7
|
.globl irq7
|
||||||
irq7:
|
irq7:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $7
|
push $39
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq8
|
.globl irq8
|
||||||
irq8:
|
irq8:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $8
|
push $40
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq9
|
.globl irq9
|
||||||
irq9:
|
irq9:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $9
|
push $41
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq10
|
.globl irq10
|
||||||
irq10:
|
irq10:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $10
|
push $42
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq11
|
.globl irq11
|
||||||
irq11:
|
irq11:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $11
|
push $43
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
|
|
||||||
.globl irq12
|
.globl irq12
|
||||||
irq12:
|
irq12:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $12
|
push $44
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq13
|
.globl irq13
|
||||||
irq13:
|
irq13:
|
||||||
cli
|
cli
|
||||||
push $13
|
push $0
|
||||||
jmp irq_common
|
push $45
|
||||||
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq14
|
.globl irq14
|
||||||
irq14:
|
irq14:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $14
|
push $46
|
||||||
jmp irq_common
|
jmp irs_common
|
||||||
|
|
||||||
.globl irq15
|
.globl irq15
|
||||||
irq15:
|
irq15:
|
||||||
cli
|
cli
|
||||||
push $0
|
push $0
|
||||||
push $15
|
push $47
|
||||||
jmp irq_common
|
jmp irs_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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
irs_common:
|
||||||
irq_common:
|
|
||||||
pusha # Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
|
pusha # Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
|
||||||
|
|
||||||
|
|
||||||
@ -286,7 +400,7 @@ irq_common:
|
|||||||
mov %ax, %fs
|
mov %ax, %fs
|
||||||
mov %ax, %gs
|
mov %ax, %gs
|
||||||
|
|
||||||
call irq_handler
|
call irs_handler
|
||||||
|
|
||||||
pop %eax
|
pop %eax
|
||||||
|
|
||||||
@ -296,7 +410,7 @@ irq_common:
|
|||||||
mov %ax, %gs
|
mov %ax, %gs
|
||||||
|
|
||||||
popa
|
popa
|
||||||
add $8, %esp # cleans push error and irq code
|
add $8, %esp # cleans push error and irs code
|
||||||
sti
|
sti
|
||||||
iret # pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP
|
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");
|
kterm_writestring("received interrupt!\n");
|
||||||
|
|
||||||
|
|
||||||
printf(" Interrupt number: %d \n", regs.int_no);
|
printf(" Interrupt number: %d \n", regs.int_no);
|
||||||
|
|
||||||
if( regs.int_no == 13){
|
if( regs.int_no == 13){
|
||||||
@ -125,6 +124,10 @@ void irq_handler (registers regs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void init_idt(){
|
void init_idt(){
|
||||||
// Initialise the IDT pointer
|
// Initialise the IDT pointer
|
||||||
idt_ptr.length = sizeof(IDT_entry) * 255;
|
idt_ptr.length = sizeof(IDT_entry) * 255;
|
||||||
@ -133,57 +136,61 @@ void init_idt(){
|
|||||||
|
|
||||||
// TODO: Set everything to zero first
|
// TODO: Set everything to zero first
|
||||||
|
|
||||||
set_id_entry(0, (uint32_t) irq0 , 0x08, 0x8E);
|
set_id_entry(0, (uint32_t) irs0 , 0x08, 0x8E);
|
||||||
set_id_entry(1, (uint32_t) irq1 , 0x08, 0x8E);
|
set_id_entry(1, (uint32_t) irs1 , 0x08, 0x8E);
|
||||||
set_id_entry(2, (uint32_t) irq2 , 0x08, 0x8E);
|
set_id_entry(2, (uint32_t) irs2 , 0x08, 0x8E);
|
||||||
set_id_entry(3, (uint32_t) irq3 , 0x08, 0x8E);
|
set_id_entry(3, (uint32_t) irs3 , 0x08, 0x8E);
|
||||||
set_id_entry(4, (uint32_t) irq4 , 0x08, 0x8E);
|
set_id_entry(4, (uint32_t) irs4 , 0x08, 0x8E);
|
||||||
set_id_entry(5, (uint32_t) irq5 , 0x08, 0x8E);
|
set_id_entry(5, (uint32_t) irs5 , 0x08, 0x8E);
|
||||||
set_id_entry(6, (uint32_t) irq6 , 0x08, 0x8E);
|
set_id_entry(6, (uint32_t) irs6 , 0x08, 0x8E);
|
||||||
set_id_entry(7, (uint32_t) irq7 , 0x08, 0x8E);
|
set_id_entry(7, (uint32_t) irs7 , 0x08, 0x8E);
|
||||||
set_id_entry(8, (uint32_t) irq8 , 0x08, 0x8E);
|
set_id_entry(8, (uint32_t) irs8 , 0x08, 0x8E);
|
||||||
set_id_entry(9, (uint32_t) irq9 , 0x08, 0x8E);
|
set_id_entry(9, (uint32_t) irs9 , 0x08, 0x8E);
|
||||||
set_id_entry(10, (uint32_t) irq10 , 0x08, 0x8E);
|
set_id_entry(10, (uint32_t) irs10 , 0x08, 0x8E);
|
||||||
set_id_entry(11, (uint32_t) irq11 , 0x08, 0x8E);
|
set_id_entry(11, (uint32_t) irs11 , 0x08, 0x8E);
|
||||||
set_id_entry(12, (uint32_t) irq12 , 0x08, 0x8E);
|
set_id_entry(12, (uint32_t) irs12 , 0x08, 0x8E);
|
||||||
set_id_entry(13, (uint32_t) irq13 , 0x08, 0x8E);
|
set_id_entry(13, (uint32_t) irs13 , 0x08, 0x8E);
|
||||||
set_id_entry(14, (uint32_t) irq14 , 0x08, 0x8E);
|
set_id_entry(14, (uint32_t) irs14 , 0x08, 0x8E);
|
||||||
set_id_entry(15, (uint32_t) irq15 , 0x08, 0x8E);
|
set_id_entry(15, (uint32_t) irs15 , 0x08, 0x8E);
|
||||||
set_id_entry(16, (uint32_t) irq16 , 0x08, 0x8E);
|
set_id_entry(16, (uint32_t) irs16 , 0x08, 0x8E);
|
||||||
set_id_entry(17, (uint32_t) irq17 , 0x08, 0x8E);
|
set_id_entry(17, (uint32_t) irs17 , 0x08, 0x8E);
|
||||||
set_id_entry(18, (uint32_t) irq18 , 0x08, 0x8E);
|
set_id_entry(18, (uint32_t) irs18 , 0x08, 0x8E);
|
||||||
set_id_entry(19, (uint32_t) irq19 , 0x08, 0x8E);
|
set_id_entry(19, (uint32_t) irs19 , 0x08, 0x8E);
|
||||||
set_id_entry(20, (uint32_t) irq20 , 0x08, 0x8E);
|
set_id_entry(20, (uint32_t) irs20 , 0x08, 0x8E);
|
||||||
set_id_entry(21, (uint32_t) irq21 , 0x08, 0x8E);
|
set_id_entry(21, (uint32_t) irs21 , 0x08, 0x8E);
|
||||||
set_id_entry(22, (uint32_t) irq22 , 0x08, 0x8E);
|
set_id_entry(22, (uint32_t) irs22 , 0x08, 0x8E);
|
||||||
set_id_entry(23, (uint32_t) irq23 , 0x08, 0x8E);
|
set_id_entry(23, (uint32_t) irs23 , 0x08, 0x8E);
|
||||||
set_id_entry(24, (uint32_t) irq24 , 0x08, 0x8E);
|
set_id_entry(24, (uint32_t) irs24 , 0x08, 0x8E);
|
||||||
set_id_entry(25, (uint32_t) irq25 , 0x08, 0x8E);
|
set_id_entry(25, (uint32_t) irs25 , 0x08, 0x8E);
|
||||||
set_id_entry(26, (uint32_t) irq26 , 0x08, 0x8E);
|
set_id_entry(26, (uint32_t) irs26 , 0x08, 0x8E);
|
||||||
set_id_entry(27, (uint32_t) irq27 , 0x08, 0x8E);
|
set_id_entry(27, (uint32_t) irs27 , 0x08, 0x8E);
|
||||||
set_id_entry(28, (uint32_t) irq28 , 0x08, 0x8E);
|
set_id_entry(28, (uint32_t) irs28 , 0x08, 0x8E);
|
||||||
set_id_entry(29, (uint32_t) irq29 , 0x08, 0x8E);
|
set_id_entry(29, (uint32_t) irs29 , 0x08, 0x8E);
|
||||||
set_id_entry(30, (uint32_t) irq30 , 0x08, 0x8E);
|
set_id_entry(30, (uint32_t) irs30 , 0x08, 0x8E);
|
||||||
set_id_entry(31, (uint32_t) irq31 , 0x08, 0x8E);
|
set_id_entry(31, (uint32_t) irs31 , 0x08, 0x8E);
|
||||||
|
|
||||||
|
|
||||||
|
//print_serial("Remapping PIC\n");
|
||||||
|
PIC_remap(0x20, 0x28);
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
// pic IRQ Table
|
// pic IRQ Table
|
||||||
set_id_entry(32, (uint32_t)irs0, 0x08, 0x8E);
|
set_id_entry(32, (uint32_t)irq0, 0x08, 0x8E);
|
||||||
set_id_entry(33, (uint32_t)irs1, 0x08, 0x8E);
|
set_id_entry(33, (uint32_t)irq1, 0x08, 0x8E);
|
||||||
set_id_entry(34, (uint32_t)irs2, 0x08, 0x8E);
|
set_id_entry(34, (uint32_t)irq2, 0x08, 0x8E);
|
||||||
set_id_entry(35, (uint32_t)irs3, 0x08, 0x8E);
|
set_id_entry(35, (uint32_t)irq3, 0x08, 0x8E);
|
||||||
set_id_entry(36, (uint32_t)irs4, 0x08, 0x8E);
|
set_id_entry(36, (uint32_t)irq4, 0x08, 0x8E);
|
||||||
set_id_entry(37, (uint32_t)irs5, 0x08, 0x8E);
|
set_id_entry(37, (uint32_t)irq5, 0x08, 0x8E);
|
||||||
set_id_entry(38, (uint32_t)irs6, 0x08, 0x8E);
|
set_id_entry(38, (uint32_t)irq6, 0x08, 0x8E);
|
||||||
set_id_entry(39, (uint32_t)irs7, 0x08, 0x8E);
|
set_id_entry(39, (uint32_t)irq7, 0x08, 0x8E);
|
||||||
set_id_entry(40, (uint32_t)irs8, 0x08, 0x8E);
|
set_id_entry(40, (uint32_t)irq8, 0x08, 0x8E);
|
||||||
set_id_entry(41, (uint32_t)irs9, 0x08, 0x8E);
|
set_id_entry(41, (uint32_t)irq9, 0x08, 0x8E);
|
||||||
set_id_entry(42, (uint32_t)irs10, 0x08, 0x8E);
|
set_id_entry(42, (uint32_t)irq10, 0x08, 0x8E);
|
||||||
set_id_entry(43, (uint32_t)irs11, 0x08, 0x8E);
|
set_id_entry(43, (uint32_t)irq11, 0x08, 0x8E);
|
||||||
set_id_entry(44, (uint32_t)irs12, 0x08, 0x8E);
|
set_id_entry(44, (uint32_t)irq12, 0x08, 0x8E);
|
||||||
set_id_entry(45, (uint32_t)irs13, 0x08, 0x8E);
|
set_id_entry(45, (uint32_t)irq13, 0x08, 0x8E);
|
||||||
set_id_entry(46, (uint32_t)irs14, 0x08, 0x8E);
|
set_id_entry(46, (uint32_t)irq14, 0x08, 0x8E);
|
||||||
set_id_entry(47, (uint32_t)irs15, 0x08, 0x8E);*/
|
set_id_entry(47, (uint32_t)irq15, 0x08, 0x8E);
|
||||||
|
|
||||||
|
|
||||||
idt_flush((uint32_t)&idt_ptr);
|
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");
|
asm("NOP");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Test {
|
class Test {
|
||||||
public:
|
public:
|
||||||
Test();
|
Test();
|
||||||
@ -20,7 +16,6 @@ class Test {
|
|||||||
~Test();
|
~Test();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Test::Test(){
|
Test::Test(){
|
||||||
kterm_writestring("Create a test object\n");
|
kterm_writestring("Create a test object\n");
|
||||||
};
|
};
|
||||||
@ -56,7 +51,6 @@ static int init_serial() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int is_transmit_empty() {
|
int is_transmit_empty() {
|
||||||
return inb(PORT + 5) & 0x20;
|
return inb(PORT + 5) & 0x20;
|
||||||
}
|
}
|
||||||
@ -77,7 +71,6 @@ char read_serial() {
|
|||||||
return inb(PORT);
|
return inb(PORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void print_serial(const char* string ){
|
void print_serial(const char* string ){
|
||||||
for(size_t i = 0; i < strlen(string); i ++){
|
for(size_t i = 0; i < strlen(string); i ++){
|
||||||
write_serial(string[i]);
|
write_serial(string[i]);
|
||||||
@ -102,31 +95,13 @@ void test_serial(){
|
|||||||
kterm_writestring("\n");
|
kterm_writestring("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
void early_main(){
|
void early_main(){
|
||||||
|
|
||||||
init_serial();
|
init_serial();
|
||||||
print_serial("\033[31;42mEarly main called!\n");
|
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) {
|
void kernel_main (void) {
|
||||||
@ -162,24 +137,7 @@ extern "C" {
|
|||||||
auto testObject = Test();
|
auto testObject = Test();
|
||||||
testObject.printMe();
|
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 **/
|
/** test interrupt handlers **/
|
||||||
asm volatile ("int $0x03");
|
asm volatile ("int $0x03");
|
||||||
|
@ -3,7 +3,7 @@ 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 "arch/i386/idt/idt.h"
|
||||||
#include "MMU.h"
|
#include "MMU.h"
|
||||||
#include "io.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