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:
Linus Torvalds 2024-07-25 12:37:42 -07:00
commit f646429524
12 changed files with 125 additions and 53 deletions

View File

@ -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.
= ============================================================= = =============================================================

View File

@ -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

View File

@ -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

View File

@ -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__ */

View File

@ -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);
} }

View File

@ -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",

View File

@ -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

View File

@ -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: *;
}; };
} }

View 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);
}

View File

@ -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

View File

@ -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: *;
}; };
} }

View 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);
}