diff --git a/repos/base-fiasco/src/core/platform.cc b/repos/base-fiasco/src/core/platform.cc
index 28ee35914..0ecf2cf96 100644
--- a/repos/base-fiasco/src/core/platform.cc
+++ b/repos/base-fiasco/src/core/platform.cc
@@ -25,6 +25,7 @@
#include
/* core includes */
+#include
#include
#include
#include
@@ -457,6 +458,29 @@ Platform::Platform() :
/* we never call _core_thread.start(), so set name directly */
Fiasco::fiasco_register_thread_name(core_thread->native_thread_id(), core_thread->name());
+
+ /* core log as ROM module */
+ {
+ void * phys_ptr = nullptr;
+ unsigned const pages = 1;
+ size_t const log_size = pages << get_page_size_log2();
+
+ ram_alloc()->alloc_aligned(log_size, &phys_ptr, get_page_size_log2());
+ addr_t const phys_addr = reinterpret_cast(phys_ptr);
+
+ void * const core_local_ptr = phys_ptr;
+ addr_t const core_local_addr = phys_addr;
+
+ /* let one page free after the log buffer */
+ region_alloc()->remove_range(core_local_addr, log_size + get_page_size());
+
+ memset(core_local_ptr, 0, log_size);
+
+ _rom_fs.insert(new (core_mem_alloc()) Rom_module(phys_addr, log_size,
+ "core_log"));
+
+ init_core_log(Core_log_range { core_local_addr, log_size } );
+ }
}
diff --git a/repos/base-foc/src/core/platform.cc b/repos/base-foc/src/core/platform.cc
index f0ba5df1a..3aa925b07 100644
--- a/repos/base-foc/src/core/platform.cc
+++ b/repos/base-foc/src/core/platform.cc
@@ -25,6 +25,8 @@
/* core includes */
#include
+#include
+#include
#include
#include
#include
@@ -457,6 +459,29 @@ Platform::Platform() :
core_thread->pager(&_sigma0);
_core_pd->bind_thread(core_thread);
+
+ /* core log as ROM module */
+ {
+ void * core_local_ptr = nullptr;
+ void * phys_ptr = nullptr;
+ unsigned const pages = 1;
+ size_t const log_size = pages << get_page_size_log2();
+
+ ram_alloc()->alloc_aligned(log_size, &phys_ptr, get_page_size_log2());
+ addr_t const phys_addr = reinterpret_cast(phys_ptr);
+
+ /* let one page free after the log buffer */
+ region_alloc()->alloc_aligned(log_size, &core_local_ptr, get_page_size_log2());
+ addr_t const core_local_addr = reinterpret_cast(core_local_ptr);
+
+ map_local(phys_addr, core_local_addr, pages);
+ memset(core_local_ptr, 0, log_size);
+
+ _rom_fs.insert(new (core_mem_alloc()) Rom_module(phys_addr, log_size,
+ "core_log"));
+
+ init_core_log(Core_log_range { core_local_addr, log_size } );
+ }
}
diff --git a/repos/base-hw/src/core/platform.cc b/repos/base-hw/src/core/platform.cc
index 0e0adaad3..cea846bda 100644
--- a/repos/base-hw/src/core/platform.cc
+++ b/repos/base-hw/src/core/platform.cc
@@ -17,6 +17,7 @@
/* core includes */
#include
+#include
#include
#include
#include
@@ -134,6 +135,29 @@ Platform::Platform()
_init_rom_modules();
_init_additional();
+ /* core log as ROM module */
+ {
+ void * core_local_ptr = nullptr;
+ void * phys_ptr = nullptr;
+ unsigned const pages = 1;
+ size_t const log_size = pages << get_page_size_log2();
+
+ ram_alloc()->alloc_aligned(log_size, &phys_ptr, get_page_size_log2());
+ addr_t const phys_addr = reinterpret_cast(phys_ptr);
+
+ /* let one page free after the log buffer */
+ region_alloc()->alloc_aligned(log_size, &core_local_ptr, get_page_size_log2());
+ addr_t const core_local_addr = reinterpret_cast(core_local_ptr);
+
+ map_local(phys_addr, core_local_addr, pages);
+ memset(core_local_ptr, 0, log_size);
+
+ _rom_fs.insert(new (core_mem_alloc()) Rom_module(phys_addr, log_size,
+ "core_log"));
+
+ init_core_log(Core_log_range { core_local_addr, log_size } );
+ }
+
/* print ressource summary */
log(":virt_alloc: ", *_core_mem_alloc.virt_alloc());
log(":phys_alloc: ", *_core_mem_alloc.phys_alloc());
diff --git a/repos/base-nova/src/core/include/platform.h b/repos/base-nova/src/core/include/platform.h
index 54c025cd3..1c5bb557c 100644
--- a/repos/base-nova/src/core/include/platform.h
+++ b/repos/base-nova/src/core/include/platform.h
@@ -50,7 +50,8 @@ namespace Genode {
/* map of virtual cpu ids in Genode to kernel cpu ids */
uint8_t map_cpu_ids[MAX_SUPPORTED_CPUS];
- addr_t _map_pages(addr_t phys_page, addr_t pages);
+ addr_t _map_pages(addr_t phys_page, addr_t pages,
+ bool guard_page = false);
size_t _max_caps = 0;
diff --git a/repos/base-nova/src/core/platform.cc b/repos/base-nova/src/core/platform.cc
index fef8f1329..1c6b32ce4 100644
--- a/repos/base-nova/src/core/platform.cc
+++ b/repos/base-nova/src/core/platform.cc
@@ -23,6 +23,7 @@
/* core includes */
#include
+#include
#include
#include
#include
@@ -71,14 +72,15 @@ extern unsigned _prog_img_beg, _prog_img_end;
* This function uses the virtual-memory region allocator to find a region
* fitting the desired mapping. Other allocators are left alone.
*/
-addr_t Platform::_map_pages(addr_t phys_page, addr_t const pages)
+addr_t Platform::_map_pages(addr_t const phys_addr, addr_t const pages,
+ bool guard_page)
{
- addr_t const phys_addr = phys_page << get_page_size_log2();
- addr_t const size = pages << get_page_size_log2();
+ addr_t const size = pages << get_page_size_log2();
/* try to reserve contiguous virtual area */
void *core_local_ptr = 0;
- if (!region_alloc()->alloc(size, &core_local_ptr))
+ if (region_alloc()->alloc_aligned(size + (guard_page ? get_page_size() : 0),
+ &core_local_ptr, get_page_size_log2()).error())
return 0;
addr_t const core_local_addr = reinterpret_cast(core_local_ptr);
@@ -637,10 +639,9 @@ Platform::Platform() :
unsigned const pages = 1;
void * phys_ptr = 0;
- ram_alloc()->alloc(get_page_size(), &phys_ptr);
+ ram_alloc()->alloc_aligned(get_page_size(), &phys_ptr, get_page_size_log2());
addr_t const phys_addr = reinterpret_cast(phys_ptr);
- addr_t const core_local_addr = _map_pages(phys_addr >> get_page_size_log2(),
- pages);
+ addr_t const core_local_addr = _map_pages(phys_addr, pages);
Genode::Xml_generator xml(reinterpret_cast(core_local_addr),
pages << get_page_size_log2(),
@@ -681,11 +682,11 @@ Platform::Platform() :
/* export hypervisor info page as ROM module */
{
- void * phys_ptr = 0;
- ram_alloc()->alloc(get_page_size(), &phys_ptr);
- addr_t phys_addr = reinterpret_cast(phys_ptr);
+ void * phys_ptr = nullptr;
+ ram_alloc()->alloc_aligned(get_page_size(), &phys_ptr, get_page_size_log2());
- addr_t core_local_addr = _map_pages(phys_addr >> get_page_size_log2(), 1);
+ addr_t const phys_addr = reinterpret_cast(phys_ptr);
+ addr_t const core_local_addr = _map_pages(phys_addr, 1);
memcpy(reinterpret_cast(core_local_addr), hip, get_page_size());
@@ -697,6 +698,24 @@ Platform::Platform() :
"hypervisor_info_page"));
}
+ /* core log as ROM module */
+ {
+ void * phys_ptr = nullptr;
+ unsigned const pages = 1;
+ size_t const log_size = pages << get_page_size_log2();
+
+ ram_alloc()->alloc_aligned(log_size, &phys_ptr, get_page_size_log2());
+ addr_t const phys_addr = reinterpret_cast(phys_ptr);
+
+ addr_t const core_local_addr = _map_pages(phys_addr, pages, true);
+ memset(reinterpret_cast(core_local_addr), 0, log_size);
+
+ _rom_fs.insert(new (core_mem_alloc()) Rom_module(phys_addr, log_size,
+ "core_log"));
+
+ init_core_log( Core_log_range { core_local_addr, log_size } );
+ }
+
/* I/O port allocator (only meaningful for x86) */
_io_port_alloc.add_range(0, 0x10000);
@@ -717,10 +736,10 @@ Platform::Platform() :
for (unsigned i = 0; i < 32; i++)
{
void * phys_ptr = 0;
- ram_alloc()->alloc(4096, &phys_ptr);
+ ram_alloc()->alloc_aligned(get_page_size(), &phys_ptr, get_page_size_log2());
addr_t phys_addr = reinterpret_cast(phys_ptr);
- addr_t core_local_addr = _map_pages(phys_addr >> get_page_size_log2(), 1);
+ addr_t core_local_addr = _map_pages(phys_addr, 1);
Cap_range * range = reinterpret_cast(core_local_addr);
*range = Cap_range(index);
diff --git a/repos/base-okl4/src/core/platform.cc b/repos/base-okl4/src/core/platform.cc
index 01044d966..3ab0e9fea 100644
--- a/repos/base-okl4/src/core/platform.cc
+++ b/repos/base-okl4/src/core/platform.cc
@@ -25,6 +25,7 @@
/* core includes */
#include
+#include
#include
#include
#include
@@ -192,6 +193,29 @@ Platform::Platform() :
core_thread->set_l4_thread_id(Okl4::L4_rootserver);
_core_pd->bind_thread(core_thread);
+
+ /* core log as ROM module */
+ {
+ void * core_local_ptr = nullptr;
+ void * phys_ptr = nullptr;
+ unsigned const pages = 1;
+ size_t const log_size = pages << get_page_size_log2();
+
+ ram_alloc()->alloc_aligned(log_size, &phys_ptr, get_page_size_log2());
+ addr_t const phys_addr = reinterpret_cast(phys_ptr);
+
+ /* let one page free after the log buffer */
+ region_alloc()->alloc_aligned(log_size, &core_local_ptr, get_page_size_log2());
+ addr_t const core_local_addr = reinterpret_cast(core_local_ptr);
+
+ map_local(phys_addr, core_local_addr, pages);
+ memset(core_local_ptr, 0, log_size);
+
+ _rom_fs.insert(new (core_mem_alloc()) Rom_module(phys_addr, log_size,
+ "core_log"));
+
+ init_core_log(Core_log_range { core_local_addr, log_size } );
+ }
}
diff --git a/repos/base-pistachio/src/core/platform.cc b/repos/base-pistachio/src/core/platform.cc
index 1a8434c1c..77375373f 100644
--- a/repos/base-pistachio/src/core/platform.cc
+++ b/repos/base-pistachio/src/core/platform.cc
@@ -26,6 +26,7 @@
/* core includes */
#include
+#include
#include
#include
#include
@@ -633,6 +634,29 @@ Platform::Platform() :
core_thread.pager(sigma0());
core_pd()->bind_thread(&core_thread);
+
+ /* core log as ROM module */
+ {
+ void * phys_ptr = nullptr;
+ unsigned const pages = 1;
+ size_t const log_size = pages << get_page_size_log2();
+
+ ram_alloc()->alloc_aligned(log_size, &phys_ptr, get_page_size_log2());
+ addr_t const phys_addr = reinterpret_cast(phys_ptr);
+
+ void * const core_local_ptr = phys_ptr;
+ addr_t const core_local_addr = phys_addr;
+
+ /* let one page free after the log buffer */
+ region_alloc()->remove_range(core_local_addr, log_size + get_page_size());
+
+ memset(core_local_ptr, 0, log_size);
+
+ _rom_fs.insert(new (core_mem_alloc()) Rom_module(phys_addr, log_size,
+ "core_log"));
+
+ init_core_log(Core_log_range { core_local_addr, log_size } );
+ }
}
diff --git a/repos/base-sel4/src/core/platform.cc b/repos/base-sel4/src/core/platform.cc
index e5c5e2d28..676554785 100644
--- a/repos/base-sel4/src/core/platform.cc
+++ b/repos/base-sel4/src/core/platform.cc
@@ -20,6 +20,7 @@
/* core includes */
#include
+#include
#include
#include
#include
@@ -360,7 +361,7 @@ void Platform::_init_rom_modules()
addr_t const phys_addr = Untyped_memory::alloc_page(*ram_alloc());
Untyped_memory::convert_to_page_frames(phys_addr, pages);
- if (!region_alloc()->alloc(rom_size, &virt_ptr)) {
+ if (region_alloc()->alloc_aligned(rom_size, &virt_ptr, get_page_size_log2()).error()) {
error("could not setup platform_info ROM - region allocation error");
Untyped_memory::free_page(*ram_alloc(), phys_addr);
return;
@@ -526,7 +527,7 @@ Platform::Platform()
/* add some minor virtual region for dynamic usage by core */
addr_t const virt_size = 32 * 1024 * 1024;
void * virt_ptr = nullptr;
- if (_unused_virt_alloc.alloc(virt_size, &virt_ptr)) {
+ if (_unused_virt_alloc.alloc_aligned(virt_size, &virt_ptr, get_page_size_log2()).ok()) {
addr_t const virt_addr = (addr_t)virt_ptr;
@@ -585,6 +586,28 @@ Platform::Platform()
/* I/O port allocator (only meaningful for x86) */
_io_port_alloc.add_range(0, 0x10000);
+ /* core log as ROM module */
+ {
+ void * core_local_ptr = nullptr;
+ unsigned const pages = 1;
+ size_t const log_size = pages << get_page_size_log2();
+
+ addr_t const phys_addr = Untyped_memory::alloc_page(*ram_alloc());
+ Untyped_memory::convert_to_page_frames(phys_addr, pages);
+
+ /* let one page free after the log buffer */
+ region_alloc()->alloc_aligned(log_size + get_page_size(), &core_local_ptr, get_page_size_log2());
+ addr_t const core_local_addr = reinterpret_cast(core_local_ptr);
+
+ map_local(phys_addr, core_local_addr, pages, this);
+ memset(core_local_ptr, 0, log_size);
+
+ _rom_fs.insert(new (core_mem_alloc()) Rom_module(phys_addr, log_size,
+ "core_log"));
+
+ init_core_log(Core_log_range { core_local_addr, log_size } );
+ }
+
/*
* Log statistics about allocator initialization
*/