arm64_context_switch 线程切换过程

/* 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   // move tpidr_el0 into x18

    mrs  x19, tpidrro_el0

    push x18, x19  // save x18 into stack

    push x30, xzr

 

           //--switch stack frame

    /* save old sp */

    mov  x15, sp

    str  x15, [x0]   //   [x0] :first param  ,that is oldthread->arch.sp

                 

    /* load new sp */

    mov  sp, x1    //  x1 :second param  , move  newthread->arch.sp into sp

 

    /* 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  //  return to x30 address  ,that is lr

 

 

重点在于tpidr_el0 、tpidrro_el0、sp、x30 寄存器的值切换

附录arm64的寄存器的usage ,参考armv8 文档

X30

the link register (LR).

X29

the frame pointer register (FP).  // ebp

X0~X7

用于传递子程序参数和结果,使用时不需要保存,多余参数采用堆栈传递

X8

用于保存子程序返回地址

X16~X17

子程序内部调用寄存器

X9~X15  X19~X28

临时寄存器

X18

平台寄存器,它的使用与平台相关

tpidr_el0

Read and Write Thread ID Register

TPIDRRO_EL0

Read-Only Thread ID Register

XZR\WZR

Zero register

PC

Program counter

SP_EL0  SP_EL1  SP_EL2  SP_EL3

Stack pointer

ELR_EL1  ELR_EL2  ELR_EL3

Exception Link Register

SPSR_EL1 SPSR_EL2 SPSR_EL3

Program Status Register

©️2020 CSDN 皮肤主题: 鲸 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值