mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-10 12:51:34 +00:00
lx_kit/lx_emul: support explicit init call
Add the possibility to execute a module-init call by name using 'lx_emul_init_call', this is used, for example, by lxip to configure and re-configure the IP address through 'ip_auto_config'. issue #5104
This commit is contained in:
parent
7abe07e2cf
commit
c2a2ed67bb
@ -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);
|
||||
|
@ -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) {}
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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)); }
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user