<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>


    posts - 1,  comments - 20,  trackbacks - 0

    What is a Hypercall?

    Hypercall is an explicit call from Virtual Machine (VM) into the underlying VM Moniter (VMM). That is, a hypercall issued from the guest will cause a VM exit from the guest into the VMM. In this sense, it is kinda like syscall, which will result in a trap from userspace into  kernel space.  Thus, hypercall can serve as a communication approach between the guest and the underlying VMM. The guest can issue hypercalls via VMMCALL instruction on AMD SVM machine or VMCALL on Intel VMX machine.


    Adding a Hypercall in Palacios

    Palacios maintains a global hypercall map, which maintains the mapping between the unique hypercall number and the hypercall handler. (Each hypercall is associated with a unique hypercall number.). Therefore, to add a hypercal in Palacios, you need to:

    • Implement a handler for the hypercall.
    • Assign a unique hypercall number for the hypercall.
    • Register the hypercall handler and the hypercall number with Palacios.

    Sample Example:

    static int handle_hcall(struct guest_info * info, uint_t hcall_id, void * priv_data){
        unsigned 
    long param1 = *(unsigned long *&info->vm_regs.rbx;
        unsigned 
    long param2 = *(unsigned long *&info->vm_regs.rcx;
        unsigned 
    long param3 = *(unsigned long *&info->vm_regs.rdx;
        V3_Print(
    "param1=%lu param2=%lu param3=%lu\n", param1, parma2, param3);
        info
    ->vm_regs.rax = 0//return value of the hypercall
    }

    v3_register_hypercall(vm, HCALL_EXAMPLE_ID, handle_hcall, NULL);

    Note: The hypercall management APIs in Palacios are contained in palacios/include/palacios/vmm_hypercall.h and palacios/src/palacios/vmm_hypercall.c.


    Issuing Hypercalls from Palacios Guest

    “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 stated by the particular hypercall.” (quoted from [1])

    For exmaple, on a AMD SVM machine, a hypercall with 3 parameters can be issued via the following code:

    #define VMMCALL ".byte 0x0F,0x01,0xD9\r\n" //VMMCALL instruction binary code

    int hcall3(unsigned long hcall_id, unsigned long param1, unsigned long param2, unsigned long param3){
         
    int ret;
         __asm__ 
    volatile(
             VMMCALL
                 : “
    =a”(ret)
                 : “a”(hcall_id), “b”(param1), “c”(param2), “d”(param3)
        );
        
    return ret;
    }


    References:

    [1] Linux KVM Hypercall

    posted on 2014-11-04 07:59 csgeek? 閱讀(745) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     

    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    留言簿(1)

    文章檔案(5)

    Personal Website

    搜索

    •  

    最新評論

    主站蜘蛛池模板: 亚洲日产韩国一二三四区| 亚洲男人的天堂一区二区| 亚洲欧洲免费视频| baoyu116.永久免费视频| 亚洲精品午夜国产VA久久成人| 免费中文字幕视频| 午夜亚洲国产成人不卡在线| 视频一区在线免费观看| 亚洲精品偷拍视频免费观看| 国产成人无码精品久久久久免费| 久久久久国产成人精品亚洲午夜 | 国产亚洲精品精品精品| 免费视频淫片aa毛片| 亚洲爆乳成av人在线视菜奈实| 永久免费看mv网站入口| 国产亚洲精品美女久久久久久下载| 免费99热在线观看| 国产人成网在线播放VA免费| 国产h视频在线观看网站免费| 久久丫精品国产亚洲av| 1000部夫妻午夜免费| 33333在线亚洲| 免费一级做a爰片久久毛片潮喷| 九九免费精品视频在这里| 亚洲中文字幕无码久久2017 | 亚洲国产精品成人一区| a级毛片无码免费真人久久| 久久精品国产亚洲av成人| 最新欧洲大片免费在线| 特级毛片A级毛片100免费播放| 亚洲人成中文字幕在线观看| 一区二区三区观看免费中文视频在线播放 | 亚洲五月综合网色九月色| 免费一级毛片女人图片| 好男人资源在线WWW免费| 亚洲天堂一区二区三区| 国产99视频精品免费视频7| 97国免费在线视频| 亚洲精品美女久久7777777| 亚洲一区二区三区在线播放| 69影院毛片免费观看视频在线 |