Merge tag '9p-for-6.9-rc3' of https://github.com/martinetd/linux
[linux-block.git] / arch / x86 / virt / svm / sev.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * AMD SVM-SEV Host Support.
4  *
5  * Copyright (C) 2023 Advanced Micro Devices, Inc.
6  *
7  * Author: Ashish Kalra <ashish.kalra@amd.com>
8  *
9  */
10
11 #include <linux/cc_platform.h>
12 #include <linux/printk.h>
13 #include <linux/mm_types.h>
14 #include <linux/set_memory.h>
15 #include <linux/memblock.h>
16 #include <linux/kernel.h>
17 #include <linux/mm.h>
18 #include <linux/cpumask.h>
19 #include <linux/iommu.h>
20 #include <linux/amd-iommu.h>
21
22 #include <asm/sev.h>
23 #include <asm/processor.h>
24 #include <asm/setup.h>
25 #include <asm/svm.h>
26 #include <asm/smp.h>
27 #include <asm/cpu.h>
28 #include <asm/apic.h>
29 #include <asm/cpuid.h>
30 #include <asm/cmdline.h>
31 #include <asm/iommu.h>
32
33 /*
34  * The RMP entry format is not architectural. The format is defined in PPR
35  * Family 19h Model 01h, Rev B1 processor.
36  */
37 struct rmpentry {
38         union {
39                 struct {
40                         u64 assigned    : 1,
41                             pagesize    : 1,
42                             immutable   : 1,
43                             rsvd1       : 9,
44                             gpa         : 39,
45                             asid        : 10,
46                             vmsa        : 1,
47                             validated   : 1,
48                             rsvd2       : 1;
49                 };
50                 u64 lo;
51         };
52         u64 hi;
53 } __packed;
54
55 /*
56  * The first 16KB from the RMP_BASE is used by the processor for the
57  * bookkeeping, the range needs to be added during the RMP entry lookup.
58  */
59 #define RMPTABLE_CPU_BOOKKEEPING_SZ     0x4000
60
61 /* Mask to apply to a PFN to get the first PFN of a 2MB page */
62 #define PFN_PMD_MASK    GENMASK_ULL(63, PMD_SHIFT - PAGE_SHIFT)
63
64 static u64 probed_rmp_base, probed_rmp_size;
65 static struct rmpentry *rmptable __ro_after_init;
66 static u64 rmptable_max_pfn __ro_after_init;
67
68 static LIST_HEAD(snp_leaked_pages_list);
69 static DEFINE_SPINLOCK(snp_leaked_pages_list_lock);
70
71 static unsigned long snp_nr_leaked_pages;
72
73 #undef pr_fmt
74 #define pr_fmt(fmt)     "SEV-SNP: " fmt
75
76 static int __mfd_enable(unsigned int cpu)
77 {
78         u64 val;
79
80         if (!cpu_feature_enabled(X86_FEATURE_SEV_SNP))
81                 return 0;
82
83         rdmsrl(MSR_AMD64_SYSCFG, val);
84
85         val |= MSR_AMD64_SYSCFG_MFDM;
86
87         wrmsrl(MSR_AMD64_SYSCFG, val);
88
89         return 0;
90 }
91
92 static __init void mfd_enable(void *arg)
93 {
94         __mfd_enable(smp_processor_id());
95 }
96
97 static int __snp_enable(unsigned int cpu)
98 {
99         u64 val;
100
101         if (!cpu_feature_enabled(X86_FEATURE_SEV_SNP))
102                 return 0;
103
104         rdmsrl(MSR_AMD64_SYSCFG, val);
105
106         val |= MSR_AMD64_SYSCFG_SNP_EN;
107         val |= MSR_AMD64_SYSCFG_SNP_VMPL_EN;
108
109         wrmsrl(MSR_AMD64_SYSCFG, val);
110
111         return 0;
112 }
113
114 static __init void snp_enable(void *arg)
115 {
116         __snp_enable(smp_processor_id());
117 }
118
119 #define RMP_ADDR_MASK GENMASK_ULL(51, 13)
120
121 bool snp_probe_rmptable_info(void)
122 {
123         u64 max_rmp_pfn, calc_rmp_sz, rmp_sz, rmp_base, rmp_end;
124
125         rdmsrl(MSR_AMD64_RMP_BASE, rmp_base);
126         rdmsrl(MSR_AMD64_RMP_END, rmp_end);
127
128         if (!(rmp_base & RMP_ADDR_MASK) || !(rmp_end & RMP_ADDR_MASK)) {
129                 pr_err("Memory for the RMP table has not been reserved by BIOS\n");
130                 return false;
131         }
132
133         if (rmp_base > rmp_end) {
134                 pr_err("RMP configuration not valid: base=%#llx, end=%#llx\n", rmp_base, rmp_end);
135                 return false;
136         }
137
138         rmp_sz = rmp_end - rmp_base + 1;
139
140         /*
141          * Calculate the amount the memory that must be reserved by the BIOS to
142          * address the whole RAM, including the bookkeeping area. The RMP itself
143          * must also be covered.
144          */
145         max_rmp_pfn = max_pfn;
146         if (PHYS_PFN(rmp_end) > max_pfn)
147                 max_rmp_pfn = PHYS_PFN(rmp_end);
148
149         calc_rmp_sz = (max_rmp_pfn << 4) + RMPTABLE_CPU_BOOKKEEPING_SZ;
150
151         if (calc_rmp_sz > rmp_sz) {
152                 pr_err("Memory reserved for the RMP table does not cover full system RAM (expected 0x%llx got 0x%llx)\n",
153                        calc_rmp_sz, rmp_sz);
154                 return false;
155         }
156
157         probed_rmp_base = rmp_base;
158         probed_rmp_size = rmp_sz;
159
160         pr_info("RMP table physical range [0x%016llx - 0x%016llx]\n",
161                 probed_rmp_base, probed_rmp_base + probed_rmp_size - 1);
162
163         return true;
164 }
165
166 /*
167  * Do the necessary preparations which are verified by the firmware as
168  * described in the SNP_INIT_EX firmware command description in the SNP
169  * firmware ABI spec.
170  */
171 static int __init snp_rmptable_init(void)
172 {
173         void *rmptable_start;
174         u64 rmptable_size;
175         u64 val;
176
177         if (!cpu_feature_enabled(X86_FEATURE_SEV_SNP))
178                 return 0;
179
180         if (!amd_iommu_snp_en)
181                 return 0;
182
183         if (!probed_rmp_size)
184                 goto nosnp;
185
186         rmptable_start = memremap(probed_rmp_base, probed_rmp_size, MEMREMAP_WB);
187         if (!rmptable_start) {
188                 pr_err("Failed to map RMP table\n");
189                 return 1;
190         }
191
192         /*
193          * Check if SEV-SNP is already enabled, this can happen in case of
194          * kexec boot.
195          */
196         rdmsrl(MSR_AMD64_SYSCFG, val);
197         if (val & MSR_AMD64_SYSCFG_SNP_EN)
198                 goto skip_enable;
199
200         memset(rmptable_start, 0, probed_rmp_size);
201
202         /* Flush the caches to ensure that data is written before SNP is enabled. */
203         wbinvd_on_all_cpus();
204
205         /* MtrrFixDramModEn must be enabled on all the CPUs prior to enabling SNP. */
206         on_each_cpu(mfd_enable, NULL, 1);
207
208         on_each_cpu(snp_enable, NULL, 1);
209
210 skip_enable:
211         rmptable_start += RMPTABLE_CPU_BOOKKEEPING_SZ;
212         rmptable_size = probed_rmp_size - RMPTABLE_CPU_BOOKKEEPING_SZ;
213
214         rmptable = (struct rmpentry *)rmptable_start;
215         rmptable_max_pfn = rmptable_size / sizeof(struct rmpentry) - 1;
216
217         cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "x86/rmptable_init:online", __snp_enable, NULL);
218
219         /*
220          * Setting crash_kexec_post_notifiers to 'true' to ensure that SNP panic
221          * notifier is invoked to do SNP IOMMU shutdown before kdump.
222          */
223         crash_kexec_post_notifiers = true;
224
225         return 0;
226
227 nosnp:
228         setup_clear_cpu_cap(X86_FEATURE_SEV_SNP);
229         return -ENOSYS;
230 }
231
232 /*
233  * This must be called after the IOMMU has been initialized.
234  */
235 device_initcall(snp_rmptable_init);
236
237 static struct rmpentry *get_rmpentry(u64 pfn)
238 {
239         if (WARN_ON_ONCE(pfn > rmptable_max_pfn))
240                 return ERR_PTR(-EFAULT);
241
242         return &rmptable[pfn];
243 }
244
245 static struct rmpentry *__snp_lookup_rmpentry(u64 pfn, int *level)
246 {
247         struct rmpentry *large_entry, *entry;
248
249         if (!cpu_feature_enabled(X86_FEATURE_SEV_SNP))
250                 return ERR_PTR(-ENODEV);
251
252         entry = get_rmpentry(pfn);
253         if (IS_ERR(entry))
254                 return entry;
255
256         /*
257          * Find the authoritative RMP entry for a PFN. This can be either a 4K
258          * RMP entry or a special large RMP entry that is authoritative for a
259          * whole 2M area.
260          */
261         large_entry = get_rmpentry(pfn & PFN_PMD_MASK);
262         if (IS_ERR(large_entry))
263                 return large_entry;
264
265         *level = RMP_TO_PG_LEVEL(large_entry->pagesize);
266
267         return entry;
268 }
269
270 int snp_lookup_rmpentry(u64 pfn, bool *assigned, int *level)
271 {
272         struct rmpentry *e;
273
274         e = __snp_lookup_rmpentry(pfn, level);
275         if (IS_ERR(e))
276                 return PTR_ERR(e);
277
278         *assigned = !!e->assigned;
279         return 0;
280 }
281 EXPORT_SYMBOL_GPL(snp_lookup_rmpentry);
282
283 /*
284  * Dump the raw RMP entry for a particular PFN. These bits are documented in the
285  * PPR for a particular CPU model and provide useful information about how a
286  * particular PFN is being utilized by the kernel/firmware at the time certain
287  * unexpected events occur, such as RMP faults.
288  */
289 static void dump_rmpentry(u64 pfn)
290 {
291         u64 pfn_i, pfn_end;
292         struct rmpentry *e;
293         int level;
294
295         e = __snp_lookup_rmpentry(pfn, &level);
296         if (IS_ERR(e)) {
297                 pr_err("Failed to read RMP entry for PFN 0x%llx, error %ld\n",
298                        pfn, PTR_ERR(e));
299                 return;
300         }
301
302         if (e->assigned) {
303                 pr_info("PFN 0x%llx, RMP entry: [0x%016llx - 0x%016llx]\n",
304                         pfn, e->lo, e->hi);
305                 return;
306         }
307
308         /*
309          * If the RMP entry for a particular PFN is not in an assigned state,
310          * then it is sometimes useful to get an idea of whether or not any RMP
311          * entries for other PFNs within the same 2MB region are assigned, since
312          * those too can affect the ability to access a particular PFN in
313          * certain situations, such as when the PFN is being accessed via a 2MB
314          * mapping in the host page table.
315          */
316         pfn_i = ALIGN_DOWN(pfn, PTRS_PER_PMD);
317         pfn_end = pfn_i + PTRS_PER_PMD;
318
319         pr_info("PFN 0x%llx unassigned, dumping non-zero entries in 2M PFN region: [0x%llx - 0x%llx]\n",
320                 pfn, pfn_i, pfn_end);
321
322         while (pfn_i < pfn_end) {
323                 e = __snp_lookup_rmpentry(pfn_i, &level);
324                 if (IS_ERR(e)) {
325                         pr_err("Error %ld reading RMP entry for PFN 0x%llx\n",
326                                PTR_ERR(e), pfn_i);
327                         pfn_i++;
328                         continue;
329                 }
330
331                 if (e->lo || e->hi)
332                         pr_info("PFN: 0x%llx, [0x%016llx - 0x%016llx]\n", pfn_i, e->lo, e->hi);
333                 pfn_i++;
334         }
335 }
336
337 void snp_dump_hva_rmpentry(unsigned long hva)
338 {
339         unsigned long paddr;
340         unsigned int level;
341         pgd_t *pgd;
342         pte_t *pte;
343
344         pgd = __va(read_cr3_pa());
345         pgd += pgd_index(hva);
346         pte = lookup_address_in_pgd(pgd, hva, &level);
347
348         if (!pte) {
349                 pr_err("Can't dump RMP entry for HVA %lx: no PTE/PFN found\n", hva);
350                 return;
351         }
352
353         paddr = PFN_PHYS(pte_pfn(*pte)) | (hva & ~page_level_mask(level));
354         dump_rmpentry(PHYS_PFN(paddr));
355 }
356
357 /*
358  * PSMASH a 2MB aligned page into 4K pages in the RMP table while preserving the
359  * Validated bit.
360  */
361 int psmash(u64 pfn)
362 {
363         unsigned long paddr = pfn << PAGE_SHIFT;
364         int ret;
365
366         if (!cpu_feature_enabled(X86_FEATURE_SEV_SNP))
367                 return -ENODEV;
368
369         if (!pfn_valid(pfn))
370                 return -EINVAL;
371
372         /* Binutils version 2.36 supports the PSMASH mnemonic. */
373         asm volatile(".byte 0xF3, 0x0F, 0x01, 0xFF"
374                       : "=a" (ret)
375                       : "a" (paddr)
376                       : "memory", "cc");
377
378         return ret;
379 }
380 EXPORT_SYMBOL_GPL(psmash);
381
382 /*
383  * If the kernel uses a 2MB or larger directmap mapping to write to an address,
384  * and that mapping contains any 4KB pages that are set to private in the RMP
385  * table, an RMP #PF will trigger and cause a host crash. Hypervisor code that
386  * owns the PFNs being transitioned will never attempt such a write, but other
387  * kernel tasks writing to other PFNs in the range may trigger these checks
388  * inadvertently due a large directmap mapping that happens to overlap such a
389  * PFN.
390  *
391  * Prevent this by splitting any 2MB+ mappings that might end up containing a
392  * mix of private/shared PFNs as a result of a subsequent RMPUPDATE for the
393  * PFN/rmp_level passed in.
394  *
395  * Note that there is no attempt here to scan all the RMP entries for the 2MB
396  * physical range, since it would only be worthwhile in determining if a
397  * subsequent RMPUPDATE for a 4KB PFN would result in all the entries being of
398  * the same shared/private state, thus avoiding the need to split the mapping.
399  * But that would mean the entries are currently in a mixed state, and so the
400  * mapping would have already been split as a result of prior transitions.
401  * And since the 4K split is only done if the mapping is 2MB+, and there isn't
402  * currently a mechanism in place to restore 2MB+ mappings, such a check would
403  * not provide any usable benefit.
404  *
405  * More specifics on how these checks are carried out can be found in APM
406  * Volume 2, "RMP and VMPL Access Checks".
407  */
408 static int adjust_direct_map(u64 pfn, int rmp_level)
409 {
410         unsigned long vaddr;
411         unsigned int level;
412         int npages, ret;
413         pte_t *pte;
414
415         /*
416          * pfn_to_kaddr() will return a vaddr only within the direct
417          * map range.
418          */
419         vaddr = (unsigned long)pfn_to_kaddr(pfn);
420
421         /* Only 4KB/2MB RMP entries are supported by current hardware. */
422         if (WARN_ON_ONCE(rmp_level > PG_LEVEL_2M))
423                 return -EINVAL;
424
425         if (!pfn_valid(pfn))
426                 return -EINVAL;
427
428         if (rmp_level == PG_LEVEL_2M &&
429             (!IS_ALIGNED(pfn, PTRS_PER_PMD) || !pfn_valid(pfn + PTRS_PER_PMD - 1)))
430                 return -EINVAL;
431
432         /*
433          * If an entire 2MB physical range is being transitioned, then there is
434          * no risk of RMP #PFs due to write accesses from overlapping mappings,
435          * since even accesses from 1GB mappings will be treated as 2MB accesses
436          * as far as RMP table checks are concerned.
437          */
438         if (rmp_level == PG_LEVEL_2M)
439                 return 0;
440
441         pte = lookup_address(vaddr, &level);
442         if (!pte || pte_none(*pte))
443                 return 0;
444
445         if (level == PG_LEVEL_4K)
446                 return 0;
447
448         npages = page_level_size(rmp_level) / PAGE_SIZE;
449         ret = set_memory_4k(vaddr, npages);
450         if (ret)
451                 pr_warn("Failed to split direct map for PFN 0x%llx, ret: %d\n",
452                         pfn, ret);
453
454         return ret;
455 }
456
457 /*
458  * It is expected that those operations are seldom enough so that no mutual
459  * exclusion of updaters is needed and thus the overlap error condition below
460  * should happen very rarely and would get resolved relatively quickly by
461  * the firmware.
462  *
463  * If not, one could consider introducing a mutex or so here to sync concurrent
464  * RMP updates and thus diminish the amount of cases where firmware needs to
465  * lock 2M ranges to protect against concurrent updates.
466  *
467  * The optimal solution would be range locking to avoid locking disjoint
468  * regions unnecessarily but there's no support for that yet.
469  */
470 static int rmpupdate(u64 pfn, struct rmp_state *state)
471 {
472         unsigned long paddr = pfn << PAGE_SHIFT;
473         int ret, level;
474
475         if (!cpu_feature_enabled(X86_FEATURE_SEV_SNP))
476                 return -ENODEV;
477
478         level = RMP_TO_PG_LEVEL(state->pagesize);
479
480         if (adjust_direct_map(pfn, level))
481                 return -EFAULT;
482
483         do {
484                 /* Binutils version 2.36 supports the RMPUPDATE mnemonic. */
485                 asm volatile(".byte 0xF2, 0x0F, 0x01, 0xFE"
486                              : "=a" (ret)
487                              : "a" (paddr), "c" ((unsigned long)state)
488                              : "memory", "cc");
489         } while (ret == RMPUPDATE_FAIL_OVERLAP);
490
491         if (ret) {
492                 pr_err("RMPUPDATE failed for PFN %llx, pg_level: %d, ret: %d\n",
493                        pfn, level, ret);
494                 dump_rmpentry(pfn);
495                 dump_stack();
496                 return -EFAULT;
497         }
498
499         return 0;
500 }
501
502 /* Transition a page to guest-owned/private state in the RMP table. */
503 int rmp_make_private(u64 pfn, u64 gpa, enum pg_level level, u32 asid, bool immutable)
504 {
505         struct rmp_state state;
506
507         memset(&state, 0, sizeof(state));
508         state.assigned = 1;
509         state.asid = asid;
510         state.immutable = immutable;
511         state.gpa = gpa;
512         state.pagesize = PG_LEVEL_TO_RMP(level);
513
514         return rmpupdate(pfn, &state);
515 }
516 EXPORT_SYMBOL_GPL(rmp_make_private);
517
518 /* Transition a page to hypervisor-owned/shared state in the RMP table. */
519 int rmp_make_shared(u64 pfn, enum pg_level level)
520 {
521         struct rmp_state state;
522
523         memset(&state, 0, sizeof(state));
524         state.pagesize = PG_LEVEL_TO_RMP(level);
525
526         return rmpupdate(pfn, &state);
527 }
528 EXPORT_SYMBOL_GPL(rmp_make_shared);
529
530 void snp_leak_pages(u64 pfn, unsigned int npages)
531 {
532         struct page *page = pfn_to_page(pfn);
533
534         pr_warn("Leaking PFN range 0x%llx-0x%llx\n", pfn, pfn + npages);
535
536         spin_lock(&snp_leaked_pages_list_lock);
537         while (npages--) {
538
539                 /*
540                  * Reuse the page's buddy list for chaining into the leaked
541                  * pages list. This page should not be on a free list currently
542                  * and is also unsafe to be added to a free list.
543                  */
544                 if (likely(!PageCompound(page)) ||
545
546                         /*
547                          * Skip inserting tail pages of compound page as
548                          * page->buddy_list of tail pages is not usable.
549                          */
550                     (PageHead(page) && compound_nr(page) <= npages))
551                         list_add_tail(&page->buddy_list, &snp_leaked_pages_list);
552
553                 dump_rmpentry(pfn);
554                 snp_nr_leaked_pages++;
555                 pfn++;
556                 page++;
557         }
558         spin_unlock(&snp_leaked_pages_list_lock);
559 }
560 EXPORT_SYMBOL_GPL(snp_leak_pages);