diff options
| author | Michal Idziorek <m.i@gmx.at> | 2015-05-18 00:48:07 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2015-05-18 00:48:07 +0200 |
| commit | db22b587966b4a4eaa47536f32ca812532446bcb (patch) | |
| tree | b6d471f5232973713ef64d9c81feefef51ee5eaf | |
| parent | 042e25e19b5fc0cec1d47440c26246c886cf39f6 (diff) | |
heavy refactoring underway
| -rw-r--r-- | .gdbinit | 5 | ||||
| -rw-r--r-- | Makefile | 1 | ||||
| -rw-r--r-- | driver/console.c | 33 | ||||
| -rw-r--r-- | driver/keyboard.c | 2 | ||||
| -rw-r--r-- | fs/ext2.c | 6 | ||||
| -rw-r--r-- | fs/file.h | 7 | ||||
| -rw-r--r-- | fs/ringbuffer.c | 71 | ||||
| -rw-r--r-- | fs/ringbuffer.h | 27 | ||||
| -rw-r--r-- | kernel/acpi.c | 10 | ||||
| -rw-r--r-- | kernel/kernel.c | 35 | ||||
| -rw-r--r-- | kernel/kernel.h | 5 | ||||
| -rw-r--r-- | kernel/kmalloc.c | 4 | ||||
| -rw-r--r-- | kernel/mp.c | 7 | ||||
| -rw-r--r-- | kernel/syscalls.c | 6 | ||||
| -rw-r--r-- | kernel/task.c | 1 | ||||
| -rw-r--r-- | lib/logger/log.c | 79 | ||||
| -rw-r--r-- | lib/logger/log.h | 13 | ||||
| -rw-r--r-- | lib/printf/printf.c (renamed from xxx/lib/printf/printf.c) | 0 | ||||
| -rw-r--r-- | lib/printf/printf.h (renamed from xxx/lib/printf/printf.h) | 0 | ||||
| -rw-r--r-- | lib/string/string.c (renamed from xxx/lib/string/string.c) | 40 | ||||
| -rw-r--r-- | lib/string/string.h | 8 | ||||
| -rw-r--r-- | xxx/lib/string/string.h | 3 |
22 files changed, 293 insertions, 70 deletions
@@ -1,4 +1,3 @@ file foolos.img -target remote localhost:1234 -set architecture i386 -break kernel_main +target remote :1234 + @@ -69,6 +69,7 @@ SOURCES+=$(wildcard ./kernel/*.c) SOURCES+=$(wildcard ./fs/*.c) SOURCES+=$(wildcard ./driver/*.c) SOURCES+=$(wildcard ./terminal/*.c) +SOURCES+=$(wildcard ./lib/*/*.c) #derive kernel object files OBJECTS=$(patsubst %.c, %.o, $(SOURCES)) diff --git a/driver/console.c b/driver/console.c index b6958c5..fcbf6e1 100644 --- a/driver/console.c +++ b/driver/console.c @@ -36,7 +36,6 @@ static void print_char_col(int x, int y, char c, char col) // glue func for vt52 terminal void console_put_char(uint8_t c,uint8_t color, uint32_t x, uint32_t y) { - print_char_col(x,y,c, color); } // @@ -132,22 +131,6 @@ static void scr_nextline() #endif } -static void scr_put_char(char ch,char col) -{ - - if(ch=='\n')scr_nextline(); - else if(posx<SCR_WIDTH) - { - print_char_col(posx,posy,ch,col); - posx++; - } - -#ifdef FOOLOS_CONSOLE_AUTOBREAK - if(posx>=SCR_WIDTH)scr_nextline(); -#endif - -} - /* void scr_put_hex(uint16_t val) { @@ -178,6 +161,22 @@ void scr_put_hex32(uint32_t val) } */ +static void scr_put_char(char ch,char col) +{ + + if(ch=='\n')scr_nextline(); + else if(posx<SCR_WIDTH) + { + print_char_col(posx,posy,ch,col); + posx++; + } + +#ifdef FOOLOS_CONSOLE_AUTOBREAK + if(posx>=SCR_WIDTH)scr_nextline(); +#endif + +} + static void scr_put_string(char *str, char col) { while(*str!=0) diff --git a/driver/keyboard.c b/driver/keyboard.c index 4366127..2323b04 100644 --- a/driver/keyboard.c +++ b/driver/keyboard.c @@ -2,7 +2,7 @@ #define FOOLOS_MODULE_NAME "keyboard" -#include "x86.h" +#include "kernel/x86.h" /// idiots keyboard driver //// // http://www.computer-engineering.org/ps2keyboard/scancodes1.html @@ -6,7 +6,6 @@ #include <stdbool.h> #include <stdint.h> -#include "lib/string/string.h" #include "lib/logger/log.h" #include "fs.h" #include "ext2.h" @@ -272,7 +271,7 @@ int ext2_filename_to_inode_traverse(uint8_t *ram, char *path,int inode_start) for(int i=0;i<count;i++) { - if(true==strcmp(first,dirs[i].name,0)) + if(!strcmp_l(first,dirs[i].name,0)) { log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"found: %s (%s)",first,dirs[i].type==FS_FILE_TYPE_DIR?"dir":"file"); if(final)return dirs[i].inode; @@ -291,7 +290,8 @@ int ext2_filename_to_inode_traverse(uint8_t *ram, char *path,int inode_start) int ext2_filename_to_inode(uint8_t *ram, char *path) { - if(true==strcmp(path,"/",0))return 2; // root is inode 2 by definition + if(!strcmp_l(path,"/",0))return 2; // root is inode 2 by definition + char buf[256]; for(int i=0;i<256;i++) { @@ -5,11 +5,10 @@ typedef struct file_struct { - uint32_t file_id; + int fgetc(); + int fputc(); - void (*read)(); - void (*write)(); - void (*seek)(); + void *opaque; }file; diff --git a/fs/ringbuffer.c b/fs/ringbuffer.c new file mode 100644 index 0000000..ca5870f --- /dev/null +++ b/fs/ringbuffer.c @@ -0,0 +1,71 @@ +#define FOOLOS_MODULE_NAME "fifo" +#include "lib/logger/log.h" + +#include "fifo.h" + +static int sl=9; + +fifo fifo_init(uint32_t size) +{ + fifo f; + f.data=kballoc(size); + f.size=size*4096; + f.front=f.size-1; + f.back=f.size-1; + return f; +} + +bool fifo_put(fifo* f,uint8_t c) +{ + x86_int_disable(); + lock_spin(sl); + + if((f->back-1+f->size)%f->size==f->front) + { + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by put"); + x86_int_enable(); + return false; + } + + f->data[f->back]=c; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"put %d %d (%c)", f->back, f->front,c); + f->back--; + f->back+=f->size; + f->back%=f->size; + + lock_release(sl); + x86_int_enable(); + + return true; +} + +uint8_t fifo_get(fifo* f) // blocking +{ + + char c; + + x86_int_disable(); + lock_spin(sl); + + if(f->front==f->back) + { + lock_release(sl); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"unlocked by get"); + x86_int_enable(); + c='_'; + return false; + } + + c=f->data[f->front]; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"get %d %d (%c)", f->back, f->front,c); + + f->front--; + f->front+=f->size; + f->front%=f->size; + + lock_release(sl); + x86_int_enable(); + + return true; +} diff --git a/fs/ringbuffer.h b/fs/ringbuffer.h new file mode 100644 index 0000000..31d00cf --- /dev/null +++ b/fs/ringbuffer.h @@ -0,0 +1,27 @@ +#ifndef RINGBUFFER_H +#define RINGBUFFER_H + +#include <stdint.h> +#include <stdbool.h> + +// Simple FIRST IN FIRST OUT +// requires kballoc - block allocation +typedef struct ringbuffer_struct +{ + uint32_t size; + uint32_t front; + uint32_t back; + + uint8_t *data; + +}ringbuffer; + +// create new fifo of given size (in blocks) +ringbuffer ringbuffer_init(uint32_t blocks); + +// true on success +bool ringbuffer_put(ringbuffer*,uint8_t); +uint8_t ringbuffer_get(ringbuffer*); // blocking +bool ringbuffer_has(ringbuffer*); // check if somehting waiting? + +#endif diff --git a/kernel/acpi.c b/kernel/acpi.c index 3aec83b..d7a1749 100644 --- a/kernel/acpi.c +++ b/kernel/acpi.c @@ -3,10 +3,10 @@ #define FOOLOS_MODULE_NAME "acpi" -#include "lib/logger/log.h" #include <stdint.h> -#include "lib/string/string.h" +#include <stdbool.h> #include "smp.h" +#include "lib/logger/log.h" typedef struct acpi_rsdt_struct @@ -91,7 +91,7 @@ void acpi_check_madt(uint32_t *madt,smp_processors *procdata) acpi_madt *table=(acpi_madt *)*madt; log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"Looking for MADT Table at %08X.",table); - if(strcmp("APIC",table->sig,4)) + if(!strcmp_l("APIC",table->sig,4)) { log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Found MADT Table at 0x%08X",table); uint8_t *end=(uint8_t *)table; @@ -115,7 +115,7 @@ void acpi_read_rsdt(acpi_rsdt *rsdt,smp_processors *procdata) { log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Reading RSDT Table at 0x%08X",rsdt); - if(!strcmp("RSDT",rsdt->sig,4)) + if(strcmp_l("RSDT",rsdt->sig,4)) panic(FOOLOS_MODULE_NAME,"Signature MISMATCH!"); int entries=(rsdt->length-sizeof(acpi_rsdt))/4; @@ -146,7 +146,7 @@ bool acpi_find(smp_processors *procdata) while(search<=(char *)0xfffff) { - if(strcmp("RSD PTR ",search,8)) // notice trailing space in "RSD PTR " + if(!strcmp_l("RSD PTR ",search,8)) // notice trailing space in "RSD PTR " { uint8_t checksum=0; for(int i=0;i<20;i++) diff --git a/kernel/kernel.c b/kernel/kernel.c index 098fc64..0fb337f 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -22,12 +22,13 @@ #include <stddef.h> // for built-in shell -#include "lib/buffer/ringbuffer.h" #include "task.h" -#include "video/console.h" #include "multiboot.h" #include "terminal/vt52.h" +#include "driver/console.h" + +#include "fs/fifo.h" // // The Foolish structure of Fool OS! @@ -38,15 +39,30 @@ fool_os *get_fool() { return &foolos; } +// +// +// + +// stdio init : TODO: move away! +static vt52_tty tty1; + static void put_kb(uint8_t c) { - vt52_kb(get_fool()->tty1,c); + vt52_kb(&tty1,c); } -void kernel_main(uint32_t eax,uint32_t ebx) +static void stdin_put_char(uint8_t c) { + vt52_kb(&tty1,c); +} + + +static void init_stdio() +{ + fifo in=fifo_init(1); + fifo out=fifo_init(1); // // Setup terminal output / input @@ -56,14 +72,21 @@ void kernel_main(uint32_t eax,uint32_t ebx) screen.update_cursor=update_cursor; term_in input; + input.put_char=stdin_put_char; - vt52_tty tty=vt52_init(&screen,&input); - get_fool()->tty1=&tty; + tty1=vt52_init(&screen,&input); keyboard_init(put_kb); +} + +void kernel_main(uint32_t eax,uint32_t ebx) +{ + + init_stdio(); + // // PR // diff --git a/kernel/kernel.h b/kernel/kernel.h index b6eccb8..fb4e44d 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -3,11 +3,12 @@ #define KERNEL_VERSION "FoolOs 0.2.1" -#include "terminal/vt52.h"; +#include "fs/fifo.h"; typedef struct fool_os_struct { - vt52_tty *tty1; + fifo fifo_stdin; + fifo fifo_stdout; }fool_os; diff --git a/kernel/kmalloc.c b/kernel/kmalloc.c index a3b4ab6..d235f55 100644 --- a/kernel/kmalloc.c +++ b/kernel/kmalloc.c @@ -22,7 +22,7 @@ void kmallocinit() next*=4096; } - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"kmalloc_init: 0x%08X",next); +// log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"kmalloc_init: 0x%08X",next); init=1; } @@ -38,7 +38,7 @@ uint32_t kballoc(uint32_t size) { panic(FOOLOS_MODULE_NAME,"kballoc ran out of memory! maybe increase MEM_SIZE in kmalloc.c?"); } - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"(%d) : 0x%08X (~%dKB left)",size,old,(MEM_SIZE-next+first)/1024); + // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"(%d) : 0x%08X (~%dKB left)",size,old,(MEM_SIZE-next+first)/1024); return old; } diff --git a/kernel/mp.c b/kernel/mp.c index 8312821..abea5cb 100644 --- a/kernel/mp.c +++ b/kernel/mp.c @@ -1,8 +1,9 @@ #define FOOLOS_MODULE_NAME "mp" +#include <stdbool.h> + #include "x86.h" #include "lib/logger/log.h" // logger facilities -#include "lib/string/string.h" #include "smp.h" @@ -153,7 +154,7 @@ bool mp_find(smp_processors *procdata) uint8_t *addr=0x8000; while(addr<=0xfffff) { - if(strcmp("_MP_",addr,4)) + if(!strcmp_l("_MP_",addr,4)) { // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Found at 0x%04X",addr); if(do_mp_fps(addr,procdata))return true; @@ -164,7 +165,7 @@ bool mp_find(smp_processors *procdata) addr=0x190000-1025; while(addr<=0x190000+1024) { - if(strcmp("_MP_",addr,4)) + if(!strcmp_l("_MP_",addr,4)) { // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Found at 0x%04X",addr); if(do_mp_fps(addr,procdata))return true; diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 1d63ba4..9900567 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -1,6 +1,5 @@ #define FOOLOS_MODULE_NAME "syscalls" -#include "lib/buffer/ringbuffer.h" #include "lib/logger/log.h" #include "fs/fs.h" #include "fs/ext2.h" @@ -44,7 +43,7 @@ int syscall_write(int file, char *buf, int len) //stderr and stdout go to console for(int i=0;i<len;i++) { - vt52_put( get_fool()->tty1,buf[i]); + fifo_put(&get_fool()->fifo_stdout,buf[i]); } lock_release(2); //x86_int_enable(); @@ -75,7 +74,8 @@ int syscall_read(int file, char *buf, int len) while(1) { - bool ret=ringbuffer_get(&c); +// bool ret=ringbuffer_get(&c); + bool ret=false; if(ret) { diff --git a/kernel/task.c b/kernel/task.c index 36ccafe..8bb6c13 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -3,7 +3,6 @@ // #include "kernel.h" #include "lib/logger/log.h" // logger facilities -#include "lib/buffer/ringbuffer.h" #include "mem.h" #include "timer.h" #include "x86.h" diff --git a/lib/logger/log.c b/lib/logger/log.c new file mode 100644 index 0000000..9348f01 --- /dev/null +++ b/lib/logger/log.c @@ -0,0 +1,79 @@ +#define FOOLOS_MODULE_NAME "log" + +#include <stdarg.h> +#include <stdbool.h> + +#include "log.h" + +#include "kernel/kernel.h" +#include "kernel/config.h" +#include "terminal/vt52.h" +#include "kernel/timer.h" + + +static char buffer[LOG_BUF_SIZE]; +static int first=0; +static int last=0; +static bool init=true;// + + +static void log_string(char *str) +{ + while(*str!=0) + { + fifo_put(&get_fool()->fifo_stdout,*(str++)); + } +} + +void log(char *module_name, int log_level, char *format_string, ...) +{ + + #ifdef FOOLOS_LOG_OFF + return; + #endif + + if(log_level<FOOLOS_LOG_INFO)return; + + char buf_info[256]; + char buf_log[256]; + char buf_time[20]; + + uint32_t t=timer_get_ticks(); + uint32_t s=t/25; + uint32_t ms=t*1000/25-1000*s; + + tfp_sprintf(buf_time,"[%3d.%05d]",s,ms); + + va_list va; + va_start(va,format_string); + tfp_vsprintf(buf_info,format_string,va); + va_end(va); + + tfp_sprintf(buf_log,"%s %s: %s\n",buf_time,module_name,buf_info); + + if(init)log_string(buf_log); + + for(int i=0;buf_log[i]!=0;i++) + { + buffer[last]=buf_log[i]; + last=(last+1)%LOG_BUF_SIZE; + if(first<last)if(last-first>=LOG_BUF_SIZE)first=(first+1)%LOG_BUF_SIZE; + if(last>first)if(LOG_BUF_SIZE-last+first>=LOG_BUF_SIZE)first=(first+1)%LOG_BUF_SIZE; + } + + +} + +void panic(char *module_name, char *message) +{ + char buf_log[256]; + tfp_sprintf(buf_log,"KERNEL PANIC !! %s: %s\n",module_name,message); + log_string(buf_log); + + while(1) + { + asm volatile("cli"); + asm volatile("hlt"); + } + +} diff --git a/lib/logger/log.h b/lib/logger/log.h new file mode 100644 index 0000000..38f1219 --- /dev/null +++ b/lib/logger/log.h @@ -0,0 +1,13 @@ +#ifndef FOOLOS_LOG_H +#define FOOLOS_LOG_H + +#define FOOLOS_LOG_ERROR 5 +#define FOOLOS_LOG_WARNING 4 +#define FOOLOS_LOG_INFO 3 +#define FOOLOS_LOG_DEBUG 2 +#define FOOLOS_LOG_FINE 1 + +void log(char *module_name, int prio, char *format_string, ...); +void panic(char *module_name, char *format_string); + +#endif diff --git a/xxx/lib/printf/printf.c b/lib/printf/printf.c index 23d3d46..23d3d46 100644 --- a/xxx/lib/printf/printf.c +++ b/lib/printf/printf.c diff --git a/xxx/lib/printf/printf.h b/lib/printf/printf.h index 0e65915..0e65915 100644 --- a/xxx/lib/printf/printf.h +++ b/lib/printf/printf.h diff --git a/xxx/lib/string/string.c b/lib/string/string.c index 729c509..be2c7ed 100644 --- a/xxx/lib/string/string.c +++ b/lib/string/string.c @@ -1,37 +1,43 @@ #include <stdbool.h> +#include "string.h" +void* memcpy(void* restrict dstptr, const void* restrict srcptr, int size) +{ + unsigned char* dst = (unsigned char*) dstptr; + const unsigned char* src = (const unsigned char*) srcptr; + for ( int i = 0; i < size; i++ ) + dst[i] = src[i]; + return dstptr; +} + + +// extra function for non-null terminated //length 0 for null terminated strings; -bool strcmp(char *str1, char *str2, int length) +int strcmp_l(char *str1, char *str2, int length) { int i=0; while(true) { - if(str1[i]!=str2[i])return false; + + if(str1[i]!=str2[i])return str1[i]-str2[i]; i++; + if(i==length) return 0; + + if( length==0 && (str1[i]==0 || str2[i]==0 ) ) + return str1[i]-str2[i]; - if(i==length) return true; - if(str1[i]==0||str2[i]==0) - { - if(str1[i]==str2[i])return true; - return false; - } } } - -void* memcpy(void* restrict dstptr, const void* restrict srcptr, int size) +static int strcmp(char *str1, char *str2) { - unsigned char* dst = (unsigned char*) dstptr; - const unsigned char* src = (const unsigned char*) srcptr; - for ( int i = 0; i < size; i++ ) - dst[i] = src[i]; - return dstptr; + return strcmp_l(str1,str2,0); } + int strlen(const char* string) { int result = 0; - while ( string[result] ) - result++; + while ( string[result] )result++; return result; } diff --git a/lib/string/string.h b/lib/string/string.h new file mode 100644 index 0000000..e41eb94 --- /dev/null +++ b/lib/string/string.h @@ -0,0 +1,8 @@ +#ifndef STRING_H +#define STRING_H + + +void* memcpy(void* restrict dstptr, const void* restrict srcptr, int size); +int strcmp_l(char *str1, char *str2, int length); + +#endif diff --git a/xxx/lib/string/string.h b/xxx/lib/string/string.h deleted file mode 100644 index a804de9..0000000 --- a/xxx/lib/string/string.h +++ /dev/null @@ -1,3 +0,0 @@ -#include <stdbool.h> -bool strcmp(char *str1, char *str2, int length); -void* memcpy(void* restrict dstptr, const void* restrict srcptr, int size); |
