summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile13
-rw-r--r--asm/asm_gdt.h2
-rw-r--r--asm/asm_mp.h1
-rw-r--r--asm/asm_pit.h10
-rw-r--r--asm/asm_task.h2
-rw-r--r--driver/keyboard.c4
-rw-r--r--driver/keyboard.h3
-rw-r--r--driver/mouse.c5
-rw-r--r--driver/mouse.h1
-rw-r--r--driver/screen.c3
-rw-r--r--driver/serial.c1
-rw-r--r--driver/terminal.c36
-rw-r--r--driver/terminal.h2
-rw-r--r--driver/timer.c1
-rw-r--r--driver/vesa.c2
-rw-r--r--driver/vesa.h2
-rw-r--r--fs/elf.c5
-rw-r--r--fs/elf.h1
-rw-r--r--fs/ext2.c22
-rw-r--r--fs/file.h2
-rw-r--r--fs/fs.h2
-rw-r--r--fs/mount.h2
-rw-r--r--kernel/acpi.c3
-rw-r--r--kernel/gdt.c15
-rw-r--r--kernel/gdt.h3
-rw-r--r--kernel/interrupts.c3
-rw-r--r--kernel/interrupts.h1
-rw-r--r--kernel/kernel.c7
-rw-r--r--kernel/mem.h1
-rw-r--r--kernel/mp.c9
-rw-r--r--kernel/ringbuffer.c1
-rw-r--r--kernel/scheduler.c10
-rw-r--r--kernel/scheduler.h2
-rw-r--r--kernel/smp.c5
-rw-r--r--kernel/smp.h6
-rw-r--r--kernel/syscalls.c3
-rw-r--r--kernel/syscalls.h5
-rw-r--r--kernel/vmem.c4
-rw-r--r--kernel/vmem.h2
39 files changed, 158 insertions, 44 deletions
diff --git a/Makefile b/Makefile
index 6aba498..4de169d 100644
--- a/Makefile
+++ b/Makefile
@@ -36,12 +36,19 @@ CFLAGS+=-gstabs
#CFLAGS+= -w # disable all warnings
#CFLAGS+= -Wimplicit-function-declaration
+CFLAGS+= -Wall
#CFLAGS+= -Wextra
-#CFLAGS+= -Wall
-#CFLAGS+= -Werror
-#CFLAGS+= -Werror=implicit-function-declaration
+#CFLAGS+= -pedantic
+CFLAGS+= -Werror
+CFLAGS+= -Werror=implicit-function-declaration
+
+CFLAGS+= -Wno-unused-variable
CFLAGS+= -Wno-int-conversion
+CFLAGS+= -Wno-implicit-int
CFLAGS+= -Wno-incompatible-pointer-types
+CFLAGS+= -Wno-discarded-qualifiers
+
+#CFLAGS+ = -Wall -Wextra -std=c89 -pedantic -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition
######## linker flags ####################
LDFLAGS=
diff --git a/asm/asm_gdt.h b/asm/asm_gdt.h
index 523b783..128dbf3 100644
--- a/asm/asm_gdt.h
+++ b/asm/asm_gdt.h
@@ -4,4 +4,4 @@
*/
/** call as asm_setup_gdt(GDT,sizeof(GDT)) */
-void asm_setup_gdt(uint32_t addr, uint32_t size)
+void asm_setup_gdt(uint32_t addr, uint32_t size);
diff --git a/asm/asm_mp.h b/asm/asm_mp.h
index 3ace14a..f207c12 100644
--- a/asm/asm_mp.h
+++ b/asm/asm_mp.h
@@ -1,2 +1,3 @@
/** Application processors */
void smp_start();
+void asm_smp_unlock();
diff --git a/asm/asm_pit.h b/asm/asm_pit.h
index 58067bf..785acb3 100644
--- a/asm/asm_pit.h
+++ b/asm/asm_pit.h
@@ -20,3 +20,13 @@ void asm_pit_tick();
/** get number of ticks */
uint32_t asm_pit_get_ticks();
+
+void asm_pit_sleep_50ms();
+void asm_pit_sleep_40ms();
+void asm_pit_sleep_10ms();
+void asm_pit_sleep_1ms();
+
+void asm_pit_rate_50ms();
+void asm_pit_rate_40ms();
+void asm_pit_rate_10ms();
+void asm_pit_rate_1ms();
diff --git a/asm/asm_task.h b/asm/asm_task.h
index 40a8c17..d0babb0 100644
--- a/asm/asm_task.h
+++ b/asm/asm_task.h
@@ -1 +1 @@
-/* empty */
+void task_pusha(uint32_t esp);
diff --git a/driver/keyboard.c b/driver/keyboard.c
index 7cc93ec..f188cfc 100644
--- a/driver/keyboard.c
+++ b/driver/keyboard.c
@@ -3,6 +3,8 @@
#include "asm_x86.h"
+#include "keyboard.h"
+#include "syscalls.h"
#include <stdbool.h>
@@ -15,7 +17,7 @@ static uint32_t kb_stream;
static void put(uint8_t c)
{
- syscall_write(kb_stream,&c,1);
+ syscall_write(kb_stream,(char *)&c,1);
}
void keyboard_init(uint32_t s)
diff --git a/driver/keyboard.h b/driver/keyboard.h
index 8b13789..03462f3 100644
--- a/driver/keyboard.h
+++ b/driver/keyboard.h
@@ -1 +1,2 @@
-
+void keyboard_init(uint32_t s);
+void keyboard_handle(uint8_t in);
diff --git a/driver/mouse.c b/driver/mouse.c
index ab7ec58..b9e0079 100644
--- a/driver/mouse.c
+++ b/driver/mouse.c
@@ -1,5 +1,6 @@
#include "kernel/kernel.h"
-
+#include "mouse.h"
+#include "driver/vesa.h"
//http://forum.osdev.org/viewtopic.php?t=10247
//based on Mouse.inc by SANiK
@@ -130,7 +131,7 @@ void mouse_log()
//klog("%d / %d / %02x ",mouse_x, mouse_y,mouse_byte[2]);
if (mouse_byte[0] & 1)vesa_put_rect(mouse_x,600-mouse_y,10,10,0x00ffff);
//else vesa_put_rect(mouse_x,600-mouse_y,10,10,0x0000ff);
- PutFont('X', mouse_x,600-mouse_y, 0xff0000);
+ PutFont('X', mouse_x,600-mouse_y, 0xff0000,0);
}
diff --git a/driver/mouse.h b/driver/mouse.h
index dbf7393..95bf088 100644
--- a/driver/mouse.h
+++ b/driver/mouse.h
@@ -1 +1,2 @@
void mouse_handler();
+void mouse_init();
diff --git a/driver/screen.c b/driver/screen.c
index f095a15..4d39b77 100644
--- a/driver/screen.c
+++ b/driver/screen.c
@@ -1,12 +1,13 @@
#include "screen.h"
#include "kernel/kernel.h"
+#include "asm_x86.h"
//#define FOOLOS_CONSOLE
static int posx=0;
static int posy=0;
-static void scr_nextline();
+//static void scr_nextline();
void update_cursor(uint32_t col,uint32_t row)
{
diff --git a/driver/serial.c b/driver/serial.c
index 4e43251..0088868 100644
--- a/driver/serial.c
+++ b/driver/serial.c
@@ -1,6 +1,7 @@
#include "serial.h"
#include "asm_x86.h" // provides x86_inb() and x86_outb()
+
/** COM1 Port */
static const PORT=0x3f8;
diff --git a/driver/terminal.c b/driver/terminal.c
index 6ac1533..978a7be 100644
--- a/driver/terminal.c
+++ b/driver/terminal.c
@@ -38,8 +38,8 @@ typedef enum {
ecma48_fg_magenta,
ecma48_fg_cyan,
ecma48_fg_white,
- ecma48_undersore_on, // set def color
- ecma48_undersore_off, // set def color
+ ecma48_underscore_on, // set def color
+ ecma48_underscore_off, // set def color
ecma48_bg_black,
ecma48_bg_red,
@@ -78,6 +78,32 @@ static void process_graphic_npar(terminal_tty *tty, terminal_settings s)
switch(s)
{
+ case ecma48_null_mapping_2:
+ break;
+ case ecma48_null_mapping_1:
+ break;
+ case ecma48_reset_mapping:
+ break;
+ case ecma48_blinkoff:
+ break;
+ case ecma48_blink:
+ break;
+ case ecma48_nounderline:
+ break;
+ case ecma48_underscore_on:
+ break;
+ case ecma48_underscore_off:
+ break;
+ case ecma48_underscore:
+ break;
+ case ecma48_halfbright:
+ break;
+ case ecma48_normalbright_1:
+ break;
+ case ecma48_normalbright_2:
+ break;
+ case ecma48_bold:
+ break;
case ecma48_reset:
tty->fg=SCR_WHITE;
tty->bg=SCR_BLACK;
@@ -285,7 +311,7 @@ void terminal_kb(terminal_tty *tty, uint8_t c)
*/
// send one ASCII character to the terminal
-bool terminal_put(terminal_tty *tty, uint8_t c)
+void terminal_put(terminal_tty *tty, uint8_t c)
{
// CONTROL CHARACTERS
@@ -316,7 +342,7 @@ bool terminal_put(terminal_tty *tty, uint8_t c)
if(c==0x08) //BACKSPACE
{
- if(tty->x>0&&tty->command_l>0||!tty->set_echo)
+ if((tty->x>0&&tty->command_l>0)||!tty->set_echo)
{
set_char(tty,tty->x-1,tty->y,' ',tty->fg,tty->bg);
tty->x--;
@@ -525,6 +551,6 @@ bool terminal_put(terminal_tty *tty, uint8_t c)
//cusor pos
tty->screen->update_cursor(tty->x,tty->y);
- return true;
+ return;
}
diff --git a/driver/terminal.h b/driver/terminal.h
index be711f5..fac513d 100644
--- a/driver/terminal.h
+++ b/driver/terminal.h
@@ -71,7 +71,7 @@ typedef struct terminal_tty_struct
terminal_tty terminal_init(term_out *screen,term_in *input);
-bool terminal_put(terminal_tty *tty, uint8_t c);
+void terminal_put(terminal_tty *tty, uint8_t c);
void terminal_kb(terminal_tty *tty, uint8_t c);
#endif
diff --git a/driver/timer.c b/driver/timer.c
index d30a299..1ceebc5 100644
--- a/driver/timer.c
+++ b/driver/timer.c
@@ -1,6 +1,7 @@
#include "timer.h"
#include "asm_x86.h"
+#include "asm_pit.h"
static volatile uint64_t task_system_clock_start=0;
diff --git a/driver/vesa.c b/driver/vesa.c
index 090596c..bdf1c9a 100644
--- a/driver/vesa.c
+++ b/driver/vesa.c
@@ -34,12 +34,14 @@ void vesa_update_cursor(uint32_t col,uint32_t row)
}
// helper_funcs
+/*
static void vesa_print_char_col(int x, int y, char c, char col_fg, char col_bg)
{
// uint16_t attrib = (col_bg << 4) | (col_fg & 0x0F);
// uint16_t* video_mem=(uint16_t *)SCR_VIDEOMEM+(x+y*SCR_REAL_WIDTH);
// *video_mem=c | (attrib << 8) ;
}
+*/
// same colors as in screen.h
static uint32_t cols[] = {
diff --git a/driver/vesa.h b/driver/vesa.h
index ec98e84..7122d68 100644
--- a/driver/vesa.h
+++ b/driver/vesa.h
@@ -48,3 +48,5 @@ uint32_t vesa_init(vbeinfo *info,vbemodeinfo *mode,foolfont *rawfont);
void PutConsoleChar(char c, int color);
void PutConsole(char *str, int color);
+void vesa_put_rect(int x, int y, int w , int h, int color);
+void PutFont(char c, int x,int y, int color_fg,int color_bg);
diff --git a/fs/elf.c b/fs/elf.c
index 1a6fa89..bca527a 100644
--- a/fs/elf.c
+++ b/fs/elf.c
@@ -1,6 +1,7 @@
#include "kernel/kernel.h"
#include <stdint.h>
#include "ext2.h"
+#include "lib/string/string.h"
#define EI_NIDENT 16
@@ -149,14 +150,14 @@ uint32_t load_elf(char *name, uint32_t *alloc)
//uint8_t *data=vaddr+phdr->p_offset;
uint8_t *data=vaddr+phdr->p_offset+phdr->p_filesz-1;
- for(uint8_t *addr=phdr->p_vaddr+phdr->p_filesz-1; addr>=phdr->p_vaddr; addr--)
+ for(uint8_t *addr=phdr->p_vaddr+phdr->p_filesz-1; (uint32_t)addr>=phdr->p_vaddr; addr--)
{
*addr=*data;
data--;
}
// let's zero init bss and set alloc (heap) just right after it!
- for(uint8_t *addr=phdr->p_vaddr+phdr->p_filesz; addr<=phdr->p_vaddr+phdr->p_memsz; addr++)
+ for(uint8_t *addr=phdr->p_vaddr+phdr->p_filesz; (uint32_t)addr<=phdr->p_vaddr+phdr->p_memsz; addr++)
{
*addr=0;
}
diff --git a/fs/elf.h b/fs/elf.h
index fe3e952..bcbfc2d 100644
--- a/fs/elf.h
+++ b/fs/elf.h
@@ -1,2 +1 @@
-
uint32_t load_elf(char *name, uint32_t *alloc);
diff --git a/fs/ext2.c b/fs/ext2.c
index f1e368d..7562cf0 100644
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -1,6 +1,9 @@
#include "kernel/kernel.h"
// ext2 minidriver
// based on osdev wiki article: http://wiki.osdev.org/Ext2
+//
+//
+#include "lib/string/string.h"
@@ -116,12 +119,13 @@ int ext2_check(uint8_t *ram)
ext2_superblock super;
ext2_superblock_ext super_ext;
uint8_t *ptr=ram+1024;
- ram_read(ptr,&super,sizeof(super),1);
+ ram_read((char*)ptr,&super,sizeof(super),1);
if(super.ext2_sig!=0xef53){
klog("addr: 0x%08X",ram);
kpanic("no ext2 signature found, where ram-image expected");
}
+ return 1;
}
ext2_inode ext2_get_inode(uint8_t *ram,int inode_num)
@@ -133,7 +137,7 @@ ext2_inode ext2_get_inode(uint8_t *ram,int inode_num)
ext2_inode inode;
uint8_t *ptr=ram+1024;
- ram_read(ptr,&super,sizeof(super),1);
+ ram_read((char*)ptr,&super,sizeof(super),1);
if(super.ext2_sig!=0xef53)
{
klog("addr: 0x%08X",ram);
@@ -150,13 +154,13 @@ ext2_inode ext2_get_inode(uint8_t *ram,int inode_num)
ptr=ram+block_size*descriptor_start_block;
ptr+=sizeof(desc)*block_group; // skip to our descriptor;
- ram_read(ptr,&desc,sizeof(desc),1); // read descriptor
+ ram_read((char*)ptr,&desc,sizeof(desc),1); // read descriptor
// read our inode;
ptr=ram+block_size*desc.addr_inode_table;
ptr+=128*((inode_num-1)%super.inodes_per_group);
- ram_read(ptr,&inode,sizeof(inode),1); //get inode 2 (rood-directory)
+ ram_read((char*)ptr,&inode,sizeof(inode),1); //get inode 2 (rood-directory)
return inode;
@@ -189,8 +193,8 @@ void* ext2_get_indirectstart_double(void *start, uint32_t block_size, uint32_t i
int ext2_inode_content(char *ram,int inode_nr,uint8_t *ramdest,int max)
{
- ext2_check(ram);
- ext2_inode inode=ext2_get_inode(ram,inode_nr);
+ ext2_check((uint8_t *)ram);
+ ext2_inode inode=ext2_get_inode((uint8_t*)ram,inode_nr);
int pos=0;
int block=0;
@@ -248,7 +252,7 @@ int ext2_inode_content(char *ram,int inode_nr,uint8_t *ramdest,int max)
}
klog("Fool Check Sum: 0x%08X for %d bytes",sum,count);
-
+ return 1;
}
int ext2_filename_to_inode_traverse(uint8_t *ram, char *path,int inode_start)
@@ -322,11 +326,11 @@ int ext2_read_dir(uint8_t *ram, int inode_nr,fs_dirent *dirs,int max)
// read dir data
ext2_dir dir;
- ram_read(ptr,&dir,sizeof(dir),1);
+ ram_read((char*)ptr,&dir,sizeof(dir),1);
// read name
ptr+=sizeof(dir);
- ram_read(ptr,&buf,sizeof(char),dir.name_length_low);
+ ram_read((char*)ptr,&buf,sizeof(char),dir.name_length_low);
ptr+=dir.name_length_low;
buf[dir.name_length_low]=0;
diff --git a/fs/file.h b/fs/file.h
index 7734393..53c96d8 100644
--- a/fs/file.h
+++ b/fs/file.h
@@ -13,7 +13,7 @@ typedef struct
int(* wrtie)(char *buf, int len);
int(* close)();
- int(* stat)(struct stat *buf);
+ int(* stat)(void *buf);
void *data; //opaque
diff --git a/fs/fs.h b/fs/fs.h
index aa38180..79583cf 100644
--- a/fs/fs.h
+++ b/fs/fs.h
@@ -20,6 +20,8 @@ typedef struct fs_dirent_struct
}fs_dirent;
int fs_readdir(const char *name,fs_dirent *dirs,int max);
+void fs_content(char *path, uint32_t dest, uint32_t max_bytes);
void fs_mount(multiboot_information *info); // mounts ext2 ramimage from module as root
+uint32_t fs_get_root_ext2_ramimage();
#endif
diff --git a/fs/mount.h b/fs/mount.h
index 0a330a6..1231fcd 100644
--- a/fs/mount.h
+++ b/fs/mount.h
@@ -12,7 +12,7 @@ typedef struct mount_struct
char path[256]; // where are we mounted
int (*getdents) (struct mount_struct*, uint32_t file_desciptor, fs_dirent *entries, uint32_t max_count);
file (*open) (struct mount_struct*,char *path);
- void *data //opaque
+ void *data; //opaque
}mount;
diff --git a/kernel/acpi.c b/kernel/acpi.c
index 5192c37..8b139bf 100644
--- a/kernel/acpi.c
+++ b/kernel/acpi.c
@@ -1,6 +1,5 @@
#include "kernel.h"
#include <stdint.h>
-#include <stdbool.h>
#include "smp.h"
#include "lib/string/string.h"
@@ -170,7 +169,7 @@ bool acpi_find(smp_processors *procdata)
search++;
- if(search==0xa0000)search=0xe0000;
+ if((uint32_t)search==0xa0000)search=0xe0000;
}
return false;
diff --git a/kernel/gdt.c b/kernel/gdt.c
index bf8f203..48bc284 100644
--- a/kernel/gdt.c
+++ b/kernel/gdt.c
@@ -1,6 +1,8 @@
// http://wiki.osdev.org/GDT_Tutorial
-#include "kernel/kernel.h"
-#include "kernel/gdt.h"
+#include "kernel.h"
+#include "gdt.h"
+#include "asm_gdt.h"
+#include "kmalloc.h"
#include <stdint.h>
@@ -50,6 +52,11 @@ struct gdt_entry_bits
unsigned int base_high :8;
} __packed; //or __attribute__((packed))
+void setup_gdt(uint8_t *gdt_struct)
+{
+ asm_setup_gdt(&gdt_struct[0],8*GDT_SIZE);
+}
+
/**
* \param target A pointer to the 8-byte GDT entry
* \param source An arbitrary structure describing the GDT entry
@@ -153,7 +160,3 @@ void gdt_init()
}
-void setup_gdt(uint8_t *gdt_struct)
-{
- asm_setup_gdt(&gdt_struct[0],8*GDT_SIZE);
-}
diff --git a/kernel/gdt.h b/kernel/gdt.h
index a234ea4..314cc99 100644
--- a/kernel/gdt.h
+++ b/kernel/gdt.h
@@ -2,6 +2,8 @@
// http://wiki.osdev.org/TSS
// http://wiki.osdev.org/Global_Descriptor_Table
+#include <stdint.h>
+
typedef volatile struct strtss{
unsigned short link;
unsigned short link_h;
@@ -44,3 +46,4 @@ typedef volatile struct strtss{
}__attribute__((packed)) tss_struct;
void gdt_init();
+void install_tss(uint32_t cpu,uint32_t esp0);
diff --git a/kernel/interrupts.c b/kernel/interrupts.c
index 992889f..69f5316 100644
--- a/kernel/interrupts.c
+++ b/kernel/interrupts.c
@@ -2,8 +2,11 @@
#include "asm_int.h"
#include "asm_pit.h"
#include "driver/mouse.h"
+#include "driver/keyboard.h"
#include "interrupts.h"
+#include "scheduler.h"
#include "asm_x86.h"
+#include "smp.h"
/** The size of our interrupts table */
#define INT_MAX 256 // 0-255
diff --git a/kernel/interrupts.h b/kernel/interrupts.h
index ab76092..aafd5d4 100644
--- a/kernel/interrupts.h
+++ b/kernel/interrupts.h
@@ -26,4 +26,5 @@
*/
void interrupts_init(uint16_t sel);
+void int_install();
#endif
diff --git a/kernel/kernel.c b/kernel/kernel.c
index bdb34d9..5a17567 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -15,9 +15,16 @@
#include "syscalls.h"
#include "fifo.h"
#include "mp.h"
+#include "asm_mp.h"
+#include "asm_x86.h"
#include "interrupts.h"
#include "ringbuffer.h"
#include "driver/screen.h"
+#include "asm_pic.h"
+
+#include "fs/fs.h"
+#include "kmalloc.h"
+#include "driver/vesa.h"
/* F00L 0S Entry point (called directly from asm/multiboot.asm */
void kernel_main(uint32_t eax,uint32_t ebx)
diff --git a/kernel/mem.h b/kernel/mem.h
index 42bf84d..76d12b0 100644
--- a/kernel/mem.h
+++ b/kernel/mem.h
@@ -3,3 +3,4 @@ typedef uint32_t physical_address;
physical_address* pmmngr_alloc_block ();
void pmmngr_free_block (physical_address* p);
uint32_t mem_init(multiboot_information *info);
+uint32_t mem_get_free_blocks_count();
diff --git a/kernel/mp.c b/kernel/mp.c
index df7549a..ba6a042 100644
--- a/kernel/mp.c
+++ b/kernel/mp.c
@@ -4,6 +4,7 @@
#include "asm_x86.h"
#include "smp.h"
+#include "lib/string/string.h"
typedef struct mp_fps_struct
{
@@ -147,9 +148,9 @@ bool mp_find(smp_processors *procdata)
klog("Looking for Mp Floating Ponter Struct...");
uint8_t *addr=0x8000;
- while(addr<=0xfffff)
+ while((uint32_t)addr<=0xfffff)
{
- if(!strcmp_l("_MP_",addr,4))
+ if(!strcmp_l("_MP_",(char*)addr,4))
{
// klog("Found at 0x%04X",addr);
if(do_mp_fps(addr,procdata))return true;
@@ -158,9 +159,9 @@ bool mp_find(smp_processors *procdata)
}
addr=0x190000-1025;
- while(addr<=0x190000+1024)
+ while((uint32_t)addr<=0x190000+1024)
{
- if(!strcmp_l("_MP_",addr,4))
+ if(!strcmp_l("_MP_",(char*)addr,4))
{
// klog("Found at 0x%04X",addr);
if(do_mp_fps(addr,procdata))return true;
diff --git a/kernel/ringbuffer.c b/kernel/ringbuffer.c
index d6d515d..fd87727 100644
--- a/kernel/ringbuffer.c
+++ b/kernel/ringbuffer.c
@@ -1,5 +1,6 @@
#include "ringbuffer.h"
+#include "kmalloc.h"
// TODO: this is disabled because a kb interrupt can occur anytime
// and the kernel will need to access the ringbuffer while we are accessing!
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index 72165f9..20c6f35 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -1,8 +1,12 @@
#include "scheduler.h"
#include "kernel.h"
+#include "gdt.h"
#include "mem.h"
+#include "fs/elf.h"
#include "asm_x86.h"
+#include "asm_task.h"
+#include "asm_usermode.h"
#include "kmalloc.h"
#include "vmem.h"
@@ -32,13 +36,14 @@ static volatile struct task_list_struct
volatile uint32_t ecx;
volatile uint32_t edx;
-}volatile task_list[MAX_TASKS];
+}task_list[MAX_TASKS];
volatile int task_reset(uint32_t pid, uint32_t entry, uint32_t stack)
{
uint32_t *stk=task_list[pid].esp;
stk[14]=entry;
stk[17]=stack;
+ return 1;
}
volatile int add_task(uint32_t parent,uint32_t vmem)
@@ -199,6 +204,7 @@ volatile uint32_t task_syscall(uint32_t eax,uint32_t ebx, uint32_t ecx, uint32_t
task_list[current_task].edx=edx;
task_list[2].wait=false;
+ return 1;
}
//TODO: free vmem too!
@@ -211,6 +217,7 @@ volatile uint32_t task_exit(uint32_t pid)
task_list[parent_pid].wait=false;
klog("[%d] exit", pid);
vmem_free_dir(task_list[pid].vmem);
+ return 1;
}
volatile uint32_t task_wait(uint32_t pid)
@@ -218,6 +225,7 @@ volatile uint32_t task_wait(uint32_t pid)
klog("[%d] wait", pid);
task_list[pid].wait=true;
task_list[pid].eax=SYSCALL_WAIT;
+ return 1;
}
volatile uint32_t task_fork(uint32_t pid)
diff --git a/kernel/scheduler.h b/kernel/scheduler.h
index e89e8a3..a6eacd8 100644
--- a/kernel/scheduler.h
+++ b/kernel/scheduler.h
@@ -10,3 +10,5 @@ volatile uint32_t task_fork(uint32_t pid);
volatile uint32_t task_clone(uint32_t pid);
volatile uint32_t task_wait(uint32_t pid);
volatile int task_reset(uint32_t pid, uint32_t entry, uint32_t stack);
+volatile uint32_t task_syscall(uint32_t eax,uint32_t ebx, uint32_t ecx, uint32_t edx);
+volatile uint32_t my_scheduler(uint32_t oldesp,uint32_t force_pid);
diff --git a/kernel/smp.c b/kernel/smp.c
index 0c8d2dd..c965b2e 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -7,9 +7,14 @@
#include <stdint.h>
#include "smp.h"
+#include "gdt.h"
#include "mem.h"
+#include "interrupts.h"
+#include "kmalloc.h"
#include "spinlock.h"
#include "asm_x86.h"
+#include "asm_pit.h"
+#include "asm_mp.h"
#define APIC_APICID 0x20
#define APIC_APICVER 0x30
diff --git a/kernel/smp.h b/kernel/smp.h
index ef0a660..e99c77b 100644
--- a/kernel/smp.h
+++ b/kernel/smp.h
@@ -3,6 +3,7 @@
#include "kernel.h"
+#include <stdbool.h>
typedef struct
{
@@ -20,4 +21,9 @@ typedef struct
}smp_processors;
+void apicEOI();
+uint32_t apicID();
+bool acpi_find(smp_processors *procdata);
+void smp_start_aps(smp_processors *pros);
+
#endif
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index 67ae48d..a49429d 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -95,8 +95,10 @@ int syscall_read(int file, char *buf, int len)
buf++;
l++;
+ return l;
if(l==len)return l;
if(c=='\n')return l;
+
}
//TODO: replace with dirent!
@@ -375,4 +377,5 @@ uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint
case SYSCALL_POLL :
return syscall_poll(p1);
}
+ return -1;
}
diff --git a/kernel/syscalls.h b/kernel/syscalls.h
index 56e78a2..7335e2c 100644
--- a/kernel/syscalls.h
+++ b/kernel/syscalls.h
@@ -22,6 +22,11 @@
#define SYSCALL_POLL 80 //shit!?
#define SYSCALL_CLONE 83
+uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid);
+int chk_syscall_read(int file, char *buf, int len);
+int syscall_open(char *name, int flags, int mode);
+int syscall_write(int file, char *buf, int len);
+
// new planned syscalls for graphx
// TODO: split ncurses and our syscalls??
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 0dd896c..3b5be30 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -4,6 +4,8 @@
#include "asm_x86.h"
#include "mem.h"
#include "vmem.h"
+#include "kmalloc.h"
+#include "lib/string/string.h"
static uint32_t kernel_pages;
uint32_t fb_addr;
@@ -100,7 +102,7 @@ physical_addr pd_entry_get_frame (pd_entry* e)
return *e&I86_PDE_FRAME;
}
-boolpd_entry_is_present (pd_entry e)
+bool pd_entry_is_present (pd_entry e)
{
return e&I86_PDE_PRESENT;
}
diff --git a/kernel/vmem.h b/kernel/vmem.h
index 541a84a..2a8e7cc 100644
--- a/kernel/vmem.h
+++ b/kernel/vmem.h
@@ -81,3 +81,5 @@ typedef struct pdirectory_struct {
}pdirectory;
pdirectory* vmem_init(uint32_t kernel_blocks,uint32_t fb_addr,uint32_t apic_addr, uint32_t ioapic_addr);
+void vmem_free_dir(pdirectory *dir);
+pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only);