From cbec6ecd4d0fde5bf7fea20eb0c0c5fc9a6dec90 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Sat, 14 Mar 2015 08:06:24 +0100 Subject: Add fix from OpenWrt for MIPS64 N64 ABI https://dev.openwrt.org/browser/trunk/toolchain/uClibc/patches-0.9.33.2/616-mips_fix_stat_time.patch When booting in Qemu you get for example failures from mdev -s otherwise. --- libc/sysdeps/linux/common/xstatconv.c | 27 ++++++++++++++-------- libc/sysdeps/linux/mips/bits/kernel_stat.h | 36 ++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 21 deletions(-) (limited to 'libc') diff --git a/libc/sysdeps/linux/common/xstatconv.c b/libc/sysdeps/linux/common/xstatconv.c index 7edc42a81..a21579c41 100644 --- a/libc/sysdeps/linux/common/xstatconv.c +++ b/libc/sysdeps/linux/common/xstatconv.c @@ -37,9 +37,12 @@ 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; - buf->st_atim = kbuf->st_atim; - buf->st_mtim = kbuf->st_mtim; - buf->st_ctim = kbuf->st_ctim; + buf->st_atim.tv_sec = kbuf->st_atim.tv_sec; + buf->st_atim.tv_nsec = kbuf->st_atim.tv_nsec; + buf->st_mtim.tv_sec = kbuf->st_mtim.tv_sec; + buf->st_mtim.tv_nsec = kbuf->st_mtim.tv_nsec; + buf->st_ctim.tv_sec = kbuf->st_ctim.tv_sec; + buf->st_ctim.tv_nsec = kbuf->st_ctim.tv_nsec; } void __xstat32_conv(struct kernel_stat64 *kbuf, struct stat *buf) @@ -56,9 +59,12 @@ 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; - buf->st_atim = kbuf->st_atim; - buf->st_mtim = kbuf->st_mtim; - buf->st_ctim = kbuf->st_ctim; + buf->st_atim.tv_sec = kbuf->st_atim.tv_sec; + buf->st_atim.tv_nsec = kbuf->st_atim.tv_nsec; + buf->st_mtim.tv_sec = kbuf->st_mtim.tv_sec; + buf->st_mtim.tv_nsec = kbuf->st_mtim.tv_nsec; + buf->st_ctim.tv_sec = kbuf->st_ctim.tv_sec; + buf->st_ctim.tv_nsec = kbuf->st_ctim.tv_nsec; } #ifdef __UCLIBC_HAS_LFS__ @@ -80,9 +86,12 @@ 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; - buf->st_atim = kbuf->st_atim; - buf->st_mtim = kbuf->st_mtim; - buf->st_ctim = kbuf->st_ctim; + buf->st_atim.tv_sec = kbuf->st_atim.tv_sec; + buf->st_atim.tv_nsec = kbuf->st_atim.tv_nsec; + buf->st_mtim.tv_sec = kbuf->st_mtim.tv_sec; + buf->st_mtim.tv_nsec = kbuf->st_mtim.tv_nsec; + buf->st_ctim.tv_sec = kbuf->st_ctim.tv_sec; + buf->st_ctim.tv_nsec = kbuf->st_ctim.tv_nsec; } #endif /* __UCLIBC_HAS_LFS__ */ diff --git a/libc/sysdeps/linux/mips/bits/kernel_stat.h b/libc/sysdeps/linux/mips/bits/kernel_stat.h index 655c089e0..a2a6169a3 100644 --- a/libc/sysdeps/linux/mips/bits/kernel_stat.h +++ b/libc/sysdeps/linux/mips/bits/kernel_stat.h @@ -7,6 +7,18 @@ #include +#if _MIPS_SIM == _MIPS_SIM_ABI64 +typedef struct { + unsigned int tv_sec; + unsigned int tv_nsec; +} __ktimespec_t; +#else +typedef struct { + time_t tv_sec; + unsigned long tv_nsec; +} __ktimespec_t; +#endif + #if _MIPS_SIM == _MIPS_SIM_ABI64 /* The memory layout is the same as of struct stat64 of the 32-bit kernel. */ struct kernel_stat { @@ -20,9 +32,9 @@ struct kernel_stat { __kernel_dev_t st_rdev; unsigned int st_pad2[3]; __kernel_off_t st_size; - struct timespec st_atim; - struct timespec st_mtim; - struct timespec st_ctim; + __ktimespec_t st_atim; + __ktimespec_t st_mtim; + __ktimespec_t st_ctim; unsigned int st_blksize; unsigned int reserved3; unsigned long st_blocks; @@ -41,9 +53,9 @@ struct kernel_stat { unsigned int st_rdev; unsigned int st_pad2[3]; unsigned long long st_size; - struct timespec st_atim; - struct timespec st_mtim; - struct timespec st_ctim; + __ktimespec_t st_atim; + __ktimespec_t st_mtim; + __ktimespec_t st_ctim; unsigned int st_blksize; unsigned int reserved3; unsigned long long st_blocks; @@ -62,9 +74,9 @@ struct kernel_stat { long st_pad2[2]; __kernel_off_t st_size; long st_pad3; - struct timespec st_atim; - struct timespec st_mtim; - struct timespec st_ctim; + __ktimespec_t st_atim; + __ktimespec_t st_mtim; + __ktimespec_t st_ctim; long st_blksize; long st_blocks; long st_pad4[14]; @@ -81,9 +93,9 @@ struct kernel_stat64 { unsigned long st_rdev; unsigned long st_pad1[3]; /* Reserved for st_rdev expansion */ long long st_size; - struct timespec st_atim; - struct timespec st_mtim; - struct timespec st_ctim; + __ktimespec_t st_atim; + __ktimespec_t st_mtim; + __ktimespec_t st_ctim; unsigned long st_blksize; unsigned long st_pad2; long long st_blocks; -- cgit v1.2.3