mmc: core: SDXC speed class support
[linux-2.6.git] / include / linux / lguest.h
index f30c04f..9962c6b 100644 (file)
@@ -1,85 +1,73 @@
-/* Things the lguest guest needs to know.  Note: like all lguest interfaces,
- * this is subject to wild and random change between versions. */
-#ifndef _ASM_LGUEST_H
-#define _ASM_LGUEST_H
-
-/* These are randomly chosen numbers which indicate we're an lguest at boot */
-#define LGUEST_MAGIC_EBP 0x4C687970
-#define LGUEST_MAGIC_EDI 0x652D4D65
-#define LGUEST_MAGIC_ESI 0xFFFFFFFF
+/*
+ * Things the lguest guest needs to know.  Note: like all lguest interfaces,
+ * this is subject to wild and random change between versions.
+ */
+#ifndef _LINUX_LGUEST_H
+#define _LINUX_LGUEST_H
 
 #ifndef __ASSEMBLY__
+#include <linux/time.h>
 #include <asm/irq.h>
+#include <asm/lguest_hcall.h>
 
-#define LHCALL_FLUSH_ASYNC     0
-#define LHCALL_LGUEST_INIT     1
-#define LHCALL_CRASH           2
-#define LHCALL_LOAD_GDT                3
-#define LHCALL_NEW_PGTABLE     4
-#define LHCALL_FLUSH_TLB       5
-#define LHCALL_LOAD_IDT_ENTRY  6
-#define LHCALL_SET_STACK       7
-#define LHCALL_TS              8
-#define LHCALL_TIMER_READ      9
-#define LHCALL_HALT            10
-#define LHCALL_GET_WALLCLOCK   11
-#define LHCALL_BIND_DMA                12
-#define LHCALL_SEND_DMA                13
-#define LHCALL_SET_PTE         14
-#define LHCALL_SET_PMD         15
-#define LHCALL_LOAD_TLS                16
-
-#define LGUEST_TRAP_ENTRY 0x1F
-
-static inline unsigned long
-hcall(unsigned long call,
-      unsigned long arg1, unsigned long arg2, unsigned long arg3)
-{
-       asm volatile("int $" __stringify(LGUEST_TRAP_ENTRY)
-                    : "=a"(call)
-                    : "a"(call), "d"(arg1), "b"(arg2), "c"(arg3)
-                    : "memory");
-       return call;
-}
-
-void async_hcall(unsigned long call,
-                unsigned long arg1, unsigned long arg2, unsigned long arg3);
-
-/* Can't use our min() macro here: needs to be a constant */
-#define LGUEST_IRQS (NR_IRQS < 32 ? NR_IRQS: 32)
+#define LG_CLOCK_MIN_DELTA     100UL
+#define LG_CLOCK_MAX_DELTA     ULONG_MAX
 
-#define LHCALL_RING_SIZE 64
-struct hcall_ring
-{
-       u32 eax, edx, ebx, ecx;
-};
-
-/* All the good stuff happens here: guest registers it with LGUEST_INIT */
-struct lguest_data
-{
-/* Fields which change during running: */
-       /* 512 == enabled (same as eflags) */
+/*G:031
+ * The second method of communicating with the Host is to via "struct
+ * lguest_data".  Once the Guest's initialization hypercall tells the Host where
+ * this is, the Guest and Host both publish information in it.
+:*/
+struct lguest_data {
+       /*
+        * 512 == enabled (same as eflags in normal hardware).  The Guest
+        * changes interrupts so often that a hypercall is too slow.
+        */
        unsigned int irq_enabled;
-       /* Interrupts blocked by guest. */
+       /* Fine-grained interrupt disabling by the Guest */
        DECLARE_BITMAP(blocked_interrupts, LGUEST_IRQS);
 
-       /* Virtual address of page fault. */
+       /*
+        * The Host writes the virtual address of the last page fault here,
+        * which saves the Guest a hypercall.  CR2 is the native register where
+        * this address would normally be found.
+        */
        unsigned long cr2;
 
-       /* Async hypercall ring.  0xFF == done, 0 == pending. */
+       /* Wallclock time set by the Host. */
+       struct timespec time;
+
+       /*
+        * Interrupt pending set by the Host.  The Guest should do a hypercall
+        * if it re-enables interrupts and sees this set (to X86_EFLAGS_IF).
+        */
+       int irq_pending;
+
+       /*
+        * Async hypercall ring.  Instead of directly making hypercalls, we can
+        * place them in here for processing the next time the Host wants.
+        * This batching can be quite efficient.
+        */
+
+       /* 0xFF == done (set by Host), 0 == pending (set by Guest). */
        u8 hcall_status[LHCALL_RING_SIZE];
-       struct hcall_ring hcalls[LHCALL_RING_SIZE];
+       /* The actual registers for the hypercalls. */
+       struct hcall_args hcalls[LHCALL_RING_SIZE];
 
-/* Fields initialized by the hypervisor at boot: */
+/* Fields initialized by the Host at boot: */
        /* Memory not to try to access */
        unsigned long reserve_mem;
-       /* ID of this guest (used by network driver to set ethernet address) */
-       u16 guestid;
+       /* KHz for the TSC clock. */
+       u32 tsc_khz;
 
-/* Fields initialized by the guest at boot: */
+/* Fields initialized by the Guest at boot: */
        /* Instruction range to suppress interrupts even if enabled */
        unsigned long noirq_start, noirq_end;
+       /* Address above which page tables are all identical. */
+       unsigned long kernel_address;
+       /* The vector to try to use for system calls (0x40 or 0x80). */
+       unsigned int syscall_vec;
 };
 extern struct lguest_data lguest_data;
 #endif /* __ASSEMBLY__ */
-#endif /* _ASM_LGUEST_H */
+#endif /* _LINUX_LGUEST_H */