Commit 27e462c8 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'xtensa-20230523' of https://github.com/jcmvbkbc/linux-xtensa

Pull Xtensa fixes from Max Filippov:

 - fix signal delivery to FDPIC process

 - add __bswap{si,di}2 helpers

* tag 'xtensa-20230523' of https://github.com/jcmvbkbc/linux-xtensa:
  xtensa: add __bswap{si,di}2 helpers
  xtensa: fix signal delivery to FDPIC process
parents 5fe326b4 034f4a78
...@@ -343,7 +343,19 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set, ...@@ -343,7 +343,19 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
struct rt_sigframe *frame; struct rt_sigframe *frame;
int err = 0, sig = ksig->sig; int err = 0, sig = ksig->sig;
unsigned long sp, ra, tp, ps; unsigned long sp, ra, tp, ps;
unsigned long handler = (unsigned long)ksig->ka.sa.sa_handler;
unsigned long handler_fdpic_GOT = 0;
unsigned int base; unsigned int base;
bool fdpic = IS_ENABLED(CONFIG_BINFMT_ELF_FDPIC) &&
(current->personality & FDPIC_FUNCPTRS);
if (fdpic) {
unsigned long __user *fdpic_func_desc =
(unsigned long __user *)handler;
if (__get_user(handler, &fdpic_func_desc[0]) ||
__get_user(handler_fdpic_GOT, &fdpic_func_desc[1]))
return -EFAULT;
}
sp = regs->areg[1]; sp = regs->areg[1];
...@@ -373,20 +385,26 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set, ...@@ -373,20 +385,26 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
if (ksig->ka.sa.sa_flags & SA_RESTORER) { if (ksig->ka.sa.sa_flags & SA_RESTORER) {
ra = (unsigned long)ksig->ka.sa.sa_restorer; if (fdpic) {
unsigned long __user *fdpic_func_desc =
(unsigned long __user *)ksig->ka.sa.sa_restorer;
err |= __get_user(ra, fdpic_func_desc);
} else {
ra = (unsigned long)ksig->ka.sa.sa_restorer;
}
} else { } else {
/* Create sys_rt_sigreturn syscall in stack frame */ /* Create sys_rt_sigreturn syscall in stack frame */
err |= gen_return_code(frame->retcode); err |= gen_return_code(frame->retcode);
if (err) {
return -EFAULT;
}
ra = (unsigned long) frame->retcode; ra = (unsigned long) frame->retcode;
} }
/* if (err)
return -EFAULT;
/*
* Create signal handler execution context. * Create signal handler execution context.
* Return context not modified until this point. * Return context not modified until this point.
*/ */
...@@ -394,8 +412,7 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set, ...@@ -394,8 +412,7 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
/* Set up registers for signal handler; preserve the threadptr */ /* Set up registers for signal handler; preserve the threadptr */
tp = regs->threadptr; tp = regs->threadptr;
ps = regs->ps; ps = regs->ps;
start_thread(regs, (unsigned long) ksig->ka.sa.sa_handler, start_thread(regs, handler, (unsigned long)frame);
(unsigned long) frame);
/* Set up a stack frame for a call4 if userspace uses windowed ABI */ /* Set up a stack frame for a call4 if userspace uses windowed ABI */
if (ps & PS_WOE_MASK) { if (ps & PS_WOE_MASK) {
...@@ -413,6 +430,8 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set, ...@@ -413,6 +430,8 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
regs->areg[base + 4] = (unsigned long) &frame->uc; regs->areg[base + 4] = (unsigned long) &frame->uc;
regs->threadptr = tp; regs->threadptr = tp;
regs->ps = ps; regs->ps = ps;
if (fdpic)
regs->areg[base + 11] = handler_fdpic_GOT;
pr_debug("SIG rt deliver (%s:%d): signal=%d sp=%p pc=%08lx\n", pr_debug("SIG rt deliver (%s:%d): signal=%d sp=%p pc=%08lx\n",
current->comm, current->pid, sig, frame, regs->pc); current->comm, current->pid, sig, frame, regs->pc);
......
...@@ -56,6 +56,8 @@ EXPORT_SYMBOL(empty_zero_page); ...@@ -56,6 +56,8 @@ EXPORT_SYMBOL(empty_zero_page);
*/ */
extern long long __ashrdi3(long long, int); extern long long __ashrdi3(long long, int);
extern long long __ashldi3(long long, int); extern long long __ashldi3(long long, int);
extern long long __bswapdi2(long long);
extern int __bswapsi2(int);
extern long long __lshrdi3(long long, int); extern long long __lshrdi3(long long, int);
extern int __divsi3(int, int); extern int __divsi3(int, int);
extern int __modsi3(int, int); extern int __modsi3(int, int);
...@@ -66,6 +68,8 @@ extern unsigned long long __umulsidi3(unsigned int, unsigned int); ...@@ -66,6 +68,8 @@ extern unsigned long long __umulsidi3(unsigned int, unsigned int);
EXPORT_SYMBOL(__ashldi3); EXPORT_SYMBOL(__ashldi3);
EXPORT_SYMBOL(__ashrdi3); EXPORT_SYMBOL(__ashrdi3);
EXPORT_SYMBOL(__bswapdi2);
EXPORT_SYMBOL(__bswapsi2);
EXPORT_SYMBOL(__lshrdi3); EXPORT_SYMBOL(__lshrdi3);
EXPORT_SYMBOL(__divsi3); EXPORT_SYMBOL(__divsi3);
EXPORT_SYMBOL(__modsi3); EXPORT_SYMBOL(__modsi3);
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# #
lib-y += memcopy.o memset.o checksum.o \ lib-y += memcopy.o memset.o checksum.o \
ashldi3.o ashrdi3.o lshrdi3.o \ ashldi3.o ashrdi3.o bswapdi2.o bswapsi2.o lshrdi3.o \
divsi3.o udivsi3.o modsi3.o umodsi3.o mulsi3.o umulsidi3.o \ divsi3.o udivsi3.o modsi3.o umodsi3.o mulsi3.o umulsidi3.o \
usercopy.o strncpy_user.o strnlen_user.o usercopy.o strncpy_user.o strnlen_user.o
lib-$(CONFIG_PCI) += pci-auto.o lib-$(CONFIG_PCI) += pci-auto.o
......
/* SPDX-License-Identifier: GPL-2.0-or-later WITH GCC-exception-2.0 */
#include <linux/linkage.h>
#include <asm/asmmacro.h>
#include <asm/core.h>
ENTRY(__bswapdi2)
abi_entry_default
ssai 8
srli a4, a2, 16
src a4, a4, a2
src a4, a4, a4
src a4, a2, a4
srli a2, a3, 16
src a2, a2, a3
src a2, a2, a2
src a2, a3, a2
mov a3, a4
abi_ret_default
ENDPROC(__bswapdi2)
/* SPDX-License-Identifier: GPL-2.0-or-later WITH GCC-exception-2.0 */
#include <linux/linkage.h>
#include <asm/asmmacro.h>
#include <asm/core.h>
ENTRY(__bswapsi2)
abi_entry_default
ssai 8
srli a3, a2, 16
src a3, a3, a2
src a3, a3, a3
src a2, a2, a3
abi_ret_default
ENDPROC(__bswapsi2)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment