From patchwork Mon Feb 26 10:21:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Chestnykh X-Patchwork-Id: 1904251 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=hUqW6Yy1; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=uclibc-ng.org (client-ip=2a00:1828:2000:679::23; helo=helium.openadk.org; envelope-from=devel-bounces@uclibc-ng.org; receiver=patchwork.ozlabs.org) Received: from helium.openadk.org (helium.openadk.org [IPv6:2a00:1828:2000:679::23]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TjxW61TSJz23qD for ; Mon, 26 Feb 2024 21:22:10 +1100 (AEDT) Received: from helium.openadk.org (localhost [IPv6:::1]) by helium.openadk.org (Postfix) with ESMTP id 9CBD6352861A; Mon, 26 Feb 2024 11:22:04 +0100 (CET) Authentication-Results: helium.openadk.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=hUqW6Yy1; dkim-atps=neutral Received: from mail-lj1-f173.google.com (mail-lj1-f173.google.com [209.85.208.173]) by helium.openadk.org (Postfix) with ESMTPS id F36903521105 for ; Mon, 26 Feb 2024 11:21:59 +0100 (CET) Received: by mail-lj1-f173.google.com with SMTP id 38308e7fff4ca-2d262086f0eso9850471fa.1 for ; Mon, 26 Feb 2024 02:21:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1708942919; x=1709547719; darn=uclibc-ng.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Om6BLG9t1D7hcPlFjR4dUb+M2XygHWDrfZX/KhLDMcA=; b=hUqW6Yy1rEwt7/G+1igTBwpSB31vwQqYB7wbc7hupzj2anWWKyFTIbx0pmaWAlk3hP AZdxLkPVrYr85FnLkPN8ddq8tKboE33VOjW3xYvTjFOPiBuYAvCwfvyK2XvS4IHcJ9lb PNcWHwzwPx56JfCrGxbpBYJfgyrguSV5SlYAW5EcAScAZaXnr6FS14SLT1oqPEyQNUzp x14PPepW6wmgRDzYUPNQcnN2YmvT2Y1qDPyZdpndBnE3fLzASNW9BUOFkgsUNzjMS1Cj 5GXZagpxdw7zQL8ld8iIULDFqTFXC5pPgqFWaOdz9zeNiM5vNntoK8FPtBNxsTSwCh4T CvwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708942919; x=1709547719; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Om6BLG9t1D7hcPlFjR4dUb+M2XygHWDrfZX/KhLDMcA=; b=baeIG/8hYspkvQE9anBL33mTSmg02LE2t3aMMF+flpaoZ0eCJJeMJ/JOTf4ainW1y7 tSMS9s1Jf8RlmunMWvE4ohOfHI0MTOr2ibZomN5gA5GGoKRTUUbmqK4Up43FueQnzxMU BvaXaLopL4R26nr1OjR9ChC9VLW+Kl499jITSnzFFsj1TakTjEILtkXqooAkYps4AVu+ e/qlJ3RCrrIDK3Wf7RR0ErEFrCZgI7jE2H11PEEBn+gObj1NJXZAQM0huth5LRV4z3KO RBjsjb/RIyJNwD89p//oJ9A3DZAJie885lfbzSJ9Avh/dC8KWGTQ61wMDm08ZagQdTU9 gFoA== X-Gm-Message-State: AOJu0Yw/gUcO8pRZa0YrSWnHhHlaAtPS16HrnZvCmf2pXBEUkRpYzwz6 ecsF2nr43C1+QuL0SEU9mpMjctSK1keXyYGNmr1iEMfkRDtTSNLwYm/yC3BA X-Google-Smtp-Source: AGHT+IEDStm+q/Xdbt/w1fuh2m5e+LH14XBqJ3EaY6APJw/D8FyUhyIbpQvxCEWXB6tvWUq8bnr3zg== X-Received: by 2002:a2e:9b18:0:b0:2d2:32ff:fe20 with SMTP id u24-20020a2e9b18000000b002d232fffe20mr4065313lji.2.1708942918387; Mon, 26 Feb 2024 02:21:58 -0800 (PST) Received: from localhost.localdomain ([2a00:1370:817a:d2b8:15f1:6cac:134e:e387]) by smtp.gmail.com with ESMTPSA id s15-20020a2e81cf000000b002d0f98bcd81sm806466ljg.107.2024.02.26.02.21.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Feb 2024 02:21:58 -0800 (PST) From: Dmitry Chestnykh To: devel@uclibc-ng.org Date: Mon, 26 Feb 2024 13:21:26 +0300 Message-ID: <20240226102126.2755658-2-dm.chestnykh@gmail.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240226102126.2755658-1-dm.chestnykh@gmail.com> References: <20240226102126.2755658-1-dm.chestnykh@gmail.com> MIME-Version: 1.0 Message-ID-Hash: WEJOIJF3B72NAIBTLTINESG34CXT4FIU X-Message-ID-Hash: WEJOIJF3B72NAIBTLTINESG34CXT4FIU X-MailFrom: dm.chestnykh@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Dmitry Chestnykh X-Mailman-Version: 3.3.3 Precedence: list Subject: [uclibc-ng-devel] [PATCH 2/2] Add time64 support for MIPS32. List-Id: uClibc-ng Development Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Signed-off-by: Dmitry Chestnykh --- extra/Configs/Config.in | 5 +- libc/sysdeps/linux/common/fstatat.c | 2 +- libc/sysdeps/linux/common/xstatconv.c | 6 +- libc/sysdeps/linux/mips/bits/kernel_stat.h | 4 ++ libc/sysdeps/linux/mips/bits/sem.h | 13 +++- .../unix/sysv/linux/mips/lowlevellock.h | 61 +++++++++++++++++++ 6 files changed, 85 insertions(+), 6 deletions(-) diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in index f11a63b79..c7c502040 100644 --- a/extra/Configs/Config.in +++ b/extra/Configs/Config.in @@ -1026,7 +1026,10 @@ config UCLIBC_FALLBACK_TO_ETC_LOCALTIME config UCLIBC_USE_TIME64 bool "Use *time64 syscalls instead of 32bit ones (if possible)" - depends on TARGET_arm || TARGET_powerpc || TARGET_xtensa + depends on TARGET_arm || \ + (TARGET_mips && !CONFIG_MIPS_N64_ABI) || \ + TARGET_powerpc || \ + TARGET_xtensa # TODO: add support for other architectures default n diff --git a/libc/sysdeps/linux/common/fstatat.c b/libc/sysdeps/linux/common/fstatat.c index 8064722d2..d4f566a62 100644 --- a/libc/sysdeps/linux/common/fstatat.c +++ b/libc/sysdeps/linux/common/fstatat.c @@ -62,7 +62,7 @@ int fstatat(int fd, const char *file, struct stat *buf, int flag) .st_mtim.tv_nsec = tmp.stx_mtime.tv_nsec, .st_ctim.tv_sec = tmp.stx_ctime.tv_sec, .st_ctim.tv_nsec = tmp.stx_ctime.tv_nsec, -#if defined(__UCLIBC_USE_TIME64__) +#if defined(__UCLIBC_USE_TIME64__) && !defined(__mips__) .__st_atim32.tv_sec = stx.stx_atime.tv_sec, .__st_atim32.tv_nsec = stx.stx_atime.tv_nsec, .__st_mtim32.tv_sec = stx.stx_mtime.tv_sec, diff --git a/libc/sysdeps/linux/common/xstatconv.c b/libc/sysdeps/linux/common/xstatconv.c index 4b0a7424e..391804e66 100644 --- a/libc/sysdeps/linux/common/xstatconv.c +++ b/libc/sysdeps/linux/common/xstatconv.c @@ -37,7 +37,7 @@ void __xstat_conv(struct kernel_stat *kbuf, struct stat *buf) buf->st_size = kbuf->st_size; buf->st_blksize = kbuf->st_blksize; buf->st_blocks = kbuf->st_blocks; -#if defined(__UCLIBC_USE_TIME64__) +#if defined(__UCLIBC_USE_TIME64__) && !defined(__mips__) buf->st_atim.tv_sec = kbuf->__st_atim32.tv_sec; buf->st_atim.tv_nsec = kbuf->__st_atim32.tv_nsec; buf->st_mtim.tv_sec = kbuf->__st_mtim32.tv_sec; @@ -68,7 +68,7 @@ void __xstat32_conv(struct kernel_stat64 *kbuf, struct stat *buf) buf->st_size = kbuf->st_size; buf->st_blksize = kbuf->st_blksize; buf->st_blocks = kbuf->st_blocks; -#if defined(__UCLIBC_USE_TIME64__) +#if defined(__UCLIBC_USE_TIME64__) && !defined(__mips__) buf->st_atim.tv_sec = kbuf->__st_atim32.tv_sec; buf->st_atim.tv_nsec = kbuf->__st_atim32.tv_nsec; buf->st_mtim.tv_sec = kbuf->__st_mtim32.tv_sec; @@ -102,7 +102,7 @@ void __xstat64_conv(struct kernel_stat64 *kbuf, struct stat64 *buf) buf->st_size = kbuf->st_size; buf->st_blksize = kbuf->st_blksize; buf->st_blocks = kbuf->st_blocks; -#if defined(__UCLIBC_USE_TIME64__) +#if defined(__UCLIBC_USE_TIME64__) && !defined(__mips__) buf->st_atim.tv_sec = kbuf->__st_atim32.tv_sec; buf->st_atim.tv_nsec = kbuf->__st_atim32.tv_nsec; buf->st_mtim.tv_sec = kbuf->__st_mtim32.tv_sec; diff --git a/libc/sysdeps/linux/mips/bits/kernel_stat.h b/libc/sysdeps/linux/mips/bits/kernel_stat.h index a2a6169a3..23a6ce61a 100644 --- a/libc/sysdeps/linux/mips/bits/kernel_stat.h +++ b/libc/sysdeps/linux/mips/bits/kernel_stat.h @@ -14,7 +14,11 @@ typedef struct { } __ktimespec_t; #else typedef struct { +#if defined(__UCLIBC_USE_TIME64__) + __S32_TYPE tv_sec; +#else time_t tv_sec; +#endif unsigned long tv_nsec; } __ktimespec_t; #endif diff --git a/libc/sysdeps/linux/mips/bits/sem.h b/libc/sysdeps/linux/mips/bits/sem.h index 3e4e9682b..35eaa05c3 100644 --- a/libc/sysdeps/linux/mips/bits/sem.h +++ b/libc/sysdeps/linux/mips/bits/sem.h @@ -38,9 +38,20 @@ struct semid_ds { struct ipc_perm sem_perm; /* operation permission struct */ - __time_t sem_otime; /* last semop() time */ +#if defined(__UCLIBC_USE_TIME64__) + unsigned long int __sem_otime_internal_1; /* last semop() time */ + unsigned long int __sem_otime_internal_2; + unsigned long int __sem_ctime_internal_1; /* last time changed by semctl() */ + unsigned long int __sem_ctime_internal_2; +#else + __time_t sem_otime; /* last semop() time */ __time_t sem_ctime; /* last time changed by semctl() */ +#endif unsigned long int sem_nsems; /* number of semaphores in set */ +#if defined(__UCLIBC_USE_TIME64__) + __time_t sem_otime; + __time_t sem_ctime; +#endif unsigned long int __uclibc_unused1; unsigned long int __uclibc_unused2; }; diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/mips/lowlevellock.h index 450a286b4..9fc000a91 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/mips/lowlevellock.h +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/mips/lowlevellock.h @@ -26,6 +26,10 @@ #include #include +#if defined(__UCLIBC_USE_TIME64__) +#include "internal/time64_helpers.h" +#endif + #define FUTEX_WAIT 0 #define FUTEX_WAKE 1 #define FUTEX_REQUEUE 3 @@ -77,6 +81,30 @@ #define lll_futex_wait(futexp, val, private) \ lll_futex_timed_wait(futexp, val, NULL, private) +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_futex_time64) + +#define lll_futex_timed_wait(futexp, val, timespec, private) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret attribute_unused; \ + __ret = INTERNAL_SYSCALL (futex_time64, __err, 4, (long) (futexp), \ + __lll_private_flag (FUTEX_WAIT, private), \ + (val), (TO_TS64_P(timespec))); \ + INTERNAL_SYSCALL_ERROR_P (__ret, __err) ? -__ret : __ret; \ + }) + +#define lll_futex_wake(futexp, nr, private) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret attribute_unused; \ + __ret = INTERNAL_SYSCALL (futex_time64, __err, 4, (long) (futexp), \ + __lll_private_flag (FUTEX_WAKE, private), \ + (nr), 0); \ + INTERNAL_SYSCALL_ERROR_P (__ret, __err) ? -__ret : __ret; \ + }) + +#else + #define lll_futex_timed_wait(futexp, val, timespec, private) \ ({ \ INTERNAL_SYSCALL_DECL (__err); \ @@ -97,6 +125,8 @@ INTERNAL_SYSCALL_ERROR_P (__ret, __err) ? -__ret : __ret; \ }) +#endif + #define lll_robust_dead(futexv, private) \ do \ { \ @@ -106,6 +136,35 @@ } \ while (0) +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_futex_time64) + +/* Returns non-zero if error happened, zero if success. */ +#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret attribute_unused; \ + __ret = INTERNAL_SYSCALL (futex_time64, __err, 6, (long) (futexp), \ + __lll_private_flag (FUTEX_CMP_REQUEUE, private),\ + (nr_wake), (nr_move), (mutex), (val)); \ + INTERNAL_SYSCALL_ERROR_P (__ret, __err); \ + }) + +/* Returns non-zero if error happened, zero if success. */ +#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, private) \ + ({ \ + INTERNAL_SYSCALL_DECL (__err); \ + long int __ret attribute_unused; \ + \ + __ret = INTERNAL_SYSCALL (futex_time64, __err, 6, (futexp), \ + __lll_private_flag (FUTEX_WAKE_OP, private), \ + (nr_wake), (nr_wake2), (futexp2), \ + FUTEX_OP_CLEAR_WAKE_IF_GT_ONE); \ + INTERNAL_SYSCALL_ERROR_P (__ret, __err); \ + }) + + +#else + /* Returns non-zero if error happened, zero if success. */ #define lll_futex_requeue(futexp, nr_wake, nr_move, mutex, val, private) \ ({ \ @@ -130,6 +189,8 @@ INTERNAL_SYSCALL_ERROR_P (__ret, __err); \ }) +#endif + static inline int __attribute__((always_inline)) __lll_trylock(int *futex) {