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

Re: [PATCH v9 1/1] xen/riscv: probe the A/D update scheme if the DT advertises neither



On 2026-10-28 10:25:53+01:00, Oleksii Kurochko wrote:
> [ ... 27 lines skipped ... ]
> fixmap.h asks for xen_fixmap[] to be accessed directly only when
> set_fixmap() is unusable. It is unusable here, as pt_update_entry() 
> always sets A and D, but I think the comment should say so. Otherwise 
> someone may "clean this up" by switching to set_fixmap(), after which 
> the probe silently always reports Svadu, and on a Svade platform G-stage 
> PTEs are then created with A/D clear.
> 
> The current comment also reads as if the page had to be mapped already,
> while what makes using the Xen image correct is that A and D belong to
> the PTE, not to the page, so those set in the Xen image mapping don't
> matter. Something like:
> 
>      /*
>       * set_fixmap() can't be used, as pt_update_entry() always sets A 
> and D.
>       *
>       * A and D belong to the PTE, not to the page, so a new PTE with A 
> and D
>       * clear can point to any RAM page, whatever its other mappings. 
> Use the
>       * first page of the Xen image, and map it read-only so that Xen 
> can't be
>       * corrupted through this alias.
>       */
> 
> 
> I am okay to go with how the comment is written now and apply my 
> suggestion only in the case if v10 will be needed (and likely it will 
> look at the comment about fence below)
I will use that in v10 thanks.
> [ ... 11 lines skipped ... ]
> > +    a_set = read_pte(entry).pte & PTE_ACCESSED;
> 
> I think a fence is needed between the load and reading the PTE back. The
> spec only orders the A bit update against accesses to the same virtual
> page:
> 
>    "Furthermore, the PTE update must appear in the global memory order no
>    later than the explicit memory access, or any subsequent explicit 
> memory access to that virtual page by the local hart."
> 
> read_pte() accesses a different virtual page, and RVWMO doesn't order 
> two loads to different addresses, so on a hart which updates A/D in 
> hardware read_pte() may still observe A clear. That fails safe (Svade 
> gets recorded and A/D are preset), but the message below then asks to 
> add the wrong extension to the DT, and an out-of-order core like the 
> P550 is exactly where this could happen. Ordering the load before the 
> PTE read is enough, as the A bit update is in turn ordered before the load:
> 
>      /* Order the load, hence its A bit update, before reading the PTE. */
>      RISCV_FENCE(r, r);
Good catch thanks, will apply that in v10.
> [ ... 12 lines skipped ... ]
> [...]
> 
> I gave it a try on QEMU 9.0 on top of current staging (virt with
> aia=aplic-imsic, all with svpbmt=on):
>   - default (svadu): the probe doesn't run;
>   - svadu=off (hardware updating, neither in the DT): "probed svadu";
>   - svadu=off,svade=on with "_svade" dropped from riscv,isa: the load
>     faults, the extable fixup works, "probed svade";
>   - svadu=off,svade=on: the probe doesn't run.
> All of them reach "All set up" so:
>   Tested-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
Thanks for having tested.

-- 
Baptiste Le Duc <baptiste.le-duc@xxxxxxxxxx>



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.