fixing more of the mess

This commit is contained in:
Gregory Kenneth Bowne 2023-10-08 18:32:10 -07:00
parent e99a09639d
commit 4b0bd4d133
6 changed files with 20 additions and 34 deletions

View File

@ -68,6 +68,7 @@ target_link_libraries(ClassicOS PRIVATE)
set(CMAKE_C_COMPILER gcc)
set(CMAKE_LINKER ld)
set(CMAKE_EXE_LINKER_FLAGS "-g -s")
set(CMAKE_LINK_FLAGS "${CMAKE_LINK_FLAGS} -e kernel_main")
set(CMAKE_CXX_FLAGS "-g -Wall")
set(CMAKE_C_FLAGS "-g -Wall -m32")
set(CMAKE_BUILD_TYPE Debug)

View File

@ -1,4 +1,4 @@
ENTRY(_start)
ENTRY(kernel_main)
SECTIONS {
. = 0x100000;
@ -7,6 +7,10 @@ SECTIONS {
*(.text)
}
.rodata : {
*(.rodata)
}
.data : {
*(.data)
}

View File

@ -81,7 +81,7 @@ void gdt_init()
// Exception handlers
extern void divide_error();
extern void page_fault();
extern void page_fault(struct idt_regs *regs);
extern void general_protection_fault();
extern void double_fault();
@ -91,27 +91,12 @@ extern void timer();
extern void keyboard();
extern void device();
// ISR table
void (*isr_table[ISR_TABLE_SIZE])(void) = {0};
// Register an ISR
void isr_register(uint8_t num, void (*handler)(void))
void isr_register(uint8_t num, void (*handler)(struct idt_regs *))
{
isr_table[num] = handler;
}
// ISR handler
void isr_handler(struct idt_regs *regs)
{
void (*handler)(void) = isr_table[regs->int_no];
handler = isr_table[regs->int_no];
if (handler)
{
handler();
}
}
// Initialize the ISR
void isr_init()
{

View File

@ -1,4 +1,5 @@
#include "idt.h"
#include "isr.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
@ -21,7 +22,7 @@ const struct idt_ptr idtp = {sizeof(idt) - 1, idt};
// Exception handlers
extern void divide_error_handler();
extern void page_fault_handler();
extern void page_fault(struct idt_regs *regs);
extern void general_protection_fault_handler();
extern void double_fault_handler();
@ -57,7 +58,7 @@ void idt_init()
// Set up exception handlers
idt_set_gate(0, divide_error_handler, 0x08, 0x8E);
idt_set_gate(14, page_fault_handler, 0x08, 0x8E);
idt_set_gate(14, page_fault, 0x08, 0x8E);
idt_set_gate(13, general_protection_fault_handler, 0x08, 0x8E);
idt_set_gate(8, double_fault_handler, 0x08, 0x8E);

View File

@ -18,17 +18,10 @@ void dummy_isr(struct isr_regs *regs)
}
// ISR table
void (*isr_table[256])(struct isr_regs *regs) = {
// initialize the dummy isr_table
[TIMER_INTERRUPT] = dummy_isr, // Timer interrupt
[KEYBOARD_INTERRUPT] = dummy_isr, // Keyboard interrupt
[NETWORK_INTERRUPT] = dummy_isr, // Network interrupt
[DISK_INTERRUPT] = dummy_isr, // Disk interrupt
[SERIAL_PORT_INTERRUPT] = dummy_isr // Serial port interrupt
};
extern void (*isr_table[256])(struct isr_regs *regs);
// Register an ISR
void isr_register(uint8_t num, void (*handler)(struct isr_regs *regs))
extern void isr_register(uint8_t num, void (*handler)(struct isr_regs *regs))
{
isr_table[num] = handler;
}

View File

@ -8,8 +8,10 @@ struct isr_regs
uint32_t gs, fs, es, ds; // Segment selectors
uint32_t edi, esi, ebp, esp; // Pushed by pusha instruction
uint32_t ebx, edx, ecx, eax; // Pushed by the interrupt handler
uint32_t int_no, err_code; // Interrupt number and error code (if applicable)
uint32_t eip, cs, eflags, esp_at_signal; // Pushed by the processor automatically
uint32_t int_no,
err_code; // Interrupt number and error code (if applicable)
uint32_t eip, cs, eflags,
esp_at_signal; // Pushed by the processor automatically
};
// Structure for storing register values during an ISR