2007-10-22 10:56:26 +10:00
/* Architecture specific portion of the lguest hypercalls */
2008-10-22 22:26:29 -07:00
# ifndef _ASM_X86_LGUEST_HCALL_H
# define _ASM_X86_LGUEST_HCALL_H
2007-10-22 10:56:26 +10:00
# define LHCALL_FLUSH_ASYNC 0
# define LHCALL_LGUEST_INIT 1
2007-12-28 14:26:24 +05:30
# define LHCALL_SHUTDOWN 2
2007-10-22 10:56:26 +10:00
# 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
2009-06-12 22:27:07 -06:00
# define LHCALL_SET_PMD 13
2007-10-22 10:56:26 +10:00
# define LHCALL_SET_PTE 14
2009-05-30 15:48:08 -03:00
# define LHCALL_SET_PGD 15
2007-10-22 10:56:26 +10:00
# define LHCALL_LOAD_TLS 16
2007-10-22 11:24:10 +10:00
# define LHCALL_NOTIFY 17
2009-04-19 23:14:00 -06:00
# define LHCALL_LOAD_GDT_ENTRY 18
2009-06-12 22:27:02 -06:00
# define LHCALL_SEND_INTERRUPTS 19
2007-10-22 10:56:26 +10:00
2007-10-25 15:02:50 +10:00
# define LGUEST_TRAP_ENTRY 0x1F
2007-12-28 14:26:24 +05:30
/* Argument number 3 to LHCALL_LGUEST_SHUTDOWN */
# define LGUEST_SHUTDOWN_POWEROFF 1
# define LGUEST_SHUTDOWN_RESTART 2
2007-10-25 15:02:50 +10:00
# ifndef __ASSEMBLY__
# include <asm/hw_irq.h>
2009-07-30 16:03:45 -06:00
/*G:030
* But first , how does our Guest contact the Host to ask for privileged
2007-10-22 10:56:26 +10:00
* operations ? There are two ways : the direct way is to make a " hypercall " ,
* to make requests of the Host Itself .
*
2010-04-14 21:43:54 -06:00
* 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 .
2007-10-22 10:56:26 +10:00
*
* Grossly invalid calls result in Sudden Death at the hands of the vengeful
* Host , rather than returning failure . This reflects Winston Churchill ' s
2009-07-30 16:03:45 -06:00
* definition of a gentleman : " someone who is only rude intentionally " .
2010-04-14 21:43:54 -06:00
*/
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 ;
}
2011-07-22 14:39:50 +09:30
/*:*/
2007-10-22 10:56:26 +10:00
/* 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
2008-03-23 01:02:36 -07:00
struct hcall_args {
2009-07-30 16:03:45 -06:00
/* These map directly onto eax/ebx/ecx/edx/esi in struct lguest_regs */
2009-06-12 22:27:07 -06:00
unsigned long arg0 , arg1 , arg2 , arg3 , arg4 ;
2007-10-22 10:56:26 +10:00
} ;
2007-10-22 11:03:36 +10:00
# endif /* !__ASSEMBLY__ */
2008-10-22 22:26:29 -07:00
# endif /* _ASM_X86_LGUEST_HCALL_H */