Merge tag 'xtensa-20181228' of git://github.com/jcmvbkbc/linux-xtensa
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 29 Dec 2018 17:40:40 +0000 (09:40 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 29 Dec 2018 17:40:40 +0000 (09:40 -0800)
Pull Xtensa updates from Max Filippov:

 - switch to generated syscall table

 - switch ptrace to regsets, use regsets for core dumps

 - complete tracehook implementation

 - add syscall tracepoints support

 - add jumplabels support

 - add memtest support

 - drop unused/duplicated code from entry.S, ptrace.c, coprocessor.S,
   elf.h and syscall.h

 - clean up warnings caused by WSR/RSR macros

 - clean up DTC warnings about SPI controller node names in xtfpga.dtsi

 - simplify coprocessor.S

 - get rid of explicit 'l32r' instruction usage in assembly

* tag 'xtensa-20181228' of git://github.com/jcmvbkbc/linux-xtensa: (25 commits)
  xtensa: implement jump_label support
  xtensa: implement syscall tracepoints
  xtensa: implement tracehook functions and enable HAVE_ARCH_TRACEHOOK
  xtensa: enable CORE_DUMP_USE_REGSET
  xtensa: implement TIE regset
  xtensa: implement task_user_regset_view
  xtensa: call do_syscall_trace_{enter,leave} selectively
  xtensa: use NO_SYSCALL instead of -1
  xtensa: define syscall_get_arch()
  Move EM_XTENSA to uapi/linux/elf-em.h
  xtensa: support memtest
  xtensa: don't use l32r opcode directly
  xtensa: xtfpga.dtsi: fix dtc warnings about SPI
  xtensa: don't clear cpenable unconditionally on release
  xtensa: simplify coprocessor.S
  xtensa: clean up WSR*/RSR*/get_sr/set_sr
  xtensa: drop unused declarations from elf.h
  xtensa: clean up syscall.h
  xtensa: drop unused coprocessor helper functions
  xtensa: drop custom PTRACE_{PEEK,POKE}{TEXT,DATA}
  ...

44 files changed:
Documentation/features/core/jump-labels/arch-support.txt
arch/xtensa/Kconfig
arch/xtensa/Makefile
arch/xtensa/boot/boot-elf/bootstrap.S
arch/xtensa/boot/dts/xtfpga.dtsi
arch/xtensa/include/asm/Kbuild
arch/xtensa/include/asm/coprocessor.h
arch/xtensa/include/asm/elf.h
arch/xtensa/include/asm/futex.h
arch/xtensa/include/asm/irqflags.h
arch/xtensa/include/asm/jump_label.h [new file with mode: 0644]
arch/xtensa/include/asm/processor.h
arch/xtensa/include/asm/ptrace.h
arch/xtensa/include/asm/syscall.h
arch/xtensa/include/asm/thread_info.h
arch/xtensa/include/asm/timex.h
arch/xtensa/include/asm/traps.h
arch/xtensa/include/asm/uaccess.h
arch/xtensa/include/asm/unistd.h
arch/xtensa/include/uapi/asm/Kbuild
arch/xtensa/include/uapi/asm/ptrace.h
arch/xtensa/include/uapi/asm/unistd.h
arch/xtensa/kernel/Makefile
arch/xtensa/kernel/asm-offsets.c
arch/xtensa/kernel/coprocessor.S
arch/xtensa/kernel/entry.S
arch/xtensa/kernel/head.S
arch/xtensa/kernel/hw_breakpoint.c
arch/xtensa/kernel/jump_label.c [new file with mode: 0644]
arch/xtensa/kernel/process.c
arch/xtensa/kernel/ptrace.c
arch/xtensa/kernel/setup.c
arch/xtensa/kernel/signal.c
arch/xtensa/kernel/syscall.c
arch/xtensa/kernel/syscalls/Makefile [new file with mode: 0644]
arch/xtensa/kernel/syscalls/syscall.tbl [new file with mode: 0644]
arch/xtensa/kernel/syscalls/syscallhdr.sh [new file with mode: 0644]
arch/xtensa/kernel/syscalls/syscalltbl.sh [new file with mode: 0644]
arch/xtensa/kernel/traps.c
arch/xtensa/mm/init.c
drivers/irqchip/irq-xtensa-mx.c
drivers/irqchip/irq-xtensa-pic.c
include/uapi/linux/audit.h
include/uapi/linux/elf-em.h

index 27cbd63abfd2832909b69be27e9c1324adaca09b..60111395f932d1941c78a9ccc9640b6e3be97f51 100644 (file)
@@ -29,5 +29,5 @@
     |          um: | TODO |
     |   unicore32: | TODO |
     |         x86: |  ok  |
-    |      xtensa: | TODO |
+    |      xtensa: |  ok  |
     -----------------------
index 36338e7564a3f61f6be015768367cc0c20903994..65f66c31b7105ca93c6fb58ddeeaf3bf149801b5 100644 (file)
@@ -16,7 +16,9 @@ config XTENSA
        select GENERIC_PCI_IOMAP
        select GENERIC_SCHED_CLOCK
        select GENERIC_STRNCPY_FROM_USER if KASAN
+       select HAVE_ARCH_JUMP_LABEL
        select HAVE_ARCH_KASAN if MMU
+       select HAVE_ARCH_TRACEHOOK
        select HAVE_DEBUG_KMEMLEAK
        select HAVE_DMA_CONTIGUOUS
        select HAVE_EXIT_THREAD
@@ -27,6 +29,7 @@ config XTENSA
        select HAVE_OPROFILE
        select HAVE_PERF_EVENTS
        select HAVE_STACKPROTECTOR
+       select HAVE_SYSCALL_TRACEPOINTS
        select IRQ_DOMAIN
        select MODULES_USE_ELF_RELA
        select PERF_USE_VMALLOC
index be060dfb1cc3e2a6dd183ba22eabc6895c49cf7b..1542018c9e57d7d5aa2fa80f70bab9438a2b4b85 100644 (file)
@@ -90,6 +90,9 @@ boot          := arch/xtensa/boot
 all Image zImage uImage: vmlinux
        $(Q)$(MAKE) $(build)=$(boot) $@
 
+archheaders:
+       $(Q)$(MAKE) $(build)=arch/xtensa/kernel/syscalls all
+
 define archhelp
   @echo '* Image       - Kernel ELF image with reset vector'
   @echo '* zImage      - Compressed kernel image (arch/xtensa/boot/images/zImage.*)'
index 29c68426ab56a15ad7bfc8f1794692e5b3b3b1f4..99e98c9bae419a84774aa488d4d30a75017eba11 100644 (file)
@@ -29,17 +29,7 @@ _ResetVector:
        .begin  no-absolute-literals
        .literal_position
 
-#if defined(CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX) && \
-       XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY
-       .literal RomInitAddr, CONFIG_KERNEL_LOAD_ADDRESS
-#else
-       .literal RomInitAddr, KERNELOFFSET
-#endif
-#ifndef CONFIG_PARSE_BOOTPARAM
-       .literal RomBootParam, 0
-#else
-       .literal RomBootParam, _bootparam
-
+#ifdef CONFIG_PARSE_BOOTPARAM
        .align 4
 _bootparam:
        .short  BP_TAG_FIRST
@@ -66,13 +56,22 @@ _SetupMMU:
        initialize_mmu
 #endif
 
-       .end    no-absolute-literals
-
        rsil    a0, XCHAL_DEBUGLEVEL-1
        rsync
 reset:
-       l32r    a0, RomInitAddr
-       l32r    a2, RomBootParam
+#if defined(CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX) && \
+       XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY
+       movi    a0, CONFIG_KERNEL_LOAD_ADDRESS
+#else
+       movi    a0, KERNELOFFSET
+#endif
+#ifdef CONFIG_PARSE_BOOTPARAM
+       movi    a2, _bootparam
+#else
+       movi    a2, 0
+#endif
        movi    a3, 0
        movi    a4, 0
        jx      a0
+
+       .end    no-absolute-literals
index 1090528825ec6aee23f921338f62fd30f02a8a2e..e46ae07bab0599165ac2da2afe023e93698973f1 100644 (file)
                        };
                };
 
-               spi0: spi-master@0d0a0000 {
+               spi0: spi@0d0a0000 {
                        compatible = "cdns,xtfpga-spi";
                        #address-cells = <1>;
                        #size-cells = <0>;
index 3310adecafb0ba33bb5e12eee65c3837f3fb717b..e255683cd5209a1e1e03da93b8583677326d02d4 100644 (file)
@@ -1,3 +1,4 @@
+generated-y += syscall_table.h
 generic-y += bug.h
 generic-y += compat.h
 generic-y += device.h
index 677501b32dfcfa0b5a8471c73cc118b3d4415855..6712929a27c99a69e66c308f3aaefe033fdc1bc3 100644 (file)
@@ -12,7 +12,6 @@
 #ifndef _XTENSA_COPROCESSOR_H
 #define _XTENSA_COPROCESSOR_H
 
-#include <linux/stringify.h>
 #include <variant/core.h>
 #include <variant/tie.h>
 #include <asm/types.h>
 
 #ifndef __ASSEMBLY__
 
-
-#if XCHAL_HAVE_CP
-
-#define RSR_CPENABLE(x)        do {                                              \
-       __asm__ __volatile__("rsr %0, cpenable" : "=a" (x));              \
-       } while(0);
-#define WSR_CPENABLE(x)        do {                                              \
-       __asm__ __volatile__("wsr %0, cpenable; rsync" :: "a" (x));       \
-       } while(0);
-
-#endif /* XCHAL_HAVE_CP */
-
-
 /*
  * Additional registers.
  * We define three types of additional registers:
@@ -157,20 +143,11 @@ typedef struct { XCHAL_CP7_SA_LIST(2) } xtregs_cp7_t
        __attribute__ ((aligned (XCHAL_CP7_SA_ALIGN)));
 
 extern struct thread_info* coprocessor_owner[XCHAL_CP_MAX];
-extern void coprocessor_save(void*, int);
-extern void coprocessor_load(void*, int);
 extern void coprocessor_flush(struct thread_info*, int);
-extern void coprocessor_restore(struct thread_info*, int);
 
 extern void coprocessor_release_all(struct thread_info*);
 extern void coprocessor_flush_all(struct thread_info*);
 
-static inline void coprocessor_clear_cpenable(void)
-{
-       unsigned long i = 0;
-       WSR_CPENABLE(i);
-}
-
 #endif /* XTENSA_HAVE_COPROCESSORS */
 
 #endif /* !__ASSEMBLY__ */
index eacb25a4171813635852fae8bf855ec288e692b6..909a6ab4f22b43ec5ada6b5fc9312144d6da8884 100644 (file)
 
 #include <asm/ptrace.h>
 #include <asm/coprocessor.h>
+#include <linux/elf-em.h>
 
 /* Xtensa processor ELF architecture-magic number */
 
-#define EM_XTENSA      94
 #define EM_XTENSA_OLD  0xABC7
 
 /* Xtensa relocations defined by the ABIs */
 
 typedef unsigned long elf_greg_t;
 
-typedef struct {
-       elf_greg_t pc;
-       elf_greg_t ps;
-       elf_greg_t lbeg;
-       elf_greg_t lend;
-       elf_greg_t lcount;
-       elf_greg_t sar;
-       elf_greg_t windowstart;
-       elf_greg_t windowbase;
-       elf_greg_t threadptr;
-       elf_greg_t reserved[7+48];
-       elf_greg_t a[64];
-} xtensa_gregset_t;
+typedef struct user_pt_regs xtensa_gregset_t;
 
 #define ELF_NGREG      (sizeof(xtensa_gregset_t) / sizeof(elf_greg_t))
 
@@ -98,11 +86,6 @@ typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 typedef unsigned int elf_fpreg_t;
 typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
 
-#define ELF_CORE_COPY_REGS(_eregs, _pregs)                             \
-       xtensa_elf_core_copy_regs ((xtensa_gregset_t*)&(_eregs), _pregs);
-
-extern void xtensa_elf_core_copy_regs (xtensa_gregset_t *, struct pt_regs *);
-
 /*
  * This is used to ensure we don't load something for the wrong architecture.
  */
@@ -126,6 +109,7 @@ extern void xtensa_elf_core_copy_regs (xtensa_gregset_t *, struct pt_regs *);
 #define ELF_ARCH       EM_XTENSA
 
 #define ELF_EXEC_PAGESIZE      PAGE_SIZE
+#define CORE_DUMP_USE_REGSET
 
 /*
  * This is the location that an ET_DYN program is loaded if exec'ed.  Typical
@@ -193,15 +177,4 @@ typedef struct {
 #define SET_PERSONALITY(ex) \
        set_personality(PER_LINUX_32BIT | (current->personality & (~PER_MASK)))
 
-struct task_struct;
-
-extern void do_copy_regs (xtensa_gregset_t*, struct pt_regs*,
-                         struct task_struct*);
-extern void do_restore_regs (xtensa_gregset_t*, struct pt_regs*,
-                            struct task_struct*);
-extern void do_save_fpregs (elf_fpregset_t*, struct pt_regs*,
-                           struct task_struct*);
-extern int do_restore_fpregs (elf_fpregset_t*, struct pt_regs*,
-                             struct task_struct*);
-
 #endif /* _XTENSA_ELF_H */
index 5bfbc1c401d4cfb82fe5596f0a24689cabecdc98..fd0eef6b8e7c967b9563856ba0aa89711a946ac1 100644 (file)
@@ -32,8 +32,8 @@
        "3:\n"                                          \
        "       .section .fixup,\"ax\"\n"               \
        "       .align 4\n"                             \
-       "4:     .long   3b\n"                           \
-       "5:     l32r    %0, 4b\n"                       \
+       "       .literal_position\n"                    \
+       "5:     movi    %0, 3b\n"                       \
        "       movi    %1, %3\n"                       \
        "       jx      %0\n"                           \
        "       .previous\n"                            \
@@ -108,8 +108,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
        "2:\n"
        "       .section .fixup,\"ax\"\n"
        "       .align 4\n"
-       "3:     .long   2b\n"
-       "4:     l32r    %1, 3b\n"
+       "       .literal_position\n"
+       "4:     movi    %1, 2b\n"
        "       movi    %0, %7\n"
        "       jx      %1\n"
        "       .previous\n"
index 407606e576f8911728ab0232e8419e63d39b343d..9b5e8526afe59ba2228cf4e189cfc1bbc518258e 100644 (file)
@@ -12,6 +12,7 @@
 #ifndef _XTENSA_IRQFLAGS_H
 #define _XTENSA_IRQFLAGS_H
 
+#include <linux/stringify.h>
 #include <linux/types.h>
 #include <asm/processor.h>
 
diff --git a/arch/xtensa/include/asm/jump_label.h b/arch/xtensa/include/asm/jump_label.h
new file mode 100644 (file)
index 0000000..c812bf8
--- /dev/null
@@ -0,0 +1,65 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (C) 2018 Cadence Design Systems Inc. */
+
+#ifndef _ASM_XTENSA_JUMP_LABEL_H
+#define _ASM_XTENSA_JUMP_LABEL_H
+
+#ifndef __ASSEMBLY__
+
+#include <linux/types.h>
+
+#define JUMP_LABEL_NOP_SIZE 3
+
+static __always_inline bool arch_static_branch(struct static_key *key,
+                                              bool branch)
+{
+       asm_volatile_goto("1:\n\t"
+                         "_nop\n\t"
+                         ".pushsection __jump_table,  \"aw\"\n\t"
+                         ".word 1b, %l[l_yes], %c0\n\t"
+                         ".popsection\n\t"
+                         : :  "i" (&((char *)key)[branch]) :  : l_yes);
+
+       return false;
+l_yes:
+       return true;
+}
+
+static __always_inline bool arch_static_branch_jump(struct static_key *key,
+                                                   bool branch)
+{
+       /*
+        * Xtensa assembler will mark certain points in the code
+        * as unreachable, so that later assembler or linker relaxation
+        * passes could use them. A spot right after the J instruction
+        * is one such point. Assembler and/or linker may insert padding
+        * or literals here, breaking code flow in case the J instruction
+        * is later replaced with NOP. Put a label right after the J to
+        * make it reachable and wrap both into a no-transform block
+        * to avoid any assembler interference with this.
+        */
+       asm_volatile_goto("1:\n\t"
+                         ".begin no-transform\n\t"
+                         "_j %l[l_yes]\n\t"
+                         "2:\n\t"
+                         ".end no-transform\n\t"
+                         ".pushsection __jump_table,  \"aw\"\n\t"
+                         ".word 1b, %l[l_yes], %c0\n\t"
+                         ".popsection\n\t"
+                         : :  "i" (&((char *)key)[branch]) :  : l_yes);
+
+       return false;
+l_yes:
+       return true;
+}
+
+typedef u32 jump_label_t;
+
+struct jump_entry {
+       jump_label_t code;
+       jump_label_t target;
+       jump_label_t key;
+};
+
+#endif  /* __ASSEMBLY__ */
+#endif
index 34a23016dd1442f5c95d445f13276d97c772072d..f7dd895b2353e0510a7199896030c8527695c130 100644 (file)
@@ -13,6 +13,7 @@
 #include <variant/core.h>
 
 #include <linux/compiler.h>
+#include <linux/stringify.h>
 #include <asm/ptrace.h>
 #include <asm/types.h>
 #include <asm/regs.h>
