Cleanup and Bugfixes
authorJohn Hodge <[email protected]>
Thu, 19 Nov 2009 09:24:00 +0000 (17:24 +0800)
committerJohn Hodge <[email protected]>
Thu, 19 Nov 2009 09:24:00 +0000 (17:24 +0800)
- Fixed bugs with handling of SYS_READ and SYS_WRITE
- Added EXPORT definitions to functions used by the IPStack
- Updated the core Makefile to use loops to allow easier maintainence
- Fixed bug in IPStack/main.c (Null pointer dereference)
- Cleaned up some of the debug code

31 files changed:
Kernel/arch/x86/errors.c
Kernel/arch/x86/lib.c
Kernel/arch/x86/proc.c
Kernel/arch/x86/time.c
Kernel/bin/elf.c
Kernel/binary.c
Kernel/debug.c
Kernel/drv/vterm.c
Kernel/heap.c
Kernel/lib.c
Kernel/modules.c
Kernel/syscalls.c
Kernel/system.c
Kernel/threads.c
Kernel/vfs/io.c
Kernel/vfs/open.c
Makefile
Modules/IPStack/ipstack.h
Modules/IPStack/link.c
Modules/IPStack/main.c
Modules/Makefile.tpl
Usermode/Applications/init_src/Makefile
Usermode/Applications/init_src/main.c
Usermode/Libraries/Makefile.cfg
Usermode/Libraries/libacess.so_src/Makefile
Usermode/Libraries/libacess.so_src/mm.asm
Usermode/Libraries/libacess.so_src/vfs.asm
Usermode/Libraries/libc.so_src/Makefile
Usermode/Libraries/libc.so_src/heap.c
Usermode/Libraries/libc.so_src/stub.c
Usermode/include/acess/sys.h

index 2f94972..d6daace 100644 (file)
@@ -143,3 +143,6 @@ void StartupPrint(char *Str)
                memset(&buf[80*24], 0, 80*2);
        }
 }
+
+// === EXPORTS ===
+EXPORT(__stack_chk_fail);
index 8b86145..990d1dc 100644 (file)
@@ -189,8 +189,12 @@ Uint32 BigEndian32(Uint32 Val)
 
 // --- EXPORTS ---
 EXPORT(memcpy);        EXPORT(memset);
+EXPORT(memcmp);
 //EXPORT(memcpyw);     EXPORT(memsetw);
 EXPORT(memcpyd);       EXPORT(memsetd);
 EXPORT(inb);   EXPORT(inw);    EXPORT(ind);
 EXPORT(outb);  EXPORT(outw);   EXPORT(outd);
 EXPORT(__udivdi3);     EXPORT(__umoddi3);
+
+EXPORT(LittleEndian16);        EXPORT(BigEndian16);
+EXPORT(LittleEndian32);        EXPORT(BigEndian32);
index d7f460f..f9c5ba1 100644 (file)
@@ -568,3 +568,6 @@ void Proc_Scheduler(int CPU)
                );
        for(;;);        // Shouldn't reach here
 }
+
+// === EXPORTS ===
+EXPORT(Proc_SpawnWorker);
index cfe2f03..abdbb11 100644 (file)
@@ -177,3 +177,9 @@ void Time_Delay(int Delay)
        Sint64  dest = giTimestamp + Delay;
        while(dest < giTimestamp)       Threads_Yield();
 }
+
+// === EXPORTS ===
+EXPORT(now);
+EXPORT(Time_CreateTimer);
+EXPORT(Time_RemoveTimer);
+EXPORT(Time_Delay);
index dcfe35c..745c2c7 100644 (file)
@@ -277,6 +277,7 @@ int Elf_Relocate(void *Base)
        Elf32_Dyn       *dynamicTab = NULL;     // Dynamic Table Pointer\r
        char    *dynstrtab = NULL;      // .dynamic String Table\r
        Elf32_Sym       *dynsymtab = NULL;\r
+        int    bFailed = 0;\r
        \r
        ENTER("pBase", Base);\r
        \r
@@ -393,8 +394,7 @@ int Elf_Relocate(void *Base)
                {\r
                        ptr = (void*)(iBaseDiff + rel[i].r_offset);\r
                        if( !Elf_Int_DoRelocate(rel[i].r_info, ptr, *ptr, dynsymtab, (Uint)Base) ) {\r
-                               LEAVE('x', 0);\r
-                               return 0;\r
+                               bFailed = 1;\r
                        }\r
                }\r
        }\r
@@ -406,8 +406,7 @@ int Elf_Relocate(void *Base)
                {\r
                        ptr = (void*)(iBaseDiff + rela[i].r_offset);\r
                        if( !Elf_Int_DoRelocate(rel[i].r_info, ptr, rela[i].r_addend, dynsymtab, (Uint)Base) ) {\r
-                               LEAVE('x', 0);\r
-                               return 0;\r
+                               bFailed = 1;\r
                        }\r
                }\r
        }\r
@@ -423,8 +422,7 @@ int Elf_Relocate(void *Base)
                        {\r
                                ptr = (void*)(iBaseDiff + pltRel[i].r_offset);\r
                                if( !Elf_Int_DoRelocate(pltRel[i].r_info, ptr, *ptr, dynsymtab, (Uint)Base) ) {\r
-                                       LEAVE('x', 0);\r
-                                       return 0;\r
+                                       bFailed = 1;\r
                                }\r
                        }\r
                }\r
@@ -436,13 +434,17 @@ int Elf_Relocate(void *Base)
                        {\r
                                ptr = (void*)((Uint)Base + pltRela[i].r_offset);\r
                                if( !Elf_Int_DoRelocate(pltRela[i].r_info, ptr, pltRela[i].r_addend, dynsymtab, (Uint)Base) ) {\r
-                                       LEAVE('x', 0);\r
-                                       return 0;\r
+                                       bFailed = 1;\r
                                }\r
                        }\r
                }\r
        }\r
        \r
