Xtensa updates for v4.21:
- 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 -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEK2eFS5jlMn3N6xfYUfnMkfg/oEQFAlwmam4THGpjbXZia2Jj QGdtYWlsLmNvbQAKCRBR+cyR+D+gRFZAD/480EcCMJxYjeo232tzWRTfcf8Al0Bh sBgI1s5m7/m7bcX+mqGgJGirDqjc90sTbHum9vH5BesCc5A4tlZm82C++pGxKI7T icKHlIfPcvefMsZlNIh8dTL5WB0Bw/trc3KLZJdadCb069dI6rKUg69ssy6nvZjF nU3KZGZa0jpz/AtXNBVEZjaipmemn/j0QjLzGGrpKiw8zGvsz4+EG3DO7kP1w3tZ LeF0JLb3deyq/rtCLNKSRD23Gw0iwuf/eidlQ8nEH9pMxCsXY9DjYtjzToZ58c6A ZnFJxYTd7Ot5oNhONhVkgQ583hLbJ/pki1sPI0y77K1FLSLROz7U/pE3DO6ETMvX sb1+A35qUwaYj8FswZz9g0vJm+YJqvR7K1gbGE/6szoK99FNRvxAUwBQ0BXJM1cR wD7gNXIIEd6J8K83oOBtwKSTmOyA4bG1oiq7lgZCq91MJtQ5CYWWwONqKnsMoC/E AGa/sEw0PD5kGR5n7fzuXg9gmGRHrgjeln/iYMTVfWwrGL1YMOxJg7O9sFai/X86 ozSjzEa3PDCbBF5YvKb55fq5YFHpFXTpfX6lwpBausOI0c+20Boc4i1XcCZCjYOG xxSBSt2M8Fff/w5Aj/WlYaBy2qPR+2VpxI3LSnfUP+loVfuKZyaKtsUK0QkM1ODr XSmdQ7kI/xZ2Tg== =LqC4 -----END PGP SIGNATURE----- Merge tag 'xtensa-20181228' of git://github.com/jcmvbkbc/linux-xtensa 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} ...
This commit is contained in:
commit
9ef1034074
|
@ -29,5 +29,5 @@
|
||||||
| um: | TODO |
|
| um: | TODO |
|
||||||
| unicore32: | TODO |
|
| unicore32: | TODO |
|
||||||
| x86: | ok |
|
| x86: | ok |
|
||||||
| xtensa: | TODO |
|
| xtensa: | ok |
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
|
@ -16,7 +16,9 @@ config XTENSA
|
||||||
select GENERIC_PCI_IOMAP
|
select GENERIC_PCI_IOMAP
|
||||||
select GENERIC_SCHED_CLOCK
|
select GENERIC_SCHED_CLOCK
|
||||||
select GENERIC_STRNCPY_FROM_USER if KASAN
|
select GENERIC_STRNCPY_FROM_USER if KASAN
|
||||||
|
select HAVE_ARCH_JUMP_LABEL
|
||||||
select HAVE_ARCH_KASAN if MMU
|
select HAVE_ARCH_KASAN if MMU
|
||||||
|
select HAVE_ARCH_TRACEHOOK
|
||||||
select HAVE_DEBUG_KMEMLEAK
|
select HAVE_DEBUG_KMEMLEAK
|
||||||
select HAVE_DMA_CONTIGUOUS
|
select HAVE_DMA_CONTIGUOUS
|
||||||
select HAVE_EXIT_THREAD
|
select HAVE_EXIT_THREAD
|
||||||
|
@ -27,6 +29,7 @@ config XTENSA
|
||||||
select HAVE_OPROFILE
|
select HAVE_OPROFILE
|
||||||
select HAVE_PERF_EVENTS
|
select HAVE_PERF_EVENTS
|
||||||
select HAVE_STACKPROTECTOR
|
select HAVE_STACKPROTECTOR
|
||||||
|
select HAVE_SYSCALL_TRACEPOINTS
|
||||||
select IRQ_DOMAIN
|
select IRQ_DOMAIN
|
||||||
select MODULES_USE_ELF_RELA
|
select MODULES_USE_ELF_RELA
|
||||||
select PERF_USE_VMALLOC
|
select PERF_USE_VMALLOC
|
||||||
|
|
|
@ -90,6 +90,9 @@ boot := arch/xtensa/boot
|
||||||
all Image zImage uImage: vmlinux
|
all Image zImage uImage: vmlinux
|
||||||
$(Q)$(MAKE) $(build)=$(boot) $@
|
$(Q)$(MAKE) $(build)=$(boot) $@
|
||||||
|
|
||||||
|
archheaders:
|
||||||
|
$(Q)$(MAKE) $(build)=arch/xtensa/kernel/syscalls all
|
||||||
|
|
||||||
define archhelp
|
define archhelp
|
||||||
@echo '* Image - Kernel ELF image with reset vector'
|
@echo '* Image - Kernel ELF image with reset vector'
|
||||||
@echo '* zImage - Compressed kernel image (arch/xtensa/boot/images/zImage.*)'
|
@echo '* zImage - Compressed kernel image (arch/xtensa/boot/images/zImage.*)'
|
||||||
|
|
|
@ -29,17 +29,7 @@ _ResetVector:
|
||||||
.begin no-absolute-literals
|
.begin no-absolute-literals
|
||||||
.literal_position
|
.literal_position
|
||||||
|
|
||||||
#if defined(CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX) && \
|
#ifdef CONFIG_PARSE_BOOTPARAM
|
||||||
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
|
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
_bootparam:
|
_bootparam:
|
||||||
.short BP_TAG_FIRST
|
.short BP_TAG_FIRST
|
||||||
|
@ -66,13 +56,22 @@ _SetupMMU:
|
||||||
initialize_mmu
|
initialize_mmu
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.end no-absolute-literals
|
|
||||||
|
|
||||||
rsil a0, XCHAL_DEBUGLEVEL-1
|
rsil a0, XCHAL_DEBUGLEVEL-1
|
||||||
rsync
|
rsync
|
||||||
reset:
|
reset:
|
||||||
l32r a0, RomInitAddr
|
#if defined(CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX) && \
|
||||||
l32r a2, RomBootParam
|
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 a3, 0
|
||||||
movi a4, 0
|
movi a4, 0
|
||||||
jx a0
|
jx a0
|
||||||
|
|
||||||
|
.end no-absolute-literals
|
||||||
|
|
|
@ -103,7 +103,7 @@ cdce706: clock-synth@69 {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
spi0: spi-master@0d0a0000 {
|
spi0: spi@0d0a0000 {
|
||||||
compatible = "cdns,xtfpga-spi";
|
compatible = "cdns,xtfpga-spi";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
generated-y += syscall_table.h
|
||||||
generic-y += bug.h
|
generic-y += bug.h
|
||||||
generic-y += compat.h
|
generic-y += compat.h
|
||||||
generic-y += device.h
|
generic-y += device.h
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
#ifndef _XTENSA_COPROCESSOR_H
|
#ifndef _XTENSA_COPROCESSOR_H
|
||||||
#define _XTENSA_COPROCESSOR_H
|
#define _XTENSA_COPROCESSOR_H
|
||||||
|
|
||||||
#include <linux/stringify.h>
|
|
||||||
#include <variant/core.h>
|
#include <variant/core.h>
|
||||||
#include <variant/tie.h>
|
#include <variant/tie.h>
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
|
@ -90,19 +89,6 @@
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#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.
|
* Additional registers.
|
||||||
* We define three types of 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)));
|
__attribute__ ((aligned (XCHAL_CP7_SA_ALIGN)));
|
||||||
|
|
||||||
extern struct thread_info* coprocessor_owner[XCHAL_CP_MAX];
|
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_flush(struct thread_info*, int);
|
||||||
extern void coprocessor_restore(struct thread_info*, int);
|
|
||||||
|
|
||||||
extern void coprocessor_release_all(struct thread_info*);
|
extern void coprocessor_release_all(struct thread_info*);
|
||||||
extern void coprocessor_flush_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 /* XTENSA_HAVE_COPROCESSORS */
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
|
|
@ -15,10 +15,10 @@
|
||||||
|
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/coprocessor.h>
|
#include <asm/coprocessor.h>
|
||||||
|
#include <linux/elf-em.h>
|
||||||
|
|
||||||
/* Xtensa processor ELF architecture-magic number */
|
/* Xtensa processor ELF architecture-magic number */
|
||||||
|
|
||||||
#define EM_XTENSA 94
|
|
||||||
#define EM_XTENSA_OLD 0xABC7
|
#define EM_XTENSA_OLD 0xABC7
|
||||||
|
|
||||||
/* Xtensa relocations defined by the ABIs */
|
/* Xtensa relocations defined by the ABIs */
|
||||||
|
@ -75,19 +75,7 @@
|
||||||
|
|
||||||
typedef unsigned long elf_greg_t;
|
typedef unsigned long elf_greg_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct user_pt_regs xtensa_gregset_t;
|
||||||
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;
|
|
||||||
|
|
||||||
#define ELF_NGREG (sizeof(xtensa_gregset_t) / sizeof(elf_greg_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 unsigned int elf_fpreg_t;
|
||||||
typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
|
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.
|
* 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_ARCH EM_XTENSA
|
||||||
|
|
||||||
#define ELF_EXEC_PAGESIZE PAGE_SIZE
|
#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
|
* 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) \
|
#define SET_PERSONALITY(ex) \
|
||||||
set_personality(PER_LINUX_32BIT | (current->personality & (~PER_MASK)))
|
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 */
|
#endif /* _XTENSA_ELF_H */
|
||||||
|
|
|
@ -32,8 +32,8 @@
|
||||||
"3:\n" \
|
"3:\n" \
|
||||||
" .section .fixup,\"ax\"\n" \
|
" .section .fixup,\"ax\"\n" \
|
||||||
" .align 4\n" \
|
" .align 4\n" \
|
||||||
"4: .long 3b\n" \
|
" .literal_position\n" \
|
||||||
"5: l32r %0, 4b\n" \
|
"5: movi %0, 3b\n" \
|
||||||
" movi %1, %3\n" \
|
" movi %1, %3\n" \
|
||||||
" jx %0\n" \
|
" jx %0\n" \
|
||||||
" .previous\n" \
|
" .previous\n" \
|
||||||
|
@ -108,8 +108,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
|
||||||
"2:\n"
|
"2:\n"
|
||||||
" .section .fixup,\"ax\"\n"
|
" .section .fixup,\"ax\"\n"
|
||||||
" .align 4\n"
|
" .align 4\n"
|
||||||
"3: .long 2b\n"
|
" .literal_position\n"
|
||||||
"4: l32r %1, 3b\n"
|
"4: movi %1, 2b\n"
|
||||||
" movi %0, %7\n"
|
" movi %0, %7\n"
|
||||||
" jx %1\n"
|
" jx %1\n"
|
||||||
" .previous\n"
|
" .previous\n"
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#ifndef _XTENSA_IRQFLAGS_H
|
#ifndef _XTENSA_IRQFLAGS_H
|
||||||
#define _XTENSA_IRQFLAGS_H
|
#define _XTENSA_IRQFLAGS_H
|
||||||
|
|
||||||
|
#include <linux/stringify.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -13,6 +13,7 @@
|
||||||
#include <variant/core.h>
|
#include <variant/core.h>
|
||||||
|
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
|
#include <linux/stringify.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
#include <asm/regs.h>
|
#include <asm/regs.h>
|
||||||
|
@ -212,11 +213,18 @@ extern unsigned long get_wchan(struct task_struct *p);
|
||||||
|
|
||||||
/* Special register access. */
|
/* Special register access. */
|
||||||
|
|
||||||
#define WSR(v,sr) __asm__ __volatile__ ("wsr %0,"__stringify(sr) :: "a"(v));
|
#define xtensa_set_sr(x, sr) \
|
||||||
#define RSR(v,sr) __asm__ __volatile__ ("rsr %0,"__stringify(sr) : "=a"(v));
|
({ \
|
||||||
|
unsigned int v = (unsigned int)(x); \
|
||||||
|
__asm__ __volatile__ ("wsr %0, "__stringify(sr) :: "a"(v)); \
|
||||||
|
})
|
||||||
|
|
||||||
#define set_sr(x,sr) ({unsigned int v=(unsigned int)x; WSR(v,sr);})
|
#define xtensa_get_sr(sr) \
|
||||||
#define get_sr(sr) ({unsigned int v; RSR(v,sr); v; })
|
({ \
|
||||||
|
unsigned int v; \
|
||||||
|
__asm__ __volatile__ ("rsr %0, "__stringify(sr) : "=a"(v)); \
|
||||||
|
v; \
|
||||||
|
})
|
||||||
|
|
||||||
#ifndef XCHAL_HAVE_EXTERN_REGS
|
#ifndef XCHAL_HAVE_EXTERN_REGS
|
||||||
#define XCHAL_HAVE_EXTERN_REGS 0
|
#define XCHAL_HAVE_EXTERN_REGS 0
|
||||||
|
|
|
@ -39,6 +39,8 @@
|
||||||
* +-----------------------+ --------
|
* +-----------------------+ --------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define NO_SYSCALL (-1)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <asm/coprocessor.h>
|
#include <asm/coprocessor.h>
|
||||||
|
@ -100,6 +102,11 @@ struct pt_regs {
|
||||||
|
|
||||||
#define user_stack_pointer(regs) ((regs)->areg[1])
|
#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__ */
|
#else /* __ASSEMBLY__ */
|
||||||
|
|
||||||
# include <asm/asm-offsets.h>
|
# include <asm/asm-offsets.h>
|
||||||
|
|
|
@ -1,27 +1,108 @@
|
||||||
/*
|
/*
|
||||||
* include/asm-xtensa/syscall.h
|
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
* 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
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
* for more details.
|
* for more details.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2001 - 2007 Tensilica Inc.
|
* Copyright (C) 2001 - 2007 Tensilica Inc.
|
||||||
|
* Copyright (C) 2018 Cadence Design Systems Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct pt_regs;
|
#ifndef _ASM_SYSCALL_H
|
||||||
asmlinkage long xtensa_ptrace(long, long, long, long);
|
#define _ASM_SYSCALL_H
|
||||||
asmlinkage long xtensa_sigreturn(struct pt_regs*);
|
|
||||||
|
#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_rt_sigreturn(struct pt_regs*);
|
||||||
asmlinkage long xtensa_shmat(int, char __user *, int);
|
asmlinkage long xtensa_shmat(int, char __user *, int);
|
||||||
asmlinkage long xtensa_fadvise64_64(int, int,
|
asmlinkage long xtensa_fadvise64_64(int, int,
|
||||||
unsigned long long, unsigned long long);
|
unsigned long long, unsigned long long);
|
||||||
|
|
||||||
/* Should probably move to linux/syscalls.h */
|
#endif
|
||||||
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);
|
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#ifndef _XTENSA_THREAD_INFO_H
|
#ifndef _XTENSA_THREAD_INFO_H
|
||||||
#define _XTENSA_THREAD_INFO_H
|
#define _XTENSA_THREAD_INFO_H
|
||||||
|
|
||||||
|
#include <linux/stringify.h>
|
||||||
#include <asm/kmem_layout.h>
|
#include <asm/kmem_layout.h>
|
||||||
|
|
||||||
#define CURRENT_SHIFT KERNEL_STACK_SHIFT
|
#define CURRENT_SHIFT KERNEL_STACK_SHIFT
|
||||||
|
@ -100,13 +101,12 @@ static inline struct thread_info *current_thread_info(void)
|
||||||
/*
|
/*
|
||||||
* thread information flags
|
* thread information flags
|
||||||
* - these are process state flags that various assembly files may need to access
|
* - 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_SYSCALL_TRACE 0 /* syscall trace active */
|
||||||
#define TIF_SIGPENDING 1 /* signal pending */
|
#define TIF_SIGPENDING 1 /* signal pending */
|
||||||
#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
|
#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
|
||||||
#define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */
|
#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_MEMDIE 5 /* is terminating due to OOM killer */
|
||||||
#define TIF_RESTORE_SIGMASK 6 /* restore signal mask in do_signal() */
|
#define TIF_RESTORE_SIGMASK 6 /* restore signal mask in do_signal() */
|
||||||
#define TIF_NOTIFY_RESUME 7 /* callback before returning to user */
|
#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_SIGPENDING (1<<TIF_SIGPENDING)
|
||||||
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
|
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
|
||||||
#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
|
#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_WORK_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \
|
||||||
#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */
|
_TIF_SYSCALL_TRACEPOINT)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Thread-synchronous status.
|
* Thread-synchronous status.
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
#define _XTENSA_TIMEX_H
|
#define _XTENSA_TIMEX_H
|
||||||
|
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <linux/stringify.h>
|
|
||||||
|
|
||||||
#if XCHAL_NUM_TIMERS > 0 && \
|
#if XCHAL_NUM_TIMERS > 0 && \
|
||||||
XTENSA_INT_LEVEL(XCHAL_TIMER0_INTERRUPT) <= XCHAL_EXCM_LEVEL
|
XTENSA_INT_LEVEL(XCHAL_TIMER0_INTERRUPT) <= XCHAL_EXCM_LEVEL
|
||||||
|
@ -40,33 +39,24 @@ void local_timer_setup(unsigned cpu);
|
||||||
* Register access.
|
* 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)
|
static inline unsigned long get_ccount (void)
|
||||||
{
|
{
|
||||||
unsigned long ccount;
|
return xtensa_get_sr(ccount);
|
||||||
RSR_CCOUNT(ccount);
|
|
||||||
return ccount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void set_ccount (unsigned long 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)
|
static inline unsigned long get_linux_timer (void)
|
||||||
{
|
{
|
||||||
unsigned ccompare;
|
return xtensa_get_sr(SREG_CCOMPARE + LINUX_TIMER);
|
||||||
RSR_CCOMPARE(LINUX_TIMER, ccompare);
|
|
||||||
return ccompare;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void set_linux_timer (unsigned long ccompare)
|
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 */
|
#endif /* _XTENSA_TIMEX_H */
|
||||||
|
|
|
@ -25,8 +25,6 @@ struct exc_table {
|
||||||
void *fixup;
|
void *fixup;
|
||||||
/* For passing a parameter to fixup */
|
/* For passing a parameter to fixup */
|
||||||
void *fixup_param;
|
void *fixup_param;
|
||||||
/* For fast syscall handler */
|
|
||||||
unsigned long syscall_save;
|
|
||||||
/* Fast user exception handlers */
|
/* Fast user exception handlers */
|
||||||
void *fast_user_handler[EXCCAUSE_N];
|
void *fast_user_handler[EXCCAUSE_N];
|
||||||
/* Fast kernel exception handlers */
|
/* Fast kernel exception handlers */
|
||||||
|
|
|
@ -159,10 +159,9 @@ __asm__ __volatile__( \
|
||||||
"2: \n" \
|
"2: \n" \
|
||||||
" .section .fixup,\"ax\" \n" \
|
" .section .fixup,\"ax\" \n" \
|
||||||
" .align 4 \n" \
|
" .align 4 \n" \
|
||||||
"4: \n" \
|
" .literal_position \n" \
|
||||||
" .long 2b \n" \
|
|
||||||
"5: \n" \
|
"5: \n" \
|
||||||
" l32r %1, 4b \n" \
|
" movi %1, 2b \n" \
|
||||||
" movi %0, %4 \n" \
|
" movi %0, %4 \n" \
|
||||||
" jx %1 \n" \
|
" jx %1 \n" \
|
||||||
" .previous \n" \
|
" .previous \n" \
|
||||||
|
@ -217,10 +216,9 @@ __asm__ __volatile__( \
|
||||||
"2: \n" \
|
"2: \n" \
|
||||||
" .section .fixup,\"ax\" \n" \
|
" .section .fixup,\"ax\" \n" \
|
||||||
" .align 4 \n" \
|
" .align 4 \n" \
|
||||||
"4: \n" \
|
" .literal_position \n" \
|
||||||
" .long 2b \n" \
|
|
||||||
"5: \n" \
|
"5: \n" \
|
||||||
" l32r %1, 4b \n" \
|
" movi %1, 2b \n" \
|
||||||
" movi %2, 0 \n" \
|
" movi %2, 0 \n" \
|
||||||
" movi %0, %4 \n" \
|
" movi %0, %4 \n" \
|
||||||
" jx %1 \n" \
|
" jx %1 \n" \
|
||||||
|
|
|
@ -22,4 +22,6 @@
|
||||||
#define __IGNORE_vfork /* use clone */
|
#define __IGNORE_vfork /* use clone */
|
||||||
#define __IGNORE_fadvise64 /* use fadvise64_64 */
|
#define __IGNORE_fadvise64 /* use fadvise64_64 */
|
||||||
|
|
||||||
|
#define NR_syscalls __NR_syscalls
|
||||||
|
|
||||||
#endif /* _XTENSA_UNISTD_H */
|
#endif /* _XTENSA_UNISTD_H */
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# UAPI Header export list
|
# UAPI Header export list
|
||||||
include include/uapi/asm-generic/Kbuild.asm
|
include include/uapi/asm-generic/Kbuild.asm
|
||||||
|
|
||||||
|
generated-y += unistd_32.h
|
||||||
generic-y += bitsperlong.h
|
generic-y += bitsperlong.h
|
||||||
generic-y += bpf_perf_event.h
|
generic-y += bpf_perf_event.h
|
||||||
generic-y += errno.h
|
generic-y += errno.h
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
#ifndef _UAPI_XTENSA_PTRACE_H
|
#ifndef _UAPI_XTENSA_PTRACE_H
|
||||||
#define _UAPI_XTENSA_PTRACE_H
|
#define _UAPI_XTENSA_PTRACE_H
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
/* Registers used by strace */
|
/* Registers used by strace */
|
||||||
|
|
||||||
#define REG_A_BASE 0x0000
|
#define REG_A_BASE 0x0000
|
||||||
|
@ -36,5 +38,21 @@
|
||||||
#define PTRACE_GETHBPREGS 20
|
#define PTRACE_GETHBPREGS 20
|
||||||
#define PTRACE_SETHBPREGS 21
|
#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 */
|
#endif /* _UAPI_XTENSA_PTRACE_H */
|
||||||
|
|
|
@ -1,784 +1,10 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
/* 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
|
#define _UAPI_XTENSA_UNISTD_H
|
||||||
|
|
||||||
#ifndef __SYSCALL
|
#include <asm/unistd_32.h>
|
||||||
# define __SYSCALL(nr,func,nargs)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#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 __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
|
* 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_EXG_ADD 2 /* exchange memory and add */
|
||||||
#define SYS_XTENSA_ATOMIC_ADD 3 /* add to memory */
|
#define SYS_XTENSA_ATOMIC_ADD 3 /* add to memory */
|
||||||
#define SYS_XTENSA_ATOMIC_CMP_SWP 4 /* compare and swap */
|
#define SYS_XTENSA_ATOMIC_CMP_SWP 4 /* compare and swap */
|
||||||
|
|
||||||
#define SYS_XTENSA_COUNT 5 /* count */
|
#define SYS_XTENSA_COUNT 5 /* count */
|
||||||
|
|
||||||
#undef __SYSCALL
|
|
||||||
|
|
||||||
#endif /* _UAPI_XTENSA_UNISTD_H */
|
#endif /* _UAPI_XTENSA_UNISTD_H */
|
||||||
|
|
|
@ -16,6 +16,7 @@ obj-$(CONFIG_SMP) += smp.o mxhead.o
|
||||||
obj-$(CONFIG_XTENSA_VARIANT_HAVE_PERF_EVENTS) += perf_event.o
|
obj-$(CONFIG_XTENSA_VARIANT_HAVE_PERF_EVENTS) += perf_event.o
|
||||||
obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
|
obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
|
||||||
obj-$(CONFIG_S32C1I_SELFTEST) += s32c1i_selftest.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
|
# In the Xtensa architecture, assembly generates literals which must always
|
||||||
# precede the L32R instruction with a relative offset less than 256 kB.
|
# precede the L32R instruction with a relative offset less than 256 kB.
|
||||||
|
|
|
@ -137,8 +137,6 @@ int main(void)
|
||||||
DEFINE(EXC_TABLE_DOUBLE_SAVE, offsetof(struct exc_table, double_save));
|
DEFINE(EXC_TABLE_DOUBLE_SAVE, offsetof(struct exc_table, double_save));
|
||||||
DEFINE(EXC_TABLE_FIXUP, offsetof(struct exc_table, fixup));
|
DEFINE(EXC_TABLE_FIXUP, offsetof(struct exc_table, fixup));
|
||||||
DEFINE(EXC_TABLE_PARAM, offsetof(struct exc_table, fixup_param));
|
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,
|
DEFINE(EXC_TABLE_FAST_USER,
|
||||||
offsetof(struct exc_table, fast_user_handler));
|
offsetof(struct exc_table, fast_user_handler));
|
||||||
DEFINE(EXC_TABLE_FAST_KERNEL,
|
DEFINE(EXC_TABLE_FAST_KERNEL,
|
||||||
|
|
|
@ -33,16 +33,16 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define SAVE_CP_REGS(x) \
|
#define SAVE_CP_REGS(x) \
|
||||||
|
.if XTENSA_HAVE_COPROCESSOR(x); \
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.Lsave_cp_regs_cp##x: \
|
.Lsave_cp_regs_cp##x: \
|
||||||
.if XTENSA_HAVE_COPROCESSOR(x); \
|
|
||||||
xchal_cp##x##_store a2 a4 a5 a6 a7; \
|
xchal_cp##x##_store a2 a4 a5 a6 a7; \
|
||||||
.endif; \
|
jx a0; \
|
||||||
jx a0
|
.endif
|
||||||
|
|
||||||
#define SAVE_CP_REGS_TAB(x) \
|
#define SAVE_CP_REGS_TAB(x) \
|
||||||
.if XTENSA_HAVE_COPROCESSOR(x); \
|
.if XTENSA_HAVE_COPROCESSOR(x); \
|
||||||
.long .Lsave_cp_regs_cp##x - .Lsave_cp_regs_jump_table; \
|
.long .Lsave_cp_regs_cp##x; \
|
||||||
.else; \
|
.else; \
|
||||||
.long 0; \
|
.long 0; \
|
||||||
.endif; \
|
.endif; \
|
||||||
|
@ -50,16 +50,16 @@
|
||||||
|
|
||||||
|
|
||||||
#define LOAD_CP_REGS(x) \
|
#define LOAD_CP_REGS(x) \
|
||||||
|
.if XTENSA_HAVE_COPROCESSOR(x); \
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.Lload_cp_regs_cp##x: \
|
.Lload_cp_regs_cp##x: \
|
||||||
.if XTENSA_HAVE_COPROCESSOR(x); \
|
|
||||||
xchal_cp##x##_load a2 a4 a5 a6 a7; \
|
xchal_cp##x##_load a2 a4 a5 a6 a7; \
|
||||||
.endif; \
|
jx a0; \
|
||||||
jx a0
|
.endif
|
||||||
|
|
||||||
#define LOAD_CP_REGS_TAB(x) \
|
#define LOAD_CP_REGS_TAB(x) \
|
||||||
.if XTENSA_HAVE_COPROCESSOR(x); \
|
.if XTENSA_HAVE_COPROCESSOR(x); \
|
||||||
.long .Lload_cp_regs_cp##x - .Lload_cp_regs_jump_table; \
|
.long .Lload_cp_regs_cp##x; \
|
||||||
.else; \
|
.else; \
|
||||||
.long 0; \
|
.long 0; \
|
||||||
.endif; \
|
.endif; \
|
||||||
|
@ -83,6 +83,7 @@
|
||||||
LOAD_CP_REGS(6)
|
LOAD_CP_REGS(6)
|
||||||
LOAD_CP_REGS(7)
|
LOAD_CP_REGS(7)
|
||||||
|
|
||||||
|
.section ".rodata", "a"
|
||||||
.align 4
|
.align 4
|
||||||
.Lsave_cp_regs_jump_table:
|
.Lsave_cp_regs_jump_table:
|
||||||
SAVE_CP_REGS_TAB(0)
|
SAVE_CP_REGS_TAB(0)
|
||||||
|
@ -104,64 +105,20 @@
|
||||||
LOAD_CP_REGS_TAB(6)
|
LOAD_CP_REGS_TAB(6)
|
||||||
LOAD_CP_REGS_TAB(7)
|
LOAD_CP_REGS_TAB(7)
|
||||||
|
|
||||||
/*
|
.previous
|
||||||
* 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)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* coprocessor_flush(struct task_info*, index)
|
* coprocessor_flush(struct thread_info*, index)
|
||||||
* a2 a3
|
|
||||||
* coprocessor_restore(struct task_info*, index)
|
|
||||||
* a2 a3
|
* 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
|
* The register values are saved to or loaded from the coprocessor area
|
||||||
* inside the task_info structure.
|
* 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(coprocessor_flush)
|
||||||
|
|
||||||
entry a1, 32
|
entry a1, 32
|
||||||
|
@ -172,29 +129,12 @@ ENTRY(coprocessor_flush)
|
||||||
l32i a3, a3, 0
|
l32i a3, a3, 0
|
||||||
add a2, a2, a4
|
add a2, a2, a4
|
||||||
beqz a3, 1f
|
beqz a3, 1f
|
||||||
add a0, a0, a3
|
callx0 a3
|
||||||
callx0 a0
|
|
||||||
1: l32i a0, a1, 0
|
1: l32i a0, a1, 0
|
||||||
retw
|
retw
|
||||||
|
|
||||||
ENDPROC(coprocessor_flush)
|
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:
|
* Entry condition:
|
||||||
*
|
*
|
||||||
|
@ -274,10 +214,9 @@ ENTRY(fast_coprocessor)
|
||||||
movi a0, 2f # a0: 'return' address
|
movi a0, 2f # a0: 'return' address
|
||||||
addx8 a3, a3, a5 # a3: coprocessor number
|
addx8 a3, a3, a5 # a3: coprocessor number
|
||||||
l32i a2, a3, 4 # a2: xtregs offset
|
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 a2, a2, a4
|
||||||
add a4, a3, a5 # a4: address of save routine
|
jx a3
|
||||||
jx a4
|
|
||||||
|
|
||||||
/* Note that only a0 and a1 were preserved. */
|
/* Note that only a0 and a1 were preserved. */
|
||||||
|
|
||||||
|
@ -297,10 +236,9 @@ ENTRY(fast_coprocessor)
|
||||||
movi a0, 1f
|
movi a0, 1f
|
||||||
addx8 a3, a3, a5
|
addx8 a3, a3, a5
|
||||||
l32i a2, a3, 4 # a2: xtregs offset
|
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 a2, a2, a4
|
||||||
add a4, a3, a5
|
jx a3
|
||||||
jx a4
|
|
||||||
|
|
||||||
/* Restore all registers and return from exception handler. */
|
/* Restore all registers and return from exception handler. */
|
||||||
|
|
||||||
|
|
|
@ -364,7 +364,7 @@ common_exception:
|
||||||
s32i a2, a1, PT_DEBUGCAUSE
|
s32i a2, a1, PT_DEBUGCAUSE
|
||||||
s32i a3, a1, PT_PC
|
s32i a3, a1, PT_PC
|
||||||
|
|
||||||
movi a2, -1
|
movi a2, NO_SYSCALL
|
||||||
rsr a3, excvaddr
|
rsr a3, excvaddr
|
||||||
s32i a2, a1, PT_SYSCALL
|
s32i a2, a1, PT_SYSCALL
|
||||||
movi a2, 0
|
movi a2, 0
|
||||||
|
@ -1022,25 +1022,6 @@ ENDPROC(fast_alloca)
|
||||||
* excsave_1: dispatch table
|
* 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)
|
ENTRY(fast_syscall_user)
|
||||||
|
|
||||||
/* Skip syscall. */
|
/* Skip syscall. */
|
||||||
|
@ -1865,20 +1846,28 @@ ENTRY(system_call)
|
||||||
|
|
||||||
/* regs->syscall = regs->areg[2] */
|
/* regs->syscall = regs->areg[2] */
|
||||||
|
|
||||||
l32i a3, a2, PT_AREG2
|
l32i a7, a2, PT_AREG2
|
||||||
mov a6, a2
|
s32i a7, a2, PT_SYSCALL
|
||||||
s32i a3, a2, PT_SYSCALL
|
|
||||||
call4 do_syscall_trace_enter
|
|
||||||
mov a3, a6
|
|
||||||
|
|
||||||
|
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
|
||||||
|
call4 do_syscall_trace_enter
|
||||||
|
l32i a7, a2, PT_SYSCALL
|
||||||
|
|
||||||
|
1:
|
||||||
/* syscall = sys_call_table[syscall_nr] */
|
/* syscall = sys_call_table[syscall_nr] */
|
||||||
|
|
||||||
movi a4, sys_call_table
|
movi a4, sys_call_table
|
||||||
movi a5, __NR_syscall_count
|
movi a5, __NR_syscalls
|
||||||
movi a6, -ENOSYS
|
movi a6, -ENOSYS
|
||||||
bgeu a3, a5, 1f
|
bgeu a7, a5, 1f
|
||||||
|
|
||||||
addx4 a4, a3, a4
|
addx4 a4, a7, a4
|
||||||
l32i a4, a4, 0
|
l32i a4, a4, 0
|
||||||
movi a5, sys_ni_syscall;
|
movi a5, sys_ni_syscall;
|
||||||
beq a4, a5, 1f
|
beq a4, a5, 1f
|
||||||
|
@ -1900,6 +1889,10 @@ ENTRY(system_call)
|
||||||
1: /* regs->areg[2] = return_value */
|
1: /* regs->areg[2] = return_value */
|
||||||
|
|
||||||
s32i a6, a2, PT_AREG2
|
s32i a6, a2, PT_AREG2
|
||||||
|
bnez a3, 1f
|
||||||
|
retw
|
||||||
|
|
||||||
|
1:
|
||||||
mov a6, a2
|
mov a6, a2
|
||||||
call4 do_syscall_trace_leave
|
call4 do_syscall_trace_leave
|
||||||
retw
|
retw
|
||||||
|
|
|
@ -59,10 +59,6 @@ ENTRY(_start)
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.literal_position
|
.literal_position
|
||||||
.Lstartup:
|
|
||||||
.word _startup
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
_SetupOCD:
|
_SetupOCD:
|
||||||
/*
|
/*
|
||||||
* Initialize WB, WS, and clear PS.EXCM (to allow loop instructions).
|
* Initialize WB, WS, and clear PS.EXCM (to allow loop instructions).
|
||||||
|
@ -99,12 +95,12 @@ _SetupMMU:
|
||||||
1:
|
1:
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
.end no-absolute-literals
|
|
||||||
|
|
||||||
l32r a0, .Lstartup
|
movi a0, _startup
|
||||||
jx a0
|
jx a0
|
||||||
|
|
||||||
ENDPROC(_start)
|
ENDPROC(_start)
|
||||||
|
.end no-absolute-literals
|
||||||
|
|
||||||
__REF
|
__REF
|
||||||
.literal_position
|
.literal_position
|
||||||
|
|
|
@ -101,30 +101,30 @@ static void xtensa_wsr(unsigned long v, u8 sr)
|
||||||
switch (sr) {
|
switch (sr) {
|
||||||
#if XCHAL_NUM_IBREAK > 0
|
#if XCHAL_NUM_IBREAK > 0
|
||||||
case SREG_IBREAKA + 0:
|
case SREG_IBREAKA + 0:
|
||||||
WSR(v, SREG_IBREAKA + 0);
|
xtensa_set_sr(v, SREG_IBREAKA + 0);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#if XCHAL_NUM_IBREAK > 1
|
#if XCHAL_NUM_IBREAK > 1
|
||||||
case SREG_IBREAKA + 1:
|
case SREG_IBREAKA + 1:
|
||||||
WSR(v, SREG_IBREAKA + 1);
|
xtensa_set_sr(v, SREG_IBREAKA + 1);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if XCHAL_NUM_DBREAK > 0
|
#if XCHAL_NUM_DBREAK > 0
|
||||||
case SREG_DBREAKA + 0:
|
case SREG_DBREAKA + 0:
|
||||||
WSR(v, SREG_DBREAKA + 0);
|
xtensa_set_sr(v, SREG_DBREAKA + 0);
|
||||||
break;
|
break;
|
||||||
case SREG_DBREAKC + 0:
|
case SREG_DBREAKC + 0:
|
||||||
WSR(v, SREG_DBREAKC + 0);
|
xtensa_set_sr(v, SREG_DBREAKC + 0);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#if XCHAL_NUM_DBREAK > 1
|
#if XCHAL_NUM_DBREAK > 1
|
||||||
case SREG_DBREAKA + 1:
|
case SREG_DBREAKA + 1:
|
||||||
WSR(v, SREG_DBREAKA + 1);
|
xtensa_set_sr(v, SREG_DBREAKA + 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SREG_DBREAKC + 1:
|
case SREG_DBREAKC + 1:
|
||||||
WSR(v, SREG_DBREAKC + 1);
|
xtensa_set_sr(v, SREG_DBREAKC + 1);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -150,8 +150,8 @@ static void set_ibreak_regs(int reg, struct perf_event *bp)
|
||||||
unsigned long ibreakenable;
|
unsigned long ibreakenable;
|
||||||
|
|
||||||
xtensa_wsr(info->address, SREG_IBREAKA + reg);
|
xtensa_wsr(info->address, SREG_IBREAKA + reg);
|
||||||
RSR(ibreakenable, SREG_IBREAKENABLE);
|
ibreakenable = xtensa_get_sr(SREG_IBREAKENABLE);
|
||||||
WSR(ibreakenable | (1 << reg), SREG_IBREAKENABLE);
|
xtensa_set_sr(ibreakenable | (1 << reg), SREG_IBREAKENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_dbreak_regs(int reg, struct perf_event *bp)
|
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 */
|
/* Breakpoint */
|
||||||
i = free_slot(this_cpu_ptr(bp_on_reg), XCHAL_NUM_IBREAK, bp);
|
i = free_slot(this_cpu_ptr(bp_on_reg), XCHAL_NUM_IBREAK, bp);
|
||||||
if (i >= 0) {
|
if (i >= 0) {
|
||||||
RSR(ibreakenable, SREG_IBREAKENABLE);
|
ibreakenable = xtensa_get_sr(SREG_IBREAKENABLE);
|
||||||
WSR(ibreakenable & ~(1 << i), SREG_IBREAKENABLE);
|
xtensa_set_sr(ibreakenable & ~(1 << i),
|
||||||
|
SREG_IBREAKENABLE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Watchpoint */
|
/* Watchpoint */
|
||||||
|
|
|
@ -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 */
|
|
@ -87,7 +87,8 @@ void coprocessor_release_all(struct thread_info *ti)
|
||||||
}
|
}
|
||||||
|
|
||||||
ti->cpenable = cpenable;
|
ti->cpenable = cpenable;
|
||||||
coprocessor_clear_cpenable();
|
if (ti == current_thread_info())
|
||||||
|
xtensa_set_sr(0, cpenable);
|
||||||
|
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
}
|
}
|
||||||
|
@ -99,16 +100,16 @@ void coprocessor_flush_all(struct thread_info *ti)
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
||||||
RSR_CPENABLE(old_cpenable);
|
old_cpenable = xtensa_get_sr(cpenable);
|
||||||
cpenable = ti->cpenable;
|
cpenable = ti->cpenable;
|
||||||
WSR_CPENABLE(cpenable);
|
xtensa_set_sr(cpenable, cpenable);
|
||||||
|
|
||||||
for (i = 0; i < XCHAL_CP_MAX; i++) {
|
for (i = 0; i < XCHAL_CP_MAX; i++) {
|
||||||
if ((cpenable & 1) != 0 && coprocessor_owner[i] == ti)
|
if ((cpenable & 1) != 0 && coprocessor_owner[i] == ti)
|
||||||
coprocessor_flush(ti, i);
|
coprocessor_flush(ti, i);
|
||||||
cpenable >>= 1;
|
cpenable >>= 1;
|
||||||
}
|
}
|
||||||
WSR_CPENABLE(old_cpenable);
|
xtensa_set_sr(old_cpenable, cpenable);
|
||||||
|
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
}
|
}
|
||||||
|
@ -325,49 +326,3 @@ unsigned long get_wchan(struct task_struct *p)
|
||||||
} while (count++ < 16);
|
} while (count++ < 16);
|
||||||
return 0;
|
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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/perf_event.h>
|
#include <linux/perf_event.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
|
#include <linux/regset.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/task_stack.h>
|
#include <linux/sched/task_stack.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
@ -26,12 +27,201 @@
|
||||||
#include <linux/tracehook.h>
|
#include <linux/tracehook.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
|
#define CREATE_TRACE_POINTS
|
||||||
|
#include <trace/events/syscalls.h>
|
||||||
|
|
||||||
#include <asm/coprocessor.h>
|
#include <asm/coprocessor.h>
|
||||||
#include <asm/elf.h>
|
#include <asm/elf.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
|
static int gpr_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(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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct user_pt_regs newregs = {0};
|
||||||
|
struct pt_regs *regs;
|
||||||
|
const u32 ps_mask = PS_CALLINC_MASK | PS_OWB_MASK;
|
||||||
|
|
||||||
|
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &newregs, 0, -1);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (newregs.windowbase >= XCHAL_NUM_AREGS / 4)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 tie_get(struct task_struct *target,
|
||||||
|
const struct user_regset *regset,
|
||||||
|
unsigned int pos, unsigned int count,
|
||||||
|
void *kbuf, 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 (!newregs)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
newregs->opt = regs->xtregs_opt;
|
||||||
|
newregs->user = ti->xtregs_user;
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 (!newregs)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||||
|
newregs, 0, -1);
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
goto exit;
|
||||||
|
regs->xtregs_opt = newregs->opt;
|
||||||
|
ti->xtregs_user = newregs->user;
|
||||||
|
|
||||||
|
#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,
|
||||||
|
};
|
||||||
|
|
||||||
|
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 user_regset_view user_xtensa_view = {
|
||||||
|
.name = "xtensa",
|
||||||
|
.e_machine = EM_XTENSA,
|
||||||
|
.regsets = xtensa_regsets,
|
||||||
|
.n = ARRAY_SIZE(xtensa_regsets)
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct user_regset_view *task_user_regset_view(struct task_struct *task)
|
||||||
|
{
|
||||||
|
return &user_xtensa_view;
|
||||||
|
}
|
||||||
|
|
||||||
void user_enable_single_step(struct task_struct *child)
|
void user_enable_single_step(struct task_struct *child)
|
||||||
{
|
{
|
||||||
|
@ -54,161 +244,26 @@ void ptrace_disable(struct task_struct *child)
|
||||||
|
|
||||||
static int ptrace_getregs(struct task_struct *child, void __user *uregs)
|
static int ptrace_getregs(struct task_struct *child, void __user *uregs)
|
||||||
{
|
{
|
||||||
struct pt_regs *regs = task_pt_regs(child);
|
return copy_regset_to_user(child, &user_xtensa_view, REGSET_GPR,
|
||||||
xtensa_gregset_t __user *gregset = uregs;
|
0, sizeof(xtensa_gregset_t), uregs);
|
||||||
unsigned long wb = regs->windowbase;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, uregs, sizeof(xtensa_gregset_t)))
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
__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);
|
|
||||||
|
|
||||||
for (i = 0; i < XCHAL_NUM_AREGS; i++)
|
|
||||||
__put_user(regs->areg[i],
|
|
||||||
gregset->a + ((wb * 4 + i) % XCHAL_NUM_AREGS));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ptrace_setregs(struct task_struct *child, void __user *uregs)
|
static int ptrace_setregs(struct task_struct *child, void __user *uregs)
|
||||||
{
|
{
|
||||||
struct pt_regs *regs = task_pt_regs(child);
|
return copy_regset_from_user(child, &user_xtensa_view, REGSET_GPR,
|
||||||
xtensa_gregset_t *gregset = uregs;
|
0, sizeof(xtensa_gregset_t), uregs);
|
||||||
const unsigned long ps_mask = PS_CALLINC_MASK | PS_OWB_MASK;
|
|
||||||
unsigned long ps;
|
|
||||||
unsigned long wb, ws;
|
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, uregs, sizeof(xtensa_gregset_t)))
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
__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);
|
|
||||||
|
|
||||||
regs->ps = (regs->ps & ~ps_mask) | (ps & ps_mask) | (1 << PS_EXCM_BIT);
|
|
||||||
|
|
||||||
if (wb >= XCHAL_NUM_AREGS / 4)
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
if (wb != regs->windowbase || ws != regs->windowstart) {
|
|
||||||
unsigned long rotws, wmask;
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#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 {
|
|
||||||
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),
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int ptrace_getxregs(struct task_struct *child, void __user *uregs)
|
static int ptrace_getxregs(struct task_struct *child, void __user *uregs)
|
||||||
{
|
{
|
||||||
struct pt_regs *regs = task_pt_regs(child);
|
return copy_regset_to_user(child, &user_xtensa_view, REGSET_TIE,
|
||||||
struct thread_info *ti = task_thread_info(child);
|
0, sizeof(elf_xtregs_t), uregs);
|
||||||
elf_xtregs_t __user *xtregs = uregs;
|
|
||||||
int ret = 0;
|
|
||||||
int i __maybe_unused;
|
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, uregs, sizeof(elf_xtregs_t)))
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
#if XTENSA_HAVE_COPROCESSORS
|
|
||||||
/* Flush all coprocessor registers to memory. */
|
|
||||||
coprocessor_flush_all(ti);
|
|
||||||
|
|
||||||
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, ®s->xtregs_opt,
|
|
||||||
sizeof(xtregs->opt));
|
|
||||||
ret |= __copy_to_user(&xtregs->user,&ti->xtregs_user,
|
|
||||||
sizeof(xtregs->user));
|
|
||||||
|
|
||||||
return ret ? -EFAULT : 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ptrace_setxregs(struct task_struct *child, void __user *uregs)
|
static int ptrace_setxregs(struct task_struct *child, void __user *uregs)
|
||||||
{
|
{
|
||||||
struct thread_info *ti = task_thread_info(child);
|
return copy_regset_from_user(child, &user_xtensa_view, REGSET_TIE,
|
||||||
struct pt_regs *regs = task_pt_regs(child);
|
0, sizeof(elf_xtregs_t), uregs);
|
||||||
elf_xtregs_t *xtregs = uregs;
|
|
||||||
int ret = 0;
|
|
||||||
int i __maybe_unused;
|
|
||||||
|
|
||||||
if (!access_ok(VERIFY_READ, uregs, sizeof(elf_xtregs_t)))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
#if XTENSA_HAVE_COPROCESSORS
|
|
||||||
/* Flush all coprocessors before we overwrite them. */
|
|
||||||
coprocessor_flush_all(ti);
|
|
||||||
coprocessor_release_all(ti);
|
|
||||||
|
|
||||||
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(®s->xtregs_opt, &xtregs->opt,
|
|
||||||
sizeof(xtregs->opt));
|
|
||||||
ret |= __copy_from_user(&ti->xtregs_user, &xtregs->user,
|
|
||||||
sizeof(xtregs->user));
|
|
||||||
|
|
||||||
return ret ? -EFAULT : 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ptrace_peekusr(struct task_struct *child, long regno,
|
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;
|
void __user *datap = (void __user *) data;
|
||||||
|
|
||||||
switch (request) {
|
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. */
|
case PTRACE_PEEKUSR: /* read register specified by addr. */
|
||||||
ret = ptrace_peekusr(child, addr, datap);
|
ret = ptrace_peekusr(child, addr, datap);
|
||||||
break;
|
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. */
|
case PTRACE_POKEUSR: /* write register specified by addr. */
|
||||||
ret = ptrace_pokeusr(child, addr, data);
|
ret = ptrace_pokeusr(child, addr, data);
|
||||||
break;
|
break;
|
||||||
|
@ -497,19 +542,23 @@ long arch_ptrace(struct task_struct *child, long request,
|
||||||
return ret;
|
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) &&
|
if (test_thread_flag(TIF_SYSCALL_TRACE) &&
|
||||||
tracehook_report_syscall_entry(regs))
|
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)
|
void do_syscall_trace_leave(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
int step;
|
int step;
|
||||||
|
|
||||||
|
if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
|
||||||
|
trace_sys_exit(regs, regs_return_value(regs));
|
||||||
|
|
||||||
step = test_thread_flag(TIF_SINGLESTEP);
|
step = test_thread_flag(TIF_SINGLESTEP);
|
||||||
|
|
||||||
if (step || test_thread_flag(TIF_SYSCALL_TRACE))
|
if (step || test_thread_flag(TIF_SYSCALL_TRACE))
|
||||||
|
|
|
@ -318,9 +318,9 @@ static inline int mem_reserve(unsigned long start, unsigned long end)
|
||||||
void __init setup_arch(char **cmdline_p)
|
void __init setup_arch(char **cmdline_p)
|
||||||
{
|
{
|
||||||
pr_info("config ID: %08x:%08x\n",
|
pr_info("config ID: %08x:%08x\n",
|
||||||
get_sr(SREG_EPC), get_sr(SREG_EXCSAVE));
|
xtensa_get_sr(SREG_EPC), xtensa_get_sr(SREG_EXCSAVE));
|
||||||
if (get_sr(SREG_EPC) != XCHAL_HW_CONFIGID0 ||
|
if (xtensa_get_sr(SREG_EPC) != XCHAL_HW_CONFIGID0 ||
|
||||||
get_sr(SREG_EXCSAVE) != XCHAL_HW_CONFIGID1)
|
xtensa_get_sr(SREG_EXCSAVE) != XCHAL_HW_CONFIGID1)
|
||||||
pr_info("built for config ID: %08x:%08x\n",
|
pr_info("built for config ID: %08x:%08x\n",
|
||||||
XCHAL_HW_CONFIGID0, XCHAL_HW_CONFIGID1);
|
XCHAL_HW_CONFIGID0, XCHAL_HW_CONFIGID1);
|
||||||
|
|
||||||
|
@ -596,7 +596,7 @@ c_show(struct seq_file *f, void *slot)
|
||||||
num_online_cpus(),
|
num_online_cpus(),
|
||||||
cpumask_pr_args(cpu_online_mask),
|
cpumask_pr_args(cpu_online_mask),
|
||||||
XCHAL_BUILD_UNIQUE_ID,
|
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",
|
XCHAL_HAVE_BE ? "big" : "little",
|
||||||
ccount_freq/1000000,
|
ccount_freq/1000000,
|
||||||
(ccount_freq/10000) % 100,
|
(ccount_freq/10000) % 100,
|
||||||
|
|
|
@ -185,13 +185,13 @@ restore_sigcontext(struct pt_regs *regs, struct rt_sigframe __user *frame)
|
||||||
COPY(sar);
|
COPY(sar);
|
||||||
#undef COPY
|
#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->wmask = 1;
|
||||||
regs->windowbase = 0;
|
regs->windowbase = 0;
|
||||||
regs->windowstart = 1;
|
regs->windowstart = 1;
|
||||||
|
|
||||||
regs->syscall = -1; /* disable syscall checks */
|
regs->syscall = NO_SYSCALL; /* disable syscall checks */
|
||||||
|
|
||||||
/* For PS, restore only PS.CALLINC.
|
/* For PS, restore only PS.CALLINC.
|
||||||
* Assume that all other bits are either the same as for the signal
|
* 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? */
|
/* Are we from a system call? */
|
||||||
|
|
||||||
if ((signed)regs->syscall >= 0) {
|
if (regs->syscall != NO_SYSCALL) {
|
||||||
|
|
||||||
/* If so, check system call restarting.. */
|
/* 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? */
|
/* Did we come from a system call? */
|
||||||
if ((signed) regs->syscall >= 0) {
|
if (regs->syscall != NO_SYSCALL) {
|
||||||
/* Restart the system call - no handlers present */
|
/* Restart the system call - no handlers present */
|
||||||
switch (regs->areg[2]) {
|
switch (regs->areg[2]) {
|
||||||
case -ERESTARTNOHAND:
|
case -ERESTARTNOHAND:
|
||||||
|
|
|
@ -28,13 +28,12 @@
|
||||||
#include <linux/sched/mm.h>
|
#include <linux/sched/mm.h>
|
||||||
#include <linux/shm.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 */= {
|
#define __SYSCALL(nr, entry, nargs)[nr] = (syscall_t)entry,
|
||||||
[0 ... __NR_syscall_count - 1] = (syscall_t)&sys_ni_syscall,
|
#include <asm/syscall_table.h>
|
||||||
|
#undef __SYSCALL
|
||||||
#define __SYSCALL(nr,symbol,nargs) [ nr ] = (syscall_t)symbol,
|
|
||||||
#include <uapi/asm/unistd.h>
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define COLOUR_ALIGN(addr, pgoff) \
|
#define COLOUR_ALIGN(addr, pgoff) \
|
||||||
|
|
|
@ -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))
|
||||||
|
@:
|
|
@ -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
|
|
@ -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"
|
|
@ -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"
|
|
@ -51,7 +51,6 @@
|
||||||
extern void kernel_exception(void);
|
extern void kernel_exception(void);
|
||||||
extern void user_exception(void);
|
extern void user_exception(void);
|
||||||
|
|
||||||
extern void fast_syscall_kernel(void);
|
|
||||||
extern void fast_syscall_user(void);
|
extern void fast_syscall_user(void);
|
||||||
extern void fast_alloca(void);
|
extern void fast_alloca(void);
|
||||||
extern void fast_unaligned(void);
|
extern void fast_unaligned(void);
|
||||||
|
@ -89,7 +88,6 @@ typedef struct {
|
||||||
static dispatch_init_table_t __initdata dispatch_init_table[] = {
|
static dispatch_init_table_t __initdata dispatch_init_table[] = {
|
||||||
|
|
||||||
{ EXCCAUSE_ILLEGAL_INSTRUCTION, 0, do_illegal_instruction},
|
{ EXCCAUSE_ILLEGAL_INSTRUCTION, 0, do_illegal_instruction},
|
||||||
{ EXCCAUSE_SYSTEM_CALL, KRNL, fast_syscall_kernel },
|
|
||||||
{ EXCCAUSE_SYSTEM_CALL, USER, fast_syscall_user },
|
{ EXCCAUSE_SYSTEM_CALL, USER, fast_syscall_user },
|
||||||
{ EXCCAUSE_SYSTEM_CALL, 0, system_call },
|
{ EXCCAUSE_SYSTEM_CALL, 0, system_call },
|
||||||
/* EXCCAUSE_INSTRUCTION_FETCH unhandled */
|
/* EXCCAUSE_INSTRUCTION_FETCH unhandled */
|
||||||
|
@ -215,8 +213,8 @@ extern void do_IRQ(int, struct pt_regs *);
|
||||||
|
|
||||||
static inline void check_valid_nmi(void)
|
static inline void check_valid_nmi(void)
|
||||||
{
|
{
|
||||||
unsigned intread = get_sr(interrupt);
|
unsigned intread = xtensa_get_sr(interrupt);
|
||||||
unsigned intenable = get_sr(intenable);
|
unsigned intenable = xtensa_get_sr(intenable);
|
||||||
|
|
||||||
BUG_ON(intread & intenable &
|
BUG_ON(intread & intenable &
|
||||||
~(XTENSA_INTLEVEL_ANDBELOW_MASK(PROFILING_INTLEVEL) ^
|
~(XTENSA_INTLEVEL_ANDBELOW_MASK(PROFILING_INTLEVEL) ^
|
||||||
|
@ -273,8 +271,8 @@ void do_interrupt(struct pt_regs *regs)
|
||||||
irq_enter();
|
irq_enter();
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
unsigned intread = get_sr(interrupt);
|
unsigned intread = xtensa_get_sr(interrupt);
|
||||||
unsigned intenable = get_sr(intenable);
|
unsigned intenable = xtensa_get_sr(intenable);
|
||||||
unsigned int_at_level = intread & intenable;
|
unsigned int_at_level = intread & intenable;
|
||||||
unsigned level;
|
unsigned level;
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,9 @@ void __init bootmem_init(void)
|
||||||
max_pfn = PFN_DOWN(memblock_end_of_DRAM());
|
max_pfn = PFN_DOWN(memblock_end_of_DRAM());
|
||||||
max_low_pfn = min(max_pfn, MAX_LOW_PFN);
|
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));
|
memblock_set_current_limit(PFN_PHYS(max_low_pfn));
|
||||||
dma_contiguous_reserve(PFN_PHYS(max_low_pfn));
|
dma_contiguous_reserve(PFN_PHYS(max_low_pfn));
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ void secondary_init_irq(void)
|
||||||
__this_cpu_write(cached_irq_mask,
|
__this_cpu_write(cached_irq_mask,
|
||||||
XCHAL_INTTYPE_MASK_EXTERN_EDGE |
|
XCHAL_INTTYPE_MASK_EXTERN_EDGE |
|
||||||
XCHAL_INTTYPE_MASK_EXTERN_LEVEL);
|
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);
|
XCHAL_INTTYPE_MASK_EXTERN_LEVEL, intenable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ static void xtensa_mx_irq_mask(struct irq_data *d)
|
||||||
} else {
|
} else {
|
||||||
mask = __this_cpu_read(cached_irq_mask) & ~mask;
|
mask = __this_cpu_read(cached_irq_mask) & ~mask;
|
||||||
__this_cpu_write(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 {
|
} else {
|
||||||
mask |= __this_cpu_read(cached_irq_mask);
|
mask |= __this_cpu_read(cached_irq_mask);
|
||||||
__this_cpu_write(cached_irq_mask, 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)
|
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)
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,13 +44,13 @@ static const struct irq_domain_ops xtensa_irq_domain_ops = {
|
||||||
static void xtensa_irq_mask(struct irq_data *d)
|
static void xtensa_irq_mask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
cached_irq_mask &= ~(1 << d->hwirq);
|
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)
|
static void xtensa_irq_unmask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
cached_irq_mask |= 1 << d->hwirq;
|
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)
|
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)
|
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)
|
static int xtensa_irq_retrigger(struct irq_data *d)
|
||||||
{
|
{
|
||||||
set_sr(1 << d->hwirq, intset);
|
xtensa_set_sr(1 << d->hwirq, intset);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -411,6 +411,7 @@ enum {
|
||||||
#define AUDIT_ARCH_TILEGX32 (EM_TILEGX|__AUDIT_ARCH_LE)
|
#define AUDIT_ARCH_TILEGX32 (EM_TILEGX|__AUDIT_ARCH_LE)
|
||||||
#define AUDIT_ARCH_TILEPRO (EM_TILEPRO|__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_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_EXEC 1
|
||||||
#define AUDIT_PERM_WRITE 2
|
#define AUDIT_PERM_WRITE 2
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#define EM_M32R 88 /* Renesas M32R */
|
#define EM_M32R 88 /* Renesas M32R */
|
||||||
#define EM_MN10300 89 /* Panasonic/MEI MN10300, AM33 */
|
#define EM_MN10300 89 /* Panasonic/MEI MN10300, AM33 */
|
||||||
#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */
|
#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_BLACKFIN 106 /* ADI Blackfin Processor */
|
||||||
#define EM_ALTERA_NIOS2 113 /* Altera Nios II soft-core processor */
|
#define EM_ALTERA_NIOS2 113 /* Altera Nios II soft-core processor */
|
||||||
#define EM_TI_C6000 140 /* TI C6X DSPs */
|
#define EM_TI_C6000 140 /* TI C6X DSPs */
|
||||||
|
|
Loading…
Reference in New Issue