#include #include #include #include "pager.h" #include "kprintf.h" dword_t pager_stack[PAGERSTACKSIZE]; void pager(void) { int r; l4_ipc_reg_msg_t msg; l4_threadid_t thrdid, myid; l4_msgdope_t result; dword_t fault, fault_addr; l4_snd_fpage_t *fp; myid = l4_myself(); kprintf("pager:\tHello world, I'm\t0x%llx\n", myid.ID); while(1) { /* wait for a page fault message */ r = l4_mips_ipc_wait(&thrdid, L4_IPC_SHORT_MSG, &msg, L4_IPC_NEVER, &result); fault = msg.reg[0]; /* for later printing */ /* mask out lower bits */ fault_addr = (fault & (~(dword_t) 3)); /* don't bother to check if fault address is valid, ie in the sub-tasks virtual address space */ /* attempt to map the page in this address space from my pager, ie sigma0 */ msg.reg[0] = fault_addr | 2; r = l4_mips_ipc_call(SIGMA0_TID, L4_IPC_SHORT_MSG, &msg, (void *) ((dword_t) L4_IPC_SHORT_FPAGE | (L4_WHOLE_ADDRESS_SPACE << 2 )), &msg, L4_IPC_NEVER, &result); /* assume it worked, really should check */ /* send mapping to client */ fp = (l4_snd_fpage_t *)&msg.reg[0]; fp[0].snd_base = fault_addr; fp[0].fpage = l4_fpage(fault_addr, 12, 1, 0); fp[1].fpage.fpage = 0; kprintf("pager:\tfault 0x%llx\tfpage \t0x%llx 0x%llx\n", fault, fp[0].snd_base, fp[0].fpage); r = l4_mips_ipc_send(thrdid, L4_IPC_SHORT_FPAGE, &msg, L4_IPC_NEVER, &result); } }