void serve(void) { u_int req, whom, perm; for(;;) { perm = 0; req = ipc_recv(&whom, REQVA, &perm); if (debug) printf("fs req %d from %08x [page %08x: %s]\n", req, whom, vpt[VPN(REQVA)], REQVA); // All requests must contain an argument page if (!(perm & PTE_P)) { printf("Invalid request from %08x: no argument page\n", whom); continue; // just leave it hanging... } switch (req) { case FSREQ_OPEN: serve_open(whom, (struct Fsreq_open*)REQVA); break; case FSREQ_MAP: serve_map(whom, (struct Fsreq_map*)REQVA); break; case FSREQ_SET_SIZE: serve_set_size(whom, (struct Fsreq_set_size*)REQVA); break; case FSREQ_CLOSE: serve_close(whom, (struct Fsreq_close*)REQVA); break; case FSREQ_DIRTY: serve_dirty(whom, (struct Fsreq_dirty*)REQVA); break; case FSREQ_REMOVE: serve_remove(whom, (struct Fsreq_remove*)REQVA); break; case FSREQ_SYNC: serve_sync(whom); break; default: printf("Invalid request code %d from %08x\n", whom, req); break; } sys_mem_unmap(0, REQVA); } }
void duppage(u_int dstenv, u_int addr) { int r; u_char *tmp; tmp = (u_char*)(UTEXT-BY2PG); // should be available! // This is NOT what you should do in your fork. if ((r=sys_mem_alloc(dstenv, addr, PTE_P|PTE_U|PTE_W)) < 0) panic("sys_mem_alloc: %e", r); if ((r=sys_mem_map(dstenv, addr, 0, (u_int)tmp, PTE_P|PTE_U|PTE_W)) < 0) panic("sys_mem_map: %e", r); memcpy(tmp, (u_char*)addr, BY2PG); if ((r=sys_mem_unmap(0, (u_int)tmp)) < 0) panic("sys_mem_unmap: %e", r); }