diff options
Diffstat (limited to '0031-x86-pv-Rename-pv.iobmp_limit-to-iobmp_nr-and-clarify.patch')
-rw-r--r-- | 0031-x86-pv-Rename-pv.iobmp_limit-to-iobmp_nr-and-clarify.patch | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/0031-x86-pv-Rename-pv.iobmp_limit-to-iobmp_nr-and-clarify.patch b/0031-x86-pv-Rename-pv.iobmp_limit-to-iobmp_nr-and-clarify.patch new file mode 100644 index 0000000..4297b5c --- /dev/null +++ b/0031-x86-pv-Rename-pv.iobmp_limit-to-iobmp_nr-and-clarify.patch @@ -0,0 +1,87 @@ +From 313ff5a2d5d24feb21cb98f5329d834e413446c4 Mon Sep 17 00:00:00 2001 +From: Andrew Cooper <andrew.cooper3@citrix.com> +Date: Tue, 29 Oct 2024 16:38:41 +0100 +Subject: [PATCH 31/56] x86/pv: Rename pv.iobmp_limit to iobmp_nr and clarify + behaviour + +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 +--- + xen/arch/x86/include/asm/domain.h | 2 +- + xen/arch/x86/physdev.c | 2 +- + xen/arch/x86/pv/emul-priv-op.c | 6 +++++- + xen/include/public/physdev.h | 3 +++ + 4 files changed, 10 insertions(+), 3 deletions(-) + +diff --git a/xen/arch/x86/include/asm/domain.h b/xen/arch/x86/include/asm/domain.h +index 53876472fe..0d2d2b6623 100644 +--- a/xen/arch/x86/include/asm/domain.h ++++ b/xen/arch/x86/include/asm/domain.h +@@ -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. */ +diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c +index 2f1d955a96..39967cf2e5 100644 +--- a/xen/arch/x86/physdev.c ++++ b/xen/arch/x86/physdev.c +@@ -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; + } + +diff --git a/xen/arch/x86/pv/emul-priv-op.c b/xen/arch/x86/pv/emul-priv-op.c +index e35285d4ab..70150c2722 100644 +--- a/xen/arch/x86/pv/emul-priv-op.c ++++ b/xen/arch/x86/pv/emul-priv-op.c +@@ -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; +diff --git a/xen/include/public/physdev.h b/xen/include/public/physdev.h +index f0c0d4727c..d694104cd8 100644 +--- a/xen/include/public/physdev.h ++++ b/xen/include/public/physdev.h +@@ -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 { +-- +2.47.0 + |