Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /* Architecture specific portion of the lguest hypercalls */
  2 #ifndef _X86_LGUEST_HCALL_H
  3 #define _X86_LGUEST_HCALL_H
  4 
  5 #define LHCALL_FLUSH_ASYNC      0
  6 #define LHCALL_LGUEST_INIT      1
  7 #define LHCALL_SHUTDOWN         2
  8 #define LHCALL_LOAD_GDT         3
  9 #define LHCALL_NEW_PGTABLE      4
 10 #define LHCALL_FLUSH_TLB        5
 11 #define LHCALL_LOAD_IDT_ENTRY   6
 12 #define LHCALL_SET_STACK        7
 13 #define LHCALL_TS               8
 14 #define LHCALL_SET_CLOCKEVENT   9
 15 #define LHCALL_HALT             10
 16 #define LHCALL_SET_PTE          14
 17 #define LHCALL_SET_PMD          15
 18 #define LHCALL_LOAD_TLS         16
 19 #define LHCALL_NOTIFY           17
 20 
 21 #define LGUEST_TRAP_ENTRY 0x1F
 22 
 23 /* Argument number 3 to LHCALL_LGUEST_SHUTDOWN */
 24 #define LGUEST_SHUTDOWN_POWEROFF        1
 25 #define LGUEST_SHUTDOWN_RESTART         2
 26 
 27 #ifndef __ASSEMBLY__
 28 #include <asm/hw_irq.h>
 29 
 30 /*G:031 But first, how does our Guest contact the Host to ask for privileged
 31  * operations?  There are two ways: the direct way is to make a "hypercall",
 32  * to make requests of the Host Itself.
 33  *
 34  * Our hypercall mechanism uses the highest unused trap code (traps 32 and
 35  * above are used by real hardware interrupts).  Fifteen hypercalls are
 36  * available: the hypercall number is put in the %eax register, and the
 37  * arguments (when required) are placed in %edx, %ebx and %ecx.  If a return
 38  * value makes sense, it's returned in %eax.
 39  *
 40  * Grossly invalid calls result in Sudden Death at the hands of the vengeful
 41  * Host, rather than returning failure.  This reflects Winston Churchill's
 42  * definition of a gentleman: "someone who is only rude intentionally". */
 43 static inline unsigned long
 44 hcall(unsigned long call,
 45       unsigned long arg1, unsigned long arg2, unsigned long arg3)
 46 {
 47         /* "int" is the Intel instruction to trigger a trap. */
 48         asm volatile("int $" __stringify(LGUEST_TRAP_ENTRY)
 49                        /* The call in %eax (aka "a") might be overwritten */
 50                      : "=a"(call)
 51                        /* The arguments are in %eax, %edx, %ebx & %ecx */
 52                      : "a"(call), "d"(arg1), "b"(arg2), "c"(arg3)
 53                        /* "memory" means this might write somewhere in memory.
 54                         * This isn't true for all calls, but it's safe to tell
 55                         * gcc that it might happen so it doesn't get clever. */
 56                      : "memory");
 57         return call;
 58 }
 59 /*:*/
 60 
 61 /* Can't use our min() macro here: needs to be a constant */
 62 #define LGUEST_IRQS (NR_IRQS < 32 ? NR_IRQS: 32)
 63 
 64 #define LHCALL_RING_SIZE 64
 65 struct hcall_args
 66 {
 67         /* These map directly onto eax, ebx, ecx, edx in struct lguest_regs */
 68         unsigned long arg0, arg2, arg3, arg1;
 69 };
 70 
 71 #endif /* !__ASSEMBLY__ */
 72 #endif  /* _I386_LGUEST_HCALL_H */
 73 
  This page was automatically generated by the LXR engine.