1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-09 00:00:03 +01:00

add helper functions to create a hypercall

This commit is contained in:
Stefan Lankes 2017-01-16 18:44:20 +01:00
parent dae96b1520
commit 82eeb6f076

View file

@ -791,6 +791,66 @@ static inline uint64_t read_rflags(void)
return result;
}
/* For KVM hypercalls, a three-byte sequence of either the vmcall or the vmmcall
* instruction. The hypervisor may replace it with something else but only the
* instructions are guaranteed to be supported.
*
* Up to four arguments may be passed in rbx, rcx, rdx, and rsi respectively.
* The hypercall number should be placed in rax and the return value will be
* placed in rax. No other registers will be clobbered unless explicitly
* noted by the particular hypercall.
*/
inline static size_t vmcall0(int nr)
{
size_t res;
asm volatile ("vmcall" : "=a" (res): "a" (nr)
: "memory");
return res;
}
inline static size_t vmcall1(int nr, size_t arg0)
{
size_t res;
asm volatile ("vmcall" : "=a" (res): "a" (nr), "b"(arg0)
: "memory");
return res;
}
inline static size_t vmcall2(int nr, size_t arg0, size_t arg1)
{
size_t res;
asm volatile ("vmcall" : "=a" (res): "a" (nr), "b"(arg0), "c"(arg1)
: "memory");
return res;
}
inline static size_t vmcall3(int nr, size_t arg0, size_t arg1, size_t arg2)
{
size_t res;
asm volatile ("vmcall" : "=a" (res): "a" (nr), "b"(arg0), "c"(arg1), "d"(arg2)
: "memory");
return res;
}
inline static size_t vmcall4(int nr, size_t arg0, size_t arg1, size_t arg2, size_t arg3)
{
size_t res;
asm volatile ("vmcall" : "=a" (res): "a" (nr), "b"(arg0), "c"(arg1), "d"(arg2), "S"(arg3)
: "memory");
return res;
}
/** @brief search the first most significant bit
*
* @param i source operand
@ -894,7 +954,7 @@ inline static int system_calibration(void)
size_t cr0;
apic_init();
if (is_single_kernel())
if (is_single_kernel() && !is_uhyve())
pci_init();
register_task();