summaryrefslogtreecommitdiff
path: root/arch/i386/kernel
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--arch/i386/kernel/isr.s129
-rw-r--r--arch/i386/kernel/jump_userspace.s21
-rw-r--r--arch/i386/kernel/spinlock.s30
-rw-r--r--arch/i386/kernel/stack_trace.s31
-rw-r--r--arch/i386/kernel/switch_thread.s28
-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
15 files changed, 33 insertions, 252 deletions
diff --git a/arch/i386/kernel/isr.s b/arch/i386/kernel/isr.s
deleted file mode 100644
index 55db35e..0000000
--- a/arch/i386/kernel/isr.s
+++ /dev/null
@@ -1,129 +0,0 @@
-.section .text
-
-.macro isr_err_stub num
-.global isr_stub_\num
-.type isr_stub_\num, @function
-isr_stub_\num:
- cli
- pushl $\num
- jmp isr_frame_asm
-.endm
-.macro isr_no_err_stub num
-.global isr_stub_\num
-.type isr_stub_\num, @function
-isr_stub_\num:
- cli
- pushl $0
- pushl $\num
- jmp isr_frame_asm
-.endm
-
-.macro irq_stub num
-.global irq_stub_\num
-.type irq_stub_\num, @function
-irq_stub_\num:
- cli
- pushl $0
- pushl $\num+32
- jmp isr_frame_asm
-.endm
-
-.global syscall_stub
-syscall_stub:
- cli
- pushl $0
- pushl $0x80
- jmp isr_frame_asm
-
-isr_frame_asm:
- pushl %eax
- pushl %ebx
- pushl %ecx
- pushl %edx
- pushl %esi
- pushl %edi
-
- movl %cr0, %eax
- pushl %eax
- movl %cr2, %eax
- pushl %eax
- movl %cr3, %eax
- pushl %eax
- movl %cr4, %eax
- pushl %eax
-
- pushl %esp
- call set_kernel_esp
- addl $4, %esp
-
- cld
- call interrupt_handler
-
- popl %eax
- movl %eax, %cr4
- popl %eax
- movl %eax, %cr3
- popl %eax
- movl %eax, %cr2
- popl %eax
- movl %eax, %cr0
-
- popl %edi
- popl %esi
- popl %edx
- popl %ecx
- popl %ebx
- popl %eax
- addl $8, %esp
-
- iret
-
-isr_no_err_stub 0
-isr_no_err_stub 1
-isr_no_err_stub 2
-isr_no_err_stub 3
-isr_no_err_stub 4
-isr_no_err_stub 5
-isr_no_err_stub 6
-isr_no_err_stub 7
-isr_err_stub 8
-isr_no_err_stub 9
-isr_err_stub 10
-isr_err_stub 11
-isr_err_stub 12
-isr_err_stub 13
-isr_err_stub 14
-isr_no_err_stub 15
-isr_no_err_stub 16
-isr_err_stub 17
-isr_no_err_stub 18
-isr_no_err_stub 19
-isr_no_err_stub 20
-isr_err_stub 21
-isr_no_err_stub 22
-isr_no_err_stub 23
-isr_no_err_stub 24
-isr_no_err_stub 25
-isr_no_err_stub 26
-isr_no_err_stub 27
-isr_no_err_stub 28
-isr_err_stub 29
-isr_err_stub 30
-isr_no_err_stub 31
-
-irq_stub 0
-irq_stub 1
-irq_stub 2
-irq_stub 3
-irq_stub 4
-irq_stub 5
-irq_stub 6
-irq_stub 7
-irq_stub 8
-irq_stub 9
-irq_stub 10
-irq_stub 11
-irq_stub 12
-irq_stub 13
-irq_stub 14
-irq_stub 15
diff --git a/arch/i386/kernel/jump_userspace.s b/arch/i386/kernel/jump_userspace.s
deleted file mode 100644
index add144a..0000000
--- a/arch/i386/kernel/jump_userspace.s
+++ /dev/null
@@ -1,21 +0,0 @@
-.global jump_userspace
-.type jump_userspace, @function
-jump_userspace:
- movw $0x23, %ax
- movw %ax, %ds
- movw %ax, %es
- movw %ax, %fs
- movw %ax, %gs
-
- movl %esp, %eax
- pushl $0x23
- pushl %eax
- pushf
- push $0x1B
- pushl $start_init
-
- pushl %esp
- call set_kernel_esp
- addl $4, %esp
-
- iret
diff --git a/arch/i386/kernel/spinlock.s b/arch/i386/kernel/spinlock.s
deleted file mode 100644
index c8235ca..0000000
--- a/arch/i386/kernel/spinlock.s
+++ /dev/null
@@ -1,30 +0,0 @@
-.section .text
-
-.global aquire_lock
-.type aquire_lock, @function
-aquire_lock:
- pushl %ebp
- movl %esp, %ebp
-locked:
- movl 8(%esp), %eax
- lock incl (%eax)
- jc spin_wait
-
- popl %ebp
- ret
-spin_wait:
- test %eax, 1
- jnz spin_wait
- jmp locked
-
-.global release_lock
-.type release_lock, @function
-release_lock:
- pushl %ebp
- movl %esp, %ebp
-
- movl 8(%ebp), %eax
- lock decl (%eax)
-
- popl %ebp
- ret
diff --git a/arch/i386/kernel/stack_trace.s b/arch/i386/kernel/stack_trace.s
deleted file mode 100644
index fbd77ed..0000000
--- a/arch/i386/kernel/stack_trace.s
+++ /dev/null
@@ -1,31 +0,0 @@
-.section .text
-
-.global walk_stack
-.type walk_stack, @function
-walk_stack:
- pushl %ebp
- movl %esp, %ebp
-
- pushl %edi
- movl -4(%ebp), %edi
- pushl %ebx
- movl -8(%ebp), %ebx
-
- xorl %eax, %eax
- movl 8(%esp), %ebx
- movl 16(%esp), %edi
- movl 20(%esp), %ecx
-walk:
- testl %ebx, %ebx
- jz done
- movl 4(%ebx), %edx
- movl 0(%ebx), %ebx
- movl %edx, (%edi)
- addl $4, %edi
- inc %eax
- loop walk
-done:
- popl %ebx
- popl %edi
- popl %ebp
- ret
diff --git a/arch/i386/kernel/switch_thread.s b/arch/i386/kernel/switch_thread.s
deleted file mode 100644
index f1168d5..0000000
--- a/arch/i386/kernel/switch_thread.s
+++ /dev/null
@@ -1,28 +0,0 @@
-.global switch_thread
-.type switch_thread, @function
-switch_thread:
- pushl %ebp
- movl %esp, %ebp
-
- pushl %ebx
- pushl %esi
- pushl %edi
- pushl %ebp
-
- movl 8(%ebp), %esi
- movl 12(%ebp), %edi
-
- movl %esp, (%edi);
- movl %cr3, %ecx
- movl %ecx, 4(%edi)
-
- movl (%esi), %esp
- movl 4(%esi), %ecx
- movl %ecx, %cr3
-
- popl %ebp
- popl %edi
- popl %esi
- popl %ebx
- popl %ebp
- ret
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);
}