diff options
Diffstat (limited to 'tools/testing')
250 files changed, 1756 insertions, 188 deletions
| diff --git a/tools/testing/fault-injection/failcmd.sh b/tools/testing/fault-injection/failcmd.sh index 78a9ed7fecdb..29a6c63c5a15 100644 --- a/tools/testing/fault-injection/failcmd.sh +++ b/tools/testing/fault-injection/failcmd.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  #  # NAME  #	failcmd.sh - run a command with injecting slab/page allocation failures diff --git a/tools/testing/ktest/compare-ktest-sample.pl b/tools/testing/ktest/compare-ktest-sample.pl index a373a5bfff68..4118eb4a842d 100755 --- a/tools/testing/ktest/compare-ktest-sample.pl +++ b/tools/testing/ktest/compare-ktest-sample.pl @@ -1,4 +1,5 @@  #!/usr/bin/perl +# SPDX-License-Identifier: GPL-2.0  open (IN,"ktest.pl");  while (<IN>) { diff --git a/tools/testing/nvdimm/Kbuild b/tools/testing/nvdimm/Kbuild index d870520da68b..65368d9027f5 100644 --- a/tools/testing/nvdimm/Kbuild +++ b/tools/testing/nvdimm/Kbuild @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  ldflags-y += --wrap=ioremap_wc  ldflags-y += --wrap=memremap  ldflags-y += --wrap=devm_ioremap_nocache diff --git a/tools/testing/nvdimm/Makefile b/tools/testing/nvdimm/Makefile index 3dfe024b4e7e..c37a6a0bde28 100644 --- a/tools/testing/nvdimm/Makefile +++ b/tools/testing/nvdimm/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  KDIR ?= ../../../  default: diff --git a/tools/testing/nvdimm/config_check.c b/tools/testing/nvdimm/config_check.c index 7dc5a0af9b54..cac891028cd1 100644 --- a/tools/testing/nvdimm/config_check.c +++ b/tools/testing/nvdimm/config_check.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/bug.h>  void check(void) diff --git a/tools/testing/nvdimm/test/Kbuild b/tools/testing/nvdimm/test/Kbuild index d32f25bba42a..fb3c3d7cdb9b 100644 --- a/tools/testing/nvdimm/test/Kbuild +++ b/tools/testing/nvdimm/test/Kbuild @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  ccflags-y := -I$(src)/../../../../drivers/nvdimm/  ccflags-y += -I$(src)/../../../../drivers/acpi/nfit/ diff --git a/tools/testing/nvdimm/test/nfit.c b/tools/testing/nvdimm/test/nfit.c index d20791c3f499..bef419d4266d 100644 --- a/tools/testing/nvdimm/test/nfit.c +++ b/tools/testing/nvdimm/test/nfit.c @@ -1527,9 +1527,6 @@ static void nfit_test1_setup(struct nfit_test *t)  	set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en);  	set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en);  	set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_cmd_force_en); -	set_bit(ND_CMD_GET_CONFIG_SIZE, &acpi_desc->dimm_cmd_force_en); -	set_bit(ND_CMD_GET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en); -	set_bit(ND_CMD_SET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);  }  static int nfit_test_blk_do_io(struct nd_blk_region *ndbr, resource_size_t dpa, diff --git a/tools/testing/radix-tree/Makefile b/tools/testing/radix-tree/Makefile index 6a9480c03cbd..fa7ee369b3c9 100644 --- a/tools/testing/radix-tree/Makefile +++ b/tools/testing/radix-tree/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  CFLAGS += -I. -I../../include -g -O2 -Wall -D_LGPL_SOURCE -fsanitize=address  LDFLAGS += -fsanitize=address diff --git a/tools/testing/radix-tree/linux.c b/tools/testing/radix-tree/linux.c index cf48c8473f48..6903ccf35595 100644 --- a/tools/testing/radix-tree/linux.c +++ b/tools/testing/radix-tree/linux.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <stdlib.h>  #include <string.h>  #include <malloc.h> diff --git a/tools/testing/radix-tree/linux/gfp.h b/tools/testing/radix-tree/linux/gfp.h index 39a0dcb9475a..e9fff59dfd8a 100644 --- a/tools/testing/radix-tree/linux/gfp.h +++ b/tools/testing/radix-tree/linux/gfp.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _GFP_H  #define _GFP_H diff --git a/tools/testing/radix-tree/linux/kernel.h b/tools/testing/radix-tree/linux/kernel.h index b21a77fddcf7..c3bc3f364f68 100644 --- a/tools/testing/radix-tree/linux/kernel.h +++ b/tools/testing/radix-tree/linux/kernel.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _KERNEL_H  #define _KERNEL_H diff --git a/tools/testing/radix-tree/linux/percpu.h b/tools/testing/radix-tree/linux/percpu.h index 3ea01a1a88c2..b2403aa743b2 100644 --- a/tools/testing/radix-tree/linux/percpu.h +++ b/tools/testing/radix-tree/linux/percpu.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #define DECLARE_PER_CPU(type, val) extern type val  #define DEFINE_PER_CPU(type, val) type val diff --git a/tools/testing/radix-tree/linux/preempt.h b/tools/testing/radix-tree/linux/preempt.h index 35c5ac81529f..edb10302b903 100644 --- a/tools/testing/radix-tree/linux/preempt.h +++ b/tools/testing/radix-tree/linux/preempt.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __LINUX_PREEMPT_H  #define __LINUX_PREEMPT_H diff --git a/tools/testing/radix-tree/linux/radix-tree.h b/tools/testing/radix-tree/linux/radix-tree.h index bf1bb231f9b5..24f13d27a8da 100644 --- a/tools/testing/radix-tree/linux/radix-tree.h +++ b/tools/testing/radix-tree/linux/radix-tree.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _TEST_RADIX_TREE_H  #define _TEST_RADIX_TREE_H diff --git a/tools/testing/radix-tree/linux/rcupdate.h b/tools/testing/radix-tree/linux/rcupdate.h index f7129ea2a899..73ed33658203 100644 --- a/tools/testing/radix-tree/linux/rcupdate.h +++ b/tools/testing/radix-tree/linux/rcupdate.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _RCUPDATE_H  #define _RCUPDATE_H diff --git a/tools/testing/radix-tree/linux/slab.h b/tools/testing/radix-tree/linux/slab.h index e40337f41a38..979baeec7e70 100644 --- a/tools/testing/radix-tree/linux/slab.h +++ b/tools/testing/radix-tree/linux/slab.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef SLAB_H  #define SLAB_H diff --git a/tools/testing/radix-tree/main.c b/tools/testing/radix-tree/main.c index bc9a78449572..257f3f8aacaa 100644 --- a/tools/testing/radix-tree/main.c +++ b/tools/testing/radix-tree/main.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <stdio.h>  #include <stdlib.h>  #include <unistd.h> diff --git a/tools/testing/radix-tree/regression.h b/tools/testing/radix-tree/regression.h index e018c4816688..3c8a1584e9ee 100644 --- a/tools/testing/radix-tree/regression.h +++ b/tools/testing/radix-tree/regression.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __REGRESSION_H__  #define __REGRESSION_H__ diff --git a/tools/testing/radix-tree/regression1.c b/tools/testing/radix-tree/regression1.c index bf97742fc18c..0aece092f40e 100644 --- a/tools/testing/radix-tree/regression1.c +++ b/tools/testing/radix-tree/regression1.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Regression1   * Description: diff --git a/tools/testing/radix-tree/regression2.c b/tools/testing/radix-tree/regression2.c index 42dd2a33ed24..424b91c77831 100644 --- a/tools/testing/radix-tree/regression2.c +++ b/tools/testing/radix-tree/regression2.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Regression2   * Description: diff --git a/tools/testing/radix-tree/regression3.c b/tools/testing/radix-tree/regression3.c index 670c3d2ae7b1..ace2543c3eda 100644 --- a/tools/testing/radix-tree/regression3.c +++ b/tools/testing/radix-tree/regression3.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Regression3   * Description: diff --git a/tools/testing/radix-tree/tag_check.c b/tools/testing/radix-tree/tag_check.c index 36dcf7d6945d..543181e4847b 100644 --- a/tools/testing/radix-tree/tag_check.c +++ b/tools/testing/radix-tree/tag_check.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <stdlib.h>  #include <assert.h>  #include <stdio.h> diff --git a/tools/testing/radix-tree/test.c b/tools/testing/radix-tree/test.c index 1a257d738a1e..5978ab1f403d 100644 --- a/tools/testing/radix-tree/test.c +++ b/tools/testing/radix-tree/test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <stdlib.h>  #include <assert.h>  #include <stdio.h> diff --git a/tools/testing/radix-tree/test.h b/tools/testing/radix-tree/test.h index 0f8220cc6166..d9c031dbeb1a 100644 --- a/tools/testing/radix-tree/test.h +++ b/tools/testing/radix-tree/test.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #include <linux/gfp.h>  #include <linux/types.h>  #include <linux/radix-tree.h> diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index 26ce4f7168be..3c9c0bbe7dbb 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TARGETS =  bpf  TARGETS += breakpoints  TARGETS += capabilities @@ -52,6 +53,10 @@ override LDFLAGS =  override MAKEFLAGS =  endif +ifneq ($(KBUILD_SRC),) +override LDFLAGS = +endif +  BUILD := $(O)  ifndef BUILD    BUILD := $(KBUILD_OUTPUT) @@ -62,32 +67,32 @@ endif  export BUILD  all: -	for TARGET in $(TARGETS); do		\ +	@for TARGET in $(TARGETS); do		\  		BUILD_TARGET=$$BUILD/$$TARGET;	\  		mkdir $$BUILD_TARGET  -p;	\  		make OUTPUT=$$BUILD_TARGET -C $$TARGET;\  	done;  run_tests: all -	for TARGET in $(TARGETS); do \ +	@for TARGET in $(TARGETS); do \  		BUILD_TARGET=$$BUILD/$$TARGET;	\  		make OUTPUT=$$BUILD_TARGET -C $$TARGET run_tests;\  	done;  hotplug: -	for TARGET in $(TARGETS_HOTPLUG); do \ +	@for TARGET in $(TARGETS_HOTPLUG); do \  		BUILD_TARGET=$$BUILD/$$TARGET;	\  		make OUTPUT=$$BUILD_TARGET -C $$TARGET;\  	done;  run_hotplug: hotplug -	for TARGET in $(TARGETS_HOTPLUG); do \ +	@for TARGET in $(TARGETS_HOTPLUG); do \  		BUILD_TARGET=$$BUILD/$$TARGET;	\  		make OUTPUT=$$BUILD_TARGET -C $$TARGET run_full_test;\  	done;  clean_hotplug: -	for TARGET in $(TARGETS_HOTPLUG); do \ +	@for TARGET in $(TARGETS_HOTPLUG); do \  		BUILD_TARGET=$$BUILD/$$TARGET;	\  		make OUTPUT=$$BUILD_TARGET -C $$TARGET clean;\  	done; @@ -103,7 +108,7 @@ install:  ifdef INSTALL_PATH  	@# Ask all targets to install their files  	mkdir -p $(INSTALL_PATH) -	for TARGET in $(TARGETS); do \ +	@for TARGET in $(TARGETS); do \  		BUILD_TARGET=$$BUILD/$$TARGET;	\  		make OUTPUT=$$BUILD_TARGET -C $$TARGET INSTALL_PATH=$(INSTALL_PATH)/$$TARGET install; \  	done; @@ -128,7 +133,7 @@ else  endif  clean: -	for TARGET in $(TARGETS); do \ +	@for TARGET in $(TARGETS); do \  		BUILD_TARGET=$$BUILD/$$TARGET;	\  		make OUTPUT=$$BUILD_TARGET -C $$TARGET clean;\  	done; diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index f4b23d697448..eab7644a07b4 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  LIBDIR := ../../../lib  BPFDIR := $(LIBDIR)/bpf  APIDIR := ../../../include/uapi diff --git a/tools/testing/selftests/bpf/bpf_endian.h b/tools/testing/selftests/bpf/bpf_endian.h index 74af266aa512..b25595ea4a78 100644 --- a/tools/testing/selftests/bpf/bpf_endian.h +++ b/tools/testing/selftests/bpf/bpf_endian.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __BPF_ENDIAN__  #define __BPF_ENDIAN__ diff --git a/tools/testing/selftests/bpf/bpf_helpers.h b/tools/testing/selftests/bpf/bpf_helpers.h index 36fb9161b34a..50353c10573c 100644 --- a/tools/testing/selftests/bpf/bpf_helpers.h +++ b/tools/testing/selftests/bpf/bpf_helpers.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __BPF_HELPERS_H  #define __BPF_HELPERS_H @@ -65,7 +66,7 @@ static int (*bpf_xdp_adjust_head)(void *ctx, int offset) =  static int (*bpf_setsockopt)(void *ctx, int level, int optname, void *optval,  			     int optlen) =  	(void *) BPF_FUNC_setsockopt; -static int (*bpf_sk_redirect_map)(void *map, int key, int flags) = +static int (*bpf_sk_redirect_map)(void *ctx, void *map, int key, int flags) =  	(void *) BPF_FUNC_sk_redirect_map;  static int (*bpf_sock_map_update)(void *map, void *key, void *value,  				  unsigned long long flags) = diff --git a/tools/testing/selftests/bpf/bpf_util.h b/tools/testing/selftests/bpf/bpf_util.h index 20ecbaa0d85d..d0811b3d6a6f 100644 --- a/tools/testing/selftests/bpf/bpf_util.h +++ b/tools/testing/selftests/bpf/bpf_util.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __BPF_UTIL__  #define __BPF_UTIL__ @@ -12,6 +13,7 @@ static inline unsigned int bpf_num_possible_cpus(void)  	unsigned int start, end, possible_cpus = 0;  	char buff[128];  	FILE *fp; +	int n;  	fp = fopen(fcpu, "r");  	if (!fp) { @@ -20,17 +22,17 @@ static inline unsigned int bpf_num_possible_cpus(void)  	}  	while (fgets(buff, sizeof(buff), fp)) { -		if (sscanf(buff, "%u-%u", &start, &end) == 2) { -			possible_cpus = start == 0 ? end + 1 : 0; -			break; +		n = sscanf(buff, "%u-%u", &start, &end); +		if (n == 0) { +			printf("Failed to retrieve # possible CPUs!\n"); +			exit(1); +		} else if (n == 1) { +			end = start;  		} +		possible_cpus = start == 0 ? end + 1 : 0; +		break;  	} -  	fclose(fp); -	if (!possible_cpus) { -		printf("Failed to retrieve # possible CPUs!\n"); -		exit(1); -	}  	return possible_cpus;  } diff --git a/tools/testing/selftests/bpf/include/uapi/linux/types.h b/tools/testing/selftests/bpf/include/uapi/linux/types.h index 51841848fbfe..91fa51a9c31d 100644 --- a/tools/testing/selftests/bpf/include/uapi/linux/types.h +++ b/tools/testing/selftests/bpf/include/uapi/linux/types.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _UAPI_LINUX_TYPES_H  #define _UAPI_LINUX_TYPES_H diff --git a/tools/testing/selftests/bpf/sockmap_verdict_prog.c b/tools/testing/selftests/bpf/sockmap_verdict_prog.c index 9b99bd10807d..2cd2d552938b 100644 --- a/tools/testing/selftests/bpf/sockmap_verdict_prog.c +++ b/tools/testing/selftests/bpf/sockmap_verdict_prog.c @@ -61,8 +61,8 @@ int bpf_prog2(struct __sk_buff *skb)  	bpf_printk("verdict: data[0] = redir(%u:%u)\n", map, sk);  	if (!map) -		return bpf_sk_redirect_map(&sock_map_rx, sk, 0); -	return bpf_sk_redirect_map(&sock_map_tx, sk, 0); +		return bpf_sk_redirect_map(skb, &sock_map_rx, sk, 0); +	return bpf_sk_redirect_map(skb, &sock_map_tx, sk, 0);  }  char _license[] SEC("license") = "GPL"; diff --git a/tools/testing/selftests/bpf/test_kmod.sh b/tools/testing/selftests/bpf/test_kmod.sh index 6d58cca8e235..ed4774d8d6ed 100755 --- a/tools/testing/selftests/bpf/test_kmod.sh +++ b/tools/testing/selftests/bpf/test_kmod.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  SRC_TREE=../../../../ diff --git a/tools/testing/selftests/bpf/test_lpm_map.c b/tools/testing/selftests/bpf/test_lpm_map.c index e97565243d59..f93a333cbf2c 100644 --- a/tools/testing/selftests/bpf/test_lpm_map.c +++ b/tools/testing/selftests/bpf/test_lpm_map.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Randomized tests for eBPF longest-prefix-match maps   * diff --git a/tools/testing/selftests/bpf/test_maps.c b/tools/testing/selftests/bpf/test_maps.c index fe3a443a1102..50ce52d2013d 100644 --- a/tools/testing/selftests/bpf/test_maps.c +++ b/tools/testing/selftests/bpf/test_maps.c @@ -466,7 +466,7 @@ static void test_sockmap(int tasks, void *data)  	int one = 1, map_fd_rx, map_fd_tx, map_fd_break, s, sc, rc;  	struct bpf_map *bpf_map_rx, *bpf_map_tx, *bpf_map_break;  	int ports[] = {50200, 50201, 50202, 50204}; -	int err, i, fd, sfd[6] = {0xdeadbeef}; +	int err, i, fd, udp, sfd[6] = {0xdeadbeef};  	u8 buf[20] = {0x0, 0x5, 0x3, 0x2, 0x1, 0x0};  	int parse_prog, verdict_prog;  	struct sockaddr_in addr; @@ -548,6 +548,16 @@ static void test_sockmap(int tasks, void *data)  		goto out_sockmap;  	} +	/* Test update with unsupported UDP socket */ +	udp = socket(AF_INET, SOCK_DGRAM, 0); +	i = 0; +	err = bpf_map_update_elem(fd, &i, &udp, BPF_ANY); +	if (!err) { +		printf("Failed socket SOCK_DGRAM allowed '%i:%i'\n", +		       i, udp); +		goto out_sockmap; +	} +  	/* Test update without programs */  	for (i = 0; i < 6; i++) {  		err = bpf_map_update_elem(fd, &i, &sfd[i], BPF_ANY); diff --git a/tools/testing/selftests/bpf/test_tag.c b/tools/testing/selftests/bpf/test_tag.c index de409fc50c35..8b201895c569 100644 --- a/tools/testing/selftests/bpf/test_tag.c +++ b/tools/testing/selftests/bpf/test_tag.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <stdint.h>  #include <stdio.h>  #include <stdlib.h> diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c index 26f3250bdcd2..64ae21f64489 100644 --- a/tools/testing/selftests/bpf/test_verifier.c +++ b/tools/testing/selftests/bpf/test_verifier.c @@ -1130,15 +1130,27 @@ static struct bpf_test tests[] = {  		.errstr = "invalid bpf_context access",  	},  	{ -		"check skb->mark is writeable by SK_SKB", +		"invalid access of skb->mark for SK_SKB", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, +				    offsetof(struct __sk_buff, mark)), +			BPF_EXIT_INSN(), +		}, +		.result =  REJECT, +		.prog_type = BPF_PROG_TYPE_SK_SKB, +		.errstr = "invalid bpf_context access", +	}, +	{ +		"check skb->mark is not writeable by SK_SKB",  		.insns = {  			BPF_MOV64_IMM(BPF_REG_0, 0),  			BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,  				    offsetof(struct __sk_buff, mark)),  			BPF_EXIT_INSN(),  		}, -		.result = ACCEPT, +		.result =  REJECT,  		.prog_type = BPF_PROG_TYPE_SK_SKB, +		.errstr = "invalid bpf_context access",  	},  	{  		"check skb->tc_index is writeable by SK_SKB", @@ -6645,6 +6657,500 @@ static struct bpf_test tests[] = {  		.errstr = "BPF_END uses reserved fields",  		.result = REJECT,  	}, +	{ +		"arithmetic ops make PTR_TO_CTX unusable", +		.insns = { +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, +				      offsetof(struct __sk_buff, data) - +				      offsetof(struct __sk_buff, mark)), +			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, +				    offsetof(struct __sk_buff, mark)), +			BPF_EXIT_INSN(), +		}, +		.errstr = "dereference of modified ctx ptr R1 off=68+8, ctx+const is allowed, ctx+const+const is not", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_SCHED_CLS, +	}, +	{ +		"XDP pkt read, pkt_end mangling, bad access 1", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 8), +			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_end mangling, bad access 2", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_ALU64_IMM(BPF_SUB, BPF_REG_3, 8), +			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_data' > pkt_end, good access", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.result = ACCEPT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_data' > pkt_end, bad access 1", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, +	}, +	{ +		"XDP pkt read, pkt_data' > pkt_end, bad access 2", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_end > pkt_data', good access", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), +			BPF_JMP_IMM(BPF_JA, 0, 0, 1), +			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.result = ACCEPT, +		.prog_type = BPF_PROG_TYPE_XDP, +		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, +	}, +	{ +		"XDP pkt read, pkt_end > pkt_data', bad access 1", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), +			BPF_JMP_IMM(BPF_JA, 0, 0, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_end > pkt_data', bad access 2", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_data' < pkt_end, good access", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), +			BPF_JMP_IMM(BPF_JA, 0, 0, 1), +			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.result = ACCEPT, +		.prog_type = BPF_PROG_TYPE_XDP, +		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, +	}, +	{ +		"XDP pkt read, pkt_data' < pkt_end, bad access 1", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), +			BPF_JMP_IMM(BPF_JA, 0, 0, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_data' < pkt_end, bad access 2", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_end < pkt_data', good access", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.result = ACCEPT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_end < pkt_data', bad access 1", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, +	}, +	{ +		"XDP pkt read, pkt_end < pkt_data', bad access 2", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_data' >= pkt_end, good access", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), +			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.result = ACCEPT, +		.prog_type = BPF_PROG_TYPE_XDP, +		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, +	}, +	{ +		"XDP pkt read, pkt_data' >= pkt_end, bad access 1", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_data' >= pkt_end, bad access 2", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0), +			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, +	}, +	{ +		"XDP pkt read, pkt_end >= pkt_data', good access", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), +			BPF_JMP_IMM(BPF_JA, 0, 0, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.result = ACCEPT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_end >= pkt_data', bad access 1", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), +			BPF_JMP_IMM(BPF_JA, 0, 0, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, +	}, +	{ +		"XDP pkt read, pkt_end >= pkt_data', bad access 2", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_data' <= pkt_end, good access", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), +			BPF_JMP_IMM(BPF_JA, 0, 0, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.result = ACCEPT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_data' <= pkt_end, bad access 1", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), +			BPF_JMP_IMM(BPF_JA, 0, 0, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, +	}, +	{ +		"XDP pkt read, pkt_data' <= pkt_end, bad access 2", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_end <= pkt_data', good access", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), +			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.result = ACCEPT, +		.prog_type = BPF_PROG_TYPE_XDP, +		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, +	}, +	{ +		"XDP pkt read, pkt_end <= pkt_data', bad access 1", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), +			BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +	}, +	{ +		"XDP pkt read, pkt_end <= pkt_data', bad access 2", +		.insns = { +			BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, +				    offsetof(struct xdp_md, data)), +			BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, +				    offsetof(struct xdp_md, data_end)), +			BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), +			BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), +			BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0), +			BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), +			BPF_MOV64_IMM(BPF_REG_0, 0), +			BPF_EXIT_INSN(), +		}, +		.errstr = "R1 offset is outside of the packet", +		.result = REJECT, +		.prog_type = BPF_PROG_TYPE_XDP, +		.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, +	},  };  static int probe_filter_length(const struct bpf_insn *fp) diff --git a/tools/testing/selftests/breakpoints/Makefile b/tools/testing/selftests/breakpoints/Makefile index 6b214b7b10fb..9ec2c78de8ca 100644 --- a/tools/testing/selftests/breakpoints/Makefile +++ b/tools/testing/selftests/breakpoints/Makefile @@ -1,15 +1,16 @@ +# SPDX-License-Identifier: GPL-2.0  # Taken from perf makefile  uname_M := $(shell uname -m 2>/dev/null || echo not)  ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/) +TEST_GEN_PROGS := step_after_suspend_test +  ifeq ($(ARCH),x86) -TEST_GEN_PROGS := breakpoint_test +TEST_GEN_PROGS += breakpoint_test  endif  ifneq (,$(filter $(ARCH),aarch64 arm64)) -TEST_GEN_PROGS := breakpoint_test_arm64 +TEST_GEN_PROGS += breakpoint_test_arm64  endif -TEST_GEN_PROGS += step_after_suspend_test -  include ../lib.mk diff --git a/tools/testing/selftests/capabilities/Makefile b/tools/testing/selftests/capabilities/Makefile index 29b8adfdac71..6e9d98d457d5 100644 --- a/tools/testing/selftests/capabilities/Makefile +++ b/tools/testing/selftests/capabilities/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_GEN_FILES := validate_cap  TEST_GEN_PROGS := test_execve diff --git a/tools/testing/selftests/capabilities/test_execve.c b/tools/testing/selftests/capabilities/test_execve.c index cf6778441381..3ab39a61b95b 100644 --- a/tools/testing/selftests/capabilities/test_execve.c +++ b/tools/testing/selftests/capabilities/test_execve.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE  #include <cap-ng.h> diff --git a/tools/testing/selftests/capabilities/validate_cap.c b/tools/testing/selftests/capabilities/validate_cap.c index 694cd73d4493..cdfc94268fe6 100644 --- a/tools/testing/selftests/capabilities/validate_cap.c +++ b/tools/testing/selftests/capabilities/validate_cap.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <cap-ng.h>  #include <linux/capability.h>  #include <stdbool.h> diff --git a/tools/testing/selftests/cpu-hotplug/Makefile b/tools/testing/selftests/cpu-hotplug/Makefile index fe1f99101c5d..d8be047ee5b6 100644 --- a/tools/testing/selftests/cpu-hotplug/Makefile +++ b/tools/testing/selftests/cpu-hotplug/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  all:  TEST_PROGS := cpu-on-off-test.sh diff --git a/tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh b/tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh index b18b253d7bfb..f3a8933c1275 100755 --- a/tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh +++ b/tools/testing/selftests/cpu-hotplug/cpu-on-off-test.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  SYSFS= diff --git a/tools/testing/selftests/cpufreq/Makefile b/tools/testing/selftests/cpufreq/Makefile index 3955cd96f3a2..c86ca8342222 100644 --- a/tools/testing/selftests/cpufreq/Makefile +++ b/tools/testing/selftests/cpufreq/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  all:  TEST_PROGS := main.sh diff --git a/tools/testing/selftests/cpufreq/cpu.sh b/tools/testing/selftests/cpufreq/cpu.sh index 8e08a83d65f2..39fdcdfb8e97 100755 --- a/tools/testing/selftests/cpufreq/cpu.sh +++ b/tools/testing/selftests/cpufreq/cpu.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  #  # CPU helpers diff --git a/tools/testing/selftests/cpufreq/cpufreq.sh b/tools/testing/selftests/cpufreq/cpufreq.sh index 1ed3832030b4..b583a2fb4504 100755 --- a/tools/testing/selftests/cpufreq/cpufreq.sh +++ b/tools/testing/selftests/cpufreq/cpufreq.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  # protect against multiple inclusion  if [ $FILE_CPUFREQ ]; then diff --git a/tools/testing/selftests/cpufreq/governor.sh b/tools/testing/selftests/cpufreq/governor.sh index def645103555..fe37df79c087 100755 --- a/tools/testing/selftests/cpufreq/governor.sh +++ b/tools/testing/selftests/cpufreq/governor.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  #  # Test governors diff --git a/tools/testing/selftests/cpufreq/main.sh b/tools/testing/selftests/cpufreq/main.sh index 01bac76ac0ec..d83922de9d89 100755 --- a/tools/testing/selftests/cpufreq/main.sh +++ b/tools/testing/selftests/cpufreq/main.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  source cpu.sh  source cpufreq.sh diff --git a/tools/testing/selftests/cpufreq/module.sh b/tools/testing/selftests/cpufreq/module.sh index 8ff2244a33a1..22563cd122e7 100755 --- a/tools/testing/selftests/cpufreq/module.sh +++ b/tools/testing/selftests/cpufreq/module.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  #  # Modules specific tests cases diff --git a/tools/testing/selftests/cpufreq/special-tests.sh b/tools/testing/selftests/cpufreq/special-tests.sh index 58b730f23ef7..8d40505dc468 100755 --- a/tools/testing/selftests/cpufreq/special-tests.sh +++ b/tools/testing/selftests/cpufreq/special-tests.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  #  # Special test cases reported by people diff --git a/tools/testing/selftests/drivers/gpu/drm_mm.sh b/tools/testing/selftests/drivers/gpu/drm_mm.sh index 96dd55c92799..b789dc8257e6 100755 --- a/tools/testing/selftests/drivers/gpu/drm_mm.sh +++ b/tools/testing/selftests/drivers/gpu/drm_mm.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # Runs API tests for struct drm_mm (DRM range manager)  if ! /sbin/modprobe -n -q test-drm_mm; then diff --git a/tools/testing/selftests/drivers/gpu/i915.sh b/tools/testing/selftests/drivers/gpu/i915.sh index c06d6e8a8dcc..d3895bc714b7 100755 --- a/tools/testing/selftests/drivers/gpu/i915.sh +++ b/tools/testing/selftests/drivers/gpu/i915.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # Runs hardware independent tests for i915 (drivers/gpu/drm/i915)  if ! /sbin/modprobe -q -r i915; then diff --git a/tools/testing/selftests/efivarfs/create-read.c b/tools/testing/selftests/efivarfs/create-read.c index 7feef1880968..9674a19396a3 100644 --- a/tools/testing/selftests/efivarfs/create-read.c +++ b/tools/testing/selftests/efivarfs/create-read.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <stdio.h>  #include <stdint.h>  #include <stdlib.h> diff --git a/tools/testing/selftests/efivarfs/efivarfs.sh b/tools/testing/selftests/efivarfs/efivarfs.sh index 057278448515..c6d5790575ae 100755 --- a/tools/testing/selftests/efivarfs/efivarfs.sh +++ b/tools/testing/selftests/efivarfs/efivarfs.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  efivarfs_mount=/sys/firmware/efi/efivars  test_guid=210be57c-9849-4fc7-a635-e6382d1aec27 diff --git a/tools/testing/selftests/efivarfs/open-unlink.c b/tools/testing/selftests/efivarfs/open-unlink.c index 4af74f733036..562742d44ac9 100644 --- a/tools/testing/selftests/efivarfs/open-unlink.c +++ b/tools/testing/selftests/efivarfs/open-unlink.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <errno.h>  #include <stdio.h>  #include <stdint.h> diff --git a/tools/testing/selftests/exec/Makefile b/tools/testing/selftests/exec/Makefile index 2e13035dff7f..427c41ba5151 100644 --- a/tools/testing/selftests/exec/Makefile +++ b/tools/testing/selftests/exec/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  CFLAGS = -Wall  TEST_GEN_PROGS := execveat diff --git a/tools/testing/selftests/filesystems/Makefile b/tools/testing/selftests/filesystems/Makefile index 0ab11307b414..13a73bf725b5 100644 --- a/tools/testing/selftests/filesystems/Makefile +++ b/tools/testing/selftests/filesystems/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_PROGS := dnotify_test  all: $(TEST_PROGS) diff --git a/tools/testing/selftests/filesystems/dnotify_test.c b/tools/testing/selftests/filesystems/dnotify_test.c index 8b37b4a1e18d..c0a9b2d3302d 100644 --- a/tools/testing/selftests/filesystems/dnotify_test.c +++ b/tools/testing/selftests/filesystems/dnotify_test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE	/* needed to get the defines */  #include <fcntl.h>	/* in glibc 2.2 this has the needed  				   values defined */ diff --git a/tools/testing/selftests/firmware/fw_fallback.sh b/tools/testing/selftests/firmware/fw_fallback.sh index 8f511035f783..a52a3bab532b 100755 --- a/tools/testing/selftests/firmware/fw_fallback.sh +++ b/tools/testing/selftests/firmware/fw_fallback.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # This validates that the kernel will fall back to using the fallback mechanism  # to load firmware it can't find on disk itself. We must request a firmware  # that the kernel won't find, and any installed helper (e.g. udev) also diff --git a/tools/testing/selftests/firmware/fw_filesystem.sh b/tools/testing/selftests/firmware/fw_filesystem.sh index 7d8fd2e3695a..62f2d6f54929 100755 --- a/tools/testing/selftests/firmware/fw_filesystem.sh +++ b/tools/testing/selftests/firmware/fw_filesystem.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # This validates that the kernel will load firmware out of its list of  # firmware locations on disk. Since the user helper does similar work,  # we reset the custom load directory to a location the user helper doesn't diff --git a/tools/testing/selftests/ftrace/Makefile b/tools/testing/selftests/ftrace/Makefile index a8a5e21850e7..cd1f5b3a7774 100644 --- a/tools/testing/selftests/ftrace/Makefile +++ b/tools/testing/selftests/ftrace/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  all:  TEST_PROGS := ftracetest diff --git a/tools/testing/selftests/ftrace/test.d/00basic/basic2.tc b/tools/testing/selftests/ftrace/test.d/00basic/basic2.tc index ebfce83f35b4..531e472362df 100644 --- a/tools/testing/selftests/ftrace/test.d/00basic/basic2.tc +++ b/tools/testing/selftests/ftrace/test.d/00basic/basic2.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Basic test for tracers  # flags: instance  test -f available_tracers diff --git a/tools/testing/selftests/ftrace/test.d/00basic/basic3.tc b/tools/testing/selftests/ftrace/test.d/00basic/basic3.tc index 9e33f841812f..58a2506f788e 100644 --- a/tools/testing/selftests/ftrace/test.d/00basic/basic3.tc +++ b/tools/testing/selftests/ftrace/test.d/00basic/basic3.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Basic trace clock test  # flags: instance  test -f trace_clock diff --git a/tools/testing/selftests/ftrace/test.d/event/event-enable.tc b/tools/testing/selftests/ftrace/test.d/event/event-enable.tc index 283b45ecb199..6ff851a75884 100644 --- a/tools/testing/selftests/ftrace/test.d/event/event-enable.tc +++ b/tools/testing/selftests/ftrace/test.d/event/event-enable.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event tracing - enable/disable with event level files  # flags: instance diff --git a/tools/testing/selftests/ftrace/test.d/event/event-pid.tc b/tools/testing/selftests/ftrace/test.d/event/event-pid.tc index 96c1a95be4f7..cc14feec6e1f 100644 --- a/tools/testing/selftests/ftrace/test.d/event/event-pid.tc +++ b/tools/testing/selftests/ftrace/test.d/event/event-pid.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event tracing - restricts events based on pid  # flags: instance diff --git a/tools/testing/selftests/ftrace/test.d/event/subsystem-enable.tc b/tools/testing/selftests/ftrace/test.d/event/subsystem-enable.tc index b8fe2e5b9e67..85094904aa79 100644 --- a/tools/testing/selftests/ftrace/test.d/event/subsystem-enable.tc +++ b/tools/testing/selftests/ftrace/test.d/event/subsystem-enable.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event tracing - enable/disable with subsystem level files  # flags: instance diff --git a/tools/testing/selftests/ftrace/test.d/event/toplevel-enable.tc b/tools/testing/selftests/ftrace/test.d/event/toplevel-enable.tc index 15e2d3fe1731..cc1cf4d30ef5 100644 --- a/tools/testing/selftests/ftrace/test.d/event/toplevel-enable.tc +++ b/tools/testing/selftests/ftrace/test.d/event/toplevel-enable.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event tracing - enable/disable with top level files  do_reset() { diff --git a/tools/testing/selftests/ftrace/test.d/ftrace/fgraph-filter-stack.tc b/tools/testing/selftests/ftrace/test.d/ftrace/fgraph-filter-stack.tc index 15c2dba06ea2..45df747887e0 100644 --- a/tools/testing/selftests/ftrace/test.d/ftrace/fgraph-filter-stack.tc +++ b/tools/testing/selftests/ftrace/test.d/ftrace/fgraph-filter-stack.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: ftrace - function graph filters with stack tracer  # Make sure that function graph filtering works, and is not diff --git a/tools/testing/selftests/ftrace/test.d/ftrace/fgraph-filter.tc b/tools/testing/selftests/ftrace/test.d/ftrace/fgraph-filter.tc index 0ab2189613ef..0387e22e7577 100644 --- a/tools/testing/selftests/ftrace/test.d/ftrace/fgraph-filter.tc +++ b/tools/testing/selftests/ftrace/test.d/ftrace/fgraph-filter.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: ftrace - function graph filters  # Make sure that function graph filtering works diff --git a/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-glob.tc b/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-glob.tc index 8095e122daa9..589d52b211b7 100644 --- a/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-glob.tc +++ b/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-glob.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: ftrace - function glob filters  # Make sure that function glob matching filter works. diff --git a/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-pid.tc b/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-pid.tc index bab5ff7c607e..78524fcc25ae 100644 --- a/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-pid.tc +++ b/tools/testing/selftests/ftrace/test.d/ftrace/func-filter-pid.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: ftrace - function pid filters  # Make sure that function pid matching filter works. diff --git a/tools/testing/selftests/ftrace/test.d/ftrace/func_event_triggers.tc b/tools/testing/selftests/ftrace/test.d/ftrace/func_event_triggers.tc index 77dfb6b48186..9d4afcca1e36 100644 --- a/tools/testing/selftests/ftrace/test.d/ftrace/func_event_triggers.tc +++ b/tools/testing/selftests/ftrace/test.d/ftrace/func_event_triggers.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: ftrace - test for function event triggers  # flags: instance  # diff --git a/tools/testing/selftests/ftrace/test.d/ftrace/func_profiler.tc b/tools/testing/selftests/ftrace/test.d/ftrace/func_profiler.tc index 7808336d6f50..fe0dc5a7ea26 100644 --- a/tools/testing/selftests/ftrace/test.d/ftrace/func_profiler.tc +++ b/tools/testing/selftests/ftrace/test.d/ftrace/func_profiler.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: ftrace - function profiler with function tracing  # There was a bug after a rewrite of the ftrace infrastructure that diff --git a/tools/testing/selftests/ftrace/test.d/ftrace/func_set_ftrace_file.tc b/tools/testing/selftests/ftrace/test.d/ftrace/func_set_ftrace_file.tc index 113b4d9bc733..5ad723724adb 100644 --- a/tools/testing/selftests/ftrace/test.d/ftrace/func_set_ftrace_file.tc +++ b/tools/testing/selftests/ftrace/test.d/ftrace/func_set_ftrace_file.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: ftrace - test reading of set_ftrace_filter  #  # The set_ftrace_filter file of ftrace is used to list functions as well as diff --git a/tools/testing/selftests/ftrace/test.d/ftrace/func_traceonoff_triggers.tc b/tools/testing/selftests/ftrace/test.d/ftrace/func_traceonoff_triggers.tc index 7a9ab4ff83b6..cdc92a371cd7 100644 --- a/tools/testing/selftests/ftrace/test.d/ftrace/func_traceonoff_triggers.tc +++ b/tools/testing/selftests/ftrace/test.d/ftrace/func_traceonoff_triggers.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: ftrace - test for function traceon/off triggers  # flags: instance  # diff --git a/tools/testing/selftests/ftrace/test.d/instances/instance-event.tc b/tools/testing/selftests/ftrace/test.d/instances/instance-event.tc index 8a353314dc9b..d7f48b55df51 100644 --- a/tools/testing/selftests/ftrace/test.d/instances/instance-event.tc +++ b/tools/testing/selftests/ftrace/test.d/instances/instance-event.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Test creation and deletion of trace instances while setting an event  if [ ! -d instances ] ; then diff --git a/tools/testing/selftests/ftrace/test.d/instances/instance.tc b/tools/testing/selftests/ftrace/test.d/instances/instance.tc index 1e1abe0ad354..ddda62203366 100644 --- a/tools/testing/selftests/ftrace/test.d/instances/instance.tc +++ b/tools/testing/selftests/ftrace/test.d/instances/instance.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Test creation and deletion of trace instances  if [ ! -d instances ] ; then diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/add_and_remove.tc b/tools/testing/selftests/ftrace/test.d/kprobe/add_and_remove.tc index c3843ed49bf6..4604d2103c89 100644 --- a/tools/testing/selftests/ftrace/test.d/kprobe/add_and_remove.tc +++ b/tools/testing/selftests/ftrace/test.d/kprobe/add_and_remove.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Kprobe dynamic event - adding and removing  [ -f kprobe_events ] || exit_unsupported # this is configurable diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/busy_check.tc b/tools/testing/selftests/ftrace/test.d/kprobe/busy_check.tc index 74507db8bbc8..0e6f415c6152 100644 --- a/tools/testing/selftests/ftrace/test.d/kprobe/busy_check.tc +++ b/tools/testing/selftests/ftrace/test.d/kprobe/busy_check.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Kprobe dynamic event - busy event check  [ -f kprobe_events ] || exit_unsupported diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args.tc b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args.tc index 64949d4eda69..679bbd23bcc3 100644 --- a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args.tc +++ b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Kprobe dynamic event with arguments  [ -f kprobe_events ] || exit_unsupported # this is configurable diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_type.tc b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_type.tc index c75faefb4fff..17d33ba192f6 100644 --- a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_type.tc +++ b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_args_type.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Kprobes event arguments with types  [ -f kprobe_events ] || exit_unsupported # this is configurable diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_eventname.tc b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_eventname.tc index b9302cc82c12..2724a1068cb1 100644 --- a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_eventname.tc +++ b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_eventname.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Kprobe event auto/manual naming  [ -f kprobe_events ] || exit_unsupported # this is configurable diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_ftrace.tc b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_ftrace.tc index d6f2f4965697..cc4cac0e60f2 100644 --- a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_ftrace.tc +++ b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_ftrace.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Kprobe dynamic event with function tracer  [ -f kprobe_events ] || exit_unsupported # this is configurable diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_module.tc b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_module.tc index 6d634e4b7680..1e9f75f7a30f 100644 --- a/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_module.tc +++ b/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_module.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Kprobe dynamic event - probing module  [ -f kprobe_events ] || exit_unsupported # this is configurable diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_args.tc b/tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_args.tc index 0d09546258fd..f1825bdbe3f3 100644 --- a/tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_args.tc +++ b/tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_args.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Kretprobe dynamic event with arguments  [ -f kprobe_events ] || exit_unsupported # this is configurable diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_maxactive.tc b/tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_maxactive.tc index 7ec6f2639ad6..7c0290684c43 100644 --- a/tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_maxactive.tc +++ b/tools/testing/selftests/ftrace/test.d/kprobe/kretprobe_maxactive.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Kretprobe dynamic event with maxactive  [ -f kprobe_events ] || exit_unsupported # this is configurable diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc b/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc index 2a1cb9908746..bb16cf91f1b5 100644 --- a/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc +++ b/tools/testing/selftests/ftrace/test.d/kprobe/multiple_kprobes.tc @@ -1,6 +1,9 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: Register/unregister many kprobe events +[ -f kprobe_events ] || exit_unsupported # this is configurable +  # ftrace fentry skip size depends on the machine architecture.  # Currently HAVE_KPROBES_ON_FTRACE defined on x86 and powerpc64le  case `uname -m` in diff --git a/tools/testing/selftests/ftrace/test.d/trigger/trigger-eventonoff.tc b/tools/testing/selftests/ftrace/test.d/trigger/trigger-eventonoff.tc index c5435adfdd93..839ac4320b24 100644 --- a/tools/testing/selftests/ftrace/test.d/trigger/trigger-eventonoff.tc +++ b/tools/testing/selftests/ftrace/test.d/trigger/trigger-eventonoff.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event trigger - test event enable/disable trigger  # flags: instance diff --git a/tools/testing/selftests/ftrace/test.d/trigger/trigger-filter.tc b/tools/testing/selftests/ftrace/test.d/trigger/trigger-filter.tc index 48849a8d577f..66873c4b12c9 100644 --- a/tools/testing/selftests/ftrace/test.d/trigger/trigger-filter.tc +++ b/tools/testing/selftests/ftrace/test.d/trigger/trigger-filter.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event trigger - test trigger filter  # flags: instance diff --git a/tools/testing/selftests/ftrace/test.d/trigger/trigger-hist-mod.tc b/tools/testing/selftests/ftrace/test.d/trigger/trigger-hist-mod.tc index b7f86d10b549..4237b32769f1 100644 --- a/tools/testing/selftests/ftrace/test.d/trigger/trigger-hist-mod.tc +++ b/tools/testing/selftests/ftrace/test.d/trigger/trigger-hist-mod.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event trigger - test histogram modifiers  # flags: instance diff --git a/tools/testing/selftests/ftrace/test.d/trigger/trigger-hist.tc b/tools/testing/selftests/ftrace/test.d/trigger/trigger-hist.tc index fb66f7d9339d..d24e2b8bd863 100644 --- a/tools/testing/selftests/ftrace/test.d/trigger/trigger-hist.tc +++ b/tools/testing/selftests/ftrace/test.d/trigger/trigger-hist.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event trigger - test histogram trigger  # flags: instance diff --git a/tools/testing/selftests/ftrace/test.d/trigger/trigger-multihist.tc b/tools/testing/selftests/ftrace/test.d/trigger/trigger-multihist.tc index f9153087dd7c..4c0774fff378 100644 --- a/tools/testing/selftests/ftrace/test.d/trigger/trigger-multihist.tc +++ b/tools/testing/selftests/ftrace/test.d/trigger/trigger-multihist.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event trigger - test multiple histogram triggers  # flags: instance diff --git a/tools/testing/selftests/ftrace/test.d/trigger/trigger-snapshot.tc b/tools/testing/selftests/ftrace/test.d/trigger/trigger-snapshot.tc index ed94f0c4e0e4..3fc6321e081f 100644 --- a/tools/testing/selftests/ftrace/test.d/trigger/trigger-snapshot.tc +++ b/tools/testing/selftests/ftrace/test.d/trigger/trigger-snapshot.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event trigger - test snapshot-trigger  do_reset() { diff --git a/tools/testing/selftests/ftrace/test.d/trigger/trigger-stacktrace.tc b/tools/testing/selftests/ftrace/test.d/trigger/trigger-stacktrace.tc index 9fa23b085def..3652824f81ed 100644 --- a/tools/testing/selftests/ftrace/test.d/trigger/trigger-stacktrace.tc +++ b/tools/testing/selftests/ftrace/test.d/trigger/trigger-stacktrace.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event trigger - test stacktrace-trigger  do_reset() { diff --git a/tools/testing/selftests/ftrace/test.d/trigger/trigger-traceonoff.tc b/tools/testing/selftests/ftrace/test.d/trigger/trigger-traceonoff.tc index 87648e5f987c..6d9051cdf408 100644 --- a/tools/testing/selftests/ftrace/test.d/trigger/trigger-traceonoff.tc +++ b/tools/testing/selftests/ftrace/test.d/trigger/trigger-traceonoff.tc @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # description: event trigger - test traceon/off trigger  do_reset() { diff --git a/tools/testing/selftests/futex/Makefile b/tools/testing/selftests/futex/Makefile index 7c647f619d63..cea4adcd42b8 100644 --- a/tools/testing/selftests/futex/Makefile +++ b/tools/testing/selftests/futex/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  SUBDIRS := functional  TEST_PROGS := run.sh @@ -7,14 +8,17 @@ TEST_PROGS := run.sh  include ../lib.mk  all: -	for DIR in $(SUBDIRS); do		\ +	@for DIR in $(SUBDIRS); do		\  		BUILD_TARGET=$(OUTPUT)/$$DIR;	\  		mkdir $$BUILD_TARGET  -p;	\  		make OUTPUT=$$BUILD_TARGET -C $$DIR $@;\ +		if [ -e $$DIR/$(TEST_PROGS) ]; then +			rsync -a $$DIR/$(TEST_PROGS) $$BUILD_TARGET/; +		fi  	done  override define RUN_TESTS -	$(OUTPUT)/run.sh +	@cd $(OUTPUT); ./run.sh  endef  override define INSTALL_RULE @@ -33,7 +37,7 @@ override define EMIT_TESTS  endef  override define CLEAN -	for DIR in $(SUBDIRS); do		\ +	@for DIR in $(SUBDIRS); do		\  		BUILD_TARGET=$(OUTPUT)/$$DIR;	\  		mkdir $$BUILD_TARGET  -p;	\  		make OUTPUT=$$BUILD_TARGET -C $$DIR $@;\ diff --git a/tools/testing/selftests/futex/functional/Makefile b/tools/testing/selftests/futex/functional/Makefile index a648e7a6cbc3..ff8feca49746 100644 --- a/tools/testing/selftests/futex/functional/Makefile +++ b/tools/testing/selftests/futex/functional/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  INCLUDES := -I../include -I../../  CFLAGS := $(CFLAGS) -g -O2 -Wall -D_GNU_SOURCE -pthread $(INCLUDES)  LDFLAGS := $(LDFLAGS) -pthread -lrt diff --git a/tools/testing/selftests/gpio/Makefile b/tools/testing/selftests/gpio/Makefile index 298929df97e6..1bbb47565c55 100644 --- a/tools/testing/selftests/gpio/Makefile +++ b/tools/testing/selftests/gpio/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_PROGS := gpio-mockup.sh  TEST_FILES := gpio-mockup-sysfs.sh $(BINARIES) diff --git a/tools/testing/selftests/gpio/gpio-mockup-sysfs.sh b/tools/testing/selftests/gpio/gpio-mockup-sysfs.sh index 085d7a39899c..dd269d877562 100755 --- a/tools/testing/selftests/gpio/gpio-mockup-sysfs.sh +++ b/tools/testing/selftests/gpio/gpio-mockup-sysfs.sh @@ -1,4 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0  is_consistent()  {  	val= diff --git a/tools/testing/selftests/gpio/gpio-mockup.sh b/tools/testing/selftests/gpio/gpio-mockup.sh index b183439e058e..183fb932edbd 100755 --- a/tools/testing/selftests/gpio/gpio-mockup.sh +++ b/tools/testing/selftests/gpio/gpio-mockup.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  #exit status  #1: run as non-root user diff --git a/tools/testing/selftests/ia64/Makefile b/tools/testing/selftests/ia64/Makefile index 2b3de2d3e945..4bce1a84b3a1 100644 --- a/tools/testing/selftests/ia64/Makefile +++ b/tools/testing/selftests/ia64/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_PROGS := aliasing-test  all: $(TEST_PROGS) diff --git a/tools/testing/selftests/intel_pstate/Makefile b/tools/testing/selftests/intel_pstate/Makefile index 849a90ffe8dd..5a3f7d37e912 100644 --- a/tools/testing/selftests/intel_pstate/Makefile +++ b/tools/testing/selftests/intel_pstate/Makefile @@ -1,7 +1,10 @@ +# SPDX-License-Identifier: GPL-2.0  CFLAGS := $(CFLAGS) -Wall -D_GNU_SOURCE  LDLIBS := $(LDLIBS) -lm +ifeq (,$(filter $(ARCH),x86))  TEST_GEN_FILES := msr aperf +endif  TEST_PROGS := run.sh diff --git a/tools/testing/selftests/intel_pstate/aperf.c b/tools/testing/selftests/intel_pstate/aperf.c index cd72f3dc83e9..d21edea9c560 100644 --- a/tools/testing/selftests/intel_pstate/aperf.c +++ b/tools/testing/selftests/intel_pstate/aperf.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <math.h>  #include <unistd.h>  #include <stdio.h> diff --git a/tools/testing/selftests/intel_pstate/msr.c b/tools/testing/selftests/intel_pstate/msr.c index abbbfc84d359..88fdd2a4b0a0 100644 --- a/tools/testing/selftests/intel_pstate/msr.c +++ b/tools/testing/selftests/intel_pstate/msr.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <math.h>  #include <unistd.h>  #include <stdio.h> diff --git a/tools/testing/selftests/intel_pstate/run.sh b/tools/testing/selftests/intel_pstate/run.sh index 7868c106b8b1..c670359becc6 100755 --- a/tools/testing/selftests/intel_pstate/run.sh +++ b/tools/testing/selftests/intel_pstate/run.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  #  # This test runs on Intel x86 based hardware which support the intel_pstate  # driver.  The test checks the frequency settings from the maximum turbo @@ -29,13 +30,12 @@  EVALUATE_ONLY=0 -max_cpus=$(($(nproc)-1)) +if ! uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ | grep -q x86; then +	echo "$0 # Skipped: Test can only run on x86 architectures." +	exit 0 +fi -# compile programs -gcc aperf.c -Wall -D_GNU_SOURCE -o aperf  -lm -[ $? -ne 0 ] && echo "Problem compiling aperf.c." && exit 1 -gcc -o msr msr.c -lm -[ $? -ne 0 ] && echo "Problem compiling msr.c." && exit 1 +max_cpus=$(($(nproc)-1))  function run_test () { diff --git a/tools/testing/selftests/ipc/Makefile b/tools/testing/selftests/ipc/Makefile index 30ef4c7f53ea..1c4448a843a4 100644 --- a/tools/testing/selftests/ipc/Makefile +++ b/tools/testing/selftests/ipc/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  uname_M := $(shell uname -m 2>/dev/null || echo not)  ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/)  ifeq ($(ARCH),i386) diff --git a/tools/testing/selftests/ipc/msgque.c b/tools/testing/selftests/ipc/msgque.c index 1b2ce334bb3f..ee9382bdfadc 100644 --- a/tools/testing/selftests/ipc/msgque.c +++ b/tools/testing/selftests/ipc/msgque.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <stdlib.h>  #include <stdio.h>  #include <string.h> diff --git a/tools/testing/selftests/kcmp/kcmp_test.c b/tools/testing/selftests/kcmp/kcmp_test.c index 73684c4a1ed6..6ea7b9f37a41 100644 --- a/tools/testing/selftests/kcmp/kcmp_test.c +++ b/tools/testing/selftests/kcmp/kcmp_test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE  #include <stdio.h> diff --git a/tools/testing/selftests/lib.mk b/tools/testing/selftests/lib.mk index 693616651da5..5bef05d6ba39 100644 --- a/tools/testing/selftests/lib.mk +++ b/tools/testing/selftests/lib.mk @@ -6,7 +6,14 @@ ifeq (0,$(MAKELEVEL))  OUTPUT := $(shell pwd)  endif +# The following are built by lib.mk common compile rules. +# TEST_CUSTOM_PROGS should be used by tests that require +# custom build rule and prevent common build rule use. +# TEST_PROGS are for test shell scripts. +# TEST_CUSTOM_PROGS and TEST_PROGS will be run by common run_tests +# and install targets. Common clean doesn't touch them.  TEST_GEN_PROGS := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS)) +TEST_GEN_PROGS_EXTENDED := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS_EXTENDED))  TEST_GEN_FILES := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_FILES))  all: $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) @@ -20,17 +27,32 @@ define RUN_TESTS  		test_num=`echo $$test_num+1 | bc`;	\  		echo "selftests: $$BASENAME_TEST";	\  		echo "========================================";	\ -		if [ ! -x $$BASENAME_TEST ]; then	\ +		if [ ! -x $$TEST ]; then	\  			echo "selftests: Warning: file $$BASENAME_TEST is not executable, correct this.";\  			echo "not ok 1..$$test_num selftests: $$BASENAME_TEST [FAIL]"; \  		else					\ -			cd `dirname $$TEST` > /dev/null; (./$$BASENAME_TEST && echo "ok 1..$$test_num selftests: $$BASENAME_TEST [PASS]") || echo "not ok 1..$$test_num selftests:  $$BASENAME_TEST [FAIL]"; cd - > /dev/null;\ +		if [ "X$(summary)" != "X" ]; then		\ +				cd `dirname $$TEST` > /dev/null; (./$$BASENAME_TEST > /tmp/$$BASENAME_TEST 2>&1 && echo "ok 1..$$test_num selftests: $$BASENAME_TEST [PASS]") || echo "not ok 1..$$test_num selftests:  $$BASENAME_TEST [FAIL]"; cd - > /dev/null;\ +			else				\ +				cd `dirname $$TEST` > /dev/null; (./$$BASENAME_TEST && echo "ok 1..$$test_num selftests: $$BASENAME_TEST [PASS]") || echo "not ok 1..$$test_num selftests:  $$BASENAME_TEST [FAIL]"; cd - > /dev/null;\ +			fi;				\  		fi;					\  	done;  endef  run_tests: all -	$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_PROGS)) +ifneq ($(KBUILD_SRC),) +	@if [ "X$(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES)" != "X" ]; then +		@rsync -aq $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT) +	fi +	@if [ "X$(TEST_PROGS)" != "X" ]; then +		$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(OUTPUT)/$(TEST_PROGS)) +	else +		$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS)) +	fi +else +	$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS)) +endif  define INSTALL_RULE  	@if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then					\ @@ -38,10 +60,10 @@ define INSTALL_RULE  		echo "rsync -a $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(INSTALL_PATH)/";	\  		rsync -a $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(INSTALL_PATH)/;		\  	fi -	@if [ "X$(TEST_GEN_PROGS)$(TEST_GEN_PROGS_EXTENDED)$(TEST_GEN_FILES)" != "X" ]; then					\ +	@if [ "X$(TEST_GEN_PROGS)$(TEST_CUSTOM_PROGS)$(TEST_GEN_PROGS_EXTENDED)$(TEST_GEN_FILES)" != "X" ]; then					\  		mkdir -p ${INSTALL_PATH};										\ -		echo "rsync -a $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/";	\ -		rsync -a $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/;		\ +		echo "rsync -a $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/";	\ +		rsync -a $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/;		\  	fi  endef @@ -53,15 +75,20 @@ else  endif  define EMIT_TESTS -	@for TEST in $(TEST_GEN_PROGS) $(TEST_PROGS); do \ +	@for TEST in $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS); do \  		BASENAME_TEST=`basename $$TEST`;	\ -		echo "(./$$BASENAME_TEST && echo \"selftests: $$BASENAME_TEST [PASS]\") || echo \"selftests: $$BASENAME_TEST [FAIL]\""; \ +		echo "(./$$BASENAME_TEST > /tmp/$$BASENAME_TEST 2>&1 && echo \"selftests: $$BASENAME_TEST [PASS]\") || echo \"selftests: $$BASENAME_TEST [FAIL]\""; \  	done;  endef  emit_tests:  	$(EMIT_TESTS) +# define if isn't already. It is undefined in make O= case. +ifeq ($(RM),) +RM := rm -f +endif +  define CLEAN  	$(RM) -r $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(EXTRA_CLEAN)  endef @@ -69,6 +96,15 @@ endef  clean:  	$(CLEAN) +# When make O= with kselftest target from main level +# the following aren't defined. +# +ifneq ($(KBUILD_SRC),) +LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) +COMPILE.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c +LINK.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) +endif +  $(OUTPUT)/%:%.c  	$(LINK.c) $^ $(LDLIBS) -o $@ diff --git a/tools/testing/selftests/lib/bitmap.sh b/tools/testing/selftests/lib/bitmap.sh index b073c22a3435..4dee4d2a8bbe 100755 --- a/tools/testing/selftests/lib/bitmap.sh +++ b/tools/testing/selftests/lib/bitmap.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # Runs bitmap infrastructure tests using test_bitmap kernel module  if ! /sbin/modprobe -q -n test_bitmap; then  	echo "bitmap: [SKIP]" diff --git a/tools/testing/selftests/lib/prime_numbers.sh b/tools/testing/selftests/lib/prime_numbers.sh index da4cbcd766f5..b363994e5e11 100755 --- a/tools/testing/selftests/lib/prime_numbers.sh +++ b/tools/testing/selftests/lib/prime_numbers.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # Checks fast/slow prime_number generation for inconsistencies  if ! /sbin/modprobe -q -r prime_numbers; then diff --git a/tools/testing/selftests/lib/printf.sh b/tools/testing/selftests/lib/printf.sh index cbf3b124bd94..0c37377fd7d4 100755 --- a/tools/testing/selftests/lib/printf.sh +++ b/tools/testing/selftests/lib/printf.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # Runs printf infrastructure using test_printf kernel module  if ! /sbin/modprobe -q -n test_printf; then  	echo "printf: [SKIP]" diff --git a/tools/testing/selftests/locking/ww_mutex.sh b/tools/testing/selftests/locking/ww_mutex.sh index 6905da965f3b..2c3d6b1878c2 100644 --- a/tools/testing/selftests/locking/ww_mutex.sh +++ b/tools/testing/selftests/locking/ww_mutex.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # Runs API tests for struct ww_mutex (Wait/Wound mutexes)  if /sbin/modprobe -q test-ww_mutex; then diff --git a/tools/testing/selftests/media_tests/Makefile b/tools/testing/selftests/media_tests/Makefile index 6b34a0199468..be5bd4ffb895 100644 --- a/tools/testing/selftests/media_tests/Makefile +++ b/tools/testing/selftests/media_tests/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_PROGS := media_device_test media_device_open video_device_test  all: $(TEST_PROGS) diff --git a/tools/testing/selftests/media_tests/bind_unbind_sample.sh b/tools/testing/selftests/media_tests/bind_unbind_sample.sh index 9f362f10631a..0101c1ec4ff7 100755 --- a/tools/testing/selftests/media_tests/bind_unbind_sample.sh +++ b/tools/testing/selftests/media_tests/bind_unbind_sample.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  # Find device number in /sys/bus/usb/drivers/drivername  # Edit this file to update the driver numer and name  # Example test for uvcvideo driver diff --git a/tools/testing/selftests/media_tests/open_loop_test.sh b/tools/testing/selftests/media_tests/open_loop_test.sh index dcd3c17efc17..d4c0179bbe2c 100755 --- a/tools/testing/selftests/media_tests/open_loop_test.sh +++ b/tools/testing/selftests/media_tests/open_loop_test.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0   i=0  file=/dev/media$1   while :; do diff --git a/tools/testing/selftests/membarrier/membarrier_test.c b/tools/testing/selftests/membarrier/membarrier_test.c index 21399fcf1a59..9e674d9514d1 100644 --- a/tools/testing/selftests/membarrier/membarrier_test.c +++ b/tools/testing/selftests/membarrier/membarrier_test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE  #include <linux/membarrier.h>  #include <syscall.h> diff --git a/tools/testing/selftests/memfd/Makefile b/tools/testing/selftests/memfd/Makefile index bc9d02d615da..3926a0409dda 100644 --- a/tools/testing/selftests/memfd/Makefile +++ b/tools/testing/selftests/memfd/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  CFLAGS += -D_FILE_OFFSET_BITS=64  CFLAGS += -I../../../../include/uapi/  CFLAGS += -I../../../../include/ diff --git a/tools/testing/selftests/memfd/fuse_mnt.c b/tools/testing/selftests/memfd/fuse_mnt.c index feacf1280fcd..6936f2a001f3 100644 --- a/tools/testing/selftests/memfd/fuse_mnt.c +++ b/tools/testing/selftests/memfd/fuse_mnt.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * memfd test file-system   * This file uses FUSE to create a dummy file-system with only one file /memfd. diff --git a/tools/testing/selftests/memfd/fuse_test.c b/tools/testing/selftests/memfd/fuse_test.c index 7f3617274bf5..1ccb7a3eb14b 100644 --- a/tools/testing/selftests/memfd/fuse_test.c +++ b/tools/testing/selftests/memfd/fuse_test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * memfd GUP test-case   * This tests memfd interactions with get_user_pages(). We require the diff --git a/tools/testing/selftests/memfd/memfd_test.c b/tools/testing/selftests/memfd/memfd_test.c index f94c6d1fb46f..845e5f67b6f0 100644 --- a/tools/testing/selftests/memfd/memfd_test.c +++ b/tools/testing/selftests/memfd/memfd_test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE  #define __EXPORTED_HEADERS__ diff --git a/tools/testing/selftests/memfd/run_fuse_test.sh b/tools/testing/selftests/memfd/run_fuse_test.sh index 69b930e1e041..407df68dfe27 100755 --- a/tools/testing/selftests/memfd/run_fuse_test.sh +++ b/tools/testing/selftests/memfd/run_fuse_test.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  if test -d "./mnt" ; then  	fusermount -u ./mnt diff --git a/tools/testing/selftests/memfd/run_tests.sh b/tools/testing/selftests/memfd/run_tests.sh index daabb350697c..daabb350697c 100644..100755 --- a/tools/testing/selftests/memfd/run_tests.sh +++ b/tools/testing/selftests/memfd/run_tests.sh diff --git a/tools/testing/selftests/memory-hotplug/Makefile b/tools/testing/selftests/memory-hotplug/Makefile index afb2624c7048..23db11c94b59 100644 --- a/tools/testing/selftests/memory-hotplug/Makefile +++ b/tools/testing/selftests/memory-hotplug/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  all:  include ../lib.mk diff --git a/tools/testing/selftests/memory-hotplug/mem-on-off-test.sh b/tools/testing/selftests/memory-hotplug/mem-on-off-test.sh index 35025ce9ca66..ae2c790d0880 100755 --- a/tools/testing/selftests/memory-hotplug/mem-on-off-test.sh +++ b/tools/testing/selftests/memory-hotplug/mem-on-off-test.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  SYSFS= diff --git a/tools/testing/selftests/mount/Makefile b/tools/testing/selftests/mount/Makefile index 9093d7ffe87f..e094f71c6dbc 100644 --- a/tools/testing/selftests/mount/Makefile +++ b/tools/testing/selftests/mount/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # Makefile for mount selftests.  CFLAGS = -Wall \           -O2 diff --git a/tools/testing/selftests/mount/unprivileged-remount-test.c b/tools/testing/selftests/mount/unprivileged-remount-test.c index 517785052f1c..584dc6bc3b06 100644 --- a/tools/testing/selftests/mount/unprivileged-remount-test.c +++ b/tools/testing/selftests/mount/unprivileged-remount-test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE  #include <sched.h>  #include <stdio.h> diff --git a/tools/testing/selftests/mqueue/Makefile b/tools/testing/selftests/mqueue/Makefile index 79a664aeb8d7..743d3f9e5918 100644 --- a/tools/testing/selftests/mqueue/Makefile +++ b/tools/testing/selftests/mqueue/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  CFLAGS += -O2  LDLIBS = -lrt -lpthread -lpopt  TEST_GEN_PROGS := mq_open_tests mq_perf_tests @@ -5,8 +6,8 @@ TEST_GEN_PROGS := mq_open_tests mq_perf_tests  include ../lib.mk  override define RUN_TESTS -	@./mq_open_tests /test1 || echo "selftests: mq_open_tests [FAIL]" -	@./mq_perf_tests || echo "selftests: mq_perf_tests [FAIL]" +	@$(OUTPUT)/mq_open_tests /test1 || echo "selftests: mq_open_tests [FAIL]" +	@$(OUTPUT)/mq_perf_tests || echo "selftests: mq_perf_tests [FAIL]"  endef  override define EMIT_TESTS diff --git a/tools/testing/selftests/net/.gitignore b/tools/testing/selftests/net/.gitignore index 9801253e4802..c612d6e38c62 100644 --- a/tools/testing/selftests/net/.gitignore +++ b/tools/testing/selftests/net/.gitignore @@ -6,3 +6,4 @@ reuseport_bpf  reuseport_bpf_cpu  reuseport_bpf_numa  reuseport_dualstack +reuseaddr_conflict diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile index de1f5772b878..500c74db746c 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # Makefile for net selftests  CFLAGS =  -Wall -Wl,--no-as-needed -O2 -g @@ -5,9 +6,9 @@ CFLAGS += -I../../../../usr/include/  TEST_PROGS := run_netsocktests run_afpackettests test_bpf.sh netdevice.sh rtnetlink.sh  TEST_GEN_FILES =  socket -TEST_GEN_FILES += psock_fanout psock_tpacket -TEST_GEN_FILES += reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa -TEST_GEN_FILES += reuseport_dualstack msg_zerocopy +TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy +TEST_GEN_PROGS = reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa +TEST_GEN_PROGS += reuseport_dualstack reuseaddr_conflict  include ../lib.mk diff --git a/tools/testing/selftests/net/msg_zerocopy.c b/tools/testing/selftests/net/msg_zerocopy.c index 40232af5b023..3ab6ec403905 100644 --- a/tools/testing/selftests/net/msg_zerocopy.c +++ b/tools/testing/selftests/net/msg_zerocopy.c @@ -55,7 +55,7 @@  #include <unistd.h>  #ifndef SO_EE_ORIGIN_ZEROCOPY -#define SO_EE_ORIGIN_ZEROCOPY		SO_EE_ORIGIN_UPAGE +#define SO_EE_ORIGIN_ZEROCOPY		5  #endif  #ifndef SO_ZEROCOPY diff --git a/tools/testing/selftests/net/netdevice.sh b/tools/testing/selftests/net/netdevice.sh index 4e00568d70c2..903679e0ff31 100755 --- a/tools/testing/selftests/net/netdevice.sh +++ b/tools/testing/selftests/net/netdevice.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  #  # This test is for checking network interface  # For the moment it tests only ethernet interface (but wifi could be easily added) @@ -178,7 +179,7 @@ if [ "$(id -u)" -ne 0 ];then  	exit 0  fi -ip -Version 2>/dev/null >/dev/null +ip link show 2>/dev/null >/dev/null  if [ $? -ne 0 ];then  	echo "SKIP: Could not run test without the ip tool"  	exit 0 diff --git a/tools/testing/selftests/net/reuseaddr_conflict.c b/tools/testing/selftests/net/reuseaddr_conflict.c new file mode 100644 index 000000000000..7c5b12664b03 --- /dev/null +++ b/tools/testing/selftests/net/reuseaddr_conflict.c @@ -0,0 +1,114 @@ +/* + * Test for the regression introduced by + * + * b9470c27607b ("inet: kill smallest_size and smallest_port") + * + * If we open an ipv4 socket on a port with reuseaddr we shouldn't reset the tb + * when we open the ipv6 conterpart, which is what was happening previously. + */ +#include <errno.h> +#include <error.h> +#include <arpa/inet.h> +#include <netinet/in.h> +#include <stdbool.h> +#include <stdio.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <unistd.h> + +#define PORT 9999 + +int open_port(int ipv6, int any) +{ +	int fd = -1; +	int reuseaddr = 1; +	int v6only = 1; +	int addrlen; +	int ret = -1; +	struct sockaddr *addr; +	int family = ipv6 ? AF_INET6 : AF_INET; + +	struct sockaddr_in6 addr6 = { +		.sin6_family = AF_INET6, +		.sin6_port = htons(PORT), +		.sin6_addr = in6addr_any +	}; +	struct sockaddr_in addr4 = { +		.sin_family = AF_INET, +		.sin_port = htons(PORT), +		.sin_addr.s_addr = any ? htonl(INADDR_ANY) : inet_addr("127.0.0.1"), +	}; + + +	if (ipv6) { +		addr = (struct sockaddr*)&addr6; +		addrlen = sizeof(addr6); +	} else { +		addr = (struct sockaddr*)&addr4; +		addrlen = sizeof(addr4); +	} + +	if ((fd = socket(family, SOCK_STREAM, IPPROTO_TCP)) < 0) { +		perror("socket"); +		goto out; +	} + +	if (ipv6 && setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&v6only, +			       sizeof(v6only)) < 0) { +		perror("setsockopt IPV6_V6ONLY"); +		goto out; +	} + +	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, +		       sizeof(reuseaddr)) < 0) { +		perror("setsockopt SO_REUSEADDR"); +		goto out; +	} + +	if (bind(fd, addr, addrlen) < 0) { +		perror("bind"); +		goto out; +	} + +	if (any) +		return fd; + +	if (listen(fd, 1) < 0) { +		perror("listen"); +		goto out; +	} +	return fd; +out: +	close(fd); +	return ret; +} + +int main(void) +{ +	int listenfd; +	int fd1, fd2; + +	fprintf(stderr, "Opening 127.0.0.1:%d\n", PORT); +	listenfd = open_port(0, 0); +	if (listenfd < 0) +		error(1, errno, "Couldn't open listen socket"); +	fprintf(stderr, "Opening INADDR_ANY:%d\n", PORT); +	fd1 = open_port(0, 1); +	if (fd1 >= 0) +		error(1, 0, "Was allowed to create an ipv4 reuseport on a already bound non-reuseport socket"); +	fprintf(stderr, "Opening in6addr_any:%d\n", PORT); +	fd1 = open_port(1, 1); +	if (fd1 < 0) +		error(1, errno, "Couldn't open ipv6 reuseport"); +	fprintf(stderr, "Opening INADDR_ANY:%d\n", PORT); +	fd2 = open_port(0, 1); +	if (fd2 >= 0) +		error(1, 0, "Was allowed to create an ipv4 reuseport on a already bound non-reuseport socket"); +	close(fd1); +	fprintf(stderr, "Opening INADDR_ANY:%d after closing ipv6 socket\n", PORT); +	fd1 = open_port(0, 1); +	if (fd1 >= 0) +		error(1, 0, "Was allowed to create an ipv4 reuseport on an already bound non-reuseport socket with no ipv6"); +	fprintf(stderr, "Success"); +	return 0; +} diff --git a/tools/testing/selftests/net/reuseport_bpf_cpu.c b/tools/testing/selftests/net/reuseport_bpf_cpu.c index b23d6f54de7b..2d646174729f 100644 --- a/tools/testing/selftests/net/reuseport_bpf_cpu.c +++ b/tools/testing/selftests/net/reuseport_bpf_cpu.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Test functionality of BPF filters with SO_REUSEPORT.  This program creates   * an SO_REUSEPORT receiver group containing one socket per CPU core. It then diff --git a/tools/testing/selftests/net/reuseport_bpf_numa.c b/tools/testing/selftests/net/reuseport_bpf_numa.c index 6f20bc9ff627..365c32e84189 100644 --- a/tools/testing/selftests/net/reuseport_bpf_numa.c +++ b/tools/testing/selftests/net/reuseport_bpf_numa.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Test functionality of BPF filters with SO_REUSEPORT. Same test as   * in reuseport_bpf_cpu, only as one socket per NUMA node. diff --git a/tools/testing/selftests/net/reuseport_dualstack.c b/tools/testing/selftests/net/reuseport_dualstack.c index 90958aaaafb9..fe3230c55986 100644 --- a/tools/testing/selftests/net/reuseport_dualstack.c +++ b/tools/testing/selftests/net/reuseport_dualstack.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * It is possible to use SO_REUSEPORT to open multiple sockets bound to   * equivalent local addresses using AF_INET and AF_INET6 at the same time.  If diff --git a/tools/testing/selftests/net/run_afpackettests b/tools/testing/selftests/net/run_afpackettests index 5246e782d6e8..21fe149e3de1 100755 --- a/tools/testing/selftests/net/run_afpackettests +++ b/tools/testing/selftests/net/run_afpackettests @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  if [ $(id -u) != 0 ]; then  	echo $msg must be run as root >&2 diff --git a/tools/testing/selftests/net/run_netsocktests b/tools/testing/selftests/net/run_netsocktests index 16058bbea7a8..b093f39c298c 100755 --- a/tools/testing/selftests/net/run_netsocktests +++ b/tools/testing/selftests/net/run_netsocktests @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  echo "--------------------"  echo "running socket test" diff --git a/tools/testing/selftests/net/socket.c b/tools/testing/selftests/net/socket.c index 0f227f2f9be9..afca1ead677f 100644 --- a/tools/testing/selftests/net/socket.c +++ b/tools/testing/selftests/net/socket.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <stdio.h>  #include <errno.h>  #include <unistd.h> diff --git a/tools/testing/selftests/net/test_bpf.sh b/tools/testing/selftests/net/test_bpf.sh index 8b29796d46aa..65677909c574 100755 --- a/tools/testing/selftests/net/test_bpf.sh +++ b/tools/testing/selftests/net/test_bpf.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # Runs bpf test using test_bpf kernel module  if /sbin/modprobe -q test_bpf ; then diff --git a/tools/testing/selftests/networking/timestamping/Makefile b/tools/testing/selftests/networking/timestamping/Makefile index 92fb8ee917c5..a728040edbe1 100644 --- a/tools/testing/selftests/networking/timestamping/Makefile +++ b/tools/testing/selftests/networking/timestamping/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  CFLAGS += -I../../../../../usr/include  TEST_PROGS := hwtstamp_config rxtimestamp timestamping txtimestamp diff --git a/tools/testing/selftests/networking/timestamping/hwtstamp_config.c b/tools/testing/selftests/networking/timestamping/hwtstamp_config.c index e8b685a7f15f..e1fdee841021 100644 --- a/tools/testing/selftests/networking/timestamping/hwtstamp_config.c +++ b/tools/testing/selftests/networking/timestamping/hwtstamp_config.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* Test program for SIOC{G,S}HWTSTAMP   * Copyright 2013 Solarflare Communications   * Author: Ben Hutchings diff --git a/tools/testing/selftests/networking/timestamping/rxtimestamp.c b/tools/testing/selftests/networking/timestamping/rxtimestamp.c index 00f286661dcd..dd4162fc0419 100644 --- a/tools/testing/selftests/networking/timestamping/rxtimestamp.c +++ b/tools/testing/selftests/networking/timestamping/rxtimestamp.c @@ -341,7 +341,7 @@ int main(int argc, char **argv)  			return 0;  		case 'n':  			t = atoi(optarg); -			if (t > ARRAY_SIZE(test_cases)) +			if (t >= ARRAY_SIZE(test_cases))  				error(1, 0, "Invalid test case: %d", t);  			all_tests = false;  			test_cases[t].enabled = true; diff --git a/tools/testing/selftests/nsfs/owner.c b/tools/testing/selftests/nsfs/owner.c index 437205f8b714..96a976c74550 100644 --- a/tools/testing/selftests/nsfs/owner.c +++ b/tools/testing/selftests/nsfs/owner.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE  #include <sched.h>  #include <unistd.h> diff --git a/tools/testing/selftests/nsfs/pidns.c b/tools/testing/selftests/nsfs/pidns.c index ae3a0d68e966..1182d4e437a2 100644 --- a/tools/testing/selftests/nsfs/pidns.c +++ b/tools/testing/selftests/nsfs/pidns.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE  #include <sched.h>  #include <unistd.h> diff --git a/tools/testing/selftests/powerpc/Makefile b/tools/testing/selftests/powerpc/Makefile index 72c3ac2323e1..f6b1338730db 100644 --- a/tools/testing/selftests/powerpc/Makefile +++ b/tools/testing/selftests/powerpc/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # Makefile for powerpc selftests  # ARCH can be overridden by the user for cross compiling diff --git a/tools/testing/selftests/powerpc/benchmarks/Makefile b/tools/testing/selftests/powerpc/benchmarks/Makefile index fb96a89bd953..a35058e3766c 100644 --- a/tools/testing/selftests/powerpc/benchmarks/Makefile +++ b/tools/testing/selftests/powerpc/benchmarks/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_GEN_PROGS := gettimeofday context_switch mmap_bench futex_bench null_syscall  CFLAGS += -O2 diff --git a/tools/testing/selftests/powerpc/cache_shape/Makefile b/tools/testing/selftests/powerpc/cache_shape/Makefile index b24485ab30e2..1be547434a49 100644 --- a/tools/testing/selftests/powerpc/cache_shape/Makefile +++ b/tools/testing/selftests/powerpc/cache_shape/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_PROGS := cache_shape  all: $(TEST_PROGS) diff --git a/tools/testing/selftests/powerpc/copyloops/Makefile b/tools/testing/selftests/powerpc/copyloops/Makefile index 681ab19d0a84..ac4a52e19e59 100644 --- a/tools/testing/selftests/powerpc/copyloops/Makefile +++ b/tools/testing/selftests/powerpc/copyloops/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # The loops are all 64-bit code  CFLAGS += -m64  CFLAGS += -I$(CURDIR) diff --git a/tools/testing/selftests/powerpc/copyloops/asm/export.h b/tools/testing/selftests/powerpc/copyloops/asm/export.h index 2d14a9b4248c..0bab35f6777a 100644 --- a/tools/testing/selftests/powerpc/copyloops/asm/export.h +++ b/tools/testing/selftests/powerpc/copyloops/asm/export.h @@ -1 +1,2 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #define EXPORT_SYMBOL(x) diff --git a/tools/testing/selftests/powerpc/copyloops/asm/ppc_asm.h b/tools/testing/selftests/powerpc/copyloops/asm/ppc_asm.h index 80d34a9ffff4..5ffe04d802c9 100644 --- a/tools/testing/selftests/powerpc/copyloops/asm/ppc_asm.h +++ b/tools/testing/selftests/powerpc/copyloops/asm/ppc_asm.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #include <ppc-asm.h>  #define CONFIG_ALTIVEC diff --git a/tools/testing/selftests/powerpc/copyloops/validate.c b/tools/testing/selftests/powerpc/copyloops/validate.c index 7fb436f82d16..0f6873618552 100644 --- a/tools/testing/selftests/powerpc/copyloops/validate.c +++ b/tools/testing/selftests/powerpc/copyloops/validate.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <malloc.h>  #include <string.h>  #include <stdlib.h> diff --git a/tools/testing/selftests/powerpc/dscr/Makefile b/tools/testing/selftests/powerpc/dscr/Makefile index c5639deb8887..55d7db7a616b 100644 --- a/tools/testing/selftests/powerpc/dscr/Makefile +++ b/tools/testing/selftests/powerpc/dscr/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_GEN_PROGS := dscr_default_test dscr_explicit_test dscr_user_test	\  	      dscr_inherit_test dscr_inherit_exec_test dscr_sysfs_test	\  	      dscr_sysfs_thread_test diff --git a/tools/testing/selftests/powerpc/include/basic_asm.h b/tools/testing/selftests/powerpc/include/basic_asm.h index 12eaddf72e66..886dc026fe7a 100644 --- a/tools/testing/selftests/powerpc/include/basic_asm.h +++ b/tools/testing/selftests/powerpc/include/basic_asm.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _SELFTESTS_POWERPC_BASIC_ASM_H  #define _SELFTESTS_POWERPC_BASIC_ASM_H diff --git a/tools/testing/selftests/powerpc/include/instructions.h b/tools/testing/selftests/powerpc/include/instructions.h index 0fb0bd3b28c9..f36061eb6f0f 100644 --- a/tools/testing/selftests/powerpc/include/instructions.h +++ b/tools/testing/selftests/powerpc/include/instructions.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _SELFTESTS_POWERPC_INSTRUCTIONS_H  #define _SELFTESTS_POWERPC_INSTRUCTIONS_H diff --git a/tools/testing/selftests/powerpc/math/Makefile b/tools/testing/selftests/powerpc/math/Makefile index fa8bae920c91..0dd3a01fdab9 100644 --- a/tools/testing/selftests/powerpc/math/Makefile +++ b/tools/testing/selftests/powerpc/math/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_GEN_PROGS := fpu_syscall fpu_preempt fpu_signal vmx_syscall vmx_preempt vmx_signal vsx_preempt  include ../../lib.mk diff --git a/tools/testing/selftests/powerpc/mm/Makefile b/tools/testing/selftests/powerpc/mm/Makefile index 1cffe54dccfb..bf315bcbe663 100644 --- a/tools/testing/selftests/powerpc/mm/Makefile +++ b/tools/testing/selftests/powerpc/mm/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  noarg:  	$(MAKE) -C ../ diff --git a/tools/testing/selftests/powerpc/mm/hugetlb_vs_thp_test.c b/tools/testing/selftests/powerpc/mm/hugetlb_vs_thp_test.c index 49003674de4f..9932359ce38f 100644 --- a/tools/testing/selftests/powerpc/mm/hugetlb_vs_thp_test.c +++ b/tools/testing/selftests/powerpc/mm/hugetlb_vs_thp_test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <stdio.h>  #include <sys/mman.h>  #include <unistd.h> diff --git a/tools/testing/selftests/powerpc/pmu/Makefile b/tools/testing/selftests/powerpc/pmu/Makefile index e4e55d1d3e0f..6e1629bf5b09 100644 --- a/tools/testing/selftests/powerpc/pmu/Makefile +++ b/tools/testing/selftests/powerpc/pmu/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  noarg:  	$(MAKE) -C ../ diff --git a/tools/testing/selftests/powerpc/pmu/ebb/Makefile b/tools/testing/selftests/powerpc/pmu/ebb/Makefile index 6001fb0a377a..c4e64bc2e265 100644 --- a/tools/testing/selftests/powerpc/pmu/ebb/Makefile +++ b/tools/testing/selftests/powerpc/pmu/ebb/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  noarg:  	$(MAKE) -C ../../ diff --git a/tools/testing/selftests/powerpc/ptrace/Makefile b/tools/testing/selftests/powerpc/ptrace/Makefile index 8932263e5a74..480305266504 100644 --- a/tools/testing/selftests/powerpc/ptrace/Makefile +++ b/tools/testing/selftests/powerpc/ptrace/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_PROGS := ptrace-gpr ptrace-tm-gpr ptrace-tm-spd-gpr \                ptrace-tar ptrace-tm-tar ptrace-tm-spd-tar ptrace-vsx ptrace-tm-vsx \                ptrace-tm-spd-vsx ptrace-tm-spr diff --git a/tools/testing/selftests/powerpc/signal/Makefile b/tools/testing/selftests/powerpc/signal/Makefile index f0eef27458e2..a7cbd5082e27 100644 --- a/tools/testing/selftests/powerpc/signal/Makefile +++ b/tools/testing/selftests/powerpc/signal/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_PROGS := signal signal_tm  all: $(TEST_PROGS) diff --git a/tools/testing/selftests/powerpc/stringloops/Makefile b/tools/testing/selftests/powerpc/stringloops/Makefile index 557b9379f3bb..1125e489055e 100644 --- a/tools/testing/selftests/powerpc/stringloops/Makefile +++ b/tools/testing/selftests/powerpc/stringloops/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # The loops are all 64-bit code  CFLAGS += -m64  CFLAGS += -I$(CURDIR) diff --git a/tools/testing/selftests/powerpc/stringloops/asm/ppc_asm.h b/tools/testing/selftests/powerpc/stringloops/asm/ppc_asm.h index 11bece87e880..136242ec4b0e 100644 --- a/tools/testing/selftests/powerpc/stringloops/asm/ppc_asm.h +++ b/tools/testing/selftests/powerpc/stringloops/asm/ppc_asm.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #include <ppc-asm.h>  #ifndef r1 diff --git a/tools/testing/selftests/powerpc/stringloops/memcmp.c b/tools/testing/selftests/powerpc/stringloops/memcmp.c index 30b1222380ca..8250db25b379 100644 --- a/tools/testing/selftests/powerpc/stringloops/memcmp.c +++ b/tools/testing/selftests/powerpc/stringloops/memcmp.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <malloc.h>  #include <stdlib.h>  #include <string.h> diff --git a/tools/testing/selftests/powerpc/switch_endian/Makefile b/tools/testing/selftests/powerpc/switch_endian/Makefile index b92c2a132c4f..30b8ff8fb82e 100644 --- a/tools/testing/selftests/powerpc/switch_endian/Makefile +++ b/tools/testing/selftests/powerpc/switch_endian/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_GEN_PROGS := switch_endian_test  ASFLAGS += -O2 -Wall -g -nostdlib -m64 diff --git a/tools/testing/selftests/powerpc/switch_endian/check.S b/tools/testing/selftests/powerpc/switch_endian/check.S index e2484d2c24f4..927a5c675e83 100644 --- a/tools/testing/selftests/powerpc/switch_endian/check.S +++ b/tools/testing/selftests/powerpc/switch_endian/check.S @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #include "common.h"  /* diff --git a/tools/testing/selftests/powerpc/switch_endian/common.h b/tools/testing/selftests/powerpc/switch_endian/common.h index 69e399698c64..1434cbc2a6ad 100644 --- a/tools/testing/selftests/powerpc/switch_endian/common.h +++ b/tools/testing/selftests/powerpc/switch_endian/common.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #include <ppc-asm.h>  #include <asm/unistd.h> diff --git a/tools/testing/selftests/powerpc/switch_endian/switch_endian_test.S b/tools/testing/selftests/powerpc/switch_endian/switch_endian_test.S index bceb53f57573..cc4930467235 100644 --- a/tools/testing/selftests/powerpc/switch_endian/switch_endian_test.S +++ b/tools/testing/selftests/powerpc/switch_endian/switch_endian_test.S @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #include "common.h"  	.data diff --git a/tools/testing/selftests/powerpc/syscalls/ipc.h b/tools/testing/selftests/powerpc/syscalls/ipc.h index fbebc022edf6..26a20682c9a4 100644 --- a/tools/testing/selftests/powerpc/syscalls/ipc.h +++ b/tools/testing/selftests/powerpc/syscalls/ipc.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifdef __NR_semop  DO_TEST(semop, __NR_semop)  #endif diff --git a/tools/testing/selftests/powerpc/tm/Makefile b/tools/testing/selftests/powerpc/tm/Makefile index 7bfcd454fb2a..fca7c7f5e640 100644 --- a/tools/testing/selftests/powerpc/tm/Makefile +++ b/tools/testing/selftests/powerpc/tm/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  SIGNAL_CONTEXT_CHK_TESTS := tm-signal-context-chk-gpr tm-signal-context-chk-fpu \  	tm-signal-context-chk-vmx tm-signal-context-chk-vsx diff --git a/tools/testing/selftests/powerpc/tm/tm-resched-dscr.c b/tools/testing/selftests/powerpc/tm/tm-resched-dscr.c index a7ac2e4c60d9..4cdb83964bb3 100644 --- a/tools/testing/selftests/powerpc/tm/tm-resched-dscr.c +++ b/tools/testing/selftests/powerpc/tm/tm-resched-dscr.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* Test context switching to see if the DSCR SPR is correctly preserved   * when within a transaction.   * diff --git a/tools/testing/selftests/powerpc/tm/tm-syscall-asm.S b/tools/testing/selftests/powerpc/tm/tm-syscall-asm.S index 431f61ae2368..bd1ca25febe4 100644 --- a/tools/testing/selftests/powerpc/tm/tm-syscall-asm.S +++ b/tools/testing/selftests/powerpc/tm/tm-syscall-asm.S @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #include <ppc-asm.h>  #include <asm/unistd.h> diff --git a/tools/testing/selftests/powerpc/vphn/test-vphn.c b/tools/testing/selftests/powerpc/vphn/test-vphn.c index 5742f6876b25..81d3069ffb84 100644 --- a/tools/testing/selftests/powerpc/vphn/test-vphn.c +++ b/tools/testing/selftests/powerpc/vphn/test-vphn.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <stdio.h>  #include <byteswap.h>  #include "utils.h" diff --git a/tools/testing/selftests/prctl/Makefile b/tools/testing/selftests/prctl/Makefile index 35aa1c8f2df2..c7923b205222 100644 --- a/tools/testing/selftests/prctl/Makefile +++ b/tools/testing/selftests/prctl/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  ifndef CROSS_COMPILE  uname_M := $(shell uname -m 2>/dev/null || echo not)  ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/) diff --git a/tools/testing/selftests/prctl/disable-tsc-ctxt-sw-stress-test.c b/tools/testing/selftests/prctl/disable-tsc-ctxt-sw-stress-test.c index f7499d1c0415..62a93cc61b7c 100644 --- a/tools/testing/selftests/prctl/disable-tsc-ctxt-sw-stress-test.c +++ b/tools/testing/selftests/prctl/disable-tsc-ctxt-sw-stress-test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Tests for prctl(PR_GET_TSC, ...) / prctl(PR_SET_TSC, ...)   * diff --git a/tools/testing/selftests/prctl/disable-tsc-on-off-stress-test.c b/tools/testing/selftests/prctl/disable-tsc-on-off-stress-test.c index a06f027e9d16..79950f9a26fd 100644 --- a/tools/testing/selftests/prctl/disable-tsc-on-off-stress-test.c +++ b/tools/testing/selftests/prctl/disable-tsc-on-off-stress-test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Tests for prctl(PR_GET_TSC, ...) / prctl(PR_SET_TSC, ...)   * diff --git a/tools/testing/selftests/prctl/disable-tsc-test.c b/tools/testing/selftests/prctl/disable-tsc-test.c index 8d494f7bebdb..f84d4ee111d3 100644 --- a/tools/testing/selftests/prctl/disable-tsc-test.c +++ b/tools/testing/selftests/prctl/disable-tsc-test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Tests for prctl(PR_GET_TSC, ...) / prctl(PR_SET_TSC, ...)   * diff --git a/tools/testing/selftests/pstore/Makefile b/tools/testing/selftests/pstore/Makefile index c5f2440ba1f7..5ef57855a2be 100644 --- a/tools/testing/selftests/pstore/Makefile +++ b/tools/testing/selftests/pstore/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # Makefile for pstore selftests.  # Expects pstore backend is registered. diff --git a/tools/testing/selftests/ptp/Makefile b/tools/testing/selftests/ptp/Makefile index d4064c742c26..ef06de0898b7 100644 --- a/tools/testing/selftests/ptp/Makefile +++ b/tools/testing/selftests/ptp/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  CFLAGS += -I../../../../usr/include/  TEST_PROGS := testptp  LDLIBS += -lrt diff --git a/tools/testing/selftests/ptrace/peeksiginfo.c b/tools/testing/selftests/ptrace/peeksiginfo.c index c34cd8ac8aaa..54900657eb44 100644 --- a/tools/testing/selftests/ptrace/peeksiginfo.c +++ b/tools/testing/selftests/ptrace/peeksiginfo.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE  #include <stdio.h>  #include <signal.h> diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/Makefile b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/Makefile index 16b01559fa55..4bed0b678f8b 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/Makefile +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  all: srcu.c store_buffering  LINUX_SOURCE = ../../../../../.. diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/include/linux/types.h b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/include/linux/types.h index 4a3d538fef12..891ad13e95b2 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/include/linux/types.h +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/include/linux/types.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * This header has been modifies to remove definitions of types that   * are defined in standard userspace headers or are problematic for some diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/modify_srcu.awk b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/modify_srcu.awk index c9e8bc5082a7..e05182d3e47d 100755 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/modify_srcu.awk +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/modify_srcu.awk @@ -1,4 +1,5 @@  #!/usr/bin/awk -f +# SPDX-License-Identifier: GPL-2.0  # Modify SRCU for formal verification. The first argument should be srcu.h and  # the second should be srcu.c. Outputs modified srcu.h and srcu.c into the diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/assume.h b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/assume.h index a64955447995..570a49d9da7e 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/assume.h +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/assume.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef ASSUME_H  #define ASSUME_H diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/barriers.h b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/barriers.h index 6687acc08e6d..be3fdd351937 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/barriers.h +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/barriers.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef BARRIERS_H  #define BARRIERS_H diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/bug_on.h b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/bug_on.h index 2a80e91f78e7..5e7912c6a521 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/bug_on.h +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/bug_on.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef BUG_ON_H  #define BUG_ON_H diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/combined_source.c b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/combined_source.c index 29eb5d2697ed..e67ee5b3dd7c 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/combined_source.c +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/combined_source.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <config.h>  /* Include all source files. */ diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/config.h b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/config.h index a60038aeea7a..283d7103334f 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/config.h +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/config.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /* "Cheater" definitions based on restricted Kconfig choices. */  #undef CONFIG_TINY_RCU diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/include_srcu.c b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/include_srcu.c index 5ec582a53018..e5202d4cff30 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/include_srcu.c +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/include_srcu.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <config.h>  #include <assert.h> diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/int_typedefs.h b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/int_typedefs.h index 3aad63917858..0dd27aa517a7 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/int_typedefs.h +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/int_typedefs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef INT_TYPEDEFS_H  #define INT_TYPEDEFS_H diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/locks.h b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/locks.h index 356004665576..cf6938d679d7 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/locks.h +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/locks.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef LOCKS_H  #define LOCKS_H diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/misc.c b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/misc.c index ca892e3b2351..9440cc39e3c6 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/misc.c +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/misc.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <config.h>  #include "misc.h" diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/percpu.h b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/percpu.h index 3de5a49de49b..27e67a3f291f 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/percpu.h +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/percpu.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef PERCPU_H  #define PERCPU_H diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/preempt.c b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/preempt.c index 4f1b068e9b7a..b4083ae348fb 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/preempt.c +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/preempt.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <config.h>  #include "preempt.h" diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/preempt.h b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/preempt.h index 2f95ee0e4dd5..f8b762cd214c 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/preempt.h +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/preempt.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef PREEMPT_H  #define PREEMPT_H diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/simple_sync_srcu.c b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/simple_sync_srcu.c index ac9cbc62b411..97f592048e0b 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/simple_sync_srcu.c +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/simple_sync_srcu.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <config.h>  #include <assert.h> diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/workqueues.h b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/workqueues.h index e58c8dfd3e90..28b960300971 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/workqueues.h +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/src/workqueues.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef WORKQUEUES_H  #define WORKQUEUES_H diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/store_buffering/Makefile b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/store_buffering/Makefile index 3a3aee149225..ad21b925fbb4 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/store_buffering/Makefile +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/store_buffering/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  CBMC_FLAGS = -I../.. -I../../src -I../../include -I../../empty_includes -32 -pointer-check -mm pso  all: diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/store_buffering/test.c b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/store_buffering/test.c index 470b1105a112..2ce2016f7871 100644 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/store_buffering/test.c +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/store_buffering/test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <src/combined_source.c>  int x; diff --git a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/test_script.sh b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/test_script.sh index d1545972a0fa..2fe1f0339b4f 100755 --- a/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/test_script.sh +++ b/tools/testing/selftests/rcutorture/formal/srcu-cbmc/tests/test_script.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # This script expects a mode (either --should-pass or --should-fail) followed by  # an input file. The script uses the following environment variables. The test C diff --git a/tools/testing/selftests/seccomp/Makefile b/tools/testing/selftests/seccomp/Makefile index aeb0c805f3ca..fce7f4ce0692 100644 --- a/tools/testing/selftests/seccomp/Makefile +++ b/tools/testing/selftests/seccomp/Makefile @@ -1,8 +1,17 @@ -TEST_GEN_PROGS := seccomp_bpf -CFLAGS += -Wl,-no-as-needed -Wall -LDFLAGS += -lpthread +# SPDX-License-Identifier: GPL-2.0 +all:  include ../lib.mk -$(TEST_GEN_PROGS): seccomp_bpf.c ../kselftest_harness.h -	$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ +.PHONY: all clean + +BINARIES := seccomp_bpf seccomp_benchmark +CFLAGS += -Wl,-no-as-needed -Wall + +seccomp_bpf: seccomp_bpf.c ../kselftest_harness.h +	$(CC) $(CFLAGS) $(LDFLAGS) -lpthread $< -o $@ + +TEST_PROGS += $(BINARIES) +EXTRA_CLEAN := $(BINARIES) + +all: $(BINARIES) diff --git a/tools/testing/selftests/seccomp/seccomp_benchmark.c b/tools/testing/selftests/seccomp/seccomp_benchmark.c new file mode 100644 index 000000000000..5838c8697ec3 --- /dev/null +++ b/tools/testing/selftests/seccomp/seccomp_benchmark.c @@ -0,0 +1,99 @@ +/* + * Strictly speaking, this is not a test. But it can report during test + * runs so relative performace can be measured. + */ +#define _GNU_SOURCE +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <unistd.h> +#include <linux/filter.h> +#include <linux/seccomp.h> +#include <sys/prctl.h> +#include <sys/syscall.h> +#include <sys/types.h> + +#define ARRAY_SIZE(a)    (sizeof(a) / sizeof(a[0])) + +unsigned long long timing(clockid_t clk_id, unsigned long long samples) +{ +	pid_t pid, ret; +	unsigned long long i; +	struct timespec start, finish; + +	pid = getpid(); +	assert(clock_gettime(clk_id, &start) == 0); +	for (i = 0; i < samples; i++) { +		ret = syscall(__NR_getpid); +		assert(pid == ret); +	} +	assert(clock_gettime(clk_id, &finish) == 0); + +	i = finish.tv_sec - start.tv_sec; +	i *= 1000000000; +	i += finish.tv_nsec - start.tv_nsec; + +	printf("%lu.%09lu - %lu.%09lu = %llu\n", +		finish.tv_sec, finish.tv_nsec, +		start.tv_sec, start.tv_nsec, +		i); + +	return i; +} + +unsigned long long calibrate(void) +{ +	unsigned long long i; + +	printf("Calibrating reasonable sample size...\n"); + +	for (i = 5; ; i++) { +		unsigned long long samples = 1 << i; + +		/* Find something that takes more than 5 seconds to run. */ +		if (timing(CLOCK_REALTIME, samples) / 1000000000ULL > 5) +			return samples; +	} +} + +int main(int argc, char *argv[]) +{ +	struct sock_filter filter[] = { +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), +	}; +	struct sock_fprog prog = { +		.len = (unsigned short)ARRAY_SIZE(filter), +		.filter = filter, +	}; +	long ret; +	unsigned long long samples; +	unsigned long long native, filtered; + +	if (argc > 1) +		samples = strtoull(argv[1], NULL, 0); +	else +		samples = calibrate(); + +	printf("Benchmarking %llu samples...\n", samples); + +	native = timing(CLOCK_PROCESS_CPUTIME_ID, samples) / samples; +	printf("getpid native: %llu ns\n", native); + +	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); +	assert(ret == 0); + +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); +	assert(ret == 0); + +	filtered = timing(CLOCK_PROCESS_CPUTIME_ID, samples) / samples; +	printf("getpid RET_ALLOW: %llu ns\n", filtered); + +	printf("Estimated seccomp overhead per syscall: %llu ns\n", +		filtered - native); + +	if (filtered == native) +		printf("Trying running again with more samples.\n"); + +	return 0; +} diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c index 4d6f92a9df6b..24dbf634e2dd 100644 --- a/tools/testing/selftests/seccomp/seccomp_bpf.c +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c @@ -6,10 +6,18 @@   */  #include <sys/types.h> -#include <asm/siginfo.h> -#define __have_siginfo_t 1 -#define __have_sigval_t 1 -#define __have_sigevent_t 1 + +/* + * glibc 2.26 and later have SIGSYS in siginfo_t. Before that, + * we need to use the kernel's siginfo.h file and trick glibc + * into accepting it. + */ +#if !__GLIBC_PREREQ(2, 26) +# include <asm/siginfo.h> +# define __have_siginfo_t 1 +# define __have_sigval_t 1 +# define __have_sigevent_t 1 +#endif  #include <errno.h>  #include <linux/filter.h> @@ -68,17 +76,7 @@  #define SECCOMP_MODE_FILTER 2  #endif -#ifndef SECCOMP_RET_KILL -#define SECCOMP_RET_KILL        0x00000000U /* kill the task immediately */ -#define SECCOMP_RET_TRAP        0x00030000U /* disallow and force a SIGSYS */ -#define SECCOMP_RET_ERRNO       0x00050000U /* returns an errno */ -#define SECCOMP_RET_TRACE       0x7ff00000U /* pass to a tracer or disallow */ -#define SECCOMP_RET_ALLOW       0x7fff0000U /* allow */ - -/* Masks for the return value sections. */ -#define SECCOMP_RET_ACTION      0x7fff0000U -#define SECCOMP_RET_DATA        0x0000ffffU - +#ifndef SECCOMP_RET_ALLOW  struct seccomp_data {  	int nr;  	__u32 arch; @@ -87,6 +85,70 @@ struct seccomp_data {  };  #endif +#ifndef SECCOMP_RET_KILL_PROCESS +#define SECCOMP_RET_KILL_PROCESS 0x80000000U /* kill the process */ +#define SECCOMP_RET_KILL_THREAD	 0x00000000U /* kill the thread */ +#endif +#ifndef SECCOMP_RET_KILL +#define SECCOMP_RET_KILL	 SECCOMP_RET_KILL_THREAD +#define SECCOMP_RET_TRAP	 0x00030000U /* disallow and force a SIGSYS */ +#define SECCOMP_RET_ERRNO	 0x00050000U /* returns an errno */ +#define SECCOMP_RET_TRACE	 0x7ff00000U /* pass to a tracer or disallow */ +#define SECCOMP_RET_ALLOW	 0x7fff0000U /* allow */ +#endif +#ifndef SECCOMP_RET_LOG +#define SECCOMP_RET_LOG		 0x7ffc0000U /* allow after logging */ +#endif + +#ifndef __NR_seccomp +# if defined(__i386__) +#  define __NR_seccomp 354 +# elif defined(__x86_64__) +#  define __NR_seccomp 317 +# elif defined(__arm__) +#  define __NR_seccomp 383 +# elif defined(__aarch64__) +#  define __NR_seccomp 277 +# elif defined(__hppa__) +#  define __NR_seccomp 338 +# elif defined(__powerpc__) +#  define __NR_seccomp 358 +# elif defined(__s390__) +#  define __NR_seccomp 348 +# else +#  warning "seccomp syscall number unknown for this architecture" +#  define __NR_seccomp 0xffff +# endif +#endif + +#ifndef SECCOMP_SET_MODE_STRICT +#define SECCOMP_SET_MODE_STRICT 0 +#endif + +#ifndef SECCOMP_SET_MODE_FILTER +#define SECCOMP_SET_MODE_FILTER 1 +#endif + +#ifndef SECCOMP_GET_ACTION_AVAIL +#define SECCOMP_GET_ACTION_AVAIL 2 +#endif + +#ifndef SECCOMP_FILTER_FLAG_TSYNC +#define SECCOMP_FILTER_FLAG_TSYNC 1 +#endif + +#ifndef SECCOMP_FILTER_FLAG_LOG +#define SECCOMP_FILTER_FLAG_LOG 2 +#endif + +#ifndef seccomp +int seccomp(unsigned int op, unsigned int flags, void *args) +{ +	errno = 0; +	return syscall(__NR_seccomp, op, flags, args); +} +#endif +  #if __BYTE_ORDER == __LITTLE_ENDIAN  #define syscall_arg(_n) (offsetof(struct seccomp_data, args[_n]))  #elif __BYTE_ORDER == __BIG_ENDIAN @@ -136,7 +198,7 @@ TEST(no_new_privs_support)  	}  } -/* Tests kernel support by checking for a copy_from_user() fault on * NULL. */ +/* Tests kernel support by checking for a copy_from_user() fault on NULL. */  TEST(mode_filter_support)  {  	long ret; @@ -342,6 +404,28 @@ TEST(empty_prog)  	EXPECT_EQ(EINVAL, errno);  } +TEST(log_all) +{ +	struct sock_filter filter[] = { +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_LOG), +	}; +	struct sock_fprog prog = { +		.len = (unsigned short)ARRAY_SIZE(filter), +		.filter = filter, +	}; +	long ret; +	pid_t parent = getppid(); + +	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); +	ASSERT_EQ(0, ret); + +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); +	ASSERT_EQ(0, ret); + +	/* getppid() should succeed and be logged (no check for logging) */ +	EXPECT_EQ(parent, syscall(__NR_getppid)); +} +  TEST_SIGNAL(unknown_ret_is_kill_inside, SIGSYS)  {  	struct sock_filter filter[] = { @@ -520,6 +604,117 @@ TEST_SIGNAL(KILL_one_arg_six, SIGSYS)  	close(fd);  } +/* This is a thread task to die via seccomp filter violation. */ +void *kill_thread(void *data) +{ +	bool die = (bool)data; + +	if (die) { +		prctl(PR_GET_SECCOMP, 0, 0, 0, 0); +		return (void *)SIBLING_EXIT_FAILURE; +	} + +	return (void *)SIBLING_EXIT_UNKILLED; +} + +/* Prepare a thread that will kill itself or both of us. */ +void kill_thread_or_group(struct __test_metadata *_metadata, bool kill_process) +{ +	pthread_t thread; +	void *status; +	/* Kill only when calling __NR_prctl. */ +	struct sock_filter filter_thread[] = { +		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, +			offsetof(struct seccomp_data, nr)), +		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_prctl, 0, 1), +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL_THREAD), +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), +	}; +	struct sock_fprog prog_thread = { +		.len = (unsigned short)ARRAY_SIZE(filter_thread), +		.filter = filter_thread, +	}; +	struct sock_filter filter_process[] = { +		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, +			offsetof(struct seccomp_data, nr)), +		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_prctl, 0, 1), +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL_PROCESS), +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), +	}; +	struct sock_fprog prog_process = { +		.len = (unsigned short)ARRAY_SIZE(filter_process), +		.filter = filter_process, +	}; + +	ASSERT_EQ(0, prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { +		TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); +	} + +	ASSERT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER, 0, +			     kill_process ? &prog_process : &prog_thread)); + +	/* +	 * Add the KILL_THREAD rule again to make sure that the KILL_PROCESS +	 * flag cannot be downgraded by a new filter. +	 */ +	ASSERT_EQ(0, seccomp(SECCOMP_SET_MODE_FILTER, 0, &prog_thread)); + +	/* Start a thread that will exit immediately. */ +	ASSERT_EQ(0, pthread_create(&thread, NULL, kill_thread, (void *)false)); +	ASSERT_EQ(0, pthread_join(thread, &status)); +	ASSERT_EQ(SIBLING_EXIT_UNKILLED, (unsigned long)status); + +	/* Start a thread that will die immediately. */ +	ASSERT_EQ(0, pthread_create(&thread, NULL, kill_thread, (void *)true)); +	ASSERT_EQ(0, pthread_join(thread, &status)); +	ASSERT_NE(SIBLING_EXIT_FAILURE, (unsigned long)status); + +	/* +	 * If we get here, only the spawned thread died. Let the parent know +	 * the whole process didn't die (i.e. this thread, the spawner, +	 * stayed running). +	 */ +	exit(42); +} + +TEST(KILL_thread) +{ +	int status; +	pid_t child_pid; + +	child_pid = fork(); +	ASSERT_LE(0, child_pid); +	if (child_pid == 0) { +		kill_thread_or_group(_metadata, false); +		_exit(38); +	} + +	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0)); + +	/* If only the thread was killed, we'll see exit 42. */ +	ASSERT_TRUE(WIFEXITED(status)); +	ASSERT_EQ(42, WEXITSTATUS(status)); +} + +TEST(KILL_process) +{ +	int status; +	pid_t child_pid; + +	child_pid = fork(); +	ASSERT_LE(0, child_pid); +	if (child_pid == 0) { +		kill_thread_or_group(_metadata, true); +		_exit(38); +	} + +	ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0)); + +	/* If the entire process was killed, we'll see SIGSYS. */ +	ASSERT_TRUE(WIFSIGNALED(status)); +	ASSERT_EQ(SIGSYS, WTERMSIG(status)); +} +  /* TODO(wad) add 64-bit versus 32-bit arg tests. */  TEST(arg_out_of_range)  { @@ -541,26 +736,30 @@ TEST(arg_out_of_range)  	EXPECT_EQ(EINVAL, errno);  } +#define ERRNO_FILTER(name, errno)					\ +	struct sock_filter _read_filter_##name[] = {			\ +		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,				\ +			offsetof(struct seccomp_data, nr)),		\ +		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1),	\ +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | errno),	\ +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),		\ +	};								\ +	struct sock_fprog prog_##name = {				\ +		.len = (unsigned short)ARRAY_SIZE(_read_filter_##name),	\ +		.filter = _read_filter_##name,				\ +	} + +/* Make sure basic errno values are correctly passed through a filter. */  TEST(ERRNO_valid)  { -	struct sock_filter filter[] = { -		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, -			offsetof(struct seccomp_data, nr)), -		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1), -		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | E2BIG), -		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), -	}; -	struct sock_fprog prog = { -		.len = (unsigned short)ARRAY_SIZE(filter), -		.filter = filter, -	}; +	ERRNO_FILTER(valid, E2BIG);  	long ret;  	pid_t parent = getppid();  	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);  	ASSERT_EQ(0, ret); -	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_valid);  	ASSERT_EQ(0, ret);  	EXPECT_EQ(parent, syscall(__NR_getppid)); @@ -568,26 +767,17 @@ TEST(ERRNO_valid)  	EXPECT_EQ(E2BIG, errno);  } +/* Make sure an errno of zero is correctly handled by the arch code. */  TEST(ERRNO_zero)  { -	struct sock_filter filter[] = { -		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, -			offsetof(struct seccomp_data, nr)), -		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1), -		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | 0), -		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), -	}; -	struct sock_fprog prog = { -		.len = (unsigned short)ARRAY_SIZE(filter), -		.filter = filter, -	}; +	ERRNO_FILTER(zero, 0);  	long ret;  	pid_t parent = getppid();  	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);  	ASSERT_EQ(0, ret); -	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_zero);  	ASSERT_EQ(0, ret);  	EXPECT_EQ(parent, syscall(__NR_getppid)); @@ -595,26 +785,21 @@ TEST(ERRNO_zero)  	EXPECT_EQ(0, read(0, NULL, 0));  } +/* + * The SECCOMP_RET_DATA mask is 16 bits wide, but errno is smaller. + * This tests that the errno value gets capped correctly, fixed by + * 580c57f10768 ("seccomp: cap SECCOMP_RET_ERRNO data to MAX_ERRNO"). + */  TEST(ERRNO_capped)  { -	struct sock_filter filter[] = { -		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, -			offsetof(struct seccomp_data, nr)), -		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 0, 1), -		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO | 4096), -		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), -	}; -	struct sock_fprog prog = { -		.len = (unsigned short)ARRAY_SIZE(filter), -		.filter = filter, -	}; +	ERRNO_FILTER(capped, 4096);  	long ret;  	pid_t parent = getppid();  	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);  	ASSERT_EQ(0, ret); -	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_capped);  	ASSERT_EQ(0, ret);  	EXPECT_EQ(parent, syscall(__NR_getppid)); @@ -622,6 +807,37 @@ TEST(ERRNO_capped)  	EXPECT_EQ(4095, errno);  } +/* + * Filters are processed in reverse order: last applied is executed first. + * Since only the SECCOMP_RET_ACTION mask is tested for return values, the + * SECCOMP_RET_DATA mask results will follow the most recently applied + * matching filter return (and not the lowest or highest value). + */ +TEST(ERRNO_order) +{ +	ERRNO_FILTER(first,  11); +	ERRNO_FILTER(second, 13); +	ERRNO_FILTER(third,  12); +	long ret; +	pid_t parent = getppid(); + +	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); +	ASSERT_EQ(0, ret); + +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_first); +	ASSERT_EQ(0, ret); + +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_second); +	ASSERT_EQ(0, ret); + +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog_third); +	ASSERT_EQ(0, ret); + +	EXPECT_EQ(parent, syscall(__NR_getppid)); +	EXPECT_EQ(-1, read(0, NULL, 0)); +	EXPECT_EQ(12, errno); +} +  FIXTURE_DATA(TRAP) {  	struct sock_fprog prog;  }; @@ -676,7 +892,7 @@ TEST_F_SIGNAL(TRAP, ign, SIGSYS)  	syscall(__NR_getpid);  } -static struct siginfo TRAP_info; +static siginfo_t TRAP_info;  static volatile int TRAP_nr;  static void TRAP_action(int nr, siginfo_t *info, void *void_context)  { @@ -735,6 +951,7 @@ TEST_F(TRAP, handler)  FIXTURE_DATA(precedence) {  	struct sock_fprog allow; +	struct sock_fprog log;  	struct sock_fprog trace;  	struct sock_fprog error;  	struct sock_fprog trap; @@ -746,6 +963,13 @@ FIXTURE_SETUP(precedence)  	struct sock_filter allow_insns[] = {  		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),  	}; +	struct sock_filter log_insns[] = { +		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, +			offsetof(struct seccomp_data, nr)), +		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0), +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_LOG), +	};  	struct sock_filter trace_insns[] = {  		BPF_STMT(BPF_LD|BPF_W|BPF_ABS,  			offsetof(struct seccomp_data, nr)), @@ -782,6 +1006,7 @@ FIXTURE_SETUP(precedence)  	memcpy(self->_x.filter, &_x##_insns, sizeof(_x##_insns)); \  	self->_x.len = (unsigned short)ARRAY_SIZE(_x##_insns)  	FILTER_ALLOC(allow); +	FILTER_ALLOC(log);  	FILTER_ALLOC(trace);  	FILTER_ALLOC(error);  	FILTER_ALLOC(trap); @@ -792,6 +1017,7 @@ FIXTURE_TEARDOWN(precedence)  {  #define FILTER_FREE(_x) if (self->_x.filter) free(self->_x.filter)  	FILTER_FREE(allow); +	FILTER_FREE(log);  	FILTER_FREE(trace);  	FILTER_FREE(error);  	FILTER_FREE(trap); @@ -809,6 +1035,8 @@ TEST_F(precedence, allow_ok)  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);  	ASSERT_EQ(0, ret); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log); +	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);  	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); @@ -833,6 +1061,8 @@ TEST_F_SIGNAL(precedence, kill_is_highest, SIGSYS)  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);  	ASSERT_EQ(0, ret); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log); +	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);  	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); @@ -864,6 +1094,8 @@ TEST_F_SIGNAL(precedence, kill_is_highest_in_any_order, SIGSYS)  	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);  	ASSERT_EQ(0, ret); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log); +	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);  	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap); @@ -885,6 +1117,8 @@ TEST_F_SIGNAL(precedence, trap_is_second, SIGSYS)  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);  	ASSERT_EQ(0, ret); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log); +	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);  	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); @@ -910,6 +1144,8 @@ TEST_F_SIGNAL(precedence, trap_is_second_in_any_order, SIGSYS)  	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trap);  	ASSERT_EQ(0, ret); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log); +	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);  	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); @@ -931,6 +1167,8 @@ TEST_F(precedence, errno_is_third)  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);  	ASSERT_EQ(0, ret); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log); +	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);  	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error); @@ -949,6 +1187,8 @@ TEST_F(precedence, errno_is_third_in_any_order)  	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);  	ASSERT_EQ(0, ret); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log); +	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->error);  	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace); @@ -971,6 +1211,8 @@ TEST_F(precedence, trace_is_fourth)  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);  	ASSERT_EQ(0, ret); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log); +	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->trace);  	ASSERT_EQ(0, ret);  	/* Should work just fine. */ @@ -992,12 +1234,54 @@ TEST_F(precedence, trace_is_fourth_in_any_order)  	ASSERT_EQ(0, ret);  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow);  	ASSERT_EQ(0, ret); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log); +	ASSERT_EQ(0, ret);  	/* Should work just fine. */  	EXPECT_EQ(parent, syscall(__NR_getppid));  	/* No ptracer */  	EXPECT_EQ(-1, syscall(__NR_getpid));  } +TEST_F(precedence, log_is_fifth) +{ +	pid_t mypid, parent; +	long ret; + +	mypid = getpid(); +	parent = getppid(); +	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); +	ASSERT_EQ(0, ret); + +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow); +	ASSERT_EQ(0, ret); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log); +	ASSERT_EQ(0, ret); +	/* Should work just fine. */ +	EXPECT_EQ(parent, syscall(__NR_getppid)); +	/* Should also work just fine */ +	EXPECT_EQ(mypid, syscall(__NR_getpid)); +} + +TEST_F(precedence, log_is_fifth_in_any_order) +{ +	pid_t mypid, parent; +	long ret; + +	mypid = getpid(); +	parent = getppid(); +	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); +	ASSERT_EQ(0, ret); + +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->log); +	ASSERT_EQ(0, ret); +	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->allow); +	ASSERT_EQ(0, ret); +	/* Should work just fine. */ +	EXPECT_EQ(parent, syscall(__NR_getppid)); +	/* Should also work just fine */ +	EXPECT_EQ(mypid, syscall(__NR_getpid)); +} +  #ifndef PTRACE_O_TRACESECCOMP  #define PTRACE_O_TRACESECCOMP	0x00000080  #endif @@ -1262,6 +1546,13 @@ TEST_F(TRACE_poke, getpid_runs_normally)  # error "Do not know how to find your architecture's registers and syscalls"  #endif +/* When the syscall return can't be changed, stub out the tests for it. */ +#ifdef SYSCALL_NUM_RET_SHARE_REG +# define EXPECT_SYSCALL_RETURN(val, action)	EXPECT_EQ(-1, action) +#else +# define EXPECT_SYSCALL_RETURN(val, action)	EXPECT_EQ(val, action) +#endif +  /* Use PTRACE_GETREGS and PTRACE_SETREGS when available. This is useful for   * architectures without HAVE_ARCH_TRACEHOOK (e.g. User-mode Linux).   */ @@ -1357,7 +1648,7 @@ void change_syscall(struct __test_metadata *_metadata,  #ifdef SYSCALL_NUM_RET_SHARE_REG  		TH_LOG("Can't modify syscall return on this architecture");  #else -		regs.SYSCALL_RET = 1; +		regs.SYSCALL_RET = EPERM;  #endif  #ifdef HAVE_GETREGS @@ -1426,6 +1717,8 @@ void tracer_ptrace(struct __test_metadata *_metadata, pid_t tracee,  	if (nr == __NR_getpid)  		change_syscall(_metadata, tracee, __NR_getppid); +	if (nr == __NR_open) +		change_syscall(_metadata, tracee, -1);  }  FIXTURE_DATA(TRACE_syscall) { @@ -1480,6 +1773,28 @@ FIXTURE_TEARDOWN(TRACE_syscall)  		free(self->prog.filter);  } +TEST_F(TRACE_syscall, ptrace_syscall_redirected) +{ +	/* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */ +	teardown_trace_fixture(_metadata, self->tracer); +	self->tracer = setup_trace_fixture(_metadata, tracer_ptrace, NULL, +					   true); + +	/* Tracer will redirect getpid to getppid. */ +	EXPECT_NE(self->mypid, syscall(__NR_getpid)); +} + +TEST_F(TRACE_syscall, ptrace_syscall_dropped) +{ +	/* Swap SECCOMP_RET_TRACE tracer for PTRACE_SYSCALL tracer. */ +	teardown_trace_fixture(_metadata, self->tracer); +	self->tracer = setup_trace_fixture(_metadata, tracer_ptrace, NULL, +					   true); + +	/* Tracer should skip the open syscall, resulting in EPERM. */ +	EXPECT_SYSCALL_RETURN(EPERM, syscall(__NR_open)); +} +  TEST_F(TRACE_syscall, syscall_allowed)  {  	long ret; @@ -1520,13 +1835,8 @@ TEST_F(TRACE_syscall, syscall_dropped)  	ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);  	ASSERT_EQ(0, ret); -#ifdef SYSCALL_NUM_RET_SHARE_REG -	/* gettid has been skipped */ -	EXPECT_EQ(-1, syscall(__NR_gettid)); -#else  	/* gettid has been skipped and an altered return value stored. */ -	EXPECT_EQ(1, syscall(__NR_gettid)); -#endif +	EXPECT_SYSCALL_RETURN(EPERM, syscall(__NR_gettid));  	EXPECT_NE(self->mytid, syscall(__NR_gettid));  } @@ -1557,6 +1867,7 @@ TEST_F(TRACE_syscall, skip_after_RET_TRACE)  	ASSERT_EQ(0, ret);  	/* Tracer will redirect getpid to getppid, and we should see EPERM. */ +	errno = 0;  	EXPECT_EQ(-1, syscall(__NR_getpid));  	EXPECT_EQ(EPERM, errno);  } @@ -1654,47 +1965,6 @@ TEST_F_SIGNAL(TRACE_syscall, kill_after_ptrace, SIGSYS)  	EXPECT_NE(self->mypid, syscall(__NR_getpid));  } -#ifndef __NR_seccomp -# if defined(__i386__) -#  define __NR_seccomp 354 -# elif defined(__x86_64__) -#  define __NR_seccomp 317 -# elif defined(__arm__) -#  define __NR_seccomp 383 -# elif defined(__aarch64__) -#  define __NR_seccomp 277 -# elif defined(__hppa__) -#  define __NR_seccomp 338 -# elif defined(__powerpc__) -#  define __NR_seccomp 358 -# elif defined(__s390__) -#  define __NR_seccomp 348 -# else -#  warning "seccomp syscall number unknown for this architecture" -#  define __NR_seccomp 0xffff -# endif -#endif - -#ifndef SECCOMP_SET_MODE_STRICT -#define SECCOMP_SET_MODE_STRICT 0 -#endif - -#ifndef SECCOMP_SET_MODE_FILTER -#define SECCOMP_SET_MODE_FILTER 1 -#endif - -#ifndef SECCOMP_FILTER_FLAG_TSYNC -#define SECCOMP_FILTER_FLAG_TSYNC 1 -#endif - -#ifndef seccomp -int seccomp(unsigned int op, unsigned int flags, void *args) -{ -	errno = 0; -	return syscall(__NR_seccomp, op, flags, args); -} -#endif -  TEST(seccomp_syscall)  {  	struct sock_filter filter[] = { @@ -1783,6 +2053,67 @@ TEST(seccomp_syscall_mode_lock)  	}  } +/* + * Test detection of known and unknown filter flags. Userspace needs to be able + * to check if a filter flag is supported by the current kernel and a good way + * of doing that is by attempting to enter filter mode, with the flag bit in + * question set, and a NULL pointer for the _args_ parameter. EFAULT indicates + * that the flag is valid and EINVAL indicates that the flag is invalid. + */ +TEST(detect_seccomp_filter_flags) +{ +	unsigned int flags[] = { SECCOMP_FILTER_FLAG_TSYNC, +				 SECCOMP_FILTER_FLAG_LOG }; +	unsigned int flag, all_flags; +	int i; +	long ret; + +	/* Test detection of known-good filter flags */ +	for (i = 0, all_flags = 0; i < ARRAY_SIZE(flags); i++) { +		flag = flags[i]; +		ret = seccomp(SECCOMP_SET_MODE_FILTER, flag, NULL); +		ASSERT_NE(ENOSYS, errno) { +			TH_LOG("Kernel does not support seccomp syscall!"); +		} +		EXPECT_EQ(-1, ret); +		EXPECT_EQ(EFAULT, errno) { +			TH_LOG("Failed to detect that a known-good filter flag (0x%X) is supported!", +			       flag); +		} + +		all_flags |= flag; +	} + +	/* Test detection of all known-good filter flags */ +	ret = seccomp(SECCOMP_SET_MODE_FILTER, all_flags, NULL); +	EXPECT_EQ(-1, ret); +	EXPECT_EQ(EFAULT, errno) { +		TH_LOG("Failed to detect that all known-good filter flags (0x%X) are supported!", +		       all_flags); +	} + +	/* Test detection of an unknown filter flag */ +	flag = -1; +	ret = seccomp(SECCOMP_SET_MODE_FILTER, flag, NULL); +	EXPECT_EQ(-1, ret); +	EXPECT_EQ(EINVAL, errno) { +		TH_LOG("Failed to detect that an unknown filter flag (0x%X) is unsupported!", +		       flag); +	} + +	/* +	 * Test detection of an unknown filter flag that may simply need to be +	 * added to this test +	 */ +	flag = flags[ARRAY_SIZE(flags) - 1] << 1; +	ret = seccomp(SECCOMP_SET_MODE_FILTER, flag, NULL); +	EXPECT_EQ(-1, ret); +	EXPECT_EQ(EINVAL, errno) { +		TH_LOG("Failed to detect that an unknown filter flag (0x%X) is unsupported! Does a new flag need to be added to this test?", +		       flag); +	} +} +  TEST(TSYNC_first)  {  	struct sock_filter filter[] = { @@ -2421,6 +2752,99 @@ TEST(syscall_restart)  		_metadata->passed = 0;  } +TEST_SIGNAL(filter_flag_log, SIGSYS) +{ +	struct sock_filter allow_filter[] = { +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), +	}; +	struct sock_filter kill_filter[] = { +		BPF_STMT(BPF_LD|BPF_W|BPF_ABS, +			offsetof(struct seccomp_data, nr)), +		BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 0, 1), +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL), +		BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW), +	}; +	struct sock_fprog allow_prog = { +		.len = (unsigned short)ARRAY_SIZE(allow_filter), +		.filter = allow_filter, +	}; +	struct sock_fprog kill_prog = { +		.len = (unsigned short)ARRAY_SIZE(kill_filter), +		.filter = kill_filter, +	}; +	long ret; +	pid_t parent = getppid(); + +	ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); +	ASSERT_EQ(0, ret); + +	/* Verify that the FILTER_FLAG_LOG flag isn't accepted in strict mode */ +	ret = seccomp(SECCOMP_SET_MODE_STRICT, SECCOMP_FILTER_FLAG_LOG, +		      &allow_prog); +	ASSERT_NE(ENOSYS, errno) { +		TH_LOG("Kernel does not support seccomp syscall!"); +	} +	EXPECT_NE(0, ret) { +		TH_LOG("Kernel accepted FILTER_FLAG_LOG flag in strict mode!"); +	} +	EXPECT_EQ(EINVAL, errno) { +		TH_LOG("Kernel returned unexpected errno for FILTER_FLAG_LOG flag in strict mode!"); +	} + +	/* Verify that a simple, permissive filter can be added with no flags */ +	ret = seccomp(SECCOMP_SET_MODE_FILTER, 0, &allow_prog); +	EXPECT_EQ(0, ret); + +	/* See if the same filter can be added with the FILTER_FLAG_LOG flag */ +	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_LOG, +		      &allow_prog); +	ASSERT_NE(EINVAL, errno) { +		TH_LOG("Kernel does not support the FILTER_FLAG_LOG flag!"); +	} +	EXPECT_EQ(0, ret); + +	/* Ensure that the kill filter works with the FILTER_FLAG_LOG flag */ +	ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_LOG, +		      &kill_prog); +	EXPECT_EQ(0, ret); + +	EXPECT_EQ(parent, syscall(__NR_getppid)); +	/* getpid() should never return. */ +	EXPECT_EQ(0, syscall(__NR_getpid)); +} + +TEST(get_action_avail) +{ +	__u32 actions[] = { SECCOMP_RET_KILL_THREAD, SECCOMP_RET_TRAP, +			    SECCOMP_RET_ERRNO, SECCOMP_RET_TRACE, +			    SECCOMP_RET_LOG,   SECCOMP_RET_ALLOW }; +	__u32 unknown_action = 0x10000000U; +	int i; +	long ret; + +	ret = seccomp(SECCOMP_GET_ACTION_AVAIL, 0, &actions[0]); +	ASSERT_NE(ENOSYS, errno) { +		TH_LOG("Kernel does not support seccomp syscall!"); +	} +	ASSERT_NE(EINVAL, errno) { +		TH_LOG("Kernel does not support SECCOMP_GET_ACTION_AVAIL operation!"); +	} +	EXPECT_EQ(ret, 0); + +	for (i = 0; i < ARRAY_SIZE(actions); i++) { +		ret = seccomp(SECCOMP_GET_ACTION_AVAIL, 0, &actions[i]); +		EXPECT_EQ(ret, 0) { +			TH_LOG("Expected action (0x%X) not available!", +			       actions[i]); +		} +	} + +	/* Check that an unknown action is handled properly (EOPNOTSUPP) */ +	ret = seccomp(SECCOMP_GET_ACTION_AVAIL, 0, &unknown_action); +	EXPECT_EQ(ret, -1); +	EXPECT_EQ(errno, EOPNOTSUPP); +} +  /*   * TODO:   * - add microbenchmarks @@ -2429,6 +2853,8 @@ TEST(syscall_restart)   * - endianness checking when appropriate   * - 64-bit arg prodding   * - arch value testing (x86 modes especially) + * - verify that FILTER_FLAG_LOG filters generate log messages + * - verify that RET_LOG generates log messages   * - ...   */ diff --git a/tools/testing/selftests/sigaltstack/sas.c b/tools/testing/selftests/sigaltstack/sas.c index 7d406c3973ba..228c2ae47687 100644 --- a/tools/testing/selftests/sigaltstack/sas.c +++ b/tools/testing/selftests/sigaltstack/sas.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Stas Sergeev <[email protected]>   * @@ -39,7 +40,11 @@ void my_usr1(int sig, siginfo_t *si, void *u)  	stack_t stk;  	struct stk_data *p; +#if __s390x__ +	register unsigned long sp asm("%15"); +#else  	register unsigned long sp asm("sp"); +#endif  	if (sp < (unsigned long)sstack ||  			sp >= (unsigned long)sstack + SIGSTKSZ) { diff --git a/tools/testing/selftests/splice/Makefile b/tools/testing/selftests/splice/Makefile index 7e1187e007fa..e519b159b60d 100644 --- a/tools/testing/selftests/splice/Makefile +++ b/tools/testing/selftests/splice/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  TEST_PROGS := default_file_splice_read.sh  TEST_GEN_PROGS_EXTENDED := default_file_splice_read diff --git a/tools/testing/selftests/splice/default_file_splice_read.c b/tools/testing/selftests/splice/default_file_splice_read.c index 01dd6091554c..a3c6e5672e09 100644 --- a/tools/testing/selftests/splice/default_file_splice_read.c +++ b/tools/testing/selftests/splice/default_file_splice_read.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE  #include <fcntl.h> diff --git a/tools/testing/selftests/splice/default_file_splice_read.sh b/tools/testing/selftests/splice/default_file_splice_read.sh index 1ea2adeabc94..490db5a2e435 100755 --- a/tools/testing/selftests/splice/default_file_splice_read.sh +++ b/tools/testing/selftests/splice/default_file_splice_read.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  n=`./default_file_splice_read </dev/null | wc -c`  test "$n" = 0 && exit 0 diff --git a/tools/testing/selftests/static_keys/test_static_keys.sh b/tools/testing/selftests/static_keys/test_static_keys.sh index 1261e3fa1e3a..24cff498b31a 100755 --- a/tools/testing/selftests/static_keys/test_static_keys.sh +++ b/tools/testing/selftests/static_keys/test_static_keys.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # Runs static keys kernel module tests  if /sbin/modprobe -q test_static_key_base; then diff --git a/tools/testing/selftests/sync/Makefile b/tools/testing/selftests/sync/Makefile index 4981c6b6d050..b3c8ba3cb668 100644 --- a/tools/testing/selftests/sync/Makefile +++ b/tools/testing/selftests/sync/Makefile @@ -1,13 +1,18 @@ +# SPDX-License-Identifier: GPL-2.0  CFLAGS += -O2 -g -std=gnu89 -pthread -Wall -Wextra  CFLAGS += -I../../../../usr/include/  LDFLAGS += -pthread -TEST_PROGS = sync_test - -all: $(TEST_PROGS) +.PHONY: all clean  include ../lib.mk +# lib.mk TEST_CUSTOM_PROGS var is for custom tests that need special +# build rules. lib.mk will run and install them. + +TEST_CUSTOM_PROGS := $(OUTPUT)/sync_test +all: $(TEST_CUSTOM_PROGS) +  OBJS = sync_test.o sync.o  TESTS += sync_alloc.o @@ -18,6 +23,16 @@ TESTS += sync_stress_parallelism.o  TESTS += sync_stress_consumer.o  TESTS += sync_stress_merge.o -sync_test: $(OBJS) $(TESTS) +OBJS := $(patsubst %,$(OUTPUT)/%,$(OBJS)) +TESTS := $(patsubst %,$(OUTPUT)/%,$(TESTS)) + +$(TEST_CUSTOM_PROGS): $(TESTS) $(OBJS) +	$(CC) -o $(TEST_CUSTOM_PROGS) $(OBJS) $(TESTS) $(CFLAGS) $(LDFLAGS) + +$(OBJS): $(OUTPUT)/%.o: %.c +	$(CC) -c $^ -o $@ + +$(TESTS): $(OUTPUT)/%.o: %.c +	$(CC) -c $^ -o $@ -EXTRA_CLEAN := sync_test $(OBJS) $(TESTS) +EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(OBJS) $(TESTS) diff --git a/tools/testing/selftests/tc-testing/tc-tests/filters/tests.json b/tools/testing/selftests/tc-testing/tc-tests/filters/tests.json index c727b96a59b0..5fa02d86b35f 100644 --- a/tools/testing/selftests/tc-testing/tc-tests/filters/tests.json +++ b/tools/testing/selftests/tc-testing/tc-tests/filters/tests.json @@ -17,5 +17,26 @@          "teardown": [              "$TC qdisc del dev $DEV1 ingress"          ] +    }, +    { +        "id": "d052", +        "name": "Add 1M filters with the same action", +        "category": [ +            "filter", +            "flower" +        ], +        "setup": [ +            "$TC qdisc add dev $DEV2 ingress", +            "./tdc_batch.py $DEV2 $BATCH_FILE --share_action -n 1000000" +        ], +        "cmdUnderTest": "$TC -b $BATCH_FILE", +        "expExitCode": "0", +        "verifyCmd": "$TC actions list action gact", +        "matchPattern": "action order 0: gact action drop.*index 1 ref 1000000 bind 1000000", +        "matchCount": "1", +        "teardown": [ +            "$TC qdisc del dev $DEV2 ingress", +            "/bin/rm $BATCH_FILE" +        ]      } -]
\ No newline at end of file +] diff --git a/tools/testing/selftests/tc-testing/tdc.py b/tools/testing/selftests/tc-testing/tdc.py index cd61b7844c0d..b8462e1b74f9 100755 --- a/tools/testing/selftests/tc-testing/tdc.py +++ b/tools/testing/selftests/tc-testing/tdc.py @@ -1,4 +1,5 @@  #!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0  """  tdc.py - Linux tc (Traffic Control) unit test driver @@ -88,7 +89,7 @@ def prepare_env(cmdlist):              exit(1) -def test_runner(filtered_tests): +def test_runner(filtered_tests, args):      """      Driver function for the unit tests. @@ -105,6 +106,8 @@ def test_runner(filtered_tests):      for tidx in testlist:          result = True          tresult = "" +        if "flower" in tidx["category"] and args.device == None: +            continue          print("Test " + tidx["id"] + ": " + tidx["name"])          prepare_env(tidx["setup"])          (p, procout) = exec_cmd(tidx["cmdUnderTest"]) @@ -150,7 +153,11 @@ def ns_create():          exec_cmd(cmd, False)          cmd = 'ip link set $DEV0 up'          exec_cmd(cmd, False) -        cmd = 'ip -s $NS link set $DEV1 up' +        cmd = 'ip -n $NS link set $DEV1 up' +        exec_cmd(cmd, False) +        cmd = 'ip link set $DEV2 netns $NS' +        exec_cmd(cmd, False) +        cmd = 'ip -n $NS link set $DEV2 up'          exec_cmd(cmd, False) @@ -211,7 +218,8 @@ def set_args(parser):                          help='Execute the single test case with specified ID')      parser.add_argument('-i', '--id', action='store_true', dest='gen_id',                          help='Generate ID numbers for new test cases') -    return parser +    parser.add_argument('-d', '--device', +                        help='Execute the test case in flower category')      return parser @@ -225,6 +233,8 @@ def check_default_settings(args):      if args.path != None:           NAMES['TC'] = args.path +    if args.device != None: +         NAMES['DEV2'] = args.device      if not os.path.isfile(NAMES['TC']):          print("The specified tc path " + NAMES['TC'] + " does not exist.")          exit(1) @@ -381,14 +391,17 @@ def set_operation_mode(args):              if (len(alltests) == 0):                  print("Cannot find a test case with ID matching " + target_id)                  exit(1) -        catresults = test_runner(alltests) +        catresults = test_runner(alltests, args)          print("All test results: " + "\n\n" + catresults)      elif (len(target_category) > 0): +        if (target_category == "flower") and args.device == None: +            print("Please specify a NIC device (-d) to run category flower") +            exit(1)          if (target_category not in ucat):              print("Specified category is not present in this file.")              exit(1)          else: -            catresults = test_runner(testcases[target_category]) +            catresults = test_runner(testcases[target_category], args)              print("Category " + target_category + "\n\n" + catresults)      ns_destroy() diff --git a/tools/testing/selftests/tc-testing/tdc_batch.py b/tools/testing/selftests/tc-testing/tdc_batch.py new file mode 100755 index 000000000000..707c6bfef689 --- /dev/null +++ b/tools/testing/selftests/tc-testing/tdc_batch.py @@ -0,0 +1,62 @@ +#!/usr/bin/python3 + +""" +tdc_batch.py - a script to generate TC batch file + +Copyright (C) 2017 Chris Mi <[email protected]> +""" + +import argparse + +parser = argparse.ArgumentParser(description='TC batch file generator') +parser.add_argument("device", help="device name") +parser.add_argument("file", help="batch file name") +parser.add_argument("-n", "--number", type=int, +                    help="how many lines in batch file") +parser.add_argument("-o", "--skip_sw", +                    help="skip_sw (offload), by default skip_hw", +                    action="store_true") +parser.add_argument("-s", "--share_action", +                    help="all filters share the same action", +                    action="store_true") +parser.add_argument("-p", "--prio", +                    help="all filters have different prio", +                    action="store_true") +args = parser.parse_args() + +device = args.device +file = open(args.file, 'w') + +number = 1 +if args.number: +    number = args.number + +skip = "skip_hw" +if args.skip_sw: +    skip = "skip_sw" + +share_action = "" +if args.share_action: +    share_action = "index 1" + +prio = "prio 1" +if args.prio: +    prio = "" +    if number > 0x4000: +        number = 0x4000 + +index = 0 +for i in range(0x100): +    for j in range(0x100): +        for k in range(0x100): +            mac = ("%02x:%02x:%02x" % (i, j, k)) +            src_mac = "e4:11:00:" + mac +            dst_mac = "e4:12:00:" + mac +            cmd = ("filter add dev %s %s protocol ip parent ffff: flower %s " +                   "src_mac %s dst_mac %s action drop %s" % +                   (device, prio, skip, src_mac, dst_mac, share_action)) +            file.write("%s\n" % cmd) +            index += 1 +            if index >= number: +                file.close() +                exit(0) diff --git a/tools/testing/selftests/tc-testing/tdc_config.py b/tools/testing/selftests/tc-testing/tdc_config.py index 01087375a7c3..eb188c729dd6 100644 --- a/tools/testing/selftests/tc-testing/tdc_config.py +++ b/tools/testing/selftests/tc-testing/tdc_config.py @@ -1,4 +1,5 @@  """ +# SPDX-License-Identifier: GPL-2.0  tdc_config.py - tdc user-specified values  Copyright (C) 2017 Lucas Bates <[email protected]> @@ -12,6 +13,8 @@ NAMES = {            # Name of veth devices to be created for the namespace            'DEV0': 'v0p0',            'DEV1': 'v0p1', +          'DEV2': '', +          'BATCH_FILE': './batch.txt',            # Name of the namespace to use            'NS': 'tcut'          } diff --git a/tools/testing/selftests/tc-testing/tdc_helper.py b/tools/testing/selftests/tc-testing/tdc_helper.py index c3254f861fb2..ccf2d2458703 100644 --- a/tools/testing/selftests/tc-testing/tdc_helper.py +++ b/tools/testing/selftests/tc-testing/tdc_helper.py @@ -1,4 +1,5 @@  """ +# SPDX-License-Identifier: GPL-2.0  tdc_helper.py - tdc helper functions  Copyright (C) 2017 Lucas Bates <[email protected]> diff --git a/tools/testing/selftests/timers/Makefile b/tools/testing/selftests/timers/Makefile index ae4593115408..3496680981f2 100644 --- a/tools/testing/selftests/timers/Makefile +++ b/tools/testing/selftests/timers/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  CFLAGS += -O3 -Wl,-no-as-needed -Wall  LDFLAGS += -lrt -lpthread -lm diff --git a/tools/testing/selftests/timers/set-timer-lat.c b/tools/testing/selftests/timers/set-timer-lat.c index 9c92b7bd5641..50da45437daa 100644 --- a/tools/testing/selftests/timers/set-timer-lat.c +++ b/tools/testing/selftests/timers/set-timer-lat.c @@ -143,7 +143,8 @@ int setup_timer(int clock_id, int flags, int interval, timer_t *tm1)  			printf("%-22s %s missing CAP_WAKE_ALARM?    : [UNSUPPORTED]\n",  					clockstring(clock_id),  					flags ? "ABSTIME":"RELTIME"); -			return 0; +			/* Indicate timer isn't set, so caller doesn't wait */ +			return 1;  		}  		printf("%s - timer_create() failed\n", clockstring(clock_id));  		return -1; @@ -213,8 +214,9 @@ int do_timer(int clock_id, int flags)  	int err;  	err = setup_timer(clock_id, flags, interval, &tm1); +	/* Unsupported case - return 0 to not fail the test */  	if (err) -		return err; +		return err == 1 ? 0 : err;  	while (alarmcount < 5)  		sleep(1); @@ -228,18 +230,17 @@ int do_timer_oneshot(int clock_id, int flags)  	timer_t tm1;  	const int interval = 0;  	struct timeval timeout; -	fd_set fds;  	int err;  	err = setup_timer(clock_id, flags, interval, &tm1); +	/* Unsupported case - return 0 to not fail the test */  	if (err) -		return err; +		return err == 1 ? 0 : err;  	memset(&timeout, 0, sizeof(timeout));  	timeout.tv_sec = 5; -	FD_ZERO(&fds);  	do { -		err = select(FD_SETSIZE, &fds, NULL, NULL, &timeout); +		err = select(0, NULL, NULL, NULL, &timeout);  	} while (err == -1 && errno == EINTR);  	timer_delete(tm1); diff --git a/tools/testing/selftests/user/test_user_copy.sh b/tools/testing/selftests/user/test_user_copy.sh index 350107f40c1d..d60506fc77f8 100755 --- a/tools/testing/selftests/user/test_user_copy.sh +++ b/tools/testing/selftests/user/test_user_copy.sh @@ -1,4 +1,5 @@  #!/bin/sh +# SPDX-License-Identifier: GPL-2.0  # Runs copy_to/from_user infrastructure using test_user_copy kernel module  if /sbin/modprobe -q test_user_copy; then diff --git a/tools/testing/selftests/vDSO/Makefile b/tools/testing/selftests/vDSO/Makefile index 706b68b1c372..3d5a62ff7d31 100644 --- a/tools/testing/selftests/vDSO/Makefile +++ b/tools/testing/selftests/vDSO/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  ifndef CROSS_COMPILE  CFLAGS := -std=gnu99  CFLAGS_vdso_standalone_test_x86 := -nostdlib -fno-asynchronous-unwind-tables -fno-stack-protector diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile index cbb29e41ef2b..e49eca1915f8 100644 --- a/tools/testing/selftests/vm/Makefile +++ b/tools/testing/selftests/vm/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # Makefile for vm selftests  ifndef OUTPUT diff --git a/tools/testing/selftests/vm/compaction_test.c b/tools/testing/selftests/vm/compaction_test.c index 6d1437f895b8..a65b016d4c13 100644 --- a/tools/testing/selftests/vm/compaction_test.c +++ b/tools/testing/selftests/vm/compaction_test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   *   * A test for the patch "Allow compaction of unevictable pages". diff --git a/tools/testing/selftests/vm/hugepage-mmap.c b/tools/testing/selftests/vm/hugepage-mmap.c index a10f310d2362..93f9e7b81331 100644 --- a/tools/testing/selftests/vm/hugepage-mmap.c +++ b/tools/testing/selftests/vm/hugepage-mmap.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * hugepage-mmap:   * diff --git a/tools/testing/selftests/vm/hugepage-shm.c b/tools/testing/selftests/vm/hugepage-shm.c index 0d0ef4fc0c04..e2527f32005b 100644 --- a/tools/testing/selftests/vm/hugepage-shm.c +++ b/tools/testing/selftests/vm/hugepage-shm.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * hugepage-shm:   * diff --git a/tools/testing/selftests/vm/map_hugetlb.c b/tools/testing/selftests/vm/map_hugetlb.c index 77687ab59f77..9b777fa95f09 100644 --- a/tools/testing/selftests/vm/map_hugetlb.c +++ b/tools/testing/selftests/vm/map_hugetlb.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Example of using hugepage memory in a user application using the mmap   * system call with MAP_HUGETLB flag.  Before running this program make diff --git a/tools/testing/selftests/vm/mlock-random-test.c b/tools/testing/selftests/vm/mlock-random-test.c index 83de4f58d262..ff4d72eb74b9 100644 --- a/tools/testing/selftests/vm/mlock-random-test.c +++ b/tools/testing/selftests/vm/mlock-random-test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * It tests the mlock/mlock2() when they are invoked   * on randomly memory region. diff --git a/tools/testing/selftests/vm/mlock2-tests.c b/tools/testing/selftests/vm/mlock2-tests.c index e5dbc87b4297..4997b9222cfa 100644 --- a/tools/testing/selftests/vm/mlock2-tests.c +++ b/tools/testing/selftests/vm/mlock2-tests.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE  #include <sys/mman.h>  #include <stdint.h> diff --git a/tools/testing/selftests/vm/mlock2.h b/tools/testing/selftests/vm/mlock2.h index 7ee062929d3e..2a6e76c226bc 100644 --- a/tools/testing/selftests/vm/mlock2.h +++ b/tools/testing/selftests/vm/mlock2.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #include <syscall.h>  #include <errno.h>  #include <stdio.h> diff --git a/tools/testing/selftests/vm/on-fault-limit.c b/tools/testing/selftests/vm/on-fault-limit.c index 7f96a5c2e292..634d87dfb2a4 100644 --- a/tools/testing/selftests/vm/on-fault-limit.c +++ b/tools/testing/selftests/vm/on-fault-limit.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <sys/mman.h>  #include <stdio.h>  #include <unistd.h> diff --git a/tools/testing/selftests/vm/run_vmtests b/tools/testing/selftests/vm/run_vmtests index 07548a1fa901..cc826326de87 100755 --- a/tools/testing/selftests/vm/run_vmtests +++ b/tools/testing/selftests/vm/run_vmtests @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  #please run as root  #we need 256M, below is the size in kB diff --git a/tools/testing/selftests/vm/thuge-gen.c b/tools/testing/selftests/vm/thuge-gen.c index 88a2ab535e01..361ef7192cc6 100644 --- a/tools/testing/selftests/vm/thuge-gen.c +++ b/tools/testing/selftests/vm/thuge-gen.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* Test selecting other page sizes for mmap/shmget.     Before running this huge pages for each huge page size must have been diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c index a2c53a3d223d..de2f9ec8a87f 100644 --- a/tools/testing/selftests/vm/userfaultfd.c +++ b/tools/testing/selftests/vm/userfaultfd.c @@ -397,7 +397,7 @@ static void retry_copy_page(int ufd, struct uffdio_copy *uffdio_copy,  	}  } -static int copy_page(int ufd, unsigned long offset) +static int __copy_page(int ufd, unsigned long offset, bool retry)  {  	struct uffdio_copy uffdio_copy; @@ -418,7 +418,7 @@ static int copy_page(int ufd, unsigned long offset)  		fprintf(stderr, "UFFDIO_COPY unexpected copy %Ld\n",  			uffdio_copy.copy), exit(1);  	} else { -		if (test_uffdio_copy_eexist) { +		if (test_uffdio_copy_eexist && retry) {  			test_uffdio_copy_eexist = false;  			retry_copy_page(ufd, &uffdio_copy, offset);  		} @@ -427,6 +427,16 @@ static int copy_page(int ufd, unsigned long offset)  	return 0;  } +static int copy_page_retry(int ufd, unsigned long offset) +{ +	return __copy_page(ufd, offset, true); +} + +static int copy_page(int ufd, unsigned long offset) +{ +	return __copy_page(ufd, offset, false); +} +  static void *uffd_poll_thread(void *arg)  {  	unsigned long cpu = (unsigned long) arg; @@ -544,7 +554,7 @@ static void *background_thread(void *arg)  	for (page_nr = cpu * nr_pages_per_cpu;  	     page_nr < (cpu+1) * nr_pages_per_cpu;  	     page_nr++) -		copy_page(uffd, page_nr * page_size); +		copy_page_retry(uffd, page_nr * page_size);  	return NULL;  } @@ -779,7 +789,7 @@ static void retry_uffdio_zeropage(int ufd,  	}  } -static int uffdio_zeropage(int ufd, unsigned long offset) +static int __uffdio_zeropage(int ufd, unsigned long offset, bool retry)  {  	struct uffdio_zeropage uffdio_zeropage;  	int ret; @@ -814,7 +824,7 @@ static int uffdio_zeropage(int ufd, unsigned long offset)  			fprintf(stderr, "UFFDIO_ZEROPAGE unexpected %Ld\n",  				uffdio_zeropage.zeropage), exit(1);  		} else { -			if (test_uffdio_zeropage_eexist) { +			if (test_uffdio_zeropage_eexist && retry) {  				test_uffdio_zeropage_eexist = false;  				retry_uffdio_zeropage(ufd, &uffdio_zeropage,  						      offset); @@ -830,6 +840,11 @@ static int uffdio_zeropage(int ufd, unsigned long offset)  	return 0;  } +static int uffdio_zeropage(int ufd, unsigned long offset) +{ +	return __uffdio_zeropage(ufd, offset, false); +} +  /* exercise UFFDIO_ZEROPAGE */  static int userfaultfd_zeropage_test(void)  { diff --git a/tools/testing/selftests/watchdog/Makefile b/tools/testing/selftests/watchdog/Makefile index f863c664e3d1..6b5598b55252 100644 --- a/tools/testing/selftests/watchdog/Makefile +++ b/tools/testing/selftests/watchdog/Makefile @@ -1,8 +1,4 @@ -TEST_PROGS := watchdog-test - -all: $(TEST_PROGS) +# SPDX-License-Identifier: GPL-2.0 +TEST_GEN_PROGS := watchdog-test  include ../lib.mk - -clean: -	rm -fr $(TEST_PROGS) diff --git a/tools/testing/selftests/watchdog/watchdog-test.c b/tools/testing/selftests/watchdog/watchdog-test.c index a1391be2dc1e..6e290874b70e 100644 --- a/tools/testing/selftests/watchdog/watchdog-test.c +++ b/tools/testing/selftests/watchdog/watchdog-test.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Watchdog Driver Test Program   */ diff --git a/tools/testing/selftests/x86/Makefile b/tools/testing/selftests/x86/Makefile index 97f187e2663f..7b1adeee4b0f 100644 --- a/tools/testing/selftests/x86/Makefile +++ b/tools/testing/selftests/x86/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  all:  include ../lib.mk @@ -20,7 +21,7 @@ BINARIES_64 := $(TARGETS_C_64BIT_ALL:%=%_64)  BINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32))  BINARIES_64 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_64)) -CFLAGS := -O2 -g -std=gnu99 -pthread -Wall +CFLAGS := -O2 -g -std=gnu99 -pthread -Wall -no-pie  UNAME_M := $(shell uname -m)  CAN_BUILD_I386 := $(shell ./check_cc.sh $(CC) trivial_32bit_program.c -m32) diff --git a/tools/testing/selftests/x86/ioperm.c b/tools/testing/selftests/x86/ioperm.c index b77313ba2ab1..01de41c1b725 100644 --- a/tools/testing/selftests/x86/ioperm.c +++ b/tools/testing/selftests/x86/ioperm.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * ioperm.c - Test case for ioperm(2)   * Copyright (c) 2015 Andrew Lutomirski diff --git a/tools/testing/selftests/x86/iopl.c b/tools/testing/selftests/x86/iopl.c index c496ca97bc18..6aa27f34644c 100644 --- a/tools/testing/selftests/x86/iopl.c +++ b/tools/testing/selftests/x86/iopl.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * iopl.c - Test case for a Linux on Xen 64-bit bug   * Copyright (c) 2015 Andrew Lutomirski diff --git a/tools/testing/selftests/x86/ldt_gdt.c b/tools/testing/selftests/x86/ldt_gdt.c index b9a22f18566a..961e3ee26c27 100644 --- a/tools/testing/selftests/x86/ldt_gdt.c +++ b/tools/testing/selftests/x86/ldt_gdt.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * ldt_gdt.c - Test cases for LDT and GDT access   * Copyright (c) 2015 Andrew Lutomirski diff --git a/tools/testing/selftests/x86/mpx-debug.h b/tools/testing/selftests/x86/mpx-debug.h index 9230981f2e12..7546eba7f17a 100644 --- a/tools/testing/selftests/x86/mpx-debug.h +++ b/tools/testing/selftests/x86/mpx-debug.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _MPX_DEBUG_H  #define _MPX_DEBUG_H diff --git a/tools/testing/selftests/x86/mpx-dig.c b/tools/testing/selftests/x86/mpx-dig.c index ce85356d7e2e..c13607ef5c11 100644 --- a/tools/testing/selftests/x86/mpx-dig.c +++ b/tools/testing/selftests/x86/mpx-dig.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Written by Dave Hansen <[email protected]>   */ diff --git a/tools/testing/selftests/x86/mpx-hw.h b/tools/testing/selftests/x86/mpx-hw.h index 093c190178a9..3f0093911f03 100644 --- a/tools/testing/selftests/x86/mpx-hw.h +++ b/tools/testing/selftests/x86/mpx-hw.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _MPX_HW_H  #define _MPX_HW_H diff --git a/tools/testing/selftests/x86/mpx-mm.h b/tools/testing/selftests/x86/mpx-mm.h index af706a5398f7..6dbdd66b8242 100644 --- a/tools/testing/selftests/x86/mpx-mm.h +++ b/tools/testing/selftests/x86/mpx-mm.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _MPX_MM_H  #define _MPX_MM_H diff --git a/tools/testing/selftests/x86/pkey-helpers.h b/tools/testing/selftests/x86/pkey-helpers.h index b20293956eec..3818f25391c2 100644 --- a/tools/testing/selftests/x86/pkey-helpers.h +++ b/tools/testing/selftests/x86/pkey-helpers.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _PKEYS_HELPER_H  #define _PKEYS_HELPER_H  #define _GNU_SOURCE diff --git a/tools/testing/selftests/x86/protection_keys.c b/tools/testing/selftests/x86/protection_keys.c index 23927845518d..555e43ca846b 100644 --- a/tools/testing/selftests/x86/protection_keys.c +++ b/tools/testing/selftests/x86/protection_keys.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Tests x86 Memory Protection Keys (see Documentation/x86/protection-keys.txt)   * diff --git a/tools/testing/selftests/x86/ptrace_syscall.c b/tools/testing/selftests/x86/ptrace_syscall.c index eaea92439708..1ae1c5a7392e 100644 --- a/tools/testing/selftests/x86/ptrace_syscall.c +++ b/tools/testing/selftests/x86/ptrace_syscall.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #define _GNU_SOURCE  #include <sys/ptrace.h> diff --git a/tools/testing/selftests/x86/raw_syscall_helper_32.S b/tools/testing/selftests/x86/raw_syscall_helper_32.S index 534e71e35c6a..94410fa2b5ed 100644 --- a/tools/testing/selftests/x86/raw_syscall_helper_32.S +++ b/tools/testing/selftests/x86/raw_syscall_helper_32.S @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  .global sys32_helper  sys32_helper:  	/* Args: syscall_args_32*, function pointer */ diff --git a/tools/testing/selftests/x86/test_FCMOV.c b/tools/testing/selftests/x86/test_FCMOV.c index 4adcca0c80c4..6b5036fbb735 100644 --- a/tools/testing/selftests/x86/test_FCMOV.c +++ b/tools/testing/selftests/x86/test_FCMOV.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #undef _GNU_SOURCE  #define _GNU_SOURCE 1  #undef __USE_GNU diff --git a/tools/testing/selftests/x86/test_FCOMI.c b/tools/testing/selftests/x86/test_FCOMI.c index db4933e31af9..aec6692c6dcf 100644 --- a/tools/testing/selftests/x86/test_FCOMI.c +++ b/tools/testing/selftests/x86/test_FCOMI.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #undef _GNU_SOURCE  #define _GNU_SOURCE 1  #undef __USE_GNU diff --git a/tools/testing/selftests/x86/test_FISTTP.c b/tools/testing/selftests/x86/test_FISTTP.c index b8e61a047f6b..09789c0ce3e9 100644 --- a/tools/testing/selftests/x86/test_FISTTP.c +++ b/tools/testing/selftests/x86/test_FISTTP.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #undef _GNU_SOURCE  #define _GNU_SOURCE 1  #undef __USE_GNU diff --git a/tools/testing/selftests/x86/test_vdso.c b/tools/testing/selftests/x86/test_vdso.c index 65d7a2bf7e14..29973cde06d3 100644 --- a/tools/testing/selftests/x86/test_vdso.c +++ b/tools/testing/selftests/x86/test_vdso.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * ldt_gdt.c - Test cases for LDT and GDT access   * Copyright (c) 2011-2015 Andrew Lutomirski diff --git a/tools/testing/selftests/zram/Makefile b/tools/testing/selftests/zram/Makefile index c3a87e5f9d36..7f78eb1b59cb 100644 --- a/tools/testing/selftests/zram/Makefile +++ b/tools/testing/selftests/zram/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  all:  TEST_PROGS := zram.sh diff --git a/tools/testing/selftests/zram/zram.sh b/tools/testing/selftests/zram/zram.sh index 683a292e3290..754de7da426a 100755 --- a/tools/testing/selftests/zram/zram.sh +++ b/tools/testing/selftests/zram/zram.sh @@ -1,4 +1,5 @@  #!/bin/bash +# SPDX-License-Identifier: GPL-2.0  TCID="zram.sh"  . ./zram_lib.sh |