LK ARM64 asm.S处理

 

#include <asm.h> #include <arch/asm_macros.h>

/* void arm64_context_switch(vaddr_t *old_sp, vaddr_t new_sp); */ FUNCTION(arm64_context_switch)     /* save old frame */     push x28, x29     push x26, x27     push x24, x25     push x22, x23     push x20, x21     push x18, x19     mrs  x18, tpidr_el0     mrs  x19, tpidrro_el0     push x18, x19     push x30, xzr

    /* save old sp */     mov  x15, sp     str  x15, [x0]

    /* load new sp */     mov  sp, x1

    /* restore new frame */     pop  x30, xzr     pop  x18, x19     msr  tpidr_el0, x18     msr  tpidrro_el0, x19     pop  x18, x19     pop  x20, x21     pop  x22, x23     pop  x24, x25     pop  x26, x27     pop  x28, x29

    ret

FUNCTION(arm64_el3_to_el1)     /* set EL2 to 64bit */     mrs x0, scr_el3     orr x0, x0, #(1<<10)     msr scr_el3, x0

    /* set EL1 to 64bit */     mov x0, #(1<<31)     msr hcr_el2, x0

    /* disable EL2 coprocessor traps */     mov x0, #0x33ff     msr cptr_el2, x0

    /* disable EL1 FPU traps */     mov x0, #(0b11<<20)     msr cpacr_el1, x0

    /* set up the EL1 bounce interrupt */     mov x0, sp     msr sp_el1, x0

    adr x0, .Ltarget     msr elr_el3, x0

    mov x0, #((0b1111 << 6) | (0b0101)) /* EL1h runlevel */     msr spsr_el3, x0     isb

    eret

FUNCTION(arm64_elX_to_el1)     mrs x4, CurrentEL

    cmp x4, #(0b01 << 2)     bne .notEL1     /* Already in EL1 */     ret

.notEL1:     cmp x4, #(0b10 << 2)     beq .inEL2

    /* set EL2 to 64bit */     mrs x4, scr_el3     orr x4, x4, #(1<<10)     msr scr_el3, x4

    adr x4, .Ltarget     msr elr_el3, x4

    mov x4, #((0b1111 << 6) | (0b0101)) /* EL1h runlevel */     msr spsr_el3, x4     b   .confEL1

.inEL2:     adr x4, .Ltarget     msr elr_el2, x4     mov x4, #((0b1111 << 6) | (0b0101)) /* EL1h runlevel */     msr spsr_el2, x4

 

.confEL1:     /* disable EL2 coprocessor traps */     mov x0, #0x33ff     msr cptr_el2, x0

    /* set EL1 to 64bit */     mov x0, #(1<<31)     msr hcr_el2, x0

    /* disable EL1 FPU traps */     mov x0, #(0b11<<20)     msr cpacr_el1, x0

    /* set up the EL1 bounce interrupt */     mov x0, sp     msr sp_el1, x0

    isb     eret

.Ltarget:     ret

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值