Guest User

Untitled

a guest
Apr 30th, 2025
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.79 KB | Software | 0 0
  1. .section .text,"ax"
  2.  
  3. .equ X19_OFFSET, 0x00
  4. .equ X20_OFFSET, 0x08
  5. .equ X21_OFFSET, 0x10
  6. .equ X22_OFFSET, 0x18
  7. .equ X23_OFFSET, 0x20
  8. .equ X24_OFFSET, 0x28
  9. .equ X25_OFFSET, 0x30
  10. .equ X26_OFFSET, 0x38
  11. .equ X27_OFFSET, 0x40
  12. .equ X28_OFFSET, 0x48
  13. .equ X29_OFFSET, 0x50
  14. .equ X30_OFFSET, 0x58
  15.  
  16. .equ SP_OFFSET, 0x60
  17.  
  18. .equ ELR_OFFSET, 0x68
  19. .equ SPSR_OFFSET, 0x70
  20.  
  21. .equ FPU_REG_OFFSET, 0x80
  22.  
  23. .equ FPCR_OFFSET, 0x280
  24. .equ FPSR_OFFSET, 0x288
  25.  
  26.  
  27.  
  28.  
  29.  
  30. .global __context_switch
  31. __context_switch:
  32.     // x0 -> pointer to current task_context_t struct
  33.     // x1 -> pointer to new task_context_t struct
  34.  
  35.     // Save currnet task context   str x19, [x0, #X19_OFFSET]
  36.     str x20, [x0, #X20_OFFSET]
  37.     str x21, [x0, #X21_OFFSET]
  38.     str x22, [x0, #X22_OFFSET]
  39.     str x23, [x0, #X23_OFFSET]
  40.     str x24, [x0, #X24_OFFSET]
  41.     str x25, [x0, #X25_OFFSET]
  42.     str x26, [x0, #X26_OFFSET]
  43.     str x27, [x0, #X27_OFFSET]
  44.     str x28, [x0, #X28_OFFSET]
  45.     str x21, [x0, #X21_OFFSET]
  46.     str x22, [x0, #X22_OFFSET]
  47.     str x23, [x0, #X23_OFFSET]
  48.     str x24, [x0, #X24_OFFSET]
  49.     str x25, [x0, #X25_OFFSET]
  50.     str x26, [x0, #X26_OFFSET]
  51.     str x27, [x0, #X27_OFFSET]
  52.     str x28, [x0, #X28_OFFSET]
  53.     str x29, [x0, #X29_OFFSET]
  54.     str x30, [x0, #X30_OFFSET]
  55.  
  56.     // Store stack pointer
  57.     mov x19, sp
  58.     str x19, [x0, #SP_OFFSET]
  59.  
  60.     // Store exception link register and saved program status register
  61.     mrs x19, elr_el1
  62.     str x19, [x0, #ELR_OFFSET]
  63.  
  64.     mrs x19, spsr_el1
  65.     str x19, [x0, #SPSR_OFFSET]
  66.  
  67.     // Store FPU registers
  68.     stp q0, q1, [x0, #(8 * 32)]
  69.     stp q2, q3, [x0, #(9 * 32)]
  70.     stp q4, q5, [x0, #(10 * 32)]
  71.     stp q6, q7, [x0, #(11 * 32)]
  72.     stp q8, q9, [x0, #(12 * 32)]
  73.     stp q10, q11, [x0, #(13 * 32)]
  74.     stp q12, q13, [x0, #(14 * 32)]
  75.     stp q14, q15, [x0, #(15 * 32)]
  76.     stp q16, q17, [x0, #(16 * 32)]
  77.     stp q18, q19, [x0, #(17 * 32)]
  78.     stp q20, q21, [x0, #(18 * 32)]
  79.     stp q22, q23, [x0, #(19 * 32)]
  80.     stp q24, q25, [x0, #(20 * 32)]
  81.     stp q26, q27, [x0, #(21 * 32)]
  82.     stp q28, q29, [x0, #(22 * 32)]
  83.     stp q30, q31, [x0, #(23 * 32)]
  84.  
  85.     // Load new task context
  86.     ldr x19, [x1, #FPCR_OFFSET]
  87.     msr fpcr, x19
  88.  
  89.     ldr x19, [x1, #FPSR_OFFSET]
  90.     msr fpsr, x19
  91.  
  92.     ldr x19, [x1, #SP_OFFSET]
  93.     mov sp, x19
  94.  
  95.     ldr x19, [x1, #ELR_OFFSET]
  96.     msr elr_el1, x19
  97.  
  98.     ldr x19, [x1, #SPSR_OFFSET]
  99.     msr spsr_el1, x19
  100.  
  101.     ldr x19, [x1, #FPCR_OFFSET]
  102.     msr fpcr, x19
  103.  
  104.     ldr x19, [x1, #FPSR_OFFSET]
  105.     msr fpsr, x19
  106.  
  107.     ldr x19, [x1, #X19_OFFSET]
  108.     ldr x20, [x1, #X20_OFFSET]
  109.     ldr x21, [x1, #X21_OFFSET]
  110.     ldr x22, [x1, #X22_OFFSET]
  111.     ldr x23, [x1, #X23_OFFSET]
  112.     ldr x24, [x1, #X24_OFFSET]
  113.     ldr x25, [x1, #X25_OFFSET]
  114.     ldr x26, [x1, #X26_OFFSET]
  115.     ldr x27, [x1, #X27_OFFSET]
  116.     ldr x28, [x1, #X28_OFFSET]
  117.     ldr x29, [x1, #X29_OFFSET]
  118.     ldr x30, [x1, #X30_OFFSET]
  119.  
  120.     ldp q0, q1, [x1, #(8 * 32)]
  121.     ldp q2, q3, [x1, #(9 * 32)]
  122.     ldp q4, q5, [x1, #(10 * 32)]
  123.     ldp q6, q7, [x1, #(11 * 32)]
  124.     ldp q8, q9, [x1, #(12 * 32)]
  125.     ldp q10, q11, [x1, #(13 * 32)]
  126.     ldp q12, q13, [x1, #(14 * 32)]
  127.     ldp q14, q15, [x1, #(15 * 32)]
  128.     ldp q16, q17, [x1, #(16 * 32)]
  129.     ldp q18, q19, [x1, #(17 * 32)]
  130.     ldp q20, q21, [x1, #(18 * 32)]
  131.     ldp q22, q23, [x1, #(19 * 32)]
  132.     ldp q24, q25, [x1, #(20 * 32)]
  133.     ldp q26, q27, [x1, #(21 * 32)]
  134.     ldp q28, q29, [x1, #(22 * 32)]
  135.     ldp q30, q31, [x1, #(23 * 32)]
  136.  
  137.     // Re-enable interrupts
  138.     msr DAIFClr, #0b1111
  139.     eret
  140.  
  141. .global __context_restore
  142. __context_restore:
  143.     ldr x19, [x0, #FPCR_OFFSET]
  144.     msr fpcr, x19
  145.  
  146.     ldr x19, [x0, #FPSR_OFFSET]
  147.     msr fpsr, x19
  148.  
  149.     ldr x19, [x0, #SP_OFFSET]
  150.     mov sp, x19
  151.  
  152.     ldr x19, [x0, #ELR_OFFSET]
  153.     msr elr_el1, x19
  154.  
  155.     ldr x19, [x0, #SPSR_OFFSET]
  156.     msr spsr_el1, x19
  157.  
  158.     // TODO: Save/load from proper offsets....
  159.     ldp q0, q1, [x0, #(8 * 32)]
  160.     ldp q2, q3, [x0, #(9 * 32)]
  161.     ldp q4, q5, [x0, #(10 * 32)]
  162.     ldp q6, q7, [x0, #(11 * 32)]
  163.     ldp q8, q9, [x0, #(12 * 32)]
  164.     ldp q10, q11, [x0, #(13 * 32)]
  165.     ldp q12, q13, [x0, #(14 * 32)]
  166.     ldp q14, q15, [x0, #(15 * 32)]
  167.     ldp q16, q17, [x0, #(16 * 32)]
  168.     ldp q18, q19, [x0, #(17 * 32)]
  169.     ldp q20, q21, [x0, #(18 * 32)]
  170.     ldp q22, q23, [x0, #(19 * 32)]
  171.     ldp q24, q25, [x0, #(20 * 32)]
  172.     ldp q26, q27, [x0, #(21 * 32)]
  173.     ldp q28, q29, [x0, #(22 * 32)]
  174.     ldp q30, q31, [x0, #(23 * 32)]
  175.  
  176.     ldr x19, [x0, #X19_OFFSET]
  177.     ldr x20, [x0, #X20_OFFSET]
  178.     ldr x21, [x0, #X21_OFFSET]
  179.     ldr x22, [x0, #X22_OFFSET]
  180.     ldr x23, [x0, #X23_OFFSET]
  181.     ldr x24, [x0, #X24_OFFSET]
  182.     ldr x25, [x0, #X25_OFFSET]
  183.     ldr x26, [x0, #X26_OFFSET]
  184.     ldr x27, [x0, #X27_OFFSET]
  185.     ldr x28, [x0, #X28_OFFSET]
  186.     ldr x29, [x0, #X29_OFFSET]
  187.     ldr x30, [x0, #X30_OFFSET]
  188.  
  189.     eret
Advertisement
Add Comment
Please, Sign In to add comment