diff --git a/repos/base-nova/include/nova/syscall-generic.h b/repos/base-nova/include/nova/syscall-generic.h
index e4d478b8a8..dee437c632 100644
--- a/repos/base-nova/include/nova/syscall-generic.h
+++ b/repos/base-nova/include/nova/syscall-generic.h
@@ -91,6 +91,8 @@ namespace Nova {
struct Mem_desc
{
enum Type {
+ ACPI_XSDT = -4,
+ ACPI_RSDT = -3,
MULTIBOOT_MODULE = -2,
MICROHYPERVISOR = -1,
AVAILABLE_MEMORY = 1,
diff --git a/repos/base-nova/ports/nova.hash b/repos/base-nova/ports/nova.hash
index 853c5f527e..f0e65587d5 100644
--- a/repos/base-nova/ports/nova.hash
+++ b/repos/base-nova/ports/nova.hash
@@ -1 +1 @@
-1dbfe82b4c40db4c637cc51f65d937abfaac2d52
+d303aea094b6576a9bb0ba350c7cf4eb648e5ca4
diff --git a/repos/base-nova/ports/nova.port b/repos/base-nova/ports/nova.port
index 6363da913b..a07b869e75 100644
--- a/repos/base-nova/ports/nova.port
+++ b/repos/base-nova/ports/nova.port
@@ -4,7 +4,7 @@ DOWNLOADS := nova.git
# r9 branch - use r9_debug for more verbose kernel messages
URL(nova) := https://github.com/alex-ab/NOVA.git
-REV(nova) := 2050648226839931dc675c3ec62f8f598bf6d38a
+REV(nova) := 9a3605ead755be8b5820de3ae6015d6de8baaaf5
DIR(nova) := src/kernel/nova
PATCHES := $(wildcard $(REP_DIR)/patches/*.patch)
diff --git a/repos/base-nova/src/core/platform.cc b/repos/base-nova/src/core/platform.cc
index 86c688bd6e..0ee19b94da 100644
--- a/repos/base-nova/src/core/platform.cc
+++ b/repos/base-nova/src/core/platform.cc
@@ -16,7 +16,8 @@
/* Genode includes */
#include
#include
-#include
+#include
+#include
#include
/* core includes */
@@ -564,10 +565,14 @@ Platform::Platform() :
for (unsigned i = 0; i < num_mem_desc; i++, mem_desc++) {
if (mem_desc->type == Hip::Mem_desc::AVAILABLE_MEMORY) continue;
+ if (mem_desc->type == Hip::Mem_desc::ACPI_RSDT) continue;
+ if (mem_desc->type == Hip::Mem_desc::ACPI_XSDT) continue;
Hip::Mem_desc * mem_d = (Hip::Mem_desc *)mem_desc_base;
for (unsigned j = 0; j < num_mem_desc; j++, mem_d++) {
if (mem_d->type == Hip::Mem_desc::AVAILABLE_MEMORY) continue;
+ if (mem_d->type == Hip::Mem_desc::ACPI_RSDT) continue;
+ if (mem_d->type == Hip::Mem_desc::ACPI_XSDT) continue;
if (mem_d == mem_desc) continue;
/* if regions are disjunct all is fine */
@@ -588,11 +593,16 @@ Platform::Platform() :
* From now on, it is save to use the core allocators...
*/
+ uint64_t rsdt = 0UL;
+ uint64_t xsdt = 0UL;
+
/* build ROM file system */
mem_desc = (Hip::Mem_desc *)mem_desc_base;
for (unsigned i = 0; i < num_mem_desc; i++, mem_desc++) {
+ if (mem_desc->type == Hip::Mem_desc::ACPI_RSDT) rsdt = mem_desc->addr;
+ if (mem_desc->type == Hip::Mem_desc::ACPI_XSDT) xsdt = mem_desc->addr;
if (mem_desc->type != Hip::Mem_desc::MULTIBOOT_MODULE) continue;
- if (!mem_desc->addr || !mem_desc->size || !mem_desc->aux) continue;
+ if (!mem_desc->addr || !mem_desc->size) continue;
/* assume core's ELF image has one-page header */
addr_t const core_phys_start = trunc_page(mem_desc->addr + get_page_size());
@@ -608,6 +618,40 @@ Platform::Platform() :
}
}
+ {
+ /* export x86 platform specific infos */
+
+ unsigned const pages = 1;
+ void * phys_ptr = 0;
+ ram_alloc()->alloc(get_page_size(), &phys_ptr);
+ addr_t const phys_addr = reinterpret_cast(phys_ptr);
+ addr_t const core_local_addr = _map_pages(phys_addr >> get_page_size_log2(),
+ pages);
+
+ Genode::Xml_generator xml(reinterpret_cast(core_local_addr),
+ pages << get_page_size_log2(),
+ "platform_info", [&] ()
+ {
+ xml.node("acpi", [&] () {
+
+ xml.attribute("revision", 2); /* XXX */
+
+ if (rsdt)
+ xml.attribute("rsdt", String<32>(Hex(rsdt)));
+
+ if (xsdt)
+ xml.attribute("xsdt", String<32>(Hex(xsdt)));
+ });
+ });
+
+ unmap_local(__main_thread_utcb, core_local_addr, pages);
+ region_alloc()->free(reinterpret_cast(core_local_addr), pages * get_page_size());
+
+ _rom_fs.insert(new (core_mem_alloc())
+ Rom_module(phys_addr, pages * get_page_size(),
+ "platform_info"));
+ }
+
/* export hypervisor info page as ROM module */
{
void * phys_ptr = 0;
@@ -679,8 +723,7 @@ Platform::Platform() :
*/
Info trace_source_info() const override
{
- char name[32];
- snprintf(name, sizeof(name), "idle%d", affinity.xpos());
+ Genode::String<8> name("idle", affinity.xpos());
uint64_t execution_time = 0;
Nova::sc_ctrl(sc_sel, execution_time);