-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move lguest hcalls to arch-specific header
Move architecture specific portion of lg_hcall code to asm-i386/lg_hcall.h and have it included from linux/lguest.h. [Changed to asm-i386/lguest_hcall.h so documentation finds it -RR] Signed-off-by: Jes Sorensen <jes@sgi.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Cc: Jes Sorensen <jes@sgi.com>
- Loading branch information
Jes Sorensen
authored and
Rusty Russell
committed
Oct 23, 2007
1 parent
05aa026
commit c37ae93
Showing
2 changed files
with
71 additions
and
65 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* Architecture specific portion of the lguest hypercalls */ | ||
#ifndef _X86_LGUEST_HCALL_H | ||
#define _X86_LGUEST_HCALL_H | ||
|
||
#define LHCALL_FLUSH_ASYNC 0 | ||
#define LHCALL_LGUEST_INIT 1 | ||
#define LHCALL_CRASH 2 | ||
#define LHCALL_LOAD_GDT 3 | ||
#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 | ||
#define LHCALL_BIND_DMA 12 | ||
#define LHCALL_SEND_DMA 13 | ||
#define LHCALL_SET_PTE 14 | ||
#define LHCALL_SET_PMD 15 | ||
#define LHCALL_LOAD_TLS 16 | ||
|
||
/*G:031 First, how does our Guest contact the Host to ask for privileged | ||
* operations? There are two ways: the direct way is to make a "hypercall", | ||
* to make requests of the Host Itself. | ||
* | ||
* 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 %edx, %ebx and %ecx. If a return | ||
* value makes sense, it's returned in %eax. | ||
* | ||
* Grossly invalid calls result in Sudden Death at the hands of the vengeful | ||
* Host, rather than returning failure. This reflects Winston Churchill's | ||
* definition of a gentleman: "someone who is only rude intentionally". */ | ||
#define LGUEST_TRAP_ENTRY 0x1F | ||
|
||
static inline unsigned long | ||
hcall(unsigned long call, | ||
unsigned long arg1, unsigned long arg2, unsigned long arg3) | ||
{ | ||
/* "int" is the Intel instruction to trigger a trap. */ | ||
asm volatile("int $" __stringify(LGUEST_TRAP_ENTRY) | ||
/* The call is in %eax (aka "a"), and can be replaced */ | ||
: "=a"(call) | ||
/* The other arguments are in %eax, %edx, %ebx & %ecx */ | ||
: "a"(call), "d"(arg1), "b"(arg2), "c"(arg3) | ||
/* "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; | ||
} | ||
/*:*/ | ||
|
||
void async_hcall(unsigned long call, | ||
unsigned long arg1, unsigned long arg2, unsigned long arg3); | ||
|
||
/* 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 | ||
struct hcall_ring | ||
{ | ||
u32 eax, edx, ebx, ecx; | ||
}; | ||
|
||
#endif /* _I386_LGUEST_HCALL_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters