aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/sparc/Kconfig1
-rw-r--r--arch/sparc/include/asm/ptrace.h3
-rw-r--r--arch/sparc/include/uapi/asm/unistd.h8
-rw-r--r--arch/sparc/kernel/ptrace_64.c36
-rw-r--r--arch/sparc/kernel/systbls_32.S1
-rw-r--r--arch/sparc/kernel/systbls_64.S2
6 files changed, 49 insertions, 2 deletions
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
index a59deaef21e5..3db2543733a5 100644
--- a/arch/sparc/Kconfig
+++ b/arch/sparc/Kconfig
@@ -82,6 +82,7 @@ config SPARC64
82 select HAVE_ARCH_AUDITSYSCALL 82 select HAVE_ARCH_AUDITSYSCALL
83 select ARCH_SUPPORTS_ATOMIC_RMW 83 select ARCH_SUPPORTS_ATOMIC_RMW
84 select HAVE_NMI 84 select HAVE_NMI
85 select HAVE_REGS_AND_STACK_ACCESS_API
85 86
86config ARCH_DEFCONFIG 87config ARCH_DEFCONFIG
87 string 88 string
diff --git a/arch/sparc/include/asm/ptrace.h b/arch/sparc/include/asm/ptrace.h
index ca57f08bd3db..d73428e4333c 100644
--- a/arch/sparc/include/asm/ptrace.h
+++ b/arch/sparc/include/asm/ptrace.h
@@ -83,7 +83,8 @@ unsigned long profile_pc(struct pt_regs *);
83 83
84#define MAX_REG_OFFSET (offsetof(struct pt_regs, magic)) 84#define MAX_REG_OFFSET (offsetof(struct pt_regs, magic))
85 85
86extern int regs_query_register_offset(const char *name); 86int regs_query_register_offset(const char *name);
87unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n);
87 88
88/** 89/**
89 * regs_get_register() - get register value from its offset 90 * regs_get_register() - get register value from its offset
diff --git a/arch/sparc/include/uapi/asm/unistd.h b/arch/sparc/include/uapi/asm/unistd.h
index 36eee8132c22..ae77df75bffa 100644
--- a/arch/sparc/include/uapi/asm/unistd.h
+++ b/arch/sparc/include/uapi/asm/unistd.h
@@ -425,8 +425,9 @@
425#define __NR_copy_file_range 357 425#define __NR_copy_file_range 357
426#define __NR_preadv2 358 426#define __NR_preadv2 358
427#define __NR_pwritev2 359 427#define __NR_pwritev2 359
428#define __NR_statx 360
428 429
429#define NR_syscalls 360 430#define NR_syscalls 361
430 431
431/* Bitmask values returned from kern_features system call. */ 432/* Bitmask values returned from kern_features system call. */
432#define KERN_FEATURE_MIXED_MODE_STACK 0x00000001 433#define KERN_FEATURE_MIXED_MODE_STACK 0x00000001
@@ -442,4 +443,9 @@
442#define __IGNORE_getresgid 443#define __IGNORE_getresgid
443#endif 444#endif
444 445
446/* Sparc doesn't have protection keys. */
447#define __IGNORE_pkey_mprotect
448#define __IGNORE_pkey_alloc
449#define __IGNORE_pkey_free
450
445#endif /* _UAPI_SPARC_UNISTD_H */ 451#endif /* _UAPI_SPARC_UNISTD_H */
diff --git a/arch/sparc/kernel/ptrace_64.c b/arch/sparc/kernel/ptrace_64.c
index fc5124ccdb53..e1d965e90e16 100644
--- a/arch/sparc/kernel/ptrace_64.c
+++ b/arch/sparc/kernel/ptrace_64.c
@@ -1162,3 +1162,39 @@ int regs_query_register_offset(const char *name)
1162 return roff->offset; 1162 return roff->offset;
1163 return -EINVAL; 1163 return -EINVAL;
1164} 1164}
1165
1166/**
1167 * regs_within_kernel_stack() - check the address in the stack
1168 * @regs: pt_regs which contains kernel stack pointer.
1169 * @addr: address which is checked.
1170 *
1171 * regs_within_kernel_stack() checks @addr is within the kernel stack page(s).
1172 * If @addr is within the kernel stack, it returns true. If not, returns false.
1173 */
1174static inline int regs_within_kernel_stack(struct pt_regs *regs,
1175 unsigned long addr)
1176{
1177 unsigned long ksp = kernel_stack_pointer(regs) + STACK_BIAS;
1178 return ((addr & ~(THREAD_SIZE - 1)) ==
1179 (ksp & ~(THREAD_SIZE - 1)));
1180}
1181
1182/**
1183 * regs_get_kernel_stack_nth() - get Nth entry of the stack
1184 * @regs: pt_regs which contains kernel stack pointer.
1185 * @n: stack entry number.
1186 *
1187 * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which
1188 * is specified by @regs. If the @n th entry is NOT in the kernel stack,
1189 * this returns 0.
1190 */
1191unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n)
1192{
1193 unsigned long ksp = kernel_stack_pointer(regs) + STACK_BIAS;
1194 unsigned long *addr = (unsigned long *)ksp;
1195 addr += n;
1196 if (regs_within_kernel_stack(regs, (unsigned long)addr))
1197 return *addr;
1198 else
1199 return 0;
1200}
diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S
index eac7f0db5c8c..5253e895b81b 100644
--- a/arch/sparc/kernel/systbls_32.S
+++ b/arch/sparc/kernel/systbls_32.S
@@ -89,3 +89,4 @@ sys_call_table:
89/*345*/ .long sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf 89/*345*/ .long sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
90/*350*/ .long sys_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen 90/*350*/ .long sys_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
91/*355*/ .long sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2 91/*355*/ .long sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2
92/*360*/ .long sys_statx
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S
index b0f17ff2ddba..82339f6be0b2 100644
--- a/arch/sparc/kernel/systbls_64.S
+++ b/arch/sparc/kernel/systbls_64.S
@@ -90,6 +90,7 @@ sys_call_table32:
90 .word sys32_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf 90 .word sys32_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
91/*350*/ .word sys32_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen 91/*350*/ .word sys32_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
92 .word compat_sys_setsockopt, sys_mlock2, sys_copy_file_range, compat_sys_preadv2, compat_sys_pwritev2 92 .word compat_sys_setsockopt, sys_mlock2, sys_copy_file_range, compat_sys_preadv2, compat_sys_pwritev2
93/*360*/ .word sys_statx
93 94
94#endif /* CONFIG_COMPAT */ 95#endif /* CONFIG_COMPAT */
95 96
@@ -171,3 +172,4 @@ sys_call_table:
171 .word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf 172 .word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
172/*350*/ .word sys64_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen 173/*350*/ .word sys64_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
173 .word sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2 174 .word sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2
175/*360*/ .word sys_statx