@@ -212,11 +213,18 @@ extern unsigned long get_wchan(struct task_struct *p);
 
 /* Special register access. */
 
-#define WSR(v,sr) __asm__ __volatile__ ("wsr %0,"__stringify(sr) :: "a"(v));
-#define RSR(v,sr) __asm__ __volatile__ ("rsr %0,"__stringify(sr) : "=a"(v));
-
-#define set_sr(x,sr) ({unsigned int v=(unsigned int)x; WSR(v,sr);})
-#define get_sr(sr) ({unsigned int v; RSR(v,sr); v; })
+#define xtensa_set_sr(x, sr) \
+       ({ \
+        unsigned int v = (unsigned int)(x); \
+        __asm__ __volatile__ ("wsr %0, "__stringify(sr) :: "a"(v)); \
+        })
+
+#define xtensa_get_sr(sr) \
+       ({ \
+        unsigned int v; \
+        __asm__ __volatile__ ("rsr %0, "__stringify(sr) : "=a"(v)); \
+        v; \
+        })
 
 #ifndef XCHAL_HAVE_EXTERN_REGS
 #define XCHAL_HAVE_EXTERN_REGS 0
index 3a5c5918aea3fde664b72fdbb9d5d807e6e7d6e1..62a58d2567e94459d0cdbf4c5f9f95236b4d7858 100644 (file)
@@ -39,6 +39,8 @@
  *             +-----------------------+ --------
  */
 
+#define NO_SYSCALL (-1)
+
 #ifndef __ASSEMBLY__
 
 #include <asm/coprocessor.h>
@@ -100,6 +102,11 @@ struct pt_regs {
 
 #define user_stack_pointer(regs) ((regs)->areg[1])
 
+static inline unsigned long regs_return_value(struct pt_regs *regs)
+{
+       return regs->areg[2];
+}
+
 #else  /* __ASSEMBLY__ */
 
 # include <asm/asm-offsets.h>
index 3673ff1f1bc5344155a9db79826576c9a82cbf20..a168bf81c7f4701a036abaa251fa5dce7fad6c19 100644 (file)
 /*
- * include/asm-xtensa/syscall.h
- *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
  * Copyright (C) 2001 - 2007 Tensilica Inc.
+ * Copyright (C) 2018 Cadence Design Systems Inc.
  */
 
-struct pt_regs;
-asmlinkage long xtensa_ptrace(long, long, long, long);
-asmlinkage long xtensa_sigreturn(struct pt_regs*);
+#ifndef _ASM_SYSCALL_H
+#define _ASM_SYSCALL_H
+
+#include <linux/err.h>
+#include <asm/ptrace.h>
+#include <uapi/linux/audit.h>
+
+static inline int syscall_get_arch(void)
+{
+       return AUDIT_ARCH_XTENSA;
+}
+
+typedef void (*syscall_t)(void);
+extern syscall_t sys_call_table[];
+
+static inline long syscall_get_nr(struct task_struct *task,
+                                 struct pt_regs *regs)
+{
+       return regs->syscall;
+}
+
+static inline void syscall_rollback(struct task_struct *task,
+                                   struct pt_regs *regs)
+{
+       /* Do nothing. */
+}
+
+static inline long syscall_get_error(struct task_struct *task,
+                                    struct pt_regs *regs)
+{
+       /* 0 if syscall succeeded, otherwise -Errorcode */
+       return IS_ERR_VALUE(regs->areg[2]) ? regs->areg[2] : 0;
+}
+
+static inline long syscall_get_return_value(struct task_struct *task,
+                                           struct pt_regs *regs)
+{
+       return regs->areg[2];
+}
+
+static inline void syscall_set_return_value(struct task_struct *task,
+                                           struct pt_regs *regs,
+                                           int error, long val)
+{
+       regs->areg[0] = (long) error ? error : val;
+}
+
+#define SYSCALL_MAX_ARGS 6
+#define XTENSA_SYSCALL_ARGUMENT_REGS {6, 3, 4, 5, 8, 9}
+
+static inline void syscall_get_arguments(struct task_struct *task,
+                                        struct pt_regs *regs,
+                                        unsigned int i, unsigned int n,
+                                        unsigned long *args)
+{
+       static const unsigned int reg[] = XTENSA_SYSCALL_ARGUMENT_REGS;
+       unsigned int j;
+
+       if (n == 0)
+               return;
+
+       WARN_ON_ONCE(i + n > SYSCALL_MAX_ARGS);
+
+       for (j = 0; j < n; ++j) {
+               if (i + j < SYSCALL_MAX_ARGS)
+                       args[j] = regs->areg[reg[i + j]];
+               else
+                       args[j] = 0;
+       }
+}
+
+static inline void syscall_set_arguments(struct task_struct *task,
+                                        struct pt_regs *regs,
+                                        unsigned int i, unsigned int n,
+                                        const unsigned long *args)
+{
+       static const unsigned int reg[] = XTENSA_SYSCALL_ARGUMENT_REGS;
+       unsigned int j;
+
+       if (n == 0)
+               return;
+
+       if (WARN_ON_ONCE(i + n > SYSCALL_MAX_ARGS)) {
+               if (i < SYSCALL_MAX_ARGS)
+                       n = SYSCALL_MAX_ARGS - i;
+               else
+                       return;
+       }
+
+       for (j = 0; j < n; ++j)
+               regs->areg[reg[i + j]] = args[j];
+}
+
 asmlinkage long xtensa_rt_sigreturn(struct pt_regs*);
 asmlinkage long xtensa_shmat(int, char __user *, int);
 asmlinkage long xtensa_fadvise64_64(int, int,
                                    unsigned long long, unsigned long long);
 
-/* Should probably move to linux/syscalls.h */
-struct pollfd;
-asmlinkage long sys_pselect6(int n, fd_set __user *inp, fd_set __user *outp,
-                            fd_set __user *exp, struct timespec __user *tsp,
-                            void __user *sig);
-asmlinkage long sys_ppoll(struct pollfd __user *ufds, unsigned int nfds,
-                         struct timespec __user *tsp,
-                         const sigset_t __user *sigmask,
-                         size_t sigsetsize);
+#endif
index 2bd19ae61e476972e6adeccf706f94e626fc9c66..f333f10a7650dbfe9cbd1771d307bae577104f7d 100644 (file)
@@ -11,6 +11,7 @@
 #ifndef _XTENSA_THREAD_INFO_H
 #define _XTENSA_THREAD_INFO_H
 
+#include <linux/stringify.h>
 #include <asm/kmem_layout.h>
 
 #define CURRENT_SHIFT KERNEL_STACK_SHIFT
@@ -100,13 +101,12 @@ static inline struct thread_info *current_thread_info(void)
 /*
  * thread information flags
  * - these are process state flags that various assembly files may need to access
- * - pending work-to-be-done flags are in LSW
- * - other flags in MSW
  */
 #define TIF_SYSCALL_TRACE      0       /* syscall trace active */
 #define TIF_SIGPENDING         1       /* signal pending */
 #define TIF_NEED_RESCHED       2       /* rescheduling necessary */
 #define TIF_SINGLESTEP         3       /* restore singlestep on return to user mode */
+#define TIF_SYSCALL_TRACEPOINT 4       /* syscall tracepoint instrumentation */
 #define TIF_MEMDIE             5       /* is terminating due to OOM killer */
 #define TIF_RESTORE_SIGMASK    6       /* restore signal mask in do_signal() */
 #define TIF_NOTIFY_RESUME      7       /* callback before returning to user */
@@ -116,9 +116,10 @@ static inline struct thread_info *current_thread_info(void)
 #define _TIF_SIGPENDING                (1<<TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
 #define _TIF_SINGLESTEP                (1<<TIF_SINGLESTEP)
+#define _TIF_SYSCALL_TRACEPOINT        (1<<TIF_SYSCALL_TRACEPOINT)
 
-#define _TIF_WORK_MASK         0x0000FFFE      /* work to do on interrupt/exception return */
-#define _TIF_ALLWORK_MASK      0x0000FFFF      /* work to do on any return to u-space */
+#define _TIF_WORK_MASK         (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \
+                                _TIF_SYSCALL_TRACEPOINT)
 
 /*
  * Thread-synchronous status.
index f9b389d4e97393b1c93be083b8db149b632602fa..233ec75e60c696814219e7d37eeb5e585b0f8259 100644 (file)
@@ -10,7 +10,6 @@
 #define _XTENSA_TIMEX_H
 
 #include <asm/processor.h>
-#include <linux/stringify.h>
 
 #if XCHAL_NUM_TIMERS > 0 && \
        XTENSA_INT_LEVEL(XCHAL_TIMER0_INTERRUPT) <= XCHAL_EXCM_LEVEL
@@ -40,33 +39,24 @@ void local_timer_setup(unsigned cpu);
  * Register access.
  */
 
-#define WSR_CCOUNT(r)    asm volatile ("wsr %0, ccount" :: "a" (r))
-#define RSR_CCOUNT(r)    asm volatile ("rsr %0, ccount" : "=a" (r))
-#define WSR_CCOMPARE(x,r) asm volatile ("wsr %0,"__stringify(SREG_CCOMPARE)"+"__stringify(x) :: "a"(r))
-#define RSR_CCOMPARE(x,r) asm volatile ("rsr %0,"__stringify(SREG_CCOMPARE)"+"__stringify(x) : "=a"(r))
-
 static inline unsigned long get_ccount (void)
 {
-       unsigned long ccount;
-       RSR_CCOUNT(ccount);
-       return ccount;
+       return xtensa_get_sr(ccount);
 }
 
 static inline void set_ccount (unsigned long ccount)
 {
-       WSR_CCOUNT(ccount);
+       xtensa_set_sr(ccount, ccount);
 }
 
 static inline unsigned long get_linux_timer (void)
 {
-       unsigned ccompare;
-       RSR_CCOMPARE(LINUX_TIMER, ccompare);
-       return ccompare;
+       return xtensa_get_sr(SREG_CCOMPARE + LINUX_TIMER);
 }
 
 static inline void set_linux_timer (unsigned long ccompare)
 {
-       WSR_CCOMPARE(LINUX_TIMER, ccompare);
+       xtensa_set_sr(ccompare, SREG_CCOMPARE + LINUX_TIMER);
 }
 
 #endif /* _XTENSA_TIMEX_H */
