diff --git a/Makefile b/Makefile index cfde113d..17238c7a 100644 --- a/Makefile +++ b/Makefile @@ -44,5 +44,8 @@ sysdisk.iso: $(ISO) $(INITRD) test: $(KERNEL) sysdisk.iso qemu-system-x86_64 -monitor stdio -cdrom sysdisk.iso -d int -no-reboot -no-shutdown -m 8G -smp cpus=6 +kvm: $(KERNEL) sysdisk.iso + qemu-system-x86_64 -monitor stdio -cdrom sysdisk.iso -no-reboot -no-shutdown -m 8G -smp cpus=6 -enable-kvm + clean: rm $(call rwildcard,src,*.o) $(KERNELDEPS) diff --git a/initrd/sbin/init b/initrd/sbin/init index 85da7109..903dd33e 100755 Binary files a/initrd/sbin/init and b/initrd/sbin/init differ diff --git a/src/arch/x86_64/syscall.asm b/src/arch/x86_64/syscall.asm index 995f38c7..602f2031 100644 --- a/src/arch/x86_64/syscall.asm +++ b/src/arch/x86_64/syscall.asm @@ -11,7 +11,8 @@ extern syscall_lseek extern syscall_close extern syscall_isatty extern syscall_write -func_count equ 10 +extern syscall_stat +func_count equ 11 func_table: @@ -25,6 +26,7 @@ func_table: dq syscall_close dq syscall_isatty dq syscall_write + dq syscall_stat section .text global asm_syscall_entry diff --git a/src/include/sys/stat.h b/src/include/sys/stat.h index 0335bfe3..f6385a66 100644 --- a/src/include/sys/stat.h +++ b/src/include/sys/stat.h @@ -15,18 +15,30 @@ #define GETTYPE(m) ((m >> 12) & 0xF) #define MAKETYPE(m) ((m & 0xF) << 12) +typedef long time_t; + +struct timespec { + time_t tv_sec; + long tv_nsec; +}; + + typedef struct { - dev_t st_dev; - ino_t st_ino; - mode_t st_mode; - nlink_t st_nlink; - uid_t st_uid; - gid_t st_gid; - dev_t st_rdev; - off_t st_size; - - blksize_t st_blksize; - blkcnt_t st_blocks; + dev_t st_dev; + ino_t st_ino; + nlink_t st_nlink; + mode_t st_mode; + uid_t st_uid; + gid_t st_gid; + unsigned int __pad0; + dev_t st_rdev; + off_t st_size; + blksize_t st_blksize; + blkcnt_t st_blocks; + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; + long __unused[3]; } stat; #endif diff --git a/src/include/sys/types.h b/src/include/sys/types.h index 75bbe745..b7fb1652 100644 --- a/src/include/sys/types.h +++ b/src/include/sys/types.h @@ -8,14 +8,14 @@ typedef signed long ssize_t; typedef size_t blkcnt_t; typedef size_t blksize_t; typedef int id_t; -typedef id_t dev_t; +typedef long dev_t; typedef id_t gid_t; typedef id_t pid_t; typedef id_t uid_t; -typedef id_t tid_t; +typedef pid_t tid_t; typedef size_t ino_t; typedef int mode_t; -typedef int dev_t; +typedef long dev_t; typedef ssize_t off_t; typedef size_t nlink_t; diff --git a/src/sys/mm/alloc.c b/src/sys/mm/alloc.c index 3a1c40c6..81fe584f 100644 --- a/src/sys/mm/alloc.c +++ b/src/sys/mm/alloc.c @@ -11,7 +11,7 @@ void* alloc(size_t size){ } void free(void* addr){ - if(pageallocator_free(addr)) + if(!pageallocator_free(addr)) slab_free(addr); } diff --git a/src/sys/mm/slab.c b/src/sys/mm/slab.c index d6920c85..704891c6 100644 --- a/src/sys/mm/slab.c +++ b/src/sys/mm/slab.c @@ -56,7 +56,8 @@ size_t slab_getentrysize(void* addr){ } static void free(void* addr){ - + if(addr == 0) + return; // align down to page size slab_t *slab = (size_t)addr & ~(0xFFF); diff --git a/src/sys/sched/elf.c b/src/sys/sched/elf.c index a82b19a2..4f9a06bc 100644 --- a/src/sys/sched/elf.c +++ b/src/sys/sched/elf.c @@ -71,12 +71,6 @@ static void* stacksetup(char* interp, char** argv, char** env, elf_header64 head ++envc; } - if(interp){ - argdatasize += strlen(interp) + 1; - initialsize += strlen(interp) + 1; - initialsize += sizeof(char*); // interpreter ptr - } - // pointers to args and envs initialsize += argc*sizeof(char*); //args @@ -97,8 +91,6 @@ static void* stacksetup(char* interp, char** argv, char** env, elf_header64 head // count + 1 because of a null entry char** envstart = (void*)auxvstart - (envc + 1)*sizeof(char*); char** argstart = (void*)envstart - (argc + 1)*sizeof(char*); - if(interp) - --argstart; size_t* argcptr = (void*)argstart - sizeof(size_t); @@ -136,12 +128,6 @@ static void* stacksetup(char* interp, char** argv, char** env, elf_header64 head // copy the data - if(interp){ - strcpy(argdatastart, interp); - *argstart++ = argdatastart; - argdatastart += strlen(interp) + 1; - } - for(size_t i = 0; i < argc; ++i){ strcpy(argdatastart, argv[i]); *argstart++ = argdatastart; @@ -158,9 +144,6 @@ static void* stacksetup(char* interp, char** argv, char** env, elf_header64 head *envstart = NULL; - if(interp) - argc++; - *argcptr = argc; diff --git a/src/sys/sched/scheduler.c b/src/sys/sched/scheduler.c index 1009e559..ee444730 100644 --- a/src/sys/sched/scheduler.c +++ b/src/sys/sched/scheduler.c @@ -72,12 +72,8 @@ static thread_t* allocthread(proc_t* proc, state_t state, pid_t tid, size_t ksta return NULL; } - - // XXX use alloc() when it's better - size_t pagec = kstacksize / PAGE_SIZE + 1; - - thread->kernelstackbase = pmm_hhdmalloc(pagec); + thread->kernelstackbase = alloc(kstacksize); if(!thread->kernelstackbase){ @@ -98,8 +94,7 @@ static thread_t* allocthread(proc_t* proc, state_t state, pid_t tid, size_t ksta static thread_t* freethread(thread_t* thread){ free(thread->regs); - // XXX use free() when it's better - pmm_free(thread->kernelstackbase, thread->stacksize / PAGE_SIZE + 1); + free(thread->kernelstack); free(thread); } @@ -330,7 +325,7 @@ void sched_runinit(){ _panic("Could not load init", 0); } - char* argv[] = {"/sbin/init", NULL}; + char* argv[] = {"/usr/bin/bash", NULL}; char* env[] = {NULL}; ret = elf_load(thread, node, argv, env); diff --git a/src/sys/syscalls/close.c b/src/sys/syscalls/close.c index 330d5149..efb66176 100644 --- a/src/sys/syscalls/close.c +++ b/src/sys/syscalls/close.c @@ -5,7 +5,6 @@ #include syscallret syscall_close(int ifd){ - syscallret retv; retv.ret = -1; diff --git a/src/sys/syscalls/open.c b/src/sys/syscalls/open.c index 10b747a4..4ce3710e 100644 --- a/src/sys/syscalls/open.c +++ b/src/sys/syscalls/open.c @@ -69,7 +69,7 @@ syscallret syscall_open(const char* pathname, int flags, mode_t mode){ fd->flags = flags + 1; // 1 is added to make O_RDONLY etc easier to lookup fd->offset = 0; - vnode_t* file; + vnode_t* file = NULL; size_t ret = vfs_open(&file, *name == '/' ? proc->root : proc->cwd, diff --git a/src/sys/syscalls/read.c b/src/sys/syscalls/read.c index 15600d67..52a02e76 100644 --- a/src/sys/syscalls/read.c +++ b/src/sys/syscalls/read.c @@ -57,6 +57,8 @@ syscallret syscall_read(int ifd, void* buff, size_t count){ retv.errno = 0; retv.ret = readc; + + free(kbuff); return retv; } diff --git a/src/sys/syscalls/stat.c b/src/sys/syscalls/stat.c new file mode 100644 index 00000000..278b65b2 --- /dev/null +++ b/src/sys/syscalls/stat.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +syscallret syscall_stat(const char* path, stat* st){ + + syscallret retv; + retv.ret = -1; + + if(st > USER_SPACE_END){ + retv.errno = EFAULT; + return retv; + } + + char* kpath = alloc(strlen(path)); // XXX use proper user strlen func + + if(!path){ + retv.errno = ENOMEM; + return retv; + } + + strcpy(kpath, path); // XXX use user strcpy func + + vnode_t* file; + + proc_t* proc = arch_getcls()->thread->proc; + + int ret = vfs_open(&file, *kpath == '/' ? proc->root : proc->cwd, kpath); + + if(ret){ + retv.errno = ret; + goto _ret; + } + + stat stbuff = file->st; + + vfs_close(file); + + memcpy(st, &stbuff, sizeof(stat)); // XXX use user memcpy + + _ret: + free(kpath); + return retv; + +}