Finish lab 5.
This commit is contained in:
@@ -141,7 +141,13 @@ devfile_write(struct Fd *fd, const void *buf, size_t n)
|
||||
// remember that write is always allowed to write *fewer*
|
||||
// bytes than requested.
|
||||
// LAB 5: Your code here
|
||||
panic("devfile_write not implemented");
|
||||
size_t writesize = MIN(sizeof(fsipcbuf.write.req_buf), n);
|
||||
|
||||
fsipcbuf.write.req_fileid = fd->fd_file.id;
|
||||
fsipcbuf.write.req_n = writesize;
|
||||
memcpy(fsipcbuf.write.req_buf, buf, writesize);
|
||||
|
||||
return fsipc(FSREQ_WRITE, NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
@@ -62,7 +62,7 @@ duppage(envid_t envid, unsigned pn)
|
||||
void* addr = (void*) (pn * PGSIZE);
|
||||
|
||||
// If we're writable, remove write permission
|
||||
if((new_pte & PTE_W) || (new_pte & PTE_COW)) {
|
||||
if(((new_pte & PTE_W) && !(new_pte & PTE_SHARE)) || (new_pte & PTE_COW)) {
|
||||
perms = (perms & ~PTE_W) | PTE_COW;
|
||||
change_own = true;
|
||||
}
|
||||
|
||||
15
lib/spawn.c
15
lib/spawn.c
@@ -302,6 +302,21 @@ static int
|
||||
copy_shared_pages(envid_t child)
|
||||
{
|
||||
// LAB 5: Your code here.
|
||||
int r;
|
||||
for(int pde_i = 0; pde_i < PDX(UTOP); pde_i++) {
|
||||
pde_t pde = uvpd[pde_i];
|
||||
if(!(pde & PTE_P)) continue;
|
||||
|
||||
for(int pte_i = 0; pte_i < NPTENTRIES; pte_i++) {
|
||||
int pn = pde_i * NPTENTRIES + pte_i;
|
||||
pte_t pte = uvpt[pn];
|
||||
|
||||
if((pte & (PTE_P | PTE_SHARE)) != (PTE_P | PTE_SHARE)) continue;
|
||||
void* addr = (void*) (pn * PGSIZE);
|
||||
if((r = sys_page_map(0, addr, child, addr, pte & PTE_SYSCALL)) < 0)
|
||||
return r;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user