tools/nolibc: add support for sys_llseek()

Not all architectures have the old sys_lseek(), notably riscv32.
Implement lseek() in terms of sys_llseek() in that case.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Link: https://lore.kernel.org/r/20250209-nolibc-dir-v2-1-57cc1da8558b@weissschuh.net
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
This commit is contained in:
Thomas Weißschuh
2025-02-09 14:25:45 +01:00
committed by Thomas Weißschuh
parent c1f4a7a840
commit dde5625d4d

View File

@@ -597,10 +597,37 @@ off_t sys_lseek(int fd, off_t offset, int whence)
#endif
}
static __attribute__((unused))
int sys_llseek(int fd, unsigned long offset_high, unsigned long offset_low,
__kernel_loff_t *result, int whence)
{
#ifdef __NR_llseek
return my_syscall5(__NR_llseek, fd, offset_high, offset_low, result, whence);
#else
return __nolibc_enosys(__func__, fd, offset_high, offset_low, result, whence);
#endif
}
static __attribute__((unused))
off_t lseek(int fd, off_t offset, int whence)
{
return __sysret(sys_lseek(fd, offset, whence));
__kernel_loff_t loff = 0;
off_t result;
int ret;
result = sys_lseek(fd, offset, whence);
if (result == -ENOSYS) {
/* Only exists on 32bit where nolibc off_t is also 32bit */
ret = sys_llseek(fd, 0, offset, &loff, whence);
if (ret < 0)
result = ret;
else if (loff != (off_t)loff)
result = -EOVERFLOW;
else
result = loff;
}
return __sysret(result);
}