]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/GCC/ColdFire_V2/portasm.S
a11608f419150f6133fd7f0bfc8ecd0711dbed5c
[freertos] / FreeRTOS / Source / portable / GCC / ColdFire_V2 / portasm.S
1 /*\r
2  * FreeRTOS Kernel V10.2.1\r
3  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software.\r
14  *\r
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21  *\r
22  * http://www.FreeRTOS.org\r
23  * http://aws.amazon.com/freertos\r
24  *\r
25  * 1 tab == 4 spaces!\r
26  */\r
27 \r
28 /*\r
29  * Purpose: Lowest level routines for all ColdFire processors.\r
30  *\r
31  * Notes:\r
32  * \r
33  * ulPortSetIPL() and mcf5xxx_wr_cacr() copied with permission from FreeScale\r
34  * supplied source files.\r
35  */\r
36 \r
37     .global ulPortSetIPL\r
38     .global mcf5xxx_wr_cacr\r
39     .global __cs3_isr_interrupt_80\r
40     .global vPortStartFirstTask\r
41 \r
42     .text\r
43 \r
44 .macro portSAVE_CONTEXT\r
45 \r
46         lea.l           (-60, %sp), %sp\r
47         movem.l         %d0-%fp, (%sp)\r
48         move.l          pxCurrentTCB, %a0\r
49         move.l          %sp, (%a0)\r
50 \r
51         .endm\r
52 \r
53 .macro portRESTORE_CONTEXT\r
54 \r
55         move.l          pxCurrentTCB, %a0\r
56         move.l          (%a0), %sp\r
57         movem.l         (%sp), %d0-%fp\r
58         lea.l           %sp@(60), %sp\r
59         rte\r
60 \r
61         .endm\r
62 \r
63 /********************************************************************/\r
64 /*\r
65  * This routines changes the IPL to the value passed into the routine.\r
66  * It also returns the old IPL value back.\r
67  * Calling convention from C:\r
68  *   old_ipl = asm_set_ipl(new_ipl);\r
69  * For the Diab Data C compiler, it passes return value thru D0.\r
70  * Note that only the least significant three bits of the passed\r
71  * value are used.\r
72  */\r
73 \r
74 ulPortSetIPL:\r
75     link    A6,#-8\r
76     movem.l D6-D7,(SP)\r
77 \r
78     move.w  SR,D7       /* current sr    */\r
79 \r
80     move.l  D7,D0       /* prepare return value  */\r
81     andi.l  #0x0700,D0  /* mask out IPL  */\r
82     lsr.l   #8,D0       /* IPL   */\r
83 \r
84     move.l  8(A6),D6    /* get argument  */\r
85     andi.l  #0x07,D6    /* least significant three bits  */\r
86     lsl.l   #8,D6       /* move over to make mask    */\r
87 \r
88     andi.l  #0x0000F8FF,D7  /* zero out current IPL  */\r
89     or.l    D6,D7           /* place new IPL in sr   */\r
90     move.w  D7,SR\r
91 \r
92     movem.l (SP),D6-D7\r
93     lea     8(SP),SP\r
94     unlk    A6\r
95     rts\r
96 /********************************************************************/\r
97 \r
98 mcf5xxx_wr_cacr:\r
99     move.l  4(sp),d0\r
100     .long   0x4e7b0002  /* movec d0,cacr   */\r
101     nop\r
102     rts\r
103 \r
104 /********************************************************************/\r
105 \r
106 /* Yield interrupt. */\r
107 __cs3_isr_interrupt_80:\r
108         portSAVE_CONTEXT\r
109         jsr vPortYieldHandler\r
110         portRESTORE_CONTEXT\r
111 \r
112 /********************************************************************/\r
113 \r
114 \r
115 vPortStartFirstTask:\r
116         portRESTORE_CONTEXT\r
117 \r
118     .end\r
119 \r
120 \r