1.1 --- a/libexec/lib/src/internal_pager.cc Tue Mar 14 23:51:57 2023 +0100
1.2 +++ b/libexec/lib/src/internal_pager.cc Wed Mar 15 00:33:40 2023 +0100
1.3 @@ -21,6 +21,7 @@
1.4
1.5 #include <l4/re/env.h>
1.6 #include <l4/re/c/dataspace.h>
1.7 +#include <l4/re/c/rm.h>
1.8 #include <l4/util/util.h>
1.9
1.10 #include <ipc/cap_alloc.h>
1.11 @@ -31,6 +32,7 @@
1.12
1.13 #include "dataspace_client.h"
1.14 #include "internal_pager.h"
1.15 +#include "mapped_region.h"
1.16 #include "pager_object_server.h"
1.17
1.18
1.19 @@ -61,14 +63,10 @@
1.20
1.21 /* Unmap all regions. */
1.22
1.23 - MappedRegions::iterator it;
1.24 + Capabilities::iterator itc;
1.25
1.26 - for (it = _regions.begin(); it != _regions.end(); it++)
1.27 - {
1.28 - MappedRegion &r = it->second;
1.29 -
1.30 - ipc_cap_free_um(r.ds);
1.31 - }
1.32 + for (itc = _dataspaces.begin(); itc != _dataspaces.end(); itc++)
1.33 + ipc_cap_free_um(*itc);
1.34 }
1.35
1.36
1.37 @@ -101,43 +99,33 @@
1.38 printf("regs = %p\n; regs->user[0] = %lx\n", regs, regs->user[0]);
1.39 #endif
1.40
1.41 - /* Find the first region whose start address is beyond the fault address,
1.42 - testing if any immediately preceding region contains the fault address. */
1.43 -
1.44 - MappedRegions::iterator it = _regions.upper_bound(addr);
1.45 + /* Obtain a region supporting the fault address. */
1.46
1.47 - if (it != _regions.begin())
1.48 - it--;
1.49 - else
1.50 - {
1.51 - printf("not mapped at %lx for pc %lx\n", addr, pc);
1.52 - return -L4_ENOMEM;
1.53 - }
1.54 + MemoryArea *r;
1.55 + long err = _area.find(addr, &r);
1.56
1.57 - MappedRegion &r = it->second;
1.58 -
1.59 - if ((addr >= r.start) && (addr < r.start + r.size))
1.60 + if (!err)
1.61 {
1.62 address_t window_size = L4_PAGESIZE;
1.63 address_t window_base = trunc(addr, window_size);
1.64 - address_t offset = addr - r.start;
1.65 + address_t offset = addr - r->area_start();
1.66 address_t page_addr = trunc(addr, L4_PAGESIZE);
1.67 address_t hot_spot = page_addr - window_base;
1.68
1.69 /* Interact with the region's dataspace, specifying a receive window for a
1.70 map operation. Here, a single page is specified. */
1.71
1.72 - client_Dataspace dataspace(r.ds);
1.73 + client_Dataspace dataspace(r->dataspace());
1.74 l4_snd_fpage_t rw_region = {0, l4_fpage(window_base, L4_PAGESHIFT, 0)};
1.75 map_flags_t map_flags = map_flags_for_fault(flags);
1.76
1.77 #if DEBUG
1.78 printf("window_base = %lx; window_size = %lx\n", window_base, window_size);
1.79 printf("region = {%lx, {%lx, %d}}\n", rw_region.snd_base, l4_fpage_memaddr(rw_region.fpage), l4_fpage_size(rw_region.fpage));
1.80 - printf("map(%lx, %lx, %lx) -> %lx\n", offset, hot_spot, map_flags, r.ds);
1.81 + printf("map(%lx, %lx, %lx) -> %lx\n", offset, hot_spot, map_flags, r->dataspace());
1.82 #endif
1.83
1.84 - long err = dataspace.map(offset, hot_spot, map_flags & r.flags, &rw_region);
1.85 + err = dataspace.map(offset, hot_spot, map_flags & r->flags(), &rw_region);
1.86
1.87 /* Indicate an unspecified result, since the mapping should have taken
1.88 place. */
1.89 @@ -147,11 +135,9 @@
1.90 return err;
1.91 }
1.92
1.93 -#if DEBUG
1.94 - printf("not mapped!\n");
1.95 -#endif
1.96 + printf("not mapped at %lx for pc %lx\n", addr, pc);
1.97
1.98 - return -L4_ENOMEM;
1.99 + return err;
1.100 }
1.101
1.102 /* Attach a region for provision when page faults occur. This is required in
1.103 @@ -162,12 +148,21 @@
1.104 l4_cap_idx_t ds, address_t offset,
1.105 unsigned char align)
1.106 {
1.107 - long err = ExecPager::find(start, &size, flags, offset, align);
1.108 + // NOTE: Determine the purpose of offset.
1.109 +
1.110 + (void) offset;
1.111 +
1.112 + MemoryArea *area;
1.113 + long err = ExecPager::find(start, &size, flags, align, &area);
1.114
1.115 if (!err)
1.116 {
1.117 - MappedRegion r(*start, size, flags & L4RE_DS_F_RIGHTS_MASK, ds);
1.118 - add(r);
1.119 + MappedRegion r(*start, *start + size, flags & L4RE_DS_F_RIGHTS_MASK, ds);
1.120 + area->add(r);
1.121 +
1.122 + /* Record dataspaces separately. */
1.123 +
1.124 + _dataspaces.insert(ds);
1.125 }
1.126 else
1.127 ipc_cap_free_um(ds);
1.128 @@ -175,5 +170,34 @@
1.129 return err;
1.130 }
1.131
1.132 +long InternalPager::reserve_area(address_t *start, address_t size,
1.133 + map_flags_t flags, unsigned char align)
1.134 +{
1.135 + MemoryArea *area;
1.136 + long err = ExecPager::find(start, &size, flags, align, &area);
1.137 +
1.138 + if (!err)
1.139 + {
1.140 + /* Add an object acting like a region but without any associated
1.141 + dataspace. */
1.142 +
1.143 + if (flags & L4RE_RM_F_RESERVED)
1.144 + {
1.145 + ReservedMemoryArea r(*start, *start + size);
1.146 + area->add(r);
1.147 + }
1.148 +
1.149 + /* Add an object permitting regions to be added within it. */
1.150 +
1.151 + else
1.152 + {
1.153 + AvailableMemoryArea r(*start, *start + size);
1.154 + area->add(r);
1.155 + }
1.156 + }
1.157 +
1.158 + return err;
1.159 +}
1.160 +
1.161 /* vim: tabstop=2 expandtab shiftwidth=2
1.162 */