#include <l4/syscalls.h>
#include <l4/ipc.h>
#include <l4/sigma0.h>

#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;
  l4_msgdope_t result;
  dword_t fault, fault_addr;
  l4_snd_fpage_t *fp;

  while(1)
  {
    /* wait for a page fault message */
    r = l4_mips_ipc_wait(&thrdid, L4_IPC_SHORT_MSG, &msg,
			 L4_IPC_NEVER, &result);

    /* mask out lower bits */
    fault_addr =  (msg.reg[0] & (~(dword_t) 3));
    
    /* 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,
			 L4_IPC_MAPMSG(L4_WHOLE_ADDRESS_SPACE, 0),
			 &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;
    
    r = l4_mips_ipc_send(thrdid, 
			 L4_IPC_SHORT_FPAGE, &msg,
			 L4_IPC_NEVER, &result);
  }
}
