diff --git a/sys/armv6/sched.c b/sys/armv6/sched.c index 476d1f9..5f6ffc6 100644 --- a/sys/armv6/sched.c +++ b/sys/armv6/sched.c @@ -36,10 +36,10 @@ #include #include #include -#include #include #include #include +#include #include diff --git a/sys/fs/vfs/stat.c b/sys/fs/vfs/stat.c index 76f2c37..d60192b 100644 --- a/sys/fs/vfs/stat.c +++ b/sys/fs/vfs/stat.c @@ -30,8 +30,8 @@ #include #include #include -#include #include +#include int sys_stat(char *path, struct stat *sb, int flags) { int error = 0; diff --git a/sys/fs/vfs/vfs.c b/sys/fs/vfs/vfs.c index 8fc62e4..dec38e7 100644 --- a/sys/fs/vfs/vfs.c +++ b/sys/fs/vfs/vfs.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include /************************************************************************ @@ -92,7 +92,7 @@ struct fileSystem *tmpFs = 0x0; if (vfsFindFS(newFS.vfsType) != 0x0) { - kprintf("FS Is already Registered\n"); + kprintf("FS Is already Registered\n"); return(0x1); } @@ -106,7 +106,7 @@ /* Set Up FS Defaults */ -/* 2004 7-16-2004 mji +/* 2004 7-16-2004 mji * Old method: * tmpFs->vfsType = newFS.vfsType; * tmpFs->vfsInitFS = newFS.vfsInitFS; @@ -120,7 +120,7 @@ */ /* new method: */ - memcpy(tmpFs, &newFS, sizeof(struct fileSystem)); + memcpy(tmpFs, &newFS, sizeof(struct fileSystem)); if (!systemVitals->fileSystems) { tmpFs->prev = 0x0; tmpFs->next = 0x0; @@ -136,34 +136,7 @@ return(0x0); } -/*! - * \brief entry point for open syscall - * - * \param *td pointer to callers thread - * \param *uap pointer to user space arguements for call - * - * \return index to file descriptor - */ -int sys_open(struct thread *td, struct sys_open_args *args) { - int error = 0x0; - int index = 0x0; - struct file *nfp = 0x0; - error = falloc(td,&nfp,&index); - - if (error) - return(error); - - strcpy(nfp->path, args->path); - - nfp->fd = fopen(args->path,"r"); - if (nfp->fd == 0x0) - td->td_retval[0] = -1; - else - td->td_retval[0] = nfp->fd;//MrOlsen 2018index; - - return (error); - } int sys_openat(struct thread *td, struct sys_openat_args *args) { int error = 0x0; diff --git a/sys/i386/i386_exec.c b/sys/i386/i386_exec.c index 65120c3..d5fbe72 100644 --- a/sys/i386/i386_exec.c +++ b/sys/i386/i386_exec.c @@ -39,7 +39,7 @@ #include #include #include -#include +#include #define ENVP_PAGE 0x100 #define ARGV_PAGE 0x100 diff --git a/sys/i386/sched.c b/sys/i386/sched.c index a79d522..dbcfaf6 100644 --- a/sys/i386/sched.c +++ b/sys/i386/sched.c @@ -37,10 +37,10 @@ #include #include #include -#include #include #include #include +#include #include diff --git a/sys/include/sys/descrip.h b/sys/include/sys/descrip.h new file mode 100644 index 0000000..4718d61 --- /dev/null +++ b/sys/include/sys/descrip.h @@ -0,0 +1,179 @@ +/*- + * Copyright (c) 2002-2018 The UbixOS Project. + * All rights reserved. + * + * This was developed by Christopher W. Olsen for the UbixOS Project. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1) Redistributions of source code must retain the above copyright notice, this list of + * conditions, the following disclaimer and the list of authors. + * 2) Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions, the following disclaimer and the list of authors in the documentation and/or + * other materials provided with the distribution. + * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to + * endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _KERN_DESCRIP_H +#define _KERN_DESCRIP_H + +#include +#include + +#include +#include + +/* Limits */ +#define MAX_FILES 256 + +typedef __mode_t mode_t; +typedef __nlink_t nlink_t; + +/* command values */ +#define F_DUPFD 0 /* duplicate file descriptor */ +#define F_GETFD 1 /* get file descriptor flags */ +#define F_SETFD 2 /* set file descriptor flags */ +#define F_GETFL 3 /* get file status flags */ +#define F_SETFL 4 /* set file status flags */ +#define F_GETOWN 5 /* get SIGIO/SIGURG proc/pgrp */ +#define F_SETOWN 6 /* set SIGIO/SIGURG proc/pgrp */ +#define F_GETLK 7 /* get record locking information */ +#define F_SETLK 8 /* set record locking information */ +#define F_SETLKW 9 /* F_SETLK; wait if blocked */ + +/* Flag Values */ +#define FREAD 0x0001 +#define FWRITE 0x0002 +#define O_NONBLOCK 0x0004 /* no delay */ +#define O_APPEND 0x0008 /* set append mode */ +#define O_SHLOCK 0x0010 /* open with shared file lock */ +#define O_EXLOCK 0x0020 /* open with exclusive file lock */ +#define O_ASYNC 0x0040 /* signal pgrp when data ready */ +#define O_FSYNC 0x0080 /* synchronous writes */ +#define O_SYNC 0x0080 /* POSIX synonym for O_FSYNC */ +#define O_NOFOLLOW 0x0100 /* don't follow symlinks */ +#define O_CREAT 0x0200 /* create if nonexistent */ +#define O_TRUNC 0x0400 /* truncate to zero length */ +#define O_EXCL 0x0800 /* error if already exists */ +#define O_DIRECT 0x00010000 +#define O_RDONLY 0x0000 /* open for reading only */ +#define O_WRONLY 0x0001 /* open for writing only */ +#define O_RDWR 0x0002 /* open for reading and writing */ +#define O_ACCMODE 0x0003 /* mask for above modes */ + +#define FHASLOCK 0x4000 /* descriptor holds advisory lock */ + +/* F MAPPERS */ +#define FAPPEND O_APPEND /* kernel/compat */ +#define FASYNC O_ASYNC /* kernel/compat */ +#define FFSYNC O_FSYNC /* kernel */ +#define FNONBLOCK O_NONBLOCK /* kernel */ +#define FNDELAY O_NONBLOCK /* compat */ +#define O_NDELAY O_NONBLOCK /* compat */ +#define FPOSIXSHM O_NOFOLLOW + +#define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FPOSIXSHM|O_DIRECT) + +#define FFLAGS(oflags) ((oflags) + 1) +#define OFLAGS(fflags) ((fflags) - 1) + +/* Function Protos */ +typedef int fo_rdwr_t(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td); +typedef int fo_stat_t(struct file *fp, struct stat *sb, struct ucred *active_cred, struct thread *td); +typedef int fo_close_t(struct file *fp, struct thread *td); + +struct fileOps; + +struct file { + uint32_t f_flag; + uint16_t f_type; + struct fileOps *f_ops; + fileDescriptor *fd; +}; + +struct fileOps { + fo_rdwr_t *read; + fo_rdwr_t *write; + fo_stat_t *stat; + fo_close_t *close; +}; + +#ifdef _BALLS +/* TEMP */ +struct __timespec { + __time_t tv_sec; /* seconds */ + long tv_nsec; /* and nanoseconds */ +}; + +struct stat { + __dev_t st_dev; /* inode's device */ + ino_t st_ino; /* inode's number */ + mode_t st_mode; /* inode protection mode */ + nlink_t st_nlink; /* number of hard links */ + uid_t st_uid; /* user ID of the file's owner */ + gid_t st_gid; /* group ID of the file's group */ + __dev_t st_rdev; /* device type */ +#if __BSD_VISIBLE + struct timespec st_atimespec; /* time of last access */ + struct timespec st_mtimespec; /* time of last data modification */ + struct timespec st_ctimespec; /* time of last file status change */ +#else + time_t st_atime; /* time of last access */ + long __st_atimensec; /* nsec of last access */ + time_t st_mtime; /* time of last data modification */ + long __st_mtimensec; /* nsec of last data modification */ + time_t st_ctime; /* time of last file status change */ + long __st_ctimensec; /* nsec of last file status change */ +#endif + off_t st_size; /* file size, in bytes */ + blkcnt_t st_blocks; /* blocks allocated for file */ + blksize_t st_blksize; /* optimal blocksize for I/O */ + fflags_t st_flags; /* user defined flags for file */ + __uint32_t st_gen; /* file generation number */ + __int32_t st_lspare; +#if __BSD_VISIBLE + struct timespec st_birthtimespec; /* time of file creation */ + /* + * Explicitly pad st_birthtimespec to 16 bytes so that the size of + * struct stat is backwards compatible. We use bitfields instead + * of an array of chars so that this doesn't require a C99 compiler + * to compile if the size of the padding is 0. We use 2 bitfields + * to cover up to 64 bits on 32-bit machines. We assume that + * CHAR_BIT is 8... + */ + unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); + unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); +#else + time_t st_birthtime; /* time of file creation */ + long st_birthtimensec; /* nsec of file creation */ + unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); + unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); +#endif +}; +#endif + +int fcntl(struct thread *, struct fcntl_args *); +int close(struct thread *, struct close_args *); +int falloc(struct thread *, struct file **, int *); +int getdtablesize(struct thread *, struct getdtablesize_args *); +int fstat(struct thread *, struct sys_fstat_args *); +int ioctl(struct thread *, struct ioctl_args *); +int getfd(struct thread *td, struct file **fp, int fd); + +#endif + +/*** + END + ***/ diff --git a/sys/include/sys/kern_descrip.h b/sys/include/sys/kern_descrip.h deleted file mode 100644 index 86d607c..0000000 --- a/sys/include/sys/kern_descrip.h +++ /dev/null @@ -1,161 +0,0 @@ -/*- - * Copyright (c) 2002-2018 The UbixOS Project. - * All rights reserved. - * - * This was developed by Christopher W. Olsen for the UbixOS Project. - * - * Redistribution and use in source and binary forms, with or without modification, are permitted - * provided that the following conditions are met: - * - * 1) Redistributions of source code must retain the above copyright notice, this list of - * conditions, the following disclaimer and the list of authors. - * 2) Redistributions in binary form must reproduce the above copyright notice, this list of - * conditions, the following disclaimer and the list of authors in the documentation and/or - * other materials provided with the distribution. - * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to - * endorse or promote products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _KERN_DESCRIP_H -#define _KERN_DESCRIP_H - -#include -#include - -#include -#include - -typedef __mode_t mode_t; -typedef __nlink_t nlink_t; - -/* command values */ -#define F_DUPFD 0 /* duplicate file descriptor */ -#define F_GETFD 1 /* get file descriptor flags */ -#define F_SETFD 2 /* set file descriptor flags */ -#define F_GETFL 3 /* get file status flags */ -#define F_SETFL 4 /* set file status flags */ -#define F_GETOWN 5 /* get SIGIO/SIGURG proc/pgrp */ -#define F_SETOWN 6 /* set SIGIO/SIGURG proc/pgrp */ -#define F_GETLK 7 /* get record locking information */ -#define F_SETLK 8 /* set record locking information */ -#define F_SETLKW 9 /* F_SETLK; wait if blocked */ - -/* Flag Values */ -#define FREAD 0x0001 -#define FWRITE 0x0002 -#define O_NONBLOCK 0x0004 /* no delay */ -#define O_APPEND 0x0008 /* set append mode */ -#define O_SHLOCK 0x0010 /* open with shared file lock */ -#define O_EXLOCK 0x0020 /* open with exclusive file lock */ -#define O_ASYNC 0x0040 /* signal pgrp when data ready */ -#define O_FSYNC 0x0080 /* synchronous writes */ -#define O_SYNC 0x0080 /* POSIX synonym for O_FSYNC */ -#define O_NOFOLLOW 0x0100 /* don't follow symlinks */ -#define O_CREAT 0x0200 /* create if nonexistent */ -#define O_TRUNC 0x0400 /* truncate to zero length */ -#define O_EXCL 0x0800 /* error if already exists */ -#define O_DIRECT 0x00010000 -#define O_RDONLY 0x0000 /* open for reading only */ -#define O_WRONLY 0x0001 /* open for writing only */ -#define O_RDWR 0x0002 /* open for reading and writing */ -#define O_ACCMODE 0x0003 /* mask for above modes */ - -#define FHASLOCK 0x4000 /* descriptor holds advisory lock */ - -/* F MAPPERS */ -#define FAPPEND O_APPEND /* kernel/compat */ -#define FASYNC O_ASYNC /* kernel/compat */ -#define FFSYNC O_FSYNC /* kernel */ -#define FNONBLOCK O_NONBLOCK /* kernel */ -#define FNDELAY O_NONBLOCK /* compat */ -#define O_NDELAY O_NONBLOCK /* compat */ -#define FPOSIXSHM O_NOFOLLOW - -#define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FPOSIXSHM|O_DIRECT) - -#define FFLAGS(oflags) ((oflags) + 1) -#define OFLAGS(fflags) ((fflags) - 1) - -struct file { - int f_flag; - char path[1024]; - fileDescriptor *fd; -}; - -#ifdef _BALLS -/* TEMP */ -struct __timespec { - __time_t tv_sec; /* seconds */ - long tv_nsec; /* and nanoseconds */ -}; - -struct stat { - __dev_t st_dev; /* inode's device */ - ino_t st_ino; /* inode's number */ - mode_t st_mode; /* inode protection mode */ - nlink_t st_nlink; /* number of hard links */ - uid_t st_uid; /* user ID of the file's owner */ - gid_t st_gid; /* group ID of the file's group */ - __dev_t st_rdev; /* device type */ -#if __BSD_VISIBLE - struct timespec st_atimespec; /* time of last access */ - struct timespec st_mtimespec; /* time of last data modification */ - struct timespec st_ctimespec; /* time of last file status change */ -#else - time_t st_atime; /* time of last access */ - long __st_atimensec; /* nsec of last access */ - time_t st_mtime; /* time of last data modification */ - long __st_mtimensec; /* nsec of last data modification */ - time_t st_ctime; /* time of last file status change */ - long __st_ctimensec; /* nsec of last file status change */ -#endif - off_t st_size; /* file size, in bytes */ - blkcnt_t st_blocks; /* blocks allocated for file */ - blksize_t st_blksize; /* optimal blocksize for I/O */ - fflags_t st_flags; /* user defined flags for file */ - __uint32_t st_gen; /* file generation number */ - __int32_t st_lspare; -#if __BSD_VISIBLE - struct timespec st_birthtimespec; /* time of file creation */ - /* - * Explicitly pad st_birthtimespec to 16 bytes so that the size of - * struct stat is backwards compatible. We use bitfields instead - * of an array of chars so that this doesn't require a C99 compiler - * to compile if the size of the padding is 0. We use 2 bitfields - * to cover up to 64 bits on 32-bit machines. We assume that - * CHAR_BIT is 8... - */ - unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); - unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); -#else - time_t st_birthtime; /* time of file creation */ - long st_birthtimensec; /* nsec of file creation */ - unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); - unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); -#endif -}; -#endif - -int fcntl(struct thread *, struct fcntl_args *); -int close(struct thread *, struct close_args *); -int falloc(struct thread *, struct file **, int *); -int getdtablesize(struct thread *, struct getdtablesize_args *); -int fstat(struct thread *, struct sys_fstat_args *); -int ioctl(struct thread *, struct ioctl_args *); -int getfd(struct thread *td, struct file **fp, int fd); - -#endif - -/*** - END - ***/ diff --git a/sys/include/ubixos/vitals.h b/sys/include/ubixos/vitals.h index 33dd1c7..34d2954 100644 --- a/sys/include/ubixos/vitals.h +++ b/sys/include/ubixos/vitals.h @@ -26,36 +26,33 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _VITALS_H -#define _VITALS_H +#ifndef _UBIXOS_VITALS_H +#define _UBIXOS_VITALS_H -//#include -#include -//#include +#include +#include #include typedef struct vitalsStruct { - uInt32 openFiles; - uInt32 sysTicks; - uInt32 sysUptime; - uInt32 quantum; - uInt32 dQuantum; - uInt32 freePages; - struct fileSystem *fileSystems; - struct vfs_mountPoint *mountPoints; - uInt32 timeStart; - void *screen; - void *font; - char *packet; - uInt32 packetLength; - } vitalsNode; + uint32_t openFiles; + uint32_t lastFD; + uint32_t sysTicks; + uint32_t sysUptime; + uint32_t quantum; + uint32_t dQuantum; + uint32_t freePages; + struct fileSystem *fileSystems; + struct vfs_mountPoint *mountPoints; + uint32_t timeStart; + void *screen; + void *font; + char *packet; + uint32_t packetLength; +} vitalsNode; extern vitalsNode *systemVitals; +extern spinLock_t vitals_lock; int vitals_init(); #endif - -/*** - END - ***/ diff --git a/sys/include/vfs/file.h b/sys/include/vfs/file.h index a19db24..47af809 100644 --- a/sys/include/vfs/file.h +++ b/sys/include/vfs/file.h @@ -57,9 +57,9 @@ char secbuf[DEV_BSIZE]; /* for MBR/disklabel */ }; -typedef struct fileDescriptorStruct { - struct fileDescriptorStruct *prev; - struct fileDescriptorStruct *next; +typedef struct fileDescriptor { + //struct fileDescriptorStruct *prev; + //struct fileDescriptorStruct *next; struct vfs_mountPoint *mp; uint32_t ino; uint16_t status; @@ -76,17 +76,18 @@ int dsk_meta; uint32_t resid; struct inode inode; -} fileDescriptor; + uint32_t size; //Temp for sys_fopen once thats gone i can remove +} fileDescriptor_t; typedef struct userFileDescriptorStruct { - struct fileDescriptorStruct *fd; + struct fileDescriptor *fd; uint32_t fdSize; } userFileDescriptor; -extern fileDescriptor *fdTable; +extern fileDescriptor_t *fdTable; -fileDescriptor *fopen(const char *, const char *); -int fclose(fileDescriptor *); +fileDescriptor_t *fopen(const char *, const char *); +int fclose(fileDescriptor_t *); /* UBU */ struct sys_fwrite_args { @@ -97,11 +98,11 @@ }; int unlink(const char *path); -int feof(fileDescriptor *fd); -int fgetc(fileDescriptor *fd); -size_t fread(void *ptr, size_t size, size_t nmemb, fileDescriptor *fd); -size_t fwrite(void *ptr, int size, int nmemb, fileDescriptor *fd); -int fseek(fileDescriptor *, long, int); +int feof(fileDescriptor_t *fd); +int fgetc(fileDescriptor_t *fd); +size_t fread(void *ptr, size_t size, size_t nmemb, fileDescriptor_t *fd); +size_t fwrite(void *ptr, int size, int nmemb, fileDescriptor_t *fd); +int fseek(fileDescriptor_t *, long, int); int sysFseek(userFileDescriptor *, long, int); diff --git a/sys/include/vfs/inode.h b/sys/include/vfs/inode.h index d76c7a4..7e6b1d1 100644 --- a/sys/include/vfs/inode.h +++ b/sys/include/vfs/inode.h @@ -1,3 +1,31 @@ +/*- + * Copyright (c) 2002-2018 The UbixOS Project. + * All rights reserved. + * + * This was developed by Christopher W. Olsen for the UbixOS Project. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1) Redistributions of source code must retain the above copyright notice, this list of + * conditions, the following disclaimer and the list of authors. + * 2) Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions, the following disclaimer and the list of authors in the documentation and/or + * other materials provided with the distribution. + * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to + * endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + #ifndef _VFS_INODE_H #define _VFS_INODE_H diff --git a/sys/kernel/Makefile b/sys/kernel/Makefile index 3be69f9..622e23a 100644 --- a/sys/kernel/Makefile +++ b/sys/kernel/Makefile @@ -6,7 +6,7 @@ include ../Makefile.incl # Objects -OBJS = tty.o kern_sig.o pipe.o kern_descrip.o kern_sysctl.o gen_calls.o endtask.o ld.o time.o syscall_new.o elf.o ubthread.o vitals.o access.o syscalls.o execve.o +OBJS = vfs_calls.o tty.o kern_sig.o pipe.o kern_descrip.o kern_sysctl.o gen_calls.o endtask.o ld.o time.o syscall_new.o elf.o ubthread.o vitals.o access.o syscalls.o execve.o #OBJS += ../${_ARCH}/schedyield.o ../${_ARCH}/kpanic.o ../${_ARCH}/timer.o ../${_ARCH}/spinlock.o ../${_ARCH}/exec.o ../${_ARCH}/sys_call_new.o ../${_ARCH}/sys_call.o ../${_ARCH}/bioscall.o ../${_ARCH}/fork.o ../${_ARCH}/syscall.o ../${_ARCH}/systemtask.o ../${_ARCH}/sched.o ../${_ARCH}/cpu.o # ap-boot.o smp.o vitals.o(obsolete) diff --git a/sys/kernel/gen_calls.c b/sys/kernel/gen_calls.c index 017676f..a992b21 100644 --- a/sys/kernel/gen_calls.c +++ b/sys/kernel/gen_calls.c @@ -28,13 +28,13 @@ #include #include -#include #include #include #include #include #include #include +#include #include /* Exit Syscall */ @@ -70,44 +70,6 @@ return (0); } -int sys_write( struct thread *td, struct sys_write_args *uap ) { - char *buffer = 0x0; - char *in = 0x0; - -#ifdef DEBUG - kprintf("[%s:%i]",__FILE__,__LINE__); -#endif - - if ( uap->fd == 2 ) { - printColor += 1; - buffer = kmalloc( 1024 ); - memcpy( buffer, uap->buf, uap->nbyte ); - //kprintf( "stderr: [%s]", buffer ); - kprint(buffer); - kfree( buffer ); - printColor = defaultColor; - } - else if ( uap->fd == 1 ) { - /* This is Horrible! */ - in = (char *) uap->buf; - buffer = kmalloc( 1024 ); - memcpy( buffer, uap->buf, uap->nbyte ); - kprintf( "%s", buffer ); - kfree( buffer ); - td->td_retval[0] = uap->nbyte; - } - else { - kprintf( "[%i]", uap->nbyte ); - buffer = kmalloc( uap->nbyte ); - memcpy( buffer, uap->buf, uap->nbyte ); - //kprint(buffer); - kfree( buffer ); - kprintf( "(%i) %s", uap->fd, uap->buf ); - td->td_retval[0] = uap->nbyte; - } - return (0x0); -} - int sys_issetugid( register struct thread *td, struct sys_issetugid_args *uap ) { td->td_retval[0] = 0; return (0); @@ -177,18 +139,6 @@ return (0); } -int sys_read( struct thread *td, struct sys_read_args *args ) { - char *buf = args->buf; - kprintf("ARGS->fd: %i, NBYTE: %i\n", args->fd, args->nbyte); - buf[0] = 'C'; - buf[1] = 'A'; - buf[2] = 'T'; - buf[3] = '\0'; - td->td_retval[0] = 3; - kprintf( "DUMMY FUNC FIX ME! sys_read" ); - return (0); -} - int sys_wait4( struct thread *td, struct sys_wait4_args *args ) { //kprintf("DUMMY FUNC FIX ME! sys_wait4"); kTask_t *tmpTask = schedFindTask( args->pid ); @@ -196,12 +146,3 @@ return (tmpTask->state); return (0); } - -int sys_close( struct thread *td, struct sys_close_args *args ) { - kprintf( "DUMMY FUNC FIX ME! sys_close" ); - return (0); -} - -/*** - END - ***/ diff --git a/sys/kernel/kern_descrip.c b/sys/kernel/kern_descrip.c index 11c576e..69472bd 100644 --- a/sys/kernel/kern_descrip.c +++ b/sys/kernel/kern_descrip.c @@ -26,7 +26,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +#include #include #include #include @@ -34,6 +34,8 @@ #include #include +static struct file *kern_files = 0x0; + int fcntl(struct thread *td, struct fcntl_args *uap) { struct file *fp = 0x0; @@ -63,28 +65,48 @@ } int falloc(struct thread *td, struct file **resultfp, int *resultfd) { + struct file *fp = 0x0; int i = 0; -#ifdef DEBUG - kprintf("[%s:%i]",__FILE__,__LINE__); -#endif - fp = (struct file *) kmalloc(sizeof(struct file)); + /* First 5 Descriptors Are Reserved */ - for (i = 5; i < 1024; i++) { + for (i = 5; i < MAX_FILES; i++) { if (td->o_files[i] == 0x0) { td->o_files[i] = (void *) fp; if (resultfd) *resultfd = i; if (resultfp) *resultfp = fp; - break; + goto allocated; } } + + kfree(fp); + + *resultfp = 0x0; + *resultfd = 0x0; + + allocated: + return (0x0); } +int fdestroy(struct thread *td, struct file *fp, int fd) { + int error = 0; + + if (td->o_files[fd] != fp) { + error = -1; + } + else { + kfree(td->o_files[fd]); + td->o_files[fd] = 0x0; + } + + return (error); +} + int close(struct thread *td, struct close_args *uap) { #ifdef DEBUG kprintf("[%s:%i]",__FILE__,__LINE__); diff --git a/sys/kernel/pipe.c b/sys/kernel/pipe.c index 583e063..ae5fef7 100644 --- a/sys/kernel/pipe.c +++ b/sys/kernel/pipe.c @@ -29,9 +29,9 @@ #include #include #include -#include #include #include +#include /** HACK diff --git a/sys/kernel/syscall_new.c b/sys/kernel/syscall_new.c index c09349f..31736ba 100644 --- a/sys/kernel/syscall_new.c +++ b/sys/kernel/syscall_new.c @@ -60,7 +60,6 @@ } if (code > totalCalls) { - //kprintf( "Invalid Call: [%i:%i]\n", frame->tf_eax, totalCalls ); die_if_kernel("Invalid System Call", frame, frame->tf_eax); kpanic("PID: %i", _current->id); } @@ -70,8 +69,6 @@ frame->tf_edx = 0x0; } else { - //memcpy( args, params, 8 * sizeof(int) ); - td->td_retval[0] = 0; td->td_retval[1] = frame->tf_edx; diff --git a/sys/kernel/syscalls.c b/sys/kernel/syscalls.c index 6943f76..74c9854 100644 --- a/sys/kernel/syscalls.c +++ b/sys/kernel/syscalls.c @@ -31,14 +31,14 @@ /* System Calls List */ struct syscall_entry systemCalls[] = { - { 0, "No Call", sys_invalid, SYSCALL_VALID }, - { ARG_COUNT(sys_exit_args), "exit", (sys_call_t *) sys_exit, 2 }, - { ARG_COUNT(sys_fork_args), "fork", (sys_call_t *) sys_fork, SYSCALL_VALID }, - { ARG_COUNT(sys_read_args), "read", (sys_call_t *) sys_read, SYSCALL_VALID }, - { ARG_COUNT(sys_write_args), "write", (sys_call_t *) sys_write, SYSCALL_VALID }, - { ARG_COUNT(sys_open_args), "open", (sys_call_t *) sys_open, SYSCALL_DUMMY }, - { ARG_COUNT(sys_close_args), "close", (sys_call_t *) sys_close, SYSCALL_VALID }, - { ARG_COUNT(sys_wait4_args), "wiat4", (sys_call_t *) sys_wait4, 1 }, + { 0, "No Call", sys_invalid, SYSCALL_VALID }, // 0 - syscall + { ARG_COUNT(sys_exit_args), "exit", (sys_call_t *) sys_exit, SYSCALL_VALID }, // 1 - exit + { ARG_COUNT(sys_fork_args), "fork", (sys_call_t *) sys_fork, SYSCALL_VALID }, // 2 - fork + { ARG_COUNT(sys_read_args), "read", (sys_call_t *) sys_read, SYSCALL_VALID }, // 3 - read + { ARG_COUNT(sys_write_args), "write", (sys_call_t *) sys_write, SYSCALL_VALID }, // 4 - write + { ARG_COUNT(sys_open_args), "open", (sys_call_t *) sys_open, SYSCALL_DUMMY }, // 5 - open + { ARG_COUNT(sys_close_args), "close", (sys_call_t *) sys_close, SYSCALL_VALID }, // 6 - close + { ARG_COUNT(sys_wait4_args), "wiat4", (sys_call_t *) sys_wait4, SYSCALL_DUMMY }, { 0, "No Call", sys_invalid, SYSCALL_VALID }, { 0, "No Call", sys_invalid, SYSCALL_VALID }, { 0, "No Call", sys_invalid, SYSCALL_VALID }, @@ -428,7 +428,7 @@ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 384 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 385 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 386 - Invalid */ -{ ARG_COUNT(sys_fstatfs_args), "fstatfs", (sys_call_t *) sys_fstatfs, SYSCALL_VALID }, /* 397 fstatfs */ + { ARG_COUNT(sys_fstatfs_args), "fstatfs", (sys_call_t *) sys_fstatfs, SYSCALL_VALID }, /* 397 fstatfs */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 398 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 399 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 400 - Invalid */ @@ -544,8 +544,3 @@ }; int totalCalls = sizeof(systemCalls) / sizeof(struct syscall_entry); - -/*** - END - ***/ - diff --git a/sys/kernel/vfs_calls.c b/sys/kernel/vfs_calls.c new file mode 100644 index 0000000..6fcbc6f --- /dev/null +++ b/sys/kernel/vfs_calls.c @@ -0,0 +1,130 @@ +/*- + * Copyright (c) 2002-2018 The UbixOS Project. + * All rights reserved. + * + * This was developed by Christopher W. Olsen for the UbixOS Project. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1) Redistributions of source code must retain the above copyright notice, this list of + * conditions, the following disclaimer and the list of authors. + * 2) Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions, the following disclaimer and the list of authors in the documentation and/or + * other materials provided with the distribution. + * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to + * endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +int sys_open(struct thread *td, struct sys_open_args *args) { + int error = 0x0; + int fd = 0x0; + struct file *nfp = 0x0; + + error = falloc(td, &nfp, &fd); + + if (error) + return (error); + + nfp->fd = fopen(args->path, "r"); + + if (nfp->fd == 0x0) { + fdestroy(td, nfp, fd); + + td->td_retval[0] = -1; + error = -1; + } + else { + td->td_retval[0] = fd; //nfp->fd; //MrOlsen 2018index; + } + + return (error); +} + +int sys_close(struct thread *td, struct sys_close_args *args) { + struct file *fd = 0x0; + + getfd(td, &fd, args->fd); + + if (fd == 0x0) { + td->td_retval[0] = -1; + } + else { + if (!fclose(fd->fd)) + td->td_retval[0] = -1; + else { + fdestroy(td, fd, args->fd); + td->td_retval[0] = 0; + } + } + return (0); +} + +int sys_read(struct thread *td, struct sys_read_args *args) { + char *buf = args->buf; + + struct file *fd = 0x0; + + getfd(td, &fd, args->fd); + + if (args->fd > 3) { + td->td_retval[0] = fread(args->buf, args->nbyte, 1, fd->fd); + } + else { + kprintf("ARGS->fd: %i, NBYTE: %i\n", args->fd, args->nbyte); + buf[0] = 'C'; + buf[1] = 'A'; + buf[2] = 'T'; + buf[3] = '\0'; + td->td_retval[0] = 3; + kprintf("DUMMY FUNC FIX ME! sys_read"); + } + return (0); +} + +int sys_write(struct thread *td, struct sys_write_args *uap) { + char *buffer = 0x0; + + if (uap->fd == 2) { + buffer = kmalloc(1024); + memcpy(buffer, uap->buf, uap->nbyte); + printColor += 1; + kprint(buffer); + printColor = defaultColor; + kfree(buffer); + td->td_retval[0] = uap->nbyte; + } + else if (uap->fd == 1) { + buffer = kmalloc(1024); + memcpy(buffer, uap->buf, uap->nbyte); + kprint(buffer); + kfree(buffer); + td->td_retval[0] = uap->nbyte; + } + else { + kprintf("[%i]", uap->nbyte); + buffer = kmalloc(uap->nbyte); + memcpy(buffer, uap->buf, uap->nbyte); + //kprint(buffer); + kfree(buffer); + kprintf("(%i) %s", uap->fd, uap->buf); + td->td_retval[0] = uap->nbyte; + } + return (0x0); +} diff --git a/sys/kernel/vitals.c b/sys/kernel/vitals.c index 0f22df4..fc9d9d5 100644 --- a/sys/kernel/vitals.c +++ b/sys/kernel/vitals.c @@ -33,6 +33,7 @@ #include vitalsNode *systemVitals = 0x0; +spinLock_t vitals_lock; /************************************************************************ @@ -45,6 +46,9 @@ ************************************************************************/ int vitals_init() { + /* Initialize Vitals SpinLock */ + spinLockInit(&vitals_lock); + /* Initialize Memory For The System Vitals Node */ systemVitals = (vitalsNode *) kmalloc(sizeof(vitalsNode)); diff --git a/sys/vmm/paging.c b/sys/vmm/paging.c index 278c749..7aeec1d 100644 --- a/sys/vmm/paging.c +++ b/sys/vmm/paging.c @@ -33,9 +33,9 @@ #include #include #include -#include #include #include +#include uint32_t *kernelPageDirectory = 0x0; // Pointer To Kernel Page Directory diff --git a/sys/vmm/vmm_mmap.c b/sys/vmm/vmm_mmap.c index 072d864..3d649d4 100644 --- a/sys/vmm/vmm_mmap.c +++ b/sys/vmm/vmm_mmap.c @@ -29,10 +29,10 @@ #include #include #include +#include #include #include #include -#include /* MrOlsen (2016-01-15) TEMP: Put These somewhere else */ typedef __uint32_t __vm_size_t; typedef __vm_size_t