+       if(bFailed) {\r
+               LEAVE('i', 0);\r
+               return 0;\r
+       }\r
+       \r
        LEAVE('x', hdr->entrypoint);\r
        return hdr->entrypoint;\r
 }\r
index 2237d1b..43d8cb3 100644 (file)
@@ -9,6 +9,7 @@
 // === CONSTANTS ===\r
 #define BIN_LOWEST     MM_USER_MIN             // 1MiB\r
 #define BIN_GRANUALITY 0x10000         // 64KiB\r
+//! \todo Move 0xBC000000 to mm_virt.h\r
 #define BIN_HIGHEST    (0xBC000000-BIN_GRANUALITY)             // Just below the kernel\r
 #define        KLIB_LOWEST     MM_MODULE_MIN\r
 #define KLIB_GRANUALITY        0x8000          // 32KiB\r
@@ -322,6 +323,8 @@ Uint Binary_MapIn(tBinary *binary)
                        MM_SetFlags( addr, MM_PFLAG_COW, -1 );\r
        }\r
        \r
+       //Log("Mapped '%s' to 0x%x", binary->TruePath, base);\r
+       \r
        //LOG("*0x%x = 0x%x\n", binary->Pages[0].Virtual, *(Uint*)binary->Pages[0].Virtual);\r
        \r
        return base;\r
index 854876a..a23c4c4 100644 (file)
@@ -200,7 +200,7 @@ void Debug_SetKTerminal(char *File)
        if(giDebug_KTerm != -1)
                VFS_Close(giDebug_KTerm);
        giDebug_KTerm = VFS_Open(File, VFS_OPENFLAG_WRITE);
-       Log("Opend '%s' as %i\n", File, giDebug_KTerm);
+       Log("Opened '%s' as %i\n", File, giDebug_KTerm);
 }
 
 void Debug_Enter(char *FuncName, char *ArgTypes, ...)
@@ -330,6 +330,7 @@ void Debug_HexDump(char *Header, void *Data, Uint Length)
 }
 
 // --- EXPORTS ---
+EXPORT(Log);
 EXPORT(Warning);
 EXPORT(Debug_Enter);
 EXPORT(Debug_Log);
index 87f71ed..96f02ed 100644 (file)
@@ -197,7 +197,6 @@ int VT_Install(char **Arguments)
 void VT_InitOutput()
 {
        giVT_OutputDevHandle = VFS_Open(gsVT_OutputDevice, VFS_OPENFLAG_WRITE);
-       Log("giVT_OutputDevHandle = %x\n", giVT_OutputDevHandle);
        VT_SetTerminal( 0 );
 }
 
@@ -208,7 +207,6 @@ void VT_InitOutput()
 void VT_InitInput()
 {
        giVT_InputDevHandle = VFS_Open(gsVT_InputDevice, VFS_OPENFLAG_READ);
-       LOG("giVT_InputDevHandle = %x\n", giVT_InputDevHandle);
        if(giVT_InputDevHandle == -1)   return ;
        VFS_IOCtl(giVT_InputDevHandle, KB_IOCTL_SETCALLBACK, VT_KBCallBack);
 }
@@ -495,9 +493,9 @@ void VT_KBCallBack(Uint32 Codepoint)
                case KEY_F11:   VT_SetTerminal(10);     return;
                case KEY_F12:   VT_SetTerminal(11);     return;
                case KEY_PGUP:
-                       break;
+                       return;
                case KEY_PGDOWN:
-                       break;
+                       return;
                }
        }
        
index 0e3c5f4..a8fdd53 100644 (file)
@@ -444,3 +444,8 @@ void Heap_Dump()
        }
 }
 #endif
+
+// === EXPORTS ===
+EXPORT(malloc);
+EXPORT(realloc);
+EXPORT(free);
index 70d116e..f614965 100644 (file)
@@ -421,11 +421,15 @@ int LookupString(char **Array, char *Needle)
        return -1;
 }
 
+EXPORT(strlen);
 EXPORT(strdup);
 EXPORT(strcmp);
+EXPORT(strncmp);
 EXPORT(strcpy);
+//EXPORT(strncpy);
 
 EXPORT(timestamp);
 EXPORT(ReadUTF8);
 EXPORT(CheckMem);
 EXPORT(CheckString);
+EXPORT(LookupString);
index a4e639b..9ae940a 100644 (file)
@@ -46,7 +46,6 @@ int Modules_LoadBuiltins()
                                        if(strcmp(deps[j], gKernelModules[k].Name) == 0)
                                                break;
                                }
-                               Log("%s requires %s\n", gKernelModules[i].Name, deps[j]);
                                if(k == giNumBuiltinModules) {
                                        Warning("Unable to find dependency '%s' for '%s' in kernel",
                                                deps[j], gKernelModules[i].Name);
@@ -78,7 +77,6 @@ int Modules_LoadBuiltins()
                                        }
                                        // `k` is assumed to be less than `giNumBuiltinModules`
                                        
