X-Git-Url: http://git.buserror.net/cgi-bin/gitweb.cgi?p=polintos%2Fscott%2Fpriv.git;a=blobdiff_plain;f=kernel%2Fmem%2Faddrspace.cc;h=397f6a6cba04947c737b1d499b4c9cdec5e504df;hp=b9bd07af82f54c2c92e483fbda899aa7eb58d83f;hb=2e0cf58da9949572c6e334a07bba6774fdb749f9;hpb=223354cf6f772fe854996a22e776b3fa83490f44 diff --git a/kernel/mem/addrspace.cc b/kernel/mem/addrspace.cc index b9bd07a..397f6a6 100644 --- a/kernel/mem/addrspace.cc +++ b/kernel/mem/addrspace.cc @@ -14,18 +14,10 @@ // the Software without restriction, including without limitation the rights to // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies // of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: +// so, subject to the following condition: // -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimers. -// -// * Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimers in the -// documentation and/or other materials provided with the distribution. -// -// * The names of the Software's authors and/or contributors -// may not be used to endorse or promote products derived from -// this Software without specific prior written permission. +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS @@ -46,7 +38,7 @@ extern int roshared_start, roshared_page_end; extern int rwshared_start, rwshared_page_end; namespace Mem { - extern IMappable physmem; + extern IMappable physmem, anonmem; class AddrSpaceFactory { public: @@ -86,8 +78,7 @@ namespace Mem { 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); @@ -96,12 +87,14 @@ namespace Mem { 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(*(as)); } @@ -154,12 +147,6 @@ namespace Mem { *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()) @@ -542,6 +529,7 @@ namespace Mem { // gets its copy-on-write broken. assert((oldflags & reqflags) == reqflags); + assert(!va->flags.FaultOnWrite || oldphys == phys); return true; } @@ -580,7 +568,7 @@ namespace Mem { } 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 @@ -614,7 +602,7 @@ namespace Mem { 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)) @@ -631,7 +619,7 @@ namespace Mem { } 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))