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

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


    網(wǎng)站導航:
     

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

    留言簿(1)

    文章檔案(5)

    Personal Website

    搜索

    •  

    最新評論

    主站蜘蛛池模板: 亚洲国产av美女网站| 视频免费1区二区三区| 青青青青青青久久久免费观看| 麻豆69堂免费视频| 亚洲精品成人av在线| 青春禁区视频在线观看直播免费| 深夜a级毛片免费视频| 亚洲国产综合91精品麻豆| 女人18毛片a级毛片免费| 久久www免费人成精品香蕉| 亚洲伦理中文字幕| 国产精品V亚洲精品V日韩精品 | 午夜网站在线观看免费完整高清观看 | 精品国产麻豆免费网站| 三级毛片在线免费观看| 77777午夜亚洲| 国产成人亚洲综合色影视| 天天看免费高清影视| 久久久久久免费一区二区三区 | 亚洲欧美日韩综合俺去了| 亚洲色大成网站WWW久久九九| 青青草a免费线观a| 免费a级毛片无码a∨免费软件| 亚洲中文无码永久免费| 亚洲av中文无码乱人伦在线咪咕| 国产成人精品免费视频软件| 91禁漫免费进入| 成人精品视频99在线观看免费| 亚洲乱码av中文一区二区| 久久亚洲精品成人综合| 伊人久久亚洲综合影院| 国产日本一线在线观看免费| 日本在线免费观看| 亚洲高清免费视频| 国产精品亚洲五月天高清| 亚洲免费网站在线观看| 亚洲成在人天堂一区二区| 亚洲中文字幕成人在线| 免费在线看片网站| 最好免费观看韩国+日本| 黄在线观看www免费看|