From: "Roger Pau Monné" <roger.pau@citrix.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
Andrew Cooper <andrew.cooper3@citrix.com>, Wei Liu <wl@xen.org>
Subject: Re: [PATCH v3 4/6] x86/vPIT: check values loaded from state save record
Date: Mon, 4 Dec 2023 18:46:35 +0100 [thread overview]
Message-ID: <ZW4Qe1H-v0dqu2YS@macbook> (raw)
In-Reply-To: <cf1ff132-878a-4cb6-8eae-1995a78576a0@suse.com>
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@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
> ---
> 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.
next prev parent reply other threads:[~2023-12-04 17:47 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-28 10:32 [PATCH v3 0/6] x86/HVM: load state checking Jan Beulich
2023-11-28 10:33 ` [PATCH v3 1/6] x86/HVM: introduce hvm_get_entry() Jan Beulich
2023-11-28 10:34 ` [PATCH v3 2/6] x86/HVM: split restore state checking from state loading Jan Beulich
2023-12-04 17:27 ` Roger Pau Monné
2023-12-05 8:52 ` Jan Beulich
2023-12-05 14:29 ` Roger Pau Monné
2023-12-05 14:59 ` Jan Beulich
2023-12-05 15:55 ` Roger Pau Monné
2023-12-06 7:27 ` Jan Beulich
2023-12-11 10:46 ` Roger Pau Monné
2023-12-11 11:31 ` Jan Beulich
2023-12-11 12:43 ` Roger Pau Monné
2023-12-11 13:15 ` Jan Beulich
2023-11-28 10:34 ` [PATCH v3 3/6] x86/HVM: adjust save/restore hook registration for optional check handler Jan Beulich
2023-11-28 10:35 ` [PATCH v3 4/6] x86/vPIT: check values loaded from state save record Jan Beulich
2023-12-04 17:46 ` Roger Pau Monné [this message]
2023-11-28 10:35 ` [PATCH v3 5/6] x86/vPIC: vpic_elcr_mask() master bit 2 control Jan Beulich
2023-12-05 17:29 ` Roger Pau Monné
2023-12-06 7:22 ` Jan Beulich
2023-11-28 10:36 ` [PATCH v3 6/6] x86/vPIC: check values loaded from state save record Jan Beulich
2023-12-05 17:41 ` Roger Pau Monné
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZW4Qe1H-v0dqu2YS@macbook \
--to=roger.pau@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.