1.1 --- a/libexec/lib/src/external_pager.cc Sat Mar 04 19:03:27 2023 +0100
1.2 +++ b/libexec/lib/src/external_pager.cc Mon Mar 06 00:14:52 2023 +0100
1.3 @@ -68,6 +68,14 @@
1.4 MappedRegion &r = it->second;
1.5
1.6 ipc_detach_dataspace((void *) r.ds_start);
1.7 + printf("Free %lx\n", r.ds);
1.8 + ipc_cap_free_um(r.ds);
1.9 + }
1.10 +
1.11 + if (l4_is_valid_cap(_task))
1.12 + {
1.13 + ipc_cap_free_um(_task);
1.14 + _task = L4_INVALID_CAP;
1.15 }
1.16 }
1.17
1.18 @@ -75,14 +83,10 @@
1.19
1.20 /* Manage the task and thread capabilities. */
1.21
1.22 -void ExternalPager::set_task(l4_cap_idx_t cap)
1.23 +void ExternalPager::add_thread(l4_cap_idx_t cap, l4_cap_idx_t rcap)
1.24 {
1.25 - _task = cap;
1.26 -}
1.27 -
1.28 -void ExternalPager::set_server(l4_cap_idx_t cap)
1.29 -{
1.30 - _server = cap;
1.31 + _threads.push_back(cap);
1.32 + _rthreads.push_back(rcap);
1.33 }
1.34
1.35 void ExternalPager::set_gate(l4_cap_idx_t cap)
1.36 @@ -90,6 +94,23 @@
1.37 _ipc_gate = cap;
1.38 }
1.39
1.40 +void ExternalPager::set_pager(l4_cap_idx_t cap, l4_cap_idx_t rcap)
1.41 +{
1.42 + _pager = cap;
1.43 + _rpager = rcap;
1.44 +}
1.45 +
1.46 +void ExternalPager::set_parent(l4_cap_idx_t cap, l4_cap_idx_t rcap)
1.47 +{
1.48 + _parent = cap;
1.49 + _rparent = rcap;
1.50 +}
1.51 +
1.52 +void ExternalPager::set_task(l4_cap_idx_t cap)
1.53 +{
1.54 + _task = cap;
1.55 +}
1.56 +
1.57
1.58
1.59 /* Handle a general exception. */
1.60 @@ -185,9 +206,11 @@
1.61 {
1.62 long err = ExecPager::find(start, &size, flags, offset, align);
1.63
1.64 + /* Without an error, attach the dataspace. */
1.65 +
1.66 if (!err)
1.67 {
1.68 - /* Attach the provided dataspace.
1.69 + /* Attach the provided dataspace within this task.
1.70
1.71 This is only done in this implementation to support the paging
1.72 mechanism. In a region mapper residing within the actual task, the
1.73 @@ -205,6 +228,11 @@
1.74 add(r);
1.75 }
1.76
1.77 + /* Discard the imported dataspace if its region cannot be accommodated. */
1.78 +
1.79 + else
1.80 + ipc_cap_free_um(ds);
1.81 +
1.82 return err;
1.83 }
1.84
1.85 @@ -237,10 +265,25 @@
1.86 /* NOTE: Capability indexes to be obtained from the process creation
1.87 activity. */
1.88
1.89 + /* Log. */
1.90 +
1.91 + l4_task_unmap(_task, l4_obj_fpage(0x05UL << L4_CAP_SHIFT, 0, L4_CAP_FPAGE_RWSD), L4_FP_ALL_SPACES);
1.92 +
1.93 /* Parent and pager/region mapper. */
1.94
1.95 - l4_task_unmap(_task, l4_obj_fpage(0x13UL << L4_CAP_SHIFT, 0, L4_CAP_FPAGE_RWSD), L4_FP_ALL_SPACES);
1.96 - l4_task_unmap(_task, l4_obj_fpage(0x19UL << L4_CAP_SHIFT, 0, L4_CAP_FPAGE_RWSD), L4_FP_ALL_SPACES);
1.97 + l4_task_unmap(_task, l4_obj_fpage(_rparent, 0, L4_CAP_FPAGE_RWSD), L4_FP_ALL_SPACES);
1.98 + l4_task_unmap(_task, l4_obj_fpage(_rpager, 0, L4_CAP_FPAGE_RWSD), L4_FP_ALL_SPACES);
1.99 +
1.100 + /* Threads. For some reason, these cannot be released by the process, so
1.101 + they are also unmapped on its behalf. */
1.102 +
1.103 + std::vector<l4_cap_idx_t>::iterator it;
1.104 +
1.105 + for (it = _threads.begin(); it != _threads.end(); it++)
1.106 + ipc_cap_free_um(*it);
1.107 +
1.108 + for (it = _rthreads.begin(); it != _rthreads.end(); it++)
1.109 + l4_task_unmap(_task, l4_obj_fpage(*it, 0, L4_CAP_FPAGE_RWSD), L4_FP_ALL_SPACES);
1.110 }
1.111 }
1.112