Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f383d8b4 authored by Eric W. Biederman's avatar Eric W. Biederman
Browse files

signal/powerpc: Use force_sig_fault where appropriate

parent 77c70728
Loading
Loading
Loading
Loading
+1 −8
Original line number Diff line number Diff line
@@ -620,8 +620,6 @@ void do_send_trap(struct pt_regs *regs, unsigned long address,
void do_break (struct pt_regs *regs, unsigned long address,
		    unsigned long error_code)
{
	siginfo_t info;

	current->thread.trap_nr = TRAP_HWBKPT;
	if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
			11, SIGSEGV) == NOTIFY_STOP)
@@ -634,12 +632,7 @@ void do_break (struct pt_regs *regs, unsigned long address,
	hw_breakpoint_disable();

	/* Deliver the signal to userspace */
	clear_siginfo(&info);
	info.si_signo = SIGTRAP;
	info.si_errno = 0;
	info.si_code = TRAP_HWBKPT;
	info.si_addr = (void __user *)address;
	force_sig_info(SIGTRAP, &info, current);
	force_sig_fault(SIGTRAP, TRAP_HWBKPT, (void __user *)address, current);
}
#endif	/* CONFIG_PPC_ADV_DEBUG_REGS */

+1 −8
Original line number Diff line number Diff line
@@ -165,17 +165,10 @@ static noinline int bad_access(struct pt_regs *regs, unsigned long address)
static int do_sigbus(struct pt_regs *regs, unsigned long address,
		     vm_fault_t fault)
{
	siginfo_t info;

	if (!user_mode(regs))
		return SIGBUS;

	current->thread.trap_nr = BUS_ADRERR;
	clear_siginfo(&info);
	info.si_signo = SIGBUS;
	info.si_errno = 0;
	info.si_code = BUS_ADRERR;
	info.si_addr = (void __user *)address;
#ifdef CONFIG_MEMORY_FAILURE
	if (fault & (VM_FAULT_HWPOISON|VM_FAULT_HWPOISON_LARGE)) {
		unsigned int lsb = 0; /* shutup gcc */
@@ -194,7 +187,7 @@ static int do_sigbus(struct pt_regs *regs, unsigned long address,
	}

#endif
	force_sig_info(SIGBUS, &info, current);
	force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address, current);
	return 0;
}

+2 −2
Original line number Diff line number Diff line
@@ -50,11 +50,11 @@ struct cbe_spu_info cbe_spu_info[MAX_NUMNODES];
EXPORT_SYMBOL_GPL(cbe_spu_info);

/*
 * The spufs fault-handling code needs to call force_sig_info to raise signals
 * The spufs fault-handling code needs to call force_sig_fault to raise signals
 * on DMA errors. Export it here to avoid general kernel-wide access to this
 * function
 */
EXPORT_SYMBOL_GPL(force_sig_info);
EXPORT_SYMBOL_GPL(force_sig_fault);

/*
 * Protects cbe_spu_info and spu->number.
+8 −18
Original line number Diff line number Diff line
@@ -36,42 +36,32 @@
static void spufs_handle_event(struct spu_context *ctx,
				unsigned long ea, int type)
{
	siginfo_t info;

	if (ctx->flags & SPU_CREATE_EVENTS_ENABLED) {
		ctx->event_return |= type;
		wake_up_all(&ctx->stop_wq);
		return;
	}

	clear_siginfo(&info);

	switch (type) {
	case SPE_EVENT_INVALID_DMA:
		info.si_signo = SIGBUS;
		info.si_code = BUS_OBJERR;
		force_sig_fault(SIGBUS, BUS_OBJERR, NULL, current);
		break;
	case SPE_EVENT_SPE_DATA_STORAGE:
		info.si_signo = SIGSEGV;
		info.si_addr = (void __user *)ea;
		info.si_code = SEGV_ACCERR;
		ctx->ops->restart_dma(ctx);
		force_sig_fault(SIGSEGV, SEGV_ACCERR, (void __user *)ea,
				current);
		break;
	case SPE_EVENT_DMA_ALIGNMENT:
		info.si_signo = SIGBUS;
		/* DAR isn't set for an alignment fault :( */
		info.si_code = BUS_ADRALN;
		force_sig_fault(SIGBUS, BUS_ADRALN, NULL, current);
		break;
	case SPE_EVENT_SPE_ERROR:
		info.si_signo = SIGILL;
		info.si_addr = (void __user *)(unsigned long)
			ctx->ops->npc_read(ctx) - 4;
		info.si_code = ILL_ILLOPC;
		force_sig_fault(
			SIGILL, ILL_ILLOPC,
			(void __user *)(unsigned long)
			ctx->ops->npc_read(ctx) - 4, current);
		break;
	}

	if (info.si_signo)
		force_sig_info(info.si_signo, &info, current);
}

int spufs_handle_class0(struct spu_context *ctx)