EmbeddedXENVIRQ发送流程

Hypervisor发送virq的函数有两个:

一个是send_geust_vcpu_virq,另一个是send_guest_global_virq










void send_guest_vcpu_virq(struct vcpu *v, int virq)

{

    int port;

    ASSERT(!virq_is_global(virq));

    port = v->virq_to_evtchn[virq];

    if ( unlikely(port == 0) ) {

        return;

    }

    evtchn_set_pending(v, port);

}

void send_guest_global_virq(struct domain *d, int virq)

{

    int port;

    struct vcpu *v;

    struct evtchn *chn;

    ASSERT(virq_is_global(virq));

    if ( unlikely(d == NULL) )

        return;

    v = d->vcpu[0];

    if ( unlikely(v == NULL) )

        return;

    port = v->virq_to_evtchn[virq];

    if ( unlikely(port == 0) )

        return;

    chn = evtchn_from_port(d, port);

    evtchn_set_pending(d->vcpu[chn->notify_vcpu_id], port);

}


send_guest_vcpu_virq的调用关系是这样的:

图中的两个定时器是在分配vcpu的时候安装的。


send_guest_global_virq的调用关系比较复杂,都是发给DOM0的

评论

此博客中的热门博文

提交了30次才AC ---【附】POJ 2488解题报告

n个进程共享m个资源得死锁问题证明