parisc architecture fixes and updates for kernel v6.11-rc1:
- Add gettimeofday() and clock_gettime() vDSO functions - Enable PCI_MSI_ARCH_FALLBACKS to allow PCI to PCIe bridge adaptor with PCIe NVME card to function in parisc machines - Allow users to reduce kernel unaligned runtime warnings - minor code cleanups -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCZqFfJgAKCRD3ErUQojoP X6YqAQDC6/8icgbscM6dP5m4+oQ4/Nf3qzKM12jt87sAuRUAxAD9G6uyzUxtw7xS qcRlVoGrc/SLI18JMi3zvs1sEPsicA8= =cYa2 -----END PGP SIGNATURE----- Merge tag 'parisc-for-6.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux Pull parisc updates from Helge Deller: "The gettimeofday() and clock_gettime() syscalls are now available as vDSO functions, and Dave added a patch which allows to use NVMe cards in the PCI slots as fast and easy alternative to SCSI discs. Summary: - add gettimeofday() and clock_gettime() vDSO functions - enable PCI_MSI_ARCH_FALLBACKS to allow PCI to PCIe bridge adaptor with PCIe NVME card to function in parisc machines - allow users to reduce kernel unaligned runtime warnings - minor code cleanups" * tag 'parisc-for-6.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: parisc: Add support for CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN parisc: Use max() to calculate parisc_tlb_flush_threshold parisc: Fix warning at drivers/pci/msi/msi.h:121 parisc: Add 64-bit gettimeofday() and clock_gettime() vDSO functions parisc: Add 32-bit gettimeofday() and clock_gettime() vDSO functions parisc: Clean up unistd.h file
This commit is contained in:
commit
f646429524
@ -454,7 +454,7 @@ ignore-unaligned-usertrap
|
|||||||
|
|
||||||
On architectures where unaligned accesses cause traps, and where this
|
On architectures where unaligned accesses cause traps, and where this
|
||||||
feature is supported (``CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN``;
|
feature is supported (``CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN``;
|
||||||
currently, ``arc`` and ``loongarch``), controls whether all
|
currently, ``arc``, ``parisc`` and ``loongarch``), controls whether all
|
||||||
unaligned traps are logged.
|
unaligned traps are logged.
|
||||||
|
|
||||||
= =============================================================
|
= =============================================================
|
||||||
|
@ -46,6 +46,7 @@ config PARISC
|
|||||||
select GENERIC_CPU_DEVICES if !SMP
|
select GENERIC_CPU_DEVICES if !SMP
|
||||||
select GENERIC_LIB_DEVMEM_IS_ALLOWED
|
select GENERIC_LIB_DEVMEM_IS_ALLOWED
|
||||||
select SYSCTL_ARCH_UNALIGN_ALLOW
|
select SYSCTL_ARCH_UNALIGN_ALLOW
|
||||||
|
select SYSCTL_ARCH_UNALIGN_NO_WARN
|
||||||
select SYSCTL_EXCEPTION_TRACE
|
select SYSCTL_EXCEPTION_TRACE
|
||||||
select HAVE_MOD_ARCH_SPECIFIC
|
select HAVE_MOD_ARCH_SPECIFIC
|
||||||
select MODULES_USE_ELF_RELA
|
select MODULES_USE_ELF_RELA
|
||||||
@ -86,6 +87,7 @@ config PARISC
|
|||||||
select HAVE_SOFTIRQ_ON_OWN_STACK if IRQSTACKS
|
select HAVE_SOFTIRQ_ON_OWN_STACK if IRQSTACKS
|
||||||
select TRACE_IRQFLAGS_SUPPORT
|
select TRACE_IRQFLAGS_SUPPORT
|
||||||
select HAVE_FUNCTION_DESCRIPTORS if 64BIT
|
select HAVE_FUNCTION_DESCRIPTORS if 64BIT
|
||||||
|
select PCI_MSI_ARCH_FALLBACKS if PCI_MSI
|
||||||
|
|
||||||
help
|
help
|
||||||
The PA-RISC microprocessor is designed by Hewlett-Packard and used
|
The PA-RISC microprocessor is designed by Hewlett-Packard and used
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
* sysdeps/unix/sysv/linux/hppa/sysdep.h
|
* sysdeps/unix/sysv/linux/hppa/sysdep.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef PIC
|
#ifndef DONT_USE_PIC
|
||||||
/* WARNING: CANNOT BE USED IN A NOP! */
|
/* WARNING: CANNOT BE USED IN A NOP! */
|
||||||
# define K_STW_ASM_PIC " copy %%r19, %%r4\n"
|
# define K_STW_ASM_PIC " copy %%r19, %%r4\n"
|
||||||
# define K_LDW_ASM_PIC " copy %%r4, %%r19\n"
|
# define K_LDW_ASM_PIC " copy %%r4, %%r19\n"
|
||||||
@ -43,7 +43,7 @@
|
|||||||
across the syscall. */
|
across the syscall. */
|
||||||
|
|
||||||
#define K_CALL_CLOB_REGS "%r1", "%r2", K_USING_GR4 \
|
#define K_CALL_CLOB_REGS "%r1", "%r2", K_USING_GR4 \
|
||||||
"%r20", "%r29", "%r31"
|
"%r20", "%r29", "%r31"
|
||||||
|
|
||||||
#undef K_INLINE_SYSCALL
|
#undef K_INLINE_SYSCALL
|
||||||
#define K_INLINE_SYSCALL(name, nr, args...) ({ \
|
#define K_INLINE_SYSCALL(name, nr, args...) ({ \
|
||||||
@ -58,7 +58,7 @@
|
|||||||
" ldi %1, %%r20\n" \
|
" ldi %1, %%r20\n" \
|
||||||
K_LDW_ASM_PIC \
|
K_LDW_ASM_PIC \
|
||||||
: "=r" (__res) \
|
: "=r" (__res) \
|
||||||
: "i" (SYS_ify(name)) K_ASM_ARGS_##nr \
|
: "i" (name) K_ASM_ARGS_##nr \
|
||||||
: "memory", K_CALL_CLOB_REGS K_CLOB_ARGS_##nr \
|
: "memory", K_CALL_CLOB_REGS K_CLOB_ARGS_##nr \
|
||||||
); \
|
); \
|
||||||
__sys_res = (long)__res; \
|
__sys_res = (long)__res; \
|
||||||
@ -104,42 +104,18 @@
|
|||||||
#define K_CLOB_ARGS_1 K_CLOB_ARGS_2, "%r25"
|
#define K_CLOB_ARGS_1 K_CLOB_ARGS_2, "%r25"
|
||||||
#define K_CLOB_ARGS_0 K_CLOB_ARGS_1, "%r26"
|
#define K_CLOB_ARGS_0 K_CLOB_ARGS_1, "%r26"
|
||||||
|
|
||||||
#define _syscall0(type,name) \
|
#define syscall0(name) \
|
||||||
type name(void) \
|
K_INLINE_SYSCALL(name, 0)
|
||||||
{ \
|
#define syscall1(name, arg1) \
|
||||||
return K_INLINE_SYSCALL(name, 0); \
|
K_INLINE_SYSCALL(name, 1, arg1)
|
||||||
}
|
#define syscall2(name, arg1, arg2) \
|
||||||
|
K_INLINE_SYSCALL(name, 2, arg1, arg2)
|
||||||
#define _syscall1(type,name,type1,arg1) \
|
#define syscall3(name, arg1, arg2, arg3) \
|
||||||
type name(type1 arg1) \
|
K_INLINE_SYSCALL(name, 3, arg1, arg2, arg3)
|
||||||
{ \
|
#define syscall4(name, arg1, arg2, arg3, arg4) \
|
||||||
return K_INLINE_SYSCALL(name, 1, arg1); \
|
K_INLINE_SYSCALL(name, 4, arg1, arg2, arg3, arg4)
|
||||||
}
|
#define syscall5(name, arg1, arg2, arg3, arg4, arg5) \
|
||||||
|
K_INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5)
|
||||||
#define _syscall2(type,name,type1,arg1,type2,arg2) \
|
|
||||||
type name(type1 arg1, type2 arg2) \
|
|
||||||
{ \
|
|
||||||
return K_INLINE_SYSCALL(name, 2, arg1, arg2); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
|
|
||||||
type name(type1 arg1, type2 arg2, type3 arg3) \
|
|
||||||
{ \
|
|
||||||
return K_INLINE_SYSCALL(name, 3, arg1, arg2, arg3); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
|
|
||||||
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
|
|
||||||
{ \
|
|
||||||
return K_INLINE_SYSCALL(name, 4, arg1, arg2, arg3, arg4); \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* select takes 5 arguments */
|
|
||||||
#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
|
|
||||||
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
|
|
||||||
{ \
|
|
||||||
return K_INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define __ARCH_WANT_NEW_STAT
|
#define __ARCH_WANT_NEW_STAT
|
||||||
#define __ARCH_WANT_STAT64
|
#define __ARCH_WANT_STAT64
|
||||||
|
@ -19,6 +19,6 @@ extern struct vdso_data *vdso_data;
|
|||||||
/* Default link addresses for the vDSOs */
|
/* Default link addresses for the vDSOs */
|
||||||
#define VDSO_LBASE 0
|
#define VDSO_LBASE 0
|
||||||
|
|
||||||
#define VDSO_VERSION_STRING LINUX_5.18
|
#define VDSO_VERSION_STRING LINUX_6.11
|
||||||
|
|
||||||
#endif /* __PARISC_VDSO_H__ */
|
#endif /* __PARISC_VDSO_H__ */
|
||||||
|
@ -611,11 +611,7 @@ void __init parisc_setup_cache_timing(void)
|
|||||||
threshold/1024);
|
threshold/1024);
|
||||||
|
|
||||||
set_tlb_threshold:
|
set_tlb_threshold:
|
||||||
if (threshold > FLUSH_TLB_THRESHOLD)
|
parisc_tlb_flush_threshold = max(threshold, FLUSH_TLB_THRESHOLD);
|
||||||
parisc_tlb_flush_threshold = threshold;
|
|
||||||
else
|
|
||||||
parisc_tlb_flush_threshold = FLUSH_TLB_THRESHOLD;
|
|
||||||
|
|
||||||
printk(KERN_INFO "TLB flush threshold set to %lu KiB\n",
|
printk(KERN_INFO "TLB flush threshold set to %lu KiB\n",
|
||||||
parisc_tlb_flush_threshold/1024);
|
parisc_tlb_flush_threshold/1024);
|
||||||
}
|
}
|
||||||
|
@ -104,6 +104,7 @@
|
|||||||
#define ERR_NOTHANDLED -1
|
#define ERR_NOTHANDLED -1
|
||||||
|
|
||||||
int unaligned_enabled __read_mostly = 1;
|
int unaligned_enabled __read_mostly = 1;
|
||||||
|
int no_unaligned_warning __read_mostly;
|
||||||
|
|
||||||
static int emulate_ldh(struct pt_regs *regs, int toreg)
|
static int emulate_ldh(struct pt_regs *regs, int toreg)
|
||||||
{
|
{
|
||||||
@ -399,6 +400,7 @@ void handle_unaligned(struct pt_regs *regs)
|
|||||||
} else {
|
} else {
|
||||||
static DEFINE_RATELIMIT_STATE(kernel_ratelimit, 5 * HZ, 5);
|
static DEFINE_RATELIMIT_STATE(kernel_ratelimit, 5 * HZ, 5);
|
||||||
if (!(current->thread.flags & PARISC_UAC_NOPRINT) &&
|
if (!(current->thread.flags & PARISC_UAC_NOPRINT) &&
|
||||||
|
!no_unaligned_warning &&
|
||||||
__ratelimit(&kernel_ratelimit))
|
__ratelimit(&kernel_ratelimit))
|
||||||
pr_warn("Kernel: unaligned access to " RFMT " in %pS "
|
pr_warn("Kernel: unaligned access to " RFMT " in %pS "
|
||||||
"(iir " RFMT ")\n",
|
"(iir " RFMT ")\n",
|
||||||
|
@ -1,11 +1,25 @@
|
|||||||
# List of files in the vdso, has to be asm only for now
|
# Include the generic Makefile to check the built vdso.
|
||||||
|
include $(srctree)/lib/vdso/Makefile
|
||||||
|
|
||||||
|
KCOV_INSTRUMENT := n
|
||||||
|
|
||||||
|
# Disable gcov profiling, ubsan and kasan for VDSO code
|
||||||
|
GCOV_PROFILE := n
|
||||||
|
UBSAN_SANITIZE := n
|
||||||
|
KASAN_SANITIZE := n
|
||||||
|
KCSAN_SANITIZE := n
|
||||||
|
|
||||||
obj-vdso32 = note.o sigtramp.o restart_syscall.o
|
obj-vdso32 = note.o sigtramp.o restart_syscall.o
|
||||||
|
obj-cvdso32 = vdso32_generic.o
|
||||||
|
|
||||||
# Build rules
|
# Build rules
|
||||||
|
|
||||||
targets := $(obj-vdso32) vdso32.so
|
targets := $(obj-vdso32) $(obj-cvdso32) vdso32.so
|
||||||
obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
|
obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
|
||||||
|
obj-cvdso32 := $(addprefix $(obj)/, $(obj-cvdso32))
|
||||||
|
|
||||||
|
VDSO_CFLAGS_REMOVE := -pg $(CC_FLAGS_FTRACE)
|
||||||
|
CFLAGS_REMOVE_vdso32_generic.o = $(VDSO_CFLAGS_REMOVE)
|
||||||
|
|
||||||
ccflags-y := -shared -fno-common -fbuiltin -mno-fast-indirect-calls -O2 -mno-long-calls
|
ccflags-y := -shared -fno-common -fbuiltin -mno-fast-indirect-calls -O2 -mno-long-calls
|
||||||
# -march=1.1 -mschedule=7100LC
|
# -march=1.1 -mschedule=7100LC
|
||||||
@ -26,18 +40,22 @@ $(obj)/vdso32_wrapper.o : $(obj)/vdso32.so FORCE
|
|||||||
|
|
||||||
# Force dependency (incbin is bad)
|
# Force dependency (incbin is bad)
|
||||||
# link rule for the .so file, .lds has to be first
|
# link rule for the .so file, .lds has to be first
|
||||||
$(obj)/vdso32.so: $(obj)/vdso32.lds $(obj-vdso32) $(VDSO_LIBGCC) FORCE
|
$(obj)/vdso32.so: $(obj)/vdso32.lds $(obj-vdso32) $(obj-cvdso32) $(VDSO_LIBGCC) FORCE
|
||||||
$(call if_changed,vdso32ld)
|
$(call if_changed,vdso32ld)
|
||||||
|
|
||||||
# assembly rules for the .S files
|
# assembly rules for the .S files
|
||||||
$(obj-vdso32): %.o: %.S FORCE
|
$(obj-vdso32): %.o: %.S FORCE
|
||||||
$(call if_changed_dep,vdso32as)
|
$(call if_changed_dep,vdso32as)
|
||||||
|
$(obj-cvdso32): %.o: %.c FORCE
|
||||||
|
$(call if_changed_dep,vdso32cc)
|
||||||
|
|
||||||
# actual build commands
|
# actual build commands
|
||||||
quiet_cmd_vdso32ld = VDSO32L $@
|
quiet_cmd_vdso32ld = VDSO32L $@
|
||||||
cmd_vdso32ld = $(CROSS32CC) $(c_flags) -Wl,-T $(filter-out FORCE, $^) -o $@
|
cmd_vdso32ld = $(CROSS32CC) $(c_flags) -Wl,-T $(filter-out FORCE, $^) -o $@
|
||||||
quiet_cmd_vdso32as = VDSO32A $@
|
quiet_cmd_vdso32as = VDSO32A $@
|
||||||
cmd_vdso32as = $(CROSS32CC) $(a_flags) -c -o $@ $<
|
cmd_vdso32as = $(CROSS32CC) $(a_flags) -c -o $@ $<
|
||||||
|
quiet_cmd_vdso32cc = VDSO32C $@
|
||||||
|
cmd_vdso32cc = $(CROSS32CC) $(c_flags) -c -o $@ $<
|
||||||
|
|
||||||
# Generate VDSO offsets using helper script
|
# Generate VDSO offsets using helper script
|
||||||
gen-vdsosym := $(src)/gen_vdso_offsets.sh
|
gen-vdsosym := $(src)/gen_vdso_offsets.sh
|
||||||
|
@ -106,6 +106,9 @@ VERSION
|
|||||||
global:
|
global:
|
||||||
__kernel_sigtramp_rt32;
|
__kernel_sigtramp_rt32;
|
||||||
__kernel_restart_syscall32;
|
__kernel_restart_syscall32;
|
||||||
|
__vdso_gettimeofday;
|
||||||
|
__vdso_clock_gettime;
|
||||||
|
__vdso_clock_gettime64;
|
||||||
local: *;
|
local: *;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
32
arch/parisc/kernel/vdso32/vdso32_generic.c
Normal file
32
arch/parisc/kernel/vdso32/vdso32_generic.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
#include "asm/unistd.h"
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <uapi/asm/unistd_32.h>
|
||||||
|
|
||||||
|
struct timezone;
|
||||||
|
struct old_timespec32;
|
||||||
|
struct __kernel_timespec;
|
||||||
|
struct __kernel_old_timeval;
|
||||||
|
|
||||||
|
/* forward declarations */
|
||||||
|
int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz);
|
||||||
|
int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts);
|
||||||
|
int __vdso_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts);
|
||||||
|
|
||||||
|
|
||||||
|
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
|
||||||
|
struct timezone *tz)
|
||||||
|
{
|
||||||
|
return syscall2(__NR_gettimeofday, (long)tv, (long)tz);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts)
|
||||||
|
{
|
||||||
|
return syscall2(__NR_clock_gettime, (long)clock, (long)ts);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __vdso_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts)
|
||||||
|
{
|
||||||
|
return syscall2(__NR_clock_gettime64, (long)clock, (long)ts);
|
||||||
|
}
|
@ -1,12 +1,25 @@
|
|||||||
# List of files in the vdso, has to be asm only for now
|
# Include the generic Makefile to check the built vdso.
|
||||||
|
include $(srctree)/lib/vdso/Makefile
|
||||||
|
|
||||||
|
KCOV_INSTRUMENT := n
|
||||||
|
|
||||||
|
# Disable gcov profiling, ubsan and kasan for VDSO code
|
||||||
|
GCOV_PROFILE := n
|
||||||
|
UBSAN_SANITIZE := n
|
||||||
|
KASAN_SANITIZE := n
|
||||||
|
KCSAN_SANITIZE := n
|
||||||
|
|
||||||
obj-vdso64 = note.o sigtramp.o restart_syscall.o
|
obj-vdso64 = note.o sigtramp.o restart_syscall.o
|
||||||
|
obj-cvdso64 = vdso64_generic.o
|
||||||
|
|
||||||
# Build rules
|
# Build rules
|
||||||
|
|
||||||
targets := $(obj-vdso64) vdso64.so
|
targets := $(obj-vdso64) $(obj-cvdso64) vdso64.so
|
||||||
obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64))
|
obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64))
|
||||||
|
obj-cvdso64 := $(addprefix $(obj)/, $(obj-cvdso64))
|
||||||
|
|
||||||
|
VDSO_CFLAGS_REMOVE := -pg $(CC_FLAGS_FTRACE)
|
||||||
|
CFLAGS_REMOVE_vdso64_generic.o = $(VDSO_CFLAGS_REMOVE)
|
||||||
|
|
||||||
ccflags-y := -shared -fno-common -fno-builtin
|
ccflags-y := -shared -fno-common -fno-builtin
|
||||||
ccflags-y += -nostdlib -Wl,-soname=linux-vdso64.so.1 \
|
ccflags-y += -nostdlib -Wl,-soname=linux-vdso64.so.1 \
|
||||||
@ -26,18 +39,22 @@ $(obj)/vdso64_wrapper.o : $(obj)/vdso64.so FORCE
|
|||||||
|
|
||||||
# Force dependency (incbin is bad)
|
# Force dependency (incbin is bad)
|
||||||
# link rule for the .so file, .lds has to be first
|
# link rule for the .so file, .lds has to be first
|
||||||
$(obj)/vdso64.so: $(obj)/vdso64.lds $(obj-vdso64) $(VDSO_LIBGCC) FORCE
|
$(obj)/vdso64.so: $(obj)/vdso64.lds $(obj-vdso64) $(obj-cvdso64) $(VDSO_LIBGCC) FORCE
|
||||||
$(call if_changed,vdso64ld)
|
$(call if_changed,vdso64ld)
|
||||||
|
|
||||||
# assembly rules for the .S files
|
# assembly rules for the .S files
|
||||||
$(obj-vdso64): %.o: %.S FORCE
|
$(obj-vdso64): %.o: %.S FORCE
|
||||||
$(call if_changed_dep,vdso64as)
|
$(call if_changed_dep,vdso64as)
|
||||||
|
$(obj-cvdso64): %.o: %.c FORCE
|
||||||
|
$(call if_changed_dep,vdso64cc)
|
||||||
|
|
||||||
# actual build commands
|
# actual build commands
|
||||||
quiet_cmd_vdso64ld = VDSO64L $@
|
quiet_cmd_vdso64ld = VDSO64L $@
|
||||||
cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $(filter-out FORCE, $^) -o $@
|
cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $(filter-out FORCE, $^) -o $@
|
||||||
quiet_cmd_vdso64as = VDSO64A $@
|
quiet_cmd_vdso64as = VDSO64A $@
|
||||||
cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
|
cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
|
||||||
|
quiet_cmd_vdso64cc = VDSO64C $@
|
||||||
|
cmd_vdso64cc = $(CC) $(c_flags) -c -o $@ $<
|
||||||
|
|
||||||
# Generate VDSO offsets using helper script
|
# Generate VDSO offsets using helper script
|
||||||
gen-vdsosym := $(src)/gen_vdso_offsets.sh
|
gen-vdsosym := $(src)/gen_vdso_offsets.sh
|
||||||
|
@ -104,6 +104,8 @@ VERSION
|
|||||||
global:
|
global:
|
||||||
__kernel_sigtramp_rt64;
|
__kernel_sigtramp_rt64;
|
||||||
__kernel_restart_syscall64;
|
__kernel_restart_syscall64;
|
||||||
|
__vdso_gettimeofday;
|
||||||
|
__vdso_clock_gettime;
|
||||||
local: *;
|
local: *;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
24
arch/parisc/kernel/vdso64/vdso64_generic.c
Normal file
24
arch/parisc/kernel/vdso64/vdso64_generic.c
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
#include "asm/unistd.h"
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
struct timezone;
|
||||||
|
struct __kernel_timespec;
|
||||||
|
struct __kernel_old_timeval;
|
||||||
|
|
||||||
|
/* forward declarations */
|
||||||
|
int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz);
|
||||||
|
int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts);
|
||||||
|
|
||||||
|
|
||||||
|
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
|
||||||
|
struct timezone *tz)
|
||||||
|
{
|
||||||
|
return syscall2(__NR_gettimeofday, (long)tv, (long)tz);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts)
|
||||||
|
{
|
||||||
|
return syscall2(__NR_clock_gettime, (long)clock, (long)ts);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user