qemu-riscv
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v6 00/25] target/riscv: MSTATUS_SUM + cleanups


From: Richard Henderson
Subject: Re: [PATCH v6 00/25] target/riscv: MSTATUS_SUM + cleanups
Date: Sat, 25 Mar 2023 22:17:03 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0

On 3/25/23 03:54, Richard Henderson wrote:
This builds on Fei and Zhiwei's SUM and TB_FLAGS changes.

   * Reclaim 5 TB_FLAGS bits, since we nearly ran out.

   * Using cpu_mmu_index(env, true) is insufficient to implement
     HLVX properly.  While that chooses the correct mmu_idx, it
     does not perform the read with execute permission.
     I add a new tcg interface to perform a read-for-execute with
     an arbitrary mmu_idx.  This is still not 100% compliant, but
     it's closer.

   * Handle mstatus.MPV in cpu_mmu_index.
   * Use vsstatus.SUM when required for MMUIdx_S_SUM.
   * Cleanups for get_physical_address.

While this passes check-avocado, I'm sure that's insufficient.
Please have a close look.

Somewhere after either patch 16 or 17, when env->virt is considered in riscv_cpu_mmu_index and a few other bugs are fixed, we can do

--- a/target/riscv/cpu_helper.c
+++ b/target/riscv/cpu_helper.c
@@ -591,11 +591,6 @@ void riscv_cpu_set_virt_enabled
         return;
     }

-    /* Flush the TLB on all virt mode changes. */
-    if (get_field(env->virt, VIRT_ONOFF) != enable) {
-        tlb_flush(env_cpu(env));
-    }
-
     env->virt = set_field(env->virt, VIRT_ONOFF, enable);

     if (enable) {
-- %< --

Because we're no longer trying to overlap the VS and HS tlbs on the same mmuidx.

I have been pondering additional changes that would avoid flushing for MXR changes, so that user-lookups from M-mode firmware gets the same advantage as has just been done for SUM. But this is complicated by needing 12 (!) more mmuidx, which cannot currently be represented, nor does it even seem like the best idea.


r~



reply via email to

[Prev in Thread] Current Thread [Next in Thread]