1.1 --- a/libexec/include/exec/external_pager.h Mon Mar 06 16:19:15 2023 +0100
1.2 +++ b/libexec/include/exec/external_pager.h Mon Mar 06 18:30:22 2023 +0100
1.3 @@ -38,8 +38,8 @@
1.4 public NotificationSupport, public Resource
1.5 {
1.6 protected:
1.7 - l4_cap_idx_t _task, _rtask, _parent, _rparent, _pager, _rpager, _ipc_gate;
1.8 - std::vector<l4_cap_idx_t> _threads, _rthreads;
1.9 + l4_cap_idx_t _task, _mapped_task, _parent, _mapped_parent, _pager, _mapped_pager, _ipc_gate;
1.10 + std::vector<l4_cap_idx_t> _threads, _mapped_threads;
1.11
1.12 public:
1.13 explicit ExternalPager(address_t start = 0, address_t end = 0);
1.14 @@ -53,11 +53,11 @@
1.15
1.16 /* Task and thread management. */
1.17
1.18 - virtual void add_thread(l4_cap_idx_t cap, l4_cap_idx_t rcap);
1.19 + virtual void add_thread(l4_cap_idx_t cap, l4_cap_idx_t mapped_cap);
1.20 virtual void set_gate(l4_cap_idx_t cap);
1.21 - virtual void set_pager(l4_cap_idx_t cap, l4_cap_idx_t rcap);
1.22 - virtual void set_parent(l4_cap_idx_t cap, l4_cap_idx_t rcap);
1.23 - virtual void set_task(l4_cap_idx_t cap, l4_cap_idx_t rcap);
1.24 + virtual void set_pager(l4_cap_idx_t cap, l4_cap_idx_t mapped_cap);
1.25 + virtual void set_parent(l4_cap_idx_t cap, l4_cap_idx_t mapped_cap);
1.26 + virtual void set_task(l4_cap_idx_t cap, l4_cap_idx_t mapped_cap);
1.27
1.28 /* Resource methods. */
1.29
2.1 --- a/libexec/include/exec/process.h Mon Mar 06 16:19:15 2023 +0100
2.2 +++ b/libexec/include/exec/process.h Mon Mar 06 18:30:22 2023 +0100
2.3 @@ -91,16 +91,18 @@
2.4
2.5 l4_cap_idx_t allocate_cap();
2.6
2.7 - long configure_task(l4_cap_idx_t *task, l4_cap_idx_t *rtask, unsigned int threads = 2);
2.8 + long configure_task(l4_cap_idx_t *task, l4_cap_idx_t *mapped_task,
2.9 + unsigned int threads = 2);
2.10
2.11 - long configure_thread(l4_cap_idx_t server, l4_cap_idx_t *mapped_cap = NULL);
2.12 + long configure_thread(l4_cap_idx_t rm, l4_cap_idx_t *mapped_rm = NULL);
2.13
2.14 - long set_parent(l4_cap_idx_t parent, l4_cap_idx_t *rparent);
2.15 + long set_parent(l4_cap_idx_t parent, l4_cap_idx_t *mapped_parent);
2.16
2.17 long map_capabilities(struct ipc_mapped_cap mapped_caps[],
2.18 bool to_count = true);
2.19
2.20 - long thread_start(l4_addr_t program_start, Stack &st, l4_cap_idx_t *thread, l4_cap_idx_t *rthread);
2.21 + long thread_start(l4_addr_t program_start, Stack &st, l4_cap_idx_t *thread,
2.22 + l4_cap_idx_t *mapped_thread);
2.23 };
2.24
2.25 /* vim: tabstop=2 expandtab shiftwidth=2
3.1 --- a/libexec/lib/src/external_pager.cc Mon Mar 06 16:19:15 2023 +0100
3.2 +++ b/libexec/lib/src/external_pager.cc Mon Mar 06 18:30:22 2023 +0100
3.3 @@ -76,7 +76,7 @@
3.4
3.5 if (l4_is_valid_cap(_task))
3.6 {
3.7 - ipc_unmap_capability(_task, _rtask);
3.8 + ipc_unmap_capability(_task, _mapped_task);
3.9 ipc_cap_free_um(_task);
3.10 _task = L4_INVALID_CAP;
3.11 }
3.12 @@ -86,10 +86,10 @@
3.13
3.14 /* Manage the task and thread capabilities. */
3.15
3.16 -void ExternalPager::add_thread(l4_cap_idx_t cap, l4_cap_idx_t rcap)
3.17 +void ExternalPager::add_thread(l4_cap_idx_t cap, l4_cap_idx_t mapped_cap)
3.18 {
3.19 _threads.push_back(cap);
3.20 - _rthreads.push_back(rcap);
3.21 + _mapped_threads.push_back(mapped_cap);
3.22 }
3.23
3.24 void ExternalPager::set_gate(l4_cap_idx_t cap)
3.25 @@ -97,22 +97,22 @@
3.26 _ipc_gate = cap;
3.27 }
3.28
3.29 -void ExternalPager::set_pager(l4_cap_idx_t cap, l4_cap_idx_t rcap)
3.30 +void ExternalPager::set_pager(l4_cap_idx_t cap, l4_cap_idx_t mapped_cap)
3.31 {
3.32 _pager = cap;
3.33 - _rpager = rcap;
3.34 + _mapped_pager = mapped_cap;
3.35 }
3.36
3.37 -void ExternalPager::set_parent(l4_cap_idx_t cap, l4_cap_idx_t rcap)
3.38 +void ExternalPager::set_parent(l4_cap_idx_t cap, l4_cap_idx_t mapped_cap)
3.39 {
3.40 _parent = cap;
3.41 - _rparent = rcap;
3.42 + _mapped_parent = mapped_cap;
3.43 }
3.44
3.45 -void ExternalPager::set_task(l4_cap_idx_t cap, l4_cap_idx_t rcap)
3.46 +void ExternalPager::set_task(l4_cap_idx_t cap, l4_cap_idx_t mapped_cap)
3.47 {
3.48 _task = cap;
3.49 - _rtask = rcap;
3.50 + _mapped_task = mapped_cap;
3.51 }
3.52
3.53
3.54 @@ -268,8 +268,8 @@
3.55 {
3.56 /* Parent and pager/region mapper. */
3.57
3.58 - ipc_unmap_capability(_task, _rparent);
3.59 - ipc_unmap_capability(_task, _rpager);
3.60 + ipc_unmap_capability(_task, _mapped_parent);
3.61 + ipc_unmap_capability(_task, _mapped_pager);
3.62
3.63 /* Threads. For some reason, these cannot be released by the process, so
3.64 they are also unmapped on its behalf. */
3.65 @@ -279,7 +279,7 @@
3.66 for (it = _threads.begin(); it != _threads.end(); it++)
3.67 ipc_cap_free_um(*it);
3.68
3.69 - for (it = _rthreads.begin(); it != _rthreads.end(); it++)
3.70 + for (it = _mapped_threads.begin(); it != _mapped_threads.end(); it++)
3.71 ipc_unmap_capability(_task, *it);
3.72 }
3.73 }
4.1 --- a/libexec/lib/src/process.cc Mon Mar 06 16:19:15 2023 +0100
4.2 +++ b/libexec/lib/src/process.cc Mon Mar 06 18:30:22 2023 +0100
4.3 @@ -109,7 +109,7 @@
4.4
4.5 /* Configure the task environment. */
4.6
4.7 -long Process::configure_task(l4_cap_idx_t *task, l4_cap_idx_t *rtask, unsigned int threads)
4.8 +long Process::configure_task(l4_cap_idx_t *task, l4_cap_idx_t *mapped_task, unsigned int threads)
4.9 {
4.10 long err = create_task(threads);
4.11
4.12 @@ -141,37 +141,37 @@
4.13 /* Return the capability details for the task. */
4.14
4.15 *task = _task;
4.16 - *rtask = L4_BASE_TASK_CAP;
4.17 + *mapped_task = L4_BASE_TASK_CAP;
4.18
4.19 return map_capabilities(mapped_caps, false);
4.20 }
4.21
4.22 -/* Configure the thread environment, employing the given server as the region
4.23 - mapper. Return the capability index for the server in the new task. */
4.24 +/* Configure the thread environment, employing the given capability for the
4.25 + region mapper, returning its capability details in the new task. */
4.26
4.27 -long Process::configure_thread(l4_cap_idx_t server, l4_cap_idx_t *mapped_cap)
4.28 +long Process::configure_thread(l4_cap_idx_t rm, l4_cap_idx_t *mapped_rm)
4.29 {
4.30 /* Employ a distinct region mapper for each thread's environment, this acting
4.31 as pager. */
4.32
4.33 - if ((mapped_cap != NULL) && l4_is_valid_cap(*mapped_cap))
4.34 + if ((mapped_rm != NULL) && l4_is_valid_cap(*mapped_rm))
4.35 {
4.36 - _env.rm = *mapped_cap;
4.37 + _env.rm = *mapped_rm;
4.38 return L4_EOK;
4.39 }
4.40 else
4.41 {
4.42 _env.rm = allocate_cap();
4.43 - *mapped_cap = _env.rm;
4.44 - return ipc_map_capability(_task, (struct ipc_mapped_cap) {_env.rm, server, L4_CAP_FPAGE_RWS, 0});
4.45 + *mapped_rm = _env.rm;
4.46 + return ipc_map_capability(_task, (struct ipc_mapped_cap) {_env.rm, rm, L4_CAP_FPAGE_RWS, 0});
4.47 }
4.48 }
4.49
4.50 /* Set the parent of the new thread. */
4.51
4.52 -long Process::set_parent(l4_cap_idx_t parent, l4_cap_idx_t *rparent)
4.53 +long Process::set_parent(l4_cap_idx_t parent, l4_cap_idx_t *mapped_parent)
4.54 {
4.55 - *rparent = _env.parent;
4.56 + *mapped_parent = _env.parent;
4.57 return ipc_map_capability(_task, (struct ipc_mapped_cap) {_env.parent, parent, L4_CAP_FPAGE_RWS, 0});
4.58 }
4.59
4.60 @@ -191,7 +191,8 @@
4.61
4.62 /* Create, initialise and start a thread. */
4.63
4.64 -long Process::thread_start(l4_addr_t program_start, Stack &st, l4_cap_idx_t *thread, l4_cap_idx_t *rthread)
4.65 +long Process::thread_start(l4_addr_t program_start, Stack &st,
4.66 + l4_cap_idx_t *thread, l4_cap_idx_t *mapped_thread)
4.67 {
4.68 long err;
4.69
4.70 @@ -255,7 +256,7 @@
4.71
4.72 l4_sched_param_t sp = l4_sched_param(L4RE_MAIN_THREAD_PRIO);
4.73
4.74 - *rthread = _env.main_thread;
4.75 + *mapped_thread = _env.main_thread;
4.76 return l4_error(l4_scheduler_run_thread(l4re_env()->scheduler, *thread, &sp));
4.77 }
4.78
5.1 --- a/libexec/lib/src/process_creating.cc Mon Mar 06 16:19:15 2023 +0100
5.2 +++ b/libexec/lib/src/process_creating.cc Mon Mar 06 18:30:22 2023 +0100
5.3 @@ -109,22 +109,26 @@
5.4
5.5 long ProcessCreating::configure_task(l4_cap_idx_t pager)
5.6 {
5.7 - l4_cap_idx_t task, rtask;
5.8 - long err = _process.configure_task(&task, &rtask);
5.9 + l4_cap_idx_t task, mapped_task;
5.10 + long err = _process.configure_task(&task, &mapped_task);
5.11
5.12 if (err)
5.13 return err;
5.14
5.15 - _exec_pager->set_task(task, rtask);
5.16 + /* Record the task details in the pager for eventual resource deallocation. */
5.17 +
5.18 + _exec_pager->set_task(task, mapped_task);
5.19
5.20 - l4_cap_idx_t rparent;
5.21 + /* Note the pager as the parent of the new task, recording its capability
5.22 + details in the new task. */
5.23
5.24 - err = _process.set_parent(pager, &rparent);
5.25 + l4_cap_idx_t mapped_parent;
5.26 + err = _process.set_parent(pager, &mapped_parent);
5.27
5.28 if (err)
5.29 return err;
5.30
5.31 - _exec_pager->set_parent(pager, rparent);
5.32 + _exec_pager->set_parent(pager, mapped_parent);
5.33 return L4_EOK;
5.34 }
5.35
5.36 @@ -139,8 +143,16 @@
5.37 if (l4_is_invalid_cap(_ipc_gate))
5.38 return -L4_ENOMEM;
5.39
5.40 + long err = l4_error(l4_factory_create_gate(l4re_env()->factory, _ipc_gate, L4_INVALID_CAP, 0));
5.41 +
5.42 + if (err)
5.43 + return err;
5.44 +
5.45 + /* The gate is retained because even after being mapped to the new task,
5.46 + releasing it will cause it to be deallocated. */
5.47 +
5.48 _exec_pager->set_gate(_ipc_gate);
5.49 - return l4_error(l4_factory_create_gate(l4re_env()->factory, _ipc_gate, L4_INVALID_CAP, 0));
5.50 + return L4_EOK;
5.51 }
5.52
5.53 /* Initialise and assign a region in a list to the created process. */
5.54 @@ -224,13 +236,13 @@
5.55 /* Configure the environment for the thread, specifying the pager (and
5.56 exception handler plus region mapper). */
5.57
5.58 - l4_cap_idx_t rpager = L4_INVALID_CAP;
5.59 - long err = _process.configure_thread(pager, &rpager);
5.60 + l4_cap_idx_t mapped_pager = L4_INVALID_CAP;
5.61 + long err = _process.configure_thread(pager, &mapped_pager);
5.62
5.63 if (err)
5.64 return err;
5.65
5.66 - _exec_pager->set_pager(pager, rpager);
5.67 + _exec_pager->set_pager(pager, mapped_pager);
5.68
5.69 /* Populate a thread stack with argument and environment details for the
5.70 region mapper, plus the initial server capability and region details. */
5.71 @@ -244,13 +256,13 @@
5.72
5.73 /* Start the region mapper thread in the appropriate stack. */
5.74
5.75 - l4_cap_idx_t thread, rthread;
5.76 - err = _process.thread_start(_rm_payload->entry_point(), rm_st, &thread, &rthread);
5.77 + l4_cap_idx_t thread, mapped_thread;
5.78 + err = _process.thread_start(_rm_payload->entry_point(), rm_st, &thread, &mapped_thread);
5.79
5.80 if (err)
5.81 return err;
5.82
5.83 - _exec_pager->add_thread(thread, rthread);
5.84 + _exec_pager->add_thread(thread, mapped_thread);
5.85 return L4_EOK;
5.86 }
5.87
5.88 @@ -266,8 +278,8 @@
5.89 /* Configure the environment for the thread, specifying the pager (and
5.90 exception handler plus region mapper). */
5.91
5.92 - l4_cap_idx_t rpager = _ipc_gate_cap;
5.93 - long err = _process.configure_thread(_ipc_gate, &rpager);
5.94 + l4_cap_idx_t mapped_pager = _ipc_gate_cap;
5.95 + long err = _process.configure_thread(_ipc_gate, &mapped_pager);
5.96
5.97 if (err)
5.98 return err;
5.99 @@ -282,13 +294,13 @@
5.100
5.101 /* Start the program thread in the appropriate stack. */
5.102
5.103 - l4_cap_idx_t thread, rthread;
5.104 - err = _process.thread_start(_program_payload->entry_point(), program_st, &thread, &rthread);
5.105 + l4_cap_idx_t thread, mapped_thread;
5.106 + err = _process.thread_start(_program_payload->entry_point(), program_st, &thread, &mapped_thread);
5.107
5.108 if (err)
5.109 return err;
5.110
5.111 - _exec_pager->add_thread(thread, rthread);
5.112 + _exec_pager->add_thread(thread, mapped_thread);
5.113 return L4_EOK;
5.114 }
5.115