|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v6] x86: detect CMOS aliasing on ports other than 0x70/0x71
On Tue, Apr 18, 2023 at 11:24:19AM +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.
>
> Note that rtc_init() deliberately uses 16 as the upper loop bound,
> despite probe_cmos_alias() using 8: The higher bound is benign now, but
> would save us touching the code (or, worse, missing to touch it) in case
> the lower one was doubled.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> ---
> v6: Restore lost "return" in rtc_init(). Convert printk() to dprintk()
> in probe_cmos_alias(). Correct is_cmos_port() for hwdom.
> v5: Simplify logic in is_cmos_port(). Limit the scope of a local
> variable. Adjust a comment that's being moved.
> v4: Also conditionally mask top bit for guest index port accesses. Add
> missing adjustments to rtc_init(). Re-work to avoid recursive
> read_lock(). Also adjust guest_io_{read,write}(). Re-base.
> v3: Re-base over change to earlier patch.
> v2: Re-base.
>
> --- a/xen/arch/x86/hvm/rtc.c
> +++ b/xen/arch/x86/hvm/rtc.c
> @@ -27,7 +27,7 @@
> #include <asm/hvm/vpt.h>
> #include <asm/hvm/io.h>
> #include <asm/hvm/save.h>
> -#include <asm/current.h>
> +#include <asm/iocap.h>
> #include <xen/trace.h>
> #include <public/hvm/params.h>
>
> @@ -836,9 +836,19 @@ void rtc_init(struct domain *d)
>
> if ( !has_vrtc(d) )
> {
> - if ( is_hardware_domain(d) )
> - /* Hardware domain gets mediated access to the physical RTC. */
> - register_portio_handler(d, RTC_PORT(0), 2, hw_rtc_io);
> + unsigned int port;
> +
> + if ( !is_hardware_domain(d) )
> + return;
> +
> + /*
> + * Hardware domain gets mediated access to the physical RTC/CMOS (of
> + * course unless we don't use it ourselves, for there being none).
> + */
> + for ( port = RTC_PORT(0); port < RTC_PORT(0) + 0x10; port += 2 )
> + if ( is_cmos_port(port, 2, d) )
> + register_portio_handler(d, port, 2, hw_rtc_io);
> +
> return;
> }
>
> --- a/xen/arch/x86/include/asm/mc146818rtc.h
> +++ b/xen/arch/x86/include/asm/mc146818rtc.h
> @@ -9,6 +9,10 @@
>
> extern spinlock_t rtc_lock; /* serialize CMOS RAM access */
>
> +struct domain;
> +bool is_cmos_port(unsigned int port, unsigned int bytes,
> + const struct domain *d);
> +
> /**********************************************************************
> * register summary
> **********************************************************************/
> --- a/xen/arch/x86/pv/emul-priv-op.c
> +++ b/xen/arch/x86/pv/emul-priv-op.c
> @@ -208,7 +208,7 @@ static bool admin_io_okay(unsigned int p
> return false;
>
> /* We also never permit direct access to the RTC/CMOS registers. */
Hm, it's unclear to me whether the comment above would need updating:
we don't allow direct access to the RTC/CMOS registers, but we allow
direct access to the RTC/CMOS ports if there's no device behind.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |