From 4b983f92c54b0c2191c21f8b5d344dbc9ad5f6bc Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Mon, 25 Apr 2022 11:17:36 +0200 Subject: [PATCH] lx_emul: support execution till condition applies In rare cases it is necessary to execute Linux contributed code until certain work is finished, e.g. when in a synchronous RPC call, a session construction or destruction a result is needed. Therefore, we introduce a new lx_emul function called lx_emul_execute_kernel_until. Ref genodelabs/genode#4483 --- repos/dde_linux/src/include/lx_emul/init.h | 2 ++ repos/dde_linux/src/lib/lx_emul/init.cc | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/repos/dde_linux/src/include/lx_emul/init.h b/repos/dde_linux/src/include/lx_emul/init.h index 64119964b7..a18c8ca3fd 100644 --- a/repos/dde_linux/src/include/lx_emul/init.h +++ b/repos/dde_linux/src/include/lx_emul/init.h @@ -24,6 +24,8 @@ void lx_emul_register_initcall(int (*initcall)(void), const char * name); void lx_emul_start_kernel(void * dtb); +void lx_emul_execute_kernel_until(int (*condition)(void)); + void lx_emul_setup_arch(void * dtb); int lx_emul_init_task_function(void * dtb); diff --git a/repos/dde_linux/src/lib/lx_emul/init.cc b/repos/dde_linux/src/lib/lx_emul/init.cc index cf452a36aa..44eac5569b 100644 --- a/repos/dde_linux/src/lib/lx_emul/init.cc +++ b/repos/dde_linux/src/lib/lx_emul/init.cc @@ -48,7 +48,7 @@ extern "C" void lx_emul_register_initcall(int (*initcall)(void), } -void lx_emul_start_kernel(void * dtb) +extern "C" void lx_emul_start_kernel(void * dtb) { using namespace Lx_kit; @@ -61,3 +61,13 @@ void lx_emul_start_kernel(void * dtb) env().scheduler.schedule(); } + + +extern "C" void lx_emul_execute_kernel_until(int (*condition)(void)) +{ + Lx_kit::env().scheduler.schedule(); + + while (!condition()) { + Lx_kit::env().env.ep().wait_and_dispatch_one_io_signal(); + } +}