Fixed Segfault if execve fails, fixed errors in LibC pertaining to stdin,... not...
authorJohn Hodge <[email protected]>
Wed, 30 Sep 2009 14:29:48 +0000 (22:29 +0800)
committerJohn Hodge <[email protected]>
Wed, 30 Sep 2009 14:29:48 +0000 (22:29 +0800)
Kernel/binary.c
Kernel/threads.c
Usermode/Libraries/libc.so_src/fileIO.c
Usermode/Libraries/libc.so_src/heap.c
Usermode/Libraries/libc.so_src/stub.c

index 04dfed2..1884af8 100644 (file)
@@ -24,6 +24,7 @@ typedef struct sKernelBin {
 // === IMPORTS ===\r
 extern int     Proc_Clone(Uint *Err, Uint Flags);\r
 extern void    Threads_SetName(char *Name);\r
+extern char    *Threads_GetName(int ID);\r
 extern Uint    MM_ClearUser();\r
 extern void    Threads_Exit();\r
 extern void    Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char **EnvP, int DataSize);\r
@@ -145,7 +146,7 @@ int Proc_Execve(char *File, char **ArgV, char **EnvP)
        free(savedFile);\r
        if(bases[0] == 0)\r
        {\r
-               Warning("Proc_Execve - Unable to load '%s'", File);\r
+               Warning("Proc_Execve - Unable to load '%s'", Threads_GetName(-1));\r
                Threads_Exit();\r
                for(;;);\r
        }\r
index d55bd2d..54438c3 100644 (file)
@@ -20,6 +20,7 @@ extern int    Proc_Clone(Uint *Err, Uint Flags);
 // === PROTOTYPES ===
 void   Threads_Init();
 void   Threads_SetName(char *NewName);
+char   *Threads_GetName(int ID);
 void   Threads_SetTickets(int Num);
  int   Threads_WaitTID(int TID, int *status);
 tThread        *Threads_GetThread(Uint TID);
@@ -117,6 +118,18 @@ void Threads_SetName(char *NewName)
        strcpy(cur->ThreadName, NewName);
 }
 
+/**
+ * \fn char *Threads_GetName(int ID)
+ * \brief Gets a thread's name
+ */
+char *Threads_GetName(int ID)
+{
+       if(ID == -1) {
+               return Proc_GetCurThread()->ThreadName;
+       }
+       return NULL;
+}
+
 /**
  * \fn void Threads_SetTickets(int Num)
  * \brief Sets the 'priority' of a task
index c1a47ff..b8cdb11 100644 (file)
@@ -21,9 +21,10 @@ struct sFILE *get_file_struct();
 \r
 // === GLOBALS ===\r
 struct sFILE   _iob[STDIO_MAX_STREAMS];        // IO Buffer\r
-struct sFILE   *stdin = &_iob[0];      // Standard Input\r
-struct sFILE   *stdout = &_iob[1];     // Standard Output\r
-struct sFILE   *stderr = &_iob[2];     // Standard Error\r
+struct sFILE   *stdin; // Standard Input\r
+struct sFILE   *stdout;        // Standard Output\r
+struct sFILE   *stderr;        // Standard Error\r
+///\note Initialised in SoMain\r
 \r
 // === CODE ===\r
 /**\r
@@ -303,6 +304,10 @@ EXPORT void sprintfv(char *buf, const char *format, va_list args)
                        itoa(tmp, arg, 10, minSize, pad);\r
                        goto sprintf_puts;\r
                //      break;\r
+               case 'p':       // Pointer\r
+                       buf[pos++] = '*';\r
+                       buf[pos++] = '0';\r
+                       buf[pos++] = 'x';\r
                case 'x':\r
                        itoa(tmp, arg, 16, minSize, pad);\r
                        goto sprintf_puts;\r
@@ -396,6 +401,8 @@ EXPORT int ssprintfv(char *format, va_list args)
                case 'u':\r
                        itoa(tmp, arg, 10, minSize, pad);\r
                        goto sprintf_puts;\r
+               case 'p':       // Pointer\r
+                       len += 3;\r
                case 'x':\r
                        itoa(tmp, arg, 16, minSize, pad);\r
                        goto sprintf_puts;\r
@@ -458,7 +465,7 @@ EXPORT void itoa(char *buf, unsigned long num, int base, int minLength, char pad
  */\r
 EXPORT int printf(const char *format, ...)\r
 {\r
-       #if 0\r
+       #if 1\r
         int    size;\r
        char    *buf;\r
        va_list args;\r
@@ -479,7 +486,8 @@ EXPORT int printf(const char *format, ...)
        \r
        free(buf);\r
        return size;\r
-       #endif\r
+       \r
+       #else\r
        \r
         int    ret;\r
        va_list args;\r
@@ -487,6 +495,7 @@ EXPORT int printf(const char *format, ...)
        ret = fprintfv(stdout, (char*)format, args);\r
        va_end(args);\r
        return ret;\r
+       #endif\r
 }\r
 \r
 /**\r
index 6832738..10cdb24 100644 (file)
@@ -53,7 +53,7 @@ EXPORT void *malloc(size_t bytes)
        \r
        // Initialise Heap\r
        if(_heap_start == NULL)\r
-       {LOCAL void     *sbrk(int delta);\r
+       {\r
                _heap_start = sbrk(0);\r
                _heap_end = _heap_start;\r
                extendHeap(HEAP_INIT_SIZE);\r
@@ -208,10 +208,10 @@ EXPORT void *realloc(void *oldPos, size_t bytes)
 }\r
 \r
 /**\r
- \fn LOCAL void *extendHeap(int bytes)\r
- \brief Create a new block at the end of the heap area\r
\param bytes  Integer - Size reqired\r
- \return Pointer to last free block\r
\fn LOCAL void *extendHeap(int bytes)\r
\brief Create a new block at the end of the heap area\r
* \param bytes        Integer - Size reqired\r
\return Pointer to last free block\r
  */\r
 \r
 LOCAL void *extendHeap(int bytes)\r
index acb3653..a10d9d1 100644 (file)
@@ -5,6 +5,9 @@
 \r
 extern char **_envp;\r
 extern struct sFILE    _iob[];\r
+extern struct sFILE    *stdin;\r
+extern struct sFILE    *stdout;\r
+extern struct sFILE    *stderr;\r
 \r
 /**\r
  * \fn int SoMain()\r
@@ -20,9 +23,12 @@ int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp)
        _envp = envp;\r
        \r
        // Init FileIO Pointers\r
-       _iob[0].FD = 0; _iob[0].Flags = FILE_FLAG_MODE_READ;\r
-       _iob[1].FD = 1; _iob[1].Flags = FILE_FLAG_MODE_WRITE;\r
-       _iob[2].FD = 2; _iob[2].Flags = FILE_FLAG_MODE_WRITE;\r
+       stdin = &_iob[0];\r
+       stdin->FD = 0;  stdin->Flags = FILE_FLAG_MODE_READ;\r
+       stdout = &_iob[1];\r
+       stdout->FD = 1; stdout->Flags = FILE_FLAG_MODE_WRITE;\r
+       stderr = &_iob[2];\r
+       stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE;\r
        \r
        return 1;\r
 }\r

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