1.1 --- a/libexec/lib/src/process.cc Thu Sep 29 18:15:39 2022 +0200
1.2 +++ b/libexec/lib/src/process.cc Fri Sep 30 23:25:01 2022 +0200
1.3 @@ -31,18 +31,18 @@
1.4
1.5 /* Obtain a flexpage defining the UTCB area location and size in a new task. */
1.6
1.7 -static l4_fpage_t get_utcb_fpage()
1.8 +static l4_fpage_t get_utcb_fpage(unsigned int page, unsigned int pages)
1.9 {
1.10 /* UTCB location and size. */
1.11
1.12 - int utcb_log2size = page_order(Default_max_threads * L4_UTCB_OFFSET);
1.13 + int utcb_log2size = page_order(pages * Default_max_threads * L4_UTCB_OFFSET);
1.14
1.15 /* Round up to at least one page. */
1.16
1.17 if (utcb_log2size < L4_PAGESHIFT)
1.18 utcb_log2size = L4_PAGESHIFT;
1.19
1.20 - return l4_fpage(Utcb_area_start, utcb_log2size, 0);
1.21 + return l4_fpage(Utcb_area_start + page * (1UL << utcb_log2size), utcb_log2size, 0);
1.22 }
1.23
1.24
1.25 @@ -52,11 +52,7 @@
1.26
1.27 Process::Process(int reserved_threads)
1.28 {
1.29 - /* Obtain UTCB area details for the task. */
1.30 -
1.31 - l4_fpage_t utcb_fpage = get_utcb_fpage();
1.32 -
1.33 - _utcb_start = l4_fpage_memaddr(utcb_fpage);
1.34 + _thread_number = 0;
1.35
1.36 /* Populate the common initial environment for the threads. */
1.37
1.38 @@ -64,8 +60,6 @@
1.39 _env.log = L4_BASE_LOG_CAP;
1.40 _env.scheduler = L4_BASE_SCHEDULER_CAP;
1.41 _env.mem_alloc = L4_EXEC_MA_CAP;
1.42 - _env.utcb_area = utcb_fpage;
1.43 - _env.first_free_utcb = l4_fpage_memaddr(utcb_fpage) + reserved_threads * L4_UTCB_OFFSET;
1.44
1.45 /* Capability details that are updated for each thread. */
1.46
1.47 @@ -96,7 +90,7 @@
1.48 if (l4_is_invalid_cap(_task))
1.49 return -L4_ENOMEM;
1.50
1.51 - return l4_error(l4_factory_create_task(l4re_env()->factory, _task, _env.utcb_area));
1.52 + return l4_error(l4_factory_create_task(l4re_env()->factory, _task, get_utcb_fpage(0, 2)));
1.53 }
1.54
1.55 long Process::create_thread(l4_cap_idx_t *thread)
1.56 @@ -188,12 +182,19 @@
1.57 if (err)
1.58 return err;
1.59
1.60 + /* Obtain UTCB area details for the thread. */
1.61 +
1.62 + l4_fpage_t utcb_fpage = get_utcb_fpage(_thread_number, 1);
1.63 +
1.64 + _env.utcb_area = utcb_fpage;
1.65 + _env.first_free_utcb = l4_fpage_memaddr(utcb_fpage);
1.66 +
1.67 /* Initialise the thread with pager, UTCB and task details. */
1.68
1.69 l4_thread_control_start();
1.70 l4_thread_control_pager(_env.rm);
1.71 l4_thread_control_exc_handler(_env.rm);
1.72 - l4_thread_control_bind((l4_utcb_t *) _utcb_start, _task);
1.73 + l4_thread_control_bind((l4_utcb_t *) l4_fpage_memaddr(_env.utcb_area), _task);
1.74
1.75 err = l4_error(l4_thread_control_commit(thread));
1.76
1.77 @@ -228,9 +229,9 @@
1.78 if (err)
1.79 return err;
1.80
1.81 - /* Select a new address for the next thread. */
1.82 + /* Select a new thread. */
1.83
1.84 - _utcb_start += L4_UTCB_OFFSET;
1.85 + _thread_number++;
1.86
1.87 /* Start the thread. */
1.88