L4Re/departure

Changeset

503:f91362d40267
2023-03-06 Paul Boddie raw files shortlog changelog graph Renamed variables to be more obviously informative.
libexec/include/exec/external_pager.h (file) libexec/include/exec/process.h (file) libexec/lib/src/external_pager.cc (file) libexec/lib/src/process.cc (file) libexec/lib/src/process_creating.cc (file)
     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