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

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
Loading
Loading
Loading
Loading
+27 −8
Original line number Diff line number Diff line
@@ -343,7 +343,19 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
	struct rt_sigframe *frame;
	int err = 0, sig = ksig->sig;
	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;
	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];

@@ -373,19 +385,25 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
	err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));

	if (ksig->ka.sa.sa_flags & 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 {

		/* Create sys_rt_sigreturn syscall in stack frame */

		err |= gen_return_code(frame->retcode);

		if (err) {
			return -EFAULT;
		}
		ra = (unsigned long) frame->retcode;
	}

	if (err)
		return -EFAULT;

	/*
	 * Create signal handler execution context.
	 * Return context not modified until this point.
@@ -394,8 +412,7 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
	/* Set up registers for signal handler; preserve the threadptr */
	tp = regs->threadptr;
	ps = regs->ps;
	start_thread(regs, (unsigned long) ksig->ka.sa.sa_handler,
		     (unsigned long) frame);
	start_thread(regs, handler, (unsigned long)frame);

	/* Set up a stack frame for a call4 if userspace uses windowed ABI */
	if (ps & PS_WOE_MASK) {
@@ -413,6 +430,8 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
	regs->areg[base + 4] = (unsigned long) &frame->uc;
	regs->threadptr = tp;
	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",
		 current->comm, current->pid, sig, frame, regs->pc);
+4 −0
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ EXPORT_SYMBOL(empty_zero_page);
 */
extern long long __ashrdi3(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 int __divsi3(int, int);
extern int __modsi3(int, int);
@@ -66,6 +68,8 @@ extern unsigned long long __umulsidi3(unsigned int, unsigned int);

EXPORT_SYMBOL(__ashldi3);
EXPORT_SYMBOL(__ashrdi3);
EXPORT_SYMBOL(__bswapdi2);
EXPORT_SYMBOL(__bswapsi2);
EXPORT_SYMBOL(__lshrdi3);
EXPORT_SYMBOL(__divsi3);
EXPORT_SYMBOL(__modsi3);
+1 −1
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@
#

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 \
	   usercopy.o strncpy_user.o strnlen_user.o
lib-$(CONFIG_PCI) += pci-auto.o
+21 −0
Original line number Diff line number Diff line
/* 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)
+16 −0
Original line number Diff line number Diff line
/* 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)