Hi, Richard,
On Sat, Mar 29, 2025 at 1:55 AM Richard Henderson
<[email protected]> wrote:
>
> Revert ee3863b9d41 and a08d60bc6c2b. The logic behind changing
> the system page size because of what the Loongson kernel "prefers"
> is flawed.
>
> In the Loongson-2E manual, section 5.5, it is clear that the cpu
> supports a 4k page size (along with many others). Therefore we
> must continue to support a 4k page size.
>
> Signed-off-by: Richard Henderson <[email protected]>
> ---
> target/mips/cpu-param.h | 5 -----
> hw/mips/fuloong2e.c | 1 -
> hw/mips/loongson3_virt.c | 1 -
> target/mips/tcg/system/cp0_helper.c | 7 +------
> target/mips/tcg/system/tlb_helper.c | 2 +-
> 5 files changed, 2 insertions(+), 14 deletions(-)
>
> diff --git a/target/mips/cpu-param.h b/target/mips/cpu-param.h
> index 11b3ac0ac6..8fcb1b4f5f 100644
> --- a/target/mips/cpu-param.h
> +++ b/target/mips/cpu-param.h
> @@ -18,12 +18,7 @@
> # define TARGET_VIRT_ADDR_SPACE_BITS 32
> #endif
> #endif
> -#ifdef CONFIG_USER_ONLY
> #define TARGET_PAGE_BITS 12
> -#else
> -#define TARGET_PAGE_BITS_VARY
> -#define TARGET_PAGE_BITS_MIN 12
> -#endif
I'm a bit confused about TARGET_PAGE_BITS and other macros.
In my opinion, if we define TARGET_PAGE_BITS as 12, that means we only
support 4K pages. And if we define TARGET_PAGE_BITS_VARY and
TARGET_PAGE_BITS_MIN as 12, that means we support the minimum page as
4K, but we also support larger pages.
Am I wrong?
>
> #define TCG_GUEST_DEFAULT_MO (0)
>
> diff --git a/hw/mips/fuloong2e.c b/hw/mips/fuloong2e.c
> index 646044e274..2a8507b8b0 100644
> --- a/hw/mips/fuloong2e.c
> +++ b/hw/mips/fuloong2e.c
> @@ -334,7 +334,6 @@ static void mips_fuloong2e_machine_init(MachineClass *mc)
> mc->default_cpu_type = MIPS_CPU_TYPE_NAME("Loongson-2E");
> mc->default_ram_size = 256 * MiB;
> mc->default_ram_id = "fuloong2e.ram";
> - mc->minimum_page_bits = 14;
Loongson prefers 16K pages not because it doesn't support 4K, but
because 4K pages cause cache aliases, which make the kernel difficult
to implement.
Huacai
> machine_add_audiodev_property(mc);
> }
>
> diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
> index db1cc51314..1da20dccec 100644
> --- a/hw/mips/loongson3_virt.c
> +++ b/hw/mips/loongson3_virt.c
> @@ -677,7 +677,6 @@ static void loongson3v_machine_class_init(ObjectClass
> *oc, void *data)
> mc->max_cpus = LOONGSON_MAX_VCPUS;
> mc->default_ram_id = "loongson3.highram";
> mc->default_ram_size = 1600 * MiB;
> - mc->minimum_page_bits = 14;
> mc->default_nic = "virtio-net-pci";
> }
>
> diff --git a/target/mips/tcg/system/cp0_helper.c
> b/target/mips/tcg/system/cp0_helper.c
> index 01a07a169f..8c2114c58a 100644
> --- a/target/mips/tcg/system/cp0_helper.c
> +++ b/target/mips/tcg/system/cp0_helper.c
> @@ -877,18 +877,13 @@ void update_pagemask(CPUMIPSState *env, target_ulong
> arg1, int32_t *pagemask)
> if ((mask >> maskbits) != 0) {
> goto invalid;
> }
> - /* We don't support VTLB entry smaller than target page */
> - if ((maskbits + TARGET_PAGE_BITS_MIN) < TARGET_PAGE_BITS) {
> - goto invalid;
> - }
> env->CP0_PageMask = mask << CP0PM_MASK;
>
> return;
>
> invalid:
> /* When invalid, set to default target page size. */
> - mask = (~TARGET_PAGE_MASK >> TARGET_PAGE_BITS_MIN);
> - env->CP0_PageMask = mask << CP0PM_MASK;
> + env->CP0_PageMask = 0;
> }
>
> void helper_mtc0_pagemask(CPUMIPSState *env, target_ulong arg1)
> diff --git a/target/mips/tcg/system/tlb_helper.c
> b/target/mips/tcg/system/tlb_helper.c
> index ca4d6b27bc..123639fa18 100644
> --- a/target/mips/tcg/system/tlb_helper.c
> +++ b/target/mips/tcg/system/tlb_helper.c
> @@ -875,7 +875,7 @@ refill:
> break;
> }
> }
> - pw_pagemask = m >> TARGET_PAGE_BITS_MIN;
> + pw_pagemask = m >> TARGET_PAGE_BITS;
> update_pagemask(env, pw_pagemask << CP0PM_MASK, &pw_pagemask);
> pw_entryhi = (address & ~0x1fff) | (env->CP0_EntryHi & 0xFF);
> {
> --
> 2.43.0
>