|
Message-Id: <20181207124803.10828-11-ahmedsoliman@mena.vt.edu> Date: Fri, 7 Dec 2018 14:48:03 +0200 From: Ahmed Abd El Mawgood <ahmedsoliman@...a.vt.edu> To: Paolo Bonzini <pbonzini@...hat.com>, rkrcmar@...hat.com, Jonathan Corbet <corbet@....net>, Thomas Gleixner <tglx@...utronix.de>, Ingo Molnar <mingo@...hat.com>, Borislav Petkov <bp@...en8.de>, hpa@...or.com, x86@...nel.org, kvm@...r.kernel.org, linux-doc@...r.kernel.org, linux-kernel@...r.kernel.org, ahmedsoliman0x666@...il.com, ovich00@...il.com, kernel-hardening@...ts.openwall.com, nigel.edwards@....com, Boris Lukashev <blukashev@...pervictus.com>, Igor Stoppa <igor.stoppa@...il.com> Cc: Ahmed Abd El Mawgood <ahmedsoliman@...a.vt.edu> Subject: [PATCH 10/10] KVM: Log ROE violations in system log Signed-off-by: Ahmed Abd El Mawgood <ahmedsoliman@...a.vt.edu> --- virt/kvm/kvm_main.c | 5 +++++ virt/kvm/roe.c | 14 ++++++++++++++ virt/kvm/roe_generic.h | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index c3a21d3bc8..661933053f 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1870,6 +1870,7 @@ static u64 roe_gfn_to_hva(struct kvm_memory_slot *slot, gfn_t gfn, int offset, addr = __gfn_to_hva_many(slot, gfn, NULL, false); return addr; } + static int __kvm_write_guest_page(struct kvm_memory_slot *memslot, gfn_t gfn, const void *data, int offset, int len) { @@ -1877,6 +1878,10 @@ static int __kvm_write_guest_page(struct kvm_memory_slot *memslot, gfn_t gfn, unsigned long addr; addr = roe_gfn_to_hva(memslot, gfn, offset, len); + if (gfn_is_full_roe(memslot, gfn) || + kvm_roe_check_range(memslot, gfn, offset, len)) + kvm_warning_roe_violation((gfn << PAGE_SHIFT) + offset, data, + len); if (kvm_is_error_hva(addr)) return -EFAULT; r = __copy_to_user((void __user *)addr + offset, data, len); diff --git a/virt/kvm/roe.c b/virt/kvm/roe.c index 6555838f0c..36b85fb303 100644 --- a/virt/kvm/roe.c +++ b/virt/kvm/roe.c @@ -76,6 +76,20 @@ void kvm_roe_free(struct kvm_memory_slot *slot) kvfree(slot->prot_list); } +void kvm_warning_roe_violation(u64 addr, const void *data, int len) +{ + int i; + const char *d = data; + char *buf = kvmalloc(len * 3 + 1, GFP_KERNEL); + + for (i = 0; i < len; i++) + sprintf(buf+3*i, " %02x", d[i]); + pr_warn("ROE violation:\n"); + pr_warn("\tAttempt to write %d bytes at address 0x%08llx\n", len, addr); + pr_warn("\tData: %s\n", buf); + kvfree(buf); +} + static void kvm_roe_protect_slot(struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn, u64 npages, bool partial) { diff --git a/virt/kvm/roe_generic.h b/virt/kvm/roe_generic.h index f1ce4a8aec..8c191362cd 100644 --- a/virt/kvm/roe_generic.h +++ b/virt/kvm/roe_generic.h @@ -14,5 +14,5 @@ void kvm_roe_free(struct kvm_memory_slot *slot); int kvm_roe_init(struct kvm_memory_slot *slot); bool kvm_roe_check_range(struct kvm_memory_slot *slot, gfn_t gfn, int offset, int len); - +void kvm_warning_roe_violation(u64 addr, const void *data, int len); #endif -- 2.19.2
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.