struct hvm_function_table hvm_funcs __read_mostly;
-#define HVM_IOBITMAP_SIZE (3*PAGE_SIZE)
-/*
- * The I/O permission bitmap is globally shared by all HVM guests except
- * the hardware domain that has a more permissive IO bitmap.
- */
+/* I/O permission bitmap is globally shared by all HVM guests. */
unsigned long __attribute__ ((__section__ (".bss.page_aligned")))
- hvm_io_bitmap[HVM_IOBITMAP_SIZE/BYTES_PER_LONG];
+ hvm_io_bitmap[3*PAGE_SIZE/BYTES_PER_LONG];
/* Xen command-line option to enable HAP */
static bool_t __initdata opt_hap_enabled = 1;
goto fail1;
d->arch.hvm_domain.io_handler->num_slot = 0;
- /* Set the default IO Bitmap */
- if ( is_hardware_domain(d) )
- {
- d->arch.hvm_domain.io_bitmap = _xmalloc(HVM_IOBITMAP_SIZE, PAGE_SIZE);
- if ( d->arch.hvm_domain.io_bitmap == NULL )
- {
- rc = -ENOMEM;
- goto fail1;
- }
- memset(d->arch.hvm_domain.io_bitmap, ~0, HVM_IOBITMAP_SIZE);
- }
- else
- d->arch.hvm_domain.io_bitmap = hvm_io_bitmap;
-
if ( is_pvh_domain(d) )
{
register_portio_handler(d, 0, 0x10003, handle_pvh_io);
stdvga_deinit(d);
vioapic_deinit(d);
fail1:
- if ( is_hardware_domain(d) )
- xfree(d->arch.hvm_domain.io_bitmap);
xfree(d->arch.hvm_domain.io_handler);
xfree(d->arch.hvm_domain.params);
fail0:
svm_disable_intercept_for_msr(v, MSR_AMD64_LWP_CBADDR);
vmcb->_msrpm_base_pa = (u64)virt_to_maddr(arch_svm->msrpm);
- vmcb->_iopm_base_pa = virt_to_maddr(v->domain->arch.hvm_domain.io_bitmap);
+ vmcb->_iopm_base_pa = (u64)virt_to_maddr(hvm_io_bitmap);
/* Virtualise EFLAGS.IF and LAPIC TPR (CR8). */
vmcb->_vintr.fields.intr_masking = 1;
}
/* I/O access bitmap. */
- __vmwrite(IO_BITMAP_A, virt_to_maddr(d->arch.hvm_domain.io_bitmap));
- __vmwrite(IO_BITMAP_B,
- virt_to_maddr(d->arch.hvm_domain.io_bitmap) + PAGE_SIZE);
+ __vmwrite(IO_BITMAP_A, virt_to_maddr((char *)hvm_io_bitmap + 0));
+ __vmwrite(IO_BITMAP_B, virt_to_maddr((char *)hvm_io_bitmap + PAGE_SIZE));
if ( cpu_has_vmx_virtual_intr_delivery )
{
dmi_end_boot();
- if ( is_hardware_domain(dom0) )
- setup_io_bitmap(dom0);
-
system_state = SYS_STATE_active;
domain_unpause_by_systemcontroller(dom0);
return 0;
}
-static int __hwdom_init io_bitmap_cb(unsigned long s, unsigned long e,
- void *ctx)
-{
- struct domain *d = ctx;
- int i;
-
- ASSERT(s <= INT_MAX && e <= INT_MAX);
- for ( i = s; i <= e; i++ )
- __clear_bit(i, d->arch.hvm_domain.io_bitmap);
-
- return 0;
-}
-
-void __hwdom_init setup_io_bitmap(struct domain *d)
-{
- int rc;
-
- ASSERT(is_hardware_domain(d));
- if ( has_hvm_container_domain(d) )
- {
- rc = rangeset_report_ranges(d->arch.ioport_caps, 0, 0x10000,
- io_bitmap_cb, d);
- BUG_ON(rc);
- }
-}
-
/*
* Local variables:
* mode: C
iommu_hwdom_init(d);
- setup_io_bitmap(d);
-
return rv;
#else
return 0;
*/
uint64_t sync_tsc;
- unsigned long *io_bitmap;
-
union {
struct vmx_domain vmx;
struct svm_domain svm;
module_t *initrd,
void *(*bootstrap_map)(const module_t *),
char *cmdline);
-void setup_io_bitmap(struct domain *d);
unsigned long initial_images_nrpages(nodeid_t node);
void discard_initial_images(void);