Finish lab 5.

This commit is contained in:
2019-05-16 18:50:16 -07:00
parent e9f683f6d6
commit 4199ce9c37
10 changed files with 139 additions and 20 deletions

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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;
}