|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 4/6] x86/vPIT: check values loaded from state save record
On Tue, Nov 28, 2023 at 11:35:18AM +0100, Jan Beulich wrote:
> In particular pit_latch_status() and speaker_ioport_read() perform
> calculations which assume in-bounds values. Several of the state save
> record fields can hold wider ranges, though. Refuse to load values which
> cannot result from normal operation, except mode, the init state of
> which (see also below) cannot otherwise be reached.
>
> Note that ->gate should only be possible to be zero for channel 2;
> enforce that as well.
>
> Adjust pit_reset()'s writing of ->mode as well, to not unduly affect
> the value pit_latch_status() may calculate. The chosen mode of 7 is
> still one which cannot be established by writing the control word. Note
> that with or without this adjustment effectively all switch() statements
> using mode as the control expression aren't quite right when the PIT is
> still in that init state; there is an apparent assumption that before
> these can sensibly be invoked, the guest would init the PIT (i.e. in
> particular set the mode).
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> ---
> For mode we could refuse to load values in the [0x08,0xfe] range; I'm
I'm missing something, why should we accept a 0xff mode? Don't modes
go up to 7 at most (0b111, mode 3).
> not certain that's going to be overly helpful.
I don't have a strong opinion. Could be done in a separate change
anyway. I guess since we are at it it might be worth to check for as
much as we can, even if it's not going to affect the logic.
> For count I was considering to clip the saved value to 16 bits (i.e. to
> convert the internally used 0x10000 back to the architectural 0x0000),
> but pit_save() doesn't easily lend itself to such a "fixup". If desired
> perhaps better a separate change anyway.
I would prefer a separate change iff you want to implement this.
> ---
> v3: Slightly adjust two comments. Re-base over rename in earlier patch.
> v2: Introduce separate checking function; switch to refusing to load
> bogus values. Re-base.
>
> --- a/xen/arch/x86/emul-i8254.c
> +++ b/xen/arch/x86/emul-i8254.c
> @@ -47,6 +47,7 @@
> #define RW_STATE_MSB 2
> #define RW_STATE_WORD0 3
> #define RW_STATE_WORD1 4
> +#define RW_STATE_NUM 5
>
> #define get_guest_time(v) \
> (is_hvm_vcpu(v) ? hvm_get_guest_time(v) : (u64)get_s_time())
> @@ -427,6 +428,47 @@ static int cf_check pit_save(struct vcpu
> return rc;
> }
>
> +static int cf_check pit_check(const struct domain *d, hvm_domain_context_t
> *h)
> +{
> + const struct hvm_hw_pit *hw;
> + unsigned int i;
> +
> + if ( !has_vpit(d) )
> + return -ENODEV;
> +
> + hw = hvm_get_entry(PIT, h);
> + if ( !hw )
> + return -ENODATA;
> +
> + /*
> + * Check to-be-loaded values are within valid range, for them to
> represent
> + * actually reachable state. Uses of some of the values elsewhere assume
> + * this is the case. Note that the channels' mode fields aren't checked;
> + * Xen prior to 4.19 might save them as 0xff.
Oh, OK, so that explains the weird 0xff mode.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |