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(); + } +}