diff --git a/os/src/server/rom_prefetcher/main.cc b/os/src/server/rom_prefetcher/main.cc
index 330e6e4fb7..7e336bd624 100644
--- a/os/src/server/rom_prefetcher/main.cc
+++ b/os/src/server/rom_prefetcher/main.cc
@@ -20,34 +20,35 @@
#include
#include
#include
+#include
volatile int dummy;
+static void prefetch_dataspace(Genode::Dataspace_capability ds)
+{
+ char *mapped = Genode::env()->rm_session()->attach(ds);
+ Genode::size_t size = Genode::Dataspace_client(ds).size();
+
+ /*
+ * Modify global volatile 'dummy' variable to prevent the compiler
+ * from removing the prefetch loop.
+ */
+
+ enum { PREFETCH_STEP = 4096 };
+ for (Genode::size_t i = 0; i < size; i += PREFETCH_STEP)
+ dummy += mapped[i];
+
+ Genode::env()->rm_session()->detach(mapped);
+}
+
+
class Rom_session_component : public Genode::Rpc_object
{
private:
Genode::Rom_connection _rom;
- enum { _PREFETCH_STEP = 4096 };
-
- void _prefetch_dataspace(Genode::Dataspace_capability ds)
- {
- char *mapped = Genode::env()->rm_session()->attach(ds);
- Genode::size_t size = Genode::Dataspace_client(ds).size();
-
- /*
- * Modify global volatile 'dummy' variable to prevent the compiler
- * from removing the prefetch loop.
- */
-
- for (Genode::size_t i = 0; i < size; i += _PREFETCH_STEP)
- dummy += mapped[i];
-
- Genode::env()->rm_session()->detach(mapped);
- }
-
public:
/**
@@ -57,7 +58,7 @@ class Rom_session_component : public Genode::Rpc_object
*/
Rom_session_component(const char *filename) : _rom(filename)
{
- _prefetch_dataspace(_rom.dataspace());
+ prefetch_dataspace(_rom.dataspace());
}
/***************************
@@ -105,6 +106,31 @@ int main(int argc, char **argv)
/* connection to capability service needed to create capabilities */
static Cap_connection cap;
+ /*
+ * Prefetch ROM files specified in the config
+ */
+ try {
+ Genode::Xml_node entry = config()->xml_node().sub_node("rom");
+ for (;;) {
+
+ enum { NAME_MAX_LEN = 64 };
+ char name[NAME_MAX_LEN];
+ name[0] = 0;
+ entry.attribute("name").value(name, sizeof(name));
+
+ try {
+ Rom_connection rom(name);
+ PINF("prefetching ROM file %s", name);
+ prefetch_dataspace(rom.dataspace());
+ } catch (...) {
+ PERR("could not open ROM file %s", name);
+ }
+
+ /* proceed with next XML node */
+ entry = entry.next("rom");
+ }
+ } catch (...) { }
+
static Sliced_heap sliced_heap(env()->ram_session(),
env()->rm_session());