| #ifndef __PV_H |
| #define __PV_H |
| |
| #include "config.h" // CONFIG_* |
| #include "biosvar.h" // GET_GLOBAL |
| #include "romfile.h" // struct romfile_s |
| |
| // kvmclock |
| struct pvclock_vcpu_time_info { |
| u32 version; |
| u32 pad0; |
| u64 tsc_timestamp; |
| u64 system_time; |
| u32 tsc_to_system_mul; |
| s8 tsc_shift; |
| u8 flags; |
| u8 pad[2]; |
| } __attribute__((__packed__)); /* 32 bytes */ |
| |
| // Types of paravirtualized platforms. |
| #define PF_QEMU (1<<0) |
| #define PF_XEN (1<<1) |
| #define PF_KVM (1<<2) |
| |
| typedef struct QemuCfgDmaAccess { |
| u32 control; |
| u32 length; |
| u64 address; |
| } PACKED QemuCfgDmaAccess; |
| |
| extern u32 RamSize; |
| extern u64 RamSizeOver4G; |
| extern int PlatformRunningOn; |
| extern u8 CPUPhysBits; |
| extern u8 CPULongMode; |
| |
| static inline int runningOnQEMU(void) { |
| return CONFIG_QEMU || ( |
| CONFIG_QEMU_HARDWARE && GET_GLOBAL(PlatformRunningOn) & PF_QEMU); |
| } |
| static inline int runningOnXen(void) { |
| return CONFIG_XEN && GET_GLOBAL(PlatformRunningOn) & PF_XEN; |
| } |
| static inline int runningOnKVM(void) { |
| return CONFIG_QEMU && GET_GLOBAL(PlatformRunningOn) & PF_KVM; |
| } |
| |
| // Common paravirt ports. |
| #define PORT_SMI_CMD 0x00b2 |
| #define PORT_SMI_STATUS 0x00b3 |
| #define PORT_QEMU_CFG_CTL 0x0510 |
| #define PORT_QEMU_CFG_DATA 0x0511 |
| #define PORT_QEMU_CFG_DMA_ADDR_HIGH 0x0514 |
| #define PORT_QEMU_CFG_DMA_ADDR_LOW 0x0518 |
| |
| // QEMU_CFG_DMA_CONTROL bits |
| #define QEMU_CFG_DMA_CTL_ERROR 0x01 |
| #define QEMU_CFG_DMA_CTL_READ 0x02 |
| #define QEMU_CFG_DMA_CTL_SKIP 0x04 |
| #define QEMU_CFG_DMA_CTL_SELECT 0x08 |
| #define QEMU_CFG_DMA_CTL_WRITE 0x10 |
| |
| // QEMU_CFG_DMA ID bit |
| #define QEMU_CFG_VERSION_DMA 2 |
| |
| // QEMU debugcon read value |
| #define QEMU_DEBUGCON_READBACK 0xe9 |
| |
| int qemu_cfg_enabled(void); |
| int qemu_cfg_dma_enabled(void); |
| void qemu_preinit(void); |
| void qemu_platform_setup(void); |
| void qemu_cfg_init(void); |
| |
| u16 qemu_get_present_cpus_count(void); |
| int qemu_cfg_write_file(void *src, struct romfile_s *file, u32 offset, u32 len); |
| int qemu_cfg_write_file_simple(void *src, u16 key, u32 offset, u32 len); |
| u16 qemu_get_romfile_key(struct romfile_s *file); |
| |
| #endif |