index f5cd7a7e65e0a170b9dbf6efd0b0f92dd352999a..f720a57d0a5bb0613c623b4bb894789423f0f5d9 100644 (file)
@@ -25,8 +25,6 @@ struct exc_table {
        void *fixup;
        /* For passing a parameter to fixup */
        void *fixup_param;
-       /* For fast syscall handler */
-       unsigned long syscall_save;
        /* Fast user exception handlers */
        void *fast_user_handler[EXCCAUSE_N];
        /* Fast kernel exception handlers */
index f1158b4c629cf83a0568f9022a71ccb87e684f20..d11ef29396528a43dba06ff0a781311611e0f2e5 100644 (file)
@@ -159,10 +159,9 @@ __asm__ __volatile__(                                      \
        "2:                             \n"             \
        "   .section  .fixup,\"ax\"     \n"             \
        "   .align 4                    \n"             \
-       "4:                             \n"             \
-       "   .long  2b                   \n"             \
+       "   .literal_position           \n"             \
        "5:                             \n"             \
-       "   l32r   %1, 4b               \n"             \
+       "   movi   %1, 2b               \n"             \
        "   movi   %0, %4               \n"             \
        "   jx     %1                   \n"             \
        "   .previous                   \n"             \
@@ -217,10 +216,9 @@ __asm__ __volatile__(                      \
        "2:                             \n"     \
        "   .section  .fixup,\"ax\"     \n"     \
        "   .align 4                    \n"     \
-       "4:                             \n"     \
-       "   .long  2b                   \n"     \
+       "   .literal_position           \n"     \
        "5:                             \n"     \
-       "   l32r   %1, 4b               \n"     \
+       "   movi   %1, 2b               \n"     \
        "   movi   %2, 0                \n"     \
        "   movi   %0, %4               \n"     \
        "   jx     %1                   \n"     \
index 574e5520968c263e3147271abca3f4eba4df3378..0d34629dafc5194a93641f00f7ea60a7769aa752 100644 (file)
@@ -22,4 +22,6 @@
 #define __IGNORE_vfork                         /* use clone */
 #define __IGNORE_fadvise64                     /* use fadvise64_64 */
 
+#define NR_syscalls                            __NR_syscalls
+
 #endif /* _XTENSA_UNISTD_H */
index 837d4dd7678545dec75f53c21bcf5e2dea500202..f95cad3003692c6b6217e51d78c08a8b5dab9fe1 100644 (file)
@@ -1,6 +1,7 @@
 # UAPI Header export list
 include include/uapi/asm-generic/Kbuild.asm
 
+generated-y += unistd_32.h
 generic-y += bitsperlong.h
 generic-y += bpf_perf_event.h
 generic-y += errno.h
index a10b42963703ee9884dc1fbcb1207642c495d256..2ec0f9100a069a3bfc9628b89717f09963bd7ca4 100644 (file)
@@ -12,6 +12,8 @@
 #ifndef _UAPI_XTENSA_PTRACE_H
 #define _UAPI_XTENSA_PTRACE_H
 
+#include <linux/types.h>
+
 /* Registers used by strace */
 
 #define REG_A_BASE     0x0000
 #define PTRACE_GETHBPREGS      20
 #define PTRACE_SETHBPREGS      21
 
-
+#ifndef __ASSEMBLY__
+
+struct user_pt_regs {
+       __u32 pc;
+       __u32 ps;
+       __u32 lbeg;
+       __u32 lend;
+       __u32 lcount;
+       __u32 sar;
+       __u32 windowstart;
+       __u32 windowbase;
+       __u32 threadptr;
+       __u32 reserved[7 + 48];
+       __u32 a[64];
+};
+
+#endif
 #endif /* _UAPI_XTENSA_PTRACE_H */
index bc3f62db5c5f4df8596e43edb3de8c410e9f30bf..e67ccdd117d82708803d0269d8bf8f9bd9ab34e6 100644 (file)
 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-#if !defined(_UAPI_XTENSA_UNISTD_H) || defined(__SYSCALL)
+#ifndef _UAPI_XTENSA_UNISTD_H
 #define _UAPI_XTENSA_UNISTD_H
 
-#ifndef __SYSCALL
-# define __SYSCALL(nr,func,nargs)
-#endif
+#include <asm/unistd_32.h>
 
-#define __NR_spill                               0
-__SYSCALL(  0, sys_ni_syscall, 0)
-#define __NR_xtensa                              1
-__SYSCALL(  1, sys_ni_syscall, 0)
-#define __NR_available4                                  2
-__SYSCALL(  2, sys_ni_syscall, 0)
-#define __NR_available5                                  3
-__SYSCALL(  3, sys_ni_syscall, 0)
-#define __NR_available6                                  4
-__SYSCALL(  4, sys_ni_syscall, 0)
-#define __NR_available7                                  5
-__SYSCALL(  5, sys_ni_syscall, 0)
-#define __NR_available8                                  6
-__SYSCALL(  6, sys_ni_syscall, 0)
-#define __NR_available9                                  7
-__SYSCALL(  7, sys_ni_syscall, 0)
-
-/* File Operations */
-
-#define __NR_open                                8
-__SYSCALL(  8, sys_open, 3)
-#define __NR_close                               9
-__SYSCALL(  9, sys_close, 1)
-#define __NR_dup                                10
-__SYSCALL( 10, sys_dup, 1)
-#define __NR_dup2                               11
-__SYSCALL( 11, sys_dup2, 2)
-#define __NR_read                               12
-__SYSCALL( 12, sys_read, 3)
-#define __NR_write                              13
-__SYSCALL( 13, sys_write, 3)
-#define __NR_select                             14
-__SYSCALL( 14, sys_select, 5)
-#define __NR_lseek                              15
-__SYSCALL( 15, sys_lseek, 3)
-#define __NR_poll                               16
-__SYSCALL( 16, sys_poll, 3)
-#define __NR__llseek                            17
-__SYSCALL( 17, sys_llseek, 5)
-#define __NR_epoll_wait                         18
-__SYSCALL( 18, sys_epoll_wait, 4)
-#define __NR_epoll_ctl                                  19
-__SYSCALL( 19, sys_epoll_ctl, 4)
-#define __NR_epoll_create                       20
-__SYSCALL( 20, sys_epoll_create, 1)
-#define __NR_creat                              21
-__SYSCALL( 21, sys_creat, 2)
-#define __NR_truncate                           22
-__SYSCALL( 22, sys_truncate, 2)
-#define __NR_ftruncate                                  23
-__SYSCALL( 23, sys_ftruncate, 2)
-#define __NR_readv                              24
-__SYSCALL( 24, sys_readv, 3)
-#define __NR_writev                             25
-__SYSCALL( 25, sys_writev, 3)
-#define __NR_fsync                              26
-__SYSCALL( 26, sys_fsync, 1)
-#define __NR_fdatasync                                  27
-__SYSCALL( 27, sys_fdatasync, 1)
-#define __NR_truncate64                         28
-__SYSCALL( 28, sys_truncate64, 2)
-#define __NR_ftruncate64                        29
-__SYSCALL( 29, sys_ftruncate64, 2)
-#define __NR_pread64                            30
-__SYSCALL( 30, sys_pread64, 6)
-#define __NR_pwrite64                           31
-__SYSCALL( 31, sys_pwrite64, 6)
-
-#define __NR_link                               32
-__SYSCALL( 32, sys_link, 2)
-#define __NR_rename                             33
-__SYSCALL( 33, sys_rename, 2)
-#define __NR_symlink                            34
-__SYSCALL( 34, sys_symlink, 2)
-#define __NR_readlink                           35
-__SYSCALL( 35, sys_readlink, 3)
-#define __NR_mknod                              36
-__SYSCALL( 36, sys_mknod, 3)
-#define __NR_pipe                               37
-__SYSCALL( 37, sys_pipe, 1)
-#define __NR_unlink                             38
-__SYSCALL( 38, sys_unlink, 1)
-#define __NR_rmdir                              39
-__SYSCALL( 39, sys_rmdir, 1)
-
-#define __NR_mkdir                              40
-__SYSCALL( 40, sys_mkdir, 2)
-#define __NR_chdir                              41
-__SYSCALL( 41, sys_chdir, 1)
-#define __NR_fchdir                             42
-__SYSCALL( 42, sys_fchdir, 1)
-#define __NR_getcwd                             43
-__SYSCALL( 43, sys_getcwd, 2)
-
-#define __NR_chmod                              44
-__SYSCALL( 44, sys_chmod, 2)
-#define __NR_chown                              45
-__SYSCALL( 45, sys_chown, 3)
-#define __NR_stat                               46
-__SYSCALL( 46, sys_newstat, 2)
-#define __NR_stat64                             47
-__SYSCALL( 47, sys_stat64, 2)
-
-#define __NR_lchown                             48
-__SYSCALL( 48, sys_lchown, 3)
-#define __NR_lstat                              49
-__SYSCALL( 49, sys_newlstat, 2)
-#define __NR_lstat64                            50
-__SYSCALL( 50, sys_lstat64, 2)
-#define __NR_available51                        51
-__SYSCALL( 51, sys_ni_syscall, 0)
-
-#define __NR_fchmod                             52
-__SYSCALL( 52, sys_fchmod, 2)
-#define __NR_fchown                             53
-__SYSCALL( 53, sys_fchown, 3)
-#define __NR_fstat                              54
-__SYSCALL( 54, sys_newfstat, 2)
-#define __NR_fstat64                            55
-__SYSCALL( 55, sys_fstat64, 2)
-
-#define __NR_flock                              56
-__SYSCALL( 56, sys_flock, 2)
-#define __NR_access                             57
-__SYSCALL( 57, sys_access, 2)
-#define __NR_umask                              58
-__SYSCALL( 58, sys_umask, 1)
-#define __NR_getdents                           59
-__SYSCALL( 59, sys_getdents, 3)
-#define __NR_getdents64                         60
-__SYSCALL( 60, sys_getdents64, 3)
-#define __NR_fcntl64                            61
-__SYSCALL( 61, sys_fcntl64, 3)
-#define __NR_fallocate                          62
-__SYSCALL( 62, sys_fallocate, 6)
-#define __NR_fadvise64_64                       63
-__SYSCALL( 63, xtensa_fadvise64_64, 6)
-#define __NR_utime                              64     /* glibc 2.3.3 ?? */
-__SYSCALL( 64, sys_utime, 2)
-#define __NR_utimes                             65
-__SYSCALL( 65, sys_utimes, 2)
-#define __NR_ioctl                              66
-__SYSCALL( 66, sys_ioctl, 3)
-#define __NR_fcntl                              67
-__SYSCALL( 67, sys_fcntl, 3)
-
-#define __NR_setxattr                           68
-__SYSCALL( 68, sys_setxattr, 5)
-#define __NR_getxattr                           69
-__SYSCALL( 69, sys_getxattr, 4)
-#define __NR_listxattr                                  70
-__SYSCALL( 70, sys_listxattr, 3)
-#define __NR_removexattr                        71
-__SYSCALL( 71, sys_removexattr, 2)
-#define __NR_lsetxattr                                  72
-__SYSCALL( 72, sys_lsetxattr, 5)
-#define __NR_lgetxattr                                  73
-__SYSCALL( 73, sys_lgetxattr, 4)
-#define __NR_llistxattr                         74
-__SYSCALL( 74, sys_llistxattr, 3)
-#define __NR_lremovexattr                       75
-__SYSCALL( 75, sys_lremovexattr, 2)
-#define __NR_fsetxattr                                  76
-__SYSCALL( 76, sys_fsetxattr, 5)
-#define __NR_fgetxattr                                  77
-__SYSCALL( 77, sys_fgetxattr, 4)
-#define __NR_flistxattr                         78
-__SYSCALL( 78, sys_flistxattr, 3)
-#define __NR_fremovexattr                       79
-__SYSCALL( 79, sys_fremovexattr, 2)
-
-/* File Map / Shared Memory Operations */
-
-#define __NR_mmap2                              80
-__SYSCALL( 80, sys_mmap_pgoff, 6)
-#define __NR_munmap                             81
-__SYSCALL( 81, sys_munmap, 2)
-#define __NR_mprotect                           82
-__SYSCALL( 82, sys_mprotect, 3)
-#define __NR_brk                                83
-__SYSCALL( 83, sys_brk, 1)
-#define __NR_mlock                              84
-__SYSCALL( 84, sys_mlock, 2)
-#define __NR_munlock                            85
-__SYSCALL( 85, sys_munlock, 2)
-#define __NR_mlockall                           86
-__SYSCALL( 86, sys_mlockall, 1)
-#define __NR_munlockall                         87
-__SYSCALL( 87, sys_munlockall, 0)
-#define __NR_mremap                             88
-__SYSCALL( 88, sys_mremap, 4)
-#define __NR_msync                              89
-__SYSCALL( 89, sys_msync, 3)
-#define __NR_mincore                            90
-__SYSCALL( 90, sys_mincore, 3)
-#define __NR_madvise                            91
-__SYSCALL( 91, sys_madvise, 3)
-#define __NR_shmget                             92
-__SYSCALL( 92, sys_shmget, 4)
-#define __NR_shmat                              93
-__SYSCALL( 93, xtensa_shmat, 4)
-#define __NR_shmctl                             94
-__SYSCALL( 94, sys_shmctl, 4)
-#define __NR_shmdt                              95
-__SYSCALL( 95, sys_shmdt, 4)
-
-/* Socket Operations */
-
-#define __NR_socket                             96
-__SYSCALL( 96, sys_socket, 3)
-#define __NR_setsockopt                         97
-__SYSCALL( 97, sys_setsockopt, 5)
-#define __NR_getsockopt                         98
-__SYSCALL( 98, sys_getsockopt, 5)
-#define __NR_shutdown                           99
-__SYSCALL( 99, sys_shutdown, 2)
-
-#define __NR_bind                              100
-__SYSCALL(100, sys_bind, 3)
-#define __NR_connect                           101
-__SYSCALL(101, sys_connect, 3)
-#define __NR_listen                            102
-__SYSCALL(102, sys_listen, 2)
-#define __NR_accept                            103
-__SYSCALL(103, sys_accept, 3)
-
-#define __NR_getsockname                       104
-__SYSCALL(104, sys_getsockname, 3)
-#define __NR_getpeername                       105
-__SYSCALL(105, sys_getpeername, 3)
-#define __NR_sendmsg                           106
-__SYSCALL(106, sys_sendmsg, 3)
-#define __NR_recvmsg                           107
-__SYSCALL(107, sys_recvmsg, 3)
-#define __NR_send                              108
-__SYSCALL(108, sys_send, 4)
-#define __NR_recv                              109
-__SYSCALL(109, sys_recv, 4)
-#define __NR_sendto                            110
-__SYSCALL(110, sys_sendto, 6)
-#define __NR_recvfrom                          111
-__SYSCALL(111, sys_recvfrom, 6)
-
-#define __NR_socketpair                        112
-__SYSCALL(112, sys_socketpair, 4)
-#define __NR_sendfile                          113
-__SYSCALL(113, sys_sendfile, 4)
-#define __NR_sendfile64                        114
-__SYSCALL(114, sys_sendfile64, 4)
-#define __NR_sendmmsg                          115
-__SYSCALL(115, sys_sendmmsg, 4)
-
-/* Process Operations */
-
-#define __NR_clone                             116
-__SYSCALL(116, sys_clone, 5)
-#define __NR_execve                            117
-__SYSCALL(117, sys_execve, 3)
-#define __NR_exit                              118
-__SYSCALL(118, sys_exit, 1)
-#define __NR_exit_group                        119
-__SYSCALL(119, sys_exit_group, 1)
-#define __NR_getpid                            120
-__SYSCALL(120, sys_getpid, 0)
-#define __NR_wait4                             121
-__SYSCALL(121, sys_wait4, 4)
-#define __NR_waitid                            122
-__SYSCALL(122, sys_waitid, 5)
-#define __NR_kill                              123
-__SYSCALL(123, sys_kill, 2)
-#define __NR_tkill                             124
-__SYSCALL(124, sys_tkill, 2)
-#define __NR_tgkill                            125
-__SYSCALL(125, sys_tgkill, 3)
-#define __NR_set_tid_address                   126
-__SYSCALL(126, sys_set_tid_address, 1)
-#define __NR_gettid                            127
-__SYSCALL(127, sys_gettid, 0)
-#define __NR_setsid                            128
-__SYSCALL(128, sys_setsid, 0)
-#define __NR_getsid                            129
-__SYSCALL(129, sys_getsid, 1)
-#define __NR_prctl                             130
-__SYSCALL(130, sys_prctl, 5)
-#define __NR_personality                       131
-__SYSCALL(131, sys_personality, 1)
-#define __NR_getpriority                       132
-__SYSCALL(132, sys_getpriority, 2)
-#define __NR_setpriority                       133
-__SYSCALL(133, sys_setpriority, 3)
-#define __NR_setitimer                                 134
-__SYSCALL(134, sys_setitimer, 3)
-#define __NR_getitimer                                 135
-__SYSCALL(135, sys_getitimer, 2)
-#define __NR_setuid                            136
-__SYSCALL(136, sys_setuid, 1)
-#define __NR_getuid                            137
-__SYSCALL(137, sys_getuid, 0)
-#define __NR_setgid                            138
-__SYSCALL(138, sys_setgid, 1)
-#define __NR_getgid                            139
-__SYSCALL(139, sys_getgid, 0)
-#define __NR_geteuid                           140
-__SYSCALL(140, sys_geteuid, 0)
-#define __NR_getegid                           141
-__SYSCALL(141, sys_getegid, 0)
-#define __NR_setreuid                          142
-__SYSCALL(142, sys_setreuid, 2)
-#define __NR_setregid                          143
-__SYSCALL(143, sys_setregid, 2)
-#define __NR_setresuid                                 144
-__SYSCALL(144, sys_setresuid, 3)
-#define __NR_getresuid                                 145
-__SYSCALL(145, sys_getresuid, 3)
-#define __NR_setresgid                                 146
-__SYSCALL(146, sys_setresgid, 3)
-#define __NR_getresgid                                 147
-__SYSCALL(147, sys_getresgid, 3)
-#define __NR_setpgid                           148
-__SYSCALL(148, sys_setpgid, 2)
-#define __NR_getpgid                           149
-__SYSCALL(149, sys_getpgid, 1)
-#define __NR_getppid                           150
-__SYSCALL(150, sys_getppid, 0)
-#define __NR_getpgrp                           151
-__SYSCALL(151, sys_getpgrp, 0)
-
-#define __NR_reserved152                       152     /* set_thread_area */
-__SYSCALL(152, sys_ni_syscall, 0)
-#define __NR_reserved153                       153     /* get_thread_area */
-__SYSCALL(153, sys_ni_syscall, 0)
-#define __NR_times                             154
-__SYSCALL(154, sys_times, 1)
-#define __NR_acct                              155
-__SYSCALL(155, sys_acct, 1)
-#define __NR_sched_setaffinity                         156
-__SYSCALL(156, sys_sched_setaffinity, 3)
-#define __NR_sched_getaffinity                         157
-__SYSCALL(157, sys_sched_getaffinity, 3)
-#define __NR_capget                            158
-__SYSCALL(158, sys_capget, 2)
-#define __NR_capset                            159
-__SYSCALL(159, sys_capset, 2)
-#define __NR_ptrace                            160
-__SYSCALL(160, sys_ptrace, 4)
-#define __NR_semtimedop                                161
-__SYSCALL(161, sys_semtimedop, 5)
-#define __NR_semget                            162
-__SYSCALL(162, sys_semget, 4)
-#define __NR_semop                             163
-__SYSCALL(163, sys_semop, 4)
-#define __NR_semctl                            164
-__SYSCALL(164, sys_semctl, 4)
-#define __NR_available165                      165
-__SYSCALL(165, sys_ni_syscall, 0)
-#define __NR_msgget                            166
-__SYSCALL(166, sys_msgget, 4)
-#define __NR_msgsnd                            167
-__SYSCALL(167, sys_msgsnd, 4)
-#define __NR_msgrcv                            168
-__SYSCALL(168, sys_msgrcv, 4)
-#define __NR_msgctl                            169
-__SYSCALL(169, sys_msgctl, 4)
-#define __NR_available170                      170
-__SYSCALL(170, sys_ni_syscall, 0)
-
-/* File System */
-
-#define __NR_umount2                           171
-__SYSCALL(171, sys_umount, 2)
-#define __NR_mount                             172
-__SYSCALL(172, sys_mount, 5)
-#define __NR_swapon                            173
-__SYSCALL(173, sys_swapon, 2)
-#define __NR_chroot                            174
-__SYSCALL(174, sys_chroot, 1)
-#define __NR_pivot_root                        175
-__SYSCALL(175, sys_pivot_root, 2)
-#define __NR_umount                            176
-__SYSCALL(176, sys_oldumount, 1)
 #define __ARCH_WANT_SYS_OLDUMOUNT
-#define __NR_swapoff                           177
-__SYSCALL(177, sys_swapoff, 1)
-#define __NR_sync                              178
-__SYSCALL(178, sys_sync, 0)
-#define __NR_syncfs                            179
-__SYSCALL(179, sys_syncfs, 1)
-#define __NR_setfsuid                          180
-__SYSCALL(180, sys_setfsuid, 1)
-#define __NR_setfsgid                          181
-__SYSCALL(181, sys_setfsgid, 1)
-#define __NR_sysfs                             182
-__SYSCALL(182, sys_sysfs, 3)
-#define __NR_ustat                             183
-__SYSCALL(183, sys_ustat, 2)
-#define __NR_statfs                            184
-__SYSCALL(184, sys_statfs, 2)
-#define __NR_fstatfs                           185
-__SYSCALL(185, sys_fstatfs, 2)
-#define __NR_statfs64                          186
-__SYSCALL(186, sys_statfs64, 3)
-#define __NR_fstatfs64                                 187
-__SYSCALL(187, sys_fstatfs64, 3)
-
-/* System */
-
-#define __NR_setrlimit                                 188
-__SYSCALL(188, sys_setrlimit, 2)
-#define __NR_getrlimit                                 189
-__SYSCALL(189, sys_getrlimit, 2)
-#define __NR_getrusage                                 190
-__SYSCALL(190, sys_getrusage, 2)
-#define __NR_futex                             191
-__SYSCALL(191, sys_futex, 5)
-#define __NR_gettimeofday                      192
-__SYSCALL(192, sys_gettimeofday, 2)
-#define __NR_settimeofday                      193
-__SYSCALL(193, sys_settimeofday, 2)
-#define __NR_adjtimex                          194
-__SYSCALL(194, sys_adjtimex, 1)
-#define __NR_nanosleep                         195
-__SYSCALL(195, sys_nanosleep, 2)
-#define __NR_getgroups                                 196
-__SYSCALL(196, sys_getgroups, 2)
-#define __NR_setgroups                                 197
-__SYSCALL(197, sys_setgroups, 2)
-#define __NR_sethostname                       198
-__SYSCALL(198, sys_sethostname, 2)
-#define __NR_setdomainname                     199
-__SYSCALL(199, sys_setdomainname, 2)
-#define __NR_syslog                            200
-__SYSCALL(200, sys_syslog, 3)
-#define __NR_vhangup                           201
-__SYSCALL(201, sys_vhangup, 0)
-#define __NR_uselib                            202
-__SYSCALL(202, sys_uselib, 1)
-#define __NR_reboot                            203
-__SYSCALL(203, sys_reboot, 3)
-#define __NR_quotactl                          204
-__SYSCALL(204, sys_quotactl, 4)
-#define __NR_nfsservctl                        205
-__SYSCALL(205, sys_ni_syscall, 0)                      /* old nfsservctl */
-#define __NR__sysctl                           206
-__SYSCALL(206, sys_sysctl, 1)
-#define __NR_bdflush                           207
-__SYSCALL(207, sys_bdflush, 2)
-#define __NR_uname                             208
-__SYSCALL(208, sys_newuname, 1)
-#define __NR_sysinfo                           209
-__SYSCALL(209, sys_sysinfo, 1)
-#define __NR_init_module                       210
-__SYSCALL(210, sys_init_module, 2)
-#define __NR_delete_module                     211
-__SYSCALL(211, sys_delete_module, 1)
-
-#define __NR_sched_setparam                    212
-__SYSCALL(212, sys_sched_setparam, 2)
-#define __NR_sched_getparam                    213
-__SYSCALL(213, sys_sched_getparam, 2)
-#define __NR_sched_setscheduler                214
-__SYSCALL(214, sys_sched_setscheduler, 3)
-#define __NR_sched_getscheduler                215
-__SYSCALL(215, sys_sched_getscheduler, 1)
-#define __NR_sched_get_priority_max            216
-__SYSCALL(216, sys_sched_get_priority_max, 1)
-#define __NR_sched_get_priority_min            217
-__SYSCALL(217, sys_sched_get_priority_min, 1)
-#define __NR_sched_rr_get_interval             218
-__SYSCALL(218, sys_sched_rr_get_interval, 2)
-#define __NR_sched_yield                       219
-__SYSCALL(219, sys_sched_yield, 0)
-#define __NR_available222                      222
-__SYSCALL(222, sys_ni_syscall, 0)
-
-/* Signal Handling */
-
-#define __NR_restart_syscall                   223
-__SYSCALL(223, sys_restart_syscall, 0)
-#define __NR_sigaltstack                       224
-__SYSCALL(224, sys_sigaltstack, 2)
-#define __NR_rt_sigreturn                      225
-__SYSCALL(225, xtensa_rt_sigreturn, 1)
-#define __NR_rt_sigaction                      226
-__SYSCALL(226, sys_rt_sigaction, 4)
-#define __NR_rt_sigprocmask                    227
-__SYSCALL(227, sys_rt_sigprocmask, 4)
-#define __NR_rt_sigpending                     228
-__SYSCALL(228, sys_rt_sigpending, 2)
-#define __NR_rt_sigtimedwait                   229
-__SYSCALL(229, sys_rt_sigtimedwait, 4)
-#define __NR_rt_sigqueueinfo                   230
-__SYSCALL(230, sys_rt_sigqueueinfo, 3)
-#define __NR_rt_sigsuspend                     231
-__SYSCALL(231, sys_rt_sigsuspend, 2)
-
-/* Message */
-
-#define __NR_mq_open                           232
-__SYSCALL(232, sys_mq_open, 4)
-#define __NR_mq_unlink                                 233
-__SYSCALL(233, sys_mq_unlink, 1)
-#define __NR_mq_timedsend                      234
-__SYSCALL(234, sys_mq_timedsend, 5)
-#define __NR_mq_timedreceive                   235
-__SYSCALL(235, sys_mq_timedreceive, 5)
-#define __NR_mq_notify                                 236
-__SYSCALL(236, sys_mq_notify, 2)
-#define __NR_mq_getsetattr                     237
-__SYSCALL(237, sys_mq_getsetattr, 3)
-#define __NR_available238                      238
-__SYSCALL(238, sys_ni_syscall, 0)
-
-/* IO */
-
-#define __NR_io_setup                          239
-__SYSCALL(239, sys_io_setup, 2)
-#define __NR_io_destroy                        240
-__SYSCALL(240, sys_io_destroy, 1)
-#define __NR_io_submit                                 241
-__SYSCALL(241, sys_io_submit, 3)
-#define __NR_io_getevents                      242
-__SYSCALL(242, sys_io_getevents, 5)
-#define __NR_io_cancel                                 243
-__SYSCALL(243, sys_io_cancel, 3)
-#define __NR_clock_settime                     244
-__SYSCALL(244, sys_clock_settime, 2)
-#define __NR_clock_gettime                     245
-__SYSCALL(245, sys_clock_gettime, 2)
-#define __NR_clock_getres                      246
-__SYSCALL(246, sys_clock_getres, 2)
-#define __NR_clock_nanosleep                   247
-__SYSCALL(247, sys_clock_nanosleep, 4)
-
-/* Timer */
-
-#define __NR_timer_create                      248
-__SYSCALL(248, sys_timer_create, 3)
-#define __NR_timer_delete                      249
-__SYSCALL(249, sys_timer_delete, 1)
-#define __NR_timer_settime                     250
-__SYSCALL(250, sys_timer_settime, 4)
-#define __NR_timer_gettime                     251
-__SYSCALL(251, sys_timer_gettime, 2)
-#define __NR_timer_getoverrun                  252
-__SYSCALL(252, sys_timer_getoverrun, 1)
-
-/* System */
-
-#define __NR_reserved253                       253
-__SYSCALL(253, sys_ni_syscall, 0)
-#define __NR_lookup_dcookie                    254
-__SYSCALL(254, sys_lookup_dcookie, 4)
-#define __NR_available255                      255
-__SYSCALL(255, sys_ni_syscall, 0)
-#define __NR_add_key                           256
-__SYSCALL(256, sys_add_key, 5)
-#define __NR_request_key                       257
-__SYSCALL(257, sys_request_key, 5)
-#define __NR_keyctl                            258
-__SYSCALL(258, sys_keyctl, 5)
-#define __NR_available259                      259
-__SYSCALL(259, sys_ni_syscall, 0)
-
-
-#define __NR_readahead                         260
-__SYSCALL(260, sys_readahead, 5)
-#define __NR_remap_file_pages                  261
-__SYSCALL(261, sys_remap_file_pages, 5)
-#define __NR_migrate_pages                     262
-__SYSCALL(262, sys_migrate_pages, 0)
-#define __NR_mbind                             263
-__SYSCALL(263, sys_mbind, 6)
-#define __NR_get_mempolicy                     264
-__SYSCALL(264, sys_get_mempolicy, 5)
-#define __NR_set_mempolicy                     265
-__SYSCALL(265, sys_set_mempolicy, 3)
-#define __NR_unshare                           266
-__SYSCALL(266, sys_unshare, 1)
-#define __NR_move_pages                                267
-__SYSCALL(267, sys_move_pages, 0)
-#define __NR_splice                            268
-__SYSCALL(268, sys_splice, 0)
-#define __NR_tee                               269
-__SYSCALL(269, sys_tee, 0)
-#define __NR_vmsplice                          270
-__SYSCALL(270, sys_vmsplice, 0)
-#define __NR_available271                      271
-__SYSCALL(271, sys_ni_syscall, 0)
-
-#define __NR_pselect6                          272
-__SYSCALL(272, sys_pselect6, 0)
-#define __NR_ppoll                             273
-__SYSCALL(273, sys_ppoll, 0)
-#define __NR_epoll_pwait                       274
-__SYSCALL(274, sys_epoll_pwait, 0)
-#define __NR_epoll_create1             275
-__SYSCALL(275, sys_epoll_create1, 1)
-
-#define __NR_inotify_init                      276
-__SYSCALL(276, sys_inotify_init, 0)
-#define __NR_inotify_add_watch                 277
-__SYSCALL(277, sys_inotify_add_watch, 3)
-#define __NR_inotify_rm_watch                  278
-__SYSCALL(278, sys_inotify_rm_watch, 2)
-#define __NR_inotify_init1                     279
-__SYSCALL(279, sys_inotify_init1, 1)
-
-#define __NR_getcpu                            280
-__SYSCALL(280, sys_getcpu, 0)
-#define __NR_kexec_load                                281
-__SYSCALL(281, sys_ni_syscall, 0)
-
-#define __NR_ioprio_set                                282
-__SYSCALL(282, sys_ioprio_set, 2)
-#define __NR_ioprio_get                                283
-__SYSCALL(283, sys_ioprio_get, 3)
-
-#define __NR_set_robust_list                   284
-__SYSCALL(284, sys_set_robust_list, 3)
-#define __NR_get_robust_list                   285
-__SYSCALL(285, sys_get_robust_list, 3)
-#define __NR_available286                      286
-__SYSCALL(286, sys_ni_syscall, 0)
-#define __NR_available287                      287
-__SYSCALL(287, sys_ni_syscall, 0)
-
-/* Relative File Operations */
-
-#define __NR_openat                            288
-__SYSCALL(288, sys_openat, 4)
-#define __NR_mkdirat                           289
-__SYSCALL(289, sys_mkdirat, 3)
-#define __NR_mknodat                           290
-__SYSCALL(290, sys_mknodat, 4)
-#define __NR_unlinkat                          291
-__SYSCALL(291, sys_unlinkat, 3)
-#define __NR_renameat                          292
-__SYSCALL(292, sys_renameat, 4)
-#define __NR_linkat                            293
-__SYSCALL(293, sys_linkat, 5)
-#define __NR_symlinkat                         294
-__SYSCALL(294, sys_symlinkat, 3)
-#define __NR_readlinkat                                295
-__SYSCALL(295, sys_readlinkat, 4)
-#define __NR_utimensat                         296
-__SYSCALL(296, sys_utimensat, 0)
-#define __NR_fchownat                          297
-__SYSCALL(297, sys_fchownat, 5)
-#define __NR_futimesat                         298
-__SYSCALL(298, sys_futimesat, 4)
-#define __NR_fstatat64                         299
-__SYSCALL(299, sys_fstatat64, 0)
-#define __NR_fchmodat                          300
-__SYSCALL(300, sys_fchmodat, 4)
-#define __NR_faccessat                         301
-__SYSCALL(301, sys_faccessat, 4)
-#define __NR_available302                      302
-__SYSCALL(302, sys_ni_syscall, 0)
-#define __NR_available303                      303
-__SYSCALL(303, sys_ni_syscall, 0)
-
-#define __NR_signalfd                          304
-__SYSCALL(304, sys_signalfd, 3)
-/*  305 was __NR_timerfd  */
-__SYSCALL(305, sys_ni_syscall, 0)
-#define __NR_eventfd                           306
-__SYSCALL(306, sys_eventfd, 1)
-#define __NR_recvmmsg                          307
-__SYSCALL(307, sys_recvmmsg, 5)
-
-#define __NR_setns                             308
-__SYSCALL(308, sys_setns, 2)
-#define __NR_signalfd4                         309
-__SYSCALL(309, sys_signalfd4, 4)
-#define __NR_dup3                              310
-__SYSCALL(310, sys_dup3, 3)
-#define __NR_pipe2                             311
-__SYSCALL(311, sys_pipe2, 2)
-
-#define __NR_timerfd_create                    312
-__SYSCALL(312, sys_timerfd_create, 2)
-#define __NR_timerfd_settime                   313
-__SYSCALL(313, sys_timerfd_settime, 4)
-#define __NR_timerfd_gettime                   314
-__SYSCALL(314, sys_timerfd_gettime, 2)
-#define __NR_available315                      315
-__SYSCALL(315, sys_ni_syscall, 0)
-
-#define __NR_eventfd2                          316
-__SYSCALL(316, sys_eventfd2, 2)
-#define __NR_preadv                            317
-__SYSCALL(317, sys_preadv, 5)
-#define __NR_pwritev                           318
-__SYSCALL(318, sys_pwritev, 5)
-#define __NR_available319                      319
-__SYSCALL(319, sys_ni_syscall, 0)
-
-#define __NR_fanotify_init                     320
-__SYSCALL(320, sys_fanotify_init, 2)
-#define __NR_fanotify_mark                     321
-__SYSCALL(321, sys_fanotify_mark, 6)
-#define __NR_process_vm_readv                  322
-__SYSCALL(322, sys_process_vm_readv, 6)
-#define __NR_process_vm_writev                 323
-__SYSCALL(323, sys_process_vm_writev, 6)
-
-#define __NR_name_to_handle_at                 324
-__SYSCALL(324, sys_name_to_handle_at, 5)
-#define __NR_open_by_handle_at                 325
-__SYSCALL(325, sys_open_by_handle_at, 3)
-#define __NR_sync_file_range2                  326
-__SYSCALL(326, sys_sync_file_range2, 6)
-#define __NR_perf_event_open                   327
-__SYSCALL(327, sys_perf_event_open, 5)
-
-#define __NR_rt_tgsigqueueinfo                 328
-__SYSCALL(328, sys_rt_tgsigqueueinfo, 4)
-#define __NR_clock_adjtime                     329
-__SYSCALL(329, sys_clock_adjtime, 2)
-#define __NR_prlimit64                         330
-__SYSCALL(330, sys_prlimit64, 4)
-#define __NR_kcmp                              331
-__SYSCALL(331, sys_kcmp, 5)
-
-#define __NR_finit_module                      332
-__SYSCALL(332, sys_finit_module, 3)
-
-#define __NR_accept4                           333
-__SYSCALL(333, sys_accept4, 4)
-
-#define __NR_sched_setattr                     334
-__SYSCALL(334, sys_sched_setattr, 2)
-#define __NR_sched_getattr                     335
-__SYSCALL(335, sys_sched_getattr, 3)
-
-#define __NR_renameat2                         336
-__SYSCALL(336, sys_renameat2, 5)
-
-#define __NR_seccomp                           337
-__SYSCALL(337, sys_seccomp, 3)
-#define __NR_getrandom                         338
-__SYSCALL(338, sys_getrandom, 3)
-#define __NR_memfd_create                      339
-__SYSCALL(339, sys_memfd_create, 2)
-#define __NR_bpf                               340
-__SYSCALL(340, sys_bpf, 3)
-#define __NR_execveat                          341
-__SYSCALL(341, sys_execveat, 5)
-
-#define __NR_userfaultfd                       342
-__SYSCALL(342, sys_userfaultfd, 1)
-#define __NR_membarrier                                343
-__SYSCALL(343, sys_membarrier, 2)
-#define __NR_mlock2                            344
-__SYSCALL(344, sys_mlock2, 3)
-#define __NR_copy_file_range                   345
-__SYSCALL(345, sys_copy_file_range, 6)
-#define __NR_preadv2                           346
-__SYSCALL(346, sys_preadv2, 6)
-#define __NR_pwritev2                          347
-__SYSCALL(347, sys_pwritev2, 6)
-
-#define __NR_pkey_mprotect                     348
-__SYSCALL(348, sys_pkey_mprotect, 4)
-#define __NR_pkey_alloc                                349
-__SYSCALL(349, sys_pkey_alloc, 2)
-#define __NR_pkey_free                         350
-__SYSCALL(350, sys_pkey_free, 1)
-
-#define __NR_statx                             351
-__SYSCALL(351, sys_statx, 5)
-
-#define __NR_syscall_count                     352
 
 /*
  * sysxtensa syscall handler
@@ -795,9 +21,6 @@ __SYSCALL(351, sys_statx, 5)
 #define SYS_XTENSA_ATOMIC_EXG_ADD         2     /* exchange memory and add */
 #define SYS_XTENSA_ATOMIC_ADD             3     /* add to memory */
 #define SYS_XTENSA_ATOMIC_CMP_SWP         4     /* compare and swap */
-
 #define SYS_XTENSA_COUNT                  5     /* count */
 
-#undef __SYSCALL
-
 #endif /* _UAPI_XTENSA_UNISTD_H */
index 8dff506caf075d0663f4d467227c02eade0a2b27..6f629027ac7d92c07c53c1c1b026248f943b179a 100644 (file)
@@ -16,6 +16,7 @@ obj-$(CONFIG_SMP) += smp.o mxhead.o
 obj-$(CONFIG_XTENSA_VARIANT_HAVE_PERF_EVENTS) += perf_event.o
 obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
 obj-$(CONFIG_S32C1I_SELFTEST) += s32c1i_selftest.o
+obj-$(CONFIG_JUMP_LABEL) += jump_label.o
 
 # In the Xtensa architecture, assembly generates literals which must always
 # precede the L32R instruction with a relative offset less than 256 kB.
index 120dd746a14751f3de4317a35921b2037d8c7cdd..33a257b33723aadcc19176f2d22b6d9391d8d30e 100644 (file)
@@ -137,8 +137,6 @@ int main(void)
        DEFINE(EXC_TABLE_DOUBLE_SAVE, offsetof(struct exc_table, double_save));
        DEFINE(EXC_TABLE_FIXUP, offsetof(struct exc_table, fixup));
        DEFINE(EXC_TABLE_PARAM, offsetof(struct exc_table, fixup_param));
-       DEFINE(EXC_TABLE_SYSCALL_SAVE,
-              offsetof(struct exc_table, syscall_save));
        DEFINE(EXC_TABLE_FAST_USER,
               offsetof(struct exc_table, fast_user_handler));
        DEFINE(EXC_TABLE_FAST_KERNEL,
index 4f8b52d575a24c8f3949f4070bdf36036dfdfbb0..92bf24a9da929061a919d1eac22ab8d6d30f64e6 100644 (file)
  */
 
 #define SAVE_CP_REGS(x)                                                        \
-       .align 4;                                                       \
-       .Lsave_cp_regs_cp##x:                                           \
        .if XTENSA_HAVE_COPROCESSOR(x);                                 \
+               .align 4;                                               \
+       .Lsave_cp_regs_cp##x:                                           \
                xchal_cp##x##_store a2 a4 a5 a6 a7;                     \
-       .endif;                                                         \
-       jx      a0
+               jx      a0;                                             \
+       .endif
 
 #define SAVE_CP_REGS_TAB(x)                                            \
        .if XTENSA_HAVE_COPROCESSOR(x);                                 \
-               .long .Lsave_cp_regs_cp##x - .Lsave_cp_regs_jump_table; \
+               .long .Lsave_cp_regs_cp##x;                             \
        .else;                                                          \
                .long 0;                                                \
        .endif;                                                         \
 
 
 #define LOAD_CP_REGS(x)                                                        \
-       .align 4;                                                       \
-       .Lload_cp_regs_cp##x:                                           \
        .if XTENSA_HAVE_COPROCESSOR(x);                                 \
+               .align 4;                                               \
+       .Lload_cp_regs_cp##x:                                           \
                xchal_cp##x##_load a2 a4 a5 a6 a7;                      \
-       .endif;                                                         \
-       jx      a0
+               jx      a0;                                             \
+       .endif
 
 #define LOAD_CP_REGS_TAB(x)                                            \
        .if XTENSA_HAVE_COPROCESSOR(x);                                 \
-               .long .Lload_cp_regs_cp##x - .Lload_cp_regs_jump_table; \
+               .long .Lload_cp_regs_cp##x;                             \
        .else;                                                          \
                .long 0;                                                \
        .endif;                                                         \
@@ -83,6 +83,7 @@
        LOAD_CP_REGS(6)
        LOAD_CP_REGS(7)
 
+       .section ".rodata", "a"
        .align 4
 .Lsave_cp_regs_jump_table:
        SAVE_CP_REGS_TAB(0)
        LOAD_CP_REGS_TAB(6)
        LOAD_CP_REGS_TAB(7)
 
-/*
- * coprocessor_save(buffer, index) 
- *                    a2      a3
- * coprocessor_load(buffer, index)
- *                    a2      a3
- *
- * Save or load coprocessor registers for coprocessor 'index'. 
- * The register values are saved to or loaded from them 'buffer' address.
- *
- * Note that these functions don't update the coprocessor_owner information!
- *
- */
-
-ENTRY(coprocessor_save)
-
-       entry   a1, 32
-       s32i    a0, a1, 0
-       movi    a0, .Lsave_cp_regs_jump_table
-       addx8   a3, a3, a0
-       l32i    a3, a3, 0
-       beqz    a3, 1f
-       add     a0, a0, a3
-       callx0  a0
-1:     l32i    a0, a1, 0
-       retw
-
-ENDPROC(coprocessor_save)
-
-ENTRY(coprocessor_load)
-
-       entry   a1, 32
-       s32i    a0, a1, 0
-       movi    a0, .Lload_cp_regs_jump_table
-       addx4   a3, a3, a0
-       l32i    a3, a3, 0
-       beqz    a3, 1f
-       add     a0, a0, a3
-       callx0  a0
-1:     l32i    a0, a1, 0
-       retw
-
-ENDPROC(coprocessor_load)
+       .previous
 
 /*
- * coprocessor_flush(struct task_info*, index)
+ * coprocessor_flush(struct thread_info*, index)
  *                             a2        a3
- * coprocessor_restore(struct task_info*, index)
- *                              a2         a3
  *
- * Save or load coprocessor registers for coprocessor 'index'. 
+ * Save coprocessor registers for coprocessor 'index'.
  * The register values are saved to or loaded from the coprocessor area 
  * inside the task_info structure.
  *
- * Note that these functions don't update the coprocessor_owner information!
+ * Note that this function doesn't update the coprocessor_owner information!
  *
  */
 
-
 ENTRY(coprocessor_flush)
 
        entry   a1, 32
@@ -172,29 +129,12 @@ ENTRY(coprocessor_flush)
        l32i    a3, a3, 0
        add     a2, a2, a4
        beqz    a3, 1f
-       add     a0, a0, a3
-       callx0  a0
+       callx0  a3
 1:     l32i    a0, a1, 0
        retw
 
 ENDPROC(coprocessor_flush)
 
-ENTRY(coprocessor_restore)
-       entry   a1, 32
-       s32i    a0, a1, 0
-       movi    a0, .Lload_cp_regs_jump_table
-       addx4   a3, a3, a0
-       l32i    a4, a3, 4
-       l32i    a3, a3, 0
-       add     a2, a2, a4
-       beqz    a3, 1f
-       add     a0, a0, a3
-       callx0  a0
-1:     l32i    a0, a1, 0
-       retw
-
-ENDPROC(coprocessor_restore)
-
 /*
  * Entry condition:
  *
@@ -274,10 +214,9 @@ ENTRY(fast_coprocessor)
        movi    a0, 2f                  # a0: 'return' address
        addx8   a3, a3, a5              # a3: coprocessor number
        l32i    a2, a3, 4               # a2: xtregs offset
-       l32i    a3, a3, 0               # a3: jump offset
+       l32i    a3, a3, 0               # a3: jump address
        add     a2, a2, a4
-       add     a4, a3, a5              # a4: address of save routine
-       jx      a4
+       jx      a3
 
        /* Note that only a0 and a1 were preserved. */
 
@@ -297,10 +236,9 @@ ENTRY(fast_coprocessor)
        movi    a0, 1f
        addx8   a3, a3, a5
        l32i    a2, a3, 4               # a2: xtregs offset
-       l32i    a3, a3, 0               # a3: jump offset
+       l32i    a3, a3, 0               # a3: jump address
        add     a2, a2, a4
-       add     a4, a3, a5
-       jx      a4
+       jx      a3
 
        /* Restore all registers and return from exception handler. */
 
index 9cbc380e95727f2f0394f7cf778f412d086e05e3..e50f5124dc6f789c7457cb3b296d67f2b5cc76e1 100644 (file)
@@ -364,7 +364,7 @@ common_exception:
        s32i    a2, a1, PT_DEBUGCAUSE
        s32i    a3, a1, PT_PC
 
-       movi    a2, -1
+       movi    a2, NO_SYSCALL
        rsr     a3, excvaddr
        s32i    a2, a1, PT_SYSCALL
        movi    a2, 0
@@ -1022,25 +1022,6 @@ ENDPROC(fast_alloca)
  *   excsave_1:        dispatch table
  */
 
-ENTRY(fast_syscall_kernel)
-
-       /* Skip syscall. */
-
-       rsr     a0, epc1
-       addi    a0, a0, 3
-       wsr     a0, epc1
-
-       l32i    a0, a2, PT_DEPC
-       bgeui   a0, VALID_DOUBLE_EXCEPTION_ADDRESS, fast_syscall_unrecoverable
-
-       rsr     a0, depc                        # get syscall-nr
-       _beqz   a0, fast_syscall_spill_registers
-       _beqi   a0, __NR_xtensa, fast_syscall_xtensa
-
-       j       kernel_exception
-
-ENDPROC(fast_syscall_kernel)
-
 ENTRY(fast_syscall_user)
 
        /* Skip syscall. */
@@ -1865,20 +1846,28 @@ ENTRY(system_call)
 
        /* regs->syscall = regs->areg[2] */
 
-       l32i    a3, a2, PT_AREG2
+       l32i    a7, a2, PT_AREG2
+       s32i    a7, a2, PT_SYSCALL
+
+       GET_THREAD_INFO(a4, a1)
+       l32i    a3, a4, TI_FLAGS
+       movi    a4, _TIF_WORK_MASK
+       and     a3, a3, a4
+       beqz    a3, 1f
+
        mov     a6, a2
-       s32i    a3, a2, PT_SYSCALL
        call4   do_syscall_trace_enter
-       mov     a3, a6
+       l32i    a7, a2, PT_SYSCALL
 
+1:
        /* syscall = sys_call_table[syscall_nr] */
 
        movi    a4, sys_call_table
-       movi    a5, __NR_syscall_count
+       movi    a5, __NR_syscalls
        movi    a6, -ENOSYS
-       bgeu    a3, a5, 1f
+       bgeu    a7, a5, 1f
 
-       addx4   a4, a3, a4
+       addx4   a4, a7, a4
        l32i    a4, a4, 0
        movi    a5, sys_ni_syscall;
        beq     a4, a5, 1f
@@ -1900,6 +1889,10 @@ ENTRY(system_call)
 1:     /* regs->areg[2] = return_value */
 
        s32i    a6, a2, PT_AREG2
+       bnez    a3, 1f
+       retw
+
+1:
        mov     a6, a2
        call4   do_syscall_trace_leave
        retw
index 9053a5622d2c3435faefe4950f953b7923e8332f..da08e75100aba2351f67d72e89ba880850499852 100644 (file)
@@ -59,10 +59,6 @@ ENTRY(_start)
 
        .align  4
        .literal_position
-.Lstartup:
-       .word   _startup
-
-       .align  4
 _SetupOCD:
        /*
         * Initialize WB, WS, and clear PS.EXCM (to allow loop instructions).
@@ -99,12 +95,12 @@ _SetupMMU:
 1:
 #endif
 #endif
-       .end    no-absolute-literals
 
-       l32r    a0, .Lstartup
+       movi    a0, _startup
        jx      a0
 
 ENDPROC(_start)
+       .end    no-absolute-literals
 
        __REF
        .literal_position
index c2e387c19cdac7090828ee53cdd9424691d12cac..4f20416061fbb0d25ac7750c5ea1dec02fcca94d 100644 (file)
@@ -101,30 +101,30 @@ static void xtensa_wsr(unsigned long v, u8 sr)
        switch (sr) {
 #if XCHAL_NUM_IBREAK > 0
        case SREG_IBREAKA + 0:
-               WSR(v, SREG_IBREAKA + 0);
+               xtensa_set_sr(v, SREG_IBREAKA + 0);
                break;
 #endif
 #if XCHAL_NUM_IBREAK > 1
        case SREG_IBREAKA + 1:
-               WSR(v, SREG_IBREAKA + 1);
+               xtensa_set_sr(v, SREG_IBREAKA + 1);
                break;
 #endif
 
 #if XCHAL_NUM_DBREAK > 0
        case SREG_DBREAKA + 0:
-               WSR(v, SREG_DBREAKA + 0);
+               xtensa_set_sr(v, SREG_DBREAKA + 0);
                break;
        case SREG_DBREAKC + 0:
-               WSR(v, SREG_DBREAKC + 0);
+               xtensa_set_sr(v, SREG_DBREAKC + 0);
                break;
 #endif
 #if XCHAL_NUM_DBREAK > 1
        case SREG_DBREAKA + 1:
-               WSR(v, SREG_DBREAKA + 1);
+               xtensa_set_sr(v, SREG_DBREAKA + 1);
                break;
 
        case SREG_DBREAKC + 1:
-               WSR(v, SREG_DBREAKC + 1);
+               xtensa_set_sr(v, SREG_DBREAKC + 1);
                break;
 #endif
        }
@@ -150,8 +150,8 @@ static void set_ibreak_regs(int reg, struct perf_event *bp)
        unsigned long ibreakenable;
 
        xtensa_wsr(info->address, SREG_IBREAKA + reg);
-       RSR(ibreakenable, SREG_IBREAKENABLE);
-       WSR(ibreakenable | (1 << reg), SREG_IBREAKENABLE);
+       ibreakenable = xtensa_get_sr(SREG_IBREAKENABLE);
+       xtensa_set_sr(ibreakenable | (1 << reg), SREG_IBREAKENABLE);
 }
 
 static void set_dbreak_regs(int reg, struct perf_event *bp)
@@ -214,8 +214,9 @@ void arch_uninstall_hw_breakpoint(struct perf_event *bp)
                /* Breakpoint */
                i = free_slot(this_cpu_ptr(bp_on_reg), XCHAL_NUM_IBREAK, bp);
                if (i >= 0) {
-                       RSR(ibreakenable, SREG_IBREAKENABLE);
-                       WSR(ibreakenable & ~(1 << i), SREG_IBREAKENABLE);
+                       ibreakenable = xtensa_get_sr(SREG_IBREAKENABLE);
+                       xtensa_set_sr(ibreakenable & ~(1 << i),
+                                     SREG_IBREAKENABLE);
                }
        } else {
                /* Watchpoint */
diff --git a/arch/xtensa/kernel/jump_label.c b/arch/xtensa/kernel/jump_label.c
new file mode 100644 (file)
index 0000000..d108f72
--- /dev/null
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (C) 2018 Cadence Design Systems Inc.
+
+#include <linux/cpu.h>
+#include <linux/jump_label.h>
+#include <linux/kernel.h>
+#include <linux/memory.h>
+#include <linux/stop_machine.h>
+#include <linux/types.h>
+
+#include <asm/cacheflush.h>
+
+#ifdef HAVE_JUMP_LABEL
+
+#define J_OFFSET_MASK 0x0003ffff
+#define J_SIGN_MASK (~(J_OFFSET_MASK >> 1))
+
+#if defined(__XTENSA_EL__)
+#define J_INSN 0x6
+#define NOP_INSN 0x0020f0
+#elif defined(__XTENSA_EB__)
+#define J_INSN 0x60000000
+#define NOP_INSN 0x0f020000
+#else
+#error Unsupported endianness.
+#endif
+
+struct patch {
+       atomic_t cpu_count;
+       unsigned long addr;
+       size_t sz;
+       const void *data;
+};
+
+static void local_patch_text(unsigned long addr, const void *data, size_t sz)
+{
+       memcpy((void *)addr, data, sz);
+       local_flush_icache_range(addr, addr + sz);
+}
+
+static int patch_text_stop_machine(void *data)
+{
+       struct patch *patch = data;
+
+       if (atomic_inc_return(&patch->cpu_count) == 1) {
+               local_patch_text(patch->addr, patch->data, patch->sz);
+               atomic_inc(&patch->cpu_count);
+       } else {
+               while (atomic_read(&patch->cpu_count) <= num_online_cpus())
+                       cpu_relax();
+               __invalidate_icache_range(patch->addr, patch->sz);
+       }
+       return 0;
+}
+
+static void patch_text(unsigned long addr, const void *data, size_t sz)
+{
+       if (IS_ENABLED(CONFIG_SMP)) {
+               struct patch patch = {
+                       .cpu_count = ATOMIC_INIT(0),
+                       .addr = addr,
+                       .sz = sz,
+                       .data = data,
+               };
+               stop_machine_cpuslocked(patch_text_stop_machine,
+                                       &patch, NULL);
+       } else {
+               unsigned long flags;
+
+               local_irq_save(flags);
+               local_patch_text(addr, data, sz);
+               local_irq_restore(flags);
+       }
+}
+
+void arch_jump_label_transform(struct jump_entry *e,
+                              enum jump_label_type type)
+{
+       u32 d = (jump_entry_target(e) - (jump_entry_code(e) + 4));
+       u32 insn;
+
+       /* Jump only works within 128K of the J instruction. */
+       BUG_ON(!((d & J_SIGN_MASK) == 0 ||
+                (d & J_SIGN_MASK) == J_SIGN_MASK));
+
+       if (type == JUMP_LABEL_JMP) {
+#if defined(__XTENSA_EL__)
+               insn = ((d & J_OFFSET_MASK) << 6) | J_INSN;
+#elif defined(__XTENSA_EB__)
+               insn = ((d & J_OFFSET_MASK) << 8) | J_INSN;
+#endif
+       } else {
+               insn = NOP_INSN;
+       }
+
+       patch_text(jump_entry_code(e), &insn, JUMP_LABEL_NOP_SIZE);
+}
+
+#endif /* HAVE_JUMP_LABEL */
index 4bb68133a72af93ad00e82d08abb7d26a783b86d..74969a437a37cea70c273281d068b4633364f39f 100644 (file)
@@ -87,7 +87,8 @@ void coprocessor_release_all(struct thread_info *ti)
        }
 
        ti->cpenable = cpenable;
-       coprocessor_clear_cpenable();
+       if (ti == current_thread_info())
+               xtensa_set_sr(0, cpenable);
 
        preempt_enable();
 }
@@ -99,16 +100,16 @@ void coprocessor_flush_all(struct thread_info *ti)
 
        preempt_disable();
 
-       RSR_CPENABLE(old_cpenable);
+       old_cpenable = xtensa_get_sr(cpenable);
        cpenable = ti->cpenable;
-       WSR_CPENABLE(cpenable);
+       xtensa_set_sr(cpenable, cpenable);
 
        for (i = 0; i < XCHAL_CP_MAX; i++) {
                if ((cpenable & 1) != 0 && coprocessor_owner[i] == ti)
                        coprocessor_flush(ti, i);
                cpenable >>= 1;
        }
-       WSR_CPENABLE(old_cpenable);
+       xtensa_set_sr(old_cpenable, cpenable);
 
        preempt_enable();
 }
@@ -325,49 +326,3 @@ unsigned long get_wchan(struct task_struct *p)
        } while (count++ < 16);
        return 0;
 }
