]> rtime.felk.cvut.cz Git - jailhouse.git/blob - inmates/lib/x86/inmate.h
inmates/x86: Initialize jailhouse_use_vmcall
[jailhouse.git] / inmates / lib / x86 / inmate.h
1 /*
2  * Jailhouse, a Linux-based partitioning hypervisor
3  *
4  * Copyright (c) Siemens AG, 2013
5  *
6  * Authors:
7  *  Jan Kiszka <jan.kiszka@siemens.com>
8  *
9  * This work is licensed under the terms of the GNU GPL, version 2.  See
10  * the COPYING file in the top-level directory.
11  */
12
13 #define NULL                    ((void *)0)
14
15 #define HEAP_BASE               0x000000
16 #define FSEGMENT_BASE           0x0f0000
17 #define COMM_REGION_BASE        0x100000
18
19 #define INMATE_CS32             0x8
20 #define INMATE_CS64             0x10
21 #define INMATE_DS32             0x18
22
23 #define NS_PER_USEC             1000UL
24 #define NS_PER_MSEC             1000000UL
25 #define NS_PER_SEC              1000000000UL
26
27 #define PAGE_SIZE               (4 * 1024ULL)
28 #ifdef __x86_64__
29 #define HUGE_PAGE_SIZE          (2 * 1024 * 1024ULL)
30 #else
31 #define HUGE_PAGE_SIZE          (4 * 1024 * 1024ULL)
32 #endif
33 #define PAGE_MASK               (~(PAGE_SIZE - 1))
34 #define HUGE_PAGE_MASK          (~(HUGE_PAGE_SIZE - 1))
35
36 #define X2APIC_ID               0x802
37
38 #define PCI_CFG_VENDOR_ID       0x000
39 #define PCI_CFG_DEVICE_ID       0x002
40 #define PCI_CFG_COMMAND         0x004
41 # define PCI_CMD_IO             (1 << 0)
42 # define PCI_CMD_MEM            (1 << 1)
43 # define PCI_CMD_MASTER         (1 << 2)
44 # define PCI_CMD_INTX_OFF       (1 << 10)
45 #define PCI_CFG_STATUS          0x006
46 # define PCI_STS_INT            (1 << 3)
47 #define PCI_CFG_BAR             0x010
48 # define PCI_BAR_64BIT          0x4
49 #define PCI_CFG_CAP_PTR         0x034
50
51 #define PCI_ID_ANY              0xffff
52
53 #define PCI_CAP_MSI             0x05
54 #define PCI_CAP_MSIX            0x11
55
56 #define MSIX_CTRL_ENABLE        0x8000
57 #define MSIX_CTRL_FMASK         0x4000
58
59 #ifndef __ASSEMBLY__
60 typedef signed char s8;
61 typedef unsigned char u8;
62
63 typedef signed short s16;
64 typedef unsigned short u16;
65
66 typedef signed int s32;
67 typedef unsigned int u32;
68
69 typedef signed long long s64;
70 typedef unsigned long long u64;
71
72 typedef s8 __s8;
73 typedef u8 __u8;
74
75 typedef s16 __s16;
76 typedef u16 __u16;
77
78 typedef s32 __s32;
79 typedef u32 __u32;
80
81 typedef s64 __s64;
82 typedef u64 __u64;
83
84 typedef enum { true=1, false=0 } bool;
85
86 static inline void cpu_relax(void)
87 {
88         asm volatile("rep; nop" : : : "memory");
89 }
90
91 static inline void outb(u8 v, u16 port)
92 {
93         asm volatile("outb %0,%1" : : "a" (v), "dN" (port));
94 }
95
96 static inline void outw(u16 v, u16 port)
97 {
98         asm volatile("outw %0,%1" : : "a" (v), "dN" (port));
99 }
100
101 static inline void outl(u32 v, u16 port)
102 {
103         asm volatile("outl %0,%1" : : "a" (v), "dN" (port));
104 }
105
106 static inline u8 inb(u16 port)
107 {
108         u8 v;
109         asm volatile("inb %1,%0" : "=a" (v) : "dN" (port));
110         return v;
111 }
112
113 static inline u16 inw(u16 port)
114 {
115         u16 v;
116         asm volatile("inw %1,%0" : "=a" (v) : "dN" (port));
117         return v;
118 }
119
120 static inline u32 inl(u16 port)
121 {
122         u32 v;
123         asm volatile("inl %1,%0" : "=a" (v) : "dN" (port));
124         return v;
125 }
126
127 static inline u8 mmio_read8(void *address)
128 {
129         return *(volatile u8 *)address;
130 }
131
132 static inline u16 mmio_read16(void *address)
133 {
134         return *(volatile u16 *)address;
135 }
136
137 static inline u32 mmio_read32(void *address)
138 {
139         u32 value;
140
141         /* assembly-encoded to match the hypervisor MMIO parser support */
142         asm volatile("movl (%1),%0" : "=r" (value) : "r" (address));
143         return value;
144 }
145
146 static inline u64 mmio_read64(void *address)
147 {
148         return *(volatile u64 *)address;
149 }
150
151 static inline void mmio_write8(void *address, u8 value)
152 {
153         *(volatile u8 *)address = value;
154 }
155
156 static inline void mmio_write16(void *address, u16 value)
157 {
158         *(volatile u16 *)address = value;
159 }
160
161 static inline void mmio_write32(void *address, u32 value)
162 {
163         /* assembly-encoded to match the hypervisor MMIO parser support */
164         asm volatile("movl %0,(%1)" : : "r" (value), "r" (address));
165 }
166
167 static inline void mmio_write64(void *address, u64 value)
168 {
169         *(volatile u64 *)address = value;
170 }
171
172 static inline u64 read_msr(unsigned int msr)
173 {
174         u32 low, high;
175
176         asm volatile("rdmsr" : "=a" (low), "=d" (high) : "c" (msr));
177         return low | ((u64)high << 32);
178 }
179
180 static inline void write_msr(unsigned int msr, u64 val)
181 {
182         asm volatile("wrmsr"
183                 : /* no output */
184                 : "c" (msr), "a" (val), "d" (val >> 32)
185                 : "memory");
186 }
187
188 static inline unsigned int cpu_id(void)
189 {
190         return read_msr(X2APIC_ID);
191 }
192
193 #include <jailhouse/hypercall.h>
194
195 #define comm_region     ((struct jailhouse_comm_region *)COMM_REGION_BASE)
196
197 extern unsigned int printk_uart_base;
198 void printk(const char *fmt, ...);
199
200 void *memset(void *s, int c, unsigned long n);
201 void *memcpy(void *d, const void *s, unsigned long n);
202
203 typedef void(*int_handler_t)(void);
204
205 void int_init(void);
206 void int_set_handler(unsigned int vector, int_handler_t handler);
207
208 enum ioapic_trigger_mode {
209         TRIGGER_EDGE = 0,
210         TRIGGER_LEVEL_ACTIVE_HIGH = 1 << 15,
211         TRIGGER_LEVEL_ACTIVE_LOW = (1 << 15) | (1 << 13),
212 };
213
214 void ioapic_init(void);
215 void ioapic_pin_set_vector(unsigned int pin,
216                            enum ioapic_trigger_mode trigger_mode,
217                            unsigned int vector);
218
219 void inmate_main(void);
220
221 void hypercall_init(void);
222
223 void pm_timer_init(void);
224 unsigned long pm_timer_read(void);
225 void delay_us(unsigned long microsecs);
226 unsigned long apic_timer_init(unsigned int vector);
227 void apic_timer_set(unsigned long timeout_ns);
228
229 enum map_type { MAP_CACHED, MAP_UNCACHED };
230
231 void *alloc(unsigned long size, unsigned long align);
232 void map_range(void *start, unsigned long size, enum map_type map_type);
233
234 u32 pci_read_config(u16 bdf, unsigned int addr, unsigned int size);
235 void pci_write_config(u16 bdf, unsigned int addr, u32 value,
236                       unsigned int size);
237 int pci_find_device(u16 vendor, u16 device, u16 start_bdf);
238 int pci_find_cap(u16 bdf, u16 cap);
239 void pci_msi_set_vector(u16 bdf, unsigned int vector);
240 void pci_msix_set_vector(u16 bdf, unsigned int vector, u32 index);
241 #endif