[kvm-unit-tests PATCH v9 22/31] powerpc: Add MMU support

Thomas Huth thuth at redhat.com
Tue Jun 4 17:30:52 AEST 2024


On 04/05/2024 14.28, Nicholas Piggin wrote:
> Add support for radix MMU, 4kB and 64kB pages.
> 
> This also adds MMU interrupt test cases, and runs the interrupts
> test entirely with MMU enabled if it is available (aside from
> machine check tests).
> 
> Acked-by: Andrew Jones <andrew.jones at linux.dev> (configure changes)
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
> ---
...
> diff --git a/lib/ppc64/mmu.c b/lib/ppc64/mmu.c
> new file mode 100644
> index 000000000..5307cd862
> --- /dev/null
> +++ b/lib/ppc64/mmu.c
> @@ -0,0 +1,281 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Radix MMU support
> + *
> + * Copyright (C) 2024, IBM Inc, Nicholas Piggin <npiggin at gmail.com>
> + *
> + * Derived from Linux kernel MMU code.
> + */
> +#include <asm/mmu.h>
> +#include <asm/setup.h>
> +#include <asm/smp.h>
> +#include <asm/page.h>
> +#include <asm/io.h>
> +#include <asm/processor.h>
> +#include <asm/hcall.h>
> +
> +#include "alloc_page.h"
> +#include "vmalloc.h"
> +#include <asm/pgtable-hwdef.h>
> +#include <asm/pgtable.h>
> +
> +#include <linux/compiler.h>
> +
> +static pgd_t *identity_pgd;
> +
> +bool vm_available(void)
> +{
> +	return cpu_has_radix;
> +}
> +
> +bool mmu_enabled(void)
> +{
> +	return current_cpu()->pgtable != NULL;
> +}
> +
> +void mmu_enable(pgd_t *pgtable)
> +{
> +	struct cpu *cpu = current_cpu();
> +
> +	if (!pgtable)
> +		pgtable = identity_pgd;
> +
> +	cpu->pgtable = pgtable;
> +
> +	mtmsr(mfmsr() | (MSR_IR|MSR_DR));
> +}
> +
> +void mmu_disable(void)
> +{
> +	struct cpu *cpu = current_cpu();
> +
> +	cpu->pgtable = NULL;
> +
> +	mtmsr(mfmsr() & ~(MSR_IR|MSR_DR));
> +}
> +
> +static inline void tlbie(unsigned long rb, unsigned long rs, int ric, int prs, int r)
> +{
> +	asm volatile(".machine push ; .machine power9; ptesync ; tlbie %0,%1,%2,%3,%4 ; eieio ; tlbsync ; ptesync ; .machine pop" :: "r"(rb), "r"(rs), "i"(ric), "i"(prs), "i"(r) : "memory");

That's a very long line, please split it up after every assembly instruction 
(using \n for new lines).

> +}
...
> diff --git a/powerpc/mmu.c b/powerpc/mmu.c
> new file mode 100644
> index 000000000..fef790506
> --- /dev/null
> +++ b/powerpc/mmu.c
> @@ -0,0 +1,283 @@
> +/* SPDX-License-Identifier: LGPL-2.0-only */
> +/*
> + * MMU Tests
> + *
> + * Copyright 2024 Nicholas Piggin, IBM Corp.
> + */
> +#include <libcflat.h>
> +#include <asm/atomic.h>
> +#include <asm/barrier.h>
> +#include <asm/processor.h>
> +#include <asm/mmu.h>
> +#include <asm/smp.h>
> +#include <asm/setup.h>
> +#include <asm/ppc_asm.h>
> +#include <vmalloc.h>
> +#include <devicetree.h>
> +
> +static inline void tlbie(unsigned long rb, unsigned long rs, int ric, int prs, int r)
> +{
> +	asm volatile(".machine push ; .machine power9; ptesync ; tlbie %0,%1,%2,%3,%4 ; eieio ; tlbsync ; ptesync ; .machine pop" :: "r"(rb), "r"(rs), "i"(ric), "i"(prs), "i"(r) : "memory");
> +}

Same function again? Maybe it could go into mmu.h instead?

> +static inline void tlbiel(unsigned long rb, unsigned long rs, int ric, int prs, int r)
> +{
> +	asm volatile(".machine push ; .machine power9; ptesync ; tlbiel %0,%1,%2,%3,%4 ; ptesync ; .machine pop" :: "r"(rb), "r"(rs), "i"(ric), "i"(prs), "i"(r) : "memory");
> +}

Please also split up the above long line.

It would also be cool if you could get one of the other ppc guys at IBM to 
review this patch, since I don't have a clue about this MMU stuff at all.

  Thanks,
   Thomas



More information about the Linuxppc-dev mailing list