Commit 6afd9dc1 authored by Michael Kelley's avatar Michael Kelley Committed by Wei Liu

Drivers: hv: Don't remap addresses that are above shared_gpa_boundary

With the vTOM bit now treated as a protection flag and not part of
the physical address, avoid remapping physical addresses with vTOM set
since technically such addresses aren't valid.  Use ioremap_cache()
instead of memremap() to ensure that the mapping provides decrypted
access, which will correctly set the vTOM bit as a protection flag.

While this change is not required for correctness with the current
implementation of memremap(), for general code hygiene it's better to
not depend on the mapping functions doing something reasonable with
a physical address that is out-of-range.

While here, fix typos in two error messages.
Signed-off-by: default avatarMichael Kelley <mikelley@microsoft.com>
Reviewed-by: default avatarTianyu Lan <Tianyu.Lan@microsoft.com>
Link: https://lore.kernel.org/r/1679838727-87310-12-git-send-email-mikelley@microsoft.comSigned-off-by: default avatarWei Liu <wei.liu@kernel.org>
parent 25727aae
...@@ -63,7 +63,10 @@ static int hyperv_init_ghcb(void) ...@@ -63,7 +63,10 @@ static int hyperv_init_ghcb(void)
* memory boundary and map it here. * memory boundary and map it here.
*/ */
rdmsrl(MSR_AMD64_SEV_ES_GHCB, ghcb_gpa); rdmsrl(MSR_AMD64_SEV_ES_GHCB, ghcb_gpa);
ghcb_va = memremap(ghcb_gpa, HV_HYP_PAGE_SIZE, MEMREMAP_WB);
/* Mask out vTOM bit. ioremap_cache() maps decrypted */
ghcb_gpa &= ~ms_hyperv.shared_gpa_boundary;
ghcb_va = (void *)ioremap_cache(ghcb_gpa, HV_HYP_PAGE_SIZE);
if (!ghcb_va) if (!ghcb_va)
return -ENOMEM; return -ENOMEM;
...@@ -217,7 +220,7 @@ static int hv_cpu_die(unsigned int cpu) ...@@ -217,7 +220,7 @@ static int hv_cpu_die(unsigned int cpu)
if (hv_ghcb_pg) { if (hv_ghcb_pg) {
ghcb_va = (void **)this_cpu_ptr(hv_ghcb_pg); ghcb_va = (void **)this_cpu_ptr(hv_ghcb_pg);
if (*ghcb_va) if (*ghcb_va)
memunmap(*ghcb_va); iounmap(*ghcb_va);
*ghcb_va = NULL; *ghcb_va = NULL;
} }
......
...@@ -217,11 +217,13 @@ void hv_synic_enable_regs(unsigned int cpu) ...@@ -217,11 +217,13 @@ void hv_synic_enable_regs(unsigned int cpu)
simp.simp_enabled = 1; simp.simp_enabled = 1;
if (hv_isolation_type_snp() || hv_root_partition) { if (hv_isolation_type_snp() || hv_root_partition) {
/* Mask out vTOM bit. ioremap_cache() maps decrypted */
u64 base = (simp.base_simp_gpa << HV_HYP_PAGE_SHIFT) &
~ms_hyperv.shared_gpa_boundary;
hv_cpu->synic_message_page hv_cpu->synic_message_page
= memremap(simp.base_simp_gpa << HV_HYP_PAGE_SHIFT, = (void *)ioremap_cache(base, HV_HYP_PAGE_SIZE);
HV_HYP_PAGE_SIZE, MEMREMAP_WB);
if (!hv_cpu->synic_message_page) if (!hv_cpu->synic_message_page)
pr_err("Fail to map syinc message page.\n"); pr_err("Fail to map synic message page.\n");
} else { } else {
simp.base_simp_gpa = virt_to_phys(hv_cpu->synic_message_page) simp.base_simp_gpa = virt_to_phys(hv_cpu->synic_message_page)
>> HV_HYP_PAGE_SHIFT; >> HV_HYP_PAGE_SHIFT;
...@@ -234,12 +236,13 @@ void hv_synic_enable_regs(unsigned int cpu) ...@@ -234,12 +236,13 @@ void hv_synic_enable_regs(unsigned int cpu)
siefp.siefp_enabled = 1; siefp.siefp_enabled = 1;
if (hv_isolation_type_snp() || hv_root_partition) { if (hv_isolation_type_snp() || hv_root_partition) {
hv_cpu->synic_event_page = /* Mask out vTOM bit. ioremap_cache() maps decrypted */
memremap(siefp.base_siefp_gpa << HV_HYP_PAGE_SHIFT, u64 base = (siefp.base_siefp_gpa << HV_HYP_PAGE_SHIFT) &
HV_HYP_PAGE_SIZE, MEMREMAP_WB); ~ms_hyperv.shared_gpa_boundary;
hv_cpu->synic_event_page
= (void *)ioremap_cache(base, HV_HYP_PAGE_SIZE);
if (!hv_cpu->synic_event_page) if (!hv_cpu->synic_event_page)
pr_err("Fail to map syinc event page.\n"); pr_err("Fail to map synic event page.\n");
} else { } else {
siefp.base_siefp_gpa = virt_to_phys(hv_cpu->synic_event_page) siefp.base_siefp_gpa = virt_to_phys(hv_cpu->synic_event_page)
>> HV_HYP_PAGE_SHIFT; >> HV_HYP_PAGE_SHIFT;
...@@ -316,7 +319,7 @@ void hv_synic_disable_regs(unsigned int cpu) ...@@ -316,7 +319,7 @@ void hv_synic_disable_regs(unsigned int cpu)
*/ */
simp.simp_enabled = 0; simp.simp_enabled = 0;
if (hv_isolation_type_snp() || hv_root_partition) { if (hv_isolation_type_snp() || hv_root_partition) {
memunmap(hv_cpu->synic_message_page); iounmap(hv_cpu->synic_message_page);
hv_cpu->synic_message_page = NULL; hv_cpu->synic_message_page = NULL;
} else { } else {
simp.base_simp_gpa = 0; simp.base_simp_gpa = 0;
...@@ -328,7 +331,7 @@ void hv_synic_disable_regs(unsigned int cpu) ...@@ -328,7 +331,7 @@ void hv_synic_disable_regs(unsigned int cpu)
siefp.siefp_enabled = 0; siefp.siefp_enabled = 0;
if (hv_isolation_type_snp() || hv_root_partition) { if (hv_isolation_type_snp() || hv_root_partition) {
memunmap(hv_cpu->synic_event_page); iounmap(hv_cpu->synic_event_page);
hv_cpu->synic_event_page = NULL; hv_cpu->synic_event_page = NULL;
} else { } else {
siefp.base_siefp_gpa = 0; siefp.base_siefp_gpa = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment