Detect CPUID instruction before using it.
[seabios.git] / src / paravirt.h
1 #ifndef __PV_H
2 #define __PV_H
3
4 #include "config.h" // CONFIG_COREBOOT
5 #include "util.h"
6
7 /* This CPUID returns the signature 'KVMKVMKVM' in ebx, ecx, and edx.  It
8  * should be used to determine that a VM is running under KVM.
9  */
10 #define KVM_CPUID_SIGNATURE     0x40000000
11
12 static inline int kvm_para_available(void)
13 {
14     if (CONFIG_COREBOOT)
15         return 0;
16     unsigned int eax, ebx, ecx, edx;
17     char signature[13];
18
19     cpuid(KVM_CPUID_SIGNATURE, &eax, &ebx, &ecx, &edx);
20     memcpy(signature + 0, &ebx, 4);
21     memcpy(signature + 4, &ecx, 4);
22     memcpy(signature + 8, &edx, 4);
23     signature[12] = 0;
24
25     if (strcmp(signature, "KVMKVMKVM") == 0)
26         return 1;
27
28     return 0;
29 }
30
31 #define QEMU_CFG_SIGNATURE              0x00
32 #define QEMU_CFG_ID                     0x01
33 #define QEMU_CFG_UUID                   0x02
34 #define QEMU_CFG_NUMA                   0x0d
35 #define QEMU_CFG_BOOT_MENU              0x0e
36 #define QEMU_CFG_MAX_CPUS               0x0f
37 #define QEMU_CFG_FILE_DIR               0x19
38 #define QEMU_CFG_ARCH_LOCAL             0x8000
39 #define QEMU_CFG_ACPI_TABLES            (QEMU_CFG_ARCH_LOCAL + 0)
40 #define QEMU_CFG_SMBIOS_ENTRIES         (QEMU_CFG_ARCH_LOCAL + 1)
41 #define QEMU_CFG_IRQ0_OVERRIDE          (QEMU_CFG_ARCH_LOCAL + 2)
42 #define QEMU_CFG_E820_TABLE             (QEMU_CFG_ARCH_LOCAL + 3)
43
44 extern int qemu_cfg_present;
45
46 void qemu_cfg_port_probe(void);
47 int qemu_cfg_show_boot_menu(void);
48 void qemu_cfg_get_uuid(u8 *uuid);
49 int qemu_cfg_irq0_override(void);
50 u16 qemu_cfg_acpi_additional_tables(void);
51 u16 qemu_cfg_next_acpi_table_len(void);
52 void *qemu_cfg_next_acpi_table_load(void *addr, u16 len);
53 u16 qemu_cfg_smbios_entries(void);
54 size_t qemu_cfg_smbios_load_field(int type, size_t offset, void *addr);
55 int qemu_cfg_smbios_load_external(int type, char **p, unsigned *nr_structs,
56                                   unsigned *max_struct_size, char *end);
57 int qemu_cfg_get_numa_nodes(void);
58 void qemu_cfg_get_numa_data(u64 *data, int n);
59 u16 qemu_cfg_get_max_cpus(void);
60
61 typedef struct QemuCfgFile {
62     u32  size;        /* file size */
63     u16  select;      /* write this to 0x510 to read it */
64     u16  reserved;
65     char name[56];
66 } QemuCfgFile;
67
68 struct e820_reservation {
69     u64 address;
70     u64 length;
71     u32 type;
72 };
73
74 u32 qemu_cfg_next_prefix_file(const char *prefix, u32 prevselect);
75 u32 qemu_cfg_find_file(const char *name);
76 int qemu_cfg_size_file(u32 select);
77 const char* qemu_cfg_name_file(u32 select);
78 int qemu_cfg_read_file(u32 select, void *dst, u32 maxlen);
79
80 // Wrappers that select cbfs or qemu_cfg file interface.
81 static inline u32 romfile_findprefix(const char *prefix, u32 previd) {
82     if (CONFIG_COREBOOT)
83         return (u32)cbfs_findprefix(prefix, (void*)previd);
84     return qemu_cfg_next_prefix_file(prefix, previd);
85 }
86 static inline u32 romfile_find(const char *name) {
87     if (CONFIG_COREBOOT)
88         return (u32)cbfs_finddatafile(name);
89     return qemu_cfg_find_file(name);
90 }
91 static inline u32 romfile_size(u32 fileid) {
92     if (CONFIG_COREBOOT)
93         return cbfs_datasize((void*)fileid);
94     return qemu_cfg_size_file(fileid);
95 }
96 static inline int romfile_copy(u32 fileid, void *dst, u32 maxlen) {
97     if (CONFIG_COREBOOT)
98         return cbfs_copyfile((void*)fileid, dst, maxlen);
99     return qemu_cfg_read_file(fileid, dst, maxlen);
100 }
101 static inline const char* romfile_name(u32 fileid) {
102     if (CONFIG_COREBOOT)
103         return cbfs_filename((void*)fileid);
104     return qemu_cfg_name_file(fileid);
105 }
106 void *romfile_loadfile(const char *name, int *psize);
107 u64 romfile_loadint(const char *name, u64 defval);
108
109 u32 qemu_cfg_e820_entries(void);
110 void* qemu_cfg_e820_load_next(void *addr);
111
112 #endif