diff options
-rw-r--r-- | arch/sparc/Kconfig | 1 | ||||
-rw-r--r-- | arch/sparc/include/asm/ptrace.h | 3 | ||||
-rw-r--r-- | arch/sparc/include/uapi/asm/unistd.h | 8 | ||||
-rw-r--r-- | arch/sparc/kernel/ptrace_64.c | 36 | ||||
-rw-r--r-- | arch/sparc/kernel/systbls_32.S | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/systbls_64.S | 2 |
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 | ||
86 | config ARCH_DEFCONFIG | 87 | config 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 | ||
86 | extern int regs_query_register_offset(const char *name); | 86 | int regs_query_register_offset(const char *name); |
87 | unsigned 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 | */ | ||
1174 | static 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 | */ | ||
1191 | unsigned 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 | ||