Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

x86/sev: Add new dump_rmp parameter to snp_leak_pages() API

When leaking certain page types, such as Hypervisor Fixed (HV_FIXED)
pages, it does not make sense to dump RMP contents for the 2MB range of
the page(s) being leaked. In the case of HV_FIXED pages, this is not an
error situation where the surrounding 2MB page RMP entries can provide
debug information.

Add new __snp_leak_pages() API with dump_rmp bool parameter to support
continue adding pages to the snp_leaked_pages_list but not issue
dump_rmpentry().

Make snp_leak_pages() a wrapper for the common case which also allows
existing users to continue to dump RMP entries.

Suggested-by: Thomas Lendacky <Thomas.Lendacky@amd.com>
Suggested-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Acked-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/cover.1758057691.git.ashish.kalra@amd.com

authored by

Ashish Kalra and committed by
Borislav Petkov (AMD)
e4c00c4c 85df1cd1

+10 -4
+6 -1
arch/x86/include/asm/sev.h
··· 655 655 int psmash(u64 pfn); 656 656 int rmp_make_private(u64 pfn, u64 gpa, enum pg_level level, u32 asid, bool immutable); 657 657 int rmp_make_shared(u64 pfn, enum pg_level level); 658 - void snp_leak_pages(u64 pfn, unsigned int npages); 658 + void __snp_leak_pages(u64 pfn, unsigned int npages, bool dump_rmp); 659 659 void kdump_sev_callback(void); 660 660 void snp_fixup_e820_tables(void); 661 + static inline void snp_leak_pages(u64 pfn, unsigned int pages) 662 + { 663 + __snp_leak_pages(pfn, pages, true); 664 + } 661 665 #else 662 666 static inline bool snp_probe_rmptable_info(void) { return false; } 663 667 static inline int snp_rmptable_init(void) { return -ENOSYS; } ··· 674 670 return -ENODEV; 675 671 } 676 672 static inline int rmp_make_shared(u64 pfn, enum pg_level level) { return -ENODEV; } 673 + static inline void __snp_leak_pages(u64 pfn, unsigned int npages, bool dump_rmp) {} 677 674 static inline void snp_leak_pages(u64 pfn, unsigned int npages) {} 678 675 static inline void kdump_sev_callback(void) { } 679 676 static inline void snp_fixup_e820_tables(void) {}
+4 -3
arch/x86/virt/svm/sev.c
··· 1029 1029 } 1030 1030 EXPORT_SYMBOL_GPL(rmp_make_shared); 1031 1031 1032 - void snp_leak_pages(u64 pfn, unsigned int npages) 1032 + void __snp_leak_pages(u64 pfn, unsigned int npages, bool dump_rmp) 1033 1033 { 1034 1034 struct page *page = pfn_to_page(pfn); 1035 1035 ··· 1052 1052 (PageHead(page) && compound_nr(page) <= npages)) 1053 1053 list_add_tail(&page->buddy_list, &snp_leaked_pages_list); 1054 1054 1055 - dump_rmpentry(pfn); 1055 + if (dump_rmp) 1056 + dump_rmpentry(pfn); 1056 1057 snp_nr_leaked_pages++; 1057 1058 pfn++; 1058 1059 page++; 1059 1060 } 1060 1061 spin_unlock(&snp_leaked_pages_list_lock); 1061 1062 } 1062 - EXPORT_SYMBOL_GPL(snp_leak_pages); 1063 + EXPORT_SYMBOL_GPL(__snp_leak_pages); 1063 1064 1064 1065 void kdump_sev_callback(void) 1065 1066 {