R&D/Hypervisor

[ARM] entry.S

sunshout 2013. 7. 19. 09:01

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함