forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-11 04dd17822334871b23ea2862f7798fb0e0007777
kernel/arch/powerpc/kvm/book3s_pr.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) 2009. SUSE Linux Products GmbH. All rights reserved.
34 *
....@@ -13,10 +14,6 @@
1314 *
1415 * This file is derived from arch/powerpc/kvm/44x.c,
1516 * by Hollis Blanchard <hollisb@us.ibm.com>.
16
- *
17
- * This program is free software; you can redistribute it and/or modify
18
- * it under the terms of the GNU General Public License, version 2, as
19
- * published by the Free Software Foundation.
2017 */
2118
2219 #include <linux/kvm_host.h>
....@@ -93,7 +90,43 @@
9390 kvmppc_set_pc(vcpu, pc | SPLIT_HACK_OFFS);
9491 }
9592
96
-void kvmppc_unfixup_split_real(struct kvm_vcpu *vcpu);
93
+static void kvmppc_unfixup_split_real(struct kvm_vcpu *vcpu)
94
+{
95
+ if (vcpu->arch.hflags & BOOK3S_HFLAG_SPLIT_HACK) {
96
+ ulong pc = kvmppc_get_pc(vcpu);
97
+ ulong lr = kvmppc_get_lr(vcpu);
98
+ if ((pc & SPLIT_HACK_MASK) == SPLIT_HACK_OFFS)
99
+ kvmppc_set_pc(vcpu, pc & ~SPLIT_HACK_MASK);
100
+ if ((lr & SPLIT_HACK_MASK) == SPLIT_HACK_OFFS)
101
+ kvmppc_set_lr(vcpu, lr & ~SPLIT_HACK_MASK);
102
+ vcpu->arch.hflags &= ~BOOK3S_HFLAG_SPLIT_HACK;
103
+ }
104
+}
105
+
106
+static void kvmppc_inject_interrupt_pr(struct kvm_vcpu *vcpu, int vec, u64 srr1_flags)
107
+{
108
+ unsigned long msr, pc, new_msr, new_pc;
109
+
110
+ kvmppc_unfixup_split_real(vcpu);
111
+
112
+ msr = kvmppc_get_msr(vcpu);
113
+ pc = kvmppc_get_pc(vcpu);
114
+ new_msr = vcpu->arch.intr_msr;
115
+ new_pc = to_book3s(vcpu)->hior + vec;
116
+
117
+#ifdef CONFIG_PPC_BOOK3S_64
118
+ /* If transactional, change to suspend mode on IRQ delivery */
119
+ if (MSR_TM_TRANSACTIONAL(msr))
120
+ new_msr |= MSR_TS_S;
121
+ else
122
+ new_msr |= msr & MSR_TS_MASK;
123
+#endif
124
+
125
+ kvmppc_set_srr0(vcpu, pc);
126
+ kvmppc_set_srr1(vcpu, (msr & SRR1_MSR_BITS) | srr1_flags);
127
+ kvmppc_set_pc(vcpu, new_pc);
128
+ kvmppc_set_msr(vcpu, new_msr);
129
+}
97130
98131 static void kvmppc_core_vcpu_load_pr(struct kvm_vcpu *vcpu, int cpu)
99132 {
....@@ -536,7 +569,7 @@
536569 #endif
537570 }
538571
539
-void kvmppc_set_pvr_pr(struct kvm_vcpu *vcpu, u32 pvr)
572
+static void kvmppc_set_pvr_pr(struct kvm_vcpu *vcpu, u32 pvr)
540573 {
541574 u32 host_pvr;
542575
....@@ -587,6 +620,7 @@
587620 case PVR_POWER8:
588621 case PVR_POWER8E:
589622 case PVR_POWER8NVL:
623
+ case PVR_POWER9:
590624 vcpu->arch.hflags |= BOOK3S_HFLAG_MULTI_PGSIZE |
591625 BOOK3S_HFLAG_NEW_TLBIE;
592626 break;
....@@ -666,7 +700,7 @@
666700 return kvm_is_visible_gfn(vcpu->kvm, gpa >> PAGE_SHIFT);
667701 }
668702
669
-int kvmppc_handle_pagefault(struct kvm_run *run, struct kvm_vcpu *vcpu,
703
+static int kvmppc_handle_pagefault(struct kvm_vcpu *vcpu,
670704 ulong eaddr, int vec)
671705 {
672706 bool data = (vec == BOOK3S_INTERRUPT_DATA_STORAGE);
....@@ -706,7 +740,7 @@
706740 (vcpu->arch.hflags & BOOK3S_HFLAG_SPLIT_HACK) &&
707741 ((pte.raddr & SPLIT_HACK_MASK) == SPLIT_HACK_OFFS))
708742 pte.raddr &= ~SPLIT_HACK_MASK;
709
- /* fall through */
743
+ fallthrough;
710744 case MSR_IR:
711745 vcpu->arch.mmu.esid_to_vsid(vcpu, eaddr >> SID_SHIFT, &vsid);
712746
....@@ -761,7 +795,7 @@
761795 /* The guest's PTE is not mapped yet. Map on the host */
762796 if (kvmppc_mmu_map_page(vcpu, &pte, iswrite) == -EIO) {
763797 /* Exit KVM if mapping failed */
764
- run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
798
+ vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
765799 return RESUME_HOST;
766800 }
767801 if (data)
....@@ -774,7 +808,7 @@
774808 vcpu->stat.mmio_exits++;
775809 vcpu->arch.paddr_accessed = pte.raddr;
776810 vcpu->arch.vaddr_accessed = pte.eaddr;
777
- r = kvmppc_emulate_mmio(run, vcpu);
811
+ r = kvmppc_emulate_mmio(vcpu);
778812 if ( r == RESUME_HOST_NV )
779813 r = RESUME_HOST;
780814 }
....@@ -958,7 +992,7 @@
958992 enum emulation_result er = EMULATE_FAIL;
959993
960994 if (!(kvmppc_get_msr(vcpu) & MSR_PR))
961
- er = kvmppc_emulate_instruction(vcpu->run, vcpu);
995
+ er = kvmppc_emulate_instruction(vcpu);
962996
963997 if ((er != EMULATE_DONE) && (er != EMULATE_AGAIN)) {
964998 /* Couldn't emulate, trigger interrupt in guest */
....@@ -1055,8 +1089,7 @@
10551089 }
10561090 }
10571091
1058
-static int kvmppc_exit_pr_progint(struct kvm_run *run, struct kvm_vcpu *vcpu,
1059
- unsigned int exit_nr)
1092
+static int kvmppc_exit_pr_progint(struct kvm_vcpu *vcpu, unsigned int exit_nr)
10601093 {
10611094 enum emulation_result er;
10621095 ulong flags;
....@@ -1090,7 +1123,7 @@
10901123 }
10911124
10921125 vcpu->stat.emulated_inst_exits++;
1093
- er = kvmppc_emulate_instruction(run, vcpu);
1126
+ er = kvmppc_emulate_instruction(vcpu);
10941127 switch (er) {
10951128 case EMULATE_DONE:
10961129 r = RESUME_GUEST_NV;
....@@ -1105,7 +1138,7 @@
11051138 r = RESUME_GUEST;
11061139 break;
11071140 case EMULATE_DO_MMIO:
1108
- run->exit_reason = KVM_EXIT_MMIO;
1141
+ vcpu->run->exit_reason = KVM_EXIT_MMIO;
11091142 r = RESUME_HOST_NV;
11101143 break;
11111144 case EMULATE_EXIT_USER:
....@@ -1118,9 +1151,9 @@
11181151 return r;
11191152 }
11201153
1121
-int kvmppc_handle_exit_pr(struct kvm_run *run, struct kvm_vcpu *vcpu,
1122
- unsigned int exit_nr)
1154
+int kvmppc_handle_exit_pr(struct kvm_vcpu *vcpu, unsigned int exit_nr)
11231155 {
1156
+ struct kvm_run *run = vcpu->run;
11241157 int r = RESUME_HOST;
11251158 int s;
11261159
....@@ -1164,7 +1197,7 @@
11641197 /* only care about PTEG not found errors, but leave NX alone */
11651198 if (shadow_srr1 & 0x40000000) {
11661199 int idx = srcu_read_lock(&vcpu->kvm->srcu);
1167
- r = kvmppc_handle_pagefault(run, vcpu, kvmppc_get_pc(vcpu), exit_nr);
1200
+ r = kvmppc_handle_pagefault(vcpu, kvmppc_get_pc(vcpu), exit_nr);
11681201 srcu_read_unlock(&vcpu->kvm->srcu, idx);
11691202 vcpu->stat.sp_instruc++;
11701203 } else if (vcpu->arch.mmu.is_dcbz32(vcpu) &&
....@@ -1214,7 +1247,7 @@
12141247 */
12151248 if (fault_dsisr & (DSISR_NOHPTE | DSISR_PROTFAULT)) {
12161249 int idx = srcu_read_lock(&vcpu->kvm->srcu);
1217
- r = kvmppc_handle_pagefault(run, vcpu, dar, exit_nr);
1250
+ r = kvmppc_handle_pagefault(vcpu, dar, exit_nr);
12181251 srcu_read_unlock(&vcpu->kvm->srcu, idx);
12191252 } else {
12201253 kvmppc_core_queue_data_storage(vcpu, dar, fault_dsisr);
....@@ -1246,7 +1279,6 @@
12461279 r = RESUME_GUEST;
12471280 break;
12481281 case BOOK3S_INTERRUPT_EXTERNAL:
1249
- case BOOK3S_INTERRUPT_EXTERNAL_LEVEL:
12501282 case BOOK3S_INTERRUPT_EXTERNAL_HV:
12511283 case BOOK3S_INTERRUPT_H_VIRT:
12521284 vcpu->stat.ext_intr_exits++;
....@@ -1259,7 +1291,7 @@
12591291 break;
12601292 case BOOK3S_INTERRUPT_PROGRAM:
12611293 case BOOK3S_INTERRUPT_H_EMUL_ASSIST:
1262
- r = kvmppc_exit_pr_progint(run, vcpu, exit_nr);
1294
+ r = kvmppc_exit_pr_progint(vcpu, exit_nr);
12631295 break;
12641296 case BOOK3S_INTERRUPT_SYSCALL:
12651297 {
....@@ -1337,7 +1369,7 @@
13371369 emul = kvmppc_get_last_inst(vcpu, INST_GENERIC,
13381370 &last_inst);
13391371 if (emul == EMULATE_DONE)
1340
- r = kvmppc_exit_pr_progint(run, vcpu, exit_nr);
1372
+ r = kvmppc_exit_pr_progint(vcpu, exit_nr);
13411373 else
13421374 r = RESUME_GUEST;
13431375
....@@ -1711,21 +1743,17 @@
17111743 return r;
17121744 }
17131745
1714
-static struct kvm_vcpu *kvmppc_core_vcpu_create_pr(struct kvm *kvm,
1715
- unsigned int id)
1746
+static int kvmppc_core_vcpu_create_pr(struct kvm_vcpu *vcpu)
17161747 {
17171748 struct kvmppc_vcpu_book3s *vcpu_book3s;
1718
- struct kvm_vcpu *vcpu;
1719
- int err = -ENOMEM;
17201749 unsigned long p;
1750
+ int err;
17211751
1722
- vcpu = kmem_cache_zalloc(kvm_vcpu_cache, GFP_KERNEL);
1723
- if (!vcpu)
1724
- goto out;
1752
+ err = -ENOMEM;
17251753
17261754 vcpu_book3s = vzalloc(sizeof(struct kvmppc_vcpu_book3s));
17271755 if (!vcpu_book3s)
1728
- goto free_vcpu;
1756
+ goto out;
17291757 vcpu->arch.book3s = vcpu_book3s;
17301758
17311759 #ifdef CONFIG_KVM_BOOK3S_32_HANDLER
....@@ -1735,14 +1763,9 @@
17351763 goto free_vcpu3s;
17361764 #endif
17371765
1738
- err = kvm_vcpu_init(vcpu, kvm, id);
1739
- if (err)
1740
- goto free_shadow_vcpu;
1741
-
1742
- err = -ENOMEM;
17431766 p = __get_free_page(GFP_KERNEL|__GFP_ZERO);
17441767 if (!p)
1745
- goto uninit_vcpu;
1768
+ goto free_shadow_vcpu;
17461769 vcpu->arch.shared = (void *)p;
17471770 #ifdef CONFIG_PPC_BOOK3S_64
17481771 /* Always start the shared struct in native endian mode */
....@@ -1764,57 +1787,50 @@
17641787 #else
17651788 /* default to book3s_32 (750) */
17661789 vcpu->arch.pvr = 0x84202;
1790
+ vcpu->arch.intr_msr = 0;
17671791 #endif
17681792 kvmppc_set_pvr_pr(vcpu, vcpu->arch.pvr);
17691793 vcpu->arch.slb_nr = 64;
17701794
17711795 vcpu->arch.shadow_msr = MSR_USER64 & ~MSR_LE;
17721796
1773
- err = kvmppc_mmu_init(vcpu);
1797
+ err = kvmppc_mmu_init_pr(vcpu);
17741798 if (err < 0)
17751799 goto free_shared_page;
17761800
1777
- return vcpu;
1801
+ return 0;
17781802
17791803 free_shared_page:
17801804 free_page((unsigned long)vcpu->arch.shared);
1781
-uninit_vcpu:
1782
- kvm_vcpu_uninit(vcpu);
17831805 free_shadow_vcpu:
17841806 #ifdef CONFIG_KVM_BOOK3S_32_HANDLER
17851807 kfree(vcpu->arch.shadow_vcpu);
17861808 free_vcpu3s:
17871809 #endif
17881810 vfree(vcpu_book3s);
1789
-free_vcpu:
1790
- kmem_cache_free(kvm_vcpu_cache, vcpu);
17911811 out:
1792
- return ERR_PTR(err);
1812
+ return err;
17931813 }
17941814
17951815 static void kvmppc_core_vcpu_free_pr(struct kvm_vcpu *vcpu)
17961816 {
17971817 struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);
17981818
1819
+ kvmppc_mmu_destroy_pr(vcpu);
17991820 free_page((unsigned long)vcpu->arch.shared & PAGE_MASK);
1800
- kvm_vcpu_uninit(vcpu);
18011821 #ifdef CONFIG_KVM_BOOK3S_32_HANDLER
18021822 kfree(vcpu->arch.shadow_vcpu);
18031823 #endif
18041824 vfree(vcpu_book3s);
1805
- kmem_cache_free(kvm_vcpu_cache, vcpu);
18061825 }
18071826
1808
-static int kvmppc_vcpu_run_pr(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
1827
+static int kvmppc_vcpu_run_pr(struct kvm_vcpu *vcpu)
18091828 {
18101829 int ret;
1811
-#ifdef CONFIG_ALTIVEC
1812
- unsigned long uninitialized_var(vrsave);
1813
-#endif
18141830
18151831 /* Check if we can run the vcpu at all */
18161832 if (!vcpu->arch.sane) {
1817
- kvm_run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1833
+ vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
18181834 ret = -EINVAL;
18191835 goto out;
18201836 }
....@@ -1841,7 +1857,7 @@
18411857
18421858 kvmppc_fix_ee_before_entry();
18431859
1844
- ret = __kvmppc_vcpu_run(kvm_run, vcpu);
1860
+ ret = __kvmppc_vcpu_run(vcpu);
18451861
18461862 kvmppc_clear_debug(vcpu);
18471863
....@@ -1865,7 +1881,6 @@
18651881 static int kvm_vm_ioctl_get_dirty_log_pr(struct kvm *kvm,
18661882 struct kvm_dirty_log *log)
18671883 {
1868
- struct kvm_memslots *slots;
18691884 struct kvm_memory_slot *memslot;
18701885 struct kvm_vcpu *vcpu;
18711886 ulong ga, ga_end;
....@@ -1875,15 +1890,12 @@
18751890
18761891 mutex_lock(&kvm->slots_lock);
18771892
1878
- r = kvm_get_dirty_log(kvm, log, &is_dirty);
1893
+ r = kvm_get_dirty_log(kvm, log, &is_dirty, &memslot);
18791894 if (r)
18801895 goto out;
18811896
18821897 /* If nothing is dirty, don't bother messing with page tables. */
18831898 if (is_dirty) {
1884
- slots = kvm_memslots(kvm);
1885
- memslot = id_to_memslot(slots, log->slot);
1886
-
18871899 ga = memslot->base_gfn << PAGE_SHIFT;
18881900 ga_end = ga + (memslot->npages << PAGE_SHIFT);
18891901
....@@ -1908,7 +1920,8 @@
19081920
19091921 static int kvmppc_core_prepare_memory_region_pr(struct kvm *kvm,
19101922 struct kvm_memory_slot *memslot,
1911
- const struct kvm_userspace_memory_region *mem)
1923
+ const struct kvm_userspace_memory_region *mem,
1924
+ enum kvm_mr_change change)
19121925 {
19131926 return 0;
19141927 }
....@@ -1916,23 +1929,16 @@
19161929 static void kvmppc_core_commit_memory_region_pr(struct kvm *kvm,
19171930 const struct kvm_userspace_memory_region *mem,
19181931 const struct kvm_memory_slot *old,
1919
- const struct kvm_memory_slot *new)
1932
+ const struct kvm_memory_slot *new,
1933
+ enum kvm_mr_change change)
19201934 {
19211935 return;
19221936 }
19231937
1924
-static void kvmppc_core_free_memslot_pr(struct kvm_memory_slot *free,
1925
- struct kvm_memory_slot *dont)
1938
+static void kvmppc_core_free_memslot_pr(struct kvm_memory_slot *slot)
19261939 {
19271940 return;
19281941 }
1929
-
1930
-static int kvmppc_core_create_memslot_pr(struct kvm_memory_slot *slot,
1931
- unsigned long npages)
1932
-{
1933
- return 0;
1934
-}
1935
-
19361942
19371943 #ifdef CONFIG_PPC64
19381944 static int kvm_vm_ioctl_get_smmu_info_pr(struct kvm *kvm,
....@@ -1997,6 +2003,7 @@
19972003 {
19982004 /* We should not get called */
19992005 BUG();
2006
+ return 0;
20002007 }
20012008 #endif /* CONFIG_PPC64 */
20022009
....@@ -2062,6 +2069,7 @@
20622069 .set_one_reg = kvmppc_set_one_reg_pr,
20632070 .vcpu_load = kvmppc_core_vcpu_load_pr,
20642071 .vcpu_put = kvmppc_core_vcpu_put_pr,
2072
+ .inject_interrupt = kvmppc_inject_interrupt_pr,
20652073 .set_msr = kvmppc_set_msr_pr,
20662074 .vcpu_run = kvmppc_vcpu_run_pr,
20672075 .vcpu_create = kvmppc_core_vcpu_create_pr,
....@@ -2075,9 +2083,7 @@
20752083 .age_hva = kvm_age_hva_pr,
20762084 .test_age_hva = kvm_test_age_hva_pr,
20772085 .set_spte_hva = kvm_set_spte_hva_pr,
2078
- .mmu_destroy = kvmppc_mmu_destroy_pr,
20792086 .free_memslot = kvmppc_core_free_memslot_pr,
2080
- .create_memslot = kvmppc_core_create_memslot_pr,
20812087 .init_vm = kvmppc_core_init_vm_pr,
20822088 .destroy_vm = kvmppc_core_destroy_vm_pr,
20832089 .get_smmu_info = kvm_vm_ioctl_get_smmu_info_pr,