Fixed return type of strnlen(), removed sseek, swrite, added debug stmts
authorKevin Klues <klueska@cs.berkeley.edu>
Wed, 27 May 2009 22:32:41 +0000 (15:32 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Fri, 5 Jun 2009 00:59:06 +0000 (17:59 -0700)
Changed the return type of strnlen() to be size_t instead of int.
Removed sseek and swrite from newlib_backend, as well as added in
  the function prototypes for the 19 syscall wrappers.
Added in debugging print statements into the various calls, and redefined
  debug to print nothing.

kern/src/Makefrag
kern/src/manager.c
user/parlib/inc/debug.h
user/parlib/inc/newlib_backend.h
user/parlib/src/newlib_backend.c

index 0e3338c..8b820cb 100644 (file)
@@ -40,7 +40,7 @@ KERN_SRCFILES := $(KERN_SRC_DIR)/entry.S \
 KERN_SRCFILES := $(wildcard $(KERN_SRCFILES))
 
 KERN_APPFILES :=       $(USER_APPS_ROSLIB_DIR)/null \
-                    $(USER_APPS_ROSLIB_DIR)/hello 
+                    $(USER_APPS_PARLIB_DIR)/hello 
 #                                      $(USER_APPS_ROSLIB_DIR)/hello \
 #                                      apps/hello \
 #                                      apps_newlib/null \
index 582f498..df97bd5 100644 (file)
@@ -43,7 +43,7 @@ void manager(void)
        switch (progress++) {
                case 0:
                        for (int i = 2; i < 8; i++)
-                               env_batch[i] = ENV_CREATE(roslib_hello);
+                               env_batch[i] = ENV_CREATE(parlib_hello);
                        for (int i = 2; i < 8; i++)
                                smp_call_function_single(i, run_env_handler, env_batch[i], 0);
                        int count = 0;
index 1a82469..801a706 100644 (file)
@@ -14,7 +14,7 @@ typedef void * TRUSTED va_list;
 
 #define va_end(ap)  ((void)0)
 
-int    strnlen(const char *s, size_t size);
+size_t strnlen(const char *s, size_t size);
 void debugfmt(void (*putch)(int, void**), void **putdat, const char *NTS fmt, ...);
 void vdebugfmt(void (*putch)(int, void**), void **putdat, const char *NTS fmt, va_list);
 
index ce28961..51c150d 100644 (file)
@@ -85,4 +85,120 @@ byte *send_message(byte *message, int len);
  */
 int write_to_channel(byte * msg, int len);
 
+/* _exit()
+ * Exit a program without cleaning up files. 
+ * If your system doesn't provide this, it is best to avoid linking 
+ * with subroutines that require it (exit, system).
+ */
+void _exit(int __status);
+    
+/* close()
+ * Close a file. 
+ */
+int close(int file);
+
+/* execve()
+ * Transfer control to a new process. 
+ * Minimal implementation (for a system without processes).
+ */
+
+int execve(char *name, char **argv, char **env);
+
+/* fork()
+ * Create a new process. 
+ * Minimal implementation (for a system without processes).
+ */
+int fork(void);
+
+/* fstat()
+ * Status of an open file. 
+ * For consistency with other minimal implementations in these stubs, 
+ * all files are regarded as character special devices. 
+ * The sys/stat.h header file required is distributed in the include 
+ * subdirectory for the newlib C library.
+ */
+int fstat(int file, struct stat *st);
+
+/* getpid()
+ * Process-ID; this is sometimes used to generate strings unlikely to 
+ * conflict with other processes. Minimal implementation, for a system 
+ * without processes.
+ */
+int getpid(void); 
+
+/* isatty()
+ * Query whether output stream is a terminal. 
+ * For consistency with the other minimal implementations, 
+ * which only support output to stdout, this minimal 
+ * implementation is suggested.
+ */
+int isatty(int file) ;
+
+/* kill()
+ * Send a signal. 
+ * Minimal implementation.
+ */
+int kill(int pid, int sig); 
+
+/* link()
+ * Establish a new name for an existing file. 
+ * Minimal implementation.
+ */
+int link(char *old, char *new);
+
+/* lseek()
+ * Set position in a file. 
+ * Minimal implementation.
+ */
+int lseek(int file, int ptr, int dir); 
+
+/* open()
+ * Open a file. 
+ */
+int open(const char *name, int flags, int mode); 
+
+/* read()
+ * Read from a file. 
+ */
+int read(int file, char *ptr, int len); 
+
+/* sbrk()
+ * Increase program data space. 
+ * As malloc and related functions depend on this, it is 
+ * useful to have a working implementation. 
+ * The following suffices for a standalone system; it exploits the 
+ * symbol _end automatically defined by the GNU linker.
+ */
+caddr_t sbrk(int incr); 
+
+/* stat()
+ * Status of a file (by name). 
+ * Minimal implementation.
+ */
+int stat(char *file, struct stat *st);
+
+/* times()
+ * Timing information for current process. 
+ * Minimal implementation.
+ */
+int times(struct tms *buf); 
+
+/* unlink()
+ * Remove a file's directory entry. 
+ * Minimal implementation.
+ */
+int unlink(char *name); 
+
+/* wait()
+ * Wait for a child process. 
+ * Minimal implementation.
+ */
+int wait(int *status); 
+
+/* write()
+ * Write to a file. 
+ */
+int write(int file, char *ptr, int len);
+
 #endif //_NEWLIB_LIBC_WRAPPERS_H_
+
index 4f6212c..57d41a1 100644 (file)
 #include <malloc.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <debug.h>
+
+int debug(const char *fmt, ...) {
+       return 0;
+}
+
 
 /* environ
  * A pointer to a list of environment variables and their values. 
@@ -36,6 +42,8 @@ void _exit(int __status) _ATTRIBUTE ((noreturn))
  */
 int close(int file) 
 {
+       debug("CLOSE\n");
+
        // Allocate a new buffer of proper size
        byte *out_msg = malloc(CLOSE_MESSAGE_FIXED_SIZE);
        if(out_msg == NULL)
@@ -74,6 +82,7 @@ int close(int file)
 
 int execve(char *name, char **argv, char **env) 
 {
+       debug("EXECVE\n");
        errno = ENOMEM;
        return -1;
 }
@@ -84,6 +93,7 @@ int execve(char *name, char **argv, char **env)
  */
 int fork(void) 
 {
+       debug("FORK\n");
        errno = EAGAIN;
     return -1;
 }
@@ -97,7 +107,13 @@ int fork(void)
  */
 int fstat(int file, struct stat *st) 
 {
+       debug("FSTAT\n");       
+       debug("\tfile: %u\n", file);
        st->st_mode = S_IFCHR;
+       
+       // stdout hack
+       if (file == 1)
+               st->st_mode = 8592;
        return 0;
 }
 
@@ -119,6 +135,8 @@ int getpid(void)
  */
 int isatty(int file) 
 {
+       debug("ISATTY\n");
+       debug("\tfile: %u\n", file);
        return 1;
 }
 
@@ -128,6 +146,7 @@ int isatty(int file)
  */
 int kill(int pid, int sig) 
 {
+       debug("KILL\n");
        errno = EINVAL;
     return -1;
 }
@@ -138,6 +157,7 @@ int kill(int pid, int sig)
  */
 int link(char *old, char *new) 
 {
+       debug("LINK\n");
        errno = EMLINK;
        return -1;
 }
@@ -148,6 +168,7 @@ int link(char *old, char *new)
  */
 int lseek(int file, int ptr, int dir) 
 {
+       debug("LSEEK\n");
        return 0;
 }
 
@@ -156,6 +177,8 @@ int lseek(int file, int ptr, int dir)
  */
 int open(const char *name, int flags, int mode) 
 {
+       debug("OPEN\n");
+
        int s_len = strlen(name) + 1; // Null terminator
        int out_msg_len = OPEN_MESSAGE_FIXED_SIZE + s_len;
 
@@ -204,6 +227,8 @@ int open(const char *name, int flags, int mode)
  */
 int read(int file, char *ptr, int len) 
 {
+       debug("READ\n");
+
        // Allocate a new buffer of proper size
        byte *out_msg = (byte*)malloc(READ_MESSAGE_FIXED_SIZE);
        if (out_msg == NULL)
@@ -279,7 +304,10 @@ int read_from_channel(byte * buf, int len, int peek)
  */
 caddr_t sbrk(int incr) 
 {
-       #define HEAP_SIZE 1000
+       debug("SBRK\n");
+       debug("\tincr: %u\n", incr);    
+
+       #define HEAP_SIZE 4096
        static uint8_t array[HEAP_SIZE];
        static uint8_t* heap_end = array;
        static uint8_t* stack_ptr = &(array[HEAP_SIZE-1]);
@@ -291,8 +319,9 @@ caddr_t sbrk(int incr)
                errno = ENOMEM;
                return (void*)-1;
        }
-      
+     
        heap_end += incr;
+       debug("\treturning: %u\n", prev_heap_end);
        return (caddr_t) prev_heap_end;
 }
 
@@ -417,6 +446,7 @@ byte *send_message(byte *message, int len)
  */
 int stat(char *file, struct stat *st) 
 {
+       debug("STAT\n");
        st->st_mode = S_IFCHR;
        return 0;
 }
@@ -427,6 +457,7 @@ int stat(char *file, struct stat *st)
  */
 int times(struct tms *buf) 
 {
+       debug("TIMES");
        return -1;
 }
 
@@ -436,6 +467,7 @@ int times(struct tms *buf)
  */
 int unlink(char *name) 
 {
+       debug("UNLINK\n");
        errno = ENOENT;
        return -1;
 }
@@ -446,6 +478,7 @@ int unlink(char *name)
  */
 int wait(int *status) 
 {
+       debug("WAIT\n");
        errno = ECHILD;
        return -1;
 }
@@ -454,6 +487,9 @@ int wait(int *status)
  * Write to a file. 
  */
 int write(int file, char *ptr, int len) {
+       
+       debug("WRITE\n");       
+       debug("\tFILE: %u\n", file);
        if(file == 1) //STDOUT_FILENO
                return sys_cputs(ptr, len);