From 9f02a84af7bab154e19a844e2f3535fa1e83674e Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 29 May 2016 14:42:40 -0700 Subject: [PATCH] 3.14-stable patches added patches: arm-arm64-kvm-enforce-break-before-make-on-stage-2-page-tables.patch --- ...k-before-make-on-stage-2-page-tables.patch | 63 +++++++++++++++++++ queue-3.14/series | 1 + queue-4.4/series | 8 +++ queue-4.5/series | 7 +++ queue-4.6/series | 7 +++ 5 files changed, 86 insertions(+) create mode 100644 queue-3.14/arm-arm64-kvm-enforce-break-before-make-on-stage-2-page-tables.patch create mode 100644 queue-4.6/series diff --git a/queue-3.14/arm-arm64-kvm-enforce-break-before-make-on-stage-2-page-tables.patch b/queue-3.14/arm-arm64-kvm-enforce-break-before-make-on-stage-2-page-tables.patch new file mode 100644 index 00000000000..a32cb814e66 --- /dev/null +++ b/queue-3.14/arm-arm64-kvm-enforce-break-before-make-on-stage-2-page-tables.patch @@ -0,0 +1,63 @@ +From d4b9e0790aa764c0b01e18d4e8d33e93ba36d51f Mon Sep 17 00:00:00 2001 +From: Marc Zyngier +Date: Thu, 28 Apr 2016 16:16:31 +0100 +Subject: arm/arm64: KVM: Enforce Break-Before-Make on Stage-2 page tables + +From: Marc Zyngier + +commit d4b9e0790aa764c0b01e18d4e8d33e93ba36d51f upstream. + +The ARM architecture mandates that when changing a page table entry +from a valid entry to another valid entry, an invalid entry is first +written, TLB invalidated, and only then the new entry being written. + +The current code doesn't respect this, directly writing the new +entry and only then invalidating TLBs. Let's fix it up. + +Reported-by: Christoffer Dall +Signed-off-by: Marc Zyngier +Signed-off-by: Christoffer Dall +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm/kvm/mmu.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +--- a/arch/arm/kvm/mmu.c ++++ b/arch/arm/kvm/mmu.c +@@ -682,11 +682,14 @@ static int stage2_set_pmd_huge(struct kv + VM_BUG_ON(pmd_present(*pmd) && pmd_pfn(*pmd) != pmd_pfn(*new_pmd)); + + old_pmd = *pmd; +- kvm_set_pmd(pmd, *new_pmd); +- if (pmd_present(old_pmd)) ++ if (pmd_present(old_pmd)) { ++ pmd_clear(pmd); + kvm_tlb_flush_vmid_ipa(kvm, addr); +- else ++ } else { + get_page(virt_to_page(pmd)); ++ } ++ ++ kvm_set_pmd(pmd, *new_pmd); + return 0; + } + +@@ -723,12 +726,14 @@ static int stage2_set_pte(struct kvm *kv + + /* Create 2nd stage page table mapping - Level 3 */ + old_pte = *pte; +- kvm_set_pte(pte, *new_pte); +- if (pte_present(old_pte)) ++ if (pte_present(old_pte)) { ++ kvm_set_pte(pte, __pte(0)); + kvm_tlb_flush_vmid_ipa(kvm, addr); +- else ++ } else { + get_page(virt_to_page(pte)); ++ } + ++ kvm_set_pte(pte, *new_pte); + return 0; + } + diff --git a/queue-3.14/series b/queue-3.14/series index 19ebce93146..9ed5a051f3f 100644 --- a/queue-3.14/series +++ b/queue-3.14/series @@ -1 +1,2 @@ btrfs-don-t-use-src-fd-for-printk.patch +arm-arm64-kvm-enforce-break-before-make-on-stage-2-page-tables.patch diff --git a/queue-4.4/series b/queue-4.4/series index 7cbc19d4c15..3dc9c542cde 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -2,3 +2,11 @@ btrfs-don-t-use-src-fd-for-printk.patch perf-x86-intel-pt-generate-pmi-in-the-stop-region-as-well.patch perf-core-fix-perf_event_open-vs.-execve-race.patch perf-test-fix-build-of-bpf-and-llvm-on-older-glibc-libraries.patch +ext4-iterate-over-buffer-heads-correctly-in-move_extent_per_page.patch +arm64-fix-typo-in-the-pmdp_huge_get_and_clear-definition.patch +arm64-ensure-pmd_present-returns-false-after-pmd_mknotpresent.patch +arm64-implement-ptep_set_access_flags-for-hardware-af-dbm.patch +arm64-implement-pmdp_set_access_flags-for-hardware-af-dbm.patch +arm64-cpuinfo-missing-null-terminator-in-compat_hwcap_str.patch +arm-arm64-kvm-enforce-break-before-make-on-stage-2-page-tables.patch +kvm-arm64-fix-ec-field-in-inject_abt64.patch diff --git a/queue-4.5/series b/queue-4.5/series index 2583666e830..c867fa6bd84 100644 --- a/queue-4.5/series +++ b/queue-4.5/series @@ -1,2 +1,9 @@ perf-x86-intel-pt-generate-pmi-in-the-stop-region-as-well.patch perf-core-fix-perf_event_open-vs.-execve-race.patch +arm64-fix-typo-in-the-pmdp_huge_get_and_clear-definition.patch +arm64-ensure-pmd_present-returns-false-after-pmd_mknotpresent.patch +arm64-implement-ptep_set_access_flags-for-hardware-af-dbm.patch +arm64-implement-pmdp_set_access_flags-for-hardware-af-dbm.patch +arm64-cpuinfo-missing-null-terminator-in-compat_hwcap_str.patch +arm-arm64-kvm-enforce-break-before-make-on-stage-2-page-tables.patch +kvm-arm64-fix-ec-field-in-inject_abt64.patch diff --git a/queue-4.6/series b/queue-4.6/series new file mode 100644 index 00000000000..c27f6226642 --- /dev/null +++ b/queue-4.6/series @@ -0,0 +1,7 @@ +arm64-fix-typo-in-the-pmdp_huge_get_and_clear-definition.patch +arm64-ensure-pmd_present-returns-false-after-pmd_mknotpresent.patch +arm64-implement-ptep_set_access_flags-for-hardware-af-dbm.patch +arm64-implement-pmdp_set_access_flags-for-hardware-af-dbm.patch +arm64-cpuinfo-missing-null-terminator-in-compat_hwcap_str.patch +arm-arm64-kvm-enforce-break-before-make-on-stage-2-page-tables.patch +kvm-arm64-fix-ec-field-in-inject_abt64.patch -- 2.47.3