diff options
author | rsc <rsc> | 2006-07-16 15:38:00 +0000 |
---|---|---|
committer | rsc <rsc> | 2006-07-16 15:38:00 +0000 |
commit | f3d290220f072a7053b9a368bf7c42e8e2945c7e (patch) | |
tree | 0712641a7da349ea8d3d386a2ed7081b2f6d8971 | |
parent | 9b37d1bfaa65c96e7a465c285599aa45117182ea (diff) | |
download | xv6-labs-f3d290220f072a7053b9a368bf7c42e8e2945c7e.tar.gz xv6-labs-f3d290220f072a7053b9a368bf7c42e8e2945c7e.tar.bz2 xv6-labs-f3d290220f072a7053b9a368bf7c42e8e2945c7e.zip |
add cons_puts for atomic (readable) output
-rw-r--r-- | syscall.c | 45 | ||||
-rw-r--r-- | syscall.h | 1 |
2 files changed, 41 insertions, 5 deletions
@@ -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; } @@ -9,3 +9,4 @@ #define SYS_block 9 #define SYS_kill 10 #define SYS_panic 11 +#define SYS_cons_puts 12 |