diff --git a/Makefile b/Makefile index a9e35c8..5ee4b89 100644 --- a/Makefile +++ b/Makefile @@ -94,7 +94,7 @@ KernSources = libbuf/buf.c libbuf/bput.c \ kernel/mm/heap.c kernel/mm/malloc.c \ kernel/mm/gdt.c kernel/ps/sched.c \ kernel/init/info.c kernel/init/ssp.c \ - kernel/cpu/rtc.c + kernel/io/rtc.c kernel/io/keyb.c LibCObj=$(patsubst %.c,$(KOBJDIR)/%.o,$(LibCSources)) @@ -148,6 +148,24 @@ $(KOBJDIR)/kernel/cpu/idt.o: $(KALEIDDIR)/kernel/cpu/idt.c \ @rm -f $@.1 $@.2 @echo ${CL2}[$@] ${CL}Compiled.${CL3} +$(KOBJDIR)/kernel/io/keyb.o: $(KALEIDDIR)/kernel/io/keyb.c \ + $(KALEIDDIR)/kernel/io/keyb.asm $(INCLUDEDIR)/*/*.h | $(KOBJDIR) + @mkdir -p $(shell dirname $@) + @$(ASM) $(ASMFLAGS) $(KALEIDDIR)/kernel/io/keyb.asm -o $@.1 + @$(KCC) $< -o $@.2 + @$(LD) $(LDFLAGS) -r $@.1 $@.2 -o $@ + @rm -f $@.1 $@.2 + @echo ${CL2}[$@] ${CL}Compiled.${CL3} + +$(KOBJDIR)/kernel/io/rtc.o: $(KALEIDDIR)/kernel/io/rtc.c \ + $(KALEIDDIR)/kernel/io/rtc.asm $(INCLUDEDIR)/*/*.h | $(KOBJDIR) + @mkdir -p $(shell dirname $@) + @$(ASM) $(ASMFLAGS) $(KALEIDDIR)/kernel/io/rtc.asm -o $@.1 + @$(KCC) $< -o $@.2 + @$(LD) $(LDFLAGS) -r $@.1 $@.2 -o $@ + @rm -f $@.1 $@.2 + @echo ${CL2}[$@] ${CL}Compiled.${CL3} + ## MAIN MAKEFILE ------------------------------------------------------------- # $(KOBJDIR)/%.o: %.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) diff --git a/include/kernel/idt.h b/include/kernel/idt.h index d657e34..c4eae39 100644 --- a/include/kernel/idt.h +++ b/include/kernel/idt.h @@ -92,10 +92,10 @@ void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags); void IdtSetup(void); void IdtSetGate(uchar rank, ulong base, ushort selector, uchar flags); void IdtHandler(ulong intNo); -static void DisablePIC(void); -static void SendEOItoPIC(uchar isr); +static void EnablePIC(void); +void SendEOItoPIC(uchar isr); -extern void CpuIdtInit(); +extern void IdtInit(); extern void isr0(); extern void isr1(); extern void isr2(); diff --git a/kaleid/kernel/cpu/idt.c b/kaleid/kernel/cpu/idt.c index 7c0c86e..960b048 100644 --- a/kaleid/kernel/cpu/idt.c +++ b/kaleid/kernel/cpu/idt.c @@ -39,11 +39,19 @@ IRQList_t irqList = { 0 }; // void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags) { + uchar n = irqList.n; + KalAssert(idt[0].flags==0); // IDT uninitialized - irqList.entry[irqList.n].isr = isr; - irqList.entry[irqList.n].irq = irq; - irqList.entry[irqList.n].flags = flags; + if ((n == 225)) // IRQs not filled + KeStartPanic("[IdtRegisterIrq] Cannot register IRQ %c function %p !", + irq, + isr + ); + + irqList.entry[n].isr = isr; + irqList.entry[n].irq = irq; + irqList.entry[n].flags = flags; irqList.n++; } @@ -53,7 +61,7 @@ void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags) void IdtSetup(void) { // XXX detect the APIC with cpuid ! - DisablePIC(); + EnablePIC(); ushort codeSeg = (ushort)(ulong)BtLoaderInfo.codeSegment; @@ -104,7 +112,7 @@ void IdtSetup(void) } // Load IDT - CpuIdtInit(); + IdtInit(); DebugLog("[IdtSetup] Initialized !\n"); } @@ -128,39 +136,35 @@ void IdtSetGate(uchar rank, ulong base, ushort selector, uchar flags) } // -// Disables the PIC to activate the APIC +// Enable and initializes the PIC to work correctly // -static void DisablePIC(void) +static void EnablePIC(void) { - // Set ICW1 + // Set ICW1 - begin init of the PIC IoWriteByteOnPort(0x20, 0x11); IoWriteByteOnPort(0xa0, 0x11); // Set ICW2 (IRQ base offsets) - IoWriteByteOnPort(0x21, 0xe0); - IoWriteByteOnPort(0xa1, 0xe8); + IoWriteByteOnPort(0x21, 0x20); //0x20 is the first free interrupt + IoWriteByteOnPort(0xa1, 0x28); // Set ICW3 - IoWriteByteOnPort(0x21, 4); - IoWriteByteOnPort(0xa1, 2); + IoWriteByteOnPort(0x21, 0x0); + IoWriteByteOnPort(0xa1, 0x0); // Set ICW4 - IoWriteByteOnPort(0x21, 1); - IoWriteByteOnPort(0xa1, 1); + IoWriteByteOnPort(0x21, 0x1); + IoWriteByteOnPort(0xa1, 0x1); // Set OCW1 (interrupt masks) IoWriteByteOnPort(0x21, 0xff); IoWriteByteOnPort(0xa1, 0xff); - - // ENABLING LOCAL APIC - uint *val = (void*)0xfee000f0; - *val |= (1<<8); } // // Ends the current interrupt handling // -static void SendEOItoPIC(uchar isr) +void SendEOItoPIC(uchar isr) { if(isr >= 8) IoWriteByteOnPort(0xa0,0x20); diff --git a/kaleid/kernel/cpu/isr.asm b/kaleid/kernel/cpu/isr.asm index adb6955..c8b81fc 100644 --- a/kaleid/kernel/cpu/isr.asm +++ b/kaleid/kernel/cpu/isr.asm @@ -24,7 +24,7 @@ %include "kaleid/kernel/cpu/isr.inc" -global CpuIdtInit +global IdtInit global divideByZero extern idtPtr extern IdtHandler @@ -32,7 +32,7 @@ extern IdtHandler ;; ;; Loads the IDT ;; -CpuIdtInit: +IdtInit: lidt [idtPtr] ret diff --git a/kaleid/kernel/cpu/rtc.c b/kaleid/kernel/cpu/rtc.c deleted file mode 100644 index 4be1567..0000000 --- a/kaleid/kernel/cpu/rtc.c +++ /dev/null @@ -1,40 +0,0 @@ -//----------------------------------------------------------------------------// -// GNU GPL OS/K // -// // -// Desc: Interrupt related functions // -// // -// // -// Copyright © 2018-2019 The OS/K Team // -// // -// This file is part of OS/K. // -// // -// OS/K is free software: you can redistribute it and/or modify // -// it under the terms of the GNU General Public License as published by // -// the Free Software Foundation, either version 3 of the License, or // -// any later version. // -// // -// OS/K is distributed in the hope that it will be useful, // -// but WITHOUT ANY WARRANTY//without even the implied warranty of // -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // -// GNU General Public License for more details. // -// // -// You should have received a copy of the GNU General Public License // -// along with OS/K. If not, see . // -//----------------------------------------------------------------------------// - -#include -#include - -void CpuEnableRtc(void) -{ - ulong flags = KePauseIRQs(); - // Setting up the register control - IoWriteByteOnPort(0x70, 0x8A); //selects status reg A and DISABLE NMI - IoWriteByteOnPort(0x71, 0x20); - //Enabling the IRQ 8 - IoWriteByteOnPort(0x70, 0x8B); - char read = IoReadByteFromPort(0x71); // Because read causes reset - IoWriteByteOnPort(0x70, 0x8B); - IoWriteByteOnPort(0x71, read | 0x40); - KeRestoreIRQs(flags); -} diff --git a/kaleid/kernel/init/init.c b/kaleid/kernel/init/init.c index 092a3d7..8500db5 100644 --- a/kaleid/kernel/init/init.c +++ b/kaleid/kernel/init/init.c @@ -36,6 +36,9 @@ extern void BtInitBootInfo(multiboot_info_t *mbi, void *codeSeg); // io/vga.c extern error_t IoInitVGABuffer(void); +//io/keyb. +extern error_t KeybSetup(void); + // cpu/idt.c extern void IdtSetup(void); @@ -76,15 +79,10 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg) // Several inits MmInitHeap(); PsInitSched(); - - //MmPrintMemoryMap(); + KeybSetup(); IdtSetup(); KeEnableIRQs(); - // Test Page Fault - long addr = -1; - DebugLog("%s", addr); - KernLog("\nGoodbye!"); // End this machine's suffering diff --git a/kaleid/kernel/io/keyb.c b/kaleid/kernel/io/keyb.c index 0f38bda..d933fbe 100644 --- a/kaleid/kernel/io/keyb.c +++ b/kaleid/kernel/io/keyb.c @@ -22,11 +22,10 @@ // along with OS/K. If not, see . // //----------------------------------------------------------------------------// -#include #include extern void KeybIsr(void); -extern void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags); +extern IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags); void KeybSetup(void) {