1.1 --- a/libexec/lib/src/internal_pager.cc Fri Jun 17 23:36:03 2022 +0200
1.2 +++ b/libexec/lib/src/internal_pager.cc Fri Jun 17 23:54:54 2022 +0200
1.3 @@ -76,6 +76,9 @@
1.4 printf("fs_base = %lx\n", regs.fs_base);
1.5 printf("gs_base = %lx\n", regs.gs_base);
1.6
1.7 + while (1)
1.8 + l4_sleep_forever();
1.9 +
1.10 return L4_EOK;
1.11 }
1.12
1.13 @@ -105,19 +108,36 @@
1.14
1.15 if ((addr >= r.start) && (addr < r.start + r.size))
1.16 {
1.17 - l4_addr_t page_addr = trunc(addr, L4_PAGESIZE);
1.18 + offset_t window_size = L4_PAGESIZE;
1.19 + address_t window_base = trunc(addr, window_size);
1.20 + offset_t offset = addr - r.start;
1.21 + address_t page_addr = trunc(addr, L4_PAGESIZE);
1.22 + address_t hot_spot = page_addr - window_base;
1.23
1.24 /* Interact with the region's dataspace, specifying a receive window for a
1.25 map operation. Here, a single page is specified. */
1.26
1.27 client_Dataspace dataspace(r.ds);
1.28 - l4_snd_fpage_t region = {0, l4_fpage(page_addr, L4_PAGESHIFT, 0)};
1.29 + l4_snd_fpage_t rw_region = {0, l4_fpage(window_base, L4_PAGESHIFT, 0)};
1.30 + map_flags_t map_flags = (flags & 4 ? L4RE_DS_F_RX : 0) | (flags & 2 ? L4RE_DS_F_W : 0) | (flags & 1 ? L4RE_DS_F_R : 0);
1.31 +
1.32 + if (!map_flags)
1.33 + map_flags = L4RE_DS_F_R;
1.34
1.35 #if DEBUG
1.36 - printf("region = {%lx, {%lx, %d}}\n", region.snd_base, l4_fpage_memaddr(region.fpage), l4_fpage_size(region.fpage));
1.37 + printf("window_base = %lx; window_size = %lx\n", window_base, window_size);
1.38 + printf("region = {%lx, {%lx, %d}}\n", rw_region.snd_base, l4_fpage_memaddr(rw_region.fpage), l4_fpage_size(rw_region.fpage));
1.39 + printf("map(%lx, %lx, %lx) -> %lx\n", offset, hot_spot, map_flags, r.ds);
1.40 #endif
1.41
1.42 - return dataspace.map(0, 0, L4_FPAGE_RO, ®ion);
1.43 + long err = dataspace.map(offset, hot_spot, map_flags & r.flags, &rw_region);
1.44 +
1.45 + /* Indicate an unspecified result, since the mapping should have taken
1.46 + place. */
1.47 +
1.48 + *region = {0, l4_fpage_invalid()};
1.49 +
1.50 + return err;
1.51 }
1.52
1.53 #if DEBUG
1.54 @@ -201,7 +221,7 @@
1.55 }
1.56
1.57 #if DEBUG
1.58 - printf("-> added region for %lx size %ld (%d)\n", region_start, region_size, page_order(region_size));
1.59 + printf("-> added region at %lx size %ld (%d) ds %lx\n", region_start, region_size, page_order(region_size), ds);
1.60 #endif
1.61
1.62 ExecRegion r = (ExecRegion) {region_start, region_size, flags & L4RE_DS_F_RIGHTS_MASK, ds};