/* * io.h: HVM IO support * * Copyright (c) 2004, Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; If not, see . */ #ifndef __ASM_X86_HVM_IO_H__ #define __ASM_X86_HVM_IO_H__ #include #include #include #include #include #define NR_IO_HANDLERS 32 typedef int (*hvm_mmio_read_t)(struct vcpu *v, unsigned long addr, unsigned int length, unsigned long *val); typedef int (*hvm_mmio_write_t)(struct vcpu *v, unsigned long addr, unsigned int length, unsigned long val); typedef int (*hvm_mmio_check_t)(struct vcpu *v, unsigned long addr); struct hvm_mmio_ops { hvm_mmio_check_t check; hvm_mmio_read_t read; hvm_mmio_write_t write; }; static inline paddr_t hvm_mmio_first_byte(const ioreq_t *p) { return unlikely(p->df) ? p->addr - (p->count - 1ul) * p->size : p->addr; } static inline paddr_t hvm_mmio_last_byte(const ioreq_t *p) { unsigned long size = p->size; return unlikely(p->df) ? p->addr + size - 1: p->addr + (p->count * size) - 1; } typedef int (*portio_action_t)( int dir, unsigned int port, unsigned int bytes, uint32_t *val); struct hvm_io_handler { union { struct { const struct hvm_mmio_ops *ops; } mmio; struct { unsigned int port, size; portio_action_t action; } portio; }; const struct hvm_io_ops *ops; uint8_t type; }; typedef int (*hvm_io_read_t)(const struct hvm_io_handler *, uint64_t addr, uint32_t size, uint64_t *data); typedef int (*hvm_io_write_t)(const struct hvm_io_handler *, uint64_t addr, uint32_t size, uint64_t data); typedef bool_t (*hvm_io_accept_t)(const struct hvm_io_handler *, const ioreq_t *p); typedef void (*hvm_io_complete_t)(const struct hvm_io_handler *); struct hvm_io_ops { hvm_io_accept_t accept; hvm_io_read_t read; hvm_io_write_t write; hvm_io_complete_t complete; }; int hvm_process_io_intercept(const struct hvm_io_handler *handler, ioreq_t *p); int hvm_io_intercept(ioreq_t *p); struct hvm_io_handler *hvm_next_io_handler(struct domain *d); bool_t hvm_mmio_internal(paddr_t gpa); void register_mmio_handler(struct domain *d, const struct hvm_mmio_ops *ops); void register_portio_handler( struct domain *d, unsigned int port, unsigned int size, portio_action_t action); void relocate_portio_handler( struct domain *d, unsigned int old_port, unsigned int new_port, unsigned int size); void send_timeoffset_req(unsigned long timeoff); void send_invalidate_req(void); bool handle_mmio_with_translation(unsigned long gla, unsigned long gpfn, struct npfec); bool handle_pio(uint16_t port, unsigned int size, int dir); void hvm_interrupt_post(struct vcpu *v, int vector, int type); void hvm_dpci_eoi(struct domain *d, unsigned int guest_irq, const union vioapic_redir_entry *ent); void msix_write_completion(struct vcpu *); void msixtbl_init(struct domain *d); enum stdvga_cache_state { STDVGA_CACHE_UNINITIALIZED, STDVGA_CACHE_ENABLED, STDVGA_CACHE_DISABLED }; struct hvm_hw_stdvga { uint8_t sr_index; uint8_t sr[8]; uint8_t gr_index; uint8_t gr[9]; bool_t stdvga; enum stdvga_cache_state cache; uint32_t latch; struct page_info *vram_page[64]; /* shadow of 0xa0000-0xaffff */ spinlock_t lock; }; void stdvga_init(struct domain *d); void stdvga_deinit(struct domain *d); extern void hvm_dpci_msi_eoi(struct domain *d, int vector); /* Decode a PCI port IO access into a bus/slot/func/reg. */ unsigned int hvm_pci_decode_addr(unsigned int cf8, unsigned int addr, unsigned int *bus, unsigned int *slot, unsigned int *func); /* * HVM port IO handler that performs forwarding of guest IO ports into machine * IO ports. */ void register_g2m_portio_handler(struct domain *d); #endif /* __ASM_X86_HVM_IO_H__ */ /* * Local variables: * mode: C * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil * End: */