Commit 0f4ef8a3 authored by Ganesh Goudar's avatar Ganesh Goudar Committed by Michael Ellerman
Browse files

selftests/powerpc: Add test for real address error handling



Add test for real address or control memory address access
error handling, using NX-GZIP engine.

The error is injected by accessing the control memory address
using illegal instruction, on successful handling the process
attempting to access control memory address using illegal
instruction receives SIGBUS.

Signed-off-by: default avatarGanesh Goudar <ganeshgr@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220107141428.67862-2-ganeshgr@linux.ibm.com
parent 0f54bdde
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -31,7 +31,8 @@ SUB_DIRS = alignment \
	   vphn         \
	   math		\
	   ptrace	\
	   security
	   security	\
	   mce

endif

+7 −0
Original line number Diff line number Diff line
#SPDX-License-Identifier: GPL-2.0-or-later

TEST_GEN_PROGS := inject-ra-err

include ../../lib.mk

$(TEST_GEN_PROGS): ../harness.c
+65 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-or-later

#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#include "vas-api.h"
#include "utils.h"

static bool faulted;

static void sigbus_handler(int n, siginfo_t *info, void *ctxt_v)
{
	ucontext_t *ctxt = (ucontext_t *)ctxt_v;
	struct pt_regs *regs = ctxt->uc_mcontext.regs;

	faulted = true;
	regs->nip += 4;
}

static int test_ra_error(void)
{
	struct vas_tx_win_open_attr attr;
	int fd, *paste_addr;
	char *devname = "/dev/crypto/nx-gzip";
	struct sigaction act = {
		.sa_sigaction = sigbus_handler,
		.sa_flags = SA_SIGINFO,
	};

	memset(&attr, 0, sizeof(attr));
	attr.version = 1;
	attr.vas_id = 0;

	SKIP_IF(access(devname, F_OK));

	fd = open(devname, O_RDWR);
	FAIL_IF(fd < 0);
	FAIL_IF(ioctl(fd, VAS_TX_WIN_OPEN, &attr) < 0);
	FAIL_IF(sigaction(SIGBUS, &act, NULL) != 0);

	paste_addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0ULL);

	/* The following assignment triggers exception */
	mb();
	*paste_addr = 1;
	mb();

	FAIL_IF(!faulted);

	return 0;
}

int main(void)
{
	return test_harness(test_ra_error, "inject-ra-err");
}
+1 −0
Original line number Diff line number Diff line
../../../../../arch/powerpc/include/uapi/asm/vas-api.h
 No newline at end of file