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