# HG changeset patch # User Paul Boddie # Date 1664573101 -7200 # Node ID cf0f5adb98264920fbf7c84bb873b086baf5f19a # Parent 672a5524af3a11bfd7e859ca40412999a98fb8b4 Introduced separate UTCB areas for the region mapper and the main program. diff -r 672a5524af3a -r cf0f5adb9826 libexec/include/exec/process.h --- a/libexec/include/exec/process.h Thu Sep 29 18:15:39 2022 +0200 +++ b/libexec/include/exec/process.h Fri Sep 30 23:25:01 2022 +0200 @@ -72,10 +72,7 @@ { protected: l4_cap_idx_t _task = L4_INVALID_CAP; - - /* UTCB details. */ - - l4_addr_t _utcb_start; + unsigned int _thread_number; /* Common and thread environment details. */ diff -r 672a5524af3a -r cf0f5adb9826 libexec/lib/src/process.cc --- a/libexec/lib/src/process.cc Thu Sep 29 18:15:39 2022 +0200 +++ b/libexec/lib/src/process.cc Fri Sep 30 23:25:01 2022 +0200 @@ -31,18 +31,18 @@ /* Obtain a flexpage defining the UTCB area location and size in a new task. */ -static l4_fpage_t get_utcb_fpage() +static l4_fpage_t get_utcb_fpage(unsigned int page, unsigned int pages) { /* UTCB location and size. */ - int utcb_log2size = page_order(Default_max_threads * L4_UTCB_OFFSET); + int utcb_log2size = page_order(pages * Default_max_threads * L4_UTCB_OFFSET); /* Round up to at least one page. */ if (utcb_log2size < L4_PAGESHIFT) utcb_log2size = L4_PAGESHIFT; - return l4_fpage(Utcb_area_start, utcb_log2size, 0); + return l4_fpage(Utcb_area_start + page * (1UL << utcb_log2size), utcb_log2size, 0); } @@ -52,11 +52,7 @@ Process::Process(int reserved_threads) { - /* Obtain UTCB area details for the task. */ - - l4_fpage_t utcb_fpage = get_utcb_fpage(); - - _utcb_start = l4_fpage_memaddr(utcb_fpage); + _thread_number = 0; /* Populate the common initial environment for the threads. */ @@ -64,8 +60,6 @@ _env.log = L4_BASE_LOG_CAP; _env.scheduler = L4_BASE_SCHEDULER_CAP; _env.mem_alloc = L4_EXEC_MA_CAP; - _env.utcb_area = utcb_fpage; - _env.first_free_utcb = l4_fpage_memaddr(utcb_fpage) + reserved_threads * L4_UTCB_OFFSET; /* Capability details that are updated for each thread. */ @@ -96,7 +90,7 @@ if (l4_is_invalid_cap(_task)) return -L4_ENOMEM; - return l4_error(l4_factory_create_task(l4re_env()->factory, _task, _env.utcb_area)); + return l4_error(l4_factory_create_task(l4re_env()->factory, _task, get_utcb_fpage(0, 2))); } long Process::create_thread(l4_cap_idx_t *thread) @@ -188,12 +182,19 @@ if (err) return err; + /* Obtain UTCB area details for the thread. */ + + l4_fpage_t utcb_fpage = get_utcb_fpage(_thread_number, 1); + + _env.utcb_area = utcb_fpage; + _env.first_free_utcb = l4_fpage_memaddr(utcb_fpage); + /* Initialise the thread with pager, UTCB and task details. */ l4_thread_control_start(); l4_thread_control_pager(_env.rm); l4_thread_control_exc_handler(_env.rm); - l4_thread_control_bind((l4_utcb_t *) _utcb_start, _task); + l4_thread_control_bind((l4_utcb_t *) l4_fpage_memaddr(_env.utcb_area), _task); err = l4_error(l4_thread_control_commit(thread)); @@ -228,9 +229,9 @@ if (err) return err; - /* Select a new address for the next thread. */ + /* Select a new thread. */ - _utcb_start += L4_UTCB_OFFSET; + _thread_number++; /* Start the thread. */