diff --git a/fs/Makefile b/fs/Makefile index 126ced27327830c1c966d91a46b8fb3113fad721..d6e31f539656c7aefa9741891944e05d59974a46 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -3,7 +3,7 @@ LD := ld CCFLAG := -I../include -nostdinc -ffreestanding -Wall -fomit-frame-pointer -fno-stack-protector -fno-pic -c -m32 LDFLAG := -Ttext 0x0 -s --oformat binary -m elf_i386 INCDIR := ../include -OBJS := read_write.o buffer.o super.o +OBJS := read_write.o buffer.o super.o open.o fs.o : $(OBJS) $(LD) -m elf_i386 -r -o $@ $^ @@ -17,6 +17,9 @@ buffer.o : buffer.c super.o : super.c $(GCC) $(CCFLAG) -o $@ $< +open.o : open.c + $(GCC) $(CCFLAG) -o $@ $< + clean : rm *.o diff --git a/fs/open.c b/fs/open.c new file mode 100644 index 0000000000000000000000000000000000000000..538df2200ba8123c8ec0fa5a9a3fb037915d7f94 --- /dev/null +++ b/fs/open.c @@ -0,0 +1,13 @@ +#include +#include + +#include +#include +#include + +#include + +int sys_open(const char * filename,int flag,int mode) { + printk("try to open %s\n", filename); + return 0; +} diff --git a/fs/super.c b/fs/super.c index 10a1a800225da61404faffb82676cc46894e48d7..9874821b82ab8d839b120634eda968917c5358c7 100644 --- a/fs/super.c +++ b/fs/super.c @@ -12,6 +12,8 @@ struct super_block sb; struct super_block * read_super(int dev) { struct super_block * s = &sb; struct buffer_head * bh; + int i,block; + if (!(bh = bread(dev,1))) { printk("read super error!\n"); } @@ -25,9 +27,40 @@ struct super_block * read_super(int dev) { printk("read super error!\n"); return NULL; } - printk("read super successfully!\n"); + for (i=0;is_imap[i] = NULL; + for (i=0;is_zmap[i] = NULL; + block=2; + for (i=0 ; i < s->s_imap_blocks ; i++) { + if ((s->s_imap[i] = bread(dev,block))) + block++; + else + break; + } + for (i=0 ; i < s->s_zmap_blocks ; i++) { + if ((s->s_zmap[i] = bread(dev,block))) + block++; + else + break; + } + + if (block != 2+s->s_imap_blocks+s->s_zmap_blocks) { + for(i=0;is_imap[i]); + for(i=0;is_zmap[i]); + s->s_dev=0; + return NULL; + } + + s->s_imap[0]->b_data[0] |= 1; + s->s_zmap[0]->b_data[0] |= 1; + + printk("read super successfully! %d, %d\n", s->s_imap_blocks, + s->s_zmap_blocks); - return &s; + return s; } void mount_root() { diff --git a/include/fcntl.h b/include/fcntl.h new file mode 100644 index 0000000000000000000000000000000000000000..6dac764beb83bf8979cb01f96ef6473e554144bf --- /dev/null +++ b/include/fcntl.h @@ -0,0 +1,20 @@ +#ifndef _FCNTL_H +#define _FCNTL_H + +#include + +#define O_ACCMODE 00003 +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define O_CREAT 00100 +#define O_EXCL 00200 +#define O_NOCTTY 00400 +#define O_TRUNC 01000 +#define O_APPEND 02000 +#define O_NONBLOCK 04000 +#define O_NDELAY O_NONBLOCK + +extern int open(const char * filename, int flags, ...); + +#endif diff --git a/include/linux/fs.h b/include/linux/fs.h index bdbe6e7e377d979639fb179befa213660732ffd6..0f6b282c0616fe91a647d17d47dab6f55d11da3f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -76,7 +76,7 @@ extern inline void wait_on_buffer(struct buffer_head* bh); extern struct buffer_head * getblk(int dev, int block); extern void ll_rw_block(int rw, struct buffer_head * bh); - +extern void brelse(struct buffer_head * buf); extern struct buffer_head * bread(int dev,int block); extern int ROOT_DEV; diff --git a/include/linux/sys.h b/include/linux/sys.h index 111699df946615043257ece07ce9b54b9fba2e02..ec2fac4e66933b51564c205b1e619c6c46b08698 100644 --- a/include/linux/sys.h +++ b/include/linux/sys.h @@ -3,7 +3,7 @@ extern int sys_setup(); extern int sys_fork(); //extern int sys_read(); extern int sys_write(); -//extern int sys_open(); +extern int sys_open(); //extern int sys_close(); //extern int sys_waitpid(); //extern int sys_creat(); @@ -92,7 +92,7 @@ fn_ptr sys_call_table[] = { sys_fork, 0, /*sys_read,*/ sys_write, -// sys_open, + sys_open, // sys_close, // sys_waitpid, // sys_creat, diff --git a/include/unistd.h b/include/unistd.h index 608c8e11b36d359affb32154386c97af55562b50..2a51b5f4cbad82e6ba67b37488133f831543f4ca 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -138,6 +138,7 @@ __asm__ volatile("int $0x80\n\r"\ extern int errno; int fork(); +int open(const char * filename, int flag, ...); int write(int fildes, const char * buf, off_t count); #endif diff --git a/kernel/blk_drv/floppy.c b/kernel/blk_drv/floppy.c index 2993a0b67ff6f7bc2fa3087f2baa3bc527759e35..076288c534ec1f17757cdecb96381d0ad612adb5 100644 --- a/kernel/blk_drv/floppy.c +++ b/kernel/blk_drv/floppy.c @@ -277,8 +277,8 @@ void floppy_on_interrupt() { } void do_fd_request() { - printk("hinus debug: do_fd_request, reset: %d, recal: %d, current dev:%d\n", - reset, recalibrate, CURRENT->dev); + printk("hinus debug: do_fd_request, reset: %d, recal: %d, request:%d\n", + reset, recalibrate, CURRENT); unsigned int block; seek = 0; diff --git a/kernel/main.c b/kernel/main.c index 43640881f7e43f711f9716e8158156bf15af5c4b..b233fab74871516ba87a09d9dae4bd075fac9e3d 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -1,6 +1,7 @@ #define __LIBRARY__ #include +#include inline _syscall0(int, fork); inline _syscall1(int,setup,void *,BIOS) @@ -98,5 +99,6 @@ int printf(const char* fmt, ...) { void init() { setup((void *) &drive_info); + (void)open("/dev/tty1", O_RDWR, 0); } diff --git a/kernel/sched.c b/kernel/sched.c index 41532999e6659c39abebd534d8d5a7dab5d8765b..b40182146ad3f5ab634bfa319d1c05ab54fe1096 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -140,6 +140,28 @@ int ticks_to_floppy_on(unsigned int nr) { } void floppy_off(unsigned int nr) { + moff_timer[nr]=3*HZ; +} + +void do_floppy_timer() { + int i; + unsigned char mask = 0x10; + + for (i=0 ; i<4 ; i++,mask <<= 1) { + if (!(mask & current_DOR)) + continue; + if (mon_timer[i]) { + if (!--mon_timer[i]) + wake_up(i+wait_motor); + } + else if (!moff_timer[i]) { + current_DOR &= ~mask; + outb(current_DOR,FD_DOR); + } + else { + moff_timer[i]--; + } + } } #define TIME_REQUESTS 64 @@ -200,6 +222,9 @@ void do_timer(long cpl) { } } + if (current_DOR & 0xf0) + do_floppy_timer(); + if ((--current->counter)>0) return; current->counter=0; if (!cpl) return; diff --git a/lib/Makefile b/lib/Makefile index 3abdaa7fdb61a236506b7cb3ad7f400cd0ca6a44..9b97393dac9ff5541fe7817fedc7c7a4a604a484 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -2,7 +2,7 @@ AR := ar LD := ld GCC := gcc CCFLAG := -m32 -I../include -nostdinc -ffreestanding -fno-pic -Wall -fomit-frame-pointer -fno-stack-protector -c -OBJS := ctype.o write.o string.o +OBJS := ctype.o write.o string.o open.o lib.a : $(OBJS) $(AR) rcs $@ $^ @@ -17,6 +17,9 @@ write.o : write.c string.o : string.c $(GCC) $(CCFLAG) -o $@ $< +open.o : open.c + $(GCC) $(CCFLAG) -o $@ $< + clean : rm *.o rm lib.a diff --git a/lib/open.c b/lib/open.c new file mode 100644 index 0000000000000000000000000000000000000000..a4c77ac451e39ead717fab011d08f833613ac798 --- /dev/null +++ b/lib/open.c @@ -0,0 +1,19 @@ +#define __LIBRARY__ +#include +#include + +int open(const char * filename, int flag, ...) { + register int res; + va_list arg; + + va_start(arg,flag); + __asm__("int $0x80" + :"=a" (res) + :"a" (__NR_open),"b" (filename),"c" (flag), + "d" (va_arg(arg,int))); + + if (res >= 0) + return res; + errno = -res; + return -1; +}