public static void GetPageFaultInfo(ref MessageRegisters mr, out uint pfa, out uint pc, out uint faultType) { pfa = (uint)mr.mr0; pc = (uint)mr.mr1; const uint WRITE_BIT = 2; faultType = ((pfa & WRITE_BIT) != 0) ? L4FPage.L4_FPAGE_FAULT_WRITE : L4FPage.L4_FPAGE_FAULT_READ; }
public static void ReturnFromPageFault(L4Handle target, out Msgtag tag, ref MessageRegisters mr, uint pfa, Pointer physicalPage, uint permssion) { var virt_page_addr = ArchDefinition.PageIndex(physicalPage.ToUInt32()); var fpage = new L4FPage(virt_page_addr, ArchDefinition.PageShift, (int)permssion); tag = new Msgtag(0, 0, 1, 0); mr.mr0 = (int)(ArchDefinition.PageIndex(pfa) | Msgtag.L4_ITEM_MAP); mr.mr1 = (int)fpage.raw; NativeMethods.l4api_ipc_send(target, NativeMethods.l4api_utcb(), tag, Timeout.Never); }