-                                       Log("baIsLoaded[%i(%s)] = %i\n", k, deps[j], baIsLoaded[k]);
                                        // If a dependency failed, skip and mark as failed
                                        if( baIsLoaded[k] == -1 ) {
                                                baIsLoaded[i] = -1;
index fb574ef..8770187 100644 (file)
@@ -9,18 +9,14 @@
 #include <proc.h>
 #include <errno.h>
 
-#define CHECK_NUM_NULLOK(v,size)       do {\
-       if((v)&&!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}\
-       }while(0)
-#define CHECK_STR_NULLOK(v)    do {\
-       if((v)&&!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}\
-       }while(0)
-#define CHECK_NUM_NONULL(v,size)       do {\
-       if(!(v)||!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}\
-       }while(0)
-#define CHECK_STR_NONULL(v)    do {\
-       if(!(v)||!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}\
-       }while(0)
+#define CHECK_NUM_NULLOK(v,size)       \
+       if((v)&&!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}
+#define CHECK_STR_NULLOK(v)    \
+       if((v)&&!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}
+#define CHECK_NUM_NONULL(v,size)       \
+       if(!(v)||!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}
+#define CHECK_STR_NONULL(v)    \
+       if(!(v)||!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}
 
 // === IMPORTS ===
 extern int     Proc_Clone(Uint *Err, Uint Flags);
@@ -48,12 +44,12 @@ void SyscallHandler(tSyscallRegs *Regs)
 {
        Uint64  ret = 0;
        Uint    err = 0;
-       #if DEBUG
+       
        ENTER("iThread iNum", Threads_GetTID(), Regs->Num);
        if(Regs->Num < NUM_SYSCALLS)
                LOG("Syscall %s", cSYSCALL_NAMES[Regs->Num]);
-       LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3);
-       #endif
+       LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x, Arg4: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3, Regs->Arg4);
+       //#endif
        
        switch(Regs->Num)
        {
@@ -142,13 +138,15 @@ void SyscallHandler(tSyscallRegs *Regs)
        // ---
        case SYS_EXECVE:
                CHECK_STR_NONULL(Regs->Arg1);
+               //Log(" Regs = {Arg2: %x, Arg3: %x}", Regs->Arg2, Regs->Arg3);
                {
                         int    i;
                        char    **tmp = (char**)Regs->Arg2;
                        // Check ArgV (traverse array checking all string pointers)
                        CHECK_NUM_NONULL( tmp, sizeof(char**) );
+                       //Log("tmp = %p", tmp);
                        for(i=0;tmp[i];i++) {
-                               CHECK_NUM_NULLOK( &tmp[i], sizeof(char*) );
+                               CHECK_NUM_NONULL( &tmp[i], sizeof(char*) );
                                CHECK_STR_NONULL( tmp[i] );
                        }
                        // Check EnvP also
@@ -156,6 +154,7 @@ void SyscallHandler(tSyscallRegs *Regs)
                        if( Regs->Arg3 )
                        {
                                tmp = (char**)Regs->Arg3;
+                               //Log("tmp = %p", tmp);
                                for(i=0;tmp[i];i++) {
                                        CHECK_NUM_NULLOK( &tmp[i], sizeof(char*) );
                                        CHECK_STR_NONULL( tmp[i] );
@@ -278,12 +277,12 @@ void SyscallHandler(tSyscallRegs *Regs)
                break;
        
        // -- Debug
-       #if DEBUG_BUILD
+       //#if DEBUG_BUILD
        case SYS_DEBUG:
                Log((char*)Regs->Arg1,
                        Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
                break;
-       #endif
+       //#endif
        
        // -- Default (Return Error)
        default:
@@ -294,6 +293,11 @@ void SyscallHandler(tSyscallRegs *Regs)
                ret = -1;
                break;
        }
+       
+       if(err != 0) {
+               LOG("ID: %i, Return errno = %i", Regs->Num, err);
+       }
+       
        #if BITS < 64
        Regs->Return = ret&0xFFFFFFFF;
        Regs->RetHi = ret >> 32;
index 49af479..af66851 100644 (file)
@@ -252,7 +252,7 @@ void System_ExecuteScript()
                        i += 7;
                        i += System_Int_GetString(fData+i, &sArg1);
                        if(!sArg1)      goto read2eol;
-                       Log("[CFG ] Load EDI Module '%s'\n", sArg1);
+                       Log("[CFG  ] Load EDI Module '%s'", sArg1);
                        Module_LoadFile(sArg1, "");
                }
                // - Symlink
@@ -262,7 +262,7 @@ void System_ExecuteScript()
                        if(!sArg1)      goto read2eol;
                        i += System_Int_GetString(fData+i, &sArg2);
                        if(!sArg2)      goto read2eol;
-                       Log("[CFG ] Symlink '%s' pointing to '%s'\n", sArg1, sArg2);
+                       Log("[CFG  ] Symlink '%s' pointing to '%s'", sArg1, sArg2);
                        VFS_Symlink(sArg1, sArg2);
                }
                // - New Directory
@@ -270,7 +270,7 @@ void System_ExecuteScript()
                        i += 6;
                        i += System_Int_GetString(fData+i, &sArg1);
                        if(!sArg1)      goto read2eol;
-                       Log("[CFG ] New Directory '%s'\n", sArg1);
+                       Log("[CFG  ] New Directory '%s'", sArg1);
                        VFS_MkDir(sArg1);
                }
                // - Spawn a task
@@ -278,7 +278,7 @@ void System_ExecuteScript()
                        i += 6;
                        i += System_Int_GetString(fData+i, &sArg1);
                        if(!sArg1)      goto read2eol;
-                       Log("[CFG ] Starting '%s' as a new task\n", sArg1);
+                       Log("[CFG  ] Starting '%s' as a new task", sArg1);
                        Proc_Spawn(sArg1);
                }
                else {
index 00fc050..3515fe0 100644 (file)
@@ -708,3 +708,6 @@ void Threads_SegFault(tVAddr Addr)
        Warning("Thread #%i committed a segfault at address %p", Proc_GetCurThread()->TID, Addr);
        Threads_Exit( 0, -1 );
 }
