<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? 閱讀(735) 評論(0)  編輯  收藏

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


    網站導航:
     

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    留言簿(1)

    文章檔案(5)

    Personal Website

    搜索

    •  

    最新評論

    主站蜘蛛池模板: 永久免费AV无码国产网站| 男女拍拍拍免费视频网站| 亚洲视频在线免费看| 亚洲avav天堂av在线不卡| 女同免费毛片在线播放| 国产亚洲美女精品久久久久狼 | 亚洲av无码精品网站| aa在线免费观看| 亚洲V无码一区二区三区四区观看 亚洲αv久久久噜噜噜噜噜 | 免费国产作爱视频网站| 亚洲午夜精品在线| 免费无码肉片在线观看| 亚洲人成网站在线播放2019 | 亚洲成a人片在线观看国产| 羞羞视频免费网站日本| 亚洲永久无码3D动漫一区| 久久免费视频观看| 中文字幕亚洲色图| 成人奭片免费观看| 免费在线观看自拍性爱视频| 亚洲成a人片在线播放| 999zyz**站免费毛片| 老色鬼久久亚洲AV综合| 99无码人妻一区二区三区免费| 亚洲色大成网站www尤物| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 久青草视频97国内免费影视| 337p日本欧洲亚洲大胆精品555588 | 亚洲日韩在线观看免费视频| 叮咚影视在线观看免费完整版| 亚洲色偷偷av男人的天堂| 免费看片A级毛片免费看| 国产日韩AV免费无码一区二区三区 | 青青草国产免费久久久下载| jzzjzz免费观看大片免费| 亚洲视频欧洲视频| 免费一级大黄特色大片| 99久久免费中文字幕精品| 日本亚洲欧美色视频在线播放| 在线A亚洲老鸭窝天堂| 精品久久久久国产免费|