-
-/*
- * xtensa_gregset_t and 'struct pt_regs' are vastly different formats
- * of processor registers.  Besides different ordering,
- * xtensa_gregset_t contains non-live register information that
- * 'struct pt_regs' does not.  Exception handling (primarily) uses
- * 'struct pt_regs'.  Core files and ptrace use xtensa_gregset_t.
- *
- */
-
-void xtensa_elf_core_copy_regs (xtensa_gregset_t *elfregs, struct pt_regs *regs)
-{
-       unsigned long wb, ws, wm;
-       int live, last;
-
-       wb = regs->windowbase;
-       ws = regs->windowstart;
-       wm = regs->wmask;
-       ws = ((ws >> wb) | (ws << (WSBITS - wb))) & ((1 << WSBITS) - 1);
-
-       /* Don't leak any random bits. */
-
-       memset(elfregs, 0, sizeof(*elfregs));
-
-       /* Note:  PS.EXCM is not set while user task is running; its
-        * being set in regs->ps is for exception handling convenience.
-        */
-
-       elfregs->pc             = regs->pc;
-       elfregs->ps             = (regs->ps & ~(1 << PS_EXCM_BIT));
-       elfregs->lbeg           = regs->lbeg;
-       elfregs->lend           = regs->lend;
-       elfregs->lcount         = regs->lcount;
-       elfregs->sar            = regs->sar;
-       elfregs->windowstart    = ws;
-
-       live = (wm & 2) ? 4 : (wm & 4) ? 8 : (wm & 8) ? 12 : 16;
-       last = XCHAL_NUM_AREGS - (wm >> 4) * 4;
-       memcpy(elfregs->a, regs->areg, live * 4);
-       memcpy(elfregs->a + last, regs->areg + last, (wm >> 4) * 16);
-}
-
-int dump_fpu(void)
-{
-       return 0;
-}
index d9541be0605ad52793e5d59a11b2a8dda7f975a7..b964f0b2d8864ea091ecca93ab0cf14754aaac80 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/mm.h>
 #include <linux/perf_event.h>
 #include <linux/ptrace.h>
