Fixed bug where system would lock if a user task segfaulted (forgot to sti)
authorJohn Hodge <[email protected]>
Fri, 2 Oct 2009 15:45:43 +0000 (23:45 +0800)
committerJohn Hodge <[email protected]>
Fri, 2 Oct 2009 15:45:43 +0000 (23:45 +0800)
Cosmetic fix to login shell
Ignored tabs in CLI Shell

Kernel/arch/x86/mm_virt.c
Kernel/drv/vterm.c
Kernel/threads.c
Usermode/Applications/CLIShell_src/main.c
Usermode/Applications/login_src/main.c

index 3663d60..c930947 100644 (file)
@@ -128,7 +128,8 @@ void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs)
        
        // If it was a user, tell the thread handler
        if(ErrorCode & 4) {
-               Warning("User Pagefault: Instruction at %p accessed %p\n", Regs->eip, Addr);
+               Warning("User Pagefault: Instruction at %p accessed %p", Regs->eip, Addr);
+               __asm__ __volatile__ ("sti");   // Restart IRQs
                Threads_SegFault(Addr);
                return ;
        }
index b1d5181..1e7138d 100644 (file)
@@ -505,6 +505,8 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
                        Term->Text[ Term->WritePos ].Colour = Term->CurColour;
                        Term->WritePos --;
                } while(Term->WritePos && i-- && Term->Text[ Term->WritePos ].Ch == '\0');
+               if(Term->Text[ Term->WritePos ].Ch != '\0')
+                       Term->WritePos ++;
                break;
        
        default:
index e244139..dd7cfcd 100644 (file)
@@ -265,7 +265,12 @@ int Threads_WaitTID(int TID, int *status)
                tThread *t = Threads_GetThread(TID);
                 int    initStatus = t->Status;
                 int    ret;
-               while(t->Status == initStatus)  Threads_Yield();
+               
+               if(initStatus != THREAD_STAT_ZOMBIE)
+                       while(t->Status == initStatus) {
+                               Threads_Yield();
+                       }
+               
                ret = t->RetStatus;
                switch(t->Status)
                {
@@ -362,6 +367,7 @@ void Threads_Exit(int TID, int Status)
                Threads_Kill( Proc_GetCurThread(), (Uint)Status & 0xFF );
        else
                Threads_Kill( Threads_GetThread(TID), (Uint)Status & 0xFF );
+       for(;;) HALT(); // Just in case
 }
 
 /**
@@ -433,6 +439,9 @@ void Threads_Kill(tThread *Thread, int Status)
        // Release spinlocks
        RELEASE( &Thread->IsLocked );   // Released first so that it IS released
        RELEASE( &giThreadListLock );
+       
+       //Log("Thread %i went *hurk*", Thread->TID);
+       
        if(Status != -1)        HALT();
 }
 
@@ -689,6 +698,6 @@ tThread *Threads_GetNextToRun(int CPU)
 void Threads_SegFault(tVAddr Addr)
 {
        //Threads_SendSignal( Proc_GetCurThread()->TID, SIGSEGV );
-       Log("Thread #%i committed a segfault at address %p\n", Proc_GetCurThread()->TID, Addr);
-       Threads_Exit( 0, 0 );
+       Warning("Thread #%i committed a segfault at address %p", Proc_GetCurThread()->TID, Addr);
+       Threads_Exit( 0, -1 );
 }
index a8db5ad..914557a 100644 (file)
@@ -144,7 +144,7 @@ char *ReadCommandLine(int *Length)
        // Read In Command Line\r
        do {\r
                read(_stdin, 1, &ch);   // Read Character from stdin (read is a blocking call)\r
-               // Ignore control characters\r
+               // Control characters\r
                if(ch == '\x1B') {\r
                        read(_stdin, 1, &ch);   // Read control character\r
                        switch(ch)\r
@@ -174,6 +174,13 @@ char *ReadCommandLine(int *Length)
                        write(_stdout, 1, &ch);\r
                        continue;\r
                }\r
+               // Tab\r
+               if(ch == '\t') {\r
+                       //TODO: Implement Tab-Completion\r
+                       //Currently just ignore tabs\r
+                       continue;\r
+               }\r
+               \r
                // Expand Buffer\r
                if(len > space) {\r
                        space += 256;\r
index 2e4906d..248e13b 100644 (file)
@@ -26,7 +26,6 @@ int main(int argc, char *argv[])
                        if(uid == -1)   printf("\n");
                        sUsername = GetUsername();
                        sPassword = GetPassword();
-                       printf("\n");
                } while( (uid = ValidateUser(sUsername, sPassword)) == -1 );
                printf("\n");
                

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