Skip to content

Commit 18569c1

Browse files
paulusmackmpe
authored andcommitted
powerpc/64: Don't try to use radix MMU under a hypervisor
Currently, if the kernel is running on a POWER9 processor under a hypervisor, it will try to use the radix MMU even though it doesn't have the necessary code to use radix under a hypervisor (it doesn't negotiate use of radix, and it doesn't do the H_REGISTER_PROC_TBL hcall). The result is that the guest kernel will crash when it tries to turn on the MMU. This fixes it by looking for the /chosen/ibm,architecture-vec-5 property, and if it exists, clears the radix MMU feature bit, before we decide whether to initialize for radix or HPT. This property is created by the hypervisor as a result of the guest calling the ibm,client-architecture-support method to indicate its capabilities, so it will indicate whether the hypervisor agreed to us using radix. Systems without a hypervisor may have this property also (for example, skiboot creates it), so we check the HV bit in the MSR to see whether we are running as a guest or not. If we are in hypervisor mode, then we can do whatever we like including using the radix MMU. The reason for using this property is that in future, when we have support for using radix under a hypervisor, we will need to check this property to see whether the hypervisor agreed to us using radix. Fixes: 2bfd65e ("powerpc/mm/radix: Add radix callbacks for early init routines") Cc: [email protected] # v4.7+ Signed-off-by: Paul Mackerras <[email protected]> Signed-off-by: Michael Ellerman <[email protected]>
1 parent a97a65d commit 18569c1

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

arch/powerpc/mm/init_64.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
#include <linux/memblock.h>
4343
#include <linux/hugetlb.h>
4444
#include <linux/slab.h>
45+
#include <linux/of_fdt.h>
46+
#include <linux/libfdt.h>
4547

4648
#include <asm/pgalloc.h>
4749
#include <asm/page.h>
@@ -344,12 +346,43 @@ static int __init parse_disable_radix(char *p)
344346
}
345347
early_param("disable_radix", parse_disable_radix);
346348

349+
/*
350+
* If we're running under a hypervisor, we currently can't do radix
351+
* since we don't have the code to do the H_REGISTER_PROC_TBL hcall.
352+
* We tell that we're running under a hypervisor by looking for the
353+
* /chosen/ibm,architecture-vec-5 property.
354+
*/
355+
static void early_check_vec5(void)
356+
{
357+
unsigned long root, chosen;
358+
int size;
359+
const u8 *vec5;
360+
361+
root = of_get_flat_dt_root();
362+
chosen = of_get_flat_dt_subnode_by_name(root, "chosen");
363+
if (chosen == -FDT_ERR_NOTFOUND)
364+
return;
365+
vec5 = of_get_flat_dt_prop(chosen, "ibm,architecture-vec-5", &size);
366+
if (!vec5)
367+
return;
368+
cur_cpu_spec->mmu_features &= ~MMU_FTR_TYPE_RADIX;
369+
}
370+
347371
void __init mmu_early_init_devtree(void)
348372
{
349373
/* Disable radix mode based on kernel command line. */
350374
if (disable_radix)
351375
cur_cpu_spec->mmu_features &= ~MMU_FTR_TYPE_RADIX;
352376

377+
/*
378+
* Check /chosen/ibm,architecture-vec-5 if running as a guest.
379+
* When running bare-metal, we can use radix if we like
380+
* even though the ibm,architecture-vec-5 property created by
381+
* skiboot doesn't have the necessary bits set.
382+
*/
383+
if (early_radix_enabled() && !(mfmsr() & MSR_HV))
384+
early_check_vec5();
385+
353386
if (early_radix_enabled())
354387
radix__early_init_devtree();
355388
else

0 commit comments

Comments
 (0)