summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2015-05-18 00:48:07 +0200
committerMichal Idziorek <m.i@gmx.at>2015-05-18 00:48:07 +0200
commitdb22b587966b4a4eaa47536f32ca812532446bcb (patch)
treeb6d471f5232973713ef64d9c81feefef51ee5eaf
parent042e25e19b5fc0cec1d47440c26246c886cf39f6 (diff)
heavy refactoring underway
-rw-r--r--.gdbinit5
-rw-r--r--Makefile1
-rw-r--r--driver/console.c33
-rw-r--r--driver/keyboard.c2
-rw-r--r--fs/ext2.c6
-rw-r--r--fs/file.h7
-rw-r--r--fs/ringbuffer.c71
-rw-r--r--fs/ringbuffer.h27
-rw-r--r--kernel/acpi.c10
-rw-r--r--kernel/kernel.c35
-rw-r--r--kernel/kernel.h5
-rw-r--r--kernel/kmalloc.c4
-rw-r--r--kernel/mp.c7
-rw-r--r--kernel/syscalls.c6
-rw-r--r--kernel/task.c1
-rw-r--r--lib/logger/log.c79
-rw-r--r--lib/logger/log.h13
-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.h8
-rw-r--r--xxx/lib/string/string.h3
22 files changed, 293 insertions, 70 deletions
diff --git a/.gdbinit b/.gdbinit
index be3cb95..4a45ea3 100644
--- a/.gdbinit
+++ b/.gdbinit
@@ -1,4 +1,3 @@
file foolos.img
-target remote localhost:1234
-set architecture i386
-break kernel_main
+target remote :1234
+
diff --git a/Makefile b/Makefile
index 92b60e2..aee113d 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/fs/ext2.c b/fs/ext2.c
index 858b7d6..4f00000 100644
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -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++)
{
diff --git a/fs/file.h b/fs/file.h
index e5a0664..241301f 100644
--- a/fs/file.h
+++ b/fs/file.h
@@ -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);