+
+// === EXPORTS ===
+EXPORT(Threads_GetUID);
index b27e7f0..67a7075 100644 (file)
@@ -212,3 +212,12 @@ int VFS_FInfo(int FD, struct s_sysFInfo *Dest, int MaxACLs)
        
        return max;
 }
+
+// === EXPORTS ===
+EXPORT(VFS_Read);
+EXPORT(VFS_Write);
+EXPORT(VFS_ReadAt);
+EXPORT(VFS_WriteAt);
+EXPORT(VFS_IOCtl);
+EXPORT(VFS_Seek);
+EXPORT(VFS_Tell);
index 507f182..3a68703 100644 (file)
@@ -666,3 +666,7 @@ tVFS_Handle *VFS_GetHandle(int FD)
        if(h->Node == NULL)     return NULL;
        return h;
 }
+
+// === EXPORTS ===
+EXPORT(VFS_Open);
+EXPORT(VFS_Close);
index 27f4fa8..88b8377 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -4,39 +4,65 @@
 
 .PHONY: all clean
 
+MODULES = IPStack
+USRLIBS = ld-acess.so libacess.so libgcc.so libc.so
+USRAPPS = init login CLIShell cat ls mount
+
 all:
+       @for mod in $(MODULES); do \
+       (echo === $$mod && $(MAKE) all --no-print-directory -C Modules/$$mod) \
+       done
+       
        @echo === Kernel
        @$(MAKE) all --no-print-directory -C Kernel
-       @echo === ld-acess.so
-       @$(MAKE) all --no-print-directory -C Usermode/Libraries/ld-acess.so_src
-       @echo === libacess.so
-       @$(MAKE) all --no-print-directory -C Usermode/Libraries/libacess.so_src
-       @echo === libgcc.so
-       @$(MAKE) all --no-print-directory -C Usermode/Libraries/libgcc.so_src
-       @echo === libc.so
-       @$(MAKE) all --no-print-directory -C Usermode/Libraries/libc.so_src
-       @echo === init
-       @$(MAKE) all --no-print-directory -C Usermode/Applications/init_src
-       @echo === login
-       @$(MAKE) all --no-print-directory -C Usermode/Applications/login_src
-       @echo === CLIShell
-       @$(MAKE) all --no-print-directory -C Usermode/Applications/CLIShell_src
-       @echo === cat
-       @$(MAKE) all --no-print-directory -C Usermode/Applications/cat_src
-       @echo === ls
-       @$(MAKE) all --no-print-directory -C Usermode/Applications/ls_src
-       @echo === mount
-       @$(MAKE) all --no-print-directory -C Usermode/Applications/mount_src
+       
+       @for lib in $(USRLIBS); do \
+       (echo === $$lib && $(MAKE) all --no-print-directory -C Usermode/Libraries/`echo $$lib`_src) \
+       done
+       
+       @for app in $(USRAPPS); do \
+       (echo === $$app && $(MAKE) all --no-print-directory -C Usermode/Applications/`echo $$app`_src) \
+       done
+
+#      @echo === ld-acess.so
+#      @$(MAKE) all --no-print-directory -C Usermode/Libraries/ld-acess.so_src
+#      @echo === libacess.so
+#      @$(MAKE) all --no-print-directory -C Usermode/Libraries/libacess.so_src
+#      @echo === libgcc.so
+#      @$(MAKE) all --no-print-directory -C Usermode/Libraries/libgcc.so_src
+#      @echo === libc.so
+#      @$(MAKE) all --no-print-directory -C Usermode/Libraries/libc.so_src
+#      @echo === init
+#      @$(MAKE) all --no-print-directory -C Usermode/Applications/init_src
+#      @echo === login
+#      @$(MAKE) all --no-print-directory -C Usermode/Applications/login_src
+#      @echo === CLIShell
+#      @$(MAKE) all --no-print-directory -C Usermode/Applications/CLIShell_src
+#      @echo === cat
+#      @$(MAKE) all --no-print-directory -C Usermode/Applications/cat_src
+#      @echo === ls
+#      @$(MAKE) all --no-print-directory -C Usermode/Applications/ls_src
+#      @echo === mount
+#      @$(MAKE) all --no-print-directory -C Usermode/Applications/mount_src
 
 clean:
        @make clean --no-print-directory -C Kernel/
