All programs should die gracefully now since fixing sbrk to return -1
authorKevin Klues <klueska@cs.berkeley.edu>
Fri, 22 May 2009 22:46:56 +0000 (15:46 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Tue, 26 May 2009 03:37:33 +0000 (20:37 -0700)
Before, sbrk was trying to actually do something facny which caused us to die because I just pulle
dthis implementation off the newlib page.  I just make it die now returing the proper return value
indicating no memory is available.  This way we can compile/run a printf based applications (which
doesnt' actually print anything), but at least it doesnt case a page fault or an invalid opcode trap
as it was doing before...

kern/Makefrag
newlib/libc_wrappers.c
newlib/libc_wrappers.h

index 12d9c15..714ed06 100644 (file)
@@ -41,10 +41,10 @@ KERN_SRCFILES :=    kern/entry.S \
 # Only build files if they exist.
 KERN_SRCFILES := $(wildcard $(KERN_SRCFILES))
 
-KERN_BINFILES :=       user/null \
-                                       user/hello \
-                                       user_newlib/hello \
-                                       user_newlib/null \
+KERN_BINFILES :=       user_newlib/hello
+#                                      user/null \
+#                                      user/hello \
+#                                      user_newlib/null \
 #                              user/hello \
 #                              user/buggyhello \
 #                              user/evilhello \
index 59bd4fa..edb355c 100644 (file)
@@ -1,4 +1,7 @@
+/* See COPYRIGHT for copyright information. */
+/* Kevin Klues <klueska@cs.berkeley.edu>       */
 
+#include <inc/lib.h>
 #include <newlib/libc_wrappers.h>
 
 /* environ
@@ -7,6 +10,7 @@
  */
 char *__env[1] = { 0 };
 char **environ = __env;
+extern env_t* env;
 
 /* _exit()
  * Exit a program without cleaning up files. 
@@ -15,6 +19,7 @@ char **environ = __env;
  */
 void _exit() 
 {
+       sys_env_destroy(env->env_id);
 }
     
 /* close()
@@ -67,7 +72,7 @@ int fstat(int file, struct stat *st)
  */
 int getpid(void) 
 {
-       return 1;
+       return env->env_id;
 }
 
 /* isatty()
@@ -146,22 +151,8 @@ int read(int file, char *ptr, int len)
  */
 caddr_t sbrk(int incr) 
 {
-       extern char _end;               /* Defined by the linker */
-       static char *heap_end;
-       char *prev_heap_end;
-
-       if (heap_end == 0) {
-               heap_end = &_end;
-       }
-       prev_heap_end = heap_end;
-       /*
-       if (heap_end + incr > stack_ptr) {
-               write (1, "Heap and stack collision\n", 25);
-               abort();
-       }
-       */
-       heap_end += incr;
-       return (caddr_t) prev_heap_end;
+       errno = ENOMEM;
+       return (void*)-1;
 }
 
 /* stat()
@@ -216,17 +207,12 @@ int wait(int *status)
  */
 #define outbyte(arg)
 int write(int file, char *ptr, int len) {
-       int todo;
-
-       for (todo = 0; todo < len; todo++) {
-               outbyte (*ptr++);
-       }
-       return len;
+       return 0;
 }
 
 /* __swrite64()
  * Write to a file. 
  */
 int __swrite64(int file, char *ptr, int len) {
-       return len;
+       return 0;
 }
index 3dddb54..b8ecc2e 100644 (file)
@@ -1,3 +1,8 @@
+/* See COPYRIGHT for copyright information. */
+/* Kevin Klues <klueska@cs.berkeley.edu>       */
+
+#ifndef _NEWLIB_LIBC_WRAPPERS_H
+#define _NEWLIB_LIBC_WRAPPERS_H_
 
 #include <errno.h>
 #include <sys/stat.h>
@@ -135,3 +140,5 @@ int wait(int *status);
  * manufacturer) to actually perform the output.
  */
 int write(int file, char *ptr, int len);
+
+#endif //_NEWLIB_LIBC_WRAPPERS_H_
\ No newline at end of file