mf.access_IDLNS_Read = 1;
mf.access_IDLNS_Exec = 1;
- as->map(physmem, region, &vstart, mf, AddrSpace::map_protected);
+ as->map(physmem, region, &vstart, mf,
+ PTEFlags::protectedmap | PTEFlags::addressonly);
region.start = kvirt_to_phys(&rwshared_start);
region.end = kvirt_to_phys(&rwshared_page_end);
mf.access_IDLNS_Write = 1;
mf.CopyOnWrite = 1;
- as->map(physmem, region, &vstart, mf, AddrSpace::map_protected);
+ as->map(physmem, region, &vstart, mf,
+ PTEFlags::protectedmap | PTEFlags::addressonly);
// Leave the stack no-exec by default.
region.start = vstart = Arch::stack_bottom;
region.end = Arch::stack_top;
mf.CopyOnWrite = 0;
- printf("vstart %llx\n", vstart);
as->map(anonmem, region, &vstart, mf);
*obj = static_cast<IAddrSpace>(*as);
*addrspace = NULL;
}
- bool AddrSpace::handle_fault(ulong vaddr, bool write, bool exec, bool user)
+ int AddrSpace::handle_fault(ulong vaddr, bool write, bool exec, bool user)
{
if (lock.held_by_curthread())
return false;
}
catch (BadPageFault &bpf) {
- // FIXME: retain info about nature of bpf
- // to throw to user?
- return false;
+ return bpf.cause;
}
- return true;
+ return -1;
}
bool AddrSpace::check_overlap(Region region, VirtualArea *&va)
VirtualArea *va = aspace->varea_tree.find(vaddr);
if (!va)
- throw BadPageFault();
+ throw BadPageFault(MemoryFault_ns::Cause::Unmapped);
if ((va->flags & reqflags) != reqflags)
- throw BadPageFault();
+ throw BadPageFault(MemoryFault_ns::Cause::Protected);
if (aspace->map(va, vaddr, reqflags))
break;
}
void AddrSpace::map(IMappable ma, Region region, u64 *vstart,
- MapFlags mflags, int map_type)
+ MapFlags mflags, PTEFlags set, PTEFlags clear)
{
// FIXME: check alignment for VIPT caches
// FIXME: Implement the "Replace" map flag
newva->region() = vregion;
newva->flags.Valid = 1;
- newva->flags.User = map_type != map_kernel;
+ newva->flags.User = 1;
newva->flags.Readable = mflags.access_IDLNS_Read;
newva->flags.Writeable = mflags.access_IDLNS_Write;
newva->flags.Executable = mflags.access_IDLNS_Exec;
newva->flags.FaultOnWrite = mflags.CopyOnWrite;
- newva->flags.Protected = map_type != map_user;
+ newva->flags.raw |= set;
+ newva->flags.raw &= ~clear;
newva->ma = cma;
newva->offset = region.start - vregion.start;
oldpage->release();
}
- // FIXME: Add a special PTE flag to indicate that PhysMem mappings
- // don't mess with page refcounts.
-
class PhysMem : public Mappable {
public:
void get_size(u64 *size)
flags->Writeable = 1;
flags->Executable = 1;
flags->User = 1;
+ flags->AddressOnly = 1;
}
};