void serve(void) { u_int req, whom, perm; for (;;) { perm = 0; req = ipc_recv(&whom, REQVA, &perm); // All requests must contain an argument page if (!(perm & PTE_V)) { writef("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: writef("Invalid request code %d from %08x\n", whom, req); break; } syscall_mem_unmap(0, REQVA); } }
void serve(void) { uint32_t req, whom; int perm; while (1) { perm = 0; req = ipc_recv((int32_t *) &whom, (void *) REQVA, &perm); if (debug) cprintf("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)) { cprintf("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: cprintf("Invalid request code %d from %08x\n", whom, req); break; } sys_page_unmap(0, (void*) REQVA); } }