+#include <linux/regset.h>
 #include <linux/sched.h>
 #include <linux/sched/task_stack.h>
 #include <linux/security.h>
 #include <linux/tracehook.h>
 #include <linux/uaccess.h>
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/syscalls.h>
+
 #include <asm/coprocessor.h>
 #include <asm/elf.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
 #include <asm/ptrace.h>
 
-
-void user_enable_single_step(struct task_struct *child)
+static int gpr_get(struct task_struct *target,
+                  const struct user_regset *regset,
+                  unsigned int pos, unsigned int count,
+                  void *kbuf, void __user *ubuf)
 {
-       child->ptrace |= PT_SINGLESTEP;
+       struct pt_regs *regs = task_pt_regs(target);
+       struct user_pt_regs newregs = {
+               .pc = regs->pc,
+               .ps = regs->ps & ~(1 << PS_EXCM_BIT),
+               .lbeg = regs->lbeg,
+               .lend = regs->lend,
+               .lcount = regs->lcount,
+               .sar = regs->sar,
+               .threadptr = regs->threadptr,
+               .windowbase = regs->windowbase,
+               .windowstart = regs->windowstart,
+       };
+
+       memcpy(newregs.a,
+              regs->areg + XCHAL_NUM_AREGS - regs->windowbase * 4,
+              regs->windowbase * 16);
+       memcpy(newregs.a + regs->windowbase * 4,
+              regs->areg,
+              (WSBITS - regs->windowbase) * 16);
+
+       return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
+                                  &newregs, 0, -1);
 }
 
