diff --git a/fs/namei.c b/fs/namei.c index 8d4976b6a75f003c79ddc1e56c2340d085a47d7b..56070801eac1b721ec45326359df9bb8aaaff0fb 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -367,6 +367,10 @@ struct m_inode * _namei(const char * pathname, struct m_inode * base, return inode; } +struct m_inode * lnamei(const char * pathname) { + return _namei(pathname, NULL, 0); +} + struct m_inode * namei(const char * pathname) { return _namei(pathname,NULL,1); } diff --git a/fs/stat.c b/fs/stat.c index 8e8dda7a244c8fdf1c8e52831f4a50068deff1d3..6c56e960a744148514a230c49b9a5ad13ef09ebb 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -38,6 +38,16 @@ int sys_stat(char * filename, struct stat * statbuf) { return 0; } +int sys_lstat(char * filename, struct stat * statbuf) { + struct m_inode * inode; + if (!(inode = lnamei(filename))) + return -ENOENT; + + cp_stat(inode,statbuf); + iput(inode); + return 0; +} + int sys_fstat(unsigned int fd, struct stat * statbuf) { struct file * f; struct m_inode * inode; diff --git a/include/linux/fs.h b/include/linux/fs.h index 888b4793acabd51812ce2d5ef87f0d4841bb3777..dd03db45f26b17fde4e90d5887c506a2a37fc3f4 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -160,6 +160,7 @@ extern struct buffer_head * bread(int dev,int block); extern void bread_page(unsigned long addr,int dev,int b[4]); extern struct m_inode * namei(const char * pathname); +extern struct m_inode * lnamei(const char * pathname); extern int open_namei(const char * pathname, int flag, int mode, struct m_inode ** res_inode); diff --git a/include/linux/sched.h b/include/linux/sched.h index 212396e559c5610ad168139628f57fa33179a55f..5e3529293159618cc9ba6bb444374469a8b1d108 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -7,6 +7,9 @@ #define TASK_SIZE 0x04000000 #define LIBRARY_SIZE 0x00400000 +#define CT_TO_SECS(x) ((x) / HZ) +#define CT_TO_USECS(x) (((x) % HZ) * 1000000/HZ) + #if (TASK_SIZE & 0x3fffff) #error "TASK_SIZE must be multiple of 4M" #endif diff --git a/include/linux/sys.h b/include/linux/sys.h index 4f5addf6dc5bda77657df765cab842247f7b2f42..b5b5dcce477e0737697dc57d957cc5ae33a80470 100644 --- a/include/linux/sys.h +++ b/include/linux/sys.h @@ -76,13 +76,13 @@ extern int sys_sigaction(); //extern int sys_setrlimit(); //extern int sys_getrlimit(); //extern int sys_getrusage(); -//extern int sys_gettimeofday(); +extern int sys_gettimeofday(); //extern int sys_settimeofday(); //extern int sys_getgroups(); //extern int sys_setgroups(); //extern int sys_select(); //extern int sys_symlink(); -//extern int sys_lstat(); +extern int sys_lstat(); //extern int sys_readlink(); //extern int sys_uselib(); @@ -166,7 +166,7 @@ fn_ptr sys_call_table[] = { sys_sigaction, 0, // sys_sgetmask, 0, // sys_ssetmask, - 0, // + 0, // sys_setreuid, 0, // sys_setregid, 0, // sys_sigsuspend, @@ -175,13 +175,13 @@ fn_ptr sys_call_table[] = { 0, // sys_setrlimit, 0, // sys_getrlimit, 0, // sys_getrusage, - 0, // sys_gettimeofday, + sys_gettimeofday, 0, // sys_settimeofday, 0, // sys_getgroups, 0, // sys_setgroups, 0, // sys_select, 0, // sys_symlink, - 0, // sys_lstat, + sys_lstat, 0, // sys_readlink, 0, // sys_uselib }; diff --git a/include/sys/time.h b/include/sys/time.h index c49f6b7eb791c30bcb0fa4ff0f97e44e7a302788..df9a1610da7189eec803bb4e4c0b8c4c461812f8 100644 --- a/include/sys/time.h +++ b/include/sys/time.h @@ -11,6 +11,8 @@ struct timezone { int tz_dsttime; }; +int gettimeofday(struct timeval * tp, struct timezone * tz); + #include #endif diff --git a/include/unistd.h b/include/unistd.h index 3cfeafa704788e46c199831eae117dfeb8132356..de156418f1ff74661643d840e57311b671ff55f6 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -161,6 +161,7 @@ int execve(const char * filename, char ** argv, char ** envp); int fcntl(int fildes, int cmd, ...); int fork(); int fstat(); +int gettimeofday(struct timeval *tv, struct timezone *tz); int setup(void *BIOS); int sync(); int open(const char * filename, int flag, ...); diff --git a/kernel/Makefile b/kernel/Makefile index 831109424ccb8ba15b6e19664079fe85d7474bd2..bd35202dc2f2cf9ab69e93a62870ec08f56ec938 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -1,5 +1,5 @@ GCC := gcc -USE_DEBUG := +USE_DEBUG := -DDEBUG=2 CCFLAG := -I../include -nostdinc -ffreestanding -Wall -fomit-frame-pointer -fno-pic -fno-stack-protector -c -m32 $(USE_DEBUG) LDFLAG := -Ttext 0x0 -s --oformat binary -m elf_i386 INCDIR := ../include diff --git a/kernel/printk.c b/kernel/printk.c index 8b247b77505ae4cd9bb57bf4377835c81b6ed8e7..17ddc4dcb128cdb9e8df4f3bcc2e411a946b711b 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -29,3 +29,14 @@ int printk(const char* fmt, ...) { return i; } +void print_sys(int index) { + int i; + int filter[] = {3, 4, 5, 6, 18, 29, 45, 48, 54}; + + for (i = 0; i < sizeof(filter) / sizeof(int); i++) { + if (index == filter[i]) + return; + } + printk("sys call %d\n", index); +} + diff --git a/kernel/sys.c b/kernel/sys.c index 585569cd804b3c548d33a446d08bf03075d338a0..09e448013df29622a4b3a017bd2b02ae621e6ed1 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -5,9 +5,12 @@ #include #include #include +#include #include #include +struct timezone sys_tz = { 0, 0}; + int sys_ftime() { return -ENOSYS; } @@ -106,6 +109,23 @@ int sys_time(long * tloc) { return i; } +int sys_gettimeofday(struct timeval *tv, struct timezone *tz) { + if (tv) { + verify_area(tv, sizeof *tv); + put_fs_long(startup_time + CT_TO_SECS(jiffies), + (unsigned long *) tv); + put_fs_long(CT_TO_USECS(jiffies), + ((unsigned long *) tv)+1); + } + + if (tz) { + verify_area(tz, sizeof *tz); + put_fs_long(sys_tz.tz_minuteswest, (unsigned long *) tz); + put_fs_long(sys_tz.tz_dsttime, ((unsigned long *) tz)+1); + } + return 0; +} + int sys_ulimit() { return -ENOSYS; } diff --git a/kernel/sys_call.S b/kernel/sys_call.S index c7506ba59e7d63fa293586002de03117553d4ede..9cea29664a2832046acf3f13920cd3b8ff78962e 100644 --- a/kernel/sys_call.S +++ b/kernel/sys_call.S @@ -33,9 +33,6 @@ sa_restorer = 12 int_msg: .asciz "In kernel interrupt\n\r" -show_ind: - .asciz "sys call %d\n\r" - .align 4 reschedule: pushl $ret_from_sys_call @@ -59,9 +56,7 @@ system_call: #ifdef DEBUG #if DEBUG > 1 pushl %eax - pushl $show_ind - call printk - popl %eax + call print_sys popl %eax #endif #endif