summaryrefslogtreecommitdiffstats
path: root/arch/x86/PrimaryInit.cpp
diff options
context:
space:
mode:
authorAlexey Gavrilov <90127298+rebovas@users.noreply.github.com>2024-05-24 14:33:19 +0700
committerGitHub <noreply@github.com>2024-05-24 14:33:19 +0700
commitdc0b89fa63a181bd4add318bfd7a46344702f4e7 (patch)
tree48e25b199ae3459e12c7202f7b18a37cd087bf9b /arch/x86/PrimaryInit.cpp
parent0a50b1758fd3da118408fd724825d0a50a9ecf17 (diff)
parent5fbf41e967ed8e413ecf1e6abb72e8d285169df4 (diff)
Merge pull request #9 from rebovas/interrupts_picHEADmain
Pic + Tuple + refactor PrimaryInitialization class
Diffstat (limited to 'arch/x86/PrimaryInit.cpp')
-rw-r--r--arch/x86/PrimaryInit.cpp207
1 files changed, 66 insertions, 141 deletions
diff --git a/arch/x86/PrimaryInit.cpp b/arch/x86/PrimaryInit.cpp
index 498a22b..bd03904 100644
--- a/arch/x86/PrimaryInit.cpp
+++ b/arch/x86/PrimaryInit.cpp
@@ -1,170 +1,162 @@
#include "PrimaryInit.h"
-#include "idt/Idt.h"
-#include "io/VGADisplay.h"
-
-
-struct InterruptFrame
-{
-#ifdef X86_64
- const uint64 ip;
- const uint64 cs;
- const uint64 flags;
-#else
- const uint32 ip;
- const uint32 cs;
- const uint32 flags;
-#endif
-};
// Test ISRs define start
-__attribute__((interrupt)) void isr0(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr0(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "Divide error" << '\n';
};
-__attribute__((interrupt)) void isr1(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr1(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "Debug exception" << '\n';
};
-__attribute__((interrupt)) void isr2(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr2(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "NMI interrupt" << '\n';
};
-__attribute__((interrupt)) void isr3(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr3(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "Breakpoint" << '\n';
};
-__attribute__((interrupt)) void isr4(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr4(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "Overflow" << '\n';
};
-__attribute__((interrupt)) void isr5(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr5(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "Bound range exceed" << '\n';
};
-__attribute__((interrupt)) void isr6(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr6(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "Invalid opcode" << '\n';
};
-__attribute__((interrupt)) void isr7(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr7(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "No math coprocessor" << '\n';
};
-__attribute__((interrupt)) void isr8(struct InterruptFrame *frame, uword errorCode)
+__attribute__((interrupt)) void isr8(const struct InterruptFrame *frame, const uword errorCode)
{
asm("cli\n\t");
out::display << "Double fault" << '\n';
};
-__attribute__((interrupt)) void isr10(struct InterruptFrame *frame, uword errorCode)
+__attribute__((interrupt)) void isr10(const struct InterruptFrame *frame, const uword errorCode)
{
asm("cli\n\t");
out::display << "Invalid TSS" << "\n";
};
-__attribute__((interrupt)) void isr11(struct InterruptFrame *frame, uword errorCode)
+__attribute__((interrupt)) void isr11(const struct InterruptFrame *frame, const uword errorCode)
{
asm("cli\n\t");
out::display << "Segment not present" << "\n";
};
-__attribute__((interrupt)) void isr12(struct InterruptFrame *frame, uword errorCode)
+__attribute__((interrupt)) void isr12(const struct InterruptFrame *frame, const uword errorCode)
{
asm("cli\n\t");
out::display << "Stack segment fault" << "\n";
};
-__attribute__((interrupt)) void isr13(struct InterruptFrame *frame, uword errorCode)
+__attribute__((interrupt)) void isr13(const struct InterruptFrame *frame, const uword errorCode)
{
asm("cli\n\t");
out::display << "#GP" << "\n";
};
-__attribute__((interrupt)) void isr14(struct InterruptFrame *frame, uword errorCode)
+__attribute__((interrupt)) void isr14(const struct InterruptFrame *frame, const uword errorCode)
{
asm("cli\n\t");
out::display << "Page fault" << "\n";
};
-__attribute__((interrupt)) void isr16(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr16(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "Math fault" << "\n";
};
-__attribute__((interrupt)) void isr17(struct InterruptFrame *frame, uword errorCode)
+__attribute__((interrupt)) void isr17(const struct InterruptFrame *frame, const uword errorCode)
{
asm("cli\n\t");
out::display << "Alignment check" << "\n";
};
-__attribute__((interrupt)) void isr18(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr18(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "Machine check" << "\n";
};
-__attribute__((interrupt)) void isr19(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr19(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "SIMD point exception" << "\n";
};
-__attribute__((interrupt)) void isr20(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isr20(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "Virtualization exception" << "\n";
};
-__attribute__((interrupt)) void isr21(struct InterruptFrame *frame, uword errorCode)
+__attribute__((interrupt)) void isr21(const struct InterruptFrame *frame, const uword errorCode)
{
asm("cli\n\t");
out::display << "Control protection exception" << "\n";
};
-__attribute__((interrupt)) void isrUser(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isrUser(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "User-defined interrupt" << "\n";
};
-__attribute__((interrupt)) void isrKeyboard(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isrKeyboard(const struct InterruptFrame *frame)
{
asm("cli\n\t");
- out::display << "KINT ";
- uint8 buff[2];
-
- // PIC write EOI
- asm("in $0x60, %al");
- asm("mov %%al, %0" : "=r"(buff[0]));
- asm("in $0x64, %al");
- asm("mov %%al, %0" : "=r"(buff[1]));
- asm("mov $0x20, %al\n\t");
- asm("outb %al, $0x20\n\t");
- out::display << (uint32)buff[0] << ' ' << (uint32)buff[1] << '\n';
+ out::display << "KINT " << (uint32)PortOps::inb(0x60);
+
+ Pic::sendEoi();
};
-__attribute__((interrupt)) void isrTimer(struct InterruptFrame *frame)
+__attribute__((interrupt)) void isrTimer(const struct InterruptFrame *frame)
{
asm("cli\n\t");
out::display << "Timer interrupt" << "\n";
+
+ Pic::sendEoi();
};
//Test ISRs define end -------------------
+void isrPerform::perform(null null, DescInterrupt32 &desc) {};
+
+void isrPerform::perform(isr funp, DescInterrupt32 &desc)
+{
+ desc.setOffset((uint32)funp);
+ mngIdt.addDescriptor(desc);
+};
+
+void isrPerform::perform(isrExc funp, DescInterrupt32 &desc)
+{
+ desc.setOffset((uint32)funp);
+ mngIdt.addDescriptor(desc);
+};
+
void PrimaryInitialization::processorInitialize()
{
MngIdt &mngIdt = MngIdt::getInstance();
@@ -174,106 +166,39 @@ void PrimaryInitialization::processorInitialize()
mngGdt.addDescriptor(DescSeg32::flatDataKernel());
mngGdt.loadGdt();
-// Filling IDT start !!!REWRITE!!
+ InterruptFuncs intf = InterruptFuncs
+ (
+ isr0, isr1, isr2, isr3,
+ isr4, isr5, isr6, isr7,
+ isr8, nullptr, isr10, isr11,
+ isr12, isr13, isr14, nullptr,
+ isr16, isr17, isr18, isr19,
+ isr20, isr21, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr,
+ isrTimer, isrKeyboard
+ );
+
DescInterrupt32 descInt = DescInterrupt32::TrapKernelLong
(
- (uint32)isr0,
+ NULL,
mngGdt.getCodeSegmentKernel()
);
- // Int 0
- mngIdt.addDescriptor(descInt);
-
- // Int 1
- descInt.setOffset((uint32)isr1);
- mngIdt.addDescriptor(descInt);
-
- // Int 2
- descInt.setOffset((uint32)isr2);
- mngIdt.addDescriptor(descInt);
-
- // Int 3
- descInt.setOffset((uint32)isr3);
- mngIdt.addDescriptor(descInt);
-
- // Int 4
- descInt.setOffset((uint32)isr4);
- mngIdt.addDescriptor(descInt);
-
- // Int 5
- descInt.setOffset((uint32)isr5);
- mngIdt.addDescriptor(descInt);
-
- // Int 6
- descInt.setOffset((uint32)isr6);
- mngIdt.addDescriptor(descInt);
-
- // Int 7
- descInt.setOffset((uint32)isr7);
- mngIdt.addDescriptor(descInt);
-
- // Int 8
- descInt.setOffset((uint32)isr8);
- mngIdt.addDescriptor(descInt);
-
- // Int 10
- descInt.setOffset((uint32)isr10);
- mngIdt.addDescriptor(descInt);
-
- // Int 11
- descInt.setOffset((uint32)isr11);
- mngIdt.addDescriptor(descInt);
-
- // Int 12
- descInt.setOffset((uint32)isr12);
- mngIdt.addDescriptor(descInt);
-
- // Int 13
- descInt.setOffset((uint32)isr13);
- mngIdt.addDescriptor(descInt);
-
- // Int 14
- descInt.setOffset((uint32)isr14);
- mngIdt.addDescriptor(descInt);
-
- // Int 16
- descInt.setOffset((uint32)isr16);
- mngIdt.addDescriptor(descInt);
-
- // Int 17
- descInt.setOffset((uint32)isr17);
- mngIdt.addDescriptor(descInt);
-
- // Int 18
- descInt.setOffset((uint32)isr18);
- mngIdt.addDescriptor(descInt);
-
- // Int 19
- descInt.setOffset((uint32)isr19);
- mngIdt.addDescriptor(descInt);
-
- // Int 20
- descInt.setOffset((uint32)isr20);
- mngIdt.addDescriptor(descInt);
-
- // Int 21
- descInt.setOffset((uint32)isr21);
- mngIdt.addDescriptor(descInt);
-
- // Int 32
- descInt.setOffset((uint32)isrTimer);
- mngIdt.setDescriptor(descInt, 32);
-
- // Int 33
- descInt.setOffset((uint32)isrKeyboard);
- mngIdt.setDescriptor(descInt, 33);
-//Filling IDT end ------------------------------
-
+ intf.foreach<isrPerform>(descInt);
mngIdt.loadIdt();
-//------------
};
void PrimaryInitialization::devicesInitialize()
{
out::display = VGADisplay();
+ picSingle = SingletonPic();
+
+ Pic *pic = picSingle.getInstance();
+
+ uint8 intn = mngIdt.getIrqInterruptStart();
+ while(intn < mngIdt.getIrqInterruptStart() + Pic::numberIrq)
+ {
+ pic->enableIrq(intn++ - mngIdt.getIrqInterruptStart());
+ }
};