qemu-riscv
[Top][All Lists]
Advanced

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

Re: [PATCH v8 03/19] target/riscv/cpu.c: set satp_max_supported in cpu_r


From: Daniel Henrique Barboza
Subject: Re: [PATCH v8 03/19] target/riscv/cpu.c: set satp_max_supported in cpu_riscv_set_satp()
Date: Thu, 2 Nov 2023 09:53:50 -0300
User-agent: Mozilla Thunderbird



On 11/2/23 06:24, Andrew Jones wrote:
On Wed, Nov 01, 2023 at 05:41:48PM -0300, Daniel Henrique Barboza wrote:
The setter() for the boolean attributes that set satp_mode (sv32, sv39,
sv48, sv57, sv64) considers that the CPU will always do a
set_satp_mode_max_supported() during cpu_init().

This is not the case for the KVM 'host' CPU, and we'll add another CPU
that won't set satp_mode_max() during cpu_init(). Users should be able
to set a max_support in these circunstances.

Allow cpu_riscv_set_satp() to set satp_mode_max_supported if the CPU
didn't set one prior.

Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
---
  target/riscv/cpu.c | 11 +++++++++++
  1 file changed, 11 insertions(+)

diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 822970345c..9f6837ecb7 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1100,6 +1100,7 @@ static void cpu_riscv_get_satp(Object *obj, Visitor *v, 
const char *name,
  static void cpu_riscv_set_satp(Object *obj, Visitor *v, const char *name,
                                 void *opaque, Error **errp)
  {
+    RISCVCPU *cpu = RISCV_CPU(obj);
      RISCVSATPMap *satp_map = opaque;
      uint8_t satp = satp_mode_from_str(name);
      bool value;
@@ -1108,6 +1109,16 @@ static void cpu_riscv_set_satp(Object *obj, Visitor *v, 
const char *name,
          return;
      }
+ /*
+     * Allow users to set satp max supported if the CPU didn't
+     * set any during cpu_init(). First value set to 'true'
+     * in this case is assumed to be the max supported for
+     * the CPU.

Hmm, doesn't that mean if a user does

  -cpu rv64,sv39=true,sv48=true

then the max is set to sv39 instead of sv48?

I made a mistake in my last review by stating we shouldn't set the max
supported satp for rv64i to the maximum satp that TCG supports. I forgot
how all of it worked. Setting the _supported_ modes to the maximum that
TCG supports makes sense as long as we don't default to any of them for
rv64i. So, I think we should return the set_satp_mode_max_supported() to
rv64i's definition (passing VM_1_10_SV57 or maybe even VM_1_10_SV64) and
then change set_satp_mode_default_map() to error out for rv64i (or maybe
for all "bare" type cpus).

Ok, then let's set max supported mode to SV64 (the maximum we allow).

Then we don't need to do anything else - setting a max supported value will 
allow
TCG to handle it accordingly with OpenSBI and the kernel, and a suitable 
satp_mode
will be picked by them. We can leave finalize() untouched.

I'll make a note in cpu_init() to remind ourselves that we're not setting a 
default
satp_mode value, but a *limit* for the satp_mode value the CPU can handle. This 
can be
done in the 'rv64i' patch.


Thanks,


Daniel





+     */
+    if (value && cpu->cfg.satp_mode.supported == 0) {
+        set_satp_mode_max_supported(cpu, satp);
+    }
+
      satp_map->map = deposit32(satp_map->map, satp, 1, value);
      satp_map->init |= 1 << satp;
  }
--
2.41.0


Thanks,
drew



reply via email to

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