[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5] x86: detect CMOS aliasing on ports other than 0x70/0x71
On Mon, Apr 03, 2023 at 01:26:41PM +0200, Jan Beulich wrote: > On 03.04.2023 13:09, Roger Pau Monné wrote: > > On Thu, Mar 30, 2023 at 12:40:38PM +0200, Jan Beulich wrote: > >> ... in order to also intercept Dom0 accesses through the alias ports. > >> > >> Also stop intercepting accesses to the CMOS ports if we won't ourselves > >> use the CMOS RTC, because of there being none. > > > > So it's fine for dom0 to switch off NMIs if Xen isn't using the RTC? > > Seems like a weird side-effect of Xen not using the RTC (seeing as we > > would otherwise mask bit 8 from dom0 RTC accesses). > > I haven't been able to find documentation on this single bit in the > absence of RTC / CMOS. > > > Also I'm worried that when Xen doesn't intercept RTC ports accesses > > from dom0 could be interrupted for example by the vCPU being scheduled > > out, so a vCPU might perform a write to the index port, and be > > scheduled out, leaving the RTC in an undefined state. > > I did specifically add "because of there being none" to the sentence > to clarify in which case we avoid intercepting. Oh, right, sorry for the fuzz, I didn't parse that last bit of the sentence. I'm fine with the current wording then. > >> +bool is_cmos_port(unsigned int port, unsigned int bytes, const struct > >> domain *d) > >> +{ > >> + unsigned int offs; > >> + > >> + if ( !is_hardware_domain(d) || > >> + !(acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_CMOS_RTC) ) > >> + return port <= RTC_PORT(1) && port + bytes > RTC_PORT(0); > >> + > >> + if ( acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_CMOS_RTC ) > >> + return false; > >> + > >> + for ( offs = 2; offs <= cmos_alias_mask; offs <<= 1 ) > >> + { > >> + if ( !(offs & cmos_alias_mask) ) > >> + continue; > >> + if ( port <= RTC_PORT(offs | 1) && port + bytes > RTC_PORT(offs) ) > >> + return true; > >> + } > > > > Maybe I'm confused, but doesn't this loop start at RTC_PORT(2), and > > hence you need to check for the RTC_PORT(0,1) pair outside of the > > loop? > > The loop starts at offset 2, yes, but see the initial if() in the > function. Or at least I thought I got that right, but it looks like > I didn't (failed attempt to try to address a specific request of > yours, iirc). Hm, doesn't that first if() cause that on all systems with an RTC only PORTS(0,1) are allowed? > >> @@ -1256,23 +1330,25 @@ unsigned int rtc_guest_read(unsigned int > >> unsigned long flags; > >> unsigned int data = ~0; > >> > >> - switch ( port ) > >> + switch ( port & ~cmos_alias_mask ) > > > > Given that the call is gated with is_cmos_port() it would be clearer > > to just use RTC_PORT(1) as the mask here IMO. > > Hmm, personally I wouldn't consider RTC_PORT(1) to be reasonable to > use as a mask (even if technically it would be okay). OK, never mind then. Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |