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.
+ */
+ 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
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). > + */ > + 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
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
On Thu, Nov 02, 2023 at 09:53:50AM -0300, Daniel Henrique Barboza wrote: > > > 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. It's both. It's the limit and, in the absence of user input, its used as the default. Setting the limit is fine for a no-default cpu type, but allowing it to become the default is not. We need to also modify set_satp_mode_default_map() to only do what it does for non no-default cpus types. Thanks, drew
© 2016 - 2024 Red Hat, Inc.