]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/CodeWarrior/ColdFire_V2/portasm.S
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Source / portable / CodeWarrior / ColdFire_V2 / portasm.S
1 /*\r
2  * FreeRTOS Kernel V10.0.0\r
3  * Copyright (C) 2017 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. If you wish to use our Amazon\r
14  * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
15  *\r
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22  *\r
23  * http://www.FreeRTOS.org\r
24  * http://aws.amazon.com/freertos\r
25  *\r
26  * 1 tab == 4 spaces!\r
27  */\r
28 \r
29 /*\r
30  * Purpose: Lowest level routines for all ColdFire processors.\r
31  *\r
32  * Notes:\r
33  * \r
34  * ulPortSetIPL() and mcf5xxx_wr_cacr() copied with permission from FreeScale\r
35  * supplied source files.\r
36  */\r
37 \r
38     .global ulPortSetIPL\r
39     .global _ulPortSetIPL\r
40     .global mcf5xxx_wr_cacrx\r
41     .global _mcf5xxx_wr_cacrx\r
42     .global vPortYieldISR\r
43     .global _vPortYieldISR\r
44     .global vPortStartFirstTask\r
45     .global _vPortStartFirstTask\r
46     .extern _pxCurrentTCB\r
47     .extern _vPortYieldHandler\r
48 \r
49     .text\r
50 \r
51 .macro portSAVE_CONTEXT\r
52 \r
53         lea.l           (-60, sp), sp\r
54         movem.l         d0-a6, (sp)\r
55         move.l          _pxCurrentTCB, a0\r
56         move.l          sp, (a0)\r
57 \r
58         .endm\r
59 \r
60 .macro portRESTORE_CONTEXT\r
61 \r
62         move.l          _pxCurrentTCB, a0\r
63         move.l          (a0), sp\r
64         movem.l         (sp), d0-a6\r
65         lea.l           (60, sp), sp\r
66         rte\r
67 \r
68         .endm\r
69 \r
70 /********************************************************************/\r
71 /*\r
72  * This routines changes the IPL to the value passed into the routine.\r
73  * It also returns the old IPL value back.\r
74  * Calling convention from C:\r
75  *   old_ipl = asm_set_ipl(new_ipl);\r
76  * For the Diab Data C compiler, it passes return value thru D0.\r
77  * Note that only the least significant three bits of the passed\r
78  * value are used.\r
79  */\r
80 \r
81 ulPortSetIPL:\r
82 _ulPortSetIPL:\r
83     link    A6,#-8\r
84     movem.l D6-D7,(SP)\r
85 \r
86     move.w  SR,D7       /* current sr    */\r
87 \r
88     move.l  D7,D0       /* prepare return value  */\r
89     andi.l  #0x0700,D0  /* mask out IPL  */\r
90     lsr.l   #8,D0       /* IPL   */\r
91 \r
92     move.l  8(A6),D6    /* get argument  */\r
93     andi.l  #0x07,D6    /* least significant three bits  */\r
94     lsl.l   #8,D6       /* move over to make mask    */\r
95 \r
96     andi.l  #0x0000F8FF,D7  /* zero out current IPL  */\r
97     or.l    D6,D7           /* place new IPL in sr   */\r
98     move.w  D7,SR\r
99 \r
100     movem.l (SP),D6-D7\r
101     lea     8(SP),SP\r
102     unlk    A6\r
103     rts\r
104 /********************************************************************/\r
105 \r
106 mcf5xxx_wr_cacrx:\r
107 _mcf5xxx_wr_cacrx:\r
108     move.l  4(sp),d0\r
109     .long   0x4e7b0002  /* movec d0,cacr   */\r
110     nop\r
111     rts\r
112 \r
113 /********************************************************************/\r
114 \r
115 /* Yield interrupt. */\r
116 _vPortYieldISR:\r
117 vPortYieldISR:\r
118         portSAVE_CONTEXT\r
119         jsr _vPortYieldHandler\r
120         portRESTORE_CONTEXT\r
121 \r
122 /********************************************************************/\r
123 \r
124 \r
125 vPortStartFirstTask:\r
126 _vPortStartFirstTask:\r
127         portRESTORE_CONTEXT\r
128 \r
129     .end\r
130 \r
131 \r