From: George Popescu <georgepope@xxxxxxxxxx> The data from __ubsan_handle_builtin_unreachable is passed to the buffer and printed inside the kernel by its symmetric handler. Signed-off-by: George Popescu <georgepope@xxxxxxxxxx> --- arch/arm64/include/asm/kvm_ubsan.h | 5 ++++- arch/arm64/kvm/hyp/nvhe/ubsan.c | 12 +++++++++++- arch/arm64/kvm/kvm_ubsan_buffer.c | 3 +++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/arch/arm64/include/asm/kvm_ubsan.h b/arch/arm64/include/asm/kvm_ubsan.h index 575881e0bd5f..7fd0d0dfbd82 100644 --- a/arch/arm64/include/asm/kvm_ubsan.h +++ b/arch/arm64/include/asm/kvm_ubsan.h @@ -20,10 +20,12 @@ struct ubsan_values { struct kvm_ubsan_info { enum { UBSAN_NONE, - UBSAN_OUT_OF_BOUNDS + UBSAN_OUT_OF_BOUNDS, + UBSAN_UNREACHABLE_DATA } type; union { struct out_of_bounds_data out_of_bounds_data; + struct unreachable_data unreachable_data; }; union { struct ubsan_values u_val; @@ -32,3 +34,4 @@ struct kvm_ubsan_info { #endif void __ubsan_handle_out_of_bounds(void *_data, void *index); +void __ubsan_handle_builtin_unreachable(void *_data); diff --git a/arch/arm64/kvm/hyp/nvhe/ubsan.c b/arch/arm64/kvm/hyp/nvhe/ubsan.c index b2d3404f6215..9497e7f7f397 100644 --- a/arch/arm64/kvm/hyp/nvhe/ubsan.c +++ b/arch/arm64/kvm/hyp/nvhe/ubsan.c @@ -58,6 +58,16 @@ void __ubsan_handle_out_of_bounds(void *_data, void *index) void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs) {} -void __ubsan_handle_builtin_unreachable(void *_data) {} +void __ubsan_handle_builtin_unreachable(void *_data) +{ + struct kvm_ubsan_info *slot; + struct unreachable_data *data = _data; + + slot = kvm_ubsan_buffer_next_slot(); + if (slot) { + slot->type = UBSAN_UNREACHABLE_DATA; + slot->unreachable_data = *data; + } +} void __ubsan_handle_load_invalid_value(void *_data, void *val) {} diff --git a/arch/arm64/kvm/kvm_ubsan_buffer.c b/arch/arm64/kvm/kvm_ubsan_buffer.c index ce796bdd027e..f66cc5f7878e 100644 --- a/arch/arm64/kvm/kvm_ubsan_buffer.c +++ b/arch/arm64/kvm/kvm_ubsan_buffer.c @@ -25,6 +25,9 @@ void __kvm_check_ubsan_data(struct kvm_ubsan_info *slot) __ubsan_handle_out_of_bounds(&slot->out_of_bounds_data, slot->u_val.lval); break; + case UBSAN_UNREACHABLE_DATA: + __ubsan_handle_builtin_unreachable(&slot->unreachable_data); + break; } } -- 2.28.0.618.gf4bc123cb7-goog