diff options
Diffstat (limited to 'arch/x86/xen/enlighten_pv.c')
| -rw-r--r-- | arch/x86/xen/enlighten_pv.c | 25 | 
1 files changed, 25 insertions, 0 deletions
| diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c index 79409120a603..507f4fb88fa7 100644 --- a/arch/x86/xen/enlighten_pv.c +++ b/arch/x86/xen/enlighten_pv.c @@ -72,6 +72,9 @@  #include <asm/mwait.h>  #include <asm/pci_x86.h>  #include <asm/cpu.h> +#ifdef CONFIG_X86_IOPL_IOPERM +#include <asm/io_bitmap.h> +#endif  #ifdef CONFIG_ACPI  #include <linux/acpi.h> @@ -837,6 +840,25 @@ static void xen_load_sp0(unsigned long sp0)  	this_cpu_write(cpu_tss_rw.x86_tss.sp0, sp0);  } +#ifdef CONFIG_X86_IOPL_IOPERM +static void xen_update_io_bitmap(void) +{ +	struct physdev_set_iobitmap iobitmap; +	struct tss_struct *tss = this_cpu_ptr(&cpu_tss_rw); + +	native_tss_update_io_bitmap(); + +	iobitmap.bitmap = (uint8_t *)(&tss->x86_tss) + +			  tss->x86_tss.io_bitmap_base; +	if (tss->x86_tss.io_bitmap_base == IO_BITMAP_OFFSET_INVALID) +		iobitmap.nr_ports = 0; +	else +		iobitmap.nr_ports = IO_BITMAP_BITS; + +	HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &iobitmap); +} +#endif +  static void xen_io_delay(void)  {  } @@ -1047,6 +1069,9 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = {  	.write_idt_entry = xen_write_idt_entry,  	.load_sp0 = xen_load_sp0, +#ifdef CONFIG_X86_IOPL_IOPERM +	.update_io_bitmap = xen_update_io_bitmap, +#endif  	.io_delay = xen_io_delay,  	/* Xen takes care of %gs when switching to usermode for us */ |