Commit beeac538 authored by Michael Ellerman's avatar Michael Ellerman
Browse files

selftests/powerpc: Add a test of sigreturning to an unaligned address



Add a test of sigreturning to an unaligned address (low two bits set).
This should have no effect because the hardware will mask those bits.
However it previously falsely triggered a warning when
CONFIG_PPC_RFI_SRR_DEBUG=y.

Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20211221135101.2085547-3-mpe@ellerman.id.au
parent fd1eaaaa
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -5,3 +5,4 @@ sigfuz
sigreturn_vdso
sig_sc_double_restart
sigreturn_kernel
sigreturn_unaligned
+1 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0
TEST_GEN_PROGS := signal signal_tm sigfuz sigreturn_vdso sig_sc_double_restart
TEST_GEN_PROGS += sigreturn_kernel
TEST_GEN_PROGS += sigreturn_unaligned

CFLAGS += -maltivec
$(OUTPUT)/signal_tm: CFLAGS += -mhtm
+43 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * Test sigreturn to an unaligned address, ie. low 2 bits set.
 * Nothing bad should happen.
 * This was able to trigger warnings with CONFIG_PPC_RFI_SRR_DEBUG=y.
 */

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ucontext.h>
#include <unistd.h>

#include "utils.h"


static void sigusr1_handler(int signo, siginfo_t *info, void *ptr)
{
	ucontext_t *uc = ptr;

	UCONTEXT_NIA(uc) |= 3;
}

static int test_sigreturn_unaligned(void)
{
	struct sigaction action;

	memset(&action, 0, sizeof(action));
	action.sa_sigaction = sigusr1_handler;
	action.sa_flags = SA_SIGINFO;

	FAIL_IF(sigaction(SIGUSR1, &action, NULL) == -1);

	raise(SIGUSR1);

	return 0;
}

int main(void)
{
	return test_harness(test_sigreturn_unaligned, "sigreturn_unaligned");
}