diff --git a/repos/base-nova/include/nova/cap_map.h b/repos/base-nova/include/nova/cap_map.h
index 4ee78bf29e..e5b1d3d221 100644
--- a/repos/base-nova/include/nova/cap_map.h
+++ b/repos/base-nova/include/nova/cap_map.h
@@ -23,6 +23,8 @@
#include
+#include
+
#include
#include
@@ -36,9 +38,10 @@ namespace Genode {
addr_t _base = 0;
addr_t _last = 0;
- enum {
+ enum
+ {
HEADER = sizeof(_base) + sizeof(_mutex) + sizeof(_last),
- CAP_RANGE_SIZE = 4096,
+ CAP_RANGE_SIZE = 131072,
WORDS = (CAP_RANGE_SIZE - HEADER - sizeof(Avl_node)) / sizeof(addr_t),
};
@@ -51,8 +54,8 @@ namespace Genode {
Cap_range(addr_t base) : _base(base)
{
- static_assert(sizeof(*this) == CAP_RANGE_SIZE,
- "Cap_range misconfigured");
+ //static_assert(sizeof(*this) == CAP_RANGE_SIZE,
+ //"Cap_range misconfigured");
for (unsigned i = 0; i < elements(); i++)
_cap_array[i] = 0;
diff --git a/repos/base-nova/include/spec/64bit/nova/syscalls.h b/repos/base-nova/include/spec/64bit/nova/syscalls.h
index 3ddc692e6f..d7e98c4747 100644
--- a/repos/base-nova/include/spec/64bit/nova/syscalls.h
+++ b/repos/base-nova/include/spec/64bit/nova/syscalls.h
@@ -45,7 +45,7 @@ namespace Nova {
ALWAYS_INLINE
inline mword_t rdi(Syscall s, uint8_t flags, mword_t sel)
{
- return sel << 12 | (flags & 0xf) << 8 | s;
+ return sel << 9 | (flags & 0xf) << 5 | s;
}
@@ -454,9 +454,13 @@ namespace Nova {
}
ALWAYS_INLINE
- inline uint8_t alloc_cores(mword_t count, mword_t &allocated)
+ inline uint8_t alloc_cores(mword_t count, mword_t &allocated, mword_t &remainder)
{
- return syscall_5(NOVA_ALLOC_CORES, 0, 0, count, allocated);
+ Nova::mword_t rest = 0;
+ Nova::mword_t null = 0;
+ Nova::uint8_t res = syscall_6(NOVA_ALLOC_CORES, 0, 0, count, allocated, rest, null);
+ remainder = rest;
+ return res;
}
ALWAYS_INLINE
diff --git a/repos/base-nova/src/core/platform.cc b/repos/base-nova/src/core/platform.cc
index e9e625d296..884ddbaaa7 100644
--- a/repos/base-nova/src/core/platform.cc
+++ b/repos/base-nova/src/core/platform.cc
@@ -103,7 +103,7 @@ addr_t Platform::_map_pages(addr_t const phys_addr, addr_t const pages,
*****************************/
-enum { CORE_PAGER_UTCB_ADDR = 0xbff02000 };
+enum { CORE_PAGER_UTCB_ADDR = 0xfff02000 };
/**
@@ -200,7 +200,7 @@ static void page_fault_handler()
static addr_t core_pager_stack_top()
{
- enum { STACK_SIZE = 4*1024 };
+ enum { STACK_SIZE = 8*1024 };
static char stack[STACK_SIZE];
return (addr_t)&stack[STACK_SIZE - sizeof(addr_t)];
}
@@ -824,26 +824,28 @@ Platform::Platform()
log(Number_of_bytes(kernel_memory), " kernel memory"); log("");
/* add capability selector ranges to map */
- unsigned const first_index = 0x2000;
+ unsigned const first_index = 0x0000;
unsigned index = first_index;
for (unsigned i = 0; i < 32; i++)
{
void * phys_ptr = nullptr;
- ram_alloc().alloc_aligned(get_page_size(), get_page_size_log2()).with_result(
+ ram_alloc().alloc_aligned(128*get_page_size(), get_page_size_log2()).with_result(
[&] (void *ptr) { phys_ptr = ptr; },
[&] (Range_allocator::Alloc_error) { /* covered by nullptr test below */ });
if (phys_ptr == nullptr)
break;
+ log("Mapping mem for cap range ", i);
addr_t phys_addr = reinterpret_cast(phys_ptr);
- addr_t core_local_addr = _map_pages(phys_addr, 1);
+ addr_t core_local_addr = _map_pages(phys_addr, 128);
if (!core_local_addr) {
ram_alloc().free(phys_ptr);
break;
}
+ log("Creating cap range ", i, " at ", reinterpret_cast(core_local_addr));
Cap_range &range = *reinterpret_cast(core_local_addr);
construct_at(&range, index);
@@ -851,6 +853,7 @@ Platform::Platform()
cap_map().insert(range);
index = (unsigned)(range.base() + range.elements());
+ log("Created cap range ", i, " at ", reinterpret_cast(core_local_addr));
}
_max_caps = index - first_index;
@@ -924,6 +927,7 @@ Platform::Platform()
(unsigned)(sc_idle_base + kernel_cpu_id),
"killed");
});
+ log("Added idle ECs to trace sources");
/* add exception handler EC for core and EC root thread to trace sources */
struct Core_trace_source : public Trace::Source::Info_accessor,
@@ -972,6 +976,7 @@ Platform::Platform()
registry.insert(this);
}
};
+ log("Added exception handler EC");
new (core_mem_alloc())
Core_trace_source(Trace::sources(),
@@ -982,9 +987,9 @@ Platform::Platform()
Core_trace_source(Trace::sources(),
Affinity::Location(0, 0, _cpus.width(), 1),
hip.sel_exc + 1, "root");
+ log("Created trace sources");
}
-
addr_t Platform::_rom_module_phys(addr_t virt)
{
return virt - (addr_t)&_prog_img_beg + _core_phys_start;
diff --git a/repos/base/src/core/main.cc b/repos/base/src/core/main.cc
index f6e39e028c..18e0ddf8a4 100644
--- a/repos/base/src/core/main.cc
+++ b/repos/base/src/core/main.cc
@@ -179,7 +179,7 @@ class Core_child : public Child_policy
Pd_session &ref_pd() override { return _core_pd; }
Pd_session_capability ref_pd_cap() const override { return _core_pd_cap; }
- size_t session_alloc_batch_size() const override { return 128; }
+ size_t session_alloc_batch_size() const override { return 2*128; }
};