RTC ready

This commit is contained in:
Adrien Bourmault 2019-04-24 21:09:47 +02:00
commit c3b35a805b
20 changed files with 885 additions and 32 deletions

View File

@ -94,6 +94,7 @@ KernSources = libbuf/buf.c libbuf/bputc.c libbuf/bscroll.c \
kernel/mm/heap.c kernel/mm/malloc.c \ kernel/mm/heap.c kernel/mm/malloc.c \
kernel/mm/gdt.c kernel/ps/sched.c \ kernel/mm/gdt.c kernel/ps/sched.c \
kernel/init/info.c kernel/init/ssp.c \ kernel/init/info.c kernel/init/ssp.c \
kernel/io/rtc.c kernel/io/keyb.c
LibCObj=$(patsubst %.c,$(KOBJDIR)/%.o,$(LibCSources)) LibCObj=$(patsubst %.c,$(KOBJDIR)/%.o,$(LibCSources))
@ -119,7 +120,7 @@ $(KOBJDIR)/libc/atoi.o: $(KALEIDDIR)/libc/atoi.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR
@$(KCC) -D_NEED_ATOL $< -o $@.2 @$(KCC) -D_NEED_ATOL $< -o $@.2
@$(KCC) -D_NEED_ATOU $< -o $@.3 @$(KCC) -D_NEED_ATOU $< -o $@.3
@$(KCC) -D_NEED_ATOUL $< -o $@.4 @$(KCC) -D_NEED_ATOUL $< -o $@.4
@$(LD) -r $@.1 $@.2 $@.3 $@.4 -o $@ @$(LD) $(LDFLAGS) -r $@.1 $@.2 $@.3 $@.4 -o $@
@rm -f $@.1 $@.2 $@.3 $@.4 @rm -f $@.1 $@.2 $@.3 $@.4
@echo ${CL2}[$@] ${CL}Compiled.${CL3} @echo ${CL2}[$@] ${CL}Compiled.${CL3}
@ -129,7 +130,7 @@ $(KOBJDIR)/libc/itoa.o: $(KALEIDDIR)/libc/itoa.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR
@$(KCC) -D_NEED_LTOA $< -o $@.2 @$(KCC) -D_NEED_LTOA $< -o $@.2
@$(KCC) -D_NEED_UTOA $< -o $@.3 @$(KCC) -D_NEED_UTOA $< -o $@.3
@$(KCC) -D_NEED_ULTOA $< -o $@.4 @$(KCC) -D_NEED_ULTOA $< -o $@.4
@$(LD) -r $@.1 $@.2 $@.3 $@.4 -o $@ @$(LD) $(LDFLAGS) -r $@.1 $@.2 $@.3 $@.4 -o $@
@rm -f $@.1 $@.2 $@.3 $@.4 @rm -f $@.1 $@.2 $@.3 $@.4
@echo ${CL2}[$@] ${CL}Compiled.${CL3} @echo ${CL2}[$@] ${CL}Compiled.${CL3}
@ -138,6 +139,33 @@ $(KOBJDIR)/libc/mem.o: $(KALEIDDIR)/libc/mem.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR)
@$(KCC) -fno-strict-aliasing $< -o $@ @$(KCC) -fno-strict-aliasing $< -o $@
@echo ${CL2}[$@] ${CL}Compiled.${CL3} @echo ${CL2}[$@] ${CL}Compiled.${CL3}
$(KOBJDIR)/kernel/cpu/idt.o: $(KALEIDDIR)/kernel/cpu/idt.c \
$(KALEIDDIR)/kernel/cpu/isr.asm $(INCLUDEDIR)/*/*.h | $(KOBJDIR)
@mkdir -p $(shell dirname $@)
@$(ASM) $(ASMFLAGS) $(KALEIDDIR)/kernel/cpu/isr.asm -o $@.1
@$(KCC) $< -o $@.2
@$(LD) $(LDFLAGS) -r $@.1 $@.2 -o $@
@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 ------------------------------------------------------------- # ## MAIN MAKEFILE ------------------------------------------------------------- #
$(KOBJDIR)/%.o: %.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR) $(KOBJDIR)/%.o: %.c $(INCLUDEDIR)/*/*.h | $(KOBJDIR)
@ -160,7 +188,7 @@ debug: all
gdb: all gdb: all
@qemu-system-x86_64 -m 64M -hda $(BUILDDIR)/bin/disk.img -no-reboot \ @qemu-system-x86_64 -m 64M -hda $(BUILDDIR)/bin/disk.img -no-reboot \
-no-shutdown -d cpu_reset,guest_errors,pcall,int -s 2> $(BUILDDIR)/qemu.log & -no-shutdown -d cpu_reset,guest_errors,pcall,int -s -S 2> $(BUILDDIR)/qemu.log &
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > kaleid64_disasm.asm @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > kaleid64_disasm.asm
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > kaleid32_disasm.asm @ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > kaleid32_disasm.asm
@gdb \ @gdb \
@ -169,6 +197,13 @@ gdb: all
-ex "symbol-file $(BINDIR)/kaleid" \ -ex "symbol-file $(BINDIR)/kaleid" \
-ex "break BtStartKern" \ -ex "break BtStartKern" \
ddd: all
@qemu-system-x86_64 -m 64M -hda $(BUILDDIR)/bin/disk.img -no-reboot \
-no-shutdown -d cpu_reset,guest_errors,pcall,int -s -S 2> $(BUILDDIR)/qemu.log &
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 64 > kaleid64_disasm.asm
@ndisasm $(BINDIR)/kaleid -o 0x00100000 -b 32 > kaleid32_disasm.asm
@ddd
install_mbr: $(BINDIR)/disk.img $(MBRDIR)/grub.cfg install_mbr: $(BINDIR)/disk.img $(MBRDIR)/grub.cfg
@mkdir -p $(BINDIR)/disk @mkdir -p $(BINDIR)/disk
@echo ${CL2}[$@] ${NC}Installing MBR on image...${CL3} @echo ${CL2}[$@] ${NC}Installing MBR on image...${CL3}

