#include <xen/lib.h>
#include <xen/errno.h>
#include <xen/sched.h>
+#include <xen/nospec.h>
#include <public/hvm/ioreq.h>
#include <asm/hvm/io.h>
#include <asm/hvm/vpic.h>
{
unsigned int i;
+ /*
+ * Make sure the compiler does not optimize away the initialization done by
+ * callers
+ */
+ OPTIMIZER_HIDE_VAR(*pin);
+
for ( i = 0; i < d->arch.hvm.nr_vioapics; i++ )
{
struct hvm_vioapic *vioapic = domain_vioapic(d, i);
break;
}
- redir_content = vioapic->redirtbl[redir_index].bits;
+ redir_content = vioapic->redirtbl[array_index_nospec(redir_index,
+ vioapic->nr_pins)].bits;
result = (vioapic->ioregsel & 1) ? (redir_content >> 32)
: redir_content;
break;
struct hvm_irq *hvm_irq = hvm_domain_irq(d);
union vioapic_redir_entry *pent, ent;
int unmasked = 0;
- unsigned int gsi = vioapic->base_gsi + idx;
+ unsigned int gsi;
+
+ /* Callers of this function should make sure idx is bounded appropriately */
+ ASSERT(idx < vioapic->nr_pins);
+
+ /* Make sure no out-of-bounds value for idx can be used */
+ idx = array_index_nospec(idx, vioapic->nr_pins);
+
+ gsi = vioapic->base_gsi + idx;
spin_lock(&d->arch.hvm.irq_lock);
void vioapic_irq_positive_edge(struct domain *d, unsigned int irq)
{
- unsigned int pin;
+ unsigned int pin = 0; /* See gsi_vioapic */
struct hvm_vioapic *vioapic = gsi_vioapic(d, irq, &pin);
union vioapic_redir_entry *ent;
int vioapic_get_mask(const struct domain *d, unsigned int gsi)
{
- unsigned int pin;
+ unsigned int pin = 0; /* See gsi_vioapic */
const struct hvm_vioapic *vioapic = gsi_vioapic(d, gsi, &pin);
if ( !vioapic )
int vioapic_get_vector(const struct domain *d, unsigned int gsi)
{
- unsigned int pin;
+ unsigned int pin = 0; /* See gsi_vioapic */
const struct hvm_vioapic *vioapic = gsi_vioapic(d, gsi, &pin);
if ( !vioapic )
int vioapic_get_trigger_mode(const struct domain *d, unsigned int gsi)
{
- unsigned int pin;
+ unsigned int pin = 0; /* See gsi_vioapic */
const struct hvm_vioapic *vioapic = gsi_vioapic(d, gsi, &pin);
if ( !vioapic )