diff options
author | Robert Morris <[email protected]> | 2019-06-04 05:57:47 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2019-06-04 05:57:47 -0400 |
commit | 8baac760500980d4b83e8de2e90265bfaa19df13 (patch) | |
tree | ceb59412ec44ff98c1281627fb648deaeedb0d04 /proc.c | |
parent | cefe223bf5e4b68e5c1202f2f089a164ad656621 (diff) | |
download | xv6-labs-8baac760500980d4b83e8de2e90265bfaa19df13.tar.gz xv6-labs-8baac760500980d4b83e8de2e90265bfaa19df13.tar.bz2 xv6-labs-8baac760500980d4b83e8de2e90265bfaa19df13.zip |
support read() and write() bigger than one page
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -526,3 +526,32 @@ kill(int pid) } #endif + +// Copy to either a user address, or kernel address, +// depending on usr_dst. +// Returns 0 on success, -1 on error. +int +either_copyout(int user_dst, uint64 dst, char *src, uint64 len) +{ + struct proc *p = myproc(); + if(user_dst){ + return copyout(p->pagetable, dst, src, len); + } else { + memmove((char *)dst, src, len); + } +} + +// Copy from either a user address, or kernel address, +// depending on usr_src. +// Returns 0 on success, -1 on error. +int +either_copyin(char *dst, int user_src, uint64 src, uint64 len) +{ + struct proc *p = myproc(); + if(user_src){ + return copyin(p->pagetable, dst, src, len); + } else { + memmove(dst, (char*)src, len); + } +} + |