1.1 --- a/libexec/lib/src/process_creating.cc Sat Feb 25 23:39:51 2023 +0100
1.2 +++ b/libexec/lib/src/process_creating.cc Sun Feb 26 18:43:52 2023 +0100
1.3 @@ -44,7 +44,6 @@
1.4
1.5 ProcessCreating::ProcessCreating(const char *rm_filename)
1.6 : _rm_filename(rm_filename),
1.7 - _exec_pager(0, 10 * L4_PAGESIZE),
1.8 _rm_stack(Utcb_area_start - initial_stack_size, initial_stack_size, L4_FPAGE_RW),
1.9 _program_stack(Utcb_area_start - initial_stack_size * 2, initial_stack_size, L4_FPAGE_RW)
1.10 {
1.11 @@ -60,7 +59,7 @@
1.12 pthread_attr_init(&attr);
1.13 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1.14
1.15 - ipc_server_init_for(&_config, ParentPagerObject, &_exec_pager);
1.16 + ipc_server_init_for(&_config, ParentPagerObject, _exec_pager);
1.17
1.18 long err = pthread_create(&pager_thread, &attr, ipc_server_start_mainloop, &_config);
1.19
1.20 @@ -105,17 +104,19 @@
1.21
1.22 long ProcessCreating::init_external_pager()
1.23 {
1.24 + _exec_pager = new ExternalPager(0, 10 * L4_PAGESIZE);
1.25 +
1.26 /* Initialise pager regions for the region mapper. */
1.27
1.28 for (unsigned int i = 0; i < _rm_payload->segments(); i++)
1.29 {
1.30 if (_rm_payload->segment(i)->loadable())
1.31 - _exec_pager.add(_rm_payload->segment(i)->region());
1.32 + _exec_pager->add(_rm_payload->segment(i)->region());
1.33 }
1.34
1.35 /* Include the region mapper's stack region. */
1.36
1.37 - _exec_pager.add(_rm_stack.region());
1.38 + _exec_pager->add(_rm_stack.region());
1.39
1.40 /* Start the pager in a separate thread. */
1.41
1.42 @@ -280,9 +281,10 @@
1.43 }
1.44
1.45 /* Start a new process for the given payload, providing the indicated program
1.46 - arguments. */
1.47 + arguments, returning a reference to the pager. */
1.48
1.49 -long ProcessCreating::start(file_t *file, int argc, const char *argv[])
1.50 +long ProcessCreating::start(file_t *file, int argc, const char *argv[],
1.51 + l4_cap_idx_t *process)
1.52 {
1.53 long err;
1.54
1.55 @@ -310,14 +312,20 @@
1.56 if (err)
1.57 return err;
1.58
1.59 - return start_program(argc, argv);
1.60 -}
1.61 + err = start_program(argc, argv);
1.62 + if (err)
1.63 + return err;
1.64 +
1.65 + *process = _config.server;
1.66
1.67 -/* Get a reference to the system-level pager for a process. */
1.68 + /* Discard instances created to initialise the process.
1.69 + NOTE: The region mapper payload could be retained instead of being
1.70 + reconstructed each time. */
1.71
1.72 -l4_cap_idx_t ProcessCreating::get_pager()
1.73 -{
1.74 - return _config.server;
1.75 + delete _rm_payload;
1.76 + delete _program_payload;
1.77 +
1.78 + return L4_EOK;
1.79 }
1.80
1.81 /* vim: tabstop=2 expandtab shiftwidth=2