Hi, hab die Tage mal bissel probiert euer Tuturial umzusetzen. Aber irgendwie gehn mir die Ideen aus was bei den Interrupts falsch ist. Kann eine Testfunktion anspringen und darin eine Ausgabe machen, wenn ich aber ne asm Funktion anspringe in der nur ein iret drin steht stürtzt er ab. Währe euch wirklich dankbar wenn einer ne Idee hat.
hier der code der die idt baut:
template <uint16_t entrys>
class idt_c{
public:
const static uint16_t FLAG_IntGate = 0xE << 8;
const static uint16_t FLAG_TrapGate = 0xF << 8;
const static uint16_t FLAG_TaskGate = 0x5 << 8;
const static uint16_t FLAG_userland = 0x3 << 13;
const static uint16_t FLAG_kernlland = 0x0 << 13;
const static uint16_t FLAG_present = 0x1 << 15;
protected:
struct {
uint16_t isr0_15;
uint16_t csr0_15;
uint16_t flags;
uint16_t isr16_31;
} PACKED idt[entrys];
struct{
uint16_t size;
void *idt;
} PACKED idtp;
public:
idt_c();
~idt_c();
void set_entry(uint16_t index, void *isr, uint16_t csr, uint16_t flags);
void activate();
};
template <uint16_t entrys>
idt_c<entrys>::idt_c(){
this->idtp.size = (entrys * 8) - 1;
this->idtp.idt = this->idt;
}
template <uint16_t entrys>
idt_c<entrys>::~idt_c(){
}
template <uint16_t entrys>
void idt_c<entrys>::set_entry(uint16_t index, void *isr, uint16_t csr, uint16_t flags){
if(index >= entrys){
return;
}
this->idt[index].isr0_15 = ((uint32_t)isr) & 0xFFFF;
this->idt[index].csr0_15 = csr;
this->idt[index].flags = flags;
this->idt[index].isr16_31 = (((uint32_t)isr) & 0xFFFF0000) >> 16;
}
template <uint16_t entrys>
void idt_c<entrys>::activate(){
asm volatile ("lidt %0" : :"m"(this->idtp));
}
wird dann hier aufgerufen:
bs::core::idt_c<48> idt;
idt.set_entry(0, testasm, gdt.getSR(1, 0), idt.FLAG_IntGate | idt.FLAG_userland | idt.FLAG_present);
idt.activate();
asm volatile ("int $0x0");
die asm Funktion:
global testasm
testasm:
iret
das interesannte ist halt das es mit der Funktion als Handler erstmal geht:
void testisr(){
screen << "testisr\r\n";
asm volatile("cli; hlt"); // Prozessor anhalten
}
Viele Grüße und Danke schonmal