Moved interrupt code to separate file.

Added new source file to Makefile.am
This commit is contained in:
2021-04-14 02:46:04 -05:00
parent 4a8ca81a10
commit 29544b0eb8
4 changed files with 60 additions and 39 deletions

View File

@@ -8,6 +8,7 @@ if x86
quark_kernel_SOURCES += x86/mmgr.c \ quark_kernel_SOURCES += x86/mmgr.c \
x86/putc.c \ x86/putc.c \
x86/multiboot2.c \ x86/multiboot2.c \
x86/interrupts.c \
x86/isr.c \ x86/isr.c \
x86/quark_x86.c \ x86/quark_x86.c \
x86/entry.S x86/entry.S

29
src/x86/interrupts.c Normal file
View File

@@ -0,0 +1,29 @@
#include "interrupts.h"
struct idt_info_t
{
uint16_t size;
void *location;
};
void lidt(struct interrupt_descriptor_t *idt)
{
struct idt_info_t idt_info;
idt_info.size = sizeof(idt) - 1;
idt_info.location = (void *)&idt;
asm("lidt (%0)"
:
: "r"(&idt_info));
}
void create_interrupt_descriptor(struct interrupt_descriptor_t *descriptor, void *isr, enum isr_type_t type, uint32_t privilage)
{
descriptor->offset_1 = (uint32_t) isr & 0xFFFF;
descriptor->offset_2 = (uint32_t) isr >> 16;
descriptor->selector = 8;
descriptor->zero = 0;
descriptor->type = type;
descriptor->storage = 0;
descriptor->dpl = privilage;
descriptor->present = 1;
}

28
src/x86/interrupts.h Normal file
View File

@@ -0,0 +1,28 @@
#pragma once
#include <stdint.h>
enum isr_type_t
{
INTERRPUT_TASK32 = 5,
INTERRPUT_TRAP32 = 15,
INTERRPUT_INT32 = 14,
INTERRPUT_TRAP16 = 7,
INTERRPUT_INT16 = 6
};
struct interrupt_descriptor_t
{
uint16_t offset_1;
uint16_t selector;
uint16_t zero : 8;
uint16_t type : 4;
uint16_t storage : 1;
uint16_t dpl : 2;
uint16_t present : 1;
uint16_t offset_2;
};
void lidt(struct interrupt_descriptor_t *idt);
void create_interrupt_descriptor(struct interrupt_descriptor_t *descriptor, void *isr, enum isr_type_t type, uint32_t privilage);

View File

@@ -2,51 +2,14 @@
#include "pageallocator.h" #include "pageallocator.h"
#include "multiboot2.h" #include "multiboot2.h"
#include "memorymap.h" #include "memorymap.h"
#include "interrupts.h"
#include "stdio.h" #include "stdio.h"
#include "string.h"
#include "module.h" #include "module.h"
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
enum isr_type_t
{
INTERRPUT_TASK32 = 5,
INTERRPUT_TRAP32 = 15,
INTERRPUT_INT32 = 14,
INTERRPUT_TRAP16 = 7,
INTERRPUT_INT16 = 6
};
struct interrupt_descriptor_t
{
uint16_t m_offset1;
uint16_t m_selector;
uint16_t m_zero : 8;
uint16_t m_type : 4;
uint16_t m_storage : 1;
uint16_t m_dpl : 2;
uint16_t m_present : 1;
uint16_t m_offset2;
};
struct idt_info_t
{
uint16_t size;
void *location;
};
extern int _kernelEnd; extern int _kernelEnd;
void lidt(struct interrupt_descriptor_t *idt)
{
struct idt_info_t idt_info;
idt_info.size = sizeof(idt) - 1;
idt_info.location = (void *)&idt;
asm("lidt (%0)"
:
: "r"(&idt_info));
}
int startPaging(uint32_t *directory, uint32_t *table, uint32_t *identityTable) int startPaging(uint32_t *directory, uint32_t *table, uint32_t *identityTable)
{ {
for (int i = 0; i < 1024; i++) for (int i = 0; i < 1024; i++)
@@ -106,6 +69,6 @@ int initialize(void *multiboot_info)
load_module(&kernel, &boot_info.modules[i]); load_module(&kernel, &boot_info.modules[i]);
} }
// TODO: setup IDT // TODO: setup IDT
// TODO: enter first process // TODO: enter first process
} }