[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200914172750.852684-1-georgepope@google.com>
Date: Mon, 14 Sep 2020 17:27:36 +0000
From: George-Aurelian Popescu <georgepope@...gle.com>
To: maz@...nel.org, catalin.marinas@....com, will@...nel.org,
masahiroy@...nel.org, michal.lkml@...kovi.net
Cc: linux-arm-kernel@...ts.infradead.org, kvmarm@...ts.cs.columbia.edu,
linux-kernel@...r.kernel.org, linux-kbuild@...r.kernel.org,
clang-built-linux@...glegroups.com, james.morse@....com,
julien.thierry.kdev@...il.com, suzuki.poulose@....com,
natechancellor@...il.com, ndesaulniers@...gle.com,
dbrazdil@...gle.com, broonie@...nel.org, maskray@...gle.com,
ascull@...gle.com, keescook@...omium.org,
akpm@...ux-foundation.org, dvyukov@...gle.com, elver@...gle.com,
tglx@...utronix.de, arnd@...db.de,
George-Aurelian Popescu <georgepope@...gle.com>
Subject: [PATCH 00/14] UBSan Enablement for hyp/nVHE code
The main problem solved is logging from hyp/nVHE. Because the nVHE code is
independent from the Linux kernel the logging mechanisms aren’t working.
For this purpose a generic kvm_debug_buffer is designed. It is composed
from a statically allocated array and a writing index and comes with a set
of macros to facilitate it’s usage. To avoid concurrency problems between
cores, the kvm_debug_buffer is defined per_cpu. The buffer is checked every
time when the code returns from an hvc call, by modifying the kvm_call_hyp
and kvm_call_hyp_ret macros. The buffer’s writing index is reseted to zero
inside of the el1_sync entry.
Since UBSan’s handlers are living inside the kernel, they can not be called
inside hyp/nVHE. To enable UBSan new handlers had to be defined there. To
store the data from the handler, the kvm_ubsan_buff is defined. It can store
logging data from the handlers in a new defined struct called struct
kvm_ubsan_info. Each handler has to encapsulate it’s data inside the new
struct and write it into the buffer. The kvm_debug_buffer.c file is
responsible for decapsulating the data and calling the kernel handlers.
To check if UBSan works correctly inside hyp/nVHE the last patch comes
with a test mechanism, that calls UBSan when the hyp is initialized.
George Popescu (14):
KVM: arm64: Enable UBSan instrumentation in nVHE hyp code
KVM: arm64: Define a macro for storing a value inside a per_cpu
variable
KVM: arm64: Add support for creating and checking a logging buffer
inside hyp/nVHE
KVM: arm64: Add support for buffer usage
KVM: arm64: Define a buffer that can pass UBSan data from hyp/nVHE to
kernel
Fix CFLAGS for UBSAN_BOUNDS on Clang
KVM: arm64: Enable UBSAN_BOUNDS for the both the kernel and hyp/nVHE
KVM: arm64: Enable UBsan check for unreachable code inside hyp/nVHE
code
KVM: arm64: Enable shift out of bounds undefined behaviour check for
hyp/nVHE
KVM: arm64: __ubsan_handle_load_invalid_value hyp/nVHE implementation.
KVM: arm64: Detect type mismatch undefined behaviour from hyp/nVHE
code
KVM: arm64: Detect arithmetic overflow is inside hyp/nVHE.
KVM: arm64: Enable the CONFIG_TEST UBSan for PKVM.
DO NOT MERGE: Enable configs to test the patch series
arch/arm64/include/asm/kvm_asm.h | 8 ++
arch/arm64/include/asm/kvm_debug_buffer.h | 61 ++++++++
arch/arm64/include/asm/kvm_host.h | 12 ++
arch/arm64/include/asm/kvm_ubsan.h | 53 +++++++
arch/arm64/kvm/Kconfig | 3 +
arch/arm64/kvm/Makefile | 4 +
arch/arm64/kvm/arm.c | 46 +++++-
arch/arm64/kvm/hyp/hyp-entry.S | 6 +-
arch/arm64/kvm/hyp/nvhe/Makefile | 5 +-
arch/arm64/kvm/hyp/nvhe/ubsan.c | 164 ++++++++++++++++++++++
arch/arm64/kvm/hyp/nvhe/ubsan_test.c | 115 +++++++++++++++
arch/arm64/kvm/kvm_ubsan_buffer.c | 75 ++++++++++
lib/Kconfig.ubsan | 5 +-
scripts/Makefile.ubsan | 9 +-
14 files changed, 561 insertions(+), 5 deletions(-)
create mode 100644 arch/arm64/include/asm/kvm_debug_buffer.h
create mode 100644 arch/arm64/include/asm/kvm_ubsan.h
create mode 100644 arch/arm64/kvm/hyp/nvhe/ubsan.c
create mode 100644 arch/arm64/kvm/hyp/nvhe/ubsan_test.c
create mode 100644 arch/arm64/kvm/kvm_ubsan_buffer.c
--
2.28.0.618.gf4bc123cb7-goog
Powered by blists - more mailing lists