CopyOnWrite, // Share the mapped object only until it is written to;
// then, before the write takes place, copy the object.
// It is undefined whether this mapping will receive
- // the copy or the original. Ignored for alloc_and_map.
+ // the copy or the original.
AccessFlags access:3,
// These are the requested read/write/execute
clone(AddrSpace addrspace out, bool clone_is_real);
- // Create an anonymous RAM mapping.
-
- alloc_and_map(ulong len, ulong vstart inout,
- AllocFlags aflags, MapFlags mflags);
-
// Mappable must be implemented by the local kernel, and must hold
// read/write/exec permissions appropriate for the MapFlags given.
void get_mappable(IMappable *ma);
void clone(IAddrSpace *addrspace, u8 clone_is_real);
- void alloc_and_map(u64 len, u64 *vstart,
- AllocFlags aflags, MapFlags mflags);
-
enum {
map_user,
map_protected,
};
void map(IMappable ma, Region region, u64 *vstart, MapFlags mflags,
- bool from_kernel = false, int map_type = map_user);
+ int map_type = map_user);
void unmap(Region region, bool from_kernel = false);
void set_mapflags(Region region, MapFlags mflags);
extern int rwshared_start, rwshared_page_end;
namespace Mem {
- extern IMappable physmem;
+ extern IMappable physmem, anonmem;
class AddrSpaceFactory {
public:
mf.access_IDLNS_Read = 1;
mf.access_IDLNS_Exec = 1;
- as->map(physmem, region, &vstart, mf,
- true, AddrSpace::map_protected);
+ as->map(physmem, region, &vstart, mf, AddrSpace::map_protected);
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,
- true, AddrSpace::map_protected);
+ as->map(physmem, region, &vstart, mf, AddrSpace::map_protected);
- AllocFlags af = 0;
- vstart = Arch::stack_bottom;
- as->alloc_and_map(Arch::stack_top - vstart + 1, &vstart, af, mf);
+ // 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;
}
- void AddrSpace::alloc_and_map(u64 len, u64 *vstart,
- AllocFlags aflags, MapFlags mflags)
- {
- // FIXME: implement
- }
-
bool AddrSpace::handle_fault(ulong vaddr, bool write, bool exec, bool user)
{
if (lock.held_by_curthread())
// gets its copy-on-write broken.
assert((oldflags & reqflags) == reqflags);
+ assert(!va->flags.FaultOnWrite || oldphys == phys);
return true;
}
}
void AddrSpace::map(IMappable ma, Region region, u64 *vstart,
- MapFlags mflags, bool from_kernel, int map_type)
+ MapFlags mflags, int map_type)
{
// FIXME: check alignment for VIPT caches
// FIXME: Implement the "Replace" map flag
if (*vstart != System::Mem::AddrSpace_ns::unspecified_start) {
vregion.start = *vstart;
- vregion.end = vregion.start + region.end - region.start + 1;
+ vregion.end = vregion.start + region.end - region.start;
if (is_process) {
if (!valid_addr(vregion.start))
}
if (*vstart == System::Mem::AddrSpace_ns::unspecified_start) {
- if (fixed)
+ if (fixed)
throw_idl(ResourceBusy, 2, countarray("varea overlap"));
if (!get_free_region(region.end - region.start + 1, vregion, prev))