1 /* 2 * Things the lguest guest needs to know. Note: like all lguest interfaces, 3 * this is subject to wild and random change between versions. 4 */ 5 #ifndef _LINUX_LGUEST_H 6 #define _LINUX_LGUEST_H 7 8 #ifndef __ASSEMBLY__ 9 #include <linux/time.h> 10 #include <asm/irq.h> 11 #include <asm/lguest_hcall.h> 12 13 #define LG_CLOCK_MIN_DELTA 100UL 14 #define LG_CLOCK_MAX_DELTA ULONG_MAX 15 16 /*G:031 17 * The second method of communicating with the Host is to via "struct 18 * lguest_data". Once the Guest's initialization hypercall tells the Host where 19 * this is, the Guest and Host both publish information in it. 20 :*/ 21 struct lguest_data { 22 /* 23 * 512 == enabled (same as eflags in normal hardware). The Guest 24 * changes interrupts so often that a hypercall is too slow. 25 */ 26 unsigned int irq_enabled; 27 /* Fine-grained interrupt disabling by the Guest */ 28 DECLARE_BITMAP(blocked_interrupts, LGUEST_IRQS); 29 30 /* 31 * The Host writes the virtual address of the last page fault here, 32 * which saves the Guest a hypercall. CR2 is the native register where 33 * this address would normally be found. 34 */ 35 unsigned long cr2; 36 37 /* Wallclock time set by the Host. */ 38 struct timespec time; 39 40 /* 41 * Interrupt pending set by the Host. The Guest should do a hypercall 42 * if it re-enables interrupts and sees this set (to X86_EFLAGS_IF). 43 */ 44 int irq_pending; 45 46 /* 47 * Async hypercall ring. Instead of directly making hypercalls, we can 48 * place them in here for processing the next time the Host wants. 49 * This batching can be quite efficient. 50 */ 51 52 /* 0xFF == done (set by Host), 0 == pending (set by Guest). */ 53 u8 hcall_status[LHCALL_RING_SIZE]; 54 /* The actual registers for the hypercalls. */ 55 struct hcall_args hcalls[LHCALL_RING_SIZE]; 56 57 /* Fields initialized by the Host at boot: */ 58 /* Memory not to try to access */ 59 unsigned long reserve_mem; 60 /* KHz for the TSC clock. */ 61 u32 tsc_khz; 62 63 /* Fields initialized by the Guest at boot: */ 64 /* Instruction range to suppress interrupts even if enabled */ 65 unsigned long noirq_start, noirq_end; 66 /* Address above which page tables are all identical. */ 67 unsigned long kernel_address; 68 /* The vector to try to use for system calls (0x40 or 0x80). */ 69 unsigned int syscall_vec; 70 }; 71 extern struct lguest_data lguest_data; 72 #endif /* __ASSEMBLY__ */ 73 #endif /* _LINUX_LGUEST_H */ 74