diff options
| author | Miguel <m.i@gmx.at> | 2018-08-19 19:39:47 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-08-19 19:39:47 +0200 |
| commit | 5055dc85c8a74fcd2ec24fbc51eba2a2da68debe (patch) | |
| tree | 6b9589c5c89c8bc5c90771ff9d630c15e670f024 /kernel | |
| parent | 575c725f998b166f1d286a2664aa3d6061d337fe (diff) | |
cleaning up asm stuff and improving docs
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/interrupts.c | 8 | ||||
| -rw-r--r-- | kernel/kernel.c | 8 | ||||
| -rw-r--r-- | kernel/mp.c | 2 | ||||
| -rw-r--r-- | kernel/ringbuffer.c | 16 | ||||
| -rw-r--r-- | kernel/smp.c | 4 | ||||
| -rw-r--r-- | kernel/spinlock.c | 2 | ||||
| -rw-r--r-- | kernel/task.c | 2 | ||||
| -rw-r--r-- | kernel/timer.c | 2 | ||||
| -rw-r--r-- | kernel/vmem.c | 4 | ||||
| -rw-r--r-- | kernel/x86.c | 140 | ||||
| -rw-r--r-- | kernel/x86.h | 34 |
11 files changed, 23 insertions, 199 deletions
diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 74599c3..41d0a9c 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -5,7 +5,7 @@ #include "asm/asm.h" #include "driver/mouse.h" #include "interrupts.h" -#include "x86.h" +#include "asm/x86.h" void errlog(uint32_t error_code) { @@ -90,7 +90,7 @@ void exception_handle_14(uint32_t error_code,uint32_t eip,uint16_t cs,uint16_t u log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_U/S: %d",error_code&4?1:0); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_RSVD: %d",error_code&8?1:0); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"error_code_I/D: %d",error_code&16?1:0); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"at addr: 0x%08X",x86_get_cr2()); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"at addr: 0x%08X",x86_get_cr(2)); deflog(eip,cs,flags); panic(FOOLOS_MODULE_NAME,"Exception: Fault: Page Fault"); @@ -166,8 +166,8 @@ void int_init(uint16_t sel) int_install(); // now we can enable interrupts back again - // x86_int_enable(); - x86_int_disable(); + // x86_sti(); + x86_cli(); } void int_install() diff --git a/kernel/kernel.c b/kernel/kernel.c index 03862a9..b23a6d9 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -23,13 +23,11 @@ /* F00L 0S Entry point (called directly from asm/multiboot.asm */ void kernel_main(uint32_t eax,uint32_t ebx) { - // SERIAL PORT serial_init(); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"COM 1 - initialized"); - // PR - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%s - compiled on %s at %s", - KERNEL_NAME,__DATE__,__TIME__); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"git revision: %s",GIT_REVISION); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%s - BUILD: git-%s (%s %s)", + KERNEL_NAME,GIT_REVISION,__DATE__,__TIME__); // PIT TIMER timer_init(); diff --git a/kernel/mp.c b/kernel/mp.c index abea5cb..76754b8 100644 --- a/kernel/mp.c +++ b/kernel/mp.c @@ -2,7 +2,7 @@ #include <stdbool.h> -#include "x86.h" +#include "asm/x86.h" #include "lib/logger/log.h" // logger facilities #include "smp.h" diff --git a/kernel/ringbuffer.c b/kernel/ringbuffer.c index 31185dc..099e96a 100644 --- a/kernel/ringbuffer.c +++ b/kernel/ringbuffer.c @@ -20,11 +20,11 @@ ringbuffer ringbuffer_init(uint32_t size) bool ringbuffer_put(ringbuffer* f,uint8_t c) { - x86_int_disable(); + x86_cli(); if((f->back-1+f->size)%f->size==f->front) { - x86_int_enable(); + x86_sti(); return false; } @@ -33,30 +33,30 @@ bool ringbuffer_put(ringbuffer* f,uint8_t c) f->back+=f->size; f->back%=f->size; - x86_int_enable(); + x86_sti(); return true; } bool ringbuffer_has(ringbuffer* f) { - x86_int_disable(); + x86_cli(); bool res=true; if(f->front==f->back) res=false; - x86_int_enable(); + x86_sti(); return res; } uint8_t ringbuffer_get(ringbuffer* f) // non blocking . please check first { - x86_int_disable(); + x86_cli(); char c; if(f->front==f->back) { - x86_int_enable(); + x86_sti(); return ' '; } @@ -66,6 +66,6 @@ uint8_t ringbuffer_get(ringbuffer* f) // non blocking . please check first f->front+=f->size; f->front%=f->size; - x86_int_enable(); + x86_sti(); return c; } diff --git a/kernel/smp.c b/kernel/smp.c index 08af652..a562df3 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -10,7 +10,7 @@ #include "smp.h" #include "mem.h" #include "spinlock.h" -#include "x86.h" +#include "asm/x86.h" #define FOOLOS_APIC_SPUR_INT 0x00f0 #define FOOLOS_APIC_INT_COMMAND_LOW 0x0300 @@ -27,7 +27,7 @@ uint32_t local_apic_addr; void smp_main() { - x86_int_disable(); + x86_cli(); while(1); // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"local apic_addr:0x%08X",local_apic_addr); diff --git a/kernel/spinlock.c b/kernel/spinlock.c index f97b7db..2a546a8 100644 --- a/kernel/spinlock.c +++ b/kernel/spinlock.c @@ -4,7 +4,7 @@ #include "kernel.h" #include "lib/logger/log.h" -#include "x86.h" +#include "asm/x86.h" // https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html diff --git a/kernel/task.c b/kernel/task.c index be9ddd9..3c1e067 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -7,7 +7,7 @@ #include "lib/logger/log.h" // logger facilities #include "mem.h" #include "timer.h" -#include "x86.h" +#include "asm/x86.h" #include "vmem.h" #include "syscalls.h" diff --git a/kernel/timer.c b/kernel/timer.c index 3f7ab0f..e5e26b4 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -32,7 +32,7 @@ #define FOOLOS_MODULE_NAME "timer" #include "timer.h" -#include "x86.h" +#include "asm/x86.h" #include "lib/logger/log.h" // TODO: use mutex? do we need volatile at all!?? diff --git a/kernel/vmem.c b/kernel/vmem.c index 3d3456b..fb19e75 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -3,7 +3,7 @@ #include <stdlib.h> #include "kernel.h" -#include "x86.h" +#include "asm/x86.h" #include "mem.h" #include "vmem.h" #include "lib/logger/log.h" // logger facilities @@ -491,7 +491,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir) void vmem_set_dir(pdirectory *dir) { - x86_set_pdbr(dir); + x86_set_page_directory(dir); } pdirectory* vmem_init(uint32_t kernel_blocks, uint32_t frameb_addr) diff --git a/kernel/x86.c b/kernel/x86.c deleted file mode 100644 index d664657..0000000 --- a/kernel/x86.c +++ /dev/null @@ -1,140 +0,0 @@ -#define FOOLOS_MODULE_NAME "x86" - -#include "x86.h" -#include "timer.h" -#include "lib/logger/log.h" - -// -// suffix (b, w, l, q for byte, word, dword, and qword). -// - -// disable interrupts -void x86_int_disable() -{ - asm volatile("cli"); -} - -// enable interrupts -void x86_int_enable() -{ - asm volatile("sti"); -} - -// get control registers (cr0-cr4) -uint32_t x86_get_cr0() -{ - uint32_t cr; - asm volatile("mov %%cr0, %0": "=b"(cr)); - return cr; -} - -uint32_t x86_get_cr1() -{ - uint32_t cr=0; - - // reading the reserved cr1 register results in crash. - // (at least on emulators) - // asm volatile("mov %%cr1, %0": "=b"(cr)); - - return cr; -} - -uint32_t x86_get_cr2() -{ - uint32_t cr; - asm volatile("mov %%cr2, %0": "=b"(cr)); - return cr; -} - -uint32_t x86_get_cr3() -{ - uint32_t cr=0; - asm volatile("mov %%cr3, %0": "=b"(cr)); - return cr; -} - -uint32_t x86_get_cr4() -{ - uint32_t cr; - asm volatile("mov %%cr4, %0": "=b"(cr)); - return cr; -} -void x86_outb(uint32_t port, uint8_t data) -{ - asm volatile("outb %0,%w1" : : "a" (data), "d" (port)); -} - -uint8_t x86_inb(uint32_t port) -{ - uint8_t data; - asm volatile("inb %w1,%0" : "=a" (data) : "d" (port)); - return data; -} - -void x86_outw(uint32_t port, uint16_t data) -{ - asm volatile("outw %0,%w1" : : "a" (data), "d" (port)); -} - -uint16_t x86_inw(uint32_t port) -{ - uint16_t data; - asm volatile("inw %w1,%0" : "=a" (data) : "d" (port)); - return data; -} - -void x86_outl(uint32_t port, uint32_t data) -{ - asm volatile("outl %0,%w1" : : "a" (data), "d" (port)); -} - -uint32_t x86_inl(uint32_t port) -{ - uint32_t data; - asm volatile("inl %w1,%0" : "=a" (data) : "d" (port)); - return data; -} - - -void x86_set_pdbr(uint32_t addr) -{ - asm volatile("mov %0, %%cr3":: "b"(addr)); - -} - -// enable PT bit in CR0 -void x86_paging_enable() -{ - uint32_t cr0=x86_get_cr0(); - cr0 |= 0x80000000; // enable paging - asm volatile("mov %0, %%cr0":: "b"(cr0)); -} - -// disable PT bit in CR0 -void x86_paging_disable() -{ - uint32_t cr0=x86_get_cr0(); - cr0 &= ~0x80000000; - asm volatile("mov %0, %%cr0":: "b"(cr0)); -} - -void x86_flush_tlb(uint32_t addr) -{ - asm volatile("invlpg (%0)" ::"r" (addr) : "memory"); -} - -//xchg -uint8_t x86_xchg(uint8_t *addr, uint8_t val) -{ - - uint8_t result; - - // The + in "+m" denotes a read-modify-write operand. - asm volatile("lock xchgb %0, %1" : - "+m" (*addr), "=a" (result) : - "1" (val) : - "cc"); - - //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"xchg val:%d with addr:0x%08X : result: %d",val,addr,result); - return result; -} diff --git a/kernel/x86.h b/kernel/x86.h deleted file mode 100644 index b634722..0000000 --- a/kernel/x86.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef FOOLOS_X86_H -#define FOOLOS_X86_H - -#include <stdint.h> - -// http://wiki.osdev.org/Interrupt_Service_Routines - -// TODO : Real sleep()! - -void x86_outb(uint32_t port, uint8_t data); -uint8_t x86_inb(uint32_t port); - -void x86_outw(uint32_t port, uint16_t data); -uint16_t x86_inw(uint32_t port); - -void x86_outl(uint32_t port, uint32_t data); -uint32_t x86_inl(uint32_t port); - -void x86_set_pdbr(uint32_t addr); -void x86_paging_enable(); -void x86_flush_tlb(uint32_t addr); - -void x86_int_enable(); -void x86_int_disable(); - -uint32_t x86_get_cr0(); -uint32_t x86_get_cr1(); -uint32_t x86_get_cr2(); -uint32_t x86_get_cr3(); -uint32_t x86_get_cr4(); - -uint8_t x86_xchg(uint8_t *addr, uint8_t val); - -#endif |
