Moved interrupt code to separate file.
Added new source file to Makefile.am
This commit is contained in:
@@ -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
29
src/x86/interrupts.c
Normal 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
28
src/x86/interrupts.h
Normal 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);
|
||||||
@@ -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++)
|
||||||
|
|||||||
Reference in New Issue
Block a user