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的
评论
发表评论