This commit is contained in:
nub31
2025-09-02 18:55:46 +02:00
parent a5bd7ad9a6
commit b533485614
9 changed files with 101 additions and 92 deletions

View File

@@ -43,13 +43,15 @@ static const char* exception_messages[32] = {
static irq_handler_t irq_handlers[16] = {0}; static irq_handler_t irq_handlers[16] = {0};
bool cpu_has_apic() { bool cpu_has_apic()
{
uint32_t eax, edx; uint32_t eax, edx;
cpuid(1, &eax, &edx); cpuid(1, &eax, &edx);
return (edx & CPUID_FEAT_EDX_APIC) != 0; return (edx & CPUID_FEAT_EDX_APIC) != 0;
} }
void enable_apic() { void enable_apic()
{
uint64_t apic_base = rdmsr(0x1B); uint64_t apic_base = rdmsr(0x1B);
apic_base |= (1 << 11); apic_base |= (1 << 11);
wrmsr(0x1B, apic_base); wrmsr(0x1B, apic_base);
@@ -59,23 +61,24 @@ void enable_apic() {
void remap_pic() void remap_pic()
{ {
outb(PIC1_COMMAND, 0x11); outb(PIC1_COMMAND, 0x11);
outb(PIC2_COMMAND, 0x11); outb(PIC2_COMMAND, 0x11);
outb(PIC1_DATA, 32); outb(PIC1_DATA, 32);
outb(PIC2_DATA, 40); outb(PIC2_DATA, 40);
outb(PIC1_DATA, 4); outb(PIC1_DATA, 4);
outb(PIC2_DATA, 2); outb(PIC2_DATA, 2);
outb(PIC1_DATA, 1); outb(PIC1_DATA, 1);
outb(PIC2_DATA, 1); outb(PIC2_DATA, 1);
outb(PIC1_DATA, 0); outb(PIC1_DATA, 0);
outb(PIC2_DATA, 0); outb(PIC2_DATA, 0);
kprintf("PIC remapped\n"); kprintf("PIC remapped\n");
} }
void disable_pic() { void disable_pic()
{
outb(PIC1_DATA, 0xFF); outb(PIC1_DATA, 0xFF);
outb(PIC2_DATA, 0xFF); outb(PIC2_DATA, 0xFF);
kprintf("PIC disabled\n"); kprintf("PIC disabled\n");
@@ -83,7 +86,8 @@ void disable_pic() {
void handle_exception(const isr_frame_t* frame) void handle_exception(const isr_frame_t* frame)
{ {
kprintf("exception[%d]: %s, error code: %d\n", frame->int_no, exception_messages[frame->int_no], frame->err_code); kprintf("exception[%d]: %s, error code: %d\n", frame->int_no, exception_messages[frame->int_no],
frame->err_code);
kpanic(); kpanic();
} }

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include "kernel.h" #include "kernel.h"
#include <stdbool.h>
#include <stdint.h> #include <stdint.h>
typedef struct typedef struct

View File

@@ -1,10 +1,10 @@
#include "kernel.h" #include "kernel.h"
#include "interrupts.h" #include "interrupts.h"
#include "keyboard.h" #include "keyboard.h"
#include "multiboot.h"
#include "string.h" #include "string.h"
#include "vga.h" #include "vga.h"
#include <stdarg.h> #include <stdarg.h>
#include "multiboot.h"
void handle_keypress(const keyboard_event_t* event) void handle_keypress(const keyboard_event_t* event)
{ {

View File

@@ -6,7 +6,7 @@ static inline void khalt()
{ {
while (true) while (true)
{ {
__asm__ volatile ("hlt"); __asm__ volatile("hlt");
} }
} }

View File

@@ -1,7 +1,6 @@
#include "keyboard.h" #include "keyboard.h"
#include "interrupts.h" #include "interrupts.h"
#include "kernel.h" #include "kernel.h"
#include "vga.h"
#include "util.h" #include "util.h"
#include <stddef.h> #include <stddef.h>

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include <stdbool.h>
#include <stdint.h> #include <stdint.h>
typedef struct typedef struct

View File

@@ -2,16 +2,16 @@
#include <stdint.h> #include <stdint.h>
#define MULTIBOOT_FLAG_MEMIFO 0b0000000000001 #define MULTIBOOT_FLAG_MEMIFO 0b0000000000001
#define MULTIBOOT_FLAG_BOOT_DEVICE 0b0000000000010 #define MULTIBOOT_FLAG_BOOT_DEVICE 0b0000000000010
#define MULTIBOOT_FLAG_CMDLINE 0b0000000000100 #define MULTIBOOT_FLAG_CMDLINE 0b0000000000100
#define MULTIBOOT_FLAG_MODINFO 0b0000000001000 #define MULTIBOOT_FLAG_MODINFO 0b0000000001000
#define MULTIBOOT_FLAG_MMAP 0b0000001000000 #define MULTIBOOT_FLAG_MMAP 0b0000001000000
#define MULTIBOOT_FLAG_DRIVES 0b0000010000000 #define MULTIBOOT_FLAG_DRIVES 0b0000010000000
#define MULTIBOOT_FLAG_CONFIG_TABLE 0b0000100000000 #define MULTIBOOT_FLAG_CONFIG_TABLE 0b0000100000000
#define MULTIBOOT_FLAG_BOOTLOADER_NAME 0b0001000000000 #define MULTIBOOT_FLAG_BOOTLOADER_NAME 0b0001000000000
#define MULTIBOOT_FLAG_APM_TABLE 0b0010000000000 #define MULTIBOOT_FLAG_APM_TABLE 0b0010000000000
#define MULTIBOOT_FLAG_VBEINFO 0b0100000000000 #define MULTIBOOT_FLAG_VBEINFO 0b0100000000000
#define MULTIBOOT_FLAG_FRAMEBUFFER_INFO 0b1000000000000 #define MULTIBOOT_FLAG_FRAMEBUFFER_INFO 0b1000000000000
typedef struct multiboot_info typedef struct multiboot_info

View File

@@ -1,7 +1,7 @@
#pragma once #pragma once
#include <stdint.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h>
int strcmp(const char* a, const char* b); int strcmp(const char* a, const char* b);
void reverse(char* str, size_t length); void reverse(char* str, size_t length);

View File

@@ -2,69 +2,70 @@
#include <stdint.h> #include <stdint.h>
enum { enum
CPUID_FEAT_ECX_SSE3 = 1 << 0, {
CPUID_FEAT_ECX_PCLMUL = 1 << 1, CPUID_FEAT_ECX_SSE3 = 1 << 0,
CPUID_FEAT_ECX_DTES64 = 1 << 2, CPUID_FEAT_ECX_PCLMUL = 1 << 1,
CPUID_FEAT_ECX_MONITOR = 1 << 3, CPUID_FEAT_ECX_DTES64 = 1 << 2,
CPUID_FEAT_ECX_DS_CPL = 1 << 4, CPUID_FEAT_ECX_MONITOR = 1 << 3,
CPUID_FEAT_ECX_VMX = 1 << 5, CPUID_FEAT_ECX_DS_CPL = 1 << 4,
CPUID_FEAT_ECX_SMX = 1 << 6, CPUID_FEAT_ECX_VMX = 1 << 5,
CPUID_FEAT_ECX_EST = 1 << 7, CPUID_FEAT_ECX_SMX = 1 << 6,
CPUID_FEAT_ECX_TM2 = 1 << 8, CPUID_FEAT_ECX_EST = 1 << 7,
CPUID_FEAT_ECX_SSSE3 = 1 << 9, CPUID_FEAT_ECX_TM2 = 1 << 8,
CPUID_FEAT_ECX_CID = 1 << 10, CPUID_FEAT_ECX_SSSE3 = 1 << 9,
CPUID_FEAT_ECX_SDBG = 1 << 11, CPUID_FEAT_ECX_CID = 1 << 10,
CPUID_FEAT_ECX_FMA = 1 << 12, CPUID_FEAT_ECX_SDBG = 1 << 11,
CPUID_FEAT_ECX_CX16 = 1 << 13, CPUID_FEAT_ECX_FMA = 1 << 12,
CPUID_FEAT_ECX_XTPR = 1 << 14, CPUID_FEAT_ECX_CX16 = 1 << 13,
CPUID_FEAT_ECX_PDCM = 1 << 15, CPUID_FEAT_ECX_XTPR = 1 << 14,
CPUID_FEAT_ECX_PCID = 1 << 17, CPUID_FEAT_ECX_PDCM = 1 << 15,
CPUID_FEAT_ECX_DCA = 1 << 18, CPUID_FEAT_ECX_PCID = 1 << 17,
CPUID_FEAT_ECX_SSE4_1 = 1 << 19, CPUID_FEAT_ECX_DCA = 1 << 18,
CPUID_FEAT_ECX_SSE4_2 = 1 << 20, CPUID_FEAT_ECX_SSE4_1 = 1 << 19,
CPUID_FEAT_ECX_X2APIC = 1 << 21, CPUID_FEAT_ECX_SSE4_2 = 1 << 20,
CPUID_FEAT_ECX_MOVBE = 1 << 22, CPUID_FEAT_ECX_X2APIC = 1 << 21,
CPUID_FEAT_ECX_POPCNT = 1 << 23, CPUID_FEAT_ECX_MOVBE = 1 << 22,
CPUID_FEAT_ECX_TSC = 1 << 24, CPUID_FEAT_ECX_POPCNT = 1 << 23,
CPUID_FEAT_ECX_AES = 1 << 25, CPUID_FEAT_ECX_TSC = 1 << 24,
CPUID_FEAT_ECX_XSAVE = 1 << 26, CPUID_FEAT_ECX_AES = 1 << 25,
CPUID_FEAT_ECX_OSXSAVE = 1 << 27, CPUID_FEAT_ECX_XSAVE = 1 << 26,
CPUID_FEAT_ECX_AVX = 1 << 28, CPUID_FEAT_ECX_OSXSAVE = 1 << 27,
CPUID_FEAT_ECX_F16C = 1 << 29, CPUID_FEAT_ECX_AVX = 1 << 28,
CPUID_FEAT_ECX_RDRAND = 1 << 30, CPUID_FEAT_ECX_F16C = 1 << 29,
CPUID_FEAT_ECX_HYPERVISOR = 1 << 31, CPUID_FEAT_ECX_RDRAND = 1 << 30,
CPUID_FEAT_ECX_HYPERVISOR = 1 << 31,
CPUID_FEAT_EDX_FPU = 1 << 0, CPUID_FEAT_EDX_FPU = 1 << 0,
CPUID_FEAT_EDX_VME = 1 << 1, CPUID_FEAT_EDX_VME = 1 << 1,
CPUID_FEAT_EDX_DE = 1 << 2, CPUID_FEAT_EDX_DE = 1 << 2,
CPUID_FEAT_EDX_PSE = 1 << 3, CPUID_FEAT_EDX_PSE = 1 << 3,
CPUID_FEAT_EDX_TSC = 1 << 4, CPUID_FEAT_EDX_TSC = 1 << 4,
CPUID_FEAT_EDX_MSR = 1 << 5, CPUID_FEAT_EDX_MSR = 1 << 5,
CPUID_FEAT_EDX_PAE = 1 << 6, CPUID_FEAT_EDX_PAE = 1 << 6,
CPUID_FEAT_EDX_MCE = 1 << 7, CPUID_FEAT_EDX_MCE = 1 << 7,
CPUID_FEAT_EDX_CX8 = 1 << 8, CPUID_FEAT_EDX_CX8 = 1 << 8,
CPUID_FEAT_EDX_APIC = 1 << 9, CPUID_FEAT_EDX_APIC = 1 << 9,
CPUID_FEAT_EDX_SEP = 1 << 11, CPUID_FEAT_EDX_SEP = 1 << 11,
CPUID_FEAT_EDX_MTRR = 1 << 12, CPUID_FEAT_EDX_MTRR = 1 << 12,
CPUID_FEAT_EDX_PGE = 1 << 13, CPUID_FEAT_EDX_PGE = 1 << 13,
CPUID_FEAT_EDX_MCA = 1 << 14, CPUID_FEAT_EDX_MCA = 1 << 14,
CPUID_FEAT_EDX_CMOV = 1 << 15, CPUID_FEAT_EDX_CMOV = 1 << 15,
CPUID_FEAT_EDX_PAT = 1 << 16, CPUID_FEAT_EDX_PAT = 1 << 16,
CPUID_FEAT_EDX_PSE36 = 1 << 17, CPUID_FEAT_EDX_PSE36 = 1 << 17,
CPUID_FEAT_EDX_PSN = 1 << 18, CPUID_FEAT_EDX_PSN = 1 << 18,
CPUID_FEAT_EDX_CLFLUSH = 1 << 19, CPUID_FEAT_EDX_CLFLUSH = 1 << 19,
CPUID_FEAT_EDX_DS = 1 << 21, CPUID_FEAT_EDX_DS = 1 << 21,
CPUID_FEAT_EDX_ACPI = 1 << 22, CPUID_FEAT_EDX_ACPI = 1 << 22,
CPUID_FEAT_EDX_MMX = 1 << 23, CPUID_FEAT_EDX_MMX = 1 << 23,
CPUID_FEAT_EDX_FXSR = 1 << 24, CPUID_FEAT_EDX_FXSR = 1 << 24,
CPUID_FEAT_EDX_SSE = 1 << 25, CPUID_FEAT_EDX_SSE = 1 << 25,
CPUID_FEAT_EDX_SSE2 = 1 << 26, CPUID_FEAT_EDX_SSE2 = 1 << 26,
CPUID_FEAT_EDX_SS = 1 << 27, CPUID_FEAT_EDX_SS = 1 << 27,
CPUID_FEAT_EDX_HTT = 1 << 28, CPUID_FEAT_EDX_HTT = 1 << 28,
CPUID_FEAT_EDX_TM = 1 << 29, CPUID_FEAT_EDX_TM = 1 << 29,
CPUID_FEAT_EDX_IA64 = 1 << 30, CPUID_FEAT_EDX_IA64 = 1 << 30,
CPUID_FEAT_EDX_PBE = 1 << 31 CPUID_FEAT_EDX_PBE = 1 << 31
}; };
static inline void outb(uint16_t port, uint8_t val) static inline void outb(uint16_t port, uint8_t val)
@@ -84,17 +85,20 @@ static inline void io_wait()
outb(0x80, 0); outb(0x80, 0);
} }
static inline void cpuid(uint32_t code, uint32_t* a, uint32_t* d) { static inline void cpuid(uint32_t code, uint32_t* a, uint32_t* d)
{
__asm__ volatile("cpuid" : "=a"(*a), "=d"(*d) : "a"(code) : "ecx", "ebx"); __asm__ volatile("cpuid" : "=a"(*a), "=d"(*d) : "a"(code) : "ecx", "ebx");
} }
static inline uint64_t rdmsr(uint32_t msr) { static inline uint64_t rdmsr(uint32_t msr)
{
uint32_t lo, hi; uint32_t lo, hi;
__asm__ volatile("rdmsr" : "=a"(lo), "=d"(hi) : "c"(msr)); __asm__ volatile("rdmsr" : "=a"(lo), "=d"(hi) : "c"(msr));
return ((uint64_t)hi << 32) | lo; return ((uint64_t)hi << 32) | lo;
} }
static inline void wrmsr(uint32_t msr, uint64_t value) { static inline void wrmsr(uint32_t msr, uint64_t value)
{
uint32_t lo = (uint32_t)value; uint32_t lo = (uint32_t)value;
uint32_t hi = (uint32_t)(value >> 32); uint32_t hi = (uint32_t)(value >> 32);
__asm__ volatile("wrmsr" : : "c"(msr), "a"(lo), "d"(hi)); __asm__ volatile("wrmsr" : : "c"(msr), "a"(lo), "d"(hi));