summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <rsc>2006-07-16 15:38:00 +0000
committerrsc <rsc>2006-07-16 15:38:00 +0000
commitf3d290220f072a7053b9a368bf7c42e8e2945c7e (patch)
tree0712641a7da349ea8d3d386a2ed7081b2f6d8971
parent9b37d1bfaa65c96e7a465c285599aa45117182ea (diff)
downloadxv6-labs-f3d290220f072a7053b9a368bf7c42e8e2945c7e.tar.gz
xv6-labs-f3d290220f072a7053b9a368bf7c42e8e2945c7e.tar.bz2
xv6-labs-f3d290220f072a7053b9a368bf7c42e8e2945c7e.zip
add cons_puts for atomic (readable) output
-rw-r--r--syscall.c45
-rw-r--r--syscall.h1
2 files changed, 41 insertions, 5 deletions
diff --git a/syscall.c b/syscall.c
index 6ac739f..decf393 100644
--- 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;
}
diff --git a/syscall.h b/syscall.h
index 52e2301..9ca3bd4 100644
--- 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