]> Devi Nivas Git - cs3210-lab0.git/commitdiff
add cons_puts for atomic (readable) output
authorrsc <rsc>
Sun, 16 Jul 2006 15:38:00 +0000 (15:38 +0000)
committerrsc <rsc>
Sun, 16 Jul 2006 15:38:00 +0000 (15:38 +0000)
syscall.c
syscall.h

index 6ac739f88bef6f18725076c58ea467e853f173d3..decf39367de5497f6cf0db9a12f154fcb97345c5 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -30,7 +30,18 @@ fetchint(struct proc *p, unsigned addr, int *ip)
 
   if(addr > p->sz - 4)
     return -1;
-  memmove(ip, p->mem + addr, 4);
+  *ip = *(int*)(p->mem + addr);
+  return 0;
+}
+
+// Fetch byte from a user-supplied pointer.
+// Returns 0 on success, -1 if pointer is illegal.
+int
+fetchbyte(struct proc *p, unsigned addr, char* c)
+{
+  if(addr >= p->sz)
+    return -1;
+  *c = *(p->mem + addr);
   return 0;
 }
 
@@ -174,7 +185,8 @@ sys_kill(void)
 {
   int pid;
 
-  fetcharg(0, &pid);
+  if(fetcharg(0, &pid) < 0)
+    return -1;
   return proc_kill(pid);
 }
 
@@ -182,9 +194,31 @@ int
 sys_cons_putc(void)
 {
   int c;
+  char buf[2];
+
+  if(fetcharg(0, &c) < 0)
+    return -1;
+  buf[0] = c;
+  buf[1] = 0;
+  cprintf("%s", buf);
+  return 0;
+}
 
-  fetcharg(0, &c);
-  cons_putc(c & 0xff);
+int
+sys_cons_puts(void)
+{
+  char buf[256];
+  int i;
+  unsigned addr;
+  struct proc *cp = curproc[cpu()];
+
+  if(fetcharg(0, &addr) < 0)
+    return -1;
+  for(i=0; i<sizeof buf-1 && fetchbyte(cp, addr+i, &buf[i]) >= 0; i++)
+    if(buf[i] == 0)
+      break;
+  buf[i] = 0;
+  cprintf("%s", buf);
   return 0;
 }
 
@@ -219,7 +253,8 @@ sys_panic(void)
   struct proc *p = curproc[cpu()];
   unsigned int addr;
 
-  fetcharg(0, &addr);
+  if(fetcharg(0, &addr) < 0)
+    return -1;
   panic(p->mem + addr);
   return 0;
 }
index 52e23015f668b40e195e626cedfbe1c945f137a9..9ca3bd4938223360fa29525fb3d8da0181442558 100644 (file)
--- a/syscall.h
+++ b/syscall.h
@@ -9,3 +9,4 @@
 #define SYS_block 9
 #define SYS_kill 10
 #define SYS_panic 11
+#define SYS_cons_puts 12