post
poster: Thetawaves
description: Task switcher rev 2
language: Assembler
[download]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.globl irq_handler
irq_handler:
    mov    r13,r0
    sub    r0,lr,#4
    mov    lr,r1
    mrs    r1,spsr
    
    msr    cpsr_c, #(MODE_SYS | IRQ_FLAG )
    stmfd    sp!,{r0,r1}
    stmfd    sp,{r2-r12, lr}
    mov    r0,sp
    sub    sp,sp,#(14*4)
    
    msr    cpsr_c, #(MODE_IRQ | IRQ_FLAG )
    stmfd    r0!,{r13,r14}
    msr    cpsr_c, #(MODE_SYS | IRQ_FLAG )
    
    ldr    r0, =current_task
    ldr    r0,[r0]
    str    sp,[r0]
    
    ldr    r12, =call_irq
    mov    lr,pc
    bx    r12
    
    mov    sp, #0
    
.globl release_stack
release_stack:
    ldr    r0, =current_task
    ldr    r0,[r0]
    ldr    sp,[r0]

    msr    cpsr_c,#(MODE_SYS | IRQ_FLAG )
    mov    r0, sp
    add    sp,sp,#(16*4)
    
    msr    cpsr_c,#(MODE_IRQ | IRQ_FLAG )
    mov    sp, r0
    ldmfd    sp,{r0-r12,lr}^
    nop
    add    sp, sp,#(14*4)
    
    ldr    lr,[sp,#4]
    msr    spsr_cxsf,lr

    ldr    lr, [sp]
    movs    pc,lr