mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
On x86, there is a set of instructions used to save and restore register state collectively known as the XSAVE architecture. There are about a dozen different features managed with XSAVE. The protection keys register, PKRU, is one of those features. The hardware optimizes XSAVE by tracking when the state has not changed from its initial (init) state. In this case, it can avoid the cost of writing state to memory (it would usually just be a bunch of 0's). When the pkey register is 0x0 the hardware optionally choose to track the register as being in the init state (optimize away the writes). AMD CPUs do this more aggressively compared to Intel. On x86, PKRU is rarely in its (very permissive) init state. Instead, the value defaults to something very restrictive. It is not surprising that bugs have popped up in the rare cases when PKRU reaches its init state. Add a protection key selftest which gets the protection keys register into its init state in a way that should work on Intel and AMD. Then, do a bunch of pkey register reads to watch for inadvertent changes. This adds "-mxsave" to CFLAGS for all the x86 vm selftests in order to allow use of the XSAVE instruction __builtin functions. This will make the builtins available on all of the vm selftests, but is expected to be harmless. Link: https://lkml.kernel.org/r/20210611164202.1849B712@viggo.jf.intel.com Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Cc: Ram Pai <linuxram@us.ibm.com> Cc: Sandipan Das <sandipan@linux.ibm.com> Cc: Florian Weimer <fweimer@redhat.com> Cc: "Desnes A. Nunes do Rosario" <desnesn@linux.vnet.ibm.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Thiago Jung Bauermann <bauerman@linux.ibm.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Michal Hocko <mhocko@kernel.org> Cc: Michal Suchanek <msuchanek@suse.de> Cc: Shuah Khan <shuah@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
160 lines
4.7 KiB
Makefile
160 lines
4.7 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
# Makefile for vm selftests
|
|
|
|
include local_config.mk
|
|
|
|
uname_M := $(shell uname -m 2>/dev/null || echo not)
|
|
MACHINE ?= $(shell echo $(uname_M) | sed -e 's/aarch64.*/arm64/' -e 's/ppc64.*/ppc64/')
|
|
|
|
# Without this, failed build products remain, with up-to-date timestamps,
|
|
# thus tricking Make (and you!) into believing that All Is Well, in subsequent
|
|
# make invocations:
|
|
.DELETE_ON_ERROR:
|
|
|
|
# Avoid accidental wrong builds, due to built-in rules working just a little
|
|
# bit too well--but not quite as well as required for our situation here.
|
|
#
|
|
# In other words, "make userfaultfd" is supposed to fail to build at all,
|
|
# because this Makefile only supports either "make" (all), or "make /full/path".
|
|
# However, the built-in rules, if not suppressed, will pick up CFLAGS and the
|
|
# initial LDLIBS (but not the target-specific LDLIBS, because those are only
|
|
# set for the full path target!). This causes it to get pretty far into building
|
|
# things despite using incorrect values such as an *occasionally* incomplete
|
|
# LDLIBS.
|
|
MAKEFLAGS += --no-builtin-rules
|
|
|
|
CFLAGS = -Wall -I ../../../../usr/include $(EXTRA_CFLAGS)
|
|
LDLIBS = -lrt -lpthread
|
|
TEST_GEN_FILES = compaction_test
|
|
TEST_GEN_FILES += gup_test
|
|
TEST_GEN_FILES += hmm-tests
|
|
TEST_GEN_FILES += hugepage-mmap
|
|
TEST_GEN_FILES += hugepage-shm
|
|
TEST_GEN_FILES += khugepaged
|
|
TEST_GEN_FILES += madv_populate
|
|
TEST_GEN_FILES += map_fixed_noreplace
|
|
TEST_GEN_FILES += map_hugetlb
|
|
TEST_GEN_FILES += map_populate
|
|
TEST_GEN_FILES += mlock-random-test
|
|
TEST_GEN_FILES += mlock2-tests
|
|
TEST_GEN_FILES += mremap_dontunmap
|
|
TEST_GEN_FILES += mremap_test
|
|
TEST_GEN_FILES += on-fault-limit
|
|
TEST_GEN_FILES += thuge-gen
|
|
TEST_GEN_FILES += transhuge-stress
|
|
TEST_GEN_FILES += userfaultfd
|
|
TEST_GEN_FILES += split_huge_page_test
|
|
|
|
ifeq ($(MACHINE),x86_64)
|
|
CAN_BUILD_I386 := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_32bit_program.c -m32)
|
|
CAN_BUILD_X86_64 := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_64bit_program.c)
|
|
CAN_BUILD_WITH_NOPIE := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_program.c -no-pie)
|
|
|
|
TARGETS := protection_keys
|
|
BINARIES_32 := $(TARGETS:%=%_32)
|
|
BINARIES_64 := $(TARGETS:%=%_64)
|
|
|
|
ifeq ($(CAN_BUILD_WITH_NOPIE),1)
|
|
CFLAGS += -no-pie
|
|
endif
|
|
|
|
ifeq ($(CAN_BUILD_I386),1)
|
|
TEST_GEN_FILES += $(BINARIES_32)
|
|
endif
|
|
|
|
ifeq ($(CAN_BUILD_X86_64),1)
|
|
TEST_GEN_FILES += $(BINARIES_64)
|
|
endif
|
|
else
|
|
|
|
ifneq (,$(findstring $(MACHINE),ppc64))
|
|
TEST_GEN_FILES += protection_keys
|
|
endif
|
|
|
|
endif
|
|
|
|
ifneq (,$(filter $(MACHINE),arm64 ia64 mips64 parisc64 ppc64 riscv64 s390x sh64 sparc64 x86_64))
|
|
TEST_GEN_FILES += va_128TBswitch
|
|
TEST_GEN_FILES += virtual_address_range
|
|
TEST_GEN_FILES += write_to_hugetlbfs
|
|
endif
|
|
|
|
TEST_PROGS := run_vmtests.sh
|
|
|
|
TEST_FILES := test_vmalloc.sh
|
|
|
|
KSFT_KHDR_INSTALL := 1
|
|
include ../lib.mk
|
|
|
|
ifeq ($(MACHINE),x86_64)
|
|
BINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32))
|
|
BINARIES_64 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_64))
|
|
|
|
define gen-target-rule-32
|
|
$(1) $(1)_32: $(OUTPUT)/$(1)_32
|
|
.PHONY: $(1) $(1)_32
|
|
endef
|
|
|
|
define gen-target-rule-64
|
|
$(1) $(1)_64: $(OUTPUT)/$(1)_64
|
|
.PHONY: $(1) $(1)_64
|
|
endef
|
|
|
|
ifeq ($(CAN_BUILD_I386),1)
|
|
$(BINARIES_32): CFLAGS += -m32 -mxsave
|
|
$(BINARIES_32): LDLIBS += -lrt -ldl -lm
|
|
$(BINARIES_32): $(OUTPUT)/%_32: %.c
|
|
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(notdir $^) $(LDLIBS) -o $@
|
|
$(foreach t,$(TARGETS),$(eval $(call gen-target-rule-32,$(t))))
|
|
endif
|
|
|
|
ifeq ($(CAN_BUILD_X86_64),1)
|
|
$(BINARIES_64): CFLAGS += -m64 -mxsave
|
|
$(BINARIES_64): LDLIBS += -lrt -ldl
|
|
$(BINARIES_64): $(OUTPUT)/%_64: %.c
|
|
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(notdir $^) $(LDLIBS) -o $@
|
|
$(foreach t,$(TARGETS),$(eval $(call gen-target-rule-64,$(t))))
|
|
endif
|
|
|
|
# x86_64 users should be encouraged to install 32-bit libraries
|
|
ifeq ($(CAN_BUILD_I386)$(CAN_BUILD_X86_64),01)
|
|
all: warn_32bit_failure
|
|
|
|
warn_32bit_failure:
|
|
@echo "Warning: you seem to have a broken 32-bit build" 2>&1; \
|
|
echo "environment. This will reduce test coverage of 64-bit" 2>&1; \
|
|
echo "kernels. If you are using a Debian-like distribution," 2>&1; \
|
|
echo "try:"; 2>&1; \
|
|
echo ""; \
|
|
echo " apt-get install gcc-multilib libc6-i386 libc6-dev-i386"; \
|
|
echo ""; \
|
|
echo "If you are using a Fedora-like distribution, try:"; \
|
|
echo ""; \
|
|
echo " yum install glibc-devel.*i686"; \
|
|
exit 0;
|
|
endif
|
|
endif
|
|
|
|
$(OUTPUT)/mlock-random-test: LDLIBS += -lcap
|
|
|
|
$(OUTPUT)/gup_test: ../../../../mm/gup_test.h
|
|
|
|
$(OUTPUT)/hmm-tests: local_config.h
|
|
|
|
# HMM_EXTRA_LIBS may get set in local_config.mk, or it may be left empty.
|
|
$(OUTPUT)/hmm-tests: LDLIBS += $(HMM_EXTRA_LIBS)
|
|
|
|
local_config.mk local_config.h: check_config.sh
|
|
/bin/sh ./check_config.sh $(CC)
|
|
|
|
EXTRA_CLEAN += local_config.mk local_config.h
|
|
|
|
ifeq ($(HMM_EXTRA_LIBS),)
|
|
all: warn_missing_hugelibs
|
|
|
|
warn_missing_hugelibs:
|
|
@echo ; \
|
|
echo "Warning: missing libhugetlbfs support. Some HMM tests will be skipped." ; \
|
|
echo
|
|
endif
|