~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/x86/include/asm/lguest_hcall.h

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

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