|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86: guard against port I/O overlapping the RTC/CMOS range
On Fri, Jul 17, 2020 at 03:10:43PM +0200, Jan Beulich wrote:
> Since we intercept RTC/CMOS port accesses, let's do so consistently in
> all cases, i.e. also for e.g. a dword access to [006E,0071]. To avoid
> the risk of unintended impact on Dom0 code actually doing so (despite
> the belief that none ought to exist), also extend
> guest_io_{read,write}() to decompose accesses where some ports are
> allowed to be directly accessed and some aren't.
Wouldn't the same apply to displaced accesses to port 0xcf8?
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> --- a/xen/arch/x86/pv/emul-priv-op.c
> +++ b/xen/arch/x86/pv/emul-priv-op.c
> @@ -210,7 +210,7 @@ static bool admin_io_okay(unsigned int p
> return false;
>
> /* We also never permit direct access to the RTC/CMOS registers. */
> - if ( ((port & ~1) == RTC_PORT(0)) )
> + if ( port <= RTC_PORT(1) && port + bytes > RTC_PORT(0) )
> return false;
>
> return ioports_access_permitted(d, port, port + bytes - 1);
> @@ -297,6 +297,17 @@ static uint32_t guest_io_read(unsigned i
> if ( pci_cfg_ok(currd, port & 3, size, NULL) )
> sub_data = pci_conf_read(currd->arch.pci_cf8, port & 3,
> size);
> }
> + else if ( ioports_access_permitted(currd, port, port) )
> + {
> + if ( bytes > 1 && !(port & 1) &&
> + ioports_access_permitted(currd, port, port + 1) )
> + {
> + sub_data = inw(port);
> + size = 2;
> + }
> + else
> + sub_data = inb(port);
> + }
>
> if ( size == 4 )
> return sub_data;
> @@ -373,25 +384,31 @@ static int read_io(unsigned int port, un
> return X86EMUL_OKAY;
> }
>
> +static void _guest_io_write(unsigned int port, unsigned int bytes,
> + uint32_t data)
There's nothing guest specific about this function I think? If so you
could drop the _guest_ prefix and just name it io_write?
> +{
> + switch ( bytes )
> + {
> + case 1:
> + outb((uint8_t)data, port);
> + if ( amd_acpi_c1e_quirk )
> + amd_check_disable_c1e(port, (uint8_t)data);
> + break;
> + case 2:
> + outw((uint16_t)data, port);
> + break;
> + case 4:
> + outl(data, port);
> + break;
> + }
Newlines after break statements would be nice, and maybe add a
default: ASSERT_UNREACHABLE() case to be on the safe side?
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |