static void continue_new_vcpu(struct vcpu *prev)
{
schedule_tail(prev);
if ( is_idle_vcpu(current) )
reset_stack_and_jump(idle_loop);
else
/* check_wakeup_from_wait(); */
reset_stack_and_jump(return_to_new_vcpu);
return_to_new_vcpu -> return_to_hypervisor
ENTRY(return_to_hypervisor)
cpsid i
ldr lr, [sp, #UREGS_lr]
ldr r11, [sp, #UREGS_pc]
msr ELR_hyp, r11
ldr r11, [sp, #UREGS_cpsr]
msr SPSR_hyp, r11
pop {r0-r12}
add sp, #(UREGS_SP_usr - UREGS_sp); /* SP, LR, SPSR, PC */
+ clrex
eret
clrex 추가
- 두 개의 vcpus 사이에서 context switching 시 same lock 에 대해서 contending 하면 이상한 현상이 발생 가능
CLREX
- Clear Exclusive
- executing processor의 local record를 clear함