View File

@ -132,8 +132,11 @@
│   │   └── prog.c │   │   └── prog.c
│   ├── kernel │   ├── kernel
│   │   ├── cpu │   │   ├── cpu
│   │   │   ├── cpu.asm
│   │   │   ├── cpuid.c │   │   │   ├── cpuid.c
│   │   │   └── idt.c │   │   │   ├── idt.c
│   │   │   ├── isr.asm
│   │   │   └── isr.inc
│   │   ├── init │   │   ├── init
│   │   │   ├── info.c │   │   │   ├── info.c
│   │   │   ├── init.c │   │   │   ├── init.c
@ -174,4 +177,4 @@
├── ProjectTree ├── ProjectTree
└── README.md └── README.md
37 directories, 112 files 37 directories, 115 files

View File

@ -172,6 +172,7 @@ _loader64:
mov qword [newKernelEnd], KERNEL_STACK mov qword [newKernelEnd], KERNEL_STACK
mov rdi, [mbInfo] mov rdi, [mbInfo]
mov rsi, [mbMagic] mov rsi, [mbMagic]
mov rdx, GDT64.code
call BtStartKern call BtStartKern
;; We must never reach this point ------------------------------------------- ;; ;; We must never reach this point ------------------------------------------- ;;

View File

@ -43,6 +43,7 @@ typedef struct BootInfo_t BootInfo_t;
typedef struct ListHead_t ListHead_t; typedef struct ListHead_t ListHead_t;
typedef struct ListNode_t ListNode_t; typedef struct ListNode_t ListNode_t;
typedef struct Processor_t Processor_t; typedef struct Processor_t Processor_t;
typedef struct IRQList_t IRQList_t;
typedef enum ProcState_t ProcState_t; typedef enum ProcState_t ProcState_t;

View File

@ -46,6 +46,7 @@ struct BootInfo_t
void *modulesAddr; //mods_addr void *modulesAddr; //mods_addr
char *grubName; //boot_loader_name char *grubName; //boot_loader_name
void *kernelAddr; void *kernelAddr;
void *codeSegment;
void *kernelEndAddr; void *kernelEndAddr;
} btldr; } btldr;

View File