-void user_disable_single_step(struct task_struct *child)
-{
-       child->ptrace &= ~PT_SINGLESTEP;
-}
-
-/*
- * Called by kernel/ptrace.c when detaching to disable single stepping.
- */
-
-void ptrace_disable(struct task_struct *child)
+static int gpr_set(struct task_struct *target,
+                  const struct user_regset *regset,
+                  unsigned int pos, unsigned int count,
+                  const void *kbuf, const void __user *ubuf)
 {
-       /* Nothing to do.. */
-}
+       int ret;
+       struct user_pt_regs newregs = {0};
+       struct pt_regs *regs;
+       const u32 ps_mask = PS_CALLINC_MASK | PS_OWB_MASK;
 
-static int ptrace_getregs(struct task_struct *child, void __user *uregs)
-{
-       struct pt_regs *regs = task_pt_regs(child);
-       xtensa_gregset_t __user *gregset = uregs;
-       unsigned long wb = regs->windowbase;
-       int i;
+       ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &newregs, 0, -1);
+       if (ret)
+               return ret;
 
-       if (!access_ok(VERIFY_WRITE, uregs, sizeof(xtensa_gregset_t)))
-               return -EIO;
+       if (newregs.windowbase >= XCHAL_NUM_AREGS / 4)
+               return -EINVAL;
 
-       __put_user(regs->pc, &gregset->pc);
-       __put_user(regs->ps & ~(1 << PS_EXCM_BIT), &gregset->ps);
-       __put_user(regs->lbeg, &gregset->lbeg);
-       __put_user(regs->lend, &gregset->lend);
-       __put_user(regs->lcount, &gregset->lcount);
-       __put_user(regs->windowstart, &gregset->windowstart);
-       __put_user(regs->windowbase, &gregset->windowbase);
-       __put_user(regs->threadptr, &gregset->threadptr);
+       regs = task_pt_regs(target);
+       regs->pc = newregs.pc;
+       regs->ps = (regs->ps & ~ps_mask) | (newregs.ps & ps_mask);
+       regs->lbeg = newregs.lbeg;
+       regs->lend = newregs.lend;
+       regs->lcount = newregs.lcount;
+       regs->sar = newregs.sar;
+       regs->threadptr = newregs.threadptr;
+
+       if (newregs.windowbase != regs->windowbase ||
+           newregs.windowstart != regs->windowstart) {
+               u32 rotws, wmask;
+
+               rotws = (((newregs.windowstart |
+                          (newregs.windowstart << WSBITS)) >>
+                         newregs.windowbase) &
+                        ((1 << WSBITS) - 1)) & ~1;
+               wmask = ((rotws ? WSBITS + 1 - ffs(rotws) : 0) << 4) |
+                       (rotws & 0xF) | 1;
+               regs->windowbase = newregs.windowbase;
+               regs->windowstart = newregs.windowstart;
+               regs->wmask = wmask;
+       }
 
-       for (i = 0; i < XCHAL_NUM_AREGS; i++)
-               __put_user(regs->areg[i],
-                          gregset->a + ((wb * 4 + i) % XCHAL_NUM_AREGS));
+       memcpy(regs->areg + XCHAL_NUM_AREGS - newregs.windowbase * 4,
+              newregs.a, newregs.windowbase * 16);
+       memcpy(regs->areg, newregs.a + newregs.windowbase * 4,
+              (WSBITS - newregs.windowbase) * 16);
 
        return 0;
 }
 
-static int ptrace_setregs(struct task_struct *child, void __user *uregs)
+static int tie_get(struct task_struct *target,
+                  const struct user_regset *regset,
+                  unsigned int pos, unsigned int count,
+                  void *kbuf, void __user *ubuf)
 {
-       struct pt_regs *regs = task_pt_regs(child);
-       xtensa_gregset_t *gregset = uregs;
-       const unsigned long ps_mask = PS_CALLINC_MASK | PS_OWB_MASK;
-       unsigned long ps;
-       unsigned long wb, ws;
+       int ret;
+       struct pt_regs *regs = task_pt_regs(target);
+       struct thread_info *ti = task_thread_info(target);
+       elf_xtregs_t *newregs = kzalloc(sizeof(elf_xtregs_t), GFP_KERNEL);
 
-       if (!access_ok(VERIFY_WRITE, uregs, sizeof(xtensa_gregset_t)))
-               return -EIO;
+       if (!newregs)
+               return -ENOMEM;
 
-       __get_user(regs->pc, &gregset->pc);
-       __get_user(ps, &gregset->ps);
-       __get_user(regs->lbeg, &gregset->lbeg);
-       __get_user(regs->lend, &gregset->lend);
-       __get_user(regs->lcount, &gregset->lcount);
-       __get_user(ws, &gregset->windowstart);
-       __get_user(wb, &gregset->windowbase);
-       __get_user(regs->threadptr, &gregset->threadptr);
+       newregs->opt = regs->xtregs_opt;
+       newregs->user = ti->xtregs_user;
 
-       regs->ps = (regs->ps & ~ps_mask) | (ps & ps_mask) | (1 << PS_EXCM_BIT);
+#if XTENSA_HAVE_COPROCESSORS
+       /* Flush all coprocessor registers to memory. */
+       coprocessor_flush_all(ti);
+       newregs->cp0 = ti->xtregs_cp.cp0;
+       newregs->cp1 = ti->xtregs_cp.cp1;
+       newregs->cp2 = ti->xtregs_cp.cp2;
+       newregs->cp3 = ti->xtregs_cp.cp3;
+       newregs->cp4 = ti->xtregs_cp.cp4;
+       newregs->cp5 = ti->xtregs_cp.cp5;
+       newregs->cp6 = ti->xtregs_cp.cp6;
+       newregs->cp7 = ti->xtregs_cp.cp7;
+#endif
+       ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
+                                 newregs, 0, -1);
+       kfree(newregs);
+       return ret;
+}
 
-       if (wb >= XCHAL_NUM_AREGS / 4)
-               return -EFAULT;
+static int tie_set(struct task_struct *target,
+                  const struct user_regset *regset,
+                  unsigned int pos, unsigned int count,
+                  const void *kbuf, const void __user *ubuf)
+{
+       int ret;
+       struct pt_regs *regs = task_pt_regs(target);
+       struct thread_info *ti = task_thread_info(target);
+       elf_xtregs_t *newregs = kzalloc(sizeof(elf_xtregs_t), GFP_KERNEL);
 
-       if (wb != regs->windowbase || ws != regs->windowstart) {
-               unsigned long rotws, wmask;
+       if (!newregs)
+               return -ENOMEM;
 
-               rotws = (((ws | (ws << WSBITS)) >> wb) &
-                        ((1 << WSBITS) - 1)) & ~1;
-               wmask = ((rotws ? WSBITS + 1 - ffs(rotws) : 0) << 4) |
-                       (rotws & 0xF) | 1;
-               regs->windowbase = wb;
-               regs->windowstart = ws;
-               regs->wmask = wmask;
-       }
+       ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
+                                newregs, 0, -1);
 
-       if (wb != 0 && __copy_from_user(regs->areg + XCHAL_NUM_AREGS - wb * 4,
-                                       gregset->a, wb * 16))
-               return -EFAULT;
-
-       if (__copy_from_user(regs->areg, gregset->a + wb * 4,
-                            (WSBITS - wb) * 16))
-               return -EFAULT;
+       if (ret)
+               goto exit;
+       regs->xtregs_opt = newregs->opt;
+       ti->xtregs_user = newregs->user;
 
-       return 0;
+#if XTENSA_HAVE_COPROCESSORS
+       /* Flush all coprocessors before we overwrite them. */
+       coprocessor_flush_all(ti);
+       coprocessor_release_all(ti);
+       ti->xtregs_cp.cp0 = newregs->cp0;
+       ti->xtregs_cp.cp1 = newregs->cp1;
+       ti->xtregs_cp.cp2 = newregs->cp2;
+       ti->xtregs_cp.cp3 = newregs->cp3;
+       ti->xtregs_cp.cp4 = newregs->cp4;
+       ti->xtregs_cp.cp5 = newregs->cp5;
+       ti->xtregs_cp.cp6 = newregs->cp6;
+       ti->xtregs_cp.cp7 = newregs->cp7;
+#endif
+exit:
+       kfree(newregs);
+       return ret;
 }
 
+enum xtensa_regset {
+       REGSET_GPR,
+       REGSET_TIE,
+};
 
