From f66a7db87f55ab0075d522d981965512443e783d Mon Sep 17 00:00:00 2001 From: Pirmin Duss Date: Fri, 7 Jul 2023 15:07:14 +0200 Subject: [PATCH] lx_emul: allow setup of the persistent clock This commit adds support to initialize the timekeeping for the Linux subsystem with the value from the RTC. Only the seconds part of timespec64 is supported. Issue genodelabs/genode#4957 --- .../lib/import/import-lx_emul_common.inc | 1 + repos/dde_linux/src/include/lx_emul/time.h | 2 ++ .../dde_linux/src/lib/lx_emul/time_initial.c | 29 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 repos/dde_linux/src/lib/lx_emul/time_initial.c diff --git a/repos/dde_linux/lib/import/import-lx_emul_common.inc b/repos/dde_linux/lib/import/import-lx_emul_common.inc index 170b2165af..1644cdd4b1 100644 --- a/repos/dde_linux/lib/import/import-lx_emul_common.inc +++ b/repos/dde_linux/lib/import/import-lx_emul_common.inc @@ -40,6 +40,7 @@ SRC_C += lx_emul/shadow/mm/slab_common.c SRC_C += lx_emul/shadow/mm/slub.c SRC_C += lx_emul/shadow/mm/vmstat.c SRC_C += lx_emul/start.c +SRC_C += lx_emul/time_initial.c SRC_C += lx_emul/virt_to_page.c SRC_CC += lx_kit/console.cc diff --git a/repos/dde_linux/src/include/lx_emul/time.h b/repos/dde_linux/src/include/lx_emul/time.h index dabd2e43df..2d4bbae4d2 100644 --- a/repos/dde_linux/src/include/lx_emul/time.h +++ b/repos/dde_linux/src/include/lx_emul/time.h @@ -30,6 +30,8 @@ void lx_emul_time_handle(void); void lx_emul_time_update_jiffies(void); +void lx_emul_time_initial(unsigned long long); + #ifdef __cplusplus } #endif diff --git a/repos/dde_linux/src/lib/lx_emul/time_initial.c b/repos/dde_linux/src/lib/lx_emul/time_initial.c new file mode 100644 index 0000000000..9f036c6bf0 --- /dev/null +++ b/repos/dde_linux/src/lib/lx_emul/time_initial.c @@ -0,0 +1,29 @@ +/* + * \brief Lx_emul initial time (persistent clock) + * \author Pirmin Duss + * \date 2023-10-02 + */ + +/* + * Copyright (C) 2023 Genode Labs GmbH + * Copyright (C) 2023 gapfruit AG + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + + +#include + +static unsigned long long genode_initial_ts_sec = 0; + +void lx_emul_time_initial(unsigned long long seconds) +{ + genode_initial_ts_sec = seconds; +} + +void read_persistent_clock64(struct timespec64 *ts) +{ + ts->tv_sec = genode_initial_ts_sec; + ts->tv_nsec = 0; +}