forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/arch/mips/kvm/mmu.c
....@@ -25,41 +25,9 @@
2525 #define KVM_MMU_CACHE_MIN_PAGES 2
2626 #endif
2727
28
-static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
29
- int min, int max)
30
-{
31
- void *page;
32
-
33
- BUG_ON(max > KVM_NR_MEM_OBJS);
34
- if (cache->nobjs >= min)
35
- return 0;
36
- while (cache->nobjs < max) {
37
- page = (void *)__get_free_page(GFP_KERNEL);
38
- if (!page)
39
- return -ENOMEM;
40
- cache->objects[cache->nobjs++] = page;
41
- }
42
- return 0;
43
-}
44
-
45
-static void mmu_free_memory_cache(struct kvm_mmu_memory_cache *mc)
46
-{
47
- while (mc->nobjs)
48
- free_page((unsigned long)mc->objects[--mc->nobjs]);
49
-}
50
-
51
-static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc)
52
-{
53
- void *p;
54
-
55
- BUG_ON(!mc || !mc->nobjs);
56
- p = mc->objects[--mc->nobjs];
57
- return p;
58
-}
59
-
6028 void kvm_mmu_free_memory_caches(struct kvm_vcpu *vcpu)
6129 {
62
- mmu_free_memory_cache(&vcpu->arch.mmu_page_cache);
30
+ kvm_mmu_free_memory_cache(&vcpu->arch.mmu_page_cache);
6331 }
6432
6533 /**
....@@ -136,6 +104,7 @@
136104 static pte_t *kvm_mips_walk_pgd(pgd_t *pgd, struct kvm_mmu_memory_cache *cache,
137105 unsigned long addr)
138106 {
107
+ p4d_t *p4d;
139108 pud_t *pud;
140109 pmd_t *pmd;
141110
....@@ -145,13 +114,14 @@
145114 BUG();
146115 return NULL;
147116 }
148
- pud = pud_offset(pgd, addr);
117
+ p4d = p4d_offset(pgd, addr);
118
+ pud = pud_offset(p4d, addr);
149119 if (pud_none(*pud)) {
150120 pmd_t *new_pmd;
151121
152122 if (!cache)
153123 return NULL;
154
- new_pmd = mmu_memory_cache_alloc(cache);
124
+ new_pmd = kvm_mmu_memory_cache_alloc(cache);
155125 pmd_init((unsigned long)new_pmd,
156126 (unsigned long)invalid_pte_table);
157127 pud_populate(NULL, pud, new_pmd);
....@@ -162,11 +132,11 @@
162132
163133 if (!cache)
164134 return NULL;
165
- new_pte = mmu_memory_cache_alloc(cache);
135
+ new_pte = kvm_mmu_memory_cache_alloc(cache);
166136 clear_page(new_pte);
167137 pmd_populate_kernel(NULL, pmd, new_pte);
168138 }
169
- return pte_offset(pmd, addr);
139
+ return pte_offset_kernel(pmd, addr);
170140 }
171141
172142 /* Caller must hold kvm->mm_lock */
....@@ -185,8 +155,8 @@
185155 static bool kvm_mips_flush_gpa_pte(pte_t *pte, unsigned long start_gpa,
186156 unsigned long end_gpa)
187157 {
188
- int i_min = __pte_offset(start_gpa);
189
- int i_max = __pte_offset(end_gpa);
158
+ int i_min = pte_index(start_gpa);
159
+ int i_max = pte_index(end_gpa);
190160 bool safe_to_remove = (i_min == 0 && i_max == PTRS_PER_PTE - 1);
191161 int i;
192162
....@@ -204,8 +174,8 @@
204174 {
205175 pte_t *pte;
206176 unsigned long end = ~0ul;
207
- int i_min = __pmd_offset(start_gpa);
208
- int i_max = __pmd_offset(end_gpa);
177
+ int i_min = pmd_index(start_gpa);
178
+ int i_max = pmd_index(end_gpa);
209179 bool safe_to_remove = (i_min == 0 && i_max == PTRS_PER_PMD - 1);
210180 int i;
211181
....@@ -213,7 +183,7 @@
213183 if (!pmd_present(pmd[i]))
214184 continue;
215185
216
- pte = pte_offset(pmd + i, 0);
186
+ pte = pte_offset_kernel(pmd + i, 0);
217187 if (i == i_max)
218188 end = end_gpa;
219189
....@@ -232,8 +202,8 @@
232202 {
233203 pmd_t *pmd;
234204 unsigned long end = ~0ul;
235
- int i_min = __pud_offset(start_gpa);
236
- int i_max = __pud_offset(end_gpa);
205
+ int i_min = pud_index(start_gpa);
206
+ int i_max = pud_index(end_gpa);
237207 bool safe_to_remove = (i_min == 0 && i_max == PTRS_PER_PUD - 1);
238208 int i;
239209
....@@ -258,6 +228,7 @@
258228 static bool kvm_mips_flush_gpa_pgd(pgd_t *pgd, unsigned long start_gpa,
259229 unsigned long end_gpa)
260230 {
231
+ p4d_t *p4d;
261232 pud_t *pud;
262233 unsigned long end = ~0ul;
263234 int i_min = pgd_index(start_gpa);
....@@ -269,7 +240,8 @@
269240 if (!pgd_present(pgd[i]))
270241 continue;
271242
272
- pud = pud_offset(pgd + i, 0);
243
+ p4d = p4d_offset(pgd, 0);
244
+ pud = pud_offset(p4d + i, 0);
273245 if (i == i_max)
274246 end = end_gpa;
275247
....@@ -308,8 +280,8 @@
308280 unsigned long end) \
309281 { \
310282 int ret = 0; \
311
- int i_min = __pte_offset(start); \
312
- int i_max = __pte_offset(end); \
283
+ int i_min = pte_index(start); \
284
+ int i_max = pte_index(end); \
313285 int i; \
314286 pte_t old, new; \
315287 \
....@@ -334,15 +306,15 @@
334306 int ret = 0; \
335307 pte_t *pte; \
336308 unsigned long cur_end = ~0ul; \
337
- int i_min = __pmd_offset(start); \
338
- int i_max = __pmd_offset(end); \
309
+ int i_min = pmd_index(start); \
310
+ int i_max = pmd_index(end); \
339311 int i; \
340312 \
341313 for (i = i_min; i <= i_max; ++i, start = 0) { \
342314 if (!pmd_present(pmd[i])) \
343315 continue; \
344316 \
345
- pte = pte_offset(pmd + i, 0); \
317
+ pte = pte_offset_kernel(pmd + i, 0); \
346318 if (i == i_max) \
347319 cur_end = end; \
348320 \
....@@ -357,8 +329,8 @@
357329 int ret = 0; \
358330 pmd_t *pmd; \
359331 unsigned long cur_end = ~0ul; \
360
- int i_min = __pud_offset(start); \
361
- int i_max = __pud_offset(end); \
332
+ int i_min = pud_index(start); \
333
+ int i_max = pud_index(end); \
362334 int i; \
363335 \
364336 for (i = i_min; i <= i_max; ++i, start = 0) { \
....@@ -378,6 +350,7 @@
378350 unsigned long end) \
379351 { \
380352 int ret = 0; \
353
+ p4d_t *p4d; \
381354 pud_t *pud; \
382355 unsigned long cur_end = ~0ul; \
383356 int i_min = pgd_index(start); \
....@@ -388,7 +361,8 @@
388361 if (!pgd_present(pgd[i])) \
389362 continue; \
390363 \
391
- pud = pud_offset(pgd + i, 0); \
364
+ p4d = p4d_offset(pgd, 0); \
365
+ pud = pud_offset(p4d + i, 0); \
392366 if (i == i_max) \
393367 cur_end = end; \
394368 \
....@@ -513,7 +487,7 @@
513487 }
514488
515489 int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end,
516
- bool blockable)
490
+ unsigned flags)
517491 {
518492 handle_hva_to_gpa(kvm, start, end, &kvm_unmap_hva_handler, NULL);
519493
....@@ -552,7 +526,7 @@
552526 (pte_dirty(old_pte) && !pte_dirty(hva_pte));
553527 }
554528
555
-void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte)
529
+int kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte)
556530 {
557531 unsigned long end = hva + PAGE_SIZE;
558532 int ret;
....@@ -560,6 +534,7 @@
560534 ret = handle_hva_to_gpa(kvm, hva, end, &kvm_set_spte_handler, &pte);
561535 if (ret)
562536 kvm_mips_callbacks->flush_shadow_all(kvm);
537
+ return 0;
563538 }
564539
565540 static int kvm_age_hva_handler(struct kvm *kvm, gfn_t gfn, gfn_t gfn_end,
....@@ -705,8 +680,7 @@
705680 goto out;
706681
707682 /* We need a minimum of cached pages ready for page table creation */
708
- err = mmu_topup_memory_cache(memcache, KVM_MMU_CACHE_MIN_PAGES,
709
- KVM_NR_MEM_OBJS);
683
+ err = kvm_mmu_topup_memory_cache(memcache, KVM_MMU_CACHE_MIN_PAGES);
710684 if (err)
711685 goto out;
712686
....@@ -790,8 +764,7 @@
790764 int ret;
791765
792766 /* We need a minimum of cached pages ready for page table creation */
793
- ret = mmu_topup_memory_cache(memcache, KVM_MMU_CACHE_MIN_PAGES,
794
- KVM_NR_MEM_OBJS);
767
+ ret = kvm_mmu_topup_memory_cache(memcache, KVM_MMU_CACHE_MIN_PAGES);
795768 if (ret)
796769 return NULL;
797770
....@@ -836,8 +809,8 @@
836809 static bool kvm_mips_flush_gva_pte(pte_t *pte, unsigned long start_gva,
837810 unsigned long end_gva)
838811 {
839
- int i_min = __pte_offset(start_gva);
840
- int i_max = __pte_offset(end_gva);
812
+ int i_min = pte_index(start_gva);
813
+ int i_max = pte_index(end_gva);
841814 bool safe_to_remove = (i_min == 0 && i_max == PTRS_PER_PTE - 1);
842815 int i;
843816
....@@ -862,8 +835,8 @@
862835 {
863836 pte_t *pte;
864837 unsigned long end = ~0ul;
865
- int i_min = __pmd_offset(start_gva);
866
- int i_max = __pmd_offset(end_gva);
838
+ int i_min = pmd_index(start_gva);
839
+ int i_max = pmd_index(end_gva);
867840 bool safe_to_remove = (i_min == 0 && i_max == PTRS_PER_PMD - 1);
868841 int i;
869842
....@@ -871,7 +844,7 @@
871844 if (!pmd_present(pmd[i]))
872845 continue;
873846
874
- pte = pte_offset(pmd + i, 0);
847
+ pte = pte_offset_kernel(pmd + i, 0);
875848 if (i == i_max)
876849 end = end_gva;
877850
....@@ -890,8 +863,8 @@
890863 {
891864 pmd_t *pmd;
892865 unsigned long end = ~0ul;
893
- int i_min = __pud_offset(start_gva);
894
- int i_max = __pud_offset(end_gva);
866
+ int i_min = pud_index(start_gva);
867
+ int i_max = pud_index(end_gva);
895868 bool safe_to_remove = (i_min == 0 && i_max == PTRS_PER_PUD - 1);
896869 int i;
897870
....@@ -916,6 +889,7 @@
916889 static bool kvm_mips_flush_gva_pgd(pgd_t *pgd, unsigned long start_gva,
917890 unsigned long end_gva)
918891 {
892
+ p4d_t *p4d;
919893 pud_t *pud;
920894 unsigned long end = ~0ul;
921895 int i_min = pgd_index(start_gva);
....@@ -927,7 +901,8 @@
927901 if (!pgd_present(pgd[i]))
928902 continue;
929903
930
- pud = pud_offset(pgd + i, 0);
904
+ p4d = p4d_offset(pgd, 0);
905
+ pud = pud_offset(p4d + i, 0);
931906 if (i == i_max)
932907 end = end_gva;
933908