Ever since it's introduction in commit
013351bd7ab3 ("Define new event-channel
and physdev hypercalls") in 2006, the public interface was named nr_ports
while the internal field was called iobmp_limit.
Rename the internal field to iobmp_nr to match the public interface, and
clarify that, when nonzero, Xen will read 2 bytes.
There isn't a perfect parallel with a real TSS, but iobmp_nr being 0 is the
paravirt "no IOPB" case, and it is important that no read occurs in this case.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit:
633ee8b2df963f7e5cb8de1219c1a48bfb4447f6
master date: 2024-10-01 14:58:18 +0100
/* I/O-port access bitmap. */
XEN_GUEST_HANDLE(uint8) iobmp; /* Guest kernel vaddr of the bitmap. */
- unsigned int iobmp_limit; /* Number of ports represented in the bitmap. */
+ unsigned int iobmp_nr; /* Number of ports represented in the bitmap. */
#define IOPL(val) MASK_INSR(val, X86_EFLAGS_IOPL)
unsigned int iopl; /* Current IOPL for this VCPU, shifted left by
* 12 to match the eflags register. */
#else
guest_from_compat_handle(curr->arch.pv.iobmp, set_iobitmap.bitmap);
#endif
- curr->arch.pv.iobmp_limit = set_iobitmap.nr_ports;
+ curr->arch.pv.iobmp_nr = set_iobitmap.nr_ports;
break;
}
if ( iopl_ok(v, regs) )
return X86EMUL_OKAY;
- if ( (port + bytes) <= v->arch.pv.iobmp_limit )
+ /*
+ * When @iobmp_nr is non-zero, Xen, like real CPUs and the TSS IOPB,
+ * always reads 2 bytes from @iobmp, which might be one byte @iobmp_nr.
+ */
+ if ( (port + bytes) <= v->arch.pv.iobmp_nr )
{
const void *__user addr = v->arch.pv.iobmp.p + (port >> 3);
uint16_t mask;
/*
* Set the current VCPU's I/O-port permissions bitmap.
* @arg == pointer to physdev_set_iobitmap structure.
+ *
+ * When @nr_ports is non-zero, Xen, like real CPUs and the TSS IOPB, always
+ * reads 2 bytes from @bitmap, which might be one byte beyond @nr_ports.
*/
#define PHYSDEVOP_set_iobitmap 7
struct physdev_set_iobitmap {