Skip to content

Commit 7683939

Browse files
committed
Added empty interrupts desriptive table
1 parent 653596e commit 7683939

File tree

11 files changed

+139
-27
lines changed

11 files changed

+139
-27
lines changed

Makefile

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,12 @@ $(bt_stage2): $(SRC_BOOTLOADER)/stage2.asm $(SRC_BOOTLOADER)/stage2.c $(SRC_BOOT
106106
ld --oformat binary -m elf_i386 -Ttext 0x8000 --strip-all -o $@ $(BUILD_BOOTLOADER)/stage2_asm.o $(BUILD_BOOTLOADER)/stage2_c.o $(BUILD_LIB_UTILS)/libutils_16 $(BUILD_DRIVERS)/display/libtm_bios
107107
truncate --size=%512 $@
108108

109-
$(kernel_core): $(SRC_KERNEL)/core.asm $(SRC_KERNEL)/core.c $(SRC_KERNEL)/essentials.c $(SRC_LIB_UTILS)/io.h $(SRC_DRIVERS)/keyboard/keyboard.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_DRIVERS)/display/libtm_vga # And other io.h dependecies -_-
109+
$(kernel_core): $(SRC_KERNEL)/core.asm $(SRC_KERNEL)/core.c $(SRC_KERNEL)/essentials.c $(SRC_KERNEL)/interrupts.c $(SRC_KERNEL)/interrupts.asm $(SRC_LIB_UTILS)/io.h $(SRC_DRIVERS)/keyboard/keyboard.h $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_DRIVERS)/display/libtm_vga # And other io.h dependecies -_-
110110
mkdir -p $$(dirname $(kernel_core))
111111
nasm -o $(BUILD_KERNEL)/core_asm.o -f elf32 $(SRC_KERNEL)/core.asm
112-
gcc -m32 -fno-pie -c -Isrc -o $(BUILD_KERNEL)/core_c.o $(SRC_KERNEL)/core.c
113-
ld --oformat binary -m elf_i386 --trace -Ttext 0x0000 --strip-all -o $(kernel_core) $(BUILD_KERNEL)/core_asm.o $(BUILD_KERNEL)/core_c.o $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_DRIVERS)/display/libtm_vga
112+
nasm -o $(BUILD_KERNEL)/interrupts_asm.o -f elf32 $(SRC_KERNEL)/interrupts.asm
113+
gcc -m32 -fno-pie -c -Isrc -D KERNEL_MEMORY_LOCATION=$(KERNEL_MEMORY_LOCATION) -o $(BUILD_KERNEL)/core_c.o $(SRC_KERNEL)/core.c
114+
ld --oformat binary -m elf_i386 --trace -Ttext 0x0000 --strip-all -o $(kernel_core) $(BUILD_KERNEL)/core_asm.o $(BUILD_KERNEL)/core_c.o $(BUILD_KERNEL)/interrupts_asm.o $(BUILD_LIB_UTILS)/libutils $(BUILD_DRIVERS)/keyboard/libkeyboard $(BUILD_DRIVERS)/display/libtm_vga
114115
truncate --size=%512 $(kernel_core)
115116

116117
# Libraries

src/bootloader/stage2.asm

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ global enter_protected_mode
99
global label_exit
1010

1111
[SECTION .text]
12-
CLI
1312
MOV ax, 0x0000
1413
MOV es, ax ; es := 0
1514
set_blinking 0
@@ -24,8 +23,6 @@ global label_exit
2423
push ebp
2524
mov ebp, esp
2625

27-
cli
28-
2926
; Load GDT Table
3027
; Workaround for Issue #3
3128
mov eax, [esp+8] ; gdtr_address

src/bootloader/stage2.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ char message_protected_mode[] = "Enabling Protected Mode...";
1111

1212
#define GDT_TABLE_SIZE 3
1313