-#if XTENSA_HAVE_COPROCESSORS
-#define CP_OFFSETS(cp) \
-       { \
-               .elf_xtregs_offset = offsetof(elf_xtregs_t, cp), \
-               .ti_offset = offsetof(struct thread_info, xtregs_cp.cp), \
-               .sz = sizeof(xtregs_ ## cp ## _t), \
-       }
+static const struct user_regset xtensa_regsets[] = {
+       [REGSET_GPR] = {
+               .core_note_type = NT_PRSTATUS,
+               .n = sizeof(struct user_pt_regs) / sizeof(u32),
+               .size = sizeof(u32),
+               .align = sizeof(u32),
+               .get = gpr_get,
+               .set = gpr_set,
+       },
+       [REGSET_TIE] = {
+               .core_note_type = NT_PRFPREG,
+               .n = sizeof(elf_xtregs_t) / sizeof(u32),
+               .size = sizeof(u32),
+               .align = sizeof(u32),
+               .get = tie_get,
+               .set = tie_set,
+       },
+};
 
-static const struct {
-       size_t elf_xtregs_offset;
-       size_t ti_offset;
-       size_t sz;
-} cp_offsets[] = {
-       CP_OFFSETS(cp0),
-       CP_OFFSETS(cp1),
-       CP_OFFSETS(cp2),
-       CP_OFFSETS(cp3),
-       CP_OFFSETS(cp4),
-       CP_OFFSETS(cp5),
-       CP_OFFSETS(cp6),
-       CP_OFFSETS(cp7),
+static const struct user_regset_view user_xtensa_view = {
+       .name = "xtensa",
+       .e_machine = EM_XTENSA,
+       .regsets = xtensa_regsets,
+       .n = ARRAY_SIZE(xtensa_regsets)
 };
-#endif
 
-static int ptrace_getxregs(struct task_struct *child, void __user *uregs)
+const struct user_regset_view *task_user_regset_view(struct task_struct *task)
 {
-       struct pt_regs *regs = task_pt_regs(child);
-       struct thread_info *ti = task_thread_info(child);
-       elf_xtregs_t __user *xtregs = uregs;
-       int ret = 0;
-       int i __maybe_unused;
+       return &user_xtensa_view;
+}
 
-       if (!access_ok(VERIFY_WRITE, uregs, sizeof(elf_xtregs_t)))
-               return -EIO;
+void user_enable_single_step(struct task_struct *child)
+{
+       child->ptrace |= PT_SINGLESTEP;
+}
 
-#if XTENSA_HAVE_COPROCESSORS
-       /* Flush all coprocessor registers to memory. */
-       coprocessor_flush_all(ti);
+void user_disable_single_step(struct task_struct *child)
+{
+       child->ptrace &= ~PT_SINGLESTEP;
+}
 
-       for (i = 0; i < ARRAY_SIZE(cp_offsets); ++i)
-               ret |= __copy_to_user((char __user *)xtregs +
-                                     cp_offsets[i].elf_xtregs_offset,
-                                     (const char *)ti +
-                                     cp_offsets[i].ti_offset,
-                                     cp_offsets[i].sz);
-#endif
-       ret |= __copy_to_user(&xtregs->opt, &regs->xtregs_opt,
-                             sizeof(xtregs->opt));
-       ret |= __copy_to_user(&xtregs->user,&ti->xtregs_user,
-                             sizeof(xtregs->user));
+/*
+ * Called by kernel/ptrace.c when detaching to disable single stepping.
+ */
 
-       return ret ? -EFAULT : 0;
+void ptrace_disable(struct task_struct *child)
+{
+       /* Nothing to do.. */
 }
 
-static int ptrace_setxregs(struct task_struct *child, void __user *uregs)
+static int ptrace_getregs(struct task_struct *child, void __user *uregs)
 {
-       struct thread_info *ti = task_thread_info(child);
-       struct pt_regs *regs = task_pt_regs(child);
-       elf_xtregs_t *xtregs = uregs;
-       int ret = 0;
-       int i __maybe_unused;
-
-       if (!access_ok(VERIFY_READ, uregs, sizeof(elf_xtregs_t)))
-               return -EFAULT;
+       return copy_regset_to_user(child, &user_xtensa_view, REGSET_GPR,
+                                  0, sizeof(xtensa_gregset_t), uregs);
+}
 
-#if XTENSA_HAVE_COPROCESSORS
-       /* Flush all coprocessors before we overwrite them. */
-       coprocessor_flush_all(ti);
-       coprocessor_release_all(ti);
+static int ptrace_setregs(struct task_struct *child, void __user *uregs)
+{
+       return copy_regset_from_user(child, &user_xtensa_view, REGSET_GPR,
+                                    0, sizeof(xtensa_gregset_t), uregs);
+}
 
-       for (i = 0; i < ARRAY_SIZE(cp_offsets); ++i)
-               ret |= __copy_from_user((char *)ti + cp_offsets[i].ti_offset,
-                                       (const char __user *)xtregs +
-                                       cp_offsets[i].elf_xtregs_offset,
-                                       cp_offsets[i].sz);
-#endif
-       ret |= __copy_from_user(&regs->xtregs_opt, &xtregs->opt,
-                               sizeof(xtregs->opt));
-       ret |= __copy_from_user(&ti->xtregs_user, &xtregs->user,
-                               sizeof(xtregs->user));
+static int ptrace_getxregs(struct task_struct *child, void __user *uregs)
+{
+       return copy_regset_to_user(child, &user_xtensa_view, REGSET_TIE,
+                                  0, sizeof(elf_xtregs_t), uregs);
+}
 
-       return ret ? -EFAULT : 0;
+static int ptrace_setxregs(struct task_struct *child, void __user *uregs)
+{
+       return copy_regset_from_user(child, &user_xtensa_view, REGSET_TIE,
+                                    0, sizeof(elf_xtregs_t), uregs);
 }
 
 static int ptrace_peekusr(struct task_struct *child, long regno,
@@ -447,20 +502,10 @@ long arch_ptrace(struct task_struct *child, long request,
        void __user *datap = (void __user *) data;
 
        switch (request) {
-       case PTRACE_PEEKTEXT:   /* read word at location addr. */
-       case PTRACE_PEEKDATA:
-               ret = generic_ptrace_peekdata(child, addr, data);
-               break;
-
        case PTRACE_PEEKUSR:    /* read register specified by addr. */
                ret = ptrace_peekusr(child, addr, datap);
                break;
 
-       case PTRACE_POKETEXT:   /* write the word at location addr. */
-       case PTRACE_POKEDATA:
-               ret = generic_ptrace_pokedata(child, addr, data);
-               break;
-
        case PTRACE_POKEUSR:    /* write register specified by addr. */
                ret = ptrace_pokeusr(child, addr, data);
                break;
@@ -497,19 +542,23 @@ long arch_ptrace(struct task_struct *child, long request,
        return ret;
 }
 
-unsigned long do_syscall_trace_enter(struct pt_regs *regs)
+void do_syscall_trace_enter(struct pt_regs *regs)
 {
        if (test_thread_flag(TIF_SYSCALL_TRACE) &&
            tracehook_report_syscall_entry(regs))
-               return -1;
+               regs->syscall = NO_SYSCALL;
 
-       return regs->areg[2];
+       if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
+               trace_sys_enter(regs, syscall_get_nr(current, regs));
 }
 
 void do_syscall_trace_leave(struct pt_regs *regs)
 {
        int step;
 
+       if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
+               trace_sys_exit(regs, regs_return_value(regs));
+
        step = test_thread_flag(TIF_SINGLESTEP);
 
        if (step || test_thread_flag(TIF_SYSCALL_TRACE))
index 351283b60df6174af90cfd789f991f58da68f131..4ec6fbb696bf4df7b8019f7315c79a354804c6ea 100644 (file)
@@ -318,9 +318,9 @@ static inline int mem_reserve(unsigned long start, unsigned long end)
 void __init setup_arch(char **cmdline_p)
 {
        pr_info("config ID: %08x:%08x\n",
-               get_sr(SREG_EPC), get_sr(SREG_EXCSAVE));
-       if (get_sr(SREG_EPC) != XCHAL_HW_CONFIGID0 ||
-           get_sr(SREG_EXCSAVE) != XCHAL_HW_CONFIGID1)
+               xtensa_get_sr(SREG_EPC), xtensa_get_sr(SREG_EXCSAVE));
+       if (xtensa_get_sr(SREG_EPC) != XCHAL_HW_CONFIGID0 ||
+           xtensa_get_sr(SREG_EXCSAVE) != XCHAL_HW_CONFIGID1)
                pr_info("built for config ID: %08x:%08x\n",
                        XCHAL_HW_CONFIGID0, XCHAL_HW_CONFIGID1);
 
@@ -596,7 +596,7 @@ c_show(struct seq_file *f, void *slot)
                      num_online_cpus(),
                      cpumask_pr_args(cpu_online_mask),
                      XCHAL_BUILD_UNIQUE_ID,
-                     get_sr(SREG_EPC), get_sr(SREG_EXCSAVE),
+                     xtensa_get_sr(SREG_EPC), xtensa_get_sr(SREG_EXCSAVE),
                      XCHAL_HAVE_BE ?  "big" : "little",
                      ccount_freq/1000000,
                      (ccount_freq/10000) % 100,
index f88e7a0b232cbd09241a0393ca5db193b661d8c9..74e1682876acbd36cd318195ba49a99dc42df890 100644 (file)
@@ -185,13 +185,13 @@ restore_sigcontext(struct pt_regs *regs, struct rt_sigframe __user *frame)
        COPY(sar);
 #undef COPY
 
-       /* All registers were flushed to stack. Start with a prestine frame. */
+       /* All registers were flushed to stack. Start with a pristine frame. */
 
        regs->wmask = 1;
        regs->windowbase = 0;
        regs->windowstart = 1;
 
-       regs->syscall = -1;             /* disable syscall checks */
+       regs->syscall = NO_SYSCALL;     /* disable syscall checks */
 
        /* For PS, restore only PS.CALLINC.
         * Assume that all other bits are either the same as for the signal
@@ -423,7 +423,7 @@ static void do_signal(struct pt_regs *regs)
 
                /* Are we from a system call? */
 
-               if ((signed)regs->syscall >= 0) {
+               if (regs->syscall != NO_SYSCALL) {
 
                        /* If so, check system call restarting.. */
 
@@ -462,7 +462,7 @@ static void do_signal(struct pt_regs *regs)
        }
 
        /* Did we come from a system call? */
-       if ((signed) regs->syscall >= 0) {
+       if (regs->syscall != NO_SYSCALL) {
                /* Restart the system call - no handlers present */
                switch (regs->areg[2]) {
                case -ERESTARTNOHAND:
index 8201748da05beb125d12786677e240ddb3041912..2c415fce6801ac448f9b13c47e092fe21234911f 100644 (file)
 #include <linux/sched/mm.h>
 #include <linux/shm.h>
 
-typedef void (*syscall_t)(void);
+syscall_t sys_call_table[__NR_syscalls] /* FIXME __cacheline_aligned */= {
+       [0 ... __NR_syscalls - 1] = (syscall_t)&sys_ni_syscall,
 
-syscall_t sys_call_table[__NR_syscall_count] /* FIXME __cacheline_aligned */= {
-       [0 ... __NR_syscall_count - 1] = (syscall_t)&sys_ni_syscall,
-
-#define __SYSCALL(nr,symbol,nargs) [ nr ] = (syscall_t)symbol,
-#include <uapi/asm/unistd.h>
+#define __SYSCALL(nr, entry, nargs)[nr] = (syscall_t)entry,
+#include <asm/syscall_table.h>
+#undef __SYSCALL
 };
 
 #define COLOUR_ALIGN(addr, pgoff) \
diff --git a/arch/xtensa/kernel/syscalls/Makefile b/arch/xtensa/kernel/syscalls/Makefile
new file mode 100644 (file)
index 0000000..659faef
--- /dev/null
@@ -0,0 +1,38 @@
+# SPDX-License-Identifier: GPL-2.0
+kapi := arch/$(SRCARCH)/include/generated/asm
+uapi := arch/$(SRCARCH)/include/generated/uapi/asm
+
+_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)')      \
+         $(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
+
+syscall := $(srctree)/$(src)/syscall.tbl
+syshdr := $(srctree)/$(src)/syscallhdr.sh
+systbl := $(srctree)/$(src)/syscalltbl.sh
+
+quiet_cmd_syshdr = SYSHDR  $@
+      cmd_syshdr = $(CONFIG_SHELL) '$(syshdr)' '$<' '$@'       \
+                  '$(syshdr_abis_$(basetarget))'               \
+                  '$(syshdr_pfx_$(basetarget))'                \
+                  '$(syshdr_offset_$(basetarget))'
+
+quiet_cmd_systbl = SYSTBL  $@
+      cmd_systbl = $(CONFIG_SHELL) '$(systbl)' '$<' '$@'       \
+                  '$(systbl_abis_$(basetarget))'               \
+                  '$(systbl_abi_$(basetarget))'                \
+                  '$(systbl_offset_$(basetarget))'
+
+$(uapi)/unistd_32.h: $(syscall) $(syshdr)
+       $(call if_changed,syshdr)
+
+$(kapi)/syscall_table.h: $(syscall) $(systbl)
+       $(call if_changed,systbl)
+
+uapisyshdr-y           += unistd_32.h
+kapisyshdr-y           += syscall_table.h
+
+targets        += $(uapisyshdr-y) $(kapisyshdr-y)
+
+PHONY += all
+all: $(addprefix $(uapi)/,$(uapisyshdr-y))
+all: $(addprefix $(kapi)/,$(kapisyshdr-y))
+       @:
diff --git a/arch/xtensa/kernel/syscalls/syscall.tbl b/arch/xtensa/kernel/syscalls/syscall.tbl
new file mode 100644 (file)
index 0000000..69cf91b
--- /dev/null
@@ -0,0 +1,374 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# system call numbers and entry vectors for xtensa
+#
+# The format is:
+# <number> <abi> <name> <entry point>
+#
+# The <abi> is always "common" for this file
+#
+0      common  spill                           sys_ni_syscall
+1      common  xtensa                          sys_ni_syscall
+2      common  available4                      sys_ni_syscall
+3      common  available5                      sys_ni_syscall
+4      common  available6                      sys_ni_syscall
+5      common  available7                      sys_ni_syscall
+6      common  available8                      sys_ni_syscall
+7      common  available9                      sys_ni_syscall
+# File Operations
+8      common  open                            sys_open
+9      common  close                           sys_close
+10     common  dup                             sys_dup
+11     common  dup2                            sys_dup2
+12     common  read                            sys_read
+13     common  write                           sys_write
+14     common  select                          sys_select
+15     common  lseek                           sys_lseek
+16     common  poll                            sys_poll
+17     common  _llseek                         sys_llseek
+18     common  epoll_wait                      sys_epoll_wait
+19     common  epoll_ctl                       sys_epoll_ctl
+20     common  epoll_create                    sys_epoll_create
+21     common  creat                           sys_creat
+22     common  truncate                        sys_truncate
+23     common  ftruncate                       sys_ftruncate
+24     common  readv                           sys_readv
+25     common  writev                          sys_writev
+26     common  fsync                           sys_fsync
+27     common  fdatasync                       sys_fdatasync
+28     common  truncate64                      sys_truncate64
+29     common  ftruncate64                     sys_ftruncate64
+30     common  pread64                         sys_pread64
+31     common  pwrite64                        sys_pwrite64
+32     common  link                            sys_link
+33     common  rename                          sys_rename
+34     common  symlink                         sys_symlink
+35     common  readlink                        sys_readlink
+36     common  mknod                           sys_mknod
+37     common  pipe                            sys_pipe
+38     common  unlink                          sys_unlink
+39     common  rmdir                           sys_rmdir
+40     common  mkdir                           sys_mkdir
+41     common  chdir                           sys_chdir
+42     common  fchdir                          sys_fchdir
+43     common  getcwd                          sys_getcwd
+44     common  chmod                           sys_chmod
+45     common  chown                           sys_chown
+46     common  stat                            sys_newstat
+47     common  stat64                          sys_stat64
+48     common  lchown                          sys_lchown
+49     common  lstat                           sys_newlstat
+50     common  lstat64                         sys_lstat64
+51     common  available51                     sys_ni_syscall
+52     common  fchmod                          sys_fchmod
+53     common  fchown                          sys_fchown
+54     common  fstat                           sys_newfstat
+55     common  fstat64                         sys_fstat64
+56     common  flock                           sys_flock
+57     common  access                          sys_access
+58     common  umask                           sys_umask
+59     common  getdents                        sys_getdents
+60     common  getdents64                      sys_getdents64
+61     common  fcntl64                         sys_fcntl64
+62     common  fallocate                       sys_fallocate
+63     common  fadvise64_64                    xtensa_fadvise64_64
+64     common  utime                           sys_utime
+65     common  utimes                          sys_utimes
+66     common  ioctl                           sys_ioctl
+67     common  fcntl                           sys_fcntl
+68     common  setxattr                        sys_setxattr
+69     common  getxattr                        sys_getxattr
+70     common  listxattr                       sys_listxattr
+71     common  removexattr                     sys_removexattr
+72     common  lsetxattr                       sys_lsetxattr
+73     common  lgetxattr                       sys_lgetxattr
+74     common  llistxattr                      sys_llistxattr
+75     common  lremovexattr                    sys_lremovexattr
+76     common  fsetxattr                       sys_fsetxattr
+77     common  fgetxattr                       sys_fgetxattr
+78     common  flistxattr                      sys_flistxattr
+79     common  fremovexattr                    sys_fremovexattr
+# File Map / Shared Memory Operations
+80     common  mmap2                           sys_mmap_pgoff
+81     common  munmap                          sys_munmap
+82     common  mprotect                        sys_mprotect
+83     common  brk                             sys_brk
+84     common  mlock                           sys_mlock
+85     common  munlock                         sys_munlock
+86     common  mlockall                        sys_mlockall
+87     common  munlockall                      sys_munlockall
+88     common  mremap                          sys_mremap
+89     common  msync                           sys_msync
+90     common  mincore                         sys_mincore
+91     common  madvise                         sys_madvise
+92     common  shmget                          sys_shmget
+93     common  shmat                           xtensa_shmat
+94     common  shmctl                          sys_shmctl
+95     common  shmdt                           sys_shmdt
+# Socket Operations
+96     common  socket                          sys_socket
+97     common  setsockopt                      sys_setsockopt
+98     common  getsockopt                      sys_getsockopt
+99     common  shutdown                        sys_shutdown
+100    common  bind                            sys_bind
+101    common  connect                         sys_connect
+102    common  listen                          sys_listen
+103    common  accept                          sys_accept
+104    common  getsockname                     sys_getsockname
+105    common  getpeername                     sys_getpeername
+106    common  sendmsg                         sys_sendmsg
+107    common  recvmsg                         sys_recvmsg
+108    common  send                            sys_send
+109    common  recv                            sys_recv
+110    common  sendto                          sys_sendto
+111    common  recvfrom                        sys_recvfrom
+112    common  socketpair                      sys_socketpair
+113    common  sendfile                        sys_sendfile
+114    common  sendfile64                      sys_sendfile64
+115    common  sendmmsg                        sys_sendmmsg
+# Process Operations
+116    common  clone                           sys_clone
+117    common  execve                          sys_execve
+118    common  exit                            sys_exit
+119    common  exit_group                      sys_exit_group
+120    common  getpid                          sys_getpid
+121    common  wait4                           sys_wait4
+122    common  waitid                          sys_waitid
+123    common  kill                            sys_kill
+124    common  tkill                           sys_tkill
+125    common  tgkill                          sys_tgkill
+126    common  set_tid_address                 sys_set_tid_address
+127    common  gettid                          sys_gettid
+128    common  setsid                          sys_setsid
+129    common  getsid                          sys_getsid
+130    common  prctl                           sys_prctl
+131    common  personality                     sys_personality
+132    common  getpriority                     sys_getpriority
+133    common  setpriority                     sys_setpriority
+134    common  setitimer                       sys_setitimer
+135    common  getitimer                       sys_getitimer
+136    common  setuid                          sys_setuid
+137    common  getuid                          sys_getuid
+138    common  setgid                          sys_setgid
+139    common  getgid                          sys_getgid
+140    common  geteuid                         sys_geteuid
+141    common  getegid                         sys_getegid
+142    common  setreuid                        sys_setreuid
+143    common  setregid                        sys_setregid
+144    common  setresuid                       sys_setresuid
+145    common  getresuid                       sys_getresuid
+146    common  setresgid                       sys_setresgid
+147    common  getresgid                       sys_getresgid
+148    common  setpgid                         sys_setpgid
+149    common  getpgid                         sys_getpgid
+150    common  getppid                         sys_getppid
+151    common  getpgrp                         sys_getpgrp
+# 152 was set_thread_area
+152    common  reserved152                     sys_ni_syscall
+# 153 was get_thread_area
+153    common  reserved153                     sys_ni_syscall
+154    common  times                           sys_times
+155    common  acct                            sys_acct
+156    common  sched_setaffinity               sys_sched_setaffinity
+157    common  sched_getaffinity               sys_sched_getaffinity
+158    common  capget                          sys_capget
+159    common  capset                          sys_capset
+160    common  ptrace                          sys_ptrace
+161    common  semtimedop                      sys_semtimedop
+162    common  semget                          sys_semget
+163    common  semop                           sys_semop
+164    common  semctl                          sys_semctl
+165    common  available165                    sys_ni_syscall
+166    common  msgget                          sys_msgget
+167    common  msgsnd                          sys_msgsnd
+168    common  msgrcv                          sys_msgrcv
+169    common  msgctl                          sys_msgctl
+170    common  available170                    sys_ni_syscall
+# File System
+171    common  umount2                         sys_umount
+172    common  mount                           sys_mount
+173    common  swapon                          sys_swapon
+174    common  chroot                          sys_chroot
+175    common  pivot_root                      sys_pivot_root
+176    common  umount                          sys_oldumount
+177    common  swapoff                         sys_swapoff
+178    common  sync                            sys_sync
+179    common  syncfs                          sys_syncfs
+180    common  setfsuid                        sys_setfsuid
+181    common  setfsgid                        sys_setfsgid
+182    common  sysfs                           sys_sysfs
+183    common  ustat                           sys_ustat
+184    common  statfs                          sys_statfs
+185    common  fstatfs                         sys_fstatfs
+186    common  statfs64                        sys_statfs64
+187    common  fstatfs64                       sys_fstatfs64
+# System
+188    common  setrlimit                       sys_setrlimit
+189    common  getrlimit                       sys_getrlimit
+190    common  getrusage                       sys_getrusage
+191    common  futex                           sys_futex
+192    common  gettimeofday                    sys_gettimeofday
+193    common  settimeofday                    sys_settimeofday
+194    common  adjtimex                        sys_adjtimex
+195    common  nanosleep                       sys_nanosleep
+196    common  getgroups                       sys_getgroups
+197    common  setgroups                       sys_setgroups
+198    common  sethostname                     sys_sethostname
+199    common  setdomainname                   sys_setdomainname
+200    common  syslog                          sys_syslog
+201    common  vhangup                         sys_vhangup
+202    common  uselib                          sys_uselib
+203    common  reboot                          sys_reboot
+204    common  quotactl                        sys_quotactl
+# 205 was old nfsservctl
+205    common  nfsservctl                      sys_ni_syscall
+206    common  _sysctl                         sys_sysctl
+207    common  bdflush                         sys_bdflush
+208    common  uname                           sys_newuname
+209    common  sysinfo                         sys_sysinfo
+210    common  init_module                     sys_init_module
+211    common  delete_module                   sys_delete_module
+212    common  sched_setparam                  sys_sched_setparam
+213    common  sched_getparam                  sys_sched_getparam
+214    common  sched_setscheduler              sys_sched_setscheduler
+215    common  sched_getscheduler              sys_sched_getscheduler
+216    common  sched_get_priority_max          sys_sched_get_priority_max
+217    common  sched_get_priority_min          sys_sched_get_priority_min
+218    common  sched_rr_get_interval           sys_sched_rr_get_interval
+219    common  sched_yield                     sys_sched_yield
+222    common  available222                    sys_ni_syscall
+# Signal Handling
+223    common  restart_syscall                 sys_restart_syscall
+224    common  sigaltstack                     sys_sigaltstack
+225    common  rt_sigreturn                    xtensa_rt_sigreturn
+226    common  rt_sigaction                    sys_rt_sigaction
+227    common  rt_sigprocmask                  sys_rt_sigprocmask
+228    common  rt_sigpending                   sys_rt_sigpending
+229    common  rt_sigtimedwait                 sys_rt_sigtimedwait
+230    common  rt_sigqueueinfo                 sys_rt_sigqueueinfo
+231    common  rt_sigsuspend                   sys_rt_sigsuspend
+# Message
+232    common  mq_open                         sys_mq_open
+233    common  mq_unlink                       sys_mq_unlink
+234    common  mq_timedsend                    sys_mq_timedsend
+235    common  mq_timedreceive                 sys_mq_timedreceive
+236    common  mq_notify                       sys_mq_notify
+237    common  mq_getsetattr                   sys_mq_getsetattr
+238    common  available238                    sys_ni_syscall
+239    common  io_setup                        sys_io_setup
+# IO
+240    common  io_destroy                      sys_io_destroy
+241    common  io_submit                       sys_io_submit
+242    common  io_getevents                    sys_io_getevents
+243    common  io_cancel                       sys_io_cancel
+244    common  clock_settime                   sys_clock_settime
+245    common  clock_gettime                   sys_clock_gettime
+246    common  clock_getres                    sys_clock_getres
+247    common  clock_nanosleep                 sys_clock_nanosleep
+# Timer
+248    common  timer_create                    sys_timer_create
+249    common  timer_delete                    sys_timer_delete
+250    common  timer_settime                   sys_timer_settime
+251    common  timer_gettime                   sys_timer_gettime
+252    common  timer_getoverrun                sys_timer_getoverrun
+# System
+253    common  reserved253                     sys_ni_syscall
+254    common  lookup_dcookie                  sys_lookup_dcookie
+255    common  available255                    sys_ni_syscall
+256    common  add_key                         sys_add_key
+257    common  request_key                     sys_request_key
+258    common  keyctl                          sys_keyctl
+259    common  available259                    sys_ni_syscall
+260    common  readahead                       sys_readahead
+261    common  remap_file_pages                sys_remap_file_pages
+262    common  migrate_pages                   sys_migrate_pages
+263    common  mbind                           sys_mbind
+264    common  get_mempolicy                   sys_get_mempolicy
+265    common  set_mempolicy                   sys_set_mempolicy
+266    common  unshare                         sys_unshare
+267    common  move_pages                      sys_move_pages
+268    common  splice                          sys_splice
+269    common  tee                             sys_tee
+270    common  vmsplice                        sys_vmsplice
+271    common  available271                    sys_ni_syscall
+272    common  pselect6                        sys_pselect6
+273    common  ppoll                           sys_ppoll
+274    common  epoll_pwait                     sys_epoll_pwait
+275    common  epoll_create1                   sys_epoll_create1
+276    common  inotify_init                    sys_inotify_init
+277    common  inotify_add_watch               sys_inotify_add_watch
+278    common  inotify_rm_watch                sys_inotify_rm_watch
+279    common  inotify_init1                   sys_inotify_init1
+280    common  getcpu                          sys_getcpu
+281    common  kexec_load                      sys_ni_syscall
+282    common  ioprio_set                      sys_ioprio_set
+283    common  ioprio_get                      sys_ioprio_get
+284    common  set_robust_list                 sys_set_robust_list
+285    common  get_robust_list                 sys_get_robust_list
+286    common  available286                    sys_ni_syscall
+287    common  available287                    sys_ni_syscall
+# Relative File Operations
+288    common  openat                          sys_openat
+289    common  mkdirat                         sys_mkdirat
+290    common  mknodat                         sys_mknodat
+291    common  unlinkat                        sys_unlinkat
+292    common  renameat                        sys_renameat
+293    common  linkat                          sys_linkat
+294    common  symlinkat                       sys_symlinkat
+295    common  readlinkat                      sys_readlinkat
+296    common  utimensat                       sys_utimensat
+297    common  fchownat                        sys_fchownat
+298    common  futimesat                       sys_futimesat
+299    common  fstatat64                       sys_fstatat64
+300    common  fchmodat                        sys_fchmodat
+301    common  faccessat                       sys_faccessat
+302    common  available302                    sys_ni_syscall
+303    common  available303                    sys_ni_syscall
+304    common  signalfd                        sys_signalfd
+# 305 was timerfd
+306    common  eventfd                         sys_eventfd
+307    common  recvmmsg                        sys_recvmmsg
+308    common  setns                           sys_setns
+309    common  signalfd4                       sys_signalfd4
+310    common  dup3                            sys_dup3
+311    common  pipe2                           sys_pipe2
+312    common  timerfd_create                  sys_timerfd_create
+313    common  timerfd_settime                 sys_timerfd_settime
+314    common  timerfd_gettime                 sys_timerfd_gettime
+315    common  available315                    sys_ni_syscall
+316    common  eventfd2                        sys_eventfd2
+317    common  preadv                          sys_preadv
+318    common  pwritev                         sys_pwritev
+319    common  available319                    sys_ni_syscall
+320    common  fanotify_init                   sys_fanotify_init
+321    common  fanotify_mark                   sys_fanotify_mark
+322    common  process_vm_readv                sys_process_vm_readv
+323    common  process_vm_writev               sys_process_vm_writev
+324    common  name_to_handle_at               sys_name_to_handle_at
+325    common  open_by_handle_at               sys_open_by_handle_at
+326    common  sync_file_range2                sys_sync_file_range2
+327    common  perf_event_open                 sys_perf_event_open
+328    common  rt_tgsigqueueinfo               sys_rt_tgsigqueueinfo
+329    common  clock_adjtime                   sys_clock_adjtime
+330    common  prlimit64                       sys_prlimit64
+331    common  kcmp                            sys_kcmp
+332    common  finit_module                    sys_finit_module
+333    common  accept4                         sys_accept4
+334    common  sched_setattr                   sys_sched_setattr
+335    common  sched_getattr                   sys_sched_getattr
+336    common  renameat2                       sys_renameat2
+337    common  seccomp                         sys_seccomp
+338    common  getrandom                       sys_getrandom
+339    common  memfd_create                    sys_memfd_create
+340    common  bpf                             sys_bpf
+341    common  execveat                        sys_execveat
+342    common  userfaultfd                     sys_userfaultfd
+343    common  membarrier                      sys_membarrier
+344    common  mlock2                          sys_mlock2
+345    common  copy_file_range                 sys_copy_file_range
+346    common  preadv2                         sys_preadv2
+347    common  pwritev2                        sys_pwritev2
+348    common  pkey_mprotect                   sys_pkey_mprotect
+349    common  pkey_alloc                      sys_pkey_alloc
+350    common  pkey_free                       sys_pkey_free
+351    common  statx                           sys_statx
diff --git a/arch/xtensa/kernel/syscalls/syscallhdr.sh b/arch/xtensa/kernel/syscalls/syscallhdr.sh
new file mode 100644 (file)
index 0000000..d37db64
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+
+in="$1"
+out="$2"
+my_abis=`echo "($3)" | tr ',' '|'`
+prefix="$4"
+offset="$5"
+
+fileguard=_UAPI_ASM_XTENSA_`basename "$out" | sed \
+       -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
+       -e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g'`
+grep -E "^[0-9A-Fa-fXx]+[[:space:]]+${my_abis}" "$in" | sort -n | (
+       printf "#ifndef %s\n" "${fileguard}"
+       printf "#define %s\n" "${fileguard}"
+       printf "\n"
+
+       nxt=0
+       while read nr abi name entry ; do
+               if [ -z "$offset" ]; then
+                       printf "#define __NR_%s%s\t%s\n" \
+                               "${prefix}" "${name}" "${nr}"
+               else
+                       printf "#define __NR_%s%s\t(%s + %s)\n" \
+                               "${prefix}" "${name}" "${offset}" "${nr}"
+               fi
+               nxt=$((nr+1))
+       done
+
+       printf "\n"
+       printf "#ifdef __KERNEL__\n"
+       printf "#define __NR_syscalls\t%s\n" "${nxt}"
+       printf "#endif\n"
+       printf "\n"
+       printf "#endif /* %s */" "${fileguard}"
+) > "$out"
diff --git a/arch/xtensa/kernel/syscalls/syscalltbl.sh b/arch/xtensa/kernel/syscalls/syscalltbl.sh
new file mode 100644 (file)
index 0000000..85d78d9
--- /dev/null
@@ -0,0 +1,32 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+
+in="$1"
+out="$2"
+my_abis=`echo "($3)" | tr ',' '|'`
+my_abi="$4"
+offset="$5"
+
+emit() {
+       t_nxt="$1"
+       t_nr="$2"
+       t_entry="$3"
+
+       while [ $t_nxt -lt $t_nr ]; do
+               printf "__SYSCALL(%s, sys_ni_syscall, )\n" "${t_nxt}"
+               t_nxt=$((t_nxt+1))
+       done
+       printf "__SYSCALL(%s, %s, )\n" "${t_nxt}" "${t_entry}"
+}
+
+grep -E "^[0-9A-Fa-fXx]+[[:space:]]+${my_abis}" "$in" | sort -n | (
+       nxt=0
+       if [ -z "$offset" ]; then
+               offset=0
+       fi
+
+       while read nr abi name entry ; do
+               emit $((nxt+offset)) $((nr+offset)) $entry
+               nxt=$((nr+1))
+       done
+) > "$out"
index 86507fa7c2d7cdd1382df7f41bb5afd730a541c2..e6fa55aa1ccb2e298b9f2bd57754bfb22a07c6c4 100644 (file)
@@ -51,7 +51,6 @@
 extern void kernel_exception(void);
 extern void user_exception(void);
 
-extern void fast_syscall_kernel(void);
 extern void fast_syscall_user(void);
 extern void fast_alloca(void);
 extern void fast_unaligned(void);
@@ -89,7 +88,6 @@ typedef struct {
 static dispatch_init_table_t __initdata dispatch_init_table[] = {
 
 { EXCCAUSE_ILLEGAL_INSTRUCTION,        0,         do_illegal_instruction},
-{ EXCCAUSE_SYSTEM_CALL,                KRNL,      fast_syscall_kernel },
 { EXCCAUSE_SYSTEM_CALL,                USER,      fast_syscall_user },
 { EXCCAUSE_SYSTEM_CALL,                0,         system_call },
 /* EXCCAUSE_INSTRUCTION_FETCH unhandled */
@@ -215,8 +213,8 @@ extern void do_IRQ(int, struct pt_regs *);
 
 static inline void check_valid_nmi(void)
 {
-       unsigned intread = get_sr(interrupt);
-       unsigned intenable = get_sr(intenable);
+       unsigned intread = xtensa_get_sr(interrupt);
+       unsigned intenable = xtensa_get_sr(intenable);
 
        BUG_ON(intread & intenable &
               ~(XTENSA_INTLEVEL_ANDBELOW_MASK(PROFILING_INTLEVEL) ^
@@ -273,8 +271,8 @@ void do_interrupt(struct pt_regs *regs)
        irq_enter();
 
        for (;;) {
-               unsigned intread = get_sr(interrupt);
-               unsigned intenable = get_sr(intenable);
+               unsigned intread = xtensa_get_sr(interrupt);
+               unsigned intenable = xtensa_get_sr(intenable);
                unsigned int_at_level = intread & intenable;
                unsigned level;
 
index 30a48bba4a47372b81ce5f0e6e40aec8ca564dcd..d4986109968415a8f82ee258d6dad4d0b33b31f1 100644 (file)
@@ -60,6 +60,9 @@ void __init bootmem_init(void)
        max_pfn = PFN_DOWN(memblock_end_of_DRAM());
        max_low_pfn = min(max_pfn, MAX_LOW_PFN);
 
+       early_memtest((phys_addr_t)min_low_pfn << PAGE_SHIFT,
+                     (phys_addr_t)max_low_pfn << PAGE_SHIFT);
+
        memblock_set_current_limit(PFN_PHYS(max_low_pfn));
        dma_contiguous_reserve(PFN_PHYS(max_low_pfn));
 
index e539500752d463f6051fce31085866dbd4abc853..5385f5768345ef3aa22bdeed8bd22195469d2f9d 100644 (file)
@@ -62,7 +62,7 @@ void secondary_init_irq(void)
        __this_cpu_write(cached_irq_mask,
                        XCHAL_INTTYPE_MASK_EXTERN_EDGE |
                        XCHAL_INTTYPE_MASK_EXTERN_LEVEL);
-       set_sr(XCHAL_INTTYPE_MASK_EXTERN_EDGE |
+       xtensa_set_sr(XCHAL_INTTYPE_MASK_EXTERN_EDGE |
                        XCHAL_INTTYPE_MASK_EXTERN_LEVEL, intenable);
 }
 
@@ -77,7 +77,7 @@ static void xtensa_mx_irq_mask(struct irq_data *d)
        } else {
                mask = __this_cpu_read(cached_irq_mask) & ~mask;
                __this_cpu_write(cached_irq_mask, mask);
-               set_sr(mask, intenable);
+               xtensa_set_sr(mask, intenable);
        }
 }
 
@@ -92,7 +92,7 @@ static void xtensa_mx_irq_unmask(struct irq_data *d)
        } else {
                mask |= __this_cpu_read(cached_irq_mask);
                __this_cpu_write(cached_irq_mask, mask);
-               set_sr(mask, intenable);
+               xtensa_set_sr(mask, intenable);
        }
 }
 
@@ -108,12 +108,12 @@ static void xtensa_mx_irq_disable(struct irq_data *d)
 
 static void xtensa_mx_irq_ack(struct irq_data *d)
 {
-       set_sr(1 << d->hwirq, intclear);
+       xtensa_set_sr(1 << d->hwirq, intclear);
 }
 
 static int xtensa_mx_irq_retrigger(struct irq_data *d)
 {
-       set_sr(1 << d->hwirq, intset);
+       xtensa_set_sr(1 << d->hwirq, intset);
        return 1;
 }
 
index 000cb5462bcf40a379b8703b59d96e2b90460d22..c200234dd2c9d68555f79e2b4a7a2127b645ff01 100644 (file)
@@ -44,13 +44,13 @@ static const struct irq_domain_ops xtensa_irq_domain_ops = {
 static void xtensa_irq_mask(struct irq_data *d)
 {
        cached_irq_mask &= ~(1 << d->hwirq);
-       set_sr(cached_irq_mask, intenable);
+       xtensa_set_sr(cached_irq_mask, intenable);
 }
 
 static void xtensa_irq_unmask(struct irq_data *d)
 {
        cached_irq_mask |= 1 << d->hwirq;
-       set_sr(cached_irq_mask, intenable);
+       xtensa_set_sr(cached_irq_mask, intenable);
 }
 
 static void xtensa_irq_enable(struct irq_data *d)
@@ -65,12 +65,12 @@ static void xtensa_irq_disable(struct irq_data *d)
 
 static void xtensa_irq_ack(struct irq_data *d)
 {
-       set_sr(1 << d->hwirq, intclear);
+       xtensa_set_sr(1 << d->hwirq, intclear);
 }
 
 static int xtensa_irq_retrigger(struct irq_data *d)
 {
-       set_sr(1 << d->hwirq, intset);
+       xtensa_set_sr(1 << d->hwirq, intset);
        return 1;
 }
 
index 818ae690ab791ecb011dd379f29ee006df0121a1..9e67fd359d589934b331679ae08bf6aa8157bb11 100644 (file)
@@ -411,6 +411,7 @@ enum {
 #define AUDIT_ARCH_TILEGX32    (EM_TILEGX|__AUDIT_ARCH_LE)
 #define AUDIT_ARCH_TILEPRO     (EM_TILEPRO|__AUDIT_ARCH_LE)
 #define AUDIT_ARCH_X86_64      (EM_X86_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
+#define AUDIT_ARCH_XTENSA      (EM_XTENSA)
 
 #define AUDIT_PERM_EXEC                1
 #define AUDIT_PERM_WRITE       2
index 93722e60204c607377bf20efeca54df08e78bbd4..d2fb964432f335f95c27b9574ea3c22980c2200b 100644 (file)
@@ -34,6 +34,7 @@
 #define EM_M32R                88      /* Renesas M32R */
 #define EM_MN10300     89      /* Panasonic/MEI MN10300, AM33 */
 #define EM_OPENRISC     92     /* OpenRISC 32-bit embedded processor */
+#define EM_XTENSA      94      /* Tensilica Xtensa Architecture */
 #define EM_BLACKFIN     106     /* ADI Blackfin Processor */
 #define EM_ALTERA_NIOS2        113     /* Altera Nios II soft-core processor */
 #define EM_TI_C6000    140     /* TI C6X DSPs */