diff --git a/.cproject b/.cproject index 755f1f1..0c17e32 100644 --- a/.cproject +++ b/.cproject @@ -45,7 +45,7 @@ - + diff --git a/.settings/org.eclipse.mylyn.tasks.ui.prefs b/.settings/org.eclipse.mylyn.tasks.ui.prefs new file mode 100644 index 0000000..504c2a5 --- /dev/null +++ b/.settings/org.eclipse.mylyn.tasks.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +project.repository.kind=local +project.repository.url=local diff --git a/.settings/org.eclipse.wst.sse.core.prefs b/.settings/org.eclipse.wst.sse.core.prefs new file mode 100644 index 0000000..eee1873 --- /dev/null +++ b/.settings/org.eclipse.wst.sse.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +task-tags/enabled=true +task-tags/taskPriorities=1,2,1,2 +task-tags/taskTags=TODO,FIXME,XXX,MrOlsen +task-tags/use-project-settings=true diff --git a/sys/armv6/syscall.c b/sys/armv6/syscall.c index e20bb17..36a81d8 100644 --- a/sys/armv6/syscall.c +++ b/sys/armv6/syscall.c @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/sys/boot/arm/uboot/conf.c b/sys/boot/arm/uboot/conf.c index 26cbeb1..93890ad 100644 --- a/sys/boot/arm/uboot/conf.c +++ b/sys/boot/arm/uboot/conf.c @@ -25,9 +25,9 @@ * */ +#ifdef _IGNORE #include -#ifdef _IGNORE #include #include "bootstrap.h" diff --git a/sys/fs/vfs/inode.c b/sys/fs/vfs/inode.c index 536a946..30816cc 100644 --- a/sys/fs/vfs/inode.c +++ b/sys/fs/vfs/inode.c @@ -30,9 +30,9 @@ #include #include -static struct inode *first_inode = NULL; +//static struct inode *first_inode = NULL; static struct wait_queue *inode_wait = NULL; -static int nr_inodes = 0; +//static int nr_inodes = 0; static int nr_free_inodes = 0; static void write_inode(struct inode * inode); diff --git a/sys/i386/trap.c b/sys/i386/trap.c index 8f09ccf..1a67afb 100644 --- a/sys/i386/trap.c +++ b/sys/i386/trap.c @@ -37,8 +37,6 @@ void die_if_kernel(char *str, struct trapframe *regs, long err); -static void trap_end_task(char *string, struct trapframe *regs, long error_code); - #define TRAP_CODE(trap_nr, signr, str, trap_name, tsk) void do_##trap_name(struct trapframe *regs, long error_code) { \ die_if_kernel(str, regs, error_code); \ } diff --git a/sys/include/net/arch/sys_arch.h b/sys/include/net/arch/sys_arch.h index 439894a..c94add4 100644 --- a/sys/include/net/arch/sys_arch.h +++ b/sys/include/net/arch/sys_arch.h @@ -12,14 +12,6 @@ struct sys_timeout *next; }; -struct sys_sem { - uint32_t signaled; - ubthread_cond_t cond; - ubthread_mutex_t mutex; -}; - -typedef struct sys_sem sys_sem_t; - struct sys_mutex { ubthread_mutex_t mutex; }; diff --git a/sys/include/sys/sysproto.h b/sys/include/sys/sysproto.h index 3564637..8fde3c7 100644 --- a/sys/include/sys/sysproto.h +++ b/sys/include/sys/sysproto.h @@ -736,4 +736,5 @@ int sys_socket(struct thread *td, struct sys_socket_args *); int sys_setsockopt(struct thread *td, struct sys_setsockopt_args *); int sys_select(struct thread *td, struct sys_select_args *); + #endif diff --git a/sys/include/ubixos/errno.h b/sys/include/ubixos/errno.h index 516f4c0..93bce50 100644 --- a/sys/include/ubixos/errno.h +++ b/sys/include/ubixos/errno.h @@ -1,39 +1,31 @@ -/** - * @file - * Posix Errno defines - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. +/*- + * Copyright (c) 2002-2018 The UbixOS Project. * All rights reserved. * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: + * This was developed by Christopher W. Olsen for the UbixOS Project. * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. + * Redistribution and use in source and binary forms, with or without modification, are permitted + * provided that the following conditions are met: * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + * 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 file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * + * 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 _UBIXOS_ERRNO_H #define _UBIXOS_ERRNO_H @@ -177,4 +169,4 @@ } #endif -#endif /* LWIP_HDR_ERRNO_H */ +#endif /* _UBIXOS_ERRNO*/ diff --git a/sys/include/ubixos/sem.h b/sys/include/ubixos/sem.h index bb5f6eb..44694b5 100644 --- a/sys/include/ubixos/sem.h +++ b/sys/include/ubixos/sem.h @@ -30,6 +30,15 @@ #define _UBIXOS_SEM_H #include +#include + +struct sys_sem { + uint32_t signaled; + ubthread_cond_t cond; + ubthread_mutex_t mutex; +}; + +typedef struct sys_sem sys_sem_t; typedef uint32_t semID_t; struct timespec; @@ -39,10 +48,10 @@ int sem_wait(semID_t id); int sem_trywait(semID_t id); int sem_timedwait(semID_t id, const struct timespec); -int sem_init(semID_t *id, unsigned int value); +err_t sem_init(sys_sem_t **, uint8_t); int sem_open(semID_t *id, const char *name, int oflag, mode_t mode, unsigned int value); int sem_unlink(const char *name); int sem_getvalue(semID_t id, int *val); -int sem_destroy(semID_t id); +err_t sem_destroy(sys_sem_t **); #endif /* END _UBIXOS_SEM_H */ diff --git a/sys/init/main.c b/sys/init/main.c index 7e7c232..d78e605 100644 --- a/sys/init/main.c +++ b/sys/init/main.c @@ -72,6 +72,8 @@ Notes: + MrOlsen: test + *****************************************************************************************/ ubixDescriptorTable(ubixGDT, 11) { { .dummy = 0}, diff --git a/sys/init/static.c b/sys/init/static.c index ed697d8..e289999 100644 --- a/sys/init/static.c +++ b/sys/init/static.c @@ -26,18 +26,12 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include - -/** - * \brief Sets up the ctors - */ - +// XXX Set up the ctors int static_constructors(void) { extern void (*__ctor_list)(); void (**l_ctor)() = &__ctor_list; int l_ctorCount = *(int *) l_ctor; -// kprintf("Calling static constructors\n"); l_ctor++; while (l_ctorCount) { (*l_ctor)(); @@ -46,7 +40,3 @@ } return (0x0); } - -/*** - END - ***/ diff --git a/sys/kernel/sem.c b/sys/kernel/sem.c index 937ddbe..94d0b1c 100644 --- a/sys/kernel/sem.c +++ b/sys/kernel/sem.c @@ -27,6 +27,8 @@ */ #include +#include +#include #include int sem_close(semID_t id) { @@ -49,8 +51,22 @@ return(0); } -int sem_init(semID_t *id, unsigned int value) { - return(0); +err_t sys_init(sys_sem_t **sem, uint8_t count) { + sys_sem_t *newSem = 0x0; + + if (*sem != 0) { + kpanic("UH OH!"); + } + + newSem = kmalloc(sizeof(struct sys_sem)); + newSem->signaled = count; + + ubthread_cond_init(&(newSem->cond), NULL); + ubthread_mutex_init(&(newSem->mutex), NULL); + + *sem = newSem; + + return (ERR_OK); } int sem_open(semID_t *id, const char *name, int oflag, mode_t mode, unsigned int value) { @@ -65,7 +81,18 @@ return(0); } -int sem_destroy(semID_t id) { - return(0); +err_t sem_destroy(sys_sem_t **sem) { + if (*sem == NULL) + return (EINVAL); + + sys_sem_t *d_sem = *sem; + + ubthread_cond_destroy(&(d_sem->cond)); + ubthread_mutex_destroy(&(d_sem->mutex)); + + kfree(sem); + *sem = 0x0; + + return (ERR_OK); } diff --git a/sys/kernel/syscalls_posix.c b/sys/kernel/syscalls_posix.c index 934a7fb..f0cf564 100644 --- a/sys/kernel/syscalls_posix.c +++ b/sys/kernel/syscalls_posix.c @@ -113,7 +113,7 @@ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 79 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 80 - Invalid */ { ARG_COUNT(sys_getpgrp_args), "getpgrp", sys_getpgrp, SYSCALL_VALID }, // 81 - getpgrp - { ARG_COUNT(sys_setpgid_args), "setpgid", sys_setpgid, SYSCALL_VALID }, // 82 - setpgid + { ARG_COUNT(sys_setpgid_args), "setpgid", sys_setpgid, SYSCALL_VALID }, // 82 - setpgid { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 83 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 84 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 85 - Invalid */ @@ -196,7 +196,7 @@ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 162 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 163 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 164 - Invalid */ - { ARG_COUNT(sys_sysarch_args), "sysarch", sys_sysarch, SYSCALL_VALID }, /* 165 - sysarch */ + { ARG_COUNT(sys_sysarch_args), "sysarch", sys_sysarch, SYSCALL_VALID }, // 165 - sysarch { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 166 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 167 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 168 - Invalid */ @@ -212,7 +212,7 @@ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 178 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 179 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 180 - Invalid */ - { ARG_COUNT(sys_setGID_args), "Set GID", (sys_call_t *) sys_setGID, SYSCALL_VALID }, /* 181 - Invalid */ + { ARG_COUNT(sys_setGID_args), "Set GID", (sys_call_t *) sys_setGID, SYSCALL_VALID }, // 181 - getgid { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 182 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 183 - Invalid */ { 0, "No Call", sys_invalid, SYSCALL_VALID }, /* 184 - Invalid */ diff --git a/sys/kernel/time.c b/sys/kernel/time.c index c5d470e..9631760 100644 --- a/sys/kernel/time.c +++ b/sys/kernel/time.c @@ -84,32 +84,36 @@ return (0x0); } -uInt32 timeMake(struct timeStruct *time) { - uInt32 res; +uint32_t timeMake(struct timeStruct *time) { + uint32_t res; int year; year = (time->year + 100) - 70; + /* magic offsets (y+1) needed to get leapyears right.*/ res = YEAR * year + DAY * ((year + 1) / 4); + res += month[time->mon]; + /* and (y+2) here. If it wasn't a leap-year, we have to adjust */ if (time->mon > 1 && ((year + 2) % 4)) res -= DAY; + res += DAY * (time->day - 1); res += HOUR * time->hour; res += MINUTE * time->min; res += time->sec; + return (res); } int gettimeofday(struct timeval *tp, struct timezone *tzp) { - //tp->tv_sec = systemVitals->timeStart + systemVitals->sysUptime; - tp->tv_sec = 0x0; //systemVitals->sysUptime; + tp->tv_sec = systemVitals->timeStart + systemVitals->sysUptime; + //tp->tv_sec = 0x0; //systemVitals->sysUptime; tp->tv_usec = 0x0; + + tzp->tz_minuteswest = (-5 * 60); + tzp->tz_dsttime = 0x0; + return (0x0); } - -/*** - END - ***/ - diff --git a/sys/lib/kmalloc.c b/sys/lib/kmalloc.c index 4fd419e..cf3bc34 100644 --- a/sys/lib/kmalloc.c +++ b/sys/lib/kmalloc.c @@ -37,11 +37,11 @@ /* Set up three descriptor tables: - - kernDesc - The inuse descriptor table + + kernDesc - The inuse descriptor table freeKernDesc - The free descriptor table (descriptors with memory backing just not in use) emptyKernDesc - The empty descriptor table (descriptors with out a memory backing) - + */ static struct memDescriptor *usedKernDesc = 0x0; static struct memDescriptor *freeKernDesc = 0x0; @@ -179,6 +179,7 @@ 03/05/03 - We Have A Problem It Seems The First Block Is Limit 0x0 ************************************************************************/ +#ifdef _IGNORE static void mergeMemBlocks() { struct memDescriptor *tmpDesc1 = 0x0; struct memDescriptor *tmpDesc2 = 0x0; @@ -228,6 +229,7 @@ } return; } +#endif /************************************************************************ diff --git a/sys/lib/kprintf.c b/sys/lib/kprintf.c index 9675f15..906b880 100644 --- a/sys/lib/kprintf.c +++ b/sys/lib/kprintf.c @@ -66,7 +66,7 @@ */ if (vq == 0) { /* divide by zero. */ - static volatile const unsigned int zero = 0; + static const volatile unsigned int zero = 0; tmp.ul[H] = tmp.ul[L] = 1 / zero; if (arq) @@ -309,7 +309,7 @@ * ("%*D", len, ptr, " " -> XX XX XX XX ... */ -int kvprintf(char const *fmt, void (*func)(int, void*), void *arg, int radix, va_list ap) { +int kvprintf(const char *fmt, void (*func)(int, void*), void *arg, int radix, va_list ap) { #define PCHAR(c) {int cc=(c); if (func) (*func)(cc,arg); else *d++ = cc; retval++; } char nbuf[MAXNBUF]; char *d; @@ -653,6 +653,7 @@ } } #undef PCHAR + return (0); } static char *ksprintn(char *nbuf, uintmax_t num, int base, int *lenp, int upper) { diff --git a/sys/lib/strtok.c b/sys/lib/strtok.c index 2b0c608..4836404 100644 --- a/sys/lib/strtok.c +++ b/sys/lib/strtok.c @@ -70,6 +70,7 @@ } while (sc != 0); } /* NOTREACHED */ + return (NULL); } char *strtok(char *s, const char *delim) { diff --git a/sys/lib/vsprintf.c b/sys/lib/vsprintf.c index 7cd6daa..0c303e5 100644 --- a/sys/lib/vsprintf.c +++ b/sys/lib/vsprintf.c @@ -70,7 +70,7 @@ if (base < 2 || base > 36) return 0; c = (type & ZEROPAD) ? '0' : ' '; - if (type & SIGN && num < 0) { + if ((type & SIGN) && num < 0) { sign = '-'; num = -num; } diff --git a/sys/net/net/sys_arch.c b/sys/net/net/sys_arch.c index 369adbf..6bec82a 100644 --- a/sys/net/net/sys_arch.c +++ b/sys/net/net/sys_arch.c @@ -14,6 +14,7 @@ #include #include +#include /* Get Definitions For These */ #define ERR_NOT_READY 0 @@ -33,6 +34,7 @@ gettimeofday(&starttime, &tz); } +#ifdef _IGNORE static struct sys_sem *sys_sem_new_internal(uint8_t count) { struct sys_sem *sem; @@ -44,9 +46,13 @@ } return sem; } +#endif /* Create a new semaphore */ err_t sys_sem_new(sys_sem_t **sem, uint8_t count) { + return (sem_init(sem, count)); + +#ifdef __IGNORE sys_sem_t *newSem = 0x0; if (*sem != 0) { @@ -62,14 +68,21 @@ *sem = newSem; return (ERR_OK); +#endif } /* Deallocate semaphore */ void sys_sem_free(struct sys_sem **sem) { + sem_destroy(sem); + +#ifdef _IGNORE if ((sem != NULL) && (*sem != SYS_SEM_NULL)) { sys_sem_free_internal(*sem); *sem = 0x0; } +#endif + + } /* Signal semaphore */ @@ -89,12 +102,6 @@ ubthread_mutex_unlock(&(sem->mutex)); } -static void sys_sem_free_internal(struct sys_sem *sem) { - ubthread_cond_destroy(&(sem->cond)); - ubthread_mutex_destroy(&(sem->mutex)); - kfree(sem); -} - uint32_t sys_arch_sem_wait(struct sys_sem **s, uint32_t timeout) { uint32_t time_needed = 0; struct sys_sem *sem; diff --git a/sys/sys/device.c b/sys/sys/device.c index 7ea9c68..414dc70 100644 --- a/sys/sys/device.c +++ b/sys/sys/device.c @@ -42,7 +42,7 @@ Description: This will add a device to the system - Notes: + Notes: 05/19/2004 - Improving Upon the spec @@ -76,7 +76,7 @@ Description: This will find a device based on major minor - Notes: + Notes: 05/19/2004 - Improving Upon the spec @@ -135,7 +135,3 @@ spinUnlock(&deviceSpinLock); return 0x0; } - -/*** - END - ***/ diff --git a/sys/sys/dma.c b/sys/sys/dma.c index d6b6615..50505fb 100644 --- a/sys/sys/dma.c +++ b/sys/sys/dma.c @@ -39,7 +39,7 @@ static uInt8 pagePort[8] = { 0x87, 0x83, 0x81, 0x82, 0x8F, 0x8B, 0x89, 0x8A }; static uInt8 countPort[8] = { 0x01, 0x03, 0x05, 0x07, 0xC2, 0xC6, 0xCA, 0xCE }; -void dmaXfer(uInt8 channel, uInt32 address, uInt length, uInt8 read) { +void dmaXfer(uint8_t channel, uint32_t address, uInt length, uint8_t read) { unsigned char page = 0, mode = 0; unsigned int offset = 0; if (read) { @@ -67,7 +67,3 @@ outportByte(maskReg[dmaChannel], dmaChannel); //asm("sti"); } - -/*** - END - ***/ diff --git a/sys/sys/elf.c b/sys/sys/elf.c index abd1941..b82327c 100644 --- a/sys/sys/elf.c +++ b/sys/sys/elf.c @@ -27,7 +27,3 @@ */ #include - -/*** - END - ***/ diff --git a/sys/sys/idt.c b/sys/sys/idt.c index f0c7496..d22f038 100644 --- a/sys/sys/idt.c +++ b/sys/sys/idt.c @@ -41,7 +41,7 @@ #include #include -#define FP_TO_LINEAR(seg, off) ((void*) ((((uInt16) (seg)) << 4) + ((uInt16) (off)))) +#define FP_TO_LINEAR(seg, off) ((void*) ((((uint16_t) (seg)) << 4) + ((uint16_t) (off)))) static ubixDescriptorTable(ubixIDT, 256) {}; @@ -180,12 +180,6 @@ /* Null Intterupt Descriptor */ void intNull() { kprintf("Invalid Interrupt[%i]\n", _current->id); - /* - kpanic("Invalid Interrupt[%i]\n",_current->id); - while (1); - endTask(_current->id); - sched_yield(); - */ } asm volatile( @@ -266,9 +260,7 @@ ); void __int6(struct trapframe *frame) { - die_if_kernel("invalid_op", frame, 6); - //kprintf("tf_gs: 0x%X, tf_fs: 0x%X, tf_es: 0x%X, tf_ds: 0x%X\n", frame->tf_gs, frame->tf_fs, frame->tf_es, frame->tf_ds); - //kpanic( "int6: Invalid opcode! [%i:0x%X:0x%X]\n", _current->id, _current->tss.eip, frame->tf_eip ); + die_if_kernel("invalid_opcode", frame, 6); endTask(_current->id); sched_yield(); } @@ -317,9 +309,9 @@ } void _int13() { - uInt8 *ip = 0x0; - uInt16 *stack = 0x0, *ivt = 0x0; - uInt32 *stack32 = 0x0; + uint8_t *ip = 0x0; + uint16_t *stack = 0x0, *ivt = 0x0; + uint32_t *stack32 = 0x0; bool isOperand32 = FALSE, isAddress32 = FALSE; struct tssStruct *gpfTSS = (struct tssStruct *) 0x4200; @@ -505,7 +497,3 @@ " popl %eax \n" " iret \n" ); - -/*** - END - ***/ diff --git a/sys/sys/io.c b/sys/sys/io.c index fbc3f51..8fb75b7 100644 --- a/sys/sys/io.c +++ b/sys/sys/io.c @@ -139,7 +139,3 @@ ); return (retVal); } - -/*** - END - ***/ diff --git a/sys/vmm/copyvirtualspace.c b/sys/vmm/copyvirtualspace.c index 5b82c98..bee100a 100644 --- a/sys/vmm/copyvirtualspace.c +++ b/sys/vmm/copyvirtualspace.c @@ -36,7 +36,7 @@ /************************************************************************ - Function: void *vmmCopyVirtualSpace(pidType pid); + Function: void *vmm_copyVirtualSpace(pidType pid); Description: Creates A Copy Of A Virtual Space And Set All NON Kernel Space To COW For A Fork This Will Also Alter The Parents @@ -115,11 +115,6 @@ /* Copy The Stack Byte For Byte (I Should Find A Faster Way) */ memcpy(newStackPage, parentStackPage, PAGE_SIZE); - /* - for (s = 0x0; s < PD_ENTRIES; s++) { - newStackPage[s] = parentStackPage[s]; - } - */ /* Insert New Stack Into Page Table */ newPageTable[i] = (vmm_getPhysicalAddr((uint32_t) newStackPage) | PAGE_DEFAULT | PAGE_STACK); @@ -208,7 +203,6 @@ newPageDirectory[PD_INDEX(PD_BASE_ADDR)] = (uint32_t) (vmm_getPhysicalAddr((uint32_t) newPageTable) | PAGE_DEFAULT); newPageTable[0] = (uint32_t) ((uint32_t) (newPageDirectoryAddress) | PAGE_DEFAULT); - //MrOlsen (2017-12-15) - kprintf( "PD3: %i - 0x%X - 0x%X\n", PD_INDEX( PD_BASE_ADDR ), newPageDirectoryAddress, newPageTable[0] ); vmm_unmapPage((uint32_t) newPageTable, 1); diff --git a/sys/vmm/createvirtualspace.c b/sys/vmm/createvirtualspace.c index ca620a3..7f0dcdf 100644 --- a/sys/vmm/createvirtualspace.c +++ b/sys/vmm/createvirtualspace.c @@ -30,7 +30,7 @@ /************************************************************************ - Function: void *vmmCreateVirtualSpace(pid_t); + Function: void *vmm_createVirtualSpace(pid_t); Description: Creates A Virtual Space For A New Task Notes: diff --git a/sys/vmm/freevirtualpage.c b/sys/vmm/freevirtualpage.c index d42638b..2cf983f 100644 --- a/sys/vmm/freevirtualpage.c +++ b/sys/vmm/freevirtualpage.c @@ -29,5 +29,6 @@ #include int vmm_freeVirtualPage(uint32_t addr) { + //TODO: Implement this return (0); } diff --git a/sys/vmm/getfreepage.c b/sys/vmm/getfreepage.c index b406cc4..c002bfb 100644 --- a/sys/vmm/getfreepage.c +++ b/sys/vmm/getfreepage.c @@ -54,14 +54,19 @@ /* Set Page Table Address */ pageTableSrc = (uInt32 *) (PT_BASE_ADDR + (0x1000 * x)); + for (y = 0x0; y < 1024; y++) { + /* Loop Through The Page Table Find An UnAllocated Page */ if ((uInt32) pageTableSrc[y] == (uInt32) 0x0) { + /* Map A Physical Page To The Virtual Page */ if ((vmm_remapPage(vmm_findFreePage(pid), ((x * 0x400000) + (y * 0x1000)), KERNEL_PAGE_DEFAULT, pid)) == 0x0) kpanic("vmmRemapPage: vmm_getFreePage\n"); + /* Clear This Page So No Garbage Is There */ vmm_clearVirtualPage((uInt32) ((x * 0x400000) + (y * 0x1000))); + /* Return The Address Of The Newly Allocate Page */ spinUnlock(&vmmGFPlock); return ((void *) ((x * 0x400000) + (y * 0x1000))); @@ -71,10 +76,6 @@ /* If No Free Page Was Found Return NULL */ spinUnlock(&vmmGFPlock); + return (0x0); } - -/*** - END - ***/ - diff --git a/sys/vmm/getphysicaladdr.c b/sys/vmm/getphysicaladdr.c index 6e91501..eb9c5f4 100644 --- a/sys/vmm/getphysicaladdr.c +++ b/sys/vmm/getphysicaladdr.c @@ -29,16 +29,15 @@ #include /*! - - Function: void *vmmGetPhysicalAddr(); + Function: void *vmm_getPhysicalAddr(); Description: Returns The Physical Address Of The Virtual Page Notes: - */ -uint32_t vmm_getPhysicalAddr(uInt32 pageAddr) { +/* returns the real address of page is page aligned */ +uint32_t vmm_getPhysicalAddr(uint32_t pageAddr) { int pageDirectoryIndex = 0x0, pageTableIndex = 0x0; - uInt32 *pageTable = 0x0; + uint32_t *pageTable = 0x0; //Calculate The Page Directory Index pageDirectoryIndex = (pageAddr >> 22); @@ -47,11 +46,13 @@ pageTableIndex = ((pageAddr >> 12) & 0x3FF); /* Set pageTable To The Virtual Address Of Table */ - pageTable = (uInt32 *) (PT_BASE_ADDR + (0x1000 * pageDirectoryIndex)); + pageTable = (uint32_t *) (PT_BASE_ADDR + (0x1000 * pageDirectoryIndex)); + /* Return The Physical Address Of The Page */ - return ((uInt32) (pageTable[pageTableIndex] & 0xFFFFF000)); + return ((uint32_t) (pageTable[pageTableIndex] & 0xFFFFF000)); } +/* Returns the real address not page aligned */ uint32_t vmm_getRealAddr(uint32_t addr) { int pageDirectoryIndex = 0x0, pageTableIndex = 0x0; uint32_t *pageTable = 0x0; @@ -67,7 +68,3 @@ /* Return The Physical Address Of The Page */ return ((uint32_t) (pageTable[pageTableIndex] & 0xFFFFF000) + (addr & 0xFFF)); } - -/*** - END - ***/ diff --git a/sys/vmm/pagefault.c b/sys/vmm/pagefault.c index 072ddb8..6dba711 100644 --- a/sys/vmm/pagefault.c +++ b/sys/vmm/pagefault.c @@ -60,7 +60,7 @@ uint32_t eip = frame->tf_eip; uint32_t memAddr = cr2; -//MrOlsen 2017-12-15 - +//MrOlsen 2017-12-15 - kprintf("CR2: [0x%X], EIP: 0x%X, ERR: 0x%X\n", cr2, frame->tf_eip, frame->tf_err); /* Try to aquire lock otherwise spin till we do */ @@ -142,86 +142,3 @@ kprintf("CR2-RET"); return; } - -/*** - $Log: pagefault.c,v $ - Revision 1.6 2006/12/05 14:10:21 reddawg - Workign Distro - - Revision 1.5 2006/12/01 05:12:35 reddawg - We're almost there... :) - - Revision 1.4 2006/11/21 13:25:49 reddawg - A handful of changes ;) - - Revision 1.3 2006/11/06 19:10:12 reddawg - Lots Of Updates... Still having issues with brk(); - - Revision 1.2 2006/10/31 20:44:19 reddawg - Lots of changes - - Revision 1.1.1.1 2006/06/01 12:46:13 reddawg - ubix2 - - Revision 1.2 2005/10/12 00:13:38 reddawg - Removed - - Revision 1.1.1.1 2005/09/26 17:24:52 reddawg - no message - - Revision 1.14 2004/08/25 22:02:41 reddawg - task switching - We now are using software switching to be consistant with the rest of the world because all of this open source freaks gave me a hard time about something I liked. There doesn't seem to be any gain in performance but it is working fine and flawlessly - - Revision 1.13 2004/08/24 05:24:37 reddawg - TCA Is A BONER!!!! - - Revision 1.12 2004/08/14 11:23:03 reddawg - Changes - - Revision 1.11 2004/07/28 15:05:43 reddawg - Major: - Pages now have strict security enforcement. - Many null dereferences have been resolved. - When apps loaded permissions set for pages rw and ro - - Revision 1.10 2004/07/28 00:22:56 reddawg - bah - - Revision 1.9 2004/07/28 00:17:05 reddawg - Major: - Disconnected page 0x0 from the system... Unfortunately this broke many things - all of which have been fixed. This was good because nothing deferences NULL - any more. - - Things affected: - malloc,kmalloc,getfreepage,getfreevirtualpage,pagefault,fork,exec,ld,ld.so,exec,file - - Revision 1.8 2004/07/27 07:09:38 reddawg - Put in a test for 0x0 - - Revision 1.7 2004/07/26 19:15:49 reddawg - test code, fixes and the like - - Revision 1.6 2004/07/24 23:04:44 reddawg - Changes... mark let me know if you fault at pid 185 when you type stress - - Revision 1.5 2004/07/24 20:00:51 reddawg - Lots of changes to the vmm subsystem.... Page faults have been adjust to now be blocking on a per thread basis not system wide. This has resulted in no more deadlocks.. also the addition of per thread locking has removed segfaults as a result of COW in which two tasks fault the same COW page and try to modify it. - - Revision 1.4 2004/07/24 17:47:28 reddawg - vmm_pageFault: deadlock resolved thanks to a propper solution suggested by geist - - Revision 1.3 2004/07/19 02:05:26 reddawg - vmmPageFault: had a potential memory leak here for one page it was still using sysID on certain COW scenarios - - Revision 1.2 2004/06/10 22:23:56 reddawg - Volatiles - - Revision 1.1.1.1 2004/04/15 12:06:52 reddawg - UbixOS v1.0 - - Revision 1.4 2004/04/13 16:36:34 reddawg - Changed our copyright, it is all now under a BSD-Style license - - END - ***/ diff --git a/sys/vmm/paging.c b/sys/vmm/paging.c index 890eaea..e90005c 100644 --- a/sys/vmm/paging.c +++ b/sys/vmm/paging.c @@ -580,22 +580,29 @@ #endif */ - for (x = (addr / (1024 * 4096)); x < PD_INDEX(VMM_USER_END); x++) { + for (x = (addr / (PD_ENTRIES * PAGE_SIZE)); x < PD_INDEX(VMM_USER_END); x++) { + if ((pageDir[x] & PAGE_PRESENT) == PAGE_PRESENT) { - pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (0x1000 * x)); - for (y = 0; y < 1024; y++) { + + pageTableSrc = (uint32_t *) (PT_BASE_ADDR + (PAGE_SIZE * x)); + + for (y = 0; y < PAGE_SIZE; y++) { + if ((pageTableSrc[y] & PAGE_PRESENT) == PAGE_PRESENT) { + if ((pageTableSrc[y] & PAGE_COW) == PAGE_COW) { - //kprintf( "COW: 0x%X", (x * 0x400000) + (y * 0x1000) ); + + adjustCowCounter(((uint32_t) pageTableSrc[y] & 0xFFFFF000), -1); pageTableSrc[y] = 0x0; + } else if ((pageTableSrc[y] & PAGE_STACK) == PAGE_STACK) { + //TODO: We need to fix this so we can clean the stack! //kprintf("Page Stack!: 0x%X", (x * 0x400000) + (y * 0x1000)); // pageTableSrc[y] = 0x0; //MrOlsen (2016-01-18) NOTE: WHat should I Do Here? kprintf( "STACK: (%i:%i)", x, y ); } else { - //MrOlsen 2017-12-15 - kprintf( "Page Regular!: 0x%X", (x * 0x400000) + (y * 0x1000) ); pageTableSrc[y] = 0x0; } } @@ -610,8 +617,3 @@ return (0x0); } - -/*** - END - ***/ - diff --git a/sys/vmm/setpageattributes.c b/sys/vmm/setpageattributes.c index 894e626..05fecd3 100644 --- a/sys/vmm/setpageattributes.c +++ b/sys/vmm/setpageattributes.c @@ -31,15 +31,15 @@ /************************************************************************ - Function: void vmmSetPageAttributes(uInt32 pageAddr,int attributes; + Function: void vmm_setPageAttributes(uInt32 pageAddr,int attributes; Description: This Function Will Set The Page Attributes Such As A Read Only Page, Stack Page, COW Page, ETC. Notes: ************************************************************************/ -int vmm_setPageAttributes(uInt32 memAddr, uInt16 attributes) { - uInt16 directoryIndex = 0x0, tableIndex = 0x0; - uInt32 *pageTable = 0x0; +int vmm_setPageAttributes(uint32_t memAddr, uint16_t attributes) { + uint16_t directoryIndex = 0x0, tableIndex = 0x0; + uint32_t *pageTable = 0x0; /* Calculate The Page Directory Index */ directoryIndex = (memAddr >> 22); @@ -48,7 +48,7 @@ tableIndex = ((memAddr >> 12) & 0x3FF); /* Set Table Pointer */ - if ((pageTable = (uInt32 *) (PT_BASE_ADDR + (0x1000 * directoryIndex))) == 0x0) + if ((pageTable = (uint32_t *) (PT_BASE_ADDR + (0x1000 * directoryIndex))) == 0x0) kpanic("Error: pageTable == NULL, File: %s, Line: %i\n", __FILE__, __LINE__); /* Set Attribute If Page Is Mapped */ @@ -65,36 +65,3 @@ /* Return */ return (0x0); } - -/*** - $Log: setpageattributes.c,v $ - Revision 1.1.1.1 2006/06/01 12:46:13 reddawg - ubix2 - - Revision 1.2 2005/10/12 00:13:38 reddawg - Removed - - Revision 1.1.1.1 2005/09/26 17:24:53 reddawg - no message - - Revision 1.4 2004/07/28 15:05:43 reddawg - Major: - Pages now have strict security enforcement. - Many null dereferences have been resolved. - When apps loaded permissions set for pages rw and ro - - Revision 1.3 2004/07/20 22:29:55 reddawg - assert: remade assert - - Revision 1.2 2004/06/10 22:23:56 reddawg - Volatiles - - Revision 1.1.1.1 2004/04/15 12:06:53 reddawg - UbixOS v1.0 - - Revision 1.6 2004/04/13 16:36:34 reddawg - Changed our copyright, it is all now under a BSD-Style license - - END - ***/ - diff --git a/sys/vmm/unmappage.c b/sys/vmm/unmappage.c index b89ddc0..bfb0cfd 100644 --- a/sys/vmm/unmappage.c +++ b/sys/vmm/unmappage.c @@ -45,9 +45,9 @@ To Create A New Virtual Space So Now It Has A Flag ************************************************************************/ -void vmm_unmapPage(uInt32 pageAddr, int flags) { +void vmm_unmapPage(uint32_t pageAddr, int flags) { int pageDirectoryIndex = 0, pageTableIndex = 0; - uInt32 *pageTable = 0x0; + uint32_t *pageTable = 0x0; /* Get The Index To The Page Directory */ pageDirectoryIndex = (pageAddr >> 22); @@ -56,22 +56,25 @@ pageTableIndex = ((pageAddr >> 12) & 0x3FF); /* Set pageTable To The Virtual Address Of Table */ - pageTable = (uInt32 *) (PT_BASE_ADDR + (0x1000 * pageDirectoryIndex)); + pageTable = (uint32_t *) (PT_BASE_ADDR + (0x1000 * pageDirectoryIndex)); + /* Free The Physical Page If Flags Is 0 */ if (flags == 0) { - /* - * This is temp i think its still an issue clearVirtualPage(pageAddr); - * freePage((uInt32)(pageTable[pageTableIndex] & 0xFFFFF000)); - */ + // FIXME This is temp i think its still an issue clearVirtualPage(pageAddr); + //freePage((uInt32)(pageTable[pageTableIndex] & 0xFFFFF000)); + } + /* Unmap The Page */ pageTable[pageTableIndex] = 0x0; + /* Rehash The Page Directory */ asm volatile( "movl %cr3,%eax\n" "movl %eax,%cr3\n" ); + /* Return */ return; } diff --git a/sys/vmm/vmm_init.c b/sys/vmm/vmm_init.c index 379bff4..85fab6b 100644 --- a/sys/vmm/vmm_init.c +++ b/sys/vmm/vmm_init.c @@ -46,8 +46,3 @@ return (0x0); } - -/*** - END - ***/ - diff --git a/sys/vmm/vmm_memory.c b/sys/vmm/vmm_memory.c index 4db1487..3792ffc 100644 --- a/sys/vmm/vmm_memory.c +++ b/sys/vmm/vmm_memory.c @@ -38,7 +38,7 @@ //MrOlsen (2016-01-11) NOTE: Need to Seperate Out CPU Specific Stuff Over Time #include -static uInt32 freePages = 0; +static uint32_t freePages = 0; static struct spinLock vmmSpinLock = SPIN_LOCK_INITIALIZER; static struct spinLock vmmCowSpinLock = SPIN_LOCK_INITIALIZER; @@ -69,7 +69,7 @@ vmmMemoryMap[i].cowCounter = 0x0; vmmMemoryMap[i].status = memNotavail; vmmMemoryMap[i].pid = vmmID; - vmmMemoryMap[i].pageAddr = i * 4096; + vmmMemoryMap[i].pageAddr = i * PAGE_SIZE; } /* Calculate Start Of Free Memory */ @@ -127,6 +127,7 @@ /* Save The State Of Register CR0 */ cr0 = rcr0(); + /* asm volatile ( "movl %%cr0, %%ebx\n" @@ -206,7 +207,7 @@ asm("nop"); /* Return Amount Of Memory In Pages */ - return ((memKb * 1024 * 1024) / 4096); + return ((memKb * 1024 * 1024) / PAGE_SIZE); } /************************************************************************ @@ -261,7 +262,8 @@ Notes: ************************************************************************/ -int freePage(uInt32 pageAddr) { +int freePage(uint32_t pageAddr) { + int pageIndex = 0x0; assert((pageAddr & 0xFFF) == 0x0); spinLock(&vmmSpinLock); @@ -271,18 +273,23 @@ /* Check If Page COW Is Greater Then 0 If It Is Dec It If Not Free It */ if (vmmMemoryMap[pageIndex].cowCounter == 0) { + /* Set Page As Avail So It Can Be Used Again */ vmmMemoryMap[pageIndex].status = memAvail; vmmMemoryMap[pageIndex].cowCounter = 0x0; vmmMemoryMap[pageIndex].pid = -2; freePages++; systemVitals->freePages = freePages; + } else { + /* Adjust The COW Counter */ - adjustCowCounter(((uInt32) vmmMemoryMap[pageIndex].pageAddr), -1); + adjustCowCounter(((uint32_t) vmmMemoryMap[pageIndex].pageAddr), -1); + } spinUnlock(&vmmSpinLock); + /* Return */ return (0); } @@ -306,13 +313,18 @@ /* Adjust COW Counter */ vmmMemoryMap[vmmMemoryMapIndex].cowCounter += adjustment; - if (vmmMemoryMap[vmmMemoryMapIndex].cowCounter == 0) { + if (vmmMemoryMap[vmmMemoryMapIndex].cowCounter <= 0) { + + if (vmmMemoryMap[vmmMemoryMapIndex].cowCounter < 0) + kprintf("ERROR: Why is COW less than 0"); + vmmMemoryMap[vmmMemoryMapIndex].cowCounter = 0x0; vmmMemoryMap[vmmMemoryMapIndex].pid = vmmID; vmmMemoryMap[vmmMemoryMapIndex].status = memAvail; freePages++; systemVitals->freePages = freePages; } + spinUnlock(&vmmCowSpinLock); /* Return */ return (0); @@ -320,7 +332,7 @@ /************************************************************************ - Function: void vmmFreeProcessPages(pid_t pid); + Function: void vmm_freeProcessPages(pid_t pid); Description: This Function Will Free Up Memory For The Exiting Process @@ -329,21 +341,30 @@ 08/04/02 - Added Checking For COW Pages First ************************************************************************/ + +/* TODO: This can be greatly immproved for performance but it gets the job done */ void vmm_freeProcessPages(pidType pid) { int i = 0, x = 0; - uInt32 *tmpPageTable = 0x0; - uInt32 *tmpPageDir = (uInt32 *) PD_BASE_ADDR; + uint32_t *tmpPageTable = 0x0; + uint32_t *tmpPageDir = (uInt32 *) PD_BASE_ADDR; + spinLock(&vmmSpinLock); + /* Check Page Directory For An Avail Page Table */ - for (i = 0; i <= 0x300; i++) { + //NOTE: Thie cleans all memory space up to kernel space + for (i = 0; i < (PAGE_SIZE - (PAGE_SIZE / 4)); i++) { + if (tmpPageDir[i] != 0) { + /* Set Up Page Table Pointer */ - tmpPageTable = (uInt32 *) (PT_BASE_ADDR + (i * 0x1000)); + tmpPageTable = (uint32_t *) (PT_BASE_ADDR + (i * PAGE_SIZE)); + /* Check The Page Table For COW Pages */ for (x = 0; x < PD_ENTRIES; x++) { + /* If The Page Is COW Adjust COW Counter */ - if (((uInt32) tmpPageTable[x] & PAGE_COW) == PAGE_COW) { - adjustCowCounter(((uInt32) tmpPageTable[x] & 0xFFFFF000), -1); + if (((uint32_t) tmpPageTable[x] & PAGE_COW) == PAGE_COW) { + adjustCowCounter(((uint32_t) tmpPageTable[x] & 0xFFFFF000), -1); } } } @@ -362,6 +383,7 @@ } } } + /* Return */ spinUnlock(&vmmSpinLock); return;