summaryrefslogtreecommitdiff
path: root/kernel/arch
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--kernel/arch/x86/include/kernel/asm.h (renamed from arch/i386/include/kernel/asm.h)15
-rw-r--r--kernel/arch/x86/include/kernel/gdt.h (renamed from arch/i386/include/kernel/gdt.h)2
-rw-r--r--kernel/arch/x86/include/kernel/idt.h (renamed from arch/i386/include/kernel/idt.h)0
-rw-r--r--kernel/arch/x86/include/kernel/paging.h (renamed from arch/i386/include/kernel/paging.h)1
-rw-r--r--kernel/arch/x86/include/kernel/pic.h (renamed from arch/i386/include/kernel/pic.h)0
-rw-r--r--kernel/arch/x86/include/kernel/pmem.h (renamed from arch/i386/include/kernel/pmem.h)4
-rw-r--r--kernel/arch/x86/include/kernel/syscall.h (renamed from arch/i386/include/kernel/syscall.h)0
-rw-r--r--kernel/arch/x86/include/kernel/timer.h (renamed from arch/i386/include/kernel/timer.h)0
-rw-r--r--kernel/arch/x86/include/kernel/vmem.h (renamed from arch/i386/include/kernel/vmem.h)0
-rw-r--r--kernel/arch/x86/kernel/gdt.c (renamed from arch/i386/kernel/gdt.c)14
-rw-r--r--kernel/arch/x86/kernel/idt.c (renamed from arch/i386/kernel/idt.c)0
-rw-r--r--kernel/arch/x86/kernel/kmalloc.c (renamed from arch/i386/kernel/kmalloc.c)2
-rw-r--r--kernel/arch/x86/kernel/multiboot.c (renamed from arch/i386/kernel/multiboot.c)0
-rw-r--r--kernel/arch/x86/kernel/paging.c (renamed from arch/i386/kernel/paging.c)0
-rw-r--r--kernel/arch/x86/kernel/pic.c (renamed from arch/i386/kernel/pic.c)0
-rw-r--r--kernel/arch/x86/kernel/pmem.c (renamed from arch/i386/kernel/pmem.c)21
-rw-r--r--kernel/arch/x86/kernel/serial.c (renamed from arch/i386/kernel/serial.c)0
-rw-r--r--kernel/arch/x86/kernel/syscall.c (renamed from arch/i386/kernel/syscall.c)4
-rw-r--r--kernel/arch/x86/kernel/timer.c (renamed from arch/i386/kernel/timer.c)5
19 files changed, 49 insertions, 19 deletions
diff --git a/arch/i386/include/kernel/asm.h b/kernel/arch/x86/include/kernel/asm.h
index cc570c5..18f53c4 100644
--- a/arch/i386/include/kernel/asm.h
+++ b/kernel/arch/x86/include/kernel/asm.h
@@ -3,6 +3,7 @@
#include <kernel/gdt.h>
#include <stdint.h>
+#include <cpuid.h>
#define PCI_CONFIG_ADDR 0xCF8
#define PCI_CONFIG_DATA 0xCFC
@@ -47,6 +48,12 @@ struct isr_frame {
uint32_t eflags;
} __attribute__((packed));
+struct cpuid_info {
+ char vendorID[12];
+ uint32_t feat_ecx;
+ uint32_t feat_edx;
+};
+
void isr_stub_0(void);
void isr_stub_1(void);
void isr_stub_2(void);
@@ -99,12 +106,14 @@ void irq_stub_15(void);
void isr_stub_128(void);
-void aquire_lock(int *lock);
-void release_lock(int *lock);
-
void enable_paging(uint32_t new_cr3);
+int cpuid_check(void);
void flush_gdt(void);
+static inline void cpuid(int code, uint32_t *ecx, uint32_t *ebx) {
+ __asm__ volatile("cpuid" : "=a"(*ecx), "=d"(*ebx) : "a"(code) : "ecx","ebx");
+}
+
static inline void outb(uint16_t port, uint8_t value) {
__asm__ volatile("outb %0, %1" : : "a"(value), "Nd"(port));
}
diff --git a/arch/i386/include/kernel/gdt.h b/kernel/arch/x86/include/kernel/gdt.h
index ec02719..aa05408 100644
--- a/arch/i386/include/kernel/gdt.h
+++ b/kernel/arch/x86/include/kernel/gdt.h
@@ -14,7 +14,7 @@ struct gdt_entry {
struct gdt_ptr {
uint16_t limit;
- uint32_t base;
+ uint64_t base;
} __attribute__((packed));
struct tss_entry {
diff --git a/arch/i386/include/kernel/idt.h b/kernel/arch/x86/include/kernel/idt.h
index 29ec39f..29ec39f 100644
--- a/arch/i386/include/kernel/idt.h
+++ b/kernel/arch/x86/include/kernel/idt.h
diff --git a/arch/i386/include/kernel/paging.h b/kernel/arch/x86/include/kernel/paging.h
index d8bb8f3..3a3c298 100644
--- a/arch/i386/include/kernel/paging.h
+++ b/kernel/arch/x86/include/kernel/paging.h
@@ -2,7 +2,6 @@
#define I386_PAGING_H
#include <kernel/asm.h>
-#include <kernel/multiboot.h>
#include <stdint.h>
#define PAGE_SIZE 4096
diff --git a/arch/i386/include/kernel/pic.h b/kernel/arch/x86/include/kernel/pic.h
index 187d553..187d553 100644
--- a/arch/i386/include/kernel/pic.h
+++ b/kernel/arch/x86/include/kernel/pic.h
diff --git a/arch/i386/include/kernel/pmem.h b/kernel/arch/x86/include/kernel/pmem.h
index e6e4f57..ea4fe29 100644
--- a/arch/i386/include/kernel/pmem.h
+++ b/kernel/arch/x86/include/kernel/pmem.h
@@ -1,7 +1,6 @@
#ifndef I386_PMEM_H
#define I386_PMEM_H
-#include <kernel/multiboot.h>
#include <stdint.h>
#include <stddef.h>
@@ -11,6 +10,9 @@ struct pfa_page {
void pfa_init(struct mboot_info *header);
+uintptr_t pfa_alloc_dma(size_t num_pages);
+uintptr_t pfa_alloc(size_t num_pages);
+
void pfa_free_dma(uintptr_t paddr, size_t num_pages);
void pfa_free(uintptr_t paddr, size_t num_pages);
diff --git a/arch/i386/include/kernel/syscall.h b/kernel/arch/x86/include/kernel/syscall.h
index a657527..a657527 100644
--- a/arch/i386/include/kernel/syscall.h
+++ b/kernel/arch/x86/include/kernel/syscall.h
diff --git a/arch/i386/include/kernel/timer.h b/kernel/arch/x86/include/kernel/timer.h
index c0b3a73..c0b3a73 100644
--- a/arch/i386/include/kernel/timer.h
+++ b/kernel/arch/x86/include/kernel/timer.h
diff --git a/arch/i386/include/kernel/vmem.h b/kernel/arch/x86/include/kernel/vmem.h
index 94aa32d..94aa32d 100644
--- a/arch/i386/include/kernel/vmem.h
+++ b/kernel/arch/x86/include/kernel/vmem.h
diff --git a/arch/i386/kernel/gdt.c b/kernel/arch/x86/kernel/gdt.c
index 0d9e1d2..57424aa 100644
--- a/arch/i386/kernel/gdt.c
+++ b/kernel/arch/x86/kernel/gdt.c
@@ -18,7 +18,7 @@ void gdt_set_gate(int num, uint32_t base, uint32_t limit, uint8_t access, uint8_
}
void write_tss(int num, uint32_t ss0, uint32_t esp0) {
- uint32_t base = (uint32_t)&tss_entry;
+ uint64_t base = (uint64_t)&tss_entry;
uint32_t limit = base + sizeof(struct tss_entry);
gdt_set_gate(num, base, limit, 0x89, 0x00);
@@ -35,13 +35,9 @@ void write_tss(int num, uint32_t ss0, uint32_t esp0) {
tss_entry.iomap_base = sizeof(tss_entry);
}
-void set_kernel_esp(uint32_t esp) {
- tss_entry.esp0 = esp;
-}
-
void gdt_install(void) {
gp.limit = (sizeof(struct gdt_entry) * 6) - 1;
- gp.base = (uint32_t)&desc;
+ gp.base = (uint64_t)&desc;
gdt_set_gate(0, 0, 0, 0, 0);
gdt_set_gate(1, 0, 0xFFFFF, 0x9A, 0xCF);
@@ -49,9 +45,9 @@ void gdt_install(void) {
gdt_set_gate(3, 0, 0xFFFFF, 0xFA, 0xCF);
gdt_set_gate(4, 0, 0xFFFFF, 0xF2, 0xCF);
- uint32_t esp;
- __asm__ volatile("movl %%esp, %0" : "=r"(esp));
- write_tss(5, 0x10, esp);
+ uint64_t rsp;
+ __asm__ volatile("movq %%rsp, %0" : "=r"(rsp));
+ write_tss(5, 0x10, rsp);
flush_gdt();
flush_tss();
diff --git a/arch/i386/kernel/idt.c b/kernel/arch/x86/kernel/idt.c
index a178801..a178801 100644
--- a/arch/i386/kernel/idt.c
+++ b/kernel/arch/x86/kernel/idt.c
diff --git a/arch/i386/kernel/kmalloc.c b/kernel/arch/x86/kernel/kmalloc.c
index ea77428..9e5254c 100644
--- a/arch/i386/kernel/kmalloc.c
+++ b/kernel/arch/x86/kernel/kmalloc.c
@@ -56,6 +56,8 @@ void* kmalloc(size_t sz) {
}
void kfree(void *ptr) {
+ if (ptr == NULL)
+ return;
struct mem_block *temp = first;
while (temp != NULL) {
if (temp->start == (uintptr_t)ptr) {
diff --git a/arch/i386/kernel/multiboot.c b/kernel/arch/x86/kernel/multiboot.c
index dedf163..dedf163 100644
--- a/arch/i386/kernel/multiboot.c
+++ b/kernel/arch/x86/kernel/multiboot.c
diff --git a/arch/i386/kernel/paging.c b/kernel/arch/x86/kernel/paging.c
index a0bbb92..a0bbb92 100644
--- a/arch/i386/kernel/paging.c
+++ b/kernel/arch/x86/kernel/paging.c
diff --git a/arch/i386/kernel/pic.c b/kernel/arch/x86/kernel/pic.c
index 0d29473..0d29473 100644
--- a/arch/i386/kernel/pic.c
+++ b/kernel/arch/x86/kernel/pic.c
diff --git a/arch/i386/kernel/pmem.c b/kernel/arch/x86/kernel/pmem.c
index 40e3400..edf71d9 100644
--- a/arch/i386/kernel/pmem.c
+++ b/kernel/arch/x86/kernel/pmem.c
@@ -6,6 +6,7 @@
#include <libk/io.h>
#include <libk/string.h>
+static uintptr_t bitmap[5];
static struct pfa_page freelist;
void pfa_init(struct mboot_info *header) {
@@ -17,6 +18,9 @@ void pfa_init(struct mboot_info *header) {
}
}
+uintptr_t pfa_alloc_dma(size_t num_pages) {
+}
+
uintptr_t pfa_alloc(size_t num_pages) {
struct pfa_page *temp = (struct pfa_page*)PAGE_TMP_MAP;
map_page(freelist.next, PAGE_TMP_MAP, PD_PRES | PD_RW);
@@ -27,6 +31,23 @@ uintptr_t pfa_alloc(size_t num_pages) {
return ret;
}
+void pfa_free_dma(uintptr_t paddr, size_t num_pages) {
+ if (paddr % PAGE_SIZE != 0)
+ panic("Task attempted to free non-aligned memory");
+ if (paddr >= KSTART && paddr < KEND)
+ return;
+ if (paddr >= 0x00080000 && paddr < 0x00100000)
+ return;
+
+ int index = 0;
+ int bit = 0;
+ for (uintptr_t i = paddr; i < paddr + (num_pages * PAGE_SIZE); i += PAGE_SIZE) {
+ index = i / PAGE_SIZE / 32;
+ bit = i / PAGE_SIZE % 32;
+ bitmap[index] |= 1 << bit;
+ }
+}
+
void pfa_free(uintptr_t paddr, size_t num_pages) {
uintptr_t addr;
struct pfa_page *temp = (struct pfa_page*)PAGE_TMP_MAP;
diff --git a/arch/i386/kernel/serial.c b/kernel/arch/x86/kernel/serial.c
index dc2a8bd..dc2a8bd 100644
--- a/arch/i386/kernel/serial.c
+++ b/kernel/arch/x86/kernel/serial.c
diff --git a/arch/i386/kernel/syscall.c b/kernel/arch/x86/kernel/syscall.c
index 200af4f..1fa73e9 100644
--- a/arch/i386/kernel/syscall.c
+++ b/kernel/arch/x86/kernel/syscall.c
@@ -19,7 +19,7 @@ void handle_syscall(struct isr_frame *frame) {
sys_write(frame);
break;
default:
- panic("Invalid system call number");
+ kprintf("Invalid system call number %d\n", frame->eax);
+ break;
}
- return 0;
}
diff --git a/arch/i386/kernel/timer.c b/kernel/arch/x86/kernel/timer.c
index a7d88dd..bd57cc2 100644
--- a/arch/i386/kernel/timer.c
+++ b/kernel/arch/x86/kernel/timer.c
@@ -8,8 +8,9 @@ void timer_handler(struct isr_frame *frame) {
num_ticks++;
if (num_ticks == 3) {
num_ticks = 0;
- schedule_next();
+ //schedule_next();
}
+ pic_eoi(frame->isr_vector-32);
}
void timer_init(void) {
@@ -20,5 +21,5 @@ void timer_init(void) {
outb(0x40, divisor && 0xFF00 >> 8);
enable_ints();
- register_irq_handler(0, timer_handler);
+ //register_isr_handler(32, timer_handler);
}