-       @make clean --no-print-directory -C Usermode/Libraries/ld-acess.so_src
-       @make clean --no-print-directory -C Usermode/Libraries/libacess.so_src
-       @make clean --no-print-directory -C Usermode/Libraries/libc.so_src
-       @make clean --no-print-directory -C Usermode/Libraries/libgcc.so_src
-       @make clean --no-print-directory -C Usermode/Applications/init_src
-       @make clean --no-print-directory -C Usermode/Applications/login_src
-       @make clean --no-print-directory -C Usermode/Applications/CLIShell_src
-       @make clean --no-print-directory -C Usermode/Applications/cat_src
-       @make clean --no-print-directory -C Usermode/Applications/ls_src
-       @make clean --no-print-directory -C Usermode/Applications/mount_src
+       
+       @for lib in $(USRLIBS); do \
+       ($(MAKE) clean --no-print-directory -C Usermode/Libraries/`echo $$lib`_src) \
+       done
+       
+       @for app in $(USRAPPS); do \
+       ($(MAKE) clean --no-print-directory -C Usermode/Applications/`echo $$app`_src) \
+       done
+
+#      @make clean --no-print-directory -C Usermode/Libraries/ld-acess.so_src
+#      @make clean --no-print-directory -C Usermode/Libraries/libacess.so_src
+#      @make clean --no-print-directory -C Usermode/Libraries/libc.so_src
+#      @make clean --no-print-directory -C Usermode/Libraries/libgcc.so_src
+#      @make clean --no-print-directory -C Usermode/Applications/init_src
+#      @make clean --no-print-directory -C Usermode/Applications/login_src
+#      @make clean --no-print-directory -C Usermode/Applications/CLIShell_src
+#      @make clean --no-print-directory -C Usermode/Applications/cat_src
+#      @make clean --no-print-directory -C Usermode/Applications/ls_src
+#      @make clean --no-print-directory -C Usermode/Applications/mount_src
index 526ff79..8c88dac 100644 (file)
@@ -34,11 +34,11 @@ struct sInterface {
        struct sInterface       *Next;
        tVFS_Node       Node;
        tAdapter        *Adapter;
-        int    Type;   // 4 for IPv4 and 6 for IPv6
+        int    Type;   // 0 for disabled, 4 for IPv4 and 6 for IPv6
        union {
                struct  {
                        tIPv6   Address;
-                        int    SubnetBits;
+                        int    SubnetBits;     //Should this be outside the union?
                }       IP6;
                
                struct {
index 9dee6e4..4489b52 100644 (file)
@@ -39,7 +39,10 @@ void Link_RegisterType(Uint16 Type, tPacketCallback Callback)
        if(i == -1)
        {
                tmp = realloc(gaRegisteredTypes, (giRegisteredTypes+1)*sizeof(*gaRegisteredTypes));
-               if(!tmp)        Panic("[NET  ] Out of heap space!");
+               if(!tmp) {
+                       Warning("[NET  ] Out of heap space!");
+                       return ;
+               }
                i = giRegisteredTypes;
                giRegisteredTypes ++;
                gaRegisteredTypes = tmp;
@@ -77,7 +80,8 @@ void Link_WatchDevice(tAdapter *Adapter)
         int    tid = Proc_SpawnWorker();       // Create a new worker thread
        
        if(tid < 0) {
-               Panic("[NET  ] Unable to create watcher thread for '%s'", Adapter->Device);
+               Warning("[NET  ] Unable to create watcher thread for '%s'", Adapter->Device);
+               return ;
        }
        
        if(tid > 0) {
index 2a22d1e..051d064 100644 (file)
@@ -52,12 +52,15 @@ int IPStack_Install(char **Arguments)
        // Install Handlers
        ARP_Initialise();
        
-       // Parse module arguments
-       for( i = 0; Arguments[i]; i++ )
+       if(Arguments)
        {
-               //if(strcmp(Arguments[i], "Device") == '=') {
-               //      
-               //}
+               // Parse module arguments
+               for( i = 0; Arguments[i]; i++ )
+               {
+                       //if(strcmp(Arguments[i], "Device") == '=') {
+                       //      
+                       //}
+               }
        }
        
        return 1;
@@ -117,9 +120,17 @@ tVFS_Node *IPStack_FindDir(tVFS_Node *Node, char *Name)
        return &iface->Node;
 }
 
-static const char *casIOCtls[] = { DRV_IOCTLNAMES, "add_interface", NULL };
+static const char *casIOCtls_Root[] = { DRV_IOCTLNAMES, "add_interface", NULL };
+static const char *casIOCtls_Iface[] = {
+       DRV_IOCTLNAMES,
+       "getset_type",
+       "get_address", "set_address",
+       "getset_subnet",
+       "get_gateway", "set_gateway",
+       NULL
+       };
 /**
- * \brief Handles IOCtls for the IPStack root
+ * \brief Handles IOCtls for the IPStack root/interfaces
  */
 int IPStack_IOCtl(tVFS_Node *Node, int ID, void *Data)
 {
@@ -139,17 +150,144 @@ int IPStack_IOCtl(tVFS_Node *Node, int ID, void *Data)
        
        case DRV_IOCTL_LOOKUP:
                if( !CheckString( Data ) )      return -1;
-               return LookupString( (char**)casIOCtls, (char*)Data );
-       
-       // --- Non-Standard IOCtls ---
-       /*
-        * add_interface
-        * - Adds a new IP interface and binds it to a device
-        */
-       case 4:
-               if( !CheckString( Data ) )      return -1;
-               return IPStack_AddInterface(Data);
+               
+               if( Node == &gIP_DriverInfo.RootNode )
+                       return LookupString( (char**)casIOCtls_Root, (char*)Data );
+               else
+                       return LookupString( (char**)casIOCtls_Iface, (char*)Data );
+       }
+       
+       if(Node == &gIP_DriverInfo.RootNode)
+       {
+               switch(ID)
+               {
+               /*
+                * add_interface
+                * - Adds a new IP interface and binds it to a device
+                */
+               case 4:
+                       if( Threads_GetUID() != 0 )     return -1;
+                       if( !CheckString( Data ) )      return -1;
+                       return IPStack_AddInterface(Data);
+               }
+               return 0;       
        }
+       else
+       {
+               tInterface      *iface = (tInterface*)Node->ImplPtr;
+               switch(ID)
+               {
+               /*
+                * getset_type
+                * - Get/Set the interface type
+                */
+               case 4:
+                       // Get Type?
+                       if( !Data )     return iface->Type;
+                       // Ok, it's set type
+                       if( Threads_GetUID() != 0 )     return -1;
+                       if( !CheckMem( Data, sizeof(int) ) )    return -1;
+                       switch( *(int*)Data )
+                       {
+                       case 0: // Disable
+                               iface->Type = 0;
+                               memset(&iface->IP6, 0, sizeof(tIPv6));  // Clear address
+                               break;
+                       case 4: // IPv4
+                               iface->Type = 4;
+                               memset(&iface->IP4, 0, sizeof(tIPv4));
+                               break;
+                       case 6: // IPv6
+                               iface->Type = 6;
+                               memset(&iface->IP6, 0, sizeof(tIPv6));
+                               break;
+                       default:
+                               return -1;
+                       }
+                       return 0;
+               
+               /*
+                * get_address
+                * - Get the interface's address
+                */
+               case 5:
+                       switch(iface->Type)
+                       {
+                       case 0: return 1;
+                       case 4:
+                               if( !CheckMem( Data, sizeof(tIPv4) ) )  return -1;
+                               memcpy( Data, &iface->IP4, sizeof(tIPv4) );
+                               return 1;
+                       case 6:
+                               if( !CheckMem( Data, sizeof(tIPv6) ) )  return -1;
+                               memcpy( Data, &iface->IP6, sizeof(tIPv6) );
+                               return 1;
+                       }
+                       return 0;
+               
+               /*
+                * set_address
+                * - Get the interface's address
+                */
+               case 6:
+                       if( Threads_GetUID() != 0 )     return -1;
+                       switch(iface->Type)
+                       {
+                       case 0: return 1;
+                       case 4:
+                               if( !CheckMem( Data, sizeof(tIPv4) ) )  return -1;
+                               iface->Type = 0;        // One very hacky mutex/trash protector
+                               memcpy( &iface->IP4, Data, sizeof(tIPv4) );
+                               iface->Type = 4;
+                               return 1;
+                       case 6:
+                               if( !CheckMem( Data, sizeof(tIPv6) ) )  return -1;
+                               iface->Type = 0;
+                               memcpy( &iface->IP6, Data, sizeof(tIPv6) );
+                               iface->Type = 6;
+                               return 1;
+                       }
+                       return 0;
+               
+               /*
+                * getset_subnet
+                * - Get/Set the bits in the address subnet
+                */
+               case 7:
+                       // Get?
+                       if( Data == NULL )
+                       {
+                               switch( iface->Type )
+                               {
+                               case 4:         return iface->IP4.SubnetBits;
+                               case 6:         return iface->IP6.SubnetBits;
+                               default:        return 0;
+                               }
+                       }
+                       
+                       // Ok, set.
+                       if( Threads_GetUID() != 0 )     return -1;
+                       if( !CheckMem(Data, sizeof(int)) )      return -1;
+                       
+                       // Check and set the subnet bits
+                       switch( iface->Type )
+                       {
+                       case 4:
+                               if( *(int*)Data < 0 || *(int*)Data > 31 )       return -1;
+                               iface->IP4.SubnetBits = *(int*)Data;
+                               return iface->IP4.SubnetBits;
+                       case 6:
+                               if( *(int*)Data < 0 || *(int*)Data > 127 )      return -1;
+                               iface->IP6.SubnetBits = *(int*)Data;
+                               return iface->IP6.SubnetBits;
+                       default:
+                               break;
+                       }
+                       
+                       return 0;
+               }
+       }
+       
        return 0;
 }
 
index 7d20cd3..a9a6d8d 100644 (file)
@@ -25,6 +25,7 @@ $(BIN): $(OBJ)
        @echo --- $(LD) -o $@
        @$(LD) -T ../link.ld -shared -nostdlib -o $@ $(OBJ)
 #      @$(LD) -shared -nostdlib -o $@ $(OBJ)
+       cp $@ $(DISTROOT)/Modules/$(NAME).kmd
        @echo --- $(LD) -o $(KOBJ)
        @$(CC) -Wl,-r -nostdlib -o $(KOBJ) $(OBJ)
 
index 0ec7739..9331f6e 100644 (file)
@@ -14,11 +14,14 @@ OBJ = main.o
 all: $(BIN)
 
 clean:
-       $(RM) $(BIN) $(OBJ)
+       $(RM) $(BIN) $(OBJ) $(BIN).dsm
 
 $(BIN): $(OBJ) Makefile
-       $(LD) $(LDFLAGS) $(OBJ) -o $(BIN)
+       @echo --- ld -o $(BIN)
+       @$(LD) $(LDFLAGS) $(OBJ) -o $(BIN)
+       $(OBJDUMP) -d $(BIN) > $(BIN).dsm
        cp $(BIN) $(DISTROOT)/SBin/
 
 %.o: %.c
-       $(CC) $(CFLAGS) -c $< -o $@
+       @echo --- cc -o $@
+       @$(CC) $(CFLAGS) -c $< -o $@
index 3473eb5..c142331 100644 (file)
@@ -5,7 +5,7 @@
 
 // === CONSTANTS ===
 #define NULL   ((void*)0)
-#define NUM_TERMS      4
+#define NUM_TERMS      1
 #define        DEFAULT_TERMINAL        "/Devices/VTerm/0"
 #define DEFAULT_SHELL  "/Acess/SBin/login"
 
 int main(int argc, char *argv[])
 {
         int    tid;
-       // int  i;
-       char    termpath[sizeof(DEFAULT_TERMINAL)+1] = DEFAULT_TERMINAL;
+        int    i;
+       char    termpath[sizeof(DEFAULT_TERMINAL)] = DEFAULT_TERMINAL;
+       char    *child_argv[2] = {DEFAULT_SHELL, 0};
        
-       //for( i = 0; i < NUM_TERMS; i++ )
-       //{
-               //termpath[ sizeof(DEFAULT_TERMINAL)-1 ] = '0' + i;
-               open(termpath, OPENFLAG_READ);  // Stdin
-               open(termpath, OPENFLAG_WRITE); // Stdout
-               open(termpath, OPENFLAG_WRITE); // Stderr
-               
+       for( i = 0; i < NUM_TERMS; i++ )
+       {               
                tid = clone(CLONE_VM, 0);
                if(tid == 0)
                {
-                       execve(DEFAULT_SHELL, NULL, NULL);
-                       for(;;) __asm__ __volatile__("hlt");
+                       termpath[sizeof(DEFAULT_TERMINAL)-2] = '0' + i;
+                       
+                       //__asm__ __volatile__ ("int $0xAC" :: "a" (256), "b" ("%s"), "c" (termpath));
+                       
+                       open(termpath, OPENFLAG_READ);  // Stdin
+                       open(termpath, OPENFLAG_WRITE); // Stdout
+                       open(termpath, OPENFLAG_WRITE); // Stderr
+                       execve(DEFAULT_SHELL, child_argv, NULL);
+                       for(;;) sleep();
                }
-       //}
+       }
        
+       // TODO: Implement message watching
        for(;;) sleep();
        
        return 42;
index 2e09392..e4a4aac 100644 (file)
@@ -3,6 +3,8 @@
 
 -include ../../../Makefile.cfg
 
+MAKEDEP  = $(CC) -M
+
 ASFLAGS  = -felf
 CPPFLAGS = -I../../include/
 CFLAGS   = -Wall -fPIC -fno-builtin -fno-stack-protector $(CPPFLAGS)
index 3118cb6..0bb0fe4 100644 (file)
@@ -20,7 +20,7 @@ clean:
 $(BIN): $(OBJ)
        @echo --- $(LD) -shared -o $@
        @$(LD) $(LDFLAGS) -o $(BIN) $(OBJ)
-       $(STRIP) $(BIN)
+       @$(STRIP) $(BIN)
        cp $(BIN) $(DISTROOT)/Libs
        
 %.ao: %.asm syscalls.inc.asm
index e16ef18..bede9ae 100644 (file)
@@ -7,5 +7,5 @@
 [extern _errno]
 
 [section .text]
-SYSCALL0       _SysGetPhys, SYS_GETPHYS        ; uint64_t _SysGetPhys(uint addr)
+SYSCALL1       _SysGetPhys, SYS_GETPHYS        ; uint64_t _SysGetPhys(uint addr)
 SYSCALL1       _SysAllocate, SYS_ALLOCATE      ; uint64_t _SysAllocate(uint addr)
index 77c3078..deb9751 100644 (file)
@@ -10,9 +10,9 @@
 SYSCALL2       open, SYS_OPEN  ; char*, int
 SYSCALL3       reopen, SYS_REOPEN      ; int, char*, int
 SYSCALL1       close, SYS_CLOSE        ; int
-SYSCALL4       read, SYS_READ  ; int, int64_t, void*
-SYSCALL4       write, SYS_WRITE        ; int, int64_t, void*
-SYSCALL4       seek, SYS_SEEK          ; int, int64_t, int
+SYSCALL3       read, SYS_READ  ; int, uint, void*
+SYSCALL3       write, SYS_WRITE        ; int, uint, void*
+SYSCALL4       seek, SYS_SEEK          ; int, uint64_t, int
 SYSCALL1       tell, SYS_TELL          ; int
 SYSCALL3       finfo, SYS_FINFO        ; int, void*, int
 SYSCALL2       readdir, SYS_READDIR    ; int, char*
index f9895a8..ada3088 100644 (file)
@@ -8,23 +8,24 @@ CFLAGS   +=
 ASFLAGS  +=\r
 LDFLAGS  += -soname libc.so.1 -Map map.txt -lgcc\r
 \r
-OBJ_LIBC = heap.o stdlib.o stub.o env.o fileIO.o string.o\r
+OBJ = stub.o heap.o stdlib.o env.o fileIO.o string.o\r
+DEPFILES := $(OBJ:%.o=%.d)\r
 # signals.o\r
 BIN = ../libc.so.1\r
 \r
 .PHONY:        all clean\r
 \r
-all: $(BIN) $(OBJ_LIBC)\r
+all: $(BIN)\r
 \r
 clean:\r
-       $(RM) $(BIN) ../libc.so $(OBJ_LIBC) libc.so.1.dsm libc.so.1.dmp map.txt\r
+       $(RM) $(BIN) ../libc.so $(OBJ) $(DEPFILES) libc.so.1.dsm libc.so.1.dmp map.txt\r
 \r
 # Core C Library\r
-$(BIN): $(OBJ_LIBC)\r
+$(BIN): $(OBJ)\r
        @echo --- ld -shared -o $@\r
-       @$(LD) $(LDFLAGS) $(OBJ_LIBC) -o $@\r
-       $(OBJDUMP) -d $@ > libc.so.1.dsm\r
-       $(OBJDUMP) -x -r -R $@ > libc.so.1.dmp\r
+       @$(LD) $(LDFLAGS) $(OBJ) -o $@\r
+       @$(OBJDUMP) -d $@ > libc.so.1.dsm\r
+       @$(OBJDUMP) -x -r -R $@ > libc.so.1.dmp\r
        cp ../libc.so.1 ../libc.so\r
        cp ../libc.so.1 $(DISTROOT)/Libs/\r
 \r
@@ -33,10 +34,11 @@ $(BIN): $(OBJ_LIBC)
        @echo --- $(AS) -o $@\r
        @$(AS) $(ASFLAGS) -o $@ $<\r
 \r
-$(filter %.o, $(OBJ_LIBC)): %.o: %.c config.h\r
+$(filter %.o, $(OBJ)): %.o: %.c\r
        @echo --- $(CC) -o $@\r
        @$(CC) $(CFLAGS) -DBUILD_SO -o $@ -c $<\r
+       @$(MAKEDEP) $(CPPFLAGS) -MT $@ -o $*.d $<\r
 \r
-$(filter %.ao, $(OBJ_LIBC)): %.ao: %.asm\r
+$(filter %.ao, $(OBJ)): %.ao: %.asm\r
        @echo --- $(AS) -o $@\r
        @$(AS) $(ASFLAGS) -o $@ $<\r
index 10cdb24..499d24c 100644 (file)
@@ -140,7 +140,10 @@ EXPORT void *malloc(size_t bytes)
 */\r
 EXPORT void free(void *mem)\r
 {\r
-       heap_head       *head = mem;\r
+       heap_head       *head = (void*)((intptr_t)mem-sizeof(heap_head));\r
+       \r
+       // Sanity please!\r
+       if(!mem)        return;\r
        \r
        if(head->magic != MAGIC)        //Valid Heap Address\r
                return;\r
@@ -148,19 +151,19 @@ EXPORT void free(void *mem)
        head->magic = MAGIC_FREE;\r
        \r
        //Unify Right\r
-       if((Uint)head + head->size < (Uint)_heap_end)\r
+       if((intptr_t)head + head->size < (intptr_t)_heap_end)\r
        {\r
-               heap_head       *nextHead = (heap_head*)((Uint)head + head->size);\r
+               heap_head       *nextHead = (heap_head*)((intptr_t)head + head->size);\r
                if(nextHead->magic == MAGIC_FREE) {     //Is the next block free\r
                        head->size += nextHead->size;   //Amalgamate\r
                        nextHead->magic = 0;    //For Security\r
                }\r
        }\r
        //Unify Left\r
-       if((Uint)head - sizeof(heap_foot) > (Uint)_heap_start)\r
+       if((intptr_t)head - sizeof(heap_foot) > (intptr_t)_heap_start)\r
        {\r
                heap_head       *prevHead;\r
-               heap_foot       *prevFoot = (heap_foot *)((Uint)head - sizeof(heap_foot));\r
+               heap_foot       *prevFoot = (heap_foot *)((intptr_t)head - sizeof(heap_foot));\r
                if(prevFoot->magic == MAGIC) {\r
                        prevHead = prevFoot->header;\r
                        if(prevHead->magic == MAGIC_FREE) {\r
@@ -304,10 +307,12 @@ EXPORT int IsHeap(void *ptr)
  */\r
 static void *FindHeapBase()\r
 {\r
+       #if 0\r
        #define MAX             0xC0000000      // Address\r
        #define THRESHOLD       512     // Pages\r
        uint    addr;\r
        uint    stretch = 0;\r
+       uint64_t        tmp;\r
        \r
        // Scan address space\r
        for(addr = 0;\r
@@ -315,17 +320,25 @@ static void *FindHeapBase()
                addr += 0x1000\r
                )\r
        {\r
-               if( _SysGetPhys(addr) == 0 ) {\r
+               tmp = _SysGetPhys(addr);\r
+               if( tmp != 0 ) {\r
                        stretch = 0;\r
                } else {\r
                        stretch ++;\r
                        if(stretch > THRESHOLD)\r
                        {\r
-                               return (void*)( addr + stretch*0x1000 );\r
+                               return (void*)( addr - stretch*0x1000 );\r
                        }\r
                }\r
+               //__asm__ __volatile__ (\r
+               //      "push %%ebx;mov %%edx,%%ebx;int $0xAC;pop %%ebx"\r
+               //      ::"a"(256),"d"("%x"),"c"(addr));\r
        }\r
+       \r
        return NULL;\r
+       #else\r
+       return (void*)0x00900000;\r
+       #endif\r
 }\r
 \r
 LOCAL uint brk(Uint newpos)\r
index 0233b97..9f629ba 100644 (file)
@@ -4,8 +4,12 @@
 #include "stdio_int.h"\r
 #include "lib.h"\r
 \r
+#define USE_CPUID      0\r
+\r
 // === PROTOTYPES ===\r
+#if USE_CPUID\r
 static void    cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX);\r
+#endif\r
 \r
 // === GLOBALS ===\r
 extern char **_envp;\r
@@ -14,7 +18,9 @@ extern struct sFILE   *stdin;
 extern struct sFILE    *stdout;\r
 extern struct sFILE    *stderr;\r
 // --- CPU Features ---\r
+#if USE_CPUID\r
 tCPUID gCPU_Features;\r
+#endif\r
 \r
 // === CODE ===\r
 /**\r
@@ -38,19 +44,20 @@ int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp)
        stderr = &_iob[2];\r
        stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE;\r
        \r
-       /*\r
+       #if USE_CPUID\r
        {\r
                uint32_t        ecx, edx;\r
                cpuid(1, NULL, NULL, &edx, &ecx);\r
                gCPU_Features.SSE  = edx & (1 << 25);   // SSE\r
                gCPU_Features.SSE2 = edx & (1 << 26);   // SSE2\r
        }\r
-       */\r
+       #endif\r
        \r
        return 1;\r
 }\r
 \r
 \r
+#if USE_CPUID\r
 /**\r
  * \brief Call the CPUID opcode\r
  */\r
@@ -69,3 +76,4 @@ static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uin
        if(EDX) *EDX = edx;\r
        if(ECX) *ECX = ecx;\r
 }\r
+#endif\r
index a1bdbbb..f7deac7 100644 (file)
@@ -75,8 +75,8 @@ extern int    chdir(const char *dir);
 extern int     open(const char *path, int flags);
 extern int     reopen(int fd, const char *path, int flags);
 extern void    close(int fd);
-extern uint64_t        read(int fd, uint64_t length, void *buffer);
-extern uint64_t        write(int fd, uint64_t length, void *buffer);
+extern uint    read(int fd, uint length, void *buffer);
+extern uint    write(int fd, uint length, void *buffer);
 extern int     seek(int fd, uint64_t offset, int whence);
 extern uint64_t        tell(int fd);
 extern int     ioctl(int fd, int id, void *data);

UCC git Repository :: git.ucc.asn.au