From 79965fa0ba8af9d36d209f96171a451d60601f2c Mon Sep 17 00:00:00 2001 From: hinus Date: Tue, 17 Aug 2021 11:18:54 +0800 Subject: [PATCH] Title: System call lstat and gettimeofday Issue: https://gitee.com/hinus/linux_kernel_011/issues/I45Y4A Description: System call lstat and gettimeofday. LTT: ll --- fs/namei.c | 4 ++++ fs/stat.c | 10 ++++++++++ include/linux/fs.h | 1 + include/linux/sched.h | 3 +++ include/linux/sys.h | 10 +++++----- include/sys/time.h | 2 ++ include/unistd.h | 1 + kernel/Makefile | 2 +- kernel/printk.c | 11 +++++++++++ kernel/sys.c | 20 ++++++++++++++++++++ kernel/sys_call.S | 7 +------ 11 files changed, 59 insertions(+), 12 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 8d4976b..5607080 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 8e8dda7..6c56e96 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 888b479..dd03db4 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 212396e..5e35292 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 4f5addf..b5b5dcc 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 c49f6b7..df9a161 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 3cfeafa..de15641 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 8311094..bd35202 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 8b247b7..17ddc4d 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 585569c..09e4480 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 c7506ba..9cea296 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 -- Gitee