mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/pv: Rename pv.iobmp_limit to iobmp_nr and clarify behaviour
Ever since it's introduction in commit013351bd7a("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:633ee8b2dfmaster date: 2024-10-01 14:58:18 +0100
This commit is contained in:
1 parent
008808ac95
commit
313ff5a2d5
4 files changed
+10
-3
No files matched your search
@@ -574,7 +574,7 @@ struct pv_vcpu
|
||||
|
||||
/* 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. */
|
||||
|
||||
@@ -433,7 +433,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
|
||||
#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;
|
||||
}
|
||||
|
||||
|
||||
@@ -167,7 +167,11 @@ static int guest_io_okay(unsigned int port, unsigned int bytes,
|
||||
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;
|
||||
|
||||
@@ -87,6 +87,9 @@ DEFINE_XEN_GUEST_HANDLE(physdev_set_iopl_t);
|
||||
/*
|
||||
* 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 {
|
||||
|
||||