@ -1,7 +1,7 @@
//----------------------------------------------------------------------------// //----------------------------------------------------------------------------//
// GNU GPL OS/K // // GNU GPL OS/K //
// // // //
// Desc: CPU related functions // // Desc: CPUID related functions //
// // // //
// // // //
// Copyright © 2018-2019 The OS/K Team // // Copyright © 2018-2019 The OS/K Team //
@ -26,8 +26,12 @@
#include <kernel/base.h> #include <kernel/base.h>
#endif #endif
#ifndef _KALKERN_CPU_H #ifndef _KALKERN_CPUID_H
#define _KALKERN_CPU_H #define _KALKERN_CPUID_H
// -------------------------------------------------------------------------- //
typedef struct Registers_t Registers_t;
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
@ -94,11 +98,15 @@ enum {
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
typedef struct { struct Registers_t
ushort length; {
void* base; ulong ds;
} __attribute__((packed)) Idtr_t; ulong rdi, rsi, rbp, rsp, rbx, rdx, rcx, rax;
ulong intNo, errCode;
ulong rip, cs, eflags, useresp, ss;
} __attribute__((packed));
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
#endif #endif

130
include/kernel/idt.h Normal file
View File

@ -0,0 +1,130 @@
#ifndef _KALKERN_BASE_H
#include <kernel/base.h>
#endif
#ifndef _KALKERN_IDT_H
#define _KALKERN_IDT_H
typedef struct IdtDescriptor_t IdtDescriptor_t;
typedef struct IdtEntry_t IdtEntry_t;
typedef struct IdtPtr_t IdtPtr_t;
typedef struct IRQList_t IRQList_t;
// -------------------------------------------------------------------------- //
#define interrupt(n) asm volatile ("int %0" : : "N" (n) : "cc", "memory") \
// -------------------------------------------------------------------------- //
struct IdtDescriptor_t {
ushort limit;
ulong base;
} __attribute__((packed)) ;
struct IdtEntry_t
{
ushort baseLow;
ushort selector;
uchar reservedIst;
uchar flags;
ushort baseMid;
uint baseHigh;
uint reserved;
} __attribute__((packed));
struct IdtPtr_t
{
ushort limit;
void *base;
} __attribute__((packed));
struct IRQList_t
{
uchar n; //number of entries in the list
struct entry {
void (*isr)(void);
uchar irq;
uchar flags;
} entry[224];
};
static char *IsrExceptions[32] = {
"Divide Error Fault",
"Debug Exception Trap",
"Non-maskable Interrupt",
"Breakpoint Trap",
"Overflow Trap",
"Bound Range Exceeded Fault",
"Invalid Opcode Fault",
"Device Not Available or No Math Coprocessor Fault",
"Double Fault Abort",
"Coprocessor Segment Overrun Fault",
"Invalid TSS Fault",
"Segment Not Present Fault",
"Stack Segment fault",
"General Protection Fault",
"Page Fault",
"Intel Reserved",
"x87 FPU Floating Point or Math Fault",
"Alignment Check Fault",
"Machine Check Abort",
"SIMD Floating Point Fault",
"Virtualization Exception Fault",
"Intel Reserved",
"Intel Reserved",
"Intel Reserved",
"Intel Reserved",
"Intel Reserved",
"Intel Reserved",
"Intel Reserved",
"Intel Reserved",
"Intel Reserved",
"Intel Reserved",
"Intel Reserved"
};
// -------------------------------------------------------------------------- //
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 EnablePIC(void);
void SendEOItoPIC(uchar isr);
extern void IdtInit();
extern void isr0();
extern void isr1();
extern void isr2();
extern void isr3();
extern void isr4();
extern void isr5();
extern void isr6();
extern void isr7();
extern void isr8();
extern void isr9();
extern void isr10();
extern void isr11();
extern void isr12();
extern void isr13();
extern void isr14();
extern void isr15();
extern void isr16();
extern void isr17();
extern void isr18();
extern void isr19();
extern void isr20();
extern void isr21();
extern void isr22();
extern void isr23();
extern void isr24();
extern void isr25();
extern void isr26();
extern void isr27();
extern void isr28();
extern void isr29();
extern void isr30();
extern void isr31();
#endif

View File

@ -22,6 +22,7 @@
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. // // along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
//----------------------------------------------------------------------------// //----------------------------------------------------------------------------//
#include <kernel/cpuid.h>
char *KeGetVendorString(void) { char *KeGetVendorString(void) {
return "Null"; return "Null";

View File

@ -21,19 +21,175 @@
// You should have received a copy of the GNU General Public License // // You should have received a copy of the GNU General Public License //
// along with OS/K. If not, see <https://www.gnu.org/licenses/>. // // along with OS/K. If not, see <https://www.gnu.org/licenses/>. //
//----------------------------------------------------------------------------// //----------------------------------------------------------------------------//
#include <kernel/base.h> #include <kernel/base.h>
#include <kernel/cpu.h> #include <kernel/idt.h>
#include <kernel/boot.h>
#include <kernel/iomisc.h>
#include <extras/buf.h>
IdtEntry_t idt[256] = { 0 };
IdtPtr_t idtPtr;
IRQList_t irqList = { 0 };
extern void lidt(Idtr_t reg);
// //
// Registers the new idt in the idtr register. // Registers an isr with his IRQ to handle driver interrupts
// //
static inline void loadIdt(void* idtAddr, ushort size) void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags)
{ {
// The IDTR register structure that will be sent uchar n = irqList.n;
Idtr_t IDTR = { size, idtAddr };
lidt(IDTR); KalAssert(idt[0].flags==0); // IDT uninitialized
if ((n == 224)) // 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++;
} }
//
// Installs the IDT in order to activate the interrupts handling
//
void IdtSetup(void)
{
// XXX detect the APIC with cpuid !
EnablePIC();
ushort codeSeg = (ushort)(ulong)BtLoaderInfo.codeSegment;
// Set IDT ptr
idtPtr.limit = (sizeof(IdtEntry_t) * 256) - 1;
idtPtr.base = &idt;
// Set IDT Exception Gates
IdtSetGate(0, (ulong)isr0, codeSeg, 0x8E);
IdtSetGate(1, (ulong)isr1, codeSeg, 0x8E);
IdtSetGate(2, (ulong)isr2, codeSeg, 0x8E);
IdtSetGate(3, (ulong)isr3, codeSeg, 0x8E);
IdtSetGate(4, (ulong)isr4, codeSeg, 0x8E);
IdtSetGate(5, (ulong)isr5, codeSeg, 0x8E);
IdtSetGate(6, (ulong)isr6, codeSeg, 0x8E);
IdtSetGate(7, (ulong)isr7, codeSeg, 0x8E);
IdtSetGate(8, (ulong)isr8, codeSeg, 0x8E);
IdtSetGate(9, (ulong)isr9, codeSeg, 0x8E);
IdtSetGate(10, (ulong)isr10, codeSeg, 0x8E);
IdtSetGate(11, (ulong)isr11, codeSeg, 0x8E);
IdtSetGate(12, (ulong)isr12, codeSeg, 0x8E);
IdtSetGate(13, (ulong)isr13, codeSeg, 0x8E);
IdtSetGate(14, (ulong)isr14, codeSeg, 0x8E);
IdtSetGate(15, (ulong)isr15, codeSeg, 0x8E); // INTEL RESERVED
IdtSetGate(16, (ulong)isr16, codeSeg, 0x8E);
IdtSetGate(17, (ulong)isr17, codeSeg, 0x8E);
IdtSetGate(18, (ulong)isr18, codeSeg, 0x8E);
IdtSetGate(19, (ulong)isr19, codeSeg, 0x8E);
IdtSetGate(20, (ulong)isr20, codeSeg, 0x8E);
IdtSetGate(21, (ulong)isr21, codeSeg, 0x8E); // INTEL RESERVED
IdtSetGate(22, (ulong)isr22, codeSeg, 0x8E); // INTEL RESERVED
IdtSetGate(23, (ulong)isr23, codeSeg, 0x8E); // INTEL RESERVED
IdtSetGate(24, (ulong)isr24, codeSeg, 0x8E); // INTEL RESERVED
IdtSetGate(25, (ulong)isr25, codeSeg, 0x8E); // INTEL RESERVED
IdtSetGate(26, (ulong)isr26, codeSeg, 0x8E); // INTEL RESERVED
IdtSetGate(27, (ulong)isr27, codeSeg, 0x8E); // INTEL RESERVED
IdtSetGate(28, (ulong)isr28, codeSeg, 0x8E); // INTEL RESERVED
IdtSetGate(29, (ulong)isr29, codeSeg, 0x8E); // INTEL RESERVED
IdtSetGate(30, (ulong)isr30, codeSeg, 0x8E); // INTEL RESERVED
IdtSetGate(31, (ulong)isr31, codeSeg, 0x8E); // INTEL RESERVED
// Set the IRQ Driver Gates
for (int i = 0 ; i < irqList.n ; i++) {
IdtSetGate(
irqList.entry[i].irq,
(ulong)irqList.entry[i].isr,
codeSeg,
irqList.entry[i].flags
);
}
// Load IDT
IdtInit();
DebugLog("[IdtSetup] Initialized !\n");
}
//
// Set an interrupt gate
//
void IdtSetGate(uchar rank, ulong base, ushort selector, uchar flags)
{
// Set Base Address
idt[rank].baseLow = base & 0xFFFF;
idt[rank].baseMid = (base >> 16) & 0xFFFF;
idt[rank].baseHigh = (base >> 32) & 0xFFFFFFFF;
// Set Selector
idt[rank].selector = selector;
idt[rank].flags = flags;
// Set Reserved Areas to Zero
idt[rank].reservedIst = 0;
idt[rank].reserved = 0;
}
//
// Enable and initializes the PIC to work correctly
//
static void EnablePIC(void)
{
// Set ICW1 - begin init of the PIC
IoWriteByteOnPort(0x20, 0x11);
IoWriteByteOnPort(0xa0, 0x11);
// Set ICW2 (IRQ base offsets)
IoWriteByteOnPort(0x21, 0x20); //0x20 is the first free interrupt
IoWriteByteOnPort(0xa1, 0x28);
// Set ICW3
IoWriteByteOnPort(0x21, 0x0);
IoWriteByteOnPort(0xa1, 0x0);
// Set ICW4
IoWriteByteOnPort(0x21, 0x1);
IoWriteByteOnPort(0xa1, 0x1);
// Set OCW1 (interrupt masks)
IoWriteByteOnPort(0x21, 0xff);
IoWriteByteOnPort(0xa1, 0xff);
}
//
// Ends the current interrupt handling
//
void SendEOItoPIC(uchar isr)
{
if(isr >= 8)
IoWriteByteOnPort(0xa0,0x20);
IoWriteByteOnPort(0x20,0x20);
}
//
// The main exception handler
//
void IdtHandler(ulong intNo)
{
int irrecoverable = 0;
char *exceptionMsg = "Unhandled ISR exception";
if (intNo == 0 || intNo == 6 || intNo == 8 || intNo == 13) irrecoverable++;
if (intNo < 32) exceptionMsg = IsrExceptions[intNo];
if (irrecoverable) {
KeStartPanic("[ISR 0x%x] Irrecoverable %s\n", intNo, exceptionMsg);
} else {
bprintf(BStdOut, "[ISR 0x%x] %s\n", intNo, exceptionMsg);
SendEOItoPIC(intNo);
}
}

143
kaleid/kernel/cpu/isr.asm Normal file
View File

@ -0,0 +1,143 @@
;=----------------------------------------------------------------------------=;
; GNU GPL OS/K ;
; ;
; Desc: Interrupt Descriptor Table 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 ;
; (at your option) 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 <https://www.gnu.org/licenses/>. ;
;=----------------------------------------------------------------------------=;
%include "kaleid/kernel/cpu/isr.inc"
global IdtInit
global divideByZero
extern idtPtr
extern IdtHandler
;;
;; Loads the IDT
;;
IdtInit:
lidt [idtPtr]
ret
;;
;; Bug test
;;
divideByZero:
pushAll
mov eax, 17
mov ebx, 0
xor edx, edx
div ebx
popAll
ret
;;
;; ISR handler
;;
isrPreHandler:
pushAll
xor rax, rax
mov ax, ds
push rax
call IdtHandler
pop rax
mov ds, ax
popAll
sti
iretq
;; Divide Error Fault
IsrWithoutErrCode 0
;; Debug Exception Fault/trap
IsrWithoutErrCode 1
;; NMI Interrupt
IsrWithoutErrCode 2
;; Breakpoint Trap
IsrWithoutErrCode 3
;; Overflow Trap
IsrWithoutErrCode 4
;; Bound Range Exceeded Fault
IsrWithoutErrCode 5
;; Invalid Opcode Fault
IsrWithoutErrCode 6
;; Device Not Available or No Math Coprocessor Fault
IsrWithoutErrCode 7
;; Coprocessor Segment Overrun Fault
IsrWithoutErrCode 9
;; x87 FPU Floating Point or Math Fault
IsrWithoutErrCode 16
;; Alignment Check Fault
IsrWithoutErrCode 17
;; Machine Check Abort
IsrWithoutErrCode 18
;; SIMD Floating Point Fault
IsrWithoutErrCode 19
;; Virtualization Exception Fault
IsrWithoutErrCode 20
;; Double Fault Abort
IsrWithErrCode 8
;; Invalid TSS Fault
IsrWithErrCode 10
;; Segment Not Present Fault
IsrWithErrCode 11
;; Stack Segment Fault
IsrWithErrCode 12
;; General Protection Fault
IsrWithErrCode 13
;; Page Fault
IsrWithErrCode 14
;; Reserved
IsrWithoutErrCode 15
IsrWithoutErrCode 21
IsrWithoutErrCode 22
IsrWithoutErrCode 23
IsrWithoutErrCode 24
IsrWithoutErrCode 25
IsrWithoutErrCode 26
IsrWithoutErrCode 27
IsrWithoutErrCode 28
IsrWithoutErrCode 29
IsrWithoutErrCode 30
IsrWithoutErrCode 31

58
kaleid/kernel/cpu/isr.inc Normal file
View File

@ -0,0 +1,58 @@
;=----------------------------------------------------------------------------=;
; GNU GPL OS/K ;
; ;
; Desc: Interrupt Descriptor Table related macros ;
; ;
; ;
; 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 ;
; (at your option) 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 <https://www.gnu.org/licenses/>. ;
;=----------------------------------------------------------------------------=;
%macro pushAll 0
push rax
push rcx
push rdx
push rbx
push rbp
push rsi
push rdi
%endmacro
%macro popAll 0
pop rdi
pop rsi
pop rbp
pop rbx
pop rdx
pop rcx
pop rax
%endmacro
%macro IsrWithoutErrCode 1
global isr%1
isr%1:
cli
mov rdi, %1
jmp isrPreHandler
%endmacro
%macro IsrWithErrCode 1
global isr%1
isr%1:
cli
mov rdi, %1
jmp isrPreHandler
%endmacro

View File

@ -29,7 +29,7 @@
// BootInfo_t initialization. It is necessary because grub will potentially be // BootInfo_t initialization. It is necessary because grub will potentially be
// wiped since it is below 1MB.... And we must reorganize all that stuff. // wiped since it is below 1MB.... And we must reorganize all that stuff.
// //
void BtInitBootInfo(multiboot_info_t *mbi) void BtInitBootInfo(multiboot_info_t *mbi, void *codeSeg)
{ {
extern ulong MB_header; extern ulong MB_header;
extern ulong newKernelEnd; extern ulong newKernelEnd;
@ -44,6 +44,7 @@ void BtInitBootInfo(multiboot_info_t *mbi)
BtLoaderInfo.grubName = (char*)(ulong)(mbi->boot_loader_name); BtLoaderInfo.grubName = (char*)(ulong)(mbi->boot_loader_name);
BtLoaderInfo.kernelAddr = (void*)&MB_header; BtLoaderInfo.kernelAddr = (void*)&MB_header;
BtLoaderInfo.kernelEndAddr = (void*)newKernelEnd; BtLoaderInfo.kernelEndAddr = (void*)newKernelEnd;
BtLoaderInfo.codeSegment = codeSeg;
BtLoaderInfo.valid = 1; BtLoaderInfo.valid = 1;
} }
if (BtLoaderInfo.grubFlags & MULTIBOOT_INFO_MODS) { if (BtLoaderInfo.grubFlags & MULTIBOOT_INFO_MODS) {

View File

@ -31,23 +31,42 @@
// info.c // info.c
extern void BtDoSanityChecks(uint mbMagic); extern void BtDoSanityChecks(uint mbMagic);
extern void BtInitBootInfo(multiboot_info_t *mbi); extern void BtInitBootInfo(multiboot_info_t *mbi, void *codeSeg);
// io/vga.c // io/vga.c
extern error_t IoInitVGABuffer(void); extern error_t IoInitVGABuffer(void);
//io/keyb.c
extern void IoSetupKeyb(void);
//io/rtc.c
extern void IoSetupRtc(void);
extern void IoEnableRtc(void);
extern ulong IoRtcTicks;
// cpu/idt.c
extern void IdtSetup(void);
// ps/proc.c test function // ps/proc.c test function
extern void pstest(void); extern void pstest(void);
// interrupts tests
extern void divideByZero(void);
void test(void)
{
asm volatile ("hlt");
}
// //
// Entry point of the Kaleid kernel // Entry point of the Kaleid kernel
// //
noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic) noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg)
{ {
KeDisableIRQs(); KeDisableIRQs();
// Initialize the BootInfo_t structure // Initialize the BootInfo_t structure
BtInitBootInfo(mbInfo); BtInitBootInfo(mbInfo, codeSeg);
// Screen I/O available from this point on // Screen I/O available from this point on
IoInitVGABuffer(); IoInitVGABuffer();
@ -61,12 +80,27 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic)
// Memory & scheduler // Memory & scheduler
MmInitMemoryMap(); MmInitMemoryMap();
// Several inits
MmInitHeap(); MmInitHeap();
PsInitSched(); PsInitSched();
int i=1; // Drivers ISR inits
for(;i<=25;i++)BUGON(KernLog("%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%3d\n",i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i)); IoSetupRtc();
KernLog("Cursor test:"); // Interrupts launching
IdtSetup();
KeEnableIRQs();
// Drivers enabling
IoEnableRtc();
while (1) {
asm volatile ("hlt");
if (IoRtcTicks > 2000) {
KernLog("CC\n");
break;
}
}
KernLog("\nGoodbye after %d ticks", IoRtcTicks);
// End this machine's suffering // End this machine's suffering
BFlushBuf(BStdOut); BFlushBuf(BStdOut);

View File

@ -31,3 +31,5 @@ volatile BootInfo_t BtBootTab = {0};
volatile bool KeIsPanicking = 0; volatile bool KeIsPanicking = 0;
volatile Processor_t *KeCurCPU = &_KeCPUTable[0]; volatile Processor_t *KeCurCPU = &_KeCPUTable[0];

69
kaleid/kernel/io/keyb.asm Normal file
View File

@ -0,0 +1,69 @@
;=----------------------------------------------------------------------------=;
; GNU GPL OS/K ;
; ;
; Desc: Basic Read Only Keyboard Driver ;
; (x86_64 architecture only) ;
; ;
; ;
; 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 ;
; (at your option) 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 <https://www.gnu.org/licenses/>. ;
;=----------------------------------------------------------------------------=;
[BITS 64]
global KeybIsr
extern KeybHandler
%macro pushAll 0
push rax
push rcx
push rdx
push rbx
push rbp
push rsi
push rdi
%endmacro
%macro popAll 0
pop rdi
pop rsi
pop rbp
pop rbx
pop rdx
pop rcx
pop rax
%endmacro
;;
;; Keyboard handler
;;
KeybIsr:
cli
pushAll
xor rax, rax
mov ax, ds
push rax
call KeybHandler
pop rax
mov ds, ax
popAll
sti
iretq

56
kaleid/kernel/io/keyb.c Normal file
View File

@ -0,0 +1,56 @@
//----------------------------------------------------------------------------//
// GNU GPL OS/K //
// //
// Desc: Basic Read Only Keyboard Driver //
// //
// //
// 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 <https://www.gnu.org/licenses/>. //
//----------------------------------------------------------------------------//
#include <kernel/base.h>
#include <kernel/iomisc.h>
extern void KeybIsr(void);
extern void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags);
extern void SendEOItoPIC(void);
void IoSetupKeyb(void)
{
IdtRegisterIrq(KeybIsr, 0x21, 0x8E);
}
uchar KeybHandler(void)
{
char status;
char code = 0;
// write EOI
IoWriteByteOnPort(0x20, 0x20);
status = IoReadByteFromPort(0x64);
if (status & 0x01) {
code = IoReadByteFromPort(0x60);
if(code < 0) code = 0;
}
return code;
}

69
kaleid/kernel/io/rtc.asm Normal file
View File

@ -0,0 +1,69 @@
;=----------------------------------------------------------------------------=;
; GNU GPL OS/K ;
; ;
; Desc: Basic Read Only Keyboard Driver ;
; (x86_64 architecture only) ;
; ;
; ;
; 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 ;
; (at your option) 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 <https://www.gnu.org/licenses/>. ;
;=----------------------------------------------------------------------------=;
[BITS 64]
global RtcIsr
extern RtcHandler
%macro pushAll 0
push rax
push rcx
push rdx
push rbx
push rbp
push rsi
push rdi
%endmacro
%macro popAll 0
pop rdi
pop rsi
pop rbp
pop rbx
pop rdx
pop rcx
pop rax
%endmacro
;;
;; Keyboard handler
;;
RtcIsr:
cli
pushAll
xor rax, rax
mov ax, ds
push rax
call RtcHandler
pop rax
mov ds, ax
popAll
sti
iretq

83
kaleid/kernel/io/rtc.c Normal file
View File

@ -0,0 +1,83 @@
//----------------------------------------------------------------------------//
// 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 <https://www.gnu.org/licenses/>. //
//----------------------------------------------------------------------------//
#include <kernel/base.h>
#include <kernel/iomisc.h>
#include <extras/buf.h>
extern void RtcIsr(void);
extern void SendEOItoPIC(void);
extern void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags);
ulong IoRtcTicks = 0;
void IoSetupRtc(void)
{
IdtRegisterIrq(RtcIsr, 0x28, 0x8E);
}
void IoEnableRtc(void)
{
ulong flags = KePauseIRQs();
char readedInterruptConfig;
char readedRegister;
char readedIrqs;
uchar RtcRate;
// Setting up the register control and interrupt rates
RtcRate = 0x05;
IoWriteByteOnPort(0x70, 0x8B);
readedRegister = IoReadByteFromPort(0x71);
IoWriteByteOnPort(0x70, 0x8B); // Because reading flushes
IoWriteByteOnPort(0x71, readedRegister | 0x40);
IoWriteByteOnPort(0x70, 0x8A);
readedInterruptConfig = IoReadByteFromPort(0x71);
IoWriteByteOnPort(0x70, 0x8A); // Because reading flushes
IoWriteByteOnPort(0x71, (readedInterruptConfig & 0xF0) | RtcRate);
IoWriteByteOnPort(0x70, 0x0C);
IoReadByteFromPort(0x71); // Flush
// Setting up the IRQs
readedIrqs = IoReadByteFromPort(0xA1);
IoWriteByteOnPort(0xA1, 0xFE & readedIrqs); // Enables IRQ on PIC 2
readedIrqs = IoReadByteFromPort(0x21);
IoWriteByteOnPort(0x21, 0xFB & readedIrqs); // Enables IRQ on PIC 1
// clean-up
IoWriteByteOnPort(0x70, 0x0C); // Select status reg C
IoReadByteFromPort(0x71); // Flush
KeRestoreIRQs(flags);
}
void RtcHandler(void)
{
//bprintf(BStdOut, " *RTC - ");
IoWriteByteOnPort(0x70, 0x0C); // Selects status reg C
IoReadByteFromPort(0x71); // Flush
IoRtcTicks++;
SendEOItoPIC();
//bprintf(BStdOut, " - EOI* ");
}

View File

@ -50,6 +50,7 @@ void MmInitGdt(void)
gdtPtr.limit = (sizeof(GdtEntry_t) * 5) - 1; gdtPtr.limit = (sizeof(GdtEntry_t) * 5) - 1;
gdtPtr.base = (uint)(ullong)&gdtEntries; gdtPtr.base = (uint)(ullong)&gdtEntries;
SetGdtEntry(0,0,0,0,0);
/* XXX set TSS register */ /* XXX set TSS register */

View File

@ -68,9 +68,10 @@ static error_t InitMemoryMap(void)
// fill the map // fill the map
while (currentEntry < mapEnd) { while (currentEntry < mapEnd) {
// memory zone address // memory zone address
memoryMap.entry[i].addr = (void*)((ulong)currentEntry->addr_low + memoryMap.entry[i].addr = (void*)((ullong)currentEntry->addr_low +
(((ulong)currentEntry->addr_high) << 32 )); (((ullong)currentEntry->addr_high) << 32 ));
// memory zone size in bytes // memory zone size in bytes
memoryMap.entry[i].length = (ulong)currentEntry->len_low + memoryMap.entry[i].length = (ulong)currentEntry->len_low +
(((ulong)currentEntry->len_high) << 32); (((ulong)currentEntry->len_high) << 32);
@ -100,10 +101,10 @@ static error_t InitMemoryMap(void)
if (memoryMap.freeRamSize < MINIMUM_RAM_SIZE) if (memoryMap.freeRamSize < MINIMUM_RAM_SIZE)
return ENOMEM; return ENOMEM;
KernLog("[InitMemoryMap] Available Ram Size : %u Mio, Used Ram Size : %u Kio\n", DebugLog("[InitMemoryMap] Available Ram Size : %u Mio, Used Ram Size : %u Kio\n\n",
memoryMap.freeRamSize / MB, memoryMap.nonfreeRamSize / KB); memoryMap.freeRamSize / MB, memoryMap.nonfreeRamSize / KB);
KernLog("[InitMemoryMap] Physical Ram Size : %d Mio\n\n", /*DebugLog("[InitMemoryMap] Physical Ram Size : %d Mio\n\n",
(memoryMap.freeRamSize + memoryMap.nonfreeRamSize) / MB); (memoryMap.freeRamSize + memoryMap.nonfreeRamSize) / MB);*/
return EOK; return EOK;
} }
@ -192,7 +193,7 @@ void MmPrintMemoryMap(void) {
default:; default:;
} }
KernLog("Mem zone : %p\t%s\twith length: %d Kio\n", KernLog("Mem zone : %lp\t%s\twith length: %d Kio\n",
memoryMap.entry[i].addr, memoryMap.entry[i].addr,
avStr, avStr,
memoryMap.entry[i].length / KB memoryMap.entry[i].length / KB