Merge 5.6-rc5 into driver-core-next
We need the driver core and debugfs changes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -24,6 +24,8 @@ KunitResult = namedtuple('KunitResult', ['status','result'])
|
||||
|
||||
KunitRequest = namedtuple('KunitRequest', ['raw_output','timeout', 'jobs', 'build_dir', 'defconfig'])
|
||||
|
||||
KernelDirectoryPath = sys.argv[0].split('tools/testing/kunit/')[0]
|
||||
|
||||
class KunitStatus(Enum):
|
||||
SUCCESS = auto()
|
||||
CONFIG_FAILURE = auto()
|
||||
@@ -35,6 +37,13 @@ def create_default_kunitconfig():
|
||||
shutil.copyfile('arch/um/configs/kunit_defconfig',
|
||||
kunit_kernel.kunitconfig_path)
|
||||
|
||||
def get_kernel_root_path():
|
||||
parts = sys.argv[0] if not __file__ else __file__
|
||||
parts = os.path.realpath(parts).split('tools/testing/kunit')
|
||||
if len(parts) != 2:
|
||||
sys.exit(1)
|
||||
return parts[0]
|
||||
|
||||
def run_tests(linux: kunit_kernel.LinuxSourceTree,
|
||||
request: KunitRequest) -> KunitResult:
|
||||
config_start = time.time()
|
||||
@@ -114,6 +123,9 @@ def main(argv, linux=None):
|
||||
cli_args = parser.parse_args(argv)
|
||||
|
||||
if cli_args.subcommand == 'run':
|
||||
if get_kernel_root_path():
|
||||
os.chdir(get_kernel_root_path())
|
||||
|
||||
if cli_args.build_dir:
|
||||
if not os.path.exists(cli_args.build_dir):
|
||||
os.mkdir(cli_args.build_dir)
|
||||
|
@@ -93,6 +93,20 @@ class LinuxSourceTree(object):
|
||||
return False
|
||||
return True
|
||||
|
||||
def validate_config(self, build_dir):
|
||||
kconfig_path = get_kconfig_path(build_dir)
|
||||
validated_kconfig = kunit_config.Kconfig()
|
||||
validated_kconfig.read_from_file(kconfig_path)
|
||||
if not self._kconfig.is_subset_of(validated_kconfig):
|
||||
invalid = self._kconfig.entries() - validated_kconfig.entries()
|
||||
message = 'Provided Kconfig is not contained in validated .config. Following fields found in kunitconfig, ' \
|
||||
'but not in .config: %s' % (
|
||||
', '.join([str(e) for e in invalid])
|
||||
)
|
||||
logging.error(message)
|
||||
return False
|
||||
return True
|
||||
|
||||
def build_config(self, build_dir):
|
||||
kconfig_path = get_kconfig_path(build_dir)
|
||||
if build_dir and not os.path.exists(build_dir):
|
||||
@@ -103,12 +117,7 @@ class LinuxSourceTree(object):
|
||||
except ConfigError as e:
|
||||
logging.error(e)
|
||||
return False
|
||||
validated_kconfig = kunit_config.Kconfig()
|
||||
validated_kconfig.read_from_file(kconfig_path)
|
||||
if not self._kconfig.is_subset_of(validated_kconfig):
|
||||
logging.error('Provided Kconfig is not contained in validated .config!')
|
||||
return False
|
||||
return True
|
||||
return self.validate_config(build_dir)
|
||||
|
||||
def build_reconfig(self, build_dir):
|
||||
"""Creates a new .config if it is not a subset of the .kunitconfig."""
|
||||
@@ -133,12 +142,7 @@ class LinuxSourceTree(object):
|
||||
except (ConfigError, BuildError) as e:
|
||||
logging.error(e)
|
||||
return False
|
||||
used_kconfig = kunit_config.Kconfig()
|
||||
used_kconfig.read_from_file(get_kconfig_path(build_dir))
|
||||
if not self._kconfig.is_subset_of(used_kconfig):
|
||||
logging.error('Provided Kconfig is not contained in final config!')
|
||||
return False
|
||||
return True
|
||||
return self.validate_config(build_dir)
|
||||
|
||||
def run_kernel(self, args=[], timeout=None, build_dir=''):
|
||||
args.extend(['mem=256M'])
|
||||
|
@@ -77,6 +77,12 @@ ifneq ($(SKIP_TARGETS),)
|
||||
override TARGETS := $(TMP)
|
||||
endif
|
||||
|
||||
# User can set FORCE_TARGETS to 1 to require all targets to be successfully
|
||||
# built; make will fail if any of the targets cannot be built. If
|
||||
# FORCE_TARGETS is not set (the default), make will succeed if at least one
|
||||
# of the targets gets built.
|
||||
FORCE_TARGETS ?=
|
||||
|
||||
# Clear LDFLAGS and MAKEFLAGS if called from main
|
||||
# Makefile to avoid test build failures when test
|
||||
# Makefile doesn't have explicit build rules.
|
||||
@@ -151,7 +157,8 @@ all: khdr
|
||||
for TARGET in $(TARGETS); do \
|
||||
BUILD_TARGET=$$BUILD/$$TARGET; \
|
||||
mkdir $$BUILD_TARGET -p; \
|
||||
$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET; \
|
||||
$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET \
|
||||
$(if $(FORCE_TARGETS),|| exit); \
|
||||
ret=$$((ret * $$?)); \
|
||||
done; exit $$ret;
|
||||
|
||||
@@ -205,7 +212,8 @@ ifdef INSTALL_PATH
|
||||
@ret=1; \
|
||||
for TARGET in $(TARGETS); do \
|
||||
BUILD_TARGET=$$BUILD/$$TARGET; \
|
||||
$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET INSTALL_PATH=$(INSTALL_PATH)/$$TARGET install; \
|
||||
$(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET INSTALL_PATH=$(INSTALL_PATH)/$$TARGET install \
|
||||
$(if $(FORCE_TARGETS),|| exit); \
|
||||
ret=$$((ret * $$?)); \
|
||||
done; exit $$ret;
|
||||
|
||||
|
@@ -506,8 +506,10 @@ static void test_syncookie(int type, sa_family_t family)
|
||||
.pass_on_failure = 0,
|
||||
};
|
||||
|
||||
if (type != SOCK_STREAM)
|
||||
if (type != SOCK_STREAM) {
|
||||
test__skip();
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* +1 for TCP-SYN and
|
||||
@@ -822,8 +824,10 @@ void test_select_reuseport(void)
|
||||
goto out;
|
||||
|
||||
saved_tcp_fo = read_int_sysctl(TCP_FO_SYSCTL);
|
||||
if (saved_tcp_fo < 0)
|
||||
goto out;
|
||||
saved_tcp_syncookie = read_int_sysctl(TCP_SYNCOOKIE_SYSCTL);
|
||||
if (saved_tcp_syncookie < 0 || saved_tcp_syncookie < 0)
|
||||
if (saved_tcp_syncookie < 0)
|
||||
goto out;
|
||||
|
||||
if (enable_fastopen())
|
||||
|
@@ -3,6 +3,11 @@
|
||||
|
||||
#include "test_progs.h"
|
||||
|
||||
#define TCP_REPAIR 19 /* TCP sock is under repair right now */
|
||||
|
||||
#define TCP_REPAIR_ON 1
|
||||
#define TCP_REPAIR_OFF_NO_WP -1 /* Turn off without window probes */
|
||||
|
||||
static int connected_socket_v4(void)
|
||||
{
|
||||
struct sockaddr_in addr = {
|
||||
|
@@ -2,7 +2,7 @@
|
||||
all:
|
||||
|
||||
TEST_PROGS := ftracetest
|
||||
TEST_FILES := test.d
|
||||
TEST_FILES := test.d settings
|
||||
EXTRA_CLEAN := $(OUTPUT)/logs/*
|
||||
|
||||
include ../lib.mk
|
||||
|
@@ -1,6 +1,7 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# description: ftrace - function pid filters
|
||||
# flags: instance
|
||||
|
||||
# Make sure that function pid matching filter works.
|
||||
# Also test it on an instance directory
|
||||
@@ -96,13 +97,6 @@ do_test() {
|
||||
}
|
||||
|
||||
do_test
|
||||
|
||||
mkdir instances/foo
|
||||
cd instances/foo
|
||||
do_test
|
||||
cd ../../
|
||||
rmdir instances/foo
|
||||
|
||||
do_reset
|
||||
|
||||
exit 0
|
||||
|
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
INCLUDES := -I../include -I../../
|
||||
CFLAGS := $(CFLAGS) -g -O2 -Wall -D_GNU_SOURCE -pthread $(INCLUDES)
|
||||
LDFLAGS := $(LDFLAGS) -pthread -lrt
|
||||
LDLIBS := -lpthread -lrt
|
||||
|
||||
HEADERS := \
|
||||
../include/futextest.h \
|
||||
|
@@ -8,7 +8,7 @@ KSFT_KHDR_INSTALL := 1
|
||||
UNAME_M := $(shell uname -m)
|
||||
|
||||
LIBKVM = lib/assert.c lib/elf.c lib/io.c lib/kvm_util.c lib/sparsebit.c
|
||||
LIBKVM_x86_64 = lib/x86_64/processor.c lib/x86_64/vmx.c lib/x86_64/ucall.c
|
||||
LIBKVM_x86_64 = lib/x86_64/processor.c lib/x86_64/vmx.c lib/x86_64/svm.c lib/x86_64/ucall.c
|
||||
LIBKVM_aarch64 = lib/aarch64/processor.c lib/aarch64/ucall.c
|
||||
LIBKVM_s390x = lib/s390x/processor.c lib/s390x/ucall.c
|
||||
|
||||
@@ -26,6 +26,7 @@ TEST_GEN_PROGS_x86_64 += x86_64/vmx_dirty_log_test
|
||||
TEST_GEN_PROGS_x86_64 += x86_64/vmx_set_nested_state_test
|
||||
TEST_GEN_PROGS_x86_64 += x86_64/vmx_tsc_adjust_test
|
||||
TEST_GEN_PROGS_x86_64 += x86_64/xss_msr_test
|
||||
TEST_GEN_PROGS_x86_64 += x86_64/svm_vmcall_test
|
||||
TEST_GEN_PROGS_x86_64 += clear_dirty_log_test
|
||||
TEST_GEN_PROGS_x86_64 += dirty_log_test
|
||||
TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus
|
||||
|
@@ -36,24 +36,24 @@
|
||||
#define X86_CR4_SMAP (1ul << 21)
|
||||
#define X86_CR4_PKE (1ul << 22)
|
||||
|
||||
/* The enum values match the intruction encoding of each register */
|
||||
enum x86_register {
|
||||
RAX = 0,
|
||||
RCX,
|
||||
RDX,
|
||||
RBX,
|
||||
RSP,
|
||||
RBP,
|
||||
RSI,
|
||||
RDI,
|
||||
R8,
|
||||
R9,
|
||||
R10,
|
||||
R11,
|
||||
R12,
|
||||
R13,
|
||||
R14,
|
||||
R15,
|
||||
/* General Registers in 64-Bit Mode */
|
||||
struct gpr64_regs {
|
||||
u64 rax;
|
||||
u64 rcx;
|
||||
u64 rdx;
|
||||
u64 rbx;
|
||||
u64 rsp;
|
||||
u64 rbp;
|
||||
u64 rsi;
|
||||
u64 rdi;
|
||||
u64 r8;
|
||||
u64 r9;
|
||||
u64 r10;
|
||||
u64 r11;
|
||||
u64 r12;
|
||||
u64 r13;
|
||||
u64 r14;
|
||||
u64 r15;
|
||||
};
|
||||
|
||||
struct desc64 {
|
||||
@@ -220,20 +220,20 @@ static inline void set_cr4(uint64_t val)
|
||||
__asm__ __volatile__("mov %0, %%cr4" : : "r" (val) : "memory");
|
||||
}
|
||||
|
||||
static inline uint64_t get_gdt_base(void)
|
||||
static inline struct desc_ptr get_gdt(void)
|
||||
{
|
||||
struct desc_ptr gdt;
|
||||
__asm__ __volatile__("sgdt %[gdt]"
|
||||
: /* output */ [gdt]"=m"(gdt));
|
||||
return gdt.address;
|
||||
return gdt;
|
||||
}
|
||||
|
||||
static inline uint64_t get_idt_base(void)
|
||||
static inline struct desc_ptr get_idt(void)
|
||||
{
|
||||
struct desc_ptr idt;
|
||||
__asm__ __volatile__("sidt %[idt]"
|
||||
: /* output */ [idt]"=m"(idt));
|
||||
return idt.address;
|
||||
return idt;
|
||||
}
|
||||
|
||||
#define SET_XMM(__var, __xmm) \
|
||||
|
297
tools/testing/selftests/kvm/include/x86_64/svm.h
Normal file
297
tools/testing/selftests/kvm/include/x86_64/svm.h
Normal file
@@ -0,0 +1,297 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* tools/testing/selftests/kvm/include/x86_64/svm.h
|
||||
* This is a copy of arch/x86/include/asm/svm.h
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SELFTEST_KVM_SVM_H
|
||||
#define SELFTEST_KVM_SVM_H
|
||||
|
||||
enum {
|
||||
INTERCEPT_INTR,
|
||||
INTERCEPT_NMI,
|
||||
INTERCEPT_SMI,
|
||||
INTERCEPT_INIT,
|
||||
INTERCEPT_VINTR,
|
||||
INTERCEPT_SELECTIVE_CR0,
|
||||
INTERCEPT_STORE_IDTR,
|
||||
INTERCEPT_STORE_GDTR,
|
||||
INTERCEPT_STORE_LDTR,
|
||||
INTERCEPT_STORE_TR,
|
||||
INTERCEPT_LOAD_IDTR,
|
||||
INTERCEPT_LOAD_GDTR,
|
||||
INTERCEPT_LOAD_LDTR,
|
||||
INTERCEPT_LOAD_TR,
|
||||
INTERCEPT_RDTSC,
|
||||
INTERCEPT_RDPMC,
|
||||
INTERCEPT_PUSHF,
|
||||
INTERCEPT_POPF,
|
||||
INTERCEPT_CPUID,
|
||||
INTERCEPT_RSM,
|
||||
INTERCEPT_IRET,
|
||||
INTERCEPT_INTn,
|
||||
INTERCEPT_INVD,
|
||||
INTERCEPT_PAUSE,
|
||||
INTERCEPT_HLT,
|
||||
INTERCEPT_INVLPG,
|
||||
INTERCEPT_INVLPGA,
|
||||
INTERCEPT_IOIO_PROT,
|
||||
INTERCEPT_MSR_PROT,
|
||||
INTERCEPT_TASK_SWITCH,
|
||||
INTERCEPT_FERR_FREEZE,
|
||||
INTERCEPT_SHUTDOWN,
|
||||
INTERCEPT_VMRUN,
|
||||
INTERCEPT_VMMCALL,
|
||||
INTERCEPT_VMLOAD,
|
||||
INTERCEPT_VMSAVE,
|
||||
INTERCEPT_STGI,
|
||||
INTERCEPT_CLGI,
|
||||
INTERCEPT_SKINIT,
|
||||
INTERCEPT_RDTSCP,
|
||||
INTERCEPT_ICEBP,
|
||||
INTERCEPT_WBINVD,
|
||||
INTERCEPT_MONITOR,
|
||||
INTERCEPT_MWAIT,
|
||||
INTERCEPT_MWAIT_COND,
|
||||
INTERCEPT_XSETBV,
|
||||
INTERCEPT_RDPRU,
|
||||
};
|
||||
|
||||
|
||||
struct __attribute__ ((__packed__)) vmcb_control_area {
|
||||
u32 intercept_cr;
|
||||
u32 intercept_dr;
|
||||
u32 intercept_exceptions;
|
||||
u64 intercept;
|
||||
u8 reserved_1[40];
|
||||
u16 pause_filter_thresh;
|
||||
u16 pause_filter_count;
|
||||
u64 iopm_base_pa;
|
||||
u64 msrpm_base_pa;
|
||||
u64 tsc_offset;
|
||||
u32 asid;
|
||||
u8 tlb_ctl;
|
||||
u8 reserved_2[3];
|
||||
u32 int_ctl;
|
||||
u32 int_vector;
|
||||
u32 int_state;
|
||||
u8 reserved_3[4];
|
||||
u32 exit_code;
|
||||
u32 exit_code_hi;
|
||||
u64 exit_info_1;
|
||||
u64 exit_info_2;
|
||||
u32 exit_int_info;
|
||||
u32 exit_int_info_err;
|
||||
u64 nested_ctl;
|
||||
u64 avic_vapic_bar;
|
||||
u8 reserved_4[8];
|
||||
u32 event_inj;
|
||||
u32 event_inj_err;
|
||||
u64 nested_cr3;
|
||||
u64 virt_ext;
|
||||
u32 clean;
|
||||
u32 reserved_5;
|
||||
u64 next_rip;
|
||||
u8 insn_len;
|
||||
u8 insn_bytes[15];
|
||||
u64 avic_backing_page; /* Offset 0xe0 */
|
||||
u8 reserved_6[8]; /* Offset 0xe8 */
|
||||
u64 avic_logical_id; /* Offset 0xf0 */
|
||||
u64 avic_physical_id; /* Offset 0xf8 */
|
||||
u8 reserved_7[768];
|
||||
};
|
||||
|
||||
|
||||
#define TLB_CONTROL_DO_NOTHING 0
|
||||
#define TLB_CONTROL_FLUSH_ALL_ASID 1
|
||||
#define TLB_CONTROL_FLUSH_ASID 3
|
||||
#define TLB_CONTROL_FLUSH_ASID_LOCAL 7
|
||||
|
||||
#define V_TPR_MASK 0x0f
|
||||
|
||||
#define V_IRQ_SHIFT 8
|
||||
#define V_IRQ_MASK (1 << V_IRQ_SHIFT)
|
||||
|
||||
#define V_GIF_SHIFT 9
|
||||
#define V_GIF_MASK (1 << V_GIF_SHIFT)
|
||||
|
||||
#define V_INTR_PRIO_SHIFT 16
|
||||
#define V_INTR_PRIO_MASK (0x0f << V_INTR_PRIO_SHIFT)
|
||||
|
||||
#define V_IGN_TPR_SHIFT 20
|
||||
#define V_IGN_TPR_MASK (1 << V_IGN_TPR_SHIFT)
|
||||
|
||||
#define V_INTR_MASKING_SHIFT 24
|
||||
#define V_INTR_MASKING_MASK (1 << V_INTR_MASKING_SHIFT)
|
||||
|
||||
#define V_GIF_ENABLE_SHIFT 25
|
||||
#define V_GIF_ENABLE_MASK (1 << V_GIF_ENABLE_SHIFT)
|
||||
|
||||
#define AVIC_ENABLE_SHIFT 31
|
||||
#define AVIC_ENABLE_MASK (1 << AVIC_ENABLE_SHIFT)
|
||||
|
||||
#define LBR_CTL_ENABLE_MASK BIT_ULL(0)
|
||||
#define VIRTUAL_VMLOAD_VMSAVE_ENABLE_MASK BIT_ULL(1)
|
||||
|
||||
#define SVM_INTERRUPT_SHADOW_MASK 1
|
||||
|
||||
#define SVM_IOIO_STR_SHIFT 2
|
||||
#define SVM_IOIO_REP_SHIFT 3
|
||||
#define SVM_IOIO_SIZE_SHIFT 4
|
||||
#define SVM_IOIO_ASIZE_SHIFT 7
|
||||
|
||||
#define SVM_IOIO_TYPE_MASK 1
|
||||
#define SVM_IOIO_STR_MASK (1 << SVM_IOIO_STR_SHIFT)
|
||||
#define SVM_IOIO_REP_MASK (1 << SVM_IOIO_REP_SHIFT)
|
||||
#define SVM_IOIO_SIZE_MASK (7 << SVM_IOIO_SIZE_SHIFT)
|
||||
#define SVM_IOIO_ASIZE_MASK (7 << SVM_IOIO_ASIZE_SHIFT)
|
||||
|
||||
#define SVM_VM_CR_VALID_MASK 0x001fULL
|
||||
#define SVM_VM_CR_SVM_LOCK_MASK 0x0008ULL
|
||||
#define SVM_VM_CR_SVM_DIS_MASK 0x0010ULL
|
||||
|
||||
#define SVM_NESTED_CTL_NP_ENABLE BIT(0)
|
||||
#define SVM_NESTED_CTL_SEV_ENABLE BIT(1)
|
||||
|
||||
struct __attribute__ ((__packed__)) vmcb_seg {
|
||||
u16 selector;
|
||||
u16 attrib;
|
||||
u32 limit;
|
||||
u64 base;
|
||||
};
|
||||
|
||||
struct __attribute__ ((__packed__)) vmcb_save_area {
|
||||
struct vmcb_seg es;
|
||||
struct vmcb_seg cs;
|
||||
struct vmcb_seg ss;
|
||||
struct vmcb_seg ds;
|
||||
struct vmcb_seg fs;
|
||||
struct vmcb_seg gs;
|
||||
struct vmcb_seg gdtr;
|
||||
struct vmcb_seg ldtr;
|
||||
struct vmcb_seg idtr;
|
||||
struct vmcb_seg tr;
|
||||
u8 reserved_1[43];
|
||||
u8 cpl;
|
||||
u8 reserved_2[4];
|
||||
u64 efer;
|
||||
u8 reserved_3[112];
|
||||
u64 cr4;
|
||||
u64 cr3;
|
||||
u64 cr0;
|
||||
u64 dr7;
|
||||
u64 dr6;
|
||||
u64 rflags;
|
||||
u64 rip;
|
||||
u8 reserved_4[88];
|
||||
u64 rsp;
|
||||
u8 reserved_5[24];
|
||||
u64 rax;
|
||||
u64 star;
|
||||
u64 lstar;
|
||||
u64 cstar;
|
||||
u64 sfmask;
|
||||
u64 kernel_gs_base;
|
||||
u64 sysenter_cs;
|
||||
u64 sysenter_esp;
|
||||
u64 sysenter_eip;
|
||||
u64 cr2;
|
||||
u8 reserved_6[32];
|
||||
u64 g_pat;
|
||||
u64 dbgctl;
|
||||
u64 br_from;
|
||||
u64 br_to;
|
||||
u64 last_excp_from;
|
||||
u64 last_excp_to;
|
||||
};
|
||||
|
||||
struct __attribute__ ((__packed__)) vmcb {
|
||||
struct vmcb_control_area control;
|
||||
struct vmcb_save_area save;
|
||||
};
|
||||
|
||||
#define SVM_CPUID_FUNC 0x8000000a
|
||||
|
||||
#define SVM_VM_CR_SVM_DISABLE 4
|
||||
|
||||
#define SVM_SELECTOR_S_SHIFT 4
|
||||
#define SVM_SELECTOR_DPL_SHIFT 5
|
||||
#define SVM_SELECTOR_P_SHIFT 7
|
||||
#define SVM_SELECTOR_AVL_SHIFT 8
|
||||
#define SVM_SELECTOR_L_SHIFT 9
|
||||
#define SVM_SELECTOR_DB_SHIFT 10
|
||||
#define SVM_SELECTOR_G_SHIFT 11
|
||||
|
||||
#define SVM_SELECTOR_TYPE_MASK (0xf)
|
||||
#define SVM_SELECTOR_S_MASK (1 << SVM_SELECTOR_S_SHIFT)
|
||||
#define SVM_SELECTOR_DPL_MASK (3 << SVM_SELECTOR_DPL_SHIFT)
|
||||
#define SVM_SELECTOR_P_MASK (1 << SVM_SELECTOR_P_SHIFT)
|
||||
#define SVM_SELECTOR_AVL_MASK (1 << SVM_SELECTOR_AVL_SHIFT)
|
||||
#define SVM_SELECTOR_L_MASK (1 << SVM_SELECTOR_L_SHIFT)
|
||||
#define SVM_SELECTOR_DB_MASK (1 << SVM_SELECTOR_DB_SHIFT)
|
||||
#define SVM_SELECTOR_G_MASK (1 << SVM_SELECTOR_G_SHIFT)
|
||||
|
||||
#define SVM_SELECTOR_WRITE_MASK (1 << 1)
|
||||
#define SVM_SELECTOR_READ_MASK SVM_SELECTOR_WRITE_MASK
|
||||
#define SVM_SELECTOR_CODE_MASK (1 << 3)
|
||||
|
||||
#define INTERCEPT_CR0_READ 0
|
||||
#define INTERCEPT_CR3_READ 3
|
||||
#define INTERCEPT_CR4_READ 4
|
||||
#define INTERCEPT_CR8_READ 8
|
||||
#define INTERCEPT_CR0_WRITE (16 + 0)
|
||||
#define INTERCEPT_CR3_WRITE (16 + 3)
|
||||
#define INTERCEPT_CR4_WRITE (16 + 4)
|
||||
#define INTERCEPT_CR8_WRITE (16 + 8)
|
||||
|
||||
#define INTERCEPT_DR0_READ 0
|
||||
#define INTERCEPT_DR1_READ 1
|
||||
#define INTERCEPT_DR2_READ 2
|
||||
#define INTERCEPT_DR3_READ 3
|
||||
#define INTERCEPT_DR4_READ 4
|
||||
#define INTERCEPT_DR5_READ 5
|
||||
#define INTERCEPT_DR6_READ 6
|
||||
#define INTERCEPT_DR7_READ 7
|
||||
#define INTERCEPT_DR0_WRITE (16 + 0)
|
||||
#define INTERCEPT_DR1_WRITE (16 + 1)
|
||||
#define INTERCEPT_DR2_WRITE (16 + 2)
|
||||
#define INTERCEPT_DR3_WRITE (16 + 3)
|
||||
#define INTERCEPT_DR4_WRITE (16 + 4)
|
||||
#define INTERCEPT_DR5_WRITE (16 + 5)
|
||||
#define INTERCEPT_DR6_WRITE (16 + 6)
|
||||
#define INTERCEPT_DR7_WRITE (16 + 7)
|
||||
|
||||
#define SVM_EVTINJ_VEC_MASK 0xff
|
||||
|
||||
#define SVM_EVTINJ_TYPE_SHIFT 8
|
||||
#define SVM_EVTINJ_TYPE_MASK (7 << SVM_EVTINJ_TYPE_SHIFT)
|
||||
|
||||
#define SVM_EVTINJ_TYPE_INTR (0 << SVM_EVTINJ_TYPE_SHIFT)
|
||||
#define SVM_EVTINJ_TYPE_NMI (2 << SVM_EVTINJ_TYPE_SHIFT)
|
||||
#define SVM_EVTINJ_TYPE_EXEPT (3 << SVM_EVTINJ_TYPE_SHIFT)
|
||||
#define SVM_EVTINJ_TYPE_SOFT (4 << SVM_EVTINJ_TYPE_SHIFT)
|
||||
|
||||
#define SVM_EVTINJ_VALID (1 << 31)
|
||||
#define SVM_EVTINJ_VALID_ERR (1 << 11)
|
||||
|
||||
#define SVM_EXITINTINFO_VEC_MASK SVM_EVTINJ_VEC_MASK
|
||||
#define SVM_EXITINTINFO_TYPE_MASK SVM_EVTINJ_TYPE_MASK
|
||||
|
||||
#define SVM_EXITINTINFO_TYPE_INTR SVM_EVTINJ_TYPE_INTR
|
||||
#define SVM_EXITINTINFO_TYPE_NMI SVM_EVTINJ_TYPE_NMI
|
||||
#define SVM_EXITINTINFO_TYPE_EXEPT SVM_EVTINJ_TYPE_EXEPT
|
||||
#define SVM_EXITINTINFO_TYPE_SOFT SVM_EVTINJ_TYPE_SOFT
|
||||
|
||||
#define SVM_EXITINTINFO_VALID SVM_EVTINJ_VALID
|
||||
#define SVM_EXITINTINFO_VALID_ERR SVM_EVTINJ_VALID_ERR
|
||||
|
||||
#define SVM_EXITINFOSHIFT_TS_REASON_IRET 36
|
||||
#define SVM_EXITINFOSHIFT_TS_REASON_JMP 38
|
||||
#define SVM_EXITINFOSHIFT_TS_HAS_ERROR_CODE 44
|
||||
|
||||
#define SVM_EXITINFO_REG_MASK 0x0F
|
||||
|
||||
#define SVM_CR0_SELECTIVE_MASK (X86_CR0_TS | X86_CR0_MP)
|
||||
|
||||
#endif /* SELFTEST_KVM_SVM_H */
|
38
tools/testing/selftests/kvm/include/x86_64/svm_util.h
Normal file
38
tools/testing/selftests/kvm/include/x86_64/svm_util.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* tools/testing/selftests/kvm/include/x86_64/svm_utils.h
|
||||
* Header for nested SVM testing
|
||||
*
|
||||
* Copyright (C) 2020, Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#ifndef SELFTEST_KVM_SVM_UTILS_H
|
||||
#define SELFTEST_KVM_SVM_UTILS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "svm.h"
|
||||
#include "processor.h"
|
||||
|
||||
#define CPUID_SVM_BIT 2
|
||||
#define CPUID_SVM BIT_ULL(CPUID_SVM_BIT)
|
||||
|
||||
#define SVM_EXIT_VMMCALL 0x081
|
||||
|
||||
struct svm_test_data {
|
||||
/* VMCB */
|
||||
struct vmcb *vmcb; /* gva */
|
||||
void *vmcb_hva;
|
||||
uint64_t vmcb_gpa;
|
||||
|
||||
/* host state-save area */
|
||||
struct vmcb_save_area *save_area; /* gva */
|
||||
void *save_area_hva;
|
||||
uint64_t save_area_gpa;
|
||||
};
|
||||
|
||||
struct svm_test_data *vcpu_alloc_svm(struct kvm_vm *vm, vm_vaddr_t *p_svm_gva);
|
||||
void generic_svm_setup(struct svm_test_data *svm, void *guest_rip, void *guest_rsp);
|
||||
void run_guest(struct vmcb *vmcb, uint64_t vmcb_gpa);
|
||||
void nested_svm_check_supported(void);
|
||||
|
||||
#endif /* SELFTEST_KVM_SVM_UTILS_H */
|
161
tools/testing/selftests/kvm/lib/x86_64/svm.c
Normal file
161
tools/testing/selftests/kvm/lib/x86_64/svm.c
Normal file
@@ -0,0 +1,161 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* tools/testing/selftests/kvm/lib/x86_64/svm.c
|
||||
* Helpers used for nested SVM testing
|
||||
* Largely inspired from KVM unit test svm.c
|
||||
*
|
||||
* Copyright (C) 2020, Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#include "test_util.h"
|
||||
#include "kvm_util.h"
|
||||
#include "../kvm_util_internal.h"
|
||||
#include "processor.h"
|
||||
#include "svm_util.h"
|
||||
|
||||
struct gpr64_regs guest_regs;
|
||||
u64 rflags;
|
||||
|
||||
/* Allocate memory regions for nested SVM tests.
|
||||
*
|
||||
* Input Args:
|
||||
* vm - The VM to allocate guest-virtual addresses in.
|
||||
*
|
||||
* Output Args:
|
||||
* p_svm_gva - The guest virtual address for the struct svm_test_data.
|
||||
*
|
||||
* Return:
|
||||
* Pointer to structure with the addresses of the SVM areas.
|
||||
*/
|
||||
struct svm_test_data *
|
||||
vcpu_alloc_svm(struct kvm_vm *vm, vm_vaddr_t *p_svm_gva)
|
||||
{
|
||||
vm_vaddr_t svm_gva = vm_vaddr_alloc(vm, getpagesize(),
|
||||
0x10000, 0, 0);
|
||||
struct svm_test_data *svm = addr_gva2hva(vm, svm_gva);
|
||||
|
||||
svm->vmcb = (void *)vm_vaddr_alloc(vm, getpagesize(),
|
||||
0x10000, 0, 0);
|
||||
svm->vmcb_hva = addr_gva2hva(vm, (uintptr_t)svm->vmcb);
|
||||
svm->vmcb_gpa = addr_gva2gpa(vm, (uintptr_t)svm->vmcb);
|
||||
|
||||
svm->save_area = (void *)vm_vaddr_alloc(vm, getpagesize(),
|
||||
0x10000, 0, 0);
|
||||
svm->save_area_hva = addr_gva2hva(vm, (uintptr_t)svm->save_area);
|
||||
svm->save_area_gpa = addr_gva2gpa(vm, (uintptr_t)svm->save_area);
|
||||
|
||||
*p_svm_gva = svm_gva;
|
||||
return svm;
|
||||
}
|
||||
|
||||
static void vmcb_set_seg(struct vmcb_seg *seg, u16 selector,
|
||||
u64 base, u32 limit, u32 attr)
|
||||
{
|
||||
seg->selector = selector;
|
||||
seg->attrib = attr;
|
||||
seg->limit = limit;
|
||||
seg->base = base;
|
||||
}
|
||||
|
||||
void generic_svm_setup(struct svm_test_data *svm, void *guest_rip, void *guest_rsp)
|
||||
{
|
||||
struct vmcb *vmcb = svm->vmcb;
|
||||
uint64_t vmcb_gpa = svm->vmcb_gpa;
|
||||
struct vmcb_save_area *save = &vmcb->save;
|
||||
struct vmcb_control_area *ctrl = &vmcb->control;
|
||||
u32 data_seg_attr = 3 | SVM_SELECTOR_S_MASK | SVM_SELECTOR_P_MASK
|
||||
| SVM_SELECTOR_DB_MASK | SVM_SELECTOR_G_MASK;
|
||||
u32 code_seg_attr = 9 | SVM_SELECTOR_S_MASK | SVM_SELECTOR_P_MASK
|
||||
| SVM_SELECTOR_L_MASK | SVM_SELECTOR_G_MASK;
|
||||
uint64_t efer;
|
||||
|
||||
efer = rdmsr(MSR_EFER);
|
||||
wrmsr(MSR_EFER, efer | EFER_SVME);
|
||||
wrmsr(MSR_VM_HSAVE_PA, svm->save_area_gpa);
|
||||
|
||||
memset(vmcb, 0, sizeof(*vmcb));
|
||||
asm volatile ("vmsave\n\t" : : "a" (vmcb_gpa) : "memory");
|
||||
vmcb_set_seg(&save->es, get_es(), 0, -1U, data_seg_attr);
|
||||
vmcb_set_seg(&save->cs, get_cs(), 0, -1U, code_seg_attr);
|
||||
vmcb_set_seg(&save->ss, get_ss(), 0, -1U, data_seg_attr);
|
||||
vmcb_set_seg(&save->ds, get_ds(), 0, -1U, data_seg_attr);
|
||||
vmcb_set_seg(&save->gdtr, 0, get_gdt().address, get_gdt().size, 0);
|
||||
vmcb_set_seg(&save->idtr, 0, get_idt().address, get_idt().size, 0);
|
||||
|
||||
ctrl->asid = 1;
|
||||
save->cpl = 0;
|
||||
save->efer = rdmsr(MSR_EFER);
|
||||
asm volatile ("mov %%cr4, %0" : "=r"(save->cr4) : : "memory");
|
||||
asm volatile ("mov %%cr3, %0" : "=r"(save->cr3) : : "memory");
|
||||
asm volatile ("mov %%cr0, %0" : "=r"(save->cr0) : : "memory");
|
||||
asm volatile ("mov %%dr7, %0" : "=r"(save->dr7) : : "memory");
|
||||
asm volatile ("mov %%dr6, %0" : "=r"(save->dr6) : : "memory");
|
||||
asm volatile ("mov %%cr2, %0" : "=r"(save->cr2) : : "memory");
|
||||
save->g_pat = rdmsr(MSR_IA32_CR_PAT);
|
||||
save->dbgctl = rdmsr(MSR_IA32_DEBUGCTLMSR);
|
||||
ctrl->intercept = (1ULL << INTERCEPT_VMRUN) |
|
||||
(1ULL << INTERCEPT_VMMCALL);
|
||||
|
||||
vmcb->save.rip = (u64)guest_rip;
|
||||
vmcb->save.rsp = (u64)guest_rsp;
|
||||
guest_regs.rdi = (u64)svm;
|
||||
}
|
||||
|
||||
/*
|
||||
* save/restore 64-bit general registers except rax, rip, rsp
|
||||
* which are directly handed through the VMCB guest processor state
|
||||
*/
|
||||
#define SAVE_GPR_C \
|
||||
"xchg %%rbx, guest_regs+0x20\n\t" \
|
||||
"xchg %%rcx, guest_regs+0x10\n\t" \
|
||||
"xchg %%rdx, guest_regs+0x18\n\t" \
|
||||
"xchg %%rbp, guest_regs+0x30\n\t" \
|
||||
"xchg %%rsi, guest_regs+0x38\n\t" \
|
||||
"xchg %%rdi, guest_regs+0x40\n\t" \
|
||||
"xchg %%r8, guest_regs+0x48\n\t" \
|
||||
"xchg %%r9, guest_regs+0x50\n\t" \
|
||||
"xchg %%r10, guest_regs+0x58\n\t" \
|
||||
"xchg %%r11, guest_regs+0x60\n\t" \
|
||||
"xchg %%r12, guest_regs+0x68\n\t" \
|
||||
"xchg %%r13, guest_regs+0x70\n\t" \
|
||||
"xchg %%r14, guest_regs+0x78\n\t" \
|
||||
"xchg %%r15, guest_regs+0x80\n\t"
|
||||
|
||||
#define LOAD_GPR_C SAVE_GPR_C
|
||||
|
||||
/*
|
||||
* selftests do not use interrupts so we dropped clgi/sti/cli/stgi
|
||||
* for now. registers involved in LOAD/SAVE_GPR_C are eventually
|
||||
* unmodified so they do not need to be in the clobber list.
|
||||
*/
|
||||
void run_guest(struct vmcb *vmcb, uint64_t vmcb_gpa)
|
||||
{
|
||||
asm volatile (
|
||||
"vmload\n\t"
|
||||
"mov rflags, %%r15\n\t" // rflags
|
||||
"mov %%r15, 0x170(%[vmcb])\n\t"
|
||||
"mov guest_regs, %%r15\n\t" // rax
|
||||
"mov %%r15, 0x1f8(%[vmcb])\n\t"
|
||||
LOAD_GPR_C
|
||||
"vmrun\n\t"
|
||||
SAVE_GPR_C
|
||||
"mov 0x170(%[vmcb]), %%r15\n\t" // rflags
|
||||
"mov %%r15, rflags\n\t"
|
||||
"mov 0x1f8(%[vmcb]), %%r15\n\t" // rax
|
||||
"mov %%r15, guest_regs\n\t"
|
||||
"vmsave\n\t"
|
||||
: : [vmcb] "r" (vmcb), [vmcb_gpa] "a" (vmcb_gpa)
|
||||
: "r15", "memory");
|
||||
}
|
||||
|
||||
void nested_svm_check_supported(void)
|
||||
{
|
||||
struct kvm_cpuid_entry2 *entry =
|
||||
kvm_get_supported_cpuid_entry(0x80000001);
|
||||
|
||||
if (!(entry->ecx & CPUID_SVM)) {
|
||||
fprintf(stderr, "nested SVM not enabled, skipping test\n");
|
||||
exit(KSFT_SKIP);
|
||||
}
|
||||
}
|
||||
|
@@ -288,9 +288,9 @@ static inline void init_vmcs_host_state(void)
|
||||
vmwrite(HOST_FS_BASE, rdmsr(MSR_FS_BASE));
|
||||
vmwrite(HOST_GS_BASE, rdmsr(MSR_GS_BASE));
|
||||
vmwrite(HOST_TR_BASE,
|
||||
get_desc64_base((struct desc64 *)(get_gdt_base() + get_tr())));
|
||||
vmwrite(HOST_GDTR_BASE, get_gdt_base());
|
||||
vmwrite(HOST_IDTR_BASE, get_idt_base());
|
||||
get_desc64_base((struct desc64 *)(get_gdt().address + get_tr())));
|
||||
vmwrite(HOST_GDTR_BASE, get_gdt().address);
|
||||
vmwrite(HOST_IDTR_BASE, get_idt().address);
|
||||
vmwrite(HOST_IA32_SYSENTER_ESP, rdmsr(MSR_IA32_SYSENTER_ESP));
|
||||
vmwrite(HOST_IA32_SYSENTER_EIP, rdmsr(MSR_IA32_SYSENTER_EIP));
|
||||
}
|
||||
|
79
tools/testing/selftests/kvm/x86_64/svm_vmcall_test.c
Normal file
79
tools/testing/selftests/kvm/x86_64/svm_vmcall_test.c
Normal file
@@ -0,0 +1,79 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* svm_vmcall_test
|
||||
*
|
||||
* Copyright (C) 2020, Red Hat, Inc.
|
||||
*
|
||||
* Nested SVM testing: VMCALL
|
||||
*/
|
||||
|
||||
#include "test_util.h"
|
||||
#include "kvm_util.h"
|
||||
#include "processor.h"
|
||||
#include "svm_util.h"
|
||||
|
||||
#define VCPU_ID 5
|
||||
|
||||
static struct kvm_vm *vm;
|
||||
|
||||
static void l2_guest_code(struct svm_test_data *svm)
|
||||
{
|
||||
__asm__ __volatile__("vmcall");
|
||||
}
|
||||
|
||||
static void l1_guest_code(struct svm_test_data *svm)
|
||||
{
|
||||
#define L2_GUEST_STACK_SIZE 64
|
||||
unsigned long l2_guest_stack[L2_GUEST_STACK_SIZE];
|
||||
struct vmcb *vmcb = svm->vmcb;
|
||||
|
||||
/* Prepare for L2 execution. */
|
||||
generic_svm_setup(svm, l2_guest_code,
|
||||
&l2_guest_stack[L2_GUEST_STACK_SIZE]);
|
||||
|
||||
run_guest(vmcb, svm->vmcb_gpa);
|
||||
|
||||
GUEST_ASSERT(vmcb->control.exit_code == SVM_EXIT_VMMCALL);
|
||||
GUEST_DONE();
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
vm_vaddr_t svm_gva;
|
||||
|
||||
nested_svm_check_supported();
|
||||
|
||||
vm = vm_create_default(VCPU_ID, 0, (void *) l1_guest_code);
|
||||
vcpu_set_cpuid(vm, VCPU_ID, kvm_get_supported_cpuid());
|
||||
|
||||
vcpu_alloc_svm(vm, &svm_gva);
|
||||
vcpu_args_set(vm, VCPU_ID, 1, svm_gva);
|
||||
|
||||
for (;;) {
|
||||
volatile struct kvm_run *run = vcpu_state(vm, VCPU_ID);
|
||||
struct ucall uc;
|
||||
|
||||
vcpu_run(vm, VCPU_ID);
|
||||
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
|
||||
"Got exit_reason other than KVM_EXIT_IO: %u (%s)\n",
|
||||
run->exit_reason,
|
||||
exit_reason_str(run->exit_reason));
|
||||
|
||||
switch (get_ucall(vm, VCPU_ID, &uc)) {
|
||||
case UCALL_ABORT:
|
||||
TEST_ASSERT(false, "%s",
|
||||
(const char *)uc.args[0]);
|
||||
/* NOT REACHED */
|
||||
case UCALL_SYNC:
|
||||
break;
|
||||
case UCALL_DONE:
|
||||
goto done;
|
||||
default:
|
||||
TEST_ASSERT(false,
|
||||
"Unknown ucall 0x%x.", uc.cmd);
|
||||
}
|
||||
}
|
||||
done:
|
||||
kvm_vm_free(vm);
|
||||
return 0;
|
||||
}
|
@@ -83,17 +83,20 @@ else
|
||||
$(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS))
|
||||
endif
|
||||
|
||||
define INSTALL_SINGLE_RULE
|
||||
$(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH))
|
||||
$(if $(INSTALL_LIST),@echo rsync -a $(INSTALL_LIST) $(INSTALL_PATH)/)
|
||||
$(if $(INSTALL_LIST),@rsync -a $(INSTALL_LIST) $(INSTALL_PATH)/)
|
||||
endef
|
||||
|
||||
define INSTALL_RULE
|
||||
@if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then \
|
||||
mkdir -p ${INSTALL_PATH}; \
|
||||
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_CUSTOM_PROGS)$(TEST_GEN_PROGS_EXTENDED)$(TEST_GEN_FILES)" != "X" ]; then \
|
||||
mkdir -p ${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
|
||||
$(eval INSTALL_LIST = $(TEST_PROGS)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_FILES)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_GEN_PROGS)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_CUSTOM_PROGS)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_GEN_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
|
||||
$(eval INSTALL_LIST = $(TEST_GEN_FILES)) $(INSTALL_SINGLE_RULE)
|
||||
endef
|
||||
|
||||
install: all
|
||||
|
@@ -8,4 +8,6 @@ TEST_PROGS := \
|
||||
test-state.sh \
|
||||
test-ftrace.sh
|
||||
|
||||
TEST_FILES := settings
|
||||
|
||||
include ../lib.mk
|
||||
|
2
tools/testing/selftests/lkdtm/.gitignore
vendored
Normal file
2
tools/testing/selftests/lkdtm/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
*.sh
|
||||
!run.sh
|
@@ -27,5 +27,5 @@ KSFT_KHDR_INSTALL := 1
|
||||
include ../lib.mk
|
||||
|
||||
$(OUTPUT)/reuseport_bpf_numa: LDLIBS += -lnuma
|
||||
$(OUTPUT)/tcp_mmap: LDFLAGS += -lpthread
|
||||
$(OUTPUT)/tcp_inq: LDFLAGS += -lpthread
|
||||
$(OUTPUT)/tcp_mmap: LDLIBS += -lpthread
|
||||
$(OUTPUT)/tcp_inq: LDLIBS += -lpthread
|
||||
|
@@ -910,6 +910,12 @@ ipv6_rt_replace_mpath()
|
||||
check_route6 "2001:db8:104::/64 via 2001:db8:101::3 dev veth1 metric 1024"
|
||||
log_test $? 0 "Multipath with single path via multipath attribute"
|
||||
|
||||
# multipath with dev-only
|
||||
add_initial_route6 "nexthop via 2001:db8:101::2 nexthop via 2001:db8:103::2"
|
||||
run_cmd "$IP -6 ro replace 2001:db8:104::/64 dev veth1"
|
||||
check_route6 "2001:db8:104::/64 dev veth1 metric 1024"
|
||||
log_test $? 0 "Multipath with dev-only"
|
||||
|
||||
# route replace fails - invalid nexthop 1
|
||||
add_initial_route6 "nexthop via 2001:db8:101::2 nexthop via 2001:db8:103::2"
|
||||
run_cmd "$IP -6 ro replace 2001:db8:104::/64 nexthop via 2001:db8:111::3 nexthop via 2001:db8:103::3"
|
||||
|
@@ -63,22 +63,23 @@ test_span_gre_mac()
|
||||
{
|
||||
local tundev=$1; shift
|
||||
local direction=$1; shift
|
||||
local prot=$1; shift
|
||||
local what=$1; shift
|
||||
|
||||
local swp3mac=$(mac_get $swp3)
|
||||
local h3mac=$(mac_get $h3)
|
||||
case "$direction" in
|
||||
ingress) local src_mac=$(mac_get $h1); local dst_mac=$(mac_get $h2)
|
||||
;;
|
||||
egress) local src_mac=$(mac_get $h2); local dst_mac=$(mac_get $h1)
|
||||
;;
|
||||
esac
|
||||
|
||||
RET=0
|
||||
|
||||
mirror_install $swp1 $direction $tundev "matchall $tcflags"
|
||||
tc filter add dev $h3 ingress pref 77 prot $prot \
|
||||
flower ip_proto 0x2f src_mac $swp3mac dst_mac $h3mac \
|
||||
action pass
|
||||
icmp_capture_install h3-${tundev} "src_mac $src_mac dst_mac $dst_mac"
|
||||
|
||||
mirror_test v$h1 192.0.2.1 192.0.2.2 $h3 77 10
|
||||
mirror_test v$h1 192.0.2.1 192.0.2.2 h3-${tundev} 100 10
|
||||
|
||||
tc filter del dev $h3 ingress pref 77
|
||||
icmp_capture_uninstall h3-${tundev}
|
||||
mirror_uninstall $swp1 $direction
|
||||
|
||||
log_test "$direction $what: envelope MAC ($tcflags)"
|
||||
@@ -120,14 +121,14 @@ test_ip6gretap()
|
||||
|
||||
test_gretap_mac()
|
||||
{
|
||||
test_span_gre_mac gt4 ingress ip "mirror to gretap"
|
||||
test_span_gre_mac gt4 egress ip "mirror to gretap"
|
||||
test_span_gre_mac gt4 ingress "mirror to gretap"
|
||||
test_span_gre_mac gt4 egress "mirror to gretap"
|
||||
}
|
||||
|
||||
test_ip6gretap_mac()
|
||||
{
|
||||
test_span_gre_mac gt6 ingress ipv6 "mirror to ip6gretap"
|
||||
test_span_gre_mac gt6 egress ipv6 "mirror to ip6gretap"
|
||||
test_span_gre_mac gt6 ingress "mirror to ip6gretap"
|
||||
test_span_gre_mac gt6 egress "mirror to ip6gretap"
|
||||
}
|
||||
|
||||
test_all()
|
||||
|
@@ -516,9 +516,9 @@ test_tos()
|
||||
RET=0
|
||||
|
||||
tc filter add dev v1 egress pref 77 prot ip \
|
||||
flower ip_tos 0x40 action pass
|
||||
vxlan_ping_test $h1 192.0.2.3 "-Q 0x40" v1 egress 77 10
|
||||
vxlan_ping_test $h1 192.0.2.3 "-Q 0x30" v1 egress 77 0
|
||||
flower ip_tos 0x14 action pass
|
||||
vxlan_ping_test $h1 192.0.2.3 "-Q 0x14" v1 egress 77 10
|
||||
vxlan_ping_test $h1 192.0.2.3 "-Q 0x18" v1 egress 77 0
|
||||
tc filter del dev v1 egress pref 77 prot ip
|
||||
|
||||
log_test "VXLAN: envelope TOS inheritance"
|
||||
|
@@ -8,6 +8,8 @@ TEST_PROGS := mptcp_connect.sh
|
||||
|
||||
TEST_GEN_FILES = mptcp_connect
|
||||
|
||||
TEST_FILES := settings
|
||||
|
||||
EXTRA_CLEAN := *.pcap
|
||||
|
||||
include ../../lib.mk
|
||||
|
@@ -13,11 +13,12 @@
|
||||
KSELFTEST_SKIP=4
|
||||
|
||||
# Available test groups:
|
||||
# - reported_issues: check for issues that were reported in the past
|
||||
# - correctness: check that packets match given entries, and only those
|
||||
# - concurrency: attempt races between insertion, deletion and lookup
|
||||
# - timeout: check that packets match entries until they expire
|
||||
# - performance: estimate matching rate, compare with rbtree and hash baselines
|
||||
TESTS="correctness concurrency timeout"
|
||||
TESTS="reported_issues correctness concurrency timeout"
|
||||
[ "${quicktest}" != "1" ] && TESTS="${TESTS} performance"
|
||||
|
||||
# Set types, defined by TYPE_ variables below
|
||||
@@ -25,6 +26,9 @@ TYPES="net_port port_net net6_port port_proto net6_port_mac net6_port_mac_proto
|
||||
net_port_net net_mac net_mac_icmp net6_mac_icmp net6_port_net6_port
|
||||
net_port_mac_proto_net"
|
||||
|
||||
# Reported bugs, also described by TYPE_ variables below
|
||||
BUGS="flush_remove_add"
|
||||
|
||||
# List of possible paths to pktgen script from kernel tree for performance tests
|
||||
PKTGEN_SCRIPT_PATHS="
|
||||
../../../samples/pktgen/pktgen_bench_xmit_mode_netif_receive.sh
|
||||
@@ -327,6 +331,12 @@ flood_spec ip daddr . tcp dport . meta l4proto . ip saddr
|
||||
perf_duration 0
|
||||
"
|
||||
|
||||
# Definition of tests for bugs reported in the past:
|
||||
# display display text for test report
|
||||
TYPE_flush_remove_add="
|
||||
display Add two elements, flush, re-add
|
||||
"
|
||||
|
||||
# Set template for all tests, types and rules are filled in depending on test
|
||||
set_template='
|
||||
flush ruleset
|
||||
@@ -440,6 +450,8 @@ setup_set() {
|
||||
|
||||
# Check that at least one of the needed tools is available
|
||||
check_tools() {
|
||||
[ -z "${tools}" ] && return 0
|
||||
|
||||
__tools=
|
||||
for tool in ${tools}; do
|
||||
if [ "${tool}" = "nc" ] && [ "${proto}" = "udp6" ] && \
|
||||
@@ -1025,7 +1037,7 @@ format_noconcat() {
|
||||
add() {
|
||||
if ! nft add element inet filter test "${1}"; then
|
||||
err "Failed to add ${1} given ruleset:"
|
||||
err "$(nft list ruleset -a)"
|
||||
err "$(nft -a list ruleset)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
@@ -1045,7 +1057,7 @@ add_perf() {
|
||||
add_perf_norange() {
|
||||
if ! nft add element netdev perf norange "${1}"; then
|
||||
err "Failed to add ${1} given ruleset:"
|
||||
err "$(nft list ruleset -a)"
|
||||
err "$(nft -a list ruleset)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
@@ -1054,7 +1066,7 @@ add_perf_norange() {
|
||||
add_perf_noconcat() {
|
||||
if ! nft add element netdev perf noconcat "${1}"; then
|
||||
err "Failed to add ${1} given ruleset:"
|
||||
err "$(nft list ruleset -a)"
|
||||
err "$(nft -a list ruleset)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
@@ -1063,7 +1075,7 @@ add_perf_noconcat() {
|
||||
del() {
|
||||
if ! nft delete element inet filter test "${1}"; then
|
||||
err "Failed to delete ${1} given ruleset:"
|
||||
err "$(nft list ruleset -a)"
|
||||
err "$(nft -a list ruleset)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
@@ -1134,7 +1146,7 @@ send_match() {
|
||||
err " $(for f in ${src}; do
|
||||
eval format_\$f "${2}"; printf ' '; done)"
|
||||
err "should have matched ruleset:"
|
||||
err "$(nft list ruleset -a)"
|
||||
err "$(nft -a list ruleset)"
|
||||
return 1
|
||||
fi
|
||||
nft reset counter inet filter test >/dev/null
|
||||
@@ -1160,7 +1172,7 @@ send_nomatch() {
|
||||
err " $(for f in ${src}; do
|
||||
eval format_\$f "${2}"; printf ' '; done)"
|
||||
err "should not have matched ruleset:"
|
||||
err "$(nft list ruleset -a)"
|
||||
err "$(nft -a list ruleset)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
@@ -1430,6 +1442,23 @@ test_performance() {
|
||||
kill "${perf_pid}"
|
||||
}
|
||||
|
||||
test_bug_flush_remove_add() {
|
||||
set_cmd='{ set s { type ipv4_addr . inet_service; flags interval; }; }'
|
||||
elem1='{ 10.0.0.1 . 22-25, 10.0.0.1 . 10-20 }'
|
||||
elem2='{ 10.0.0.1 . 10-20, 10.0.0.1 . 22-25 }'
|
||||
for i in `seq 1 100`; do
|
||||
nft add table t ${set_cmd} || return ${KSELFTEST_SKIP}
|
||||
nft add element t s ${elem1} 2>/dev/null || return 1
|
||||
nft flush set t s 2>/dev/null || return 1
|
||||
nft add element t s ${elem2} 2>/dev/null || return 1
|
||||
done
|
||||
nft flush ruleset
|
||||
}
|
||||
|
||||
test_reported_issues() {
|
||||
eval test_bug_"${subtest}"
|
||||
}
|
||||
|
||||
# Run everything in a separate network namespace
|
||||
[ "${1}" != "run" ] && { unshare -n "${0}" run; exit $?; }
|
||||
tmp="$(mktemp)"
|
||||
@@ -1438,9 +1467,15 @@ trap cleanup EXIT
|
||||
# Entry point for test runs
|
||||
passed=0
|
||||
for name in ${TESTS}; do
|
||||
printf "TEST: %s\n" "${name}"
|
||||
for type in ${TYPES}; do
|
||||
eval desc=\$TYPE_"${type}"
|
||||
printf "TEST: %s\n" "$(echo ${name} | tr '_' ' ')"
|
||||
if [ "${name}" = "reported_issues" ]; then
|
||||
SUBTESTS="${BUGS}"
|
||||
else
|
||||
SUBTESTS="${TYPES}"
|
||||
fi
|
||||
|
||||
for subtest in ${SUBTESTS}; do
|
||||
eval desc=\$TYPE_"${subtest}"
|
||||
IFS='
|
||||
'
|
||||
for __line in ${desc}; do
|
||||
|
@@ -46,7 +46,7 @@ int sys_renameat2(int olddirfd, const char *oldpath,
|
||||
|
||||
int touchat(int dfd, const char *path)
|
||||
{
|
||||
int fd = openat(dfd, path, O_CREAT);
|
||||
int fd = openat(dfd, path, O_CREAT, 0700);
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
return fd;
|
||||
|
@@ -230,7 +230,7 @@ void test_openat2_opath_tests(void)
|
||||
{ .name = "[in_root] garbage link to /root",
|
||||
.path = "cheeky/garbageself", .how.resolve = RESOLVE_IN_ROOT,
|
||||
.out.path = "root", .pass = true },
|
||||
{ .name = "[in_root] chainged garbage links to /root",
|
||||
{ .name = "[in_root] chained garbage links to /root",
|
||||
.path = "abscheeky/garbageself", .how.resolve = RESOLVE_IN_ROOT,
|
||||
.out.path = "root", .pass = true },
|
||||
{ .name = "[in_root] relative path to 'root'",
|
||||
|
1
tools/testing/selftests/pidfd/.gitignore
vendored
1
tools/testing/selftests/pidfd/.gitignore
vendored
@@ -2,4 +2,5 @@ pidfd_open_test
|
||||
pidfd_poll_test
|
||||
pidfd_test
|
||||
pidfd_wait
|
||||
pidfd_fdinfo_test
|
||||
pidfd_getfd_test
|
||||
|
@@ -4,7 +4,7 @@ ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),)
|
||||
CLANG_FLAGS += -no-integrated-as
|
||||
endif
|
||||
|
||||
CFLAGS += -O2 -Wall -g -I./ -I../../../../usr/include/ -L./ -Wl,-rpath=./ \
|
||||
CFLAGS += -O2 -Wall -g -I./ -I../../../../usr/include/ -L$(OUTPUT) -Wl,-rpath=./ \
|
||||
$(CLANG_FLAGS)
|
||||
LDLIBS += -lpthread
|
||||
|
||||
@@ -19,6 +19,8 @@ TEST_GEN_PROGS_EXTENDED = librseq.so
|
||||
|
||||
TEST_PROGS = run_param_test.sh
|
||||
|
||||
TEST_FILES := settings
|
||||
|
||||
include ../lib.mk
|
||||
|
||||
$(OUTPUT)/librseq.so: rseq.c rseq.h rseq-*.h
|
||||
|
@@ -1,9 +1,11 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
CFLAGS += -O3 -Wl,-no-as-needed -Wall
|
||||
LDFLAGS += -lrt -lpthread -lm
|
||||
LDLIBS += -lrt -lpthread -lm
|
||||
|
||||
TEST_GEN_PROGS = rtctest
|
||||
|
||||
TEST_GEN_PROGS_EXTENDED = setdate
|
||||
|
||||
TEST_FILES := settings
|
||||
|
||||
include ../lib.mk
|
||||
|
@@ -2,6 +2,6 @@ TEST_GEN_PROGS := timens timerfd timer clock_nanosleep procfs exec
|
||||
TEST_GEN_PROGS_EXTENDED := gettime_perf
|
||||
|
||||
CFLAGS := -Wall -Werror -pthread
|
||||
LDFLAGS := -lrt -ldl
|
||||
LDLIBS := -lrt -ldl
|
||||
|
||||
include ../lib.mk
|
||||
|
@@ -1,8 +1,17 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
|
||||
self.flags = flags
|
||||
|
||||
python -m unittest -v tpm2_tests.SmokeTest
|
||||
python -m unittest -v tpm2_tests.AsyncTest
|
||||
# Kselftest framework requirement - SKIP code is 4.
|
||||
ksft_skip=4
|
||||
|
||||
|
||||
if [ -f /dev/tpm0 ] ; then
|
||||
python -m unittest -v tpm2_tests.SmokeTest
|
||||
python -m unittest -v tpm2_tests.AsyncTest
|
||||
else
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
CLEAR_CMD=$(which tpm2_clear)
|
||||
if [ -n $CLEAR_CMD ]; then
|
||||
|
@@ -1,4 +1,11 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
|
||||
|
||||
python -m unittest -v tpm2_tests.SpaceTest
|
||||
# Kselftest framework requirement - SKIP code is 4.
|
||||
ksft_skip=4
|
||||
|
||||
if [ -f /dev/tpmrm0 ] ; then
|
||||
python -m unittest -v tpm2_tests.SpaceTest
|
||||
else
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
@@ -112,6 +112,17 @@ echo "NOTE: The above hugetlb tests provide minimal coverage. Use"
|
||||
echo " https://github.com/libhugetlbfs/libhugetlbfs.git for"
|
||||
echo " hugetlb regression testing."
|
||||
|
||||
echo "---------------------------"
|
||||
echo "running map_fixed_noreplace"
|
||||
echo "---------------------------"
|
||||
./map_fixed_noreplace
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "[FAIL]"
|
||||
exitcode=1
|
||||
else
|
||||
echo "[PASS]"
|
||||
fi
|
||||
|
||||
echo "-------------------"
|
||||
echo "running userfaultfd"
|
||||
echo "-------------------"
|
||||
@@ -186,6 +197,17 @@ else
|
||||
echo "[PASS]"
|
||||
fi
|
||||
|
||||
echo "-------------------------"
|
||||
echo "running mlock-random-test"
|
||||
echo "-------------------------"
|
||||
./mlock-random-test
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "[FAIL]"
|
||||
exitcode=1
|
||||
else
|
||||
echo "[PASS]"
|
||||
fi
|
||||
|
||||
echo "--------------------"
|
||||
echo "running mlock2-tests"
|
||||
echo "--------------------"
|
||||
@@ -197,6 +219,17 @@ else
|
||||
echo "[PASS]"
|
||||
fi
|
||||
|
||||
echo "-----------------"
|
||||
echo "running thuge-gen"
|
||||
echo "-----------------"
|
||||
./thuge-gen
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "[FAIL]"
|
||||
exitcode=1
|
||||
else
|
||||
echo "[PASS]"
|
||||
fi
|
||||
|
||||
if [ $VADDR64 -ne 0 ]; then
|
||||
echo "-----------------------------"
|
||||
echo "running virtual_address_range"
|
||||
|
@@ -24,6 +24,7 @@
|
||||
set -e
|
||||
|
||||
exec 3>&1
|
||||
export LANG=C
|
||||
export WG_HIDE_KEYS=never
|
||||
netns0="wg-test-$$-0"
|
||||
netns1="wg-test-$$-1"
|
||||
@@ -297,7 +298,17 @@ ip1 -4 rule add table main suppress_prefixlength 0
|
||||
n1 ping -W 1 -c 100 -f 192.168.99.7
|
||||
n1 ping -W 1 -c 100 -f abab::1111
|
||||
|
||||
# Have ns2 NAT into wg0 packets from ns0, but return an icmp error along the right route.
|
||||
n2 iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -d 192.168.241.0/24 -j SNAT --to 192.168.241.2
|
||||
n0 iptables -t filter -A INPUT \! -s 10.0.0.0/24 -i vethrs -j DROP # Manual rpfilter just to be explicit.
|
||||
n2 bash -c 'printf 1 > /proc/sys/net/ipv4/ip_forward'
|
||||
ip0 -4 route add 192.168.241.1 via 10.0.0.100
|
||||
n2 wg set wg0 peer "$pub1" remove
|
||||
[[ $(! n0 ping -W 1 -c 1 192.168.241.1 || false) == *"From 10.0.0.100 icmp_seq=1 Destination Host Unreachable"* ]]
|
||||
|
||||
n0 iptables -t nat -F
|
||||
n0 iptables -t filter -F
|
||||
n2 iptables -t nat -F
|
||||
ip0 link del vethrc
|
||||
ip0 link del vethrs
|
||||
ip1 link del wg0
|
||||
|
@@ -38,19 +38,17 @@ endef
|
||||
define file_download =
|
||||
$(DISTFILES_PATH)/$(1):
|
||||
mkdir -p $(DISTFILES_PATH)
|
||||
flock -x $$@.lock -c '[ -f $$@ ] && exit 0; wget -O $$@.tmp $(MIRROR)$(1) || wget -O $$@.tmp $(2)$(1) || rm -f $$@.tmp'
|
||||
if echo "$(3) $$@.tmp" | sha256sum -c -; then mv $$@.tmp $$@; else rm -f $$@.tmp; exit 71; fi
|
||||
flock -x $$@.lock -c '[ -f $$@ ] && exit 0; wget -O $$@.tmp $(MIRROR)$(1) || wget -O $$@.tmp $(2)$(1) || rm -f $$@.tmp; [ -f $$@.tmp ] || exit 1; if echo "$(3) $$@.tmp" | sha256sum -c -; then mv $$@.tmp $$@; else rm -f $$@.tmp; exit 71; fi'
|
||||
endef
|
||||
|
||||
$(eval $(call tar_download,MUSL,musl,1.1.24,.tar.gz,https://www.musl-libc.org/releases/,1370c9a812b2cf2a7d92802510cca0058cc37e66a7bedd70051f0a34015022a3))
|
||||
$(eval $(call tar_download,LIBMNL,libmnl,1.0.4,.tar.bz2,https://www.netfilter.org/projects/libmnl/files/,171f89699f286a5854b72b91d06e8f8e3683064c5901fb09d954a9ab6f551f81))
|
||||
$(eval $(call tar_download,IPERF,iperf,3.7,.tar.gz,https://downloads.es.net/pub/iperf/,d846040224317caf2f75c843d309a950a7db23f9b44b94688ccbe557d6d1710c))
|
||||
$(eval $(call tar_download,BASH,bash,5.0,.tar.gz,https://ftp.gnu.org/gnu/bash/,b4a80f2ac66170b2913efbfb9f2594f1f76c7b1afd11f799e22035d63077fb4d))
|
||||
$(eval $(call tar_download,IPROUTE2,iproute2,5.4.0,.tar.xz,https://www.kernel.org/pub/linux/utils/net/iproute2/,fe97aa60a0d4c5ac830be18937e18dc3400ca713a33a89ad896ff1e3d46086ae))
|
||||
$(eval $(call tar_download,IPTABLES,iptables,1.8.4,.tar.bz2,https://www.netfilter.org/projects/iptables/files/,993a3a5490a544c2cbf2ef15cf7e7ed21af1845baf228318d5c36ef8827e157c))
|
||||
$(eval $(call tar_download,NMAP,nmap,7.80,.tar.bz2,https://nmap.org/dist/,fcfa5a0e42099e12e4bf7a68ebe6fde05553383a682e816a7ec9256ab4773faa))
|
||||
$(eval $(call tar_download,IPUTILS,iputils,s20190709,.tar.gz,https://github.com/iputils/iputils/archive/s20190709.tar.gz/#,a15720dd741d7538dd2645f9f516d193636ae4300ff7dbc8bfca757bf166490a))
|
||||
$(eval $(call tar_download,WIREGUARD_TOOLS,wireguard-tools,1.0.20191226,.tar.xz,https://git.zx2c4.com/wireguard-tools/snapshot/,aa8af0fdc9872d369d8c890a84dbc2a2466b55795dccd5b47721b2d97644b04f))
|
||||
$(eval $(call tar_download,WIREGUARD_TOOLS,wireguard-tools,1.0.20200206,.tar.xz,https://git.zx2c4.com/wireguard-tools/snapshot/,f5207248c6a3c3e3bfc9ab30b91c1897b00802ed861e1f9faaed873366078c64))
|
||||
|
||||
KERNEL_BUILD_PATH := $(BUILD_PATH)/kernel$(if $(findstring yes,$(DEBUG_KERNEL)),-debug)
|
||||
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
|
||||
@@ -295,21 +293,13 @@ $(IPERF_PATH)/src/iperf3: | $(IPERF_PATH)/.installed $(USERSPACE_DEPS)
|
||||
$(MAKE) -C $(IPERF_PATH)
|
||||
$(STRIP) -s $@
|
||||
|
||||
$(LIBMNL_PATH)/.installed: $(LIBMNL_TAR)
|
||||
flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
|
||||
touch $@
|
||||
|
||||
$(LIBMNL_PATH)/src/.libs/libmnl.a: | $(LIBMNL_PATH)/.installed $(USERSPACE_DEPS)
|
||||
cd $(LIBMNL_PATH) && ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared
|
||||
$(MAKE) -C $(LIBMNL_PATH)
|
||||
sed -i 's:prefix=.*:prefix=$(LIBMNL_PATH):' $(LIBMNL_PATH)/libmnl.pc
|
||||
|
||||
$(WIREGUARD_TOOLS_PATH)/.installed: $(WIREGUARD_TOOLS_TAR)
|
||||
mkdir -p $(BUILD_PATH)
|
||||
flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
|
||||
touch $@
|
||||
|
||||
$(WIREGUARD_TOOLS_PATH)/src/wg: | $(WIREGUARD_TOOLS_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
|
||||
LDFLAGS="$(LDFLAGS) -L$(LIBMNL_PATH)/src/.libs" $(MAKE) -C $(WIREGUARD_TOOLS_PATH)/src LIBMNL_CFLAGS="-I$(LIBMNL_PATH)/include" LIBMNL_LDLIBS="-lmnl" wg
|
||||
$(WIREGUARD_TOOLS_PATH)/src/wg: | $(WIREGUARD_TOOLS_PATH)/.installed $(USERSPACE_DEPS)
|
||||
$(MAKE) -C $(WIREGUARD_TOOLS_PATH)/src wg
|
||||
$(STRIP) -s $@
|
||||
|
||||
$(BUILD_PATH)/init: init.c | $(USERSPACE_DEPS)
|
||||
@@ -340,17 +330,17 @@ $(BASH_PATH)/bash: | $(BASH_PATH)/.installed $(USERSPACE_DEPS)
|
||||
$(IPROUTE2_PATH)/.installed: $(IPROUTE2_TAR)
|
||||
mkdir -p $(BUILD_PATH)
|
||||
flock -s $<.lock tar -C $(BUILD_PATH) -xf $<
|
||||
printf 'CC:=$(CC)\nPKG_CONFIG:=pkg-config\nTC_CONFIG_XT:=n\nTC_CONFIG_ATM:=n\nTC_CONFIG_IPSET:=n\nIP_CONFIG_SETNS:=y\nHAVE_ELF:=n\nHAVE_MNL:=y\nHAVE_BERKELEY_DB:=n\nHAVE_LATEX:=n\nHAVE_PDFLATEX:=n\nCFLAGS+=-DHAVE_SETNS -DHAVE_LIBMNL -I$(LIBMNL_PATH)/include\nLDLIBS+=-lmnl' > $(IPROUTE2_PATH)/config.mk
|
||||
printf 'CC:=$(CC)\nPKG_CONFIG:=pkg-config\nTC_CONFIG_XT:=n\nTC_CONFIG_ATM:=n\nTC_CONFIG_IPSET:=n\nIP_CONFIG_SETNS:=y\nHAVE_ELF:=n\nHAVE_MNL:=n\nHAVE_BERKELEY_DB:=n\nHAVE_LATEX:=n\nHAVE_PDFLATEX:=n\nCFLAGS+=-DHAVE_SETNS\n' > $(IPROUTE2_PATH)/config.mk
|
||||
printf 'lib: snapshot\n\t$$(MAKE) -C lib\nip/ip: lib\n\t$$(MAKE) -C ip ip\nmisc/ss: lib\n\t$$(MAKE) -C misc ss\n' >> $(IPROUTE2_PATH)/Makefile
|
||||
touch $@
|
||||
|
||||
$(IPROUTE2_PATH)/ip/ip: | $(IPROUTE2_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
|
||||
LDFLAGS="$(LDFLAGS) -L$(LIBMNL_PATH)/src/.libs" PKG_CONFIG_LIBDIR="$(LIBMNL_PATH)" $(MAKE) -C $(IPROUTE2_PATH) PREFIX=/ ip/ip
|
||||
$(STRIP) -s $(IPROUTE2_PATH)/ip/ip
|
||||
$(IPROUTE2_PATH)/ip/ip: | $(IPROUTE2_PATH)/.installed $(USERSPACE_DEPS)
|
||||
$(MAKE) -C $(IPROUTE2_PATH) PREFIX=/ ip/ip
|
||||
$(STRIP) -s $@
|
||||
|
||||
$(IPROUTE2_PATH)/misc/ss: | $(IPROUTE2_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
|
||||
LDFLAGS="$(LDFLAGS) -L$(LIBMNL_PATH)/src/.libs" PKG_CONFIG_LIBDIR="$(LIBMNL_PATH)" $(MAKE) -C $(IPROUTE2_PATH) PREFIX=/ misc/ss
|
||||
$(STRIP) -s $(IPROUTE2_PATH)/misc/ss
|
||||
$(IPROUTE2_PATH)/misc/ss: | $(IPROUTE2_PATH)/.installed $(USERSPACE_DEPS)
|
||||
$(MAKE) -C $(IPROUTE2_PATH) PREFIX=/ misc/ss
|
||||
$(STRIP) -s $@
|
||||
|
||||
$(IPTABLES_PATH)/.installed: $(IPTABLES_TAR)
|
||||
mkdir -p $(BUILD_PATH)
|
||||
@@ -358,8 +348,8 @@ $(IPTABLES_PATH)/.installed: $(IPTABLES_TAR)
|
||||
sed -i -e "/nfnetlink=[01]/s:=[01]:=0:" -e "/nfconntrack=[01]/s:=[01]:=0:" $(IPTABLES_PATH)/configure
|
||||
touch $@
|
||||
|
||||
$(IPTABLES_PATH)/iptables/xtables-legacy-multi: | $(IPTABLES_PATH)/.installed $(LIBMNL_PATH)/src/.libs/libmnl.a $(USERSPACE_DEPS)
|
||||
cd $(IPTABLES_PATH) && PKG_CONFIG_LIBDIR="$(LIBMNL_PATH)" ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --disable-nftables --disable-bpf-compiler --disable-nfsynproxy --disable-libipq --with-kernel=$(BUILD_PATH)/include
|
||||
$(IPTABLES_PATH)/iptables/xtables-legacy-multi: | $(IPTABLES_PATH)/.installed $(USERSPACE_DEPS)
|
||||
cd $(IPTABLES_PATH) && ./configure --prefix=/ $(CROSS_COMPILE_FLAG) --enable-static --disable-shared --disable-nftables --disable-bpf-compiler --disable-nfsynproxy --disable-libipq --disable-connlabel --with-kernel=$(BUILD_PATH)/include
|
||||
$(MAKE) -C $(IPTABLES_PATH)
|
||||
$(STRIP) -s $@
|
||||
|
||||
|
Reference in New Issue
Block a user