Official mbed Real Time Operating System based on the RTX implementation of the CMSIS-RTOS API open standard.

Dependents:   denki-yohou_b TestY201 Network-RTOS NTPClient_HelloWorld ... more

Deprecated

This is the mbed 2 rtos library. mbed OS 5 integrates the mbed library with mbed-rtos. With this, we have provided thread safety for all mbed APIs. If you'd like to learn about using mbed OS 5, please see the docs.

Committer:
mbed_official
Date:
Fri Feb 27 10:00:40 2015 +0000
Revision:
67:63988a2238f7
Child:
68:d3d0e710b443
Synchronized with git revision 43d7f387ec8e6fef8c03cb5e3a74f7b1596c8f8c

Full URL: https://github.com/mbedmicro/mbed/commit/43d7f387ec8e6fef8c03cb5e3a74f7b1596c8f8c/

RZ/A1H - Modify to support GCC and Fix some bugs of driver.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 67:63988a2238f7 1 /*----------------------------------------------------------------------------
mbed_official 67:63988a2238f7 2 * RL-ARM - RTX
mbed_official 67:63988a2238f7 3 *----------------------------------------------------------------------------
mbed_official 67:63988a2238f7 4 * Name: HAL_CA9.c
mbed_official 67:63988a2238f7 5 * Purpose: Hardware Abstraction Layer for Cortex-A9
mbed_official 67:63988a2238f7 6 * Rev.: 3 Sept 2013
mbed_official 67:63988a2238f7 7 *----------------------------------------------------------------------------
mbed_official 67:63988a2238f7 8 *
mbed_official 67:63988a2238f7 9 * Copyright (c) 2012 - 2013 ARM Limited
mbed_official 67:63988a2238f7 10 * All rights reserved.
mbed_official 67:63988a2238f7 11 * Redistribution and use in source and binary forms, with or without
mbed_official 67:63988a2238f7 12 * modification, are permitted provided that the following conditions are met:
mbed_official 67:63988a2238f7 13 * - Redistributions of source code must retain the above copyright
mbed_official 67:63988a2238f7 14 * notice, this list of conditions and the following disclaimer.
mbed_official 67:63988a2238f7 15 * - Redistributions in binary form must reproduce the above copyright
mbed_official 67:63988a2238f7 16 * notice, this list of conditions and the following disclaimer in the
mbed_official 67:63988a2238f7 17 * documentation and/or other materials provided with the distribution.
mbed_official 67:63988a2238f7 18 * - Neither the name of ARM nor the names of its contributors may be used
mbed_official 67:63988a2238f7 19 * to endorse or promote products derived from this software without
mbed_official 67:63988a2238f7 20 * specific prior written permission.
mbed_official 67:63988a2238f7 21 *
mbed_official 67:63988a2238f7 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 67:63988a2238f7 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 67:63988a2238f7 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
mbed_official 67:63988a2238f7 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
mbed_official 67:63988a2238f7 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
mbed_official 67:63988a2238f7 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
mbed_official 67:63988a2238f7 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
mbed_official 67:63988a2238f7 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
mbed_official 67:63988a2238f7 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
mbed_official 67:63988a2238f7 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 67:63988a2238f7 32 * POSSIBILITY OF SUCH DAMAGE.
mbed_official 67:63988a2238f7 33 *---------------------------------------------------------------------------*/
mbed_official 67:63988a2238f7 34
mbed_official 67:63988a2238f7 35 .global rt_set_PSP
mbed_official 67:63988a2238f7 36 .global rt_get_PSP
mbed_official 67:63988a2238f7 37 .global _alloc_box
mbed_official 67:63988a2238f7 38 .global _free_box
mbed_official 67:63988a2238f7 39 .global PendSV_Handler
mbed_official 67:63988a2238f7 40 .global OS_Tick_Handler
mbed_official 67:63988a2238f7 41
mbed_official 67:63988a2238f7 42 .EQU CPSR_T_BIT, 0x20
mbed_official 67:63988a2238f7 43 .EQU CPSR_I_BIT, 0x80
mbed_official 67:63988a2238f7 44 .EQU CPSR_F_BIT, 0x40
mbed_official 67:63988a2238f7 45
mbed_official 67:63988a2238f7 46 .EQU MODE_USR, 0x10
mbed_official 67:63988a2238f7 47 .EQU MODE_FIQ, 0x11
mbed_official 67:63988a2238f7 48 .EQU MODE_IRQ, 0x12
mbed_official 67:63988a2238f7 49 .EQU MODE_SVC, 0x13
mbed_official 67:63988a2238f7 50 .EQU MODE_ABT, 0x17
mbed_official 67:63988a2238f7 51 .EQU MODE_UND, 0x1B
mbed_official 67:63988a2238f7 52 .EQU MODE_SYS, 0x1F
mbed_official 67:63988a2238f7 53
mbed_official 67:63988a2238f7 54 .EQU TCB_TID, 3 /* 'task id' offset */
mbed_official 67:63988a2238f7 55 .EQU TCB_STACKF, 32 /* 'stack_frame' offset */
mbed_official 67:63988a2238f7 56 .EQU TCB_TSTACK, 36 /* 'tsk_stack' offset */
mbed_official 67:63988a2238f7 57
mbed_official 67:63988a2238f7 58 .extern rt_alloc_box
mbed_official 67:63988a2238f7 59 .extern os_tsk
mbed_official 67:63988a2238f7 60 .extern GICInterface_BASE
mbed_official 67:63988a2238f7 61 .extern rt_pop_req
mbed_official 67:63988a2238f7 62 .extern os_tick_irqack
mbed_official 67:63988a2238f7 63 .extern rt_systick
mbed_official 67:63988a2238f7 64
mbed_official 67:63988a2238f7 65 /*----------------------------------------------------------------------------
mbed_official 67:63988a2238f7 66 * Functions
mbed_official 67:63988a2238f7 67 *---------------------------------------------------------------------------*/
mbed_official 67:63988a2238f7 68 .text
mbed_official 67:63988a2238f7 69 @ For A-class, set USR/SYS stack
mbed_official 67:63988a2238f7 70 @ __asm void rt_set_PSP (U32 stack) {
mbed_official 67:63988a2238f7 71 rt_set_PSP:
mbed_official 67:63988a2238f7 72 .arm
mbed_official 67:63988a2238f7 73
mbed_official 67:63988a2238f7 74 MRS R1, CPSR
mbed_official 67:63988a2238f7 75 CPS #MODE_SYS @no effect in USR mode
mbed_official 67:63988a2238f7 76 ISB
mbed_official 67:63988a2238f7 77 MOV SP, R0
mbed_official 67:63988a2238f7 78 MSR CPSR_c, R1 @no effect in USR mode
mbed_official 67:63988a2238f7 79 ISB
mbed_official 67:63988a2238f7 80 BX LR
mbed_official 67:63988a2238f7 81
mbed_official 67:63988a2238f7 82 @ }
mbed_official 67:63988a2238f7 83
mbed_official 67:63988a2238f7 84 @ For A-class, get USR/SYS stack
mbed_official 67:63988a2238f7 85 @ __asm U32 rt_get_PSP (void) {
mbed_official 67:63988a2238f7 86 rt_get_PSP:
mbed_official 67:63988a2238f7 87 .arm
mbed_official 67:63988a2238f7 88
mbed_official 67:63988a2238f7 89 MRS R1, CPSR
mbed_official 67:63988a2238f7 90 CPS #MODE_SYS @no effect in USR mode
mbed_official 67:63988a2238f7 91 ISB
mbed_official 67:63988a2238f7 92 MOV R0, SP
mbed_official 67:63988a2238f7 93 MSR CPSR_c, R1 @no effect in USR mode
mbed_official 67:63988a2238f7 94 ISB
mbed_official 67:63988a2238f7 95 BX LR
mbed_official 67:63988a2238f7 96
mbed_official 67:63988a2238f7 97 @ }
mbed_official 67:63988a2238f7 98
mbed_official 67:63988a2238f7 99 /*--------------------------- _alloc_box ------------------------------------*/
mbed_official 67:63988a2238f7 100 @ __asm void *_alloc_box (void *box_mem) {
mbed_official 67:63988a2238f7 101 _alloc_box:
mbed_official 67:63988a2238f7 102 /* Function wrapper for Unprivileged/Privileged mode. */
mbed_official 67:63988a2238f7 103 .arm
mbed_official 67:63988a2238f7 104
mbed_official 67:63988a2238f7 105 LDR R12,=rt_alloc_box @ __cpp(rt_alloc_box)
mbed_official 67:63988a2238f7 106 MRS R2, CPSR
mbed_official 67:63988a2238f7 107 LSLS R2, #28
mbed_official 67:63988a2238f7 108 BXNE R12
mbed_official 67:63988a2238f7 109 SVC 0
mbed_official 67:63988a2238f7 110 BX LR
mbed_official 67:63988a2238f7 111 @ }
mbed_official 67:63988a2238f7 112
mbed_official 67:63988a2238f7 113
mbed_official 67:63988a2238f7 114 /*--------------------------- _free_box -------------------------------------*/
mbed_official 67:63988a2238f7 115 @ __asm int _free_box (void *box_mem, void *box) {
mbed_official 67:63988a2238f7 116 _free_box:
mbed_official 67:63988a2238f7 117 /* Function wrapper for Unprivileged/Privileged mode. */
mbed_official 67:63988a2238f7 118 .arm
mbed_official 67:63988a2238f7 119
mbed_official 67:63988a2238f7 120 LDR R12,=rt_free_box @ __cpp(rt_free_box)
mbed_official 67:63988a2238f7 121 MRS R2, CPSR
mbed_official 67:63988a2238f7 122 LSLS R2, #28
mbed_official 67:63988a2238f7 123 BXNE R12
mbed_official 67:63988a2238f7 124 SVC 0
mbed_official 67:63988a2238f7 125 BX LR
mbed_official 67:63988a2238f7 126
mbed_official 67:63988a2238f7 127 @ }
mbed_official 67:63988a2238f7 128
mbed_official 67:63988a2238f7 129 /*-------------------------- SVC_Handler -----------------------------------*/
mbed_official 67:63988a2238f7 130
mbed_official 67:63988a2238f7 131 @ #pragma push
mbed_official 67:63988a2238f7 132 @ #pragma arm
mbed_official 67:63988a2238f7 133 @ __asm void SVC_Handler (void) {
mbed_official 67:63988a2238f7 134
mbed_official 67:63988a2238f7 135 .type SVC_Handler, %function
mbed_official 67:63988a2238f7 136 .global SVC_Handler
mbed_official 67:63988a2238f7 137 SVC_Handler:
mbed_official 67:63988a2238f7 138 @ PRESERVE8
mbed_official 67:63988a2238f7 139 .arm
mbed_official 67:63988a2238f7 140 .extern rt_tsk_lock
mbed_official 67:63988a2238f7 141 .extern rt_tsk_unlock
mbed_official 67:63988a2238f7 142 .extern SVC_Count
mbed_official 67:63988a2238f7 143 .extern SVC_Table
mbed_official 67:63988a2238f7 144 .extern rt_stk_check
mbed_official 67:63988a2238f7 145 .extern FPUEnable
mbed_official 67:63988a2238f7 146
mbed_official 67:63988a2238f7 147 .EQU Mode_SVC, 0x13
mbed_official 67:63988a2238f7 148
mbed_official 67:63988a2238f7 149 SRSDB SP!, #Mode_SVC @ Push LR_SVC and SPRS_SVC onto SVC mode stack
mbed_official 67:63988a2238f7 150 PUSH {R4} @ Push R4 so we can use it as a temp
mbed_official 67:63988a2238f7 151
mbed_official 67:63988a2238f7 152
mbed_official 67:63988a2238f7 153 MRS R4,SPSR @ Get SPSR
mbed_official 67:63988a2238f7 154 TST R4,#CPSR_T_BIT @ Check Thumb Bit
mbed_official 67:63988a2238f7 155 LDRNEH R4,[LR,#-2] @ Thumb: Load Halfword
mbed_official 67:63988a2238f7 156 BICNE R4,R4,#0xFF00 @ Extract SVC Number
mbed_official 67:63988a2238f7 157 LDREQ R4,[LR,#-4] @ ARM: Load Word
mbed_official 67:63988a2238f7 158 BICEQ R4,R4,#0xFF000000 @ Extract SVC Number
mbed_official 67:63988a2238f7 159
mbed_official 67:63988a2238f7 160 /* Lock out systick and re-enable interrupts */
mbed_official 67:63988a2238f7 161 PUSH {R0-R3,R12,LR}
mbed_official 67:63988a2238f7 162
mbed_official 67:63988a2238f7 163 AND R12, SP, #4 @ Ensure stack is 8-byte aligned
mbed_official 67:63988a2238f7 164 SUB SP, SP, R12 @ Adjust stack
mbed_official 67:63988a2238f7 165 PUSH {R12, LR} @ Store stack adjustment and dummy LR to SVC stack
mbed_official 67:63988a2238f7 166
mbed_official 67:63988a2238f7 167 BLX rt_tsk_lock
mbed_official 67:63988a2238f7 168 CPSIE i
mbed_official 67:63988a2238f7 169
mbed_official 67:63988a2238f7 170 POP {R12, LR} @ Get stack adjustment & discard dummy LR
mbed_official 67:63988a2238f7 171 ADD SP, SP, R12 @ Unadjust stack
mbed_official 67:63988a2238f7 172
mbed_official 67:63988a2238f7 173 POP {R0-R3,R12,LR}
mbed_official 67:63988a2238f7 174
mbed_official 67:63988a2238f7 175 CMP R4,#0
mbed_official 67:63988a2238f7 176 BNE SVC_User
mbed_official 67:63988a2238f7 177
mbed_official 67:63988a2238f7 178 MRS R4,SPSR
mbed_official 67:63988a2238f7 179 PUSH {R4} @ Push R4 so we can use it as a temp
mbed_official 67:63988a2238f7 180 AND R4, SP, #4 @ Ensure stack is 8-byte aligned
mbed_official 67:63988a2238f7 181 SUB SP, SP, R4 @ Adjust stack
mbed_official 67:63988a2238f7 182 PUSH {R4, LR} @ Store stack adjustment and dummy LR
mbed_official 67:63988a2238f7 183 BLX R12
mbed_official 67:63988a2238f7 184 POP {R4, LR} @ Get stack adjustment & discard dummy LR
mbed_official 67:63988a2238f7 185 ADD SP, SP, R4 @ Unadjust stack
mbed_official 67:63988a2238f7 186 POP {R4} @ Restore R4
mbed_official 67:63988a2238f7 187 MSR SPSR_cxsf,R4
mbed_official 67:63988a2238f7 188
mbed_official 67:63988a2238f7 189 /* Here we will be in SVC mode (even if coming in from PendSV_Handler or OS_Tick_Handler) */
mbed_official 67:63988a2238f7 190 Sys_Switch:
mbed_official 67:63988a2238f7 191 LDR LR,=os_tsk @ __cpp(&os_tsk)
mbed_official 67:63988a2238f7 192 LDM LR,{R4,LR} @ os_tsk.run, os_tsk.new
mbed_official 67:63988a2238f7 193 CMP R4,LR
mbed_official 67:63988a2238f7 194 BNE switching
mbed_official 67:63988a2238f7 195
mbed_official 67:63988a2238f7 196 PUSH {R0-R3,R12,LR}
mbed_official 67:63988a2238f7 197
mbed_official 67:63988a2238f7 198 AND R12, SP, #4 @ Ensure stack is 8-byte aligned
mbed_official 67:63988a2238f7 199 SUB SP, SP, R12 @ Adjust stack
mbed_official 67:63988a2238f7 200 PUSH {R12, LR} @ Store stack adjustment and dummy LR to SVC stack
mbed_official 67:63988a2238f7 201
mbed_official 67:63988a2238f7 202 CPSID i
mbed_official 67:63988a2238f7 203 BLX rt_tsk_unlock
mbed_official 67:63988a2238f7 204
mbed_official 67:63988a2238f7 205 POP {R12, LR} @ Get stack adjustment & discard dummy LR
mbed_official 67:63988a2238f7 206 ADD SP, SP, R12 @ Unadjust stack
mbed_official 67:63988a2238f7 207
mbed_official 67:63988a2238f7 208 POP {R0-R3,R12,LR}
mbed_official 67:63988a2238f7 209 POP {R4}
mbed_official 67:63988a2238f7 210 RFEFD SP! @ Return from exception, no task switch
mbed_official 67:63988a2238f7 211
mbed_official 67:63988a2238f7 212 switching:
mbed_official 67:63988a2238f7 213 CLREX
mbed_official 67:63988a2238f7 214 CMP R4,#0
mbed_official 67:63988a2238f7 215 ADDEQ SP,SP,#12 @ Original R4, LR & SPSR do not need to be popped when we are paging in a different task
mbed_official 67:63988a2238f7 216 BEQ SVC_Next @ Runtask deleted?
mbed_official 67:63988a2238f7 217
mbed_official 67:63988a2238f7 218
mbed_official 67:63988a2238f7 219 PUSH {R8-R11} @ R4 and LR already stacked
mbed_official 67:63988a2238f7 220 MOV R10,R4 @ Preserve os_tsk.run
mbed_official 67:63988a2238f7 221 MOV R11,LR @ Preserve os_tsk.new
mbed_official 67:63988a2238f7 222
mbed_official 67:63988a2238f7 223 ADD R8,SP,#16 @ Unstack R4,LR
mbed_official 67:63988a2238f7 224 LDMIA R8,{R4,LR}
mbed_official 67:63988a2238f7 225
mbed_official 67:63988a2238f7 226 SUB SP,SP,#4 @ Make space on the stack for the next instn
mbed_official 67:63988a2238f7 227 STMIA SP,{SP}^ @ Put User SP onto stack
mbed_official 67:63988a2238f7 228 POP {R8} @ Pop User SP into R8
mbed_official 67:63988a2238f7 229
mbed_official 67:63988a2238f7 230 MRS R9,SPSR
mbed_official 67:63988a2238f7 231 STMDB R8!,{R9} @ User CPSR
mbed_official 67:63988a2238f7 232 STMDB R8!,{LR} @ User PC
mbed_official 67:63988a2238f7 233 STMDB R8,{LR}^ @ User LR
mbed_official 67:63988a2238f7 234 SUB R8,R8,#4 @ No writeback for store of User LR
mbed_official 67:63988a2238f7 235 STMDB R8!,{R0-R3,R12} @ User R0-R3,R12
mbed_official 67:63988a2238f7 236 MOV R3,R10 @ os_tsk.run
mbed_official 67:63988a2238f7 237 MOV LR,R11 @ os_tsk.new
mbed_official 67:63988a2238f7 238 POP {R9-R12}
mbed_official 67:63988a2238f7 239 ADD SP,SP,#12 @ Fix up SP for unstack of R4, LR & SPSR
mbed_official 67:63988a2238f7 240 STMDB R8!,{R4-R7,R9-R12} @ User R4-R11
mbed_official 67:63988a2238f7 241
mbed_official 67:63988a2238f7 242 @ If applicable, stack VFP state
mbed_official 67:63988a2238f7 243 MRC p15,0,R1,c1,c0,2 @ VFP/NEON access enabled? (CPACR)
mbed_official 67:63988a2238f7 244 AND R2,R1,#0x00F00000
mbed_official 67:63988a2238f7 245 CMP R2,#0x00F00000
mbed_official 67:63988a2238f7 246 BNE no_outgoing_vfp
mbed_official 67:63988a2238f7 247 VMRS R2,FPSCR
mbed_official 67:63988a2238f7 248 STMDB R8!,{R2,R4} @ Push FPSCR, maintain 8-byte alignment
mbed_official 67:63988a2238f7 249 VSTMDB R8!,{S0-S31}
mbed_official 67:63988a2238f7 250 LDRB R2,[R3,#TCB_STACKF] @ Record in TCB that VFP state is stacked
mbed_official 67:63988a2238f7 251 ORR R2,#2
mbed_official 67:63988a2238f7 252 STRB R2,[R3,#TCB_STACKF]
mbed_official 67:63988a2238f7 253
mbed_official 67:63988a2238f7 254 no_outgoing_vfp:
mbed_official 67:63988a2238f7 255 STR R8,[R3,#TCB_TSTACK]
mbed_official 67:63988a2238f7 256 MOV R4,LR
mbed_official 67:63988a2238f7 257
mbed_official 67:63988a2238f7 258 PUSH {R4} @ Push R4 so we can use it as a temp
mbed_official 67:63988a2238f7 259 AND R4, SP, #4 @ Ensure stack is 8-byte aligned
mbed_official 67:63988a2238f7 260 SUB SP, SP, R4 @ Adjust stack
mbed_official 67:63988a2238f7 261 PUSH {R4, LR} @ Store stack adjustment and dummy LR to SVC stack
mbed_official 67:63988a2238f7 262
mbed_official 67:63988a2238f7 263 BLX rt_stk_check
mbed_official 67:63988a2238f7 264
mbed_official 67:63988a2238f7 265 POP {R4, LR} @ Get stack adjustment & discard dummy LR
mbed_official 67:63988a2238f7 266 ADD SP, SP, R4 @ Unadjust stack
mbed_official 67:63988a2238f7 267 POP {R4} @ Restore R4
mbed_official 67:63988a2238f7 268
mbed_official 67:63988a2238f7 269 MOV LR,R4
mbed_official 67:63988a2238f7 270
mbed_official 67:63988a2238f7 271 SVC_Next: @ R4 == os_tsk.run, LR == os_tsk.new, R0-R3, R5-R12 corruptible
mbed_official 67:63988a2238f7 272 LDR R1,=os_tsk @ __cpp(&os_tsk), os_tsk.run = os_tsk.new
mbed_official 67:63988a2238f7 273 STR LR,[R1]
mbed_official 67:63988a2238f7 274 LDRB R1,[LR,#TCB_TID] @ os_tsk.run->task_id
mbed_official 67:63988a2238f7 275 LSL R1,#8 @ Store PROCID
mbed_official 67:63988a2238f7 276 MCR p15,0,R1,c13,c0,1 @ Write CONTEXTIDR
mbed_official 67:63988a2238f7 277
mbed_official 67:63988a2238f7 278 LDR R0,[LR,#TCB_TSTACK] @ os_tsk.run->tsk_stack
mbed_official 67:63988a2238f7 279
mbed_official 67:63988a2238f7 280 @ Does incoming task have VFP state in stack?
mbed_official 67:63988a2238f7 281 LDRB R3,[LR,#TCB_STACKF]
mbed_official 67:63988a2238f7 282 TST R3,#0x2
mbed_official 67:63988a2238f7 283 MRC p15,0,R1,c1,c0,2 @ Read CPACR
mbed_official 67:63988a2238f7 284 ANDEQ R1,R1,#0xFF0FFFFF @ Disable VFP access if incoming task does not have stacked VFP state
mbed_official 67:63988a2238f7 285 ORRNE R1,R1,#0x00F00000 @ Enable VFP access if incoming task does have stacked VFP state
mbed_official 67:63988a2238f7 286 MCR p15,0,R1,c1,c0,2 @ Write CPACR
mbed_official 67:63988a2238f7 287 BEQ no_incoming_vfp
mbed_official 67:63988a2238f7 288 ISB @ We only need the sync if we enabled, otherwise we will context switch before next VFP instruction anyway
mbed_official 67:63988a2238f7 289 VLDMIA R0!,{S0-S31}
mbed_official 67:63988a2238f7 290 LDR R2,[R0]
mbed_official 67:63988a2238f7 291 VMSR FPSCR,R2
mbed_official 67:63988a2238f7 292 ADD R0,R0,#8
mbed_official 67:63988a2238f7 293
mbed_official 67:63988a2238f7 294 no_incoming_vfp:
mbed_official 67:63988a2238f7 295 LDR R1,[R0,#60] @ Restore User CPSR
mbed_official 67:63988a2238f7 296 MSR SPSR_cxsf,R1
mbed_official 67:63988a2238f7 297 LDMIA R0!,{R4-R11} @ Restore User R4-R11
mbed_official 67:63988a2238f7 298 ADD R0,R0,#4 @ Restore User R1-R3,R12
mbed_official 67:63988a2238f7 299 LDMIA R0!,{R1-R3,R12}
mbed_official 67:63988a2238f7 300 LDMIA R0,{LR}^ @ Restore User LR
mbed_official 67:63988a2238f7 301 ADD R0,R0,#4 @ No writeback for load to user LR
mbed_official 67:63988a2238f7 302 LDMIA R0!,{LR} @ Restore User PC
mbed_official 67:63988a2238f7 303 ADD R0,R0,#4 @ Correct User SP for unstacked user CPSR
mbed_official 67:63988a2238f7 304
mbed_official 67:63988a2238f7 305 PUSH {R0} @ Push R0 onto stack
mbed_official 67:63988a2238f7 306 LDMIA SP,{SP}^ @ Get R0 off stack into User SP
mbed_official 67:63988a2238f7 307 ADD SP,SP,#4 @ Put SP back
mbed_official 67:63988a2238f7 308
mbed_official 67:63988a2238f7 309 LDR R0,[R0,#-32] @ Restore R0
mbed_official 67:63988a2238f7 310
mbed_official 67:63988a2238f7 311 PUSH {R0-R3,R12,LR}
mbed_official 67:63988a2238f7 312
mbed_official 67:63988a2238f7 313 AND R12, SP, #4 @ Ensure stack is 8-byte aligned
mbed_official 67:63988a2238f7 314 SUB SP, SP, R12 @ Adjust stack
mbed_official 67:63988a2238f7 315 PUSH {R12, LR} @ Store stack adjustment and dummy LR to SVC stack
mbed_official 67:63988a2238f7 316
mbed_official 67:63988a2238f7 317 CPSID i
mbed_official 67:63988a2238f7 318 BLX rt_tsk_unlock
mbed_official 67:63988a2238f7 319
mbed_official 67:63988a2238f7 320 POP {R12, LR} @ Get stack adjustment & discard dummy LR
mbed_official 67:63988a2238f7 321 ADD SP, SP, R12 @ Unadjust stack
mbed_official 67:63988a2238f7 322
mbed_official 67:63988a2238f7 323 POP {R0-R3,R12,LR}
mbed_official 67:63988a2238f7 324
mbed_official 67:63988a2238f7 325 MOVS PC,LR @ Return from exception
mbed_official 67:63988a2238f7 326
mbed_official 67:63988a2238f7 327
mbed_official 67:63988a2238f7 328 /*------------------- User SVC -------------------------------*/
mbed_official 67:63988a2238f7 329
mbed_official 67:63988a2238f7 330 SVC_User:
mbed_official 67:63988a2238f7 331 LDR R12,=SVC_Count
mbed_official 67:63988a2238f7 332 LDR R12,[R12]
mbed_official 67:63988a2238f7 333 CMP R4,R12 @ Check for overflow
mbed_official 67:63988a2238f7 334 BHI SVC_Done
mbed_official 67:63988a2238f7 335
mbed_official 67:63988a2238f7 336 LDR R12,=SVC_Table-4
mbed_official 67:63988a2238f7 337 LDR R12,[R12,R4,LSL #2] @ Load SVC Function Address
mbed_official 67:63988a2238f7 338 MRS R4,SPSR @ Save SPSR
mbed_official 67:63988a2238f7 339 PUSH {R4} @ Push R4 so we can use it as a temp
mbed_official 67:63988a2238f7 340 AND R4, SP, #4 @ Ensure stack is 8-byte aligned
mbed_official 67:63988a2238f7 341 SUB SP, SP, R4 @ Adjust stack
mbed_official 67:63988a2238f7 342 PUSH {R4, LR} @ Store stack adjustment and dummy LR
mbed_official 67:63988a2238f7 343 BLX R12 @ Call SVC Function
mbed_official 67:63988a2238f7 344 POP {R4, LR} @ Get stack adjustment & discard dummy LR
mbed_official 67:63988a2238f7 345 ADD SP, SP, R4 @ Unadjust stack
mbed_official 67:63988a2238f7 346 POP {R4} @ Restore R4
mbed_official 67:63988a2238f7 347 MSR SPSR_cxsf,R4 @ Restore SPSR
mbed_official 67:63988a2238f7 348
mbed_official 67:63988a2238f7 349 SVC_Done:
mbed_official 67:63988a2238f7 350 PUSH {R0-R3,R12,LR}
mbed_official 67:63988a2238f7 351
mbed_official 67:63988a2238f7 352 PUSH {R4} @ Push R4 so we can use it as a temp
mbed_official 67:63988a2238f7 353 AND R4, SP, #4 @ Ensure stack is 8-byte aligned
mbed_official 67:63988a2238f7 354 SUB SP, SP, R4 @ Adjust stack
mbed_official 67:63988a2238f7 355 PUSH {R4, LR} @ Store stack adjustment and dummy LR
mbed_official 67:63988a2238f7 356
mbed_official 67:63988a2238f7 357 CPSID i
mbed_official 67:63988a2238f7 358 BLX rt_tsk_unlock
mbed_official 67:63988a2238f7 359
mbed_official 67:63988a2238f7 360 POP {R4, LR} @ Get stack adjustment & discard dummy LR
mbed_official 67:63988a2238f7 361 ADD SP, SP, R4 @ Unadjust stack
mbed_official 67:63988a2238f7 362 POP {R4} @ Restore R4
mbed_official 67:63988a2238f7 363
mbed_official 67:63988a2238f7 364 POP {R0-R3,R12,LR}
mbed_official 67:63988a2238f7 365 POP {R4}
mbed_official 67:63988a2238f7 366 RFEFD SP! @ Return from exception
mbed_official 67:63988a2238f7 367
mbed_official 67:63988a2238f7 368 @ }
mbed_official 67:63988a2238f7 369
mbed_official 67:63988a2238f7 370 @ #pragma pop
mbed_official 67:63988a2238f7 371
mbed_official 67:63988a2238f7 372
mbed_official 67:63988a2238f7 373 @ #pragma push
mbed_official 67:63988a2238f7 374 @ #pragma arm
mbed_official 67:63988a2238f7 375 @ __asm void PendSV_Handler (U32 IRQn) {
mbed_official 67:63988a2238f7 376 PendSV_Handler:
mbed_official 67:63988a2238f7 377 .arm
mbed_official 67:63988a2238f7 378
mbed_official 67:63988a2238f7 379 .extern rt_tsk_lock
mbed_official 67:63988a2238f7 380 .extern IRQNestLevel
mbed_official 67:63988a2238f7 381
mbed_official 67:63988a2238f7 382 ADD SP,SP,#8 @ fix up stack pointer (R0 has been pushed and will never be popped, R1 was pushed for stack alignment)
mbed_official 67:63988a2238f7 383
mbed_official 67:63988a2238f7 384 @ Disable systick interrupts, then write EOIR. We want interrupts disabled before we enter the context switcher.
mbed_official 67:63988a2238f7 385 PUSH {R0, R1}
mbed_official 67:63988a2238f7 386 BLX rt_tsk_lock
mbed_official 67:63988a2238f7 387 POP {R0, R1}
mbed_official 67:63988a2238f7 388 LDR R1, =GICInterface_BASE @ __cpp(&GICInterface_BASE)
mbed_official 67:63988a2238f7 389 LDR R1, [R1, #0]
mbed_official 67:63988a2238f7 390 STR R0, [R1, #0x10]
mbed_official 67:63988a2238f7 391
mbed_official 67:63988a2238f7 392 LDR R0, =IRQNestLevel @ Get address of nesting counter
mbed_official 67:63988a2238f7 393 LDR R1, [R0]
mbed_official 67:63988a2238f7 394 SUB R1, R1, #1 @ Decrement nesting counter
mbed_official 67:63988a2238f7 395 STR R1, [R0]
mbed_official 67:63988a2238f7 396
mbed_official 67:63988a2238f7 397 BLX rt_pop_req @ __cpp(rt_pop_req)
mbed_official 67:63988a2238f7 398
mbed_official 67:63988a2238f7 399 POP {R1, LR} @ Get stack adjustment & discard dummy LR
mbed_official 67:63988a2238f7 400 ADD SP, SP, R1 @ Unadjust stack
mbed_official 67:63988a2238f7 401
mbed_official 67:63988a2238f7 402 LDR R0,[SP,#24]
mbed_official 67:63988a2238f7 403 MSR SPSR_cxsf,R0
mbed_official 67:63988a2238f7 404 POP {R0-R3,R12} @ Leave SPSR & LR on the stack
mbed_official 67:63988a2238f7 405 PUSH {R4}
mbed_official 67:63988a2238f7 406 B Sys_Switch
mbed_official 67:63988a2238f7 407 @ }
mbed_official 67:63988a2238f7 408 @ #pragma pop
mbed_official 67:63988a2238f7 409
mbed_official 67:63988a2238f7 410 @ #pragma push
mbed_official 67:63988a2238f7 411 @ #pragma arm
mbed_official 67:63988a2238f7 412 @ __asm void OS_Tick_Handler (U32 IRQn) {
mbed_official 67:63988a2238f7 413 OS_Tick_Handler:
mbed_official 67:63988a2238f7 414 .arm
mbed_official 67:63988a2238f7 415
mbed_official 67:63988a2238f7 416 ADD SP,SP,#8 @ fix up stack pointer (R0 has been pushed and will never be popped, R1 was pushed for stack alignment)
mbed_official 67:63988a2238f7 417
mbed_official 67:63988a2238f7 418 PUSH {R0, R1}
mbed_official 67:63988a2238f7 419 BLX rt_tsk_lock
mbed_official 67:63988a2238f7 420 POP {R0, R1}
mbed_official 67:63988a2238f7 421 LDR R1, =GICInterface_BASE @ __cpp(&GICInterface_BASE)
mbed_official 67:63988a2238f7 422 LDR R1, [R1, #0]
mbed_official 67:63988a2238f7 423 STR R0, [R1, #0x10]
mbed_official 67:63988a2238f7 424
mbed_official 67:63988a2238f7 425 LDR R0, =IRQNestLevel @ Get address of nesting counter
mbed_official 67:63988a2238f7 426 LDR R1, [R0]
mbed_official 67:63988a2238f7 427 SUB R1, R1, #1 @ Decrement nesting counter
mbed_official 67:63988a2238f7 428 STR R1, [R0]
mbed_official 67:63988a2238f7 429
mbed_official 67:63988a2238f7 430 BLX os_tick_irqack @ __cpp(os_tick_irqack)
mbed_official 67:63988a2238f7 431 BLX rt_systick @ __cpp(rt_systick)
mbed_official 67:63988a2238f7 432
mbed_official 67:63988a2238f7 433 POP {R1, LR} @ Get stack adjustment & discard dummy LR
mbed_official 67:63988a2238f7 434 ADD SP, SP, R1 @ Unadjust stack
mbed_official 67:63988a2238f7 435
mbed_official 67:63988a2238f7 436 LDR R0,[SP,#24]
mbed_official 67:63988a2238f7 437 MSR SPSR_cxsf,R0
mbed_official 67:63988a2238f7 438 POP {R0-R3,R12} @ Leave SPSR & LR on the stack
mbed_official 67:63988a2238f7 439 PUSH {R4}
mbed_official 67:63988a2238f7 440 B Sys_Switch
mbed_official 67:63988a2238f7 441 @ }
mbed_official 67:63988a2238f7 442 @ #pragma pop
mbed_official 67:63988a2238f7 443
mbed_official 67:63988a2238f7 444 .global __set_PSP
mbed_official 67:63988a2238f7 445 @ __STATIC_ASM void __set_PSP(uint32_t topOfProcStack)
mbed_official 67:63988a2238f7 446 @ {
mbed_official 67:63988a2238f7 447 __set_PSP:
mbed_official 67:63988a2238f7 448 @ PRESERVE8
mbed_official 67:63988a2238f7 449 .arm
mbed_official 67:63988a2238f7 450
mbed_official 67:63988a2238f7 451 BIC R0, R0, #7 @ensure stack is 8-byte aligned
mbed_official 67:63988a2238f7 452 MRS R1, CPSR
mbed_official 67:63988a2238f7 453 CPS #MODE_SYS @no effect in USR mode
mbed_official 67:63988a2238f7 454 MOV SP, R0
mbed_official 67:63988a2238f7 455 MSR CPSR_c, R1 @no effect in USR mode
mbed_official 67:63988a2238f7 456 ISB
mbed_official 67:63988a2238f7 457 BX LR
mbed_official 67:63988a2238f7 458
mbed_official 67:63988a2238f7 459 @ }
mbed_official 67:63988a2238f7 460
mbed_official 67:63988a2238f7 461 .global __set_CPS_USR
mbed_official 67:63988a2238f7 462 @ __STATIC_ASM void __set_CPS_USR(void)
mbed_official 67:63988a2238f7 463 @ {
mbed_official 67:63988a2238f7 464 __set_CPS_USR:
mbed_official 67:63988a2238f7 465 .arm
mbed_official 67:63988a2238f7 466
mbed_official 67:63988a2238f7 467 CPS #MODE_USR
mbed_official 67:63988a2238f7 468 BX LR
mbed_official 67:63988a2238f7 469 @ }
mbed_official 67:63988a2238f7 470
mbed_official 67:63988a2238f7 471 .END
mbed_official 67:63988a2238f7 472 /*----------------------------------------------------------------------------
mbed_official 67:63988a2238f7 473 * end of file
mbed_official 67:63988a2238f7 474 *---------------------------------------------------------------------------*/