OSDN Git Service

fc0089d1e5008a64c462d8d414c4c38c1f6cd102
[hos/hos-v4a.git] / kernel / source / arch / proc / arm / arm_v7m / gcc / kpnd_hdr.S
1 /**
2  *  Hyper Operating System V4 Advance
3  *
4  * Copyright (C) 1998-2011 by Project HOS
5  * http://sourceforge.jp/projects/hos/
6  */
7
8
9                                 .syntax unified
10
11                                 .text
12                                 .align  2
13
14                                 .global _kernel_dsp_tsk
15
16 /************************************************
17   PendSV ハンドラ
18  ************************************************/
19                                 .global _kernel_pendsv_handler
20                                 .thumb
21                                 .thumb_func
22                                 .type   _kernel_pendsv_handler, %function
23 _kernel_pendsv_handler:
24                                 /* 割り込み禁止 */
25                                 cpsid   i
26
27                                 /* リターンアドレス変更 */
28                                 mrs             r0, psp
29                                 ldr             r1, [r0, #24]
30                                 movw    r2, #:lower16:pendsv_ret_addr
31                                 movt    r2, #:upper16:pendsv_ret_addr
32                                 str             r1, [r2]
33
34                                 movw    r1, #:lower16:_kernel_pendsv_proc
35                                 movt    r1, #:upper16:_kernel_pendsv_proc
36                                 str             r1, [r0, #24]
37
38                                 /* スレッドモードへの復帰 */
39                                 bx              lr
40
41                                 .size   _kernel_pendsv_handler, .-_kernel_pendsv_handler
42
43
44                                 .thumb_func
45                                 .type   _kernel_pendsv_proc, %function
46 _kernel_pendsv_proc:
47                                 push    {r0}
48                                 push    {r0, r1, r2, r3, r12, lr}
49
50                                 mrs             r0, apsr
51                                 push    {r0}
52
53                                 /* リターンアドレス格納 */
54                                 movw    r0, #:lower16:pendsv_ret_addr
55                                 movt    r0, #:upper16:pendsv_ret_addr
56                                 ldr             r1, [r0]
57                                 orr             r1, r1, #1
58                                 str             r1, [sp, #28]
59
60                                 /* 遅延ディスパッチ */
61                                 blx             _kernel_dsp_tsk
62
63                                 pop             {r0}
64                                 msr             apsr, r0
65
66                                 cpsie   i
67
68                                 pop             {r0, r1, r2, r3, r12, lr}
69                                 pop             {pc}
70
71                                 .size   _kernel_pendsv_proc, .-_kernel_pendsv_proc
72
73
74                                 .comm   pendsv_ret_addr, 4, 4
75
76                                 .end
77
78
79 ; end of file
80