diff --git a/repos/dde_linux/src/include/lx_emul/init.h b/repos/dde_linux/src/include/lx_emul/init.h index fac92465bb..84e38c4222 100644 --- a/repos/dde_linux/src/include/lx_emul/init.h +++ b/repos/dde_linux/src/include/lx_emul/init.h @@ -23,6 +23,8 @@ void lx_emul_initcalls(void); /* this function is generated into 'initcall_table.c' */ void lx_emul_register_initcalls(void); +void lx_emul_initcall(char const *name); + void lx_emul_register_initcall(int (*initcall)(void), const char * name); void lx_emul_start_kernel(void * dtb); diff --git a/repos/dde_linux/src/include/lx_kit/init.h b/repos/dde_linux/src/include/lx_kit/init.h index e87da941dc..976dde3b92 100644 --- a/repos/dde_linux/src/include/lx_kit/init.h +++ b/repos/dde_linux/src/include/lx_kit/init.h @@ -36,8 +36,10 @@ class Lx_kit::Initcalls { unsigned int prio; int (* call) (void); + char const *name; - E(unsigned int p, int (*fn)(void)) : prio(p), call(fn) {} + E(unsigned int p, int (*fn)(void), char const *name) + : prio(p), call(fn), name(name) {} }; Heap & _heap; @@ -45,8 +47,9 @@ class Lx_kit::Initcalls public: - void add(int (*initcall)(void), unsigned int prio); + void add(int (*initcall)(void), unsigned int prio, char const *name); void execute_in_order(); + void execute(char const *name); Initcalls(Heap & heap) : _heap(heap) {} }; diff --git a/repos/dde_linux/src/lib/lx_emul/init.cc b/repos/dde_linux/src/lib/lx_emul/init.cc index 7d91b65abb..a52bdabb35 100644 --- a/repos/dde_linux/src/lib/lx_emul/init.cc +++ b/repos/dde_linux/src/lib/lx_emul/init.cc @@ -26,6 +26,12 @@ extern "C" void lx_emul_initcalls() } +extern "C" void lx_emul_initcall(char const *name) +{ + Lx_kit::env().initcalls.execute(name); +} + + extern "C" void lx_emul_register_initcall(int (*initcall)(void), const char * name) { @@ -40,7 +46,7 @@ extern "C" void lx_emul_register_initcall(int (*initcall)(void), for (unsigned i = 0; i < (sizeof(lx_emul_initcall_order) / sizeof(char*)); i++) { if (Genode::strcmp(name, lx_emul_initcall_order[i]) == 0) { - Lx_kit::env().initcalls.add(initcall, i); + Lx_kit::env().initcalls.add(initcall, i, name); return; } } diff --git a/repos/dde_linux/src/lib/lx_kit/init.cc b/repos/dde_linux/src/lib/lx_kit/init.cc index b829743651..873d27be9a 100644 --- a/repos/dde_linux/src/lib/lx_kit/init.cc +++ b/repos/dde_linux/src/lib/lx_kit/init.cc @@ -23,8 +23,9 @@ namespace Lx_kit { } -void Lx_kit::Initcalls::add(int (*initcall)(void), unsigned int prio) { - _call_list.insert(new (_heap) E(prio, initcall)); } +void Lx_kit::Initcalls::add(int (*initcall)(void), unsigned int prio, + char const *name) { + _call_list.insert(new (_heap) E(prio, initcall, name)); } void Lx_kit::Initcalls::execute_in_order() @@ -44,6 +45,15 @@ void Lx_kit::Initcalls::execute_in_order() } +void Lx_kit::Initcalls::execute(char const *name) +{ + for (E * entry = _call_list.first(); entry; entry = entry->next()) { + if (Genode::strcmp(entry->name, name) == 0) + entry->call(); + } +} + + void Lx_kit::Pci_fixup_calls::add(void (*fn)(struct pci_dev*)) { _call_list.insert(new (_heap) E(fn)); }