1.1 --- a/libexec/include/exec/process.h Thu Sep 29 18:15:39 2022 +0200
1.2 +++ b/libexec/include/exec/process.h Fri Sep 30 23:25:01 2022 +0200
1.3 @@ -72,10 +72,7 @@
1.4 {
1.5 protected:
1.6 l4_cap_idx_t _task = L4_INVALID_CAP;
1.7 -
1.8 - /* UTCB details. */
1.9 -
1.10 - l4_addr_t _utcb_start;
1.11 + unsigned int _thread_number;
1.12
1.13 /* Common and thread environment details. */
1.14
2.1 --- a/libexec/lib/src/process.cc Thu Sep 29 18:15:39 2022 +0200
2.2 +++ b/libexec/lib/src/process.cc Fri Sep 30 23:25:01 2022 +0200
2.3 @@ -31,18 +31,18 @@
2.4
2.5 /* Obtain a flexpage defining the UTCB area location and size in a new task. */
2.6
2.7 -static l4_fpage_t get_utcb_fpage()
2.8 +static l4_fpage_t get_utcb_fpage(unsigned int page, unsigned int pages)
2.9 {
2.10 /* UTCB location and size. */
2.11
2.12 - int utcb_log2size = page_order(Default_max_threads * L4_UTCB_OFFSET);
2.13 + int utcb_log2size = page_order(pages * Default_max_threads * L4_UTCB_OFFSET);
2.14
2.15 /* Round up to at least one page. */
2.16
2.17 if (utcb_log2size < L4_PAGESHIFT)
2.18 utcb_log2size = L4_PAGESHIFT;
2.19
2.20 - return l4_fpage(Utcb_area_start, utcb_log2size, 0);
2.21 + return l4_fpage(Utcb_area_start + page * (1UL << utcb_log2size), utcb_log2size, 0);
2.22 }
2.23
2.24
2.25 @@ -52,11 +52,7 @@
2.26
2.27 Process::Process(int reserved_threads)
2.28 {
2.29 - /* Obtain UTCB area details for the task. */
2.30 -
2.31 - l4_fpage_t utcb_fpage = get_utcb_fpage();
2.32 -
2.33 - _utcb_start = l4_fpage_memaddr(utcb_fpage);
2.34 + _thread_number = 0;
2.35
2.36 /* Populate the common initial environment for the threads. */
2.37
2.38 @@ -64,8 +60,6 @@
2.39 _env.log = L4_BASE_LOG_CAP;
2.40 _env.scheduler = L4_BASE_SCHEDULER_CAP;
2.41 _env.mem_alloc = L4_EXEC_MA_CAP;
2.42 - _env.utcb_area = utcb_fpage;
2.43 - _env.first_free_utcb = l4_fpage_memaddr(utcb_fpage) + reserved_threads * L4_UTCB_OFFSET;
2.44
2.45 /* Capability details that are updated for each thread. */
2.46
2.47 @@ -96,7 +90,7 @@
2.48 if (l4_is_invalid_cap(_task))
2.49 return -L4_ENOMEM;
2.50
2.51 - return l4_error(l4_factory_create_task(l4re_env()->factory, _task, _env.utcb_area));
2.52 + return l4_error(l4_factory_create_task(l4re_env()->factory, _task, get_utcb_fpage(0, 2)));
2.53 }
2.54
2.55 long Process::create_thread(l4_cap_idx_t *thread)
2.56 @@ -188,12 +182,19 @@
2.57 if (err)
2.58 return err;
2.59
2.60 + /* Obtain UTCB area details for the thread. */
2.61 +
2.62 + l4_fpage_t utcb_fpage = get_utcb_fpage(_thread_number, 1);
2.63 +
2.64 + _env.utcb_area = utcb_fpage;
2.65 + _env.first_free_utcb = l4_fpage_memaddr(utcb_fpage);
2.66 +
2.67 /* Initialise the thread with pager, UTCB and task details. */
2.68
2.69 l4_thread_control_start();
2.70 l4_thread_control_pager(_env.rm);
2.71 l4_thread_control_exc_handler(_env.rm);
2.72 - l4_thread_control_bind((l4_utcb_t *) _utcb_start, _task);
2.73 + l4_thread_control_bind((l4_utcb_t *) l4_fpage_memaddr(_env.utcb_area), _task);
2.74
2.75 err = l4_error(l4_thread_control_commit(thread));
2.76
2.77 @@ -228,9 +229,9 @@
2.78 if (err)
2.79 return err;
2.80
2.81 - /* Select a new address for the next thread. */
2.82 + /* Select a new thread. */
2.83
2.84 - _utcb_start += L4_UTCB_OFFSET;
2.85 + _thread_number++;
2.86
2.87 /* Start the thread. */
2.88