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:
Sebastian Sumpf 2023-09-06 16:13:22 +02:00 committed by Christian Helmuth
parent 7abe07e2cf
commit c2a2ed67bb
4 changed files with 26 additions and 5 deletions

View File

@ -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);

View File

@ -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) {}
};

View File

@ -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;
}
}

View File

@ -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)); }