From c49d06493ce41a3e3fc237f10e1482fceb928526 Mon Sep 17 00:00:00 2001 From: Shoji Tokunaga Date: Tue, 26 May 2026 13:10:36 +0900 Subject: [PATCH] arch/sim: Handle Darwin clock IDs in clock_gettime() Add a sim/macOS-specific clock_gettime() override that translates Darwin monotonic clock IDs to NuttX CLOCK_MONOTONIC before delegating to nxclock_gettime(). Make the common clock_gettime() weak so the simulator override can replace it. This fixes a Rust tokio panic on macOS when running hello_rust_cargo. Signed-off-by: Shoji Tokunaga --- arch/sim/src/Makefile | 4 + arch/sim/src/sim/CMakeLists.txt | 7 ++ arch/sim/src/sim/macos/sim_clock_gettime.c | 97 ++++++++++++++++++++++ sched/clock/clock_gettime.c | 2 +- 4 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 arch/sim/src/sim/macos/sim_clock_gettime.c diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile index d3857e52025c9..d11a14a32f7f3 100644 --- a/arch/sim/src/Makefile +++ b/arch/sim/src/Makefile @@ -103,6 +103,10 @@ ifeq ($(CONFIG_WINDOWS_NATIVE),y) VPATH += :sim/win else VPATH += :sim/posix +ifeq ($(CONFIG_HOST_MACOS),y) + CSRCS += sim/macos/sim_clock_gettime.c + REQUIREDOBJS += sim/macos/sim_clock_gettime$(OBJEXT) +endif endif DEPPATH = $(patsubst %,--dep-path %,$(subst :, ,$(VPATH))) diff --git a/arch/sim/src/sim/CMakeLists.txt b/arch/sim/src/sim/CMakeLists.txt index 42c569f145e9b..ed8d3c78b5807 100644 --- a/arch/sim/src/sim/CMakeLists.txt +++ b/arch/sim/src/sim/CMakeLists.txt @@ -150,6 +150,13 @@ list( sim_hosttime.c sim_hostuart.c) +if(CONFIG_HOST_MACOS) + # Provide a sim/macOS specific override of clock_gettime() that translates + # Darwin clock IDs to NuttX's CLOCK_MONOTONIC. Keep all macOS specific logic + # in arch/sim/ instead of polluting sched/clock/clock_gettime.c. + list(APPEND SRCS macos/sim_clock_gettime.c) +endif() + if(CONFIG_HOST_MACOS AND CONFIG_HAVE_CXXINITIALIZE) # Keep classic __mod_init_func format so post-link lief patching works target_link_options(nuttx PRIVATE -Wl,-ld_classic,-no_fixup_chains) diff --git a/arch/sim/src/sim/macos/sim_clock_gettime.c b/arch/sim/src/sim/macos/sim_clock_gettime.c new file mode 100644 index 0000000000000..5495f5e47cfdc --- /dev/null +++ b/arch/sim/src/sim/macos/sim_clock_gettime.c @@ -0,0 +1,97 @@ +/**************************************************************************** + * arch/sim/src/sim/macos/sim_clock_gettime.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Code built for the macOS host uses Darwin's libc clock IDs. When such + * code is linked into the NuttX simulator, those Darwin-specific values + * reach NuttX's clock_gettime() instead of Darwin's one. Translate + * the Darwin monotonic clock IDs here so that the common sched/clock + * implementation does not need to know about them. + */ + +#define DARWIN_CLOCK_MONOTONIC_RAW 4 +#define DARWIN_CLOCK_MONOTONIC_RAW_APPROX 5 +#define DARWIN_CLOCK_MONOTONIC 6 +#define DARWIN_CLOCK_UPTIME_RAW 8 +#define DARWIN_CLOCK_UPTIME_RAW_APPROX 9 + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: clock_gettime + * + * Description: + * sim/macOS specific override of clock_gettime() that translates Darwin + * monotonic clock IDs into NuttX's CLOCK_MONOTONIC before delegating + * to nxclock_gettime(). + * + * The common POSIX clock_gettime() in sched/clock/clock_gettime.c is + * declared as a weak symbol, so this strong definition takes precedence + * when CONFIG_HOST_MACOS is enabled. + * + ****************************************************************************/ + +visibility_hidden +int clock_gettime(clockid_t clock_id, FAR struct timespec *tp) +{ + int ret; + + switch (clock_id) + { + case DARWIN_CLOCK_MONOTONIC_RAW: + case DARWIN_CLOCK_MONOTONIC_RAW_APPROX: + case DARWIN_CLOCK_MONOTONIC: + case DARWIN_CLOCK_UPTIME_RAW: + case DARWIN_CLOCK_UPTIME_RAW_APPROX: + clock_id = CLOCK_MONOTONIC; + break; + + default: + break; + } + + ret = nxclock_gettime(clock_id, tp); + if (ret < 0) + { + set_errno(-ret); + return ERROR; + } + + return OK; +} diff --git a/sched/clock/clock_gettime.c b/sched/clock/clock_gettime.c index 7d5b0566090d8..3c404da4e5a72 100644 --- a/sched/clock/clock_gettime.c +++ b/sched/clock/clock_gettime.c @@ -215,7 +215,7 @@ int nxclock_gettime(clockid_t clock_id, FAR struct timespec *tp) * ****************************************************************************/ -int clock_gettime(clockid_t clock_id, FAR struct timespec *tp) +int weak_function clock_gettime(clockid_t clock_id, FAR struct timespec *tp) { int ret;