Implemented the bodies of the serial read/write syscalls on both user/kernel...
authorKevin Klues <klueska@cs.berkeley.edu>
Thu, 28 May 2009 10:11:52 +0000 (03:11 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Fri, 5 Jun 2009 00:59:07 +0000 (17:59 -0700)
    We should consider creating a kern/serial.c file for serial stuff instead of bundling it in
    console.c

include/arch/console.h
include/ros/syscall.h
kern/src/console.c
kern/src/syscall.c
user/parlib/src/newlib_backend.c
user/parlib/src/syscall.c

index e6528dc..404a760 100644 (file)
@@ -23,5 +23,7 @@ int cons_getc(void);
 
 void kbd_intr(void); // irq 1
 void serial_intr(void); // irq 4
+void serial_send_byte(uint8_t b);
+uint8_t serial_read_byte();
 
 #endif /* _CONSOLE_H_ */
index 4af4c05..5593b0e 100644 (file)
@@ -8,7 +8,9 @@
 /* system call numbers */
 enum
 {
-       SYS_null = 1,
+       SYS_begofcalls, //Should always be first
+
+       SYS_null,
        SYS_cache_buster,
        SYS_cache_invalidate,
        SYS_cputs,
@@ -18,8 +20,10 @@ enum
        SYS_env_destroy,
        SYS_serial_write,
        SYS_serial_read,
+
+       SYS_endofcalls //Should always be last
 };
-#define NSYSCALLS (SYS_env_destroy)
+#define NSYSCALLS (SYS_endofcalls -1)
 // syscall number starts at 1 and goes up to NSYSCALLS, without holes.
 #define INVALID_SYSCALL(syscallno) ((syscallno) > NSYSCALLS)
 
index 4368dd2..5c40348 100644 (file)
@@ -44,6 +44,10 @@ serial_proc_data(void)
        return inb(COM1+COM_RX);
 }
 
+uint8_t serial_read_byte() {
+       return serial_proc_data();
+}
+
 void
 serial_intr(void)
 {
@@ -79,8 +83,7 @@ serial_init(void)
 
 }
 
-static void
-serial_send_byte(uint8_t b)
+void serial_send_byte(uint8_t b)
 {
        while (!(inb(COM1+COM_LSR) & COM_LSR_READY));
        outb(COM1, b);
@@ -504,7 +507,7 @@ cons_getc(void)
        // poll for any pending input characters,
        // so that this function works even when interrupts are disabled
        // (e.g., when called from the kernel monitor).
-       serial_intr();
+       //serial_intr();
        kbd_intr();
 
        // grab the next character from the input buffer.
@@ -521,7 +524,7 @@ cons_getc(void)
 void
 cons_putc(int c)
 {
-       serial_putc(c);
+       //serial_putc(c);
        //lpt_putc(c);
        cga_putc(c);
 }
index 9e1a71e..a755c29 100644 (file)
@@ -38,15 +38,21 @@ static void sys_null(void)
 //Write a buffer over the serial port
 static error_t sys_serial_write(env_t* e, const char *DANGEROUS buf, uint16_t len) 
 {
-    char *COUNT(len) _buf = user_mem_assert(e, buf, len, PTE_U);
-       return -1;
+       char *COUNT(len) _buf = user_mem_assert(e, buf, len, PTE_U);
+       for(int i =0; i<len; i++)
+               serial_send_byte(buf[i]);       
+       return 0;
 }
 
 //Read a buffer over the serial port
-static uint16_t sys_serial_read(env_t* e, const char *DANGEROUS buf, uint16_t len) 
+static uint16_t sys_serial_read(env_t* e, char *DANGEROUS buf, uint16_t len) 
 {
     char *COUNT(len) _buf = user_mem_assert(e, buf, len, PTE_U);
-       return len;
+       uint16_t bytes_read = 0;
+       int c;
+       while((c = serial_read_byte()) != -1)
+               buf[bytes_read++] = (uint8_t)c;
+       return bytes_read;
 }
 
 // Invalidate the cache of this core
@@ -148,6 +154,7 @@ int32_t syscall(env_t* e, uint32_t syscallno, uint32_t a1, uint32_t a2,
        //cprintf("Incoming syscall number: %d\n    a1: %x\n    a2: %x\n    a3: %x\n    a4: %x\n    a5: %x\n", syscallno, a1, a2, a3, a4, a5);
 
        assert(e); // should always have an env for every syscall
+       printk("Running syscall: %d\n", syscallno);
        if (INVALID_SYSCALL(syscallno))
                return -E_INVAL;
 
@@ -156,6 +163,7 @@ int32_t syscall(env_t* e, uint32_t syscallno, uint32_t a1, uint32_t a2,
                        sys_null();
                        return 0;
                case SYS_serial_write:
+                       printk("I am here\n");
                        return sys_serial_write(e, (char *DANGEROUS)a1, (size_t)a2);
                case SYS_serial_read:
                        return sys_serial_read(e, (char *DANGEROUS)a1, (size_t)a2);
index 57d41a1..1d75811 100644 (file)
@@ -490,7 +490,7 @@ int write(int file, char *ptr, int len) {
        
        debug("WRITE\n");       
        debug("\tFILE: %u\n", file);
-       if(file == 1) //STDOUT_FILENO
+       if(file == 1 || file == 2) //STDOUT_FILENO || STDERR_FILENO
                return sys_cputs(ptr, len);
        
        int out_msg_len = WRITE_MESSAGE_FIXED_SIZE + len;
index 7d9ee41..cad283c 100644 (file)
@@ -99,11 +99,11 @@ error_t sys_cputs(const char *s, size_t len)
 //Write a buffer over the serial port
 error_t sys_serial_write(void* buf, uint16_t len) 
 {
-       return -1;
+       return syscall(SYS_serial_write, (uint32_t)buf, len, 0, 0, 0);
 }
 
 //Read a buffer over the serial port
 uint16_t sys_serial_read(void* buf, uint16_t len) 
 {
-       return 0;
+       return syscall(SYS_serial_read, (uint32_t)buf, len, 0, 0, 0);
 }