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 */ 47static inline unsigned long 48hcall(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/* Can't use our min() macro here: needs to be a constant */ 66#define LGUEST_IRQS (NR_IRQS < 32 ? NR_IRQS: 32) 67 68#define LHCALL_RING_SIZE 64 69struct hcall_args { 70 /* These map directly onto eax/ebx/ecx/edx/esi in struct lguest_regs */ 71 unsigned long arg0, arg1, arg2, arg3, arg4; 72}; 73 74#endif /* !__ASSEMBLY__ */ 75#endif /* _ASM_X86_LGUEST_HCALL_H */ 76