Commit 9ce12630 authored by Andrey Konovalov's avatar Andrey Konovalov Committed by Will Deacon
Browse files

selftests, arm64: add a selftest for passing tagged pointers to kernel



This patch is a part of a series that extends kernel ABI to allow to pass
tagged user pointers (with the top byte set to something else other than
0x00) as syscall arguments.

This patch adds a simple test, that calls the uname syscall with a
tagged user pointer as an argument. Without the kernel accepting tagged
user pointers the test fails with EFAULT.

Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Acked-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarAndrey Konovalov <andreyknvl@google.com>
Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 63f0c603
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
tags_test
+11 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0

# ARCH can be overridden by the user for cross compiling
ARCH ?= $(shell uname -m 2>/dev/null || echo not)

ifneq (,$(filter $(ARCH),aarch64 arm64))
TEST_GEN_PROGS := tags_test
TEST_PROGS := run_tags_test.sh
endif

include ../lib.mk
+12 −0
Original line number Diff line number Diff line
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0

echo "--------------------"
echo "running tags test"
echo "--------------------"
./tags_test
if [ $? -ne 0 ]; then
	echo "[FAIL]"
else
	echo "[PASS]"
fi
+29 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/prctl.h>
#include <sys/utsname.h>

#define SHIFT_TAG(tag)		((uint64_t)(tag) << 56)
#define SET_TAG(ptr, tag)	(((uint64_t)(ptr) & ~SHIFT_TAG(0xff)) | \
					SHIFT_TAG(tag))

int main(void)
{
	static int tbi_enabled = 0;
	struct utsname *ptr, *tagged_ptr;
	int err;

	if (prctl(PR_SET_TAGGED_ADDR_CTRL, PR_TAGGED_ADDR_ENABLE, 0, 0, 0) == 0)
		tbi_enabled = 1;
	ptr = (struct utsname *)malloc(sizeof(*ptr));
	if (tbi_enabled)
		tagged_ptr = (struct utsname *)SET_TAG(ptr, 0x42);
	err = uname(tagged_ptr);
	free(ptr);

	return err;
}