14+
#pragma pack(push, 1)
1415
struct GDTReference {
1516
unsigned short size;
1617
unsigned int base_address;
1718
};
18-
1919
struct GDTEntry {
2020
unsigned short limit0;
2121
unsigned short base0;
@@ -24,6 +24,7 @@ struct GDTEntry {
2424
unsigned char flags_limit1;
2525
unsigned char base2;
2626
};
27+
#pragma pack(pop)
2728

2829
// Issue#2: gdt_table must immediately after gdtr.
2930
struct GDTReference gdtr;

src/drivers/keyboard/keyboard.asm

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
global port_write
44
global port_read
5+
global enable_interrupts
6+
global disable_interrupts
57

68
[SECTION .text]
79
port_write:
@@ -26,4 +28,12 @@ global port_read
2628

2729
mov esp, ebp
2830
pop ebp
29-
ret
31+
ret
32+
33+
enable_interrupts:
34+
STI
35+
ret
36+
37+
disable_interrupts:
38+
CLI
39+
ret

src/drivers/keyboard/keyboard.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,13 @@ unsigned char read_data_reply() {
129129
wait_for_status_flag_timeout(STATUS_OUTPUT_BUFFER, 1, WAIT_FOR_STATUS_TIMEOUT);
130130
return port_read(DRIVERS_KEYBOARD_PORT_DATA);
131131
}
132+
extern "C" void enable_interrupts();
133+
extern "C" void disable_interrupts();
134+
132135

133136
extern "C" void keyboard_init() {
134-
sleep_mini(30000000);
137+
sleep_mini(3000000);
138+
135139
unsigned char out;
136140
// disable PS/2 first port
137141
ps2_controller_send_command(0XAD, 0);
@@ -186,6 +190,7 @@ extern "C" void keyboard_init() {
186190
// enable second port
187191
ps2_controller_send_command(0xA8, 0);
188192
}
193+
189194
// enable interrupts
190195
// out = ps2_controller_send_command(0X20, 1);
191196
// out |= 0b11;

src/kernel/core.asm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ extern entry_core
44
global __low_va_args
55

66
[SECTION .text]
7+
CLI
78
mov ax, 0x10
89
mov es, ax
910
mov ss, ax

src/kernel/core.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
#include <drivers/display/text_mode.h>
22
#include <drivers/keyboard/keyboard.h>
3-
#include <kernel/essentials.c>
43
#include <lib/utils/io.h>
54
#include <lib/utils/panic.h>
65

6+
#include "kernel/essentials.c"
7+
#include "kernel/interrupts.c"
8+
9+
extern void kernel_enable_interrupts();
10+
711
int call_main(unsigned short cs,unsigned short ip, int argc, char *argv[]) {
812
return ((int (*) (int, char *[]))(unsigned int)ip)(argc, argv);
913
}
@@ -24,11 +28,13 @@ void exec(int sector_index, int sector_count){
2428
}
2529

2630
void entry_core() {
27-
set_color_bg(C_BLACK);
31+
set_color_bg(C_BLUE);
2832
set_color_fg(C_WHITE);
33+
print_rectangle(0, 0, TEXT_WINDOW_WIDTH-1, TEXT_WINDOW_WIDTH-1);
2934

30-
move_xy(6,22);
35+
move_xy(2,2);
3136
print_line("Initializing Kernel...");
32-
keyboard_init();
37+
populate_and_load_idt_table();
38+
kernel_enable_interrupts();
3339
PANIC(501, "Kernel is under development!!!");
3440
}

src/kernel/interrupts.asm

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
[BITS 32]
2+
3+
global interrupt_nohup
4+
global load_idt_table
5+
global kernel_enable_interrupts
6+
global kernel_disable_interrupts
7+
global idt_table
8+
9+
[SECTION .text]
10+
11+
interrupt_nohup:
12+
iret
13+
14+
load_idt_table:
15+
push ebp
16+
mov ebp, esp
17+
18+
mov eax, [ebp + 0x8]
19+
lidt [eax]
20+
21+
mov esp, ebp
22+
pop ebp
23+
ret
24+
25+
kernel_enable_interrupts:
26+
STI
27+
ret
28+
29+
kernel_disable_interrupts:
30+
CLI
31+
ret

src/kernel/interrupts.c

Lines changed: 61 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,75 @@
1-
#define IDT_SIZE 1
1+
#define IDT_SIZE 16
22

3+
extern void interrupt_nohup();
4+
extern void load_idt_table(unsigned int idtr_address);
5+
6+
#pragma pack(push, 1)
37
struct IDTEntry {
4-
unsigned short something0;
5-
unsigned short something1;
6-
unsigned short something2;
7-
unsigned short something3;
8-
unsigned short something4;
9-
unsigned short something5;
10-
unsigned short something6;
11-
unsigned short something7;
8+
unsigned short offset_0;
9+
unsigned short selector;
10+
unsigned char unused;
11+
unsigned char type_attr;
12+
unsigned short offset_1;
1213
};
1314

1415
struct IDTReference {
1516
unsigned short size;
1617
unsigned int base_address;
1718
};
19+
#pragma pack(pop)
20+
1821
struct IDTReference idtr;
1922
struct IDTEntry idt_table[IDT_SIZE];
2023

21-
void populate_ict_entry(struct IDTEntry *entry) {
24+
void populate_idt_entry(int id,
25+
unsigned short selector,
26+
unsigned int address,
27+
unsigned char present, // 1-bit
28+
unsigned char dpl, // 2-bit
29+
unsigned char storage_segment, // 1-bit
30+
unsigned char gate_type // 4-bit
31+
) {
32+
struct IDTEntry *entry = &idt_table[id];
33+
entry->offset_0 = address&0xFFFF;
34+
entry->offset_1 = (address>>16)&0xFFFF;
35+
entry->selector = selector;
36+
entry->unused = 0;
37+
entry->type_attr = (present<<7) | (dpl<<5) | (storage_segment<<4) | gate_type;
38+
}
39+
40+
void populate_idt_entry_32bit(int id,
41+
unsigned int address,
42+
unsigned char dpl, // 2-bit
43+
int is_trap
44+
) {
45+
populate_idt_entry(
46+
id,
47+
0x08, // kernel code segment selector
48+
address,
49+
1,
50+
dpl,
51+
0,
52+
is_trap?0b1111:0b1110
53+
);
2254
}
2355

24-
int populate_idt_table() {
25-
return (int)&idtr;
56+
void populate_and_load_idt_table() {
57+
for (int i = 0; i < IDT_SIZE; ++i) {
58+
populate_idt_entry_32bit(i, (unsigned int)interrupt_nohup, 0, 1);
59+
}
60+
idtr.size = sizeof(struct IDTEntry)*IDT_SIZE;
61+
idtr.base_address = ((int)idt_table + KERNEL_MEMORY_LOCATION);
62+
63+
move_xy(4,4);
64+
print_line("IDT Reference: ");
65+
int idtr_address = (int)&idtr;
66+
print_hex_int(idtr_address);
67+
68+
move_xy(4,5);
69+
print_line("IDT Table: ");
70+
print_hex_int(idtr.base_address);
71+
print_char(' ');
72+
print_hex_int(idtr.size);
73+
74+
load_idt_table(idtr_address);
2675
}

src/lib/utils/io.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ void move_xy_diff(unsigned char dx, unsigned char dy) {
3131

3232
void print_rectangle(unsigned char x1,unsigned char y1,
3333
unsigned char x2, unsigned char y2) {
34-
io_low_scroll_screen(0, get_color_fgbg(), x1, y1, x2, y2);
34+
io_low_scroll_screen(0, get_color_fgbg(), x1, y1, x2, y2);
3535
}
3636

3737
void scroll(unsigned char count,
3838
unsigned char x1,unsigned char y1,
3939
unsigned char x2, unsigned char y2) {
40-
io_low_scroll_screen(count, get_color_fgbg(), x1, y1, x2, y2);
40+
io_low_scroll_screen(count, get_color_fgbg(), x1, y1, x2, y2);
4141
}
4242

4343
void print_char(char c) {
@@ -70,6 +70,15 @@ void print_hex_byte(unsigned char x) {
7070
print_hex_nibble(x&0xF);
7171
}
7272

73+
void print_hex_short(unsigned short x) {
74+
print_hex_byte(x>>8);
75+
print_hex_byte(x&0xFF);
76+
}
77+
78+
void print_hex_int(unsigned int x) {
79+
print_hex_short(x>>16);
80+
print_hex_short(x&0xFFFF);
81+
}
7382

7483
void print_line(const char *str) {
7584
while((*str)!='\0') {

0 commit comments

Comments
 (0)