|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/5] xen/riscv: always set A/D bits at boot time
On 8/27/26 5:33 PM, Baptiste Le Duc wrote: Always set the PTE A/D bits at boot time to avoid an unhandled page fault on platforms that implement neither Svade nor Svadu, and on platforms that declare both in the device tree. Rewrite the comment to enumerate the four possible Svade/Svadu combinations (inspired by [1]) and set A/D unconditionally, which is correct in all four cases until Svadu is fully supported (full support requires the SBI FWFT call to enable hardware updating of A/D bits). [1] https://lwn.net/Articles/980016/ Assisted-by: Claude:claude-opus-5 Signed-off-by: Baptiste Le Duc <baptiste.le-duc@xxxxxxxxxx> --- xen/arch/riscv/p2m.c | 70 ++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/xen/arch/riscv/p2m.c b/xen/arch/riscv/p2m.c index 1cea86512c..11dc289f0f 100644 --- a/xen/arch/riscv/p2m.c +++ b/xen/arch/riscv/p2m.c @@ -591,38 +591,52 @@ static void p2m_set_permission(pte_t *e, p2m_type_t t) e->pte |= PTE_USER;/* I have a feeling that the DT-binding-related comment should not be present here, as it explains when Svadu or Svade should be considered enabled or disabled. We should perform this kind of detection in riscv_fill_hwcap() [cpufeature.c]. Then, in p2m_set_permission(), we should use riscv_isa_extension_available() to determine which extension is available and, based on that, set the A and D bits. At this point, I think the original comment was better, as it simply explained what Svade and Svadu are and, therefore, provided a better explanation of why the A and D bits should or should not be set. So, my suggestion is the following: +/* + * Svade and Svadu extensions represent two schemes for managing the PTE + * A/D bits. When the PTE A/D bits need to be set, the Svade extension + * indicates that a page fault will be raised. In contrast, the Svadu + * extension supports hardware updating of the PTE A/D bits. + *+ * There are 4 possible combinations of these extensions in the device tree. + * The default hardware behavior for each is: + * + * 1) Neither Svade nor Svadu present in DT => It is technically unknown + * whether the platform uses Svade or Svadu. Xen should be prepared to+ * handle either hardware updating of the PTE A/D bits or page faults when + * they need updating. To support both, Xen always sets the 'A' and 'D' PTE + * bits at boot time. + *+ * 2) Only Svade present in DT => Xen must assume Svade to be always enabled. + *+ * 3) Only Svadu present in DT => Xen must assume Svadu to be always enabled. + * + * 4) Both Svade and Svadu present in DT => Xen must assume Svadu is turned+ * off at boot time by setting A/D bits. To use Svadu, the supervisor must + * explicitly enable it using the SBI FWFT extension. + *+ * The Svade extension is mandatory and the Svadu extension is optional in the + * RVA23 profile. Platforms wanting to take advantage of Svadu can choose+ * option 3. Platforms aware of the profile can choose option 4, and Xen won't + * get the benefit of Svadu until the SBI FWFT extension is available. + * + * In other words, hardware manages the A/D bits on its own only in case 3;+ * in all the other cases software has to preset them. Instead of open coding + * this in every A/D bits user, RISCV_ISA_EXT_svade is used to mean "software + * is responsible for the A/D bits" and is set here for the cases 1, 2 and 4.
+ */
+static void __init riscv_resolve_ad_scheme(void)
+{
+ bool svade = riscv_isa_extension_available(NULL, RISCV_ISA_EXT_svade);
+ bool svadu = riscv_isa_extension_available(NULL, RISCV_ISA_EXT_svadu);
+
+ /* Case 3: leave the A/D bits management to hardware. */
+ if ( svadu && !svade )
+ return;
+
+ /* Cases 1, 2 and 4: Xen has to preset the A/D bits. */
+ __set_bit(RISCV_ISA_EXT_svade, riscv_isa);
+}
+
void __init riscv_fill_hwcap(void)
{
unsigned int i;
@@ -513,6 +560,8 @@ void __init riscv_fill_hwcap(void)
__set_bit(RISCV_ISA_EXT_sstc, riscv_isa);
}
+ riscv_resolve_ad_scheme();
+
And then ...
... we could restore the check and the comment we originally had in p2m_set_permission(), but probably with some updates, something along the following lines: /* * Xen has to preset the A/D bits unless the hardware is known to update * them on its own. riscv_fill_hwcap() folds all the Svade/Svadu device * tree combinations into RISCV_ISA_EXT_svade, which then means that * software is responsible for the A/D bits" (see * riscv_resolve_ad_scheme()). */ I have another comment regarding: > + /* > + * Preset unconditionally for all 4 cases above, harmless when Svadu> + * manages the bits (case 3). Skipping it for case 3 requires SBI FWFT > + * which is not yet supported. > */ > - if ( riscv_isa_extension_available(NULL, RISCV_ISA_EXT_svade) ) > - e->pte |= PTE_ACCESSED | PTE_DIRTY; > + e->pte |= PTE_ACCESSED | PTE_DIRTY;I am not sure that this comment is correct. In case 3, we should not need to use the SBI FWFT extension. Case 3 means that Xen must assume that Svadu is enabled. Therefore, it is the responsibility of OpenSBI, or the pre-bootloader that loads OpenSBI, to enable it. If it fails to do so, then OpenSBI or the pre-bootloader is not complying with the DT binding documentation and it should be fixed in first place.
As further evidence, this is what OpenSBI already does [1]:
/*
* Assume only Svadu is supported when it is the only extension
* present in the ISA string. Svade is assumed when neither are
* present. When both are present we must default to Svade (see
* the zero reset value of FWFT.PTE_AD_HW_UPDATING).
*/
if (!sbi_hart_has_extension(scratch, SBI_HART_EXT_SVADE))
__set_menvcfg_ext(SBI_HART_EXT_SVADU, ENVCFG_ADUE);
Therefore, in case 3, the original check is still valid, and there is no
need for Xen to support the SBI FWFT extension for this case. I think
the original check should therefore be kept as it was:
if ( riscv_isa_extension_available(NULL, RISCV_ISA_EXT_svade) )
e->pte |= PTE_ACCESSED | PTE_DIRTY;
The SBI FWFT extension is only required for case 4. If both Svade and
Svadu are present in the DT, Svade is selected by default. To use Svadu
instead, SBI FWFT is required to set the ADUE bit in menvcfg, which is
only accessible from M-mode.
Since SBI FWFT is relatively new and may not be supported by older OpenSBI versions, another option is to have OpenSBI hard-code ADUE=1. Alternatively, the DTS could specify only one of Svade or Svadu in the riscv,isa property. In that case, upstream OpenSBI can handle the configuration automatically. So specifically for our case (Svadu and Svade things) we don't need SBI FWFT at all. [1] https://github.com/riscv-software-src/opensbi/blob/master/lib/sbi/sbi_hart.c#L171 ~ Oleksii
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |