diff --git a/fs/buffer.c b/fs/buffer.c index 3d61a4ce98f48029b37cf4c4d47df949d35936a9..b0e54a991a4b7c4a74a1d4873d1e31ab1d2b85ad 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -21,6 +21,20 @@ inline void wait_on_buffer(struct buffer_head * bh) { sti(); } +int sys_sync() { + int i; + struct buffer_head * bh; + + sync_inodes(); + bh = start_buffer; + for (i=0 ; ib_dirt) + ll_rw_block(WRITE,bh); + } + return 0; +} + int sync_dev(int dev) { int i; struct buffer_head * bh; diff --git a/fs/char_dev.c b/fs/char_dev.c index a3d6a2cf1afc7f88de2e90ec185bedc3ff1e8eeb..6c68f43d42f5c4a7b1737f48cc92d1141e86ad94 100644 --- a/fs/char_dev.c +++ b/fs/char_dev.c @@ -10,7 +10,7 @@ extern int tty_read(unsigned minor,char * buf,int count); extern int tty_write(unsigned minor,char * buf,int count); -typedef (*crw_ptr)(int rw,unsigned minor,char * buf,int count,off_t * pos); +typedef int (*crw_ptr)(int rw,unsigned minor,char * buf,int count,off_t * pos); int rw_ttyx(int rw,unsigned minor,char * buf,int count,off_t * pos) { if (rw == WRITE) { diff --git a/include/linux/fs.h b/include/linux/fs.h index 27fb96c7652a7c2070feb1ebe2c160b7f8de9100..6b77e93ca990ac8a16a3d06c5047e33065852f21 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -138,6 +138,7 @@ extern void sync_inodes(void); extern int bmap(struct m_inode * inode,int block); extern int create_block(struct m_inode * inode,int block); +extern struct m_inode * new_inode(int dev); extern void iput(struct m_inode * inode); extern struct m_inode * iget(int dev,int nr); diff --git a/include/linux/kernel.h b/include/linux/kernel.h index f7ddbda71c3827f82813e9c208c13c91a3b142a7..4746e6656e577e610971cb71c4915d8b235cd457 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -1,6 +1,7 @@ #ifndef _KERNEL_H #define _KERNEL_H +void panic(const char * str); int printk(const char* fmt, ...); #endif diff --git a/include/linux/sched.h b/include/linux/sched.h index 70817a8c4b5c75b5f23b7b2fc926de378cba97d2..64a7a3f5d0cbe3260620c96c586f71238cacb68c 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -36,6 +36,8 @@ extern int copy_page_tables(unsigned long from, unsigned long to, long size); extern int free_page_tables(unsigned long from, unsigned long size); void trap_init(); +extern void panic(const char * str); +extern int tty_write(unsigned minor,char * buf,int count); void sched_init(); void add_timer(long jiffies, void (*fn)(void)); void sleep_on(struct task_struct ** p); diff --git a/kernel/Makefile b/kernel/Makefile index 4e22d71f7521148ac2b9c3a313da3d2f0d38dc7a..d3c0c72f4df1deb04cc1e0463239bfe4ca95608a 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -2,7 +2,8 @@ GCC := gcc CCFLAG := -I../include -nostdinc -ffreestanding -Wall -fomit-frame-pointer -fno-pic -fno-stack-protector -c -m32 LDFLAG := -Ttext 0x0 -s --oformat binary -m elf_i386 INCDIR := ../include -OBJS := head.o main.o sys_call.o asm.o sched.o printk.o vsprintf.o traps.o fork.o chr_drv/chr_drv.a blk_drv/blk_drv.a ../mm/mm.o ../lib/lib.a ../fs/fs.o +OBJS := head.o main.o sys_call.o asm.o sched.o printk.o vsprintf.o \ + traps.o fork.o panic.o chr_drv/chr_drv.a blk_drv/blk_drv.a ../mm/mm.o ../lib/lib.a ../fs/fs.o system: $(OBJS) $(LD) $(LDFLAG) -M -e startup_32 -o $@ $^ > System.map @@ -34,6 +35,9 @@ traps.o : traps.c fork.o : fork.c $(GCC) $(CCFLAG) -o $@ $< +panic.o : panic.c + $(GCC) $(CCFLAG) -o $@ $< + chr_drv/chr_drv.a: chr_drv/*.c cd chr_drv; make chr_drv.a; cd .. diff --git a/kernel/fork.c b/kernel/fork.c index 24ada8a3ec4f7807d6b190628da5355f3481daa4..04f1f6e750a52a14ecef37943f829e9ab2cfb6b2 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -15,10 +15,10 @@ int copy_mem(int nr, struct task_struct* p) { old_data_base = get_base(current->ldt[2]); if (old_data_base != old_code_base) { //printk("%x, %x\n", old_data_base, old_code_base); - printk("We don't support separate I&D\n"); + panic("We don't support separate I&D\n"); } if (data_limit < code_limit) - printk("Bad data_limit"); + panic("Bad data_limit"); new_data_base = new_code_base = nr * TASK_SIZE; set_base(p->ldt[1],new_code_base); diff --git a/kernel/panic.c b/kernel/panic.c new file mode 100644 index 0000000000000000000000000000000000000000..7975a9101bdc13ba4854d7bb6dd66ab0409a568f --- /dev/null +++ b/kernel/panic.c @@ -0,0 +1,17 @@ +#include +#include + +int sys_sync(); + +void panic(const char * s) { + printk("Kernel panic: %s\n\r",s); + if (current == task[0]) { + printk("In swapper task - not syncing\n\r"); + } + else { + sys_sync(); + } + + for (;;); +} + diff --git a/kernel/sched.c b/kernel/sched.c index b40182146ad3f5ab634bfa319d1c05ab54fe1096..292a947636c02c3dde95b5b4dd51ad7408ccf6aa 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -67,7 +67,7 @@ static inline void __sleep_on(struct task_struct** p, int state) { if (!p) return; if (current == &(init_task.task)) - printk("task[0] trying to sleep"); + panic("task[0] trying to sleep"); tmp = *p; *p = current; @@ -118,7 +118,7 @@ int ticks_to_floppy_on(unsigned int nr) { unsigned char mask = 0x10 << nr; if (nr>3) - printk("floppy_on: nr>3"); + panic("floppy_on: nr>3"); moff_timer[nr]=10000; cli(); @@ -185,7 +185,7 @@ void add_timer(long jiffies, void (*fn)()) { if (!p->fn) break; if (p >= timer_list + TIME_REQUESTS) - printk("No more time requests free"); + panic("No more time requests free"); p->fn = fn; p->jiffies = jiffies;