diff --git a/include/kernel/cpuid.h b/include/kernel/cpuid.h new file mode 100644 index 0000000..ea63172 --- /dev/null +++ b/include/kernel/cpuid.h @@ -0,0 +1,112 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Desc: CPUID 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 . // +//----------------------------------------------------------------------------// + +#ifndef _KALKERN_BASE_H +#include +#endif + +#ifndef _KALKERN_CPUID_H +#define _KALKERN_CPUID_H + +// -------------------------------------------------------------------------- // + +typedef struct Registers_t Registers_t; + +// -------------------------------------------------------------------------- // + +// CPU features masks +enum { + FEAT_ECX_SSE3 = 1 << 0, + FEAT_ECX_PCLMUL = 1 << 1, + FEAT_ECX_DTES64 = 1 << 2, + FEAT_ECX_MONITOR = 1 << 3, + FEAT_ECX_DS_CPL = 1 << 4, + FEAT_ECX_VMX = 1 << 5, + FEAT_ECX_SMX = 1 << 6, + FEAT_ECX_EST = 1 << 7, + FEAT_ECX_TM2 = 1 << 8, + FEAT_ECX_SSSE3 = 1 << 9, + FEAT_ECX_CID = 1 << 10, + FEAT_ECX_FMA = 1 << 12, + FEAT_ECX_CX16 = 1 << 13, + FEAT_ECX_ETPRD = 1 << 14, + FEAT_ECX_PDCM = 1 << 15, + FEAT_ECX_PCIDE = 1 << 17, + FEAT_ECX_DCA = 1 << 18, + FEAT_ECX_SSE4_1 = 1 << 19, + FEAT_ECX_SSE4_2 = 1 << 20, + FEAT_ECX_x2APIC = 1 << 21, + FEAT_ECX_MOVBE = 1 << 22, + FEAT_ECX_POPCNT = 1 << 23, + FEAT_ECX_AES = 1 << 25, + FEAT_ECX_XSAVE = 1 << 26, + FEAT_ECX_OSXSAVE = 1 << 27, + FEAT_ECX_AVX = 1 << 28, + + FEAT_EDX_FPU = 1 << 0, + FEAT_EDX_VME = 1 << 1, + FEAT_EDX_DE = 1 << 2, + FEAT_EDX_PSE = 1 << 3, + FEAT_EDX_TSC = 1 << 4, + FEAT_EDX_MSR = 1 << 5, + FEAT_EDX_PAE = 1 << 6, + FEAT_EDX_MCE = 1 << 7, + FEAT_EDX_CX8 = 1 << 8, + FEAT_EDX_APIC = 1 << 9, + FEAT_EDX_SEP = 1 << 11, + FEAT_EDX_MTRR = 1 << 12, + FEAT_EDX_PGE = 1 << 13, + FEAT_EDX_MCA = 1 << 14, + FEAT_EDX_CMOV = 1 << 15, + FEAT_EDX_PAT = 1 << 16, + FEAT_EDX_PSE36 = 1 << 17, + FEAT_EDX_PSN = 1 << 18, + FEAT_EDX_CLF = 1 << 19, + FEAT_EDX_DTES = 1 << 21, + FEAT_EDX_ACPI = 1 << 22, + FEAT_EDX_MMX = 1 << 23, + FEAT_EDX_FXSR = 1 << 24, + FEAT_EDX_SSE = 1 << 25, + FEAT_EDX_SSE2 = 1 << 26, + FEAT_EDX_SS = 1 << 27, + FEAT_EDX_HTT = 1 << 28, + FEAT_EDX_TM1 = 1 << 29, + FEAT_EDX_IA64 = 1 << 30, + FEAT_EDX_PBE = 1 << 31 +}; + +// -------------------------------------------------------------------------- // + +struct Registers_t +{ + ulong ds; + ulong rdi, rsi, rbp, rsp, rbx, rdx, rcx, rax; + ulong intNo, errCode; + ulong rip, cs, eflags, useresp, ss; +} __attribute__((packed)); + +// -------------------------------------------------------------------------- // + +#endif + diff --git a/include/kernel/idt.h b/include/kernel/idt.h new file mode 100644 index 0000000..d657e34 --- /dev/null +++ b/include/kernel/idt.h @@ -0,0 +1,132 @@ +#ifndef _KALKERN_BASE_H +#include +#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; + ulong base; + ushort selector; + uchar flags; + } entry[225]; +}; + +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 DisablePIC(void); +static void SendEOItoPIC(uchar isr); + +extern void CpuIdtInit(); +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