mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Merge pull request #4875 from deepikabhavnani/cm_23_support
Initial support for Cortex M-23/M-33 devices.pull/5073/head
						commit
						4b9856604d
					
				| 
						 | 
					@ -78,6 +78,14 @@
 | 
				
			||||||
    #ifndef __ARM_ARCH_7EM__
 | 
					    #ifndef __ARM_ARCH_7EM__
 | 
				
			||||||
      #define __ARM_ARCH_7EM__                     1
 | 
					      #define __ARM_ARCH_7EM__                     1
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
 | 
					  #elif (__CORE__ == __ARM8M_BASELINE__)
 | 
				
			||||||
 | 
					    #ifndef __ARM_ARCH_8M_BASE__
 | 
				
			||||||
 | 
					      #define __ARM_ARCH_8M_BASE__                 1
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
 | 
					  #elif (__CORE__ == __ARM8M_MAINLINE__)
 | 
				
			||||||
 | 
					    #ifndef __ARM_ARCH_8M_MAIN__
 | 
				
			||||||
 | 
					      #define __ARM_ARCH_8M_MAIN__                 1
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // IAR version 7.8.1 and earlier do not include __ALIGNED
 | 
					  // IAR version 7.8.1 and earlier do not include __ALIGNED
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,7 +37,8 @@
 | 
				
			||||||
#define CTHUNK_ADDRESS 1
 | 
					#define CTHUNK_ADDRESS 1
 | 
				
			||||||
#define CTHUNK_VARIABLES volatile uint32_t code[2]
 | 
					#define CTHUNK_VARIABLES volatile uint32_t code[2]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if (defined(__CORTEX_M3) || defined(__CORTEX_M4) || defined(__CORTEX_M7) || defined(__CORTEX_A9))
 | 
					#if (defined(__CORTEX_M3) || defined(__CORTEX_M4) || defined(__CORTEX_M7) || defined(__CORTEX_A9) \
 | 
				
			||||||
 | 
					    || defined(__CORTEX_M23) || defined(__CORTEX_M33))
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* CTHUNK disassembly for Cortex-M3/M4/M7/A9 (thumb2):
 | 
					* CTHUNK disassembly for Cortex-M3/M4/M7/A9 (thumb2):
 | 
				
			||||||
* * adr  r0, #4
 | 
					* * adr  r0, #4
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,302 @@
 | 
				
			||||||
 | 
					;/*
 | 
				
			||||||
 | 
					; * Copyright (c) 2016-2017 ARM Limited. All rights reserved.
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * Licensed under the Apache License, Version 2.0 (the License); you may
 | 
				
			||||||
 | 
					; * not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					; * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					; * distributed under the License is distributed on an AS IS BASIS, WITHOUT
 | 
				
			||||||
 | 
					; * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					; * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					; * limitations under the License.
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * -----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * Project:     CMSIS-RTOS RTX
 | 
				
			||||||
 | 
					; * Title:       ARMv8M Baseline Exception handlers
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * -----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					; */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .file    "irq_armv8mbl.S"
 | 
				
			||||||
 | 
					        .syntax  unified
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .equ     I_T_RUN_OFS, 28        // osRtxInfo.thread.run offset
 | 
				
			||||||
 | 
					        .equ     TCB_SM_OFS,  48        // TCB.stack_mem offset
 | 
				
			||||||
 | 
					        .equ     TCB_SP_OFS,  56        // TCB.SP offset
 | 
				
			||||||
 | 
					        .equ     TCB_SF_OFS,  34        // TCB.stack_frame offset
 | 
				
			||||||
 | 
					        .equ     TCB_TZM_OFS, 64        // TCB.tz_memory offset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .section ".rodata"
 | 
				
			||||||
 | 
					        .global  irqRtxLib              // Non weak library reference
 | 
				
			||||||
 | 
					irqRtxLib:
 | 
				
			||||||
 | 
					        .byte    0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .thumb
 | 
				
			||||||
 | 
					        .section ".text"
 | 
				
			||||||
 | 
					        .align   2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .thumb_func
 | 
				
			||||||
 | 
					        .type    SVC_Handler, %function
 | 
				
			||||||
 | 
					        .global  SVC_Handler
 | 
				
			||||||
 | 
					        .fnstart
 | 
				
			||||||
 | 
					        .cantunwind
 | 
				
			||||||
 | 
					SVC_Handler:
 | 
				
			||||||
 | 
					        MRS      R0,PSP                 // Get PSP
 | 
				
			||||||
 | 
					        LDR      R1,[R0,#24]            // Load saved PC from stack
 | 
				
			||||||
 | 
					        SUBS     R1,R1,#2               // Point to SVC instruction
 | 
				
			||||||
 | 
					        LDRB     R1,[R1]                // Load SVC number
 | 
				
			||||||
 | 
					        CMP      R1,#0
 | 
				
			||||||
 | 
					        BNE      SVC_User               // Branch if not SVC 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUSH     {R0,LR}                // Save PSP and EXC_RETURN
 | 
				
			||||||
 | 
					        LDM      R0,{R0-R3}             // Load function parameters from stack
 | 
				
			||||||
 | 
					        BLX      R7                     // Call service function
 | 
				
			||||||
 | 
					        POP      {R2,R3}                // Restore PSP and EXC_RETURN
 | 
				
			||||||
 | 
					        STMIA    R2!,{R0-R1}            // Store function return values
 | 
				
			||||||
 | 
					        MOV      LR,R3                  // Set EXC_RETURN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_Context:
 | 
				
			||||||
 | 
					        LDR      R3,=osRtxInfo+I_T_RUN_OFS // Load address of osRtxInfo.run
 | 
				
			||||||
 | 
					        LDMIA    R3!,{R1,R2}            // Load osRtxInfo.thread.run: curr & next
 | 
				
			||||||
 | 
					        CMP      R1,R2                  // Check if thread switch is required
 | 
				
			||||||
 | 
					        BEQ      SVC_Exit               // Branch when threads are the same
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        CBZ      R1,SVC_ContextSwitch   // Branch if running thread is deleted
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSave:
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					        LDR      R0,[R1,#TCB_TZM_OFS]   // Load TrustZone memory identifier
 | 
				
			||||||
 | 
					        CBZ      R0,SVC_ContextSave1    // Branch if there is no secure context
 | 
				
			||||||
 | 
					        PUSH     {R1,R2,R3,R7}          // Save registers
 | 
				
			||||||
 | 
					        MOV      R7,LR                  // Get EXC_RETURN
 | 
				
			||||||
 | 
					        BL       TZ_StoreContext_S      // Store secure context
 | 
				
			||||||
 | 
					        MOV      LR,R7                  // Set EXC_RETURN
 | 
				
			||||||
 | 
					        POP      {R1,R2,R3,R7}          // Restore registers
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSave1:
 | 
				
			||||||
 | 
					        MRS      R0,PSP                 // Get PSP
 | 
				
			||||||
 | 
					        SUBS     R0,R0,#32              // Adjust PSP
 | 
				
			||||||
 | 
					        STR      R0,[R1,#TCB_SP_OFS]    // Store SP
 | 
				
			||||||
 | 
					        STMIA    R0!,{R4-R7}            // Save R4..R7
 | 
				
			||||||
 | 
					        MOV      R4,R8
 | 
				
			||||||
 | 
					        MOV      R5,R9
 | 
				
			||||||
 | 
					        MOV      R6,R10
 | 
				
			||||||
 | 
					        MOV      R7,R11
 | 
				
			||||||
 | 
					        STMIA    R0!,{R4-R7}            // Save R8..R11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSave2:
 | 
				
			||||||
 | 
					        MOV      R0,LR                  // Get EXC_RETURN
 | 
				
			||||||
 | 
					        ADDS     R1,R1,#TCB_SF_OFS      // Adjust address
 | 
				
			||||||
 | 
					        STRB     R0,[R1]                // Store stack frame information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSwitch:
 | 
				
			||||||
 | 
					        SUBS     R3,R3,#8               // Adjust address
 | 
				
			||||||
 | 
					        STR      R2,[R3]                // osRtxInfo.thread.run: curr = next
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextRestore:
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_TZM_OFS]   // Load TrustZone memory identifier
 | 
				
			||||||
 | 
					        CBZ      R0,SVC_ContextRestore1 // Branch if there is no secure context
 | 
				
			||||||
 | 
					        PUSH     {R2,R3}                // Save registers
 | 
				
			||||||
 | 
					        BL       TZ_LoadContext_S       // Load secure context
 | 
				
			||||||
 | 
					        POP      {R2,R3}                // Restore registers
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextRestore1:
 | 
				
			||||||
 | 
					        MOV      R1,R2
 | 
				
			||||||
 | 
					        ADDS     R1,R1,#TCB_SF_OFS      // Adjust address
 | 
				
			||||||
 | 
					        LDRB     R0,[R1]                // Load stack frame information
 | 
				
			||||||
 | 
					        MOVS     R1,#0xFF
 | 
				
			||||||
 | 
					        MVNS     R1,R1                  // R1=0xFFFFFF00
 | 
				
			||||||
 | 
					        ORRS     R0,R1
 | 
				
			||||||
 | 
					        MOV      LR,R0                  // Set EXC_RETURN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					        LSLS     R0,R0,#25              // Check domain of interrupted thread
 | 
				
			||||||
 | 
					        BPL      SVC_ContextRestore2    // Branch if non-secure
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_SP_OFS]    // Load SP
 | 
				
			||||||
 | 
					        MSR      PSP,R0                 // Set PSP
 | 
				
			||||||
 | 
					        BX       LR                     // Exit from handler
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_SM_OFS]    // Load stack memory base
 | 
				
			||||||
 | 
					        MSR      PSPLIM,R0              // Set PSPLIM
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextRestore2:
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_SP_OFS]    // Load SP
 | 
				
			||||||
 | 
					        ADDS     R0,R0,#16              // Adjust address
 | 
				
			||||||
 | 
					        LDMIA    R0!,{R4-R7}            // Restore R8..R11
 | 
				
			||||||
 | 
					        MOV      R8,R4
 | 
				
			||||||
 | 
					        MOV      R9,R5
 | 
				
			||||||
 | 
					        MOV      R10,R6
 | 
				
			||||||
 | 
					        MOV      R11,R7
 | 
				
			||||||
 | 
					        MSR      PSP,R0                 // Set PSP
 | 
				
			||||||
 | 
					        SUBS     R0,R0,#32              // Adjust address
 | 
				
			||||||
 | 
					        LDMIA    R0!,{R4-R7}            // Restore R4..R7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_Exit:
 | 
				
			||||||
 | 
					        BX       LR                     // Exit from handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_User:
 | 
				
			||||||
 | 
					        PUSH     {R4,LR}                // Save registers
 | 
				
			||||||
 | 
					        LDR      R2,=osRtxUserSVC       // Load address of SVC table
 | 
				
			||||||
 | 
					        LDR      R3,[R2]                // Load SVC maximum number
 | 
				
			||||||
 | 
					        CMP      R1,R3                  // Check SVC number range
 | 
				
			||||||
 | 
					        BHI      SVC_Done               // Branch if out of range
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LSLS     R1,R1,#2
 | 
				
			||||||
 | 
					        LDR      R4,[R2,R1]             // Load address of SVC function
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LDM      R0,{R0-R3}             // Load function parameters from stack
 | 
				
			||||||
 | 
					        BLX      R4                     // Call service function
 | 
				
			||||||
 | 
					        MRS      R4,PSP                 // Get PSP
 | 
				
			||||||
 | 
					        STR      R0,[R4]                // Store function return value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_Done:
 | 
				
			||||||
 | 
					        POP      {R4,PC}                // Return from handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .fnend
 | 
				
			||||||
 | 
					        .size    SVC_Handler, .-SVC_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .thumb_func
 | 
				
			||||||
 | 
					        .type    PendSV_Handler, %function
 | 
				
			||||||
 | 
					        .global  PendSV_Handler
 | 
				
			||||||
 | 
					        .fnstart
 | 
				
			||||||
 | 
					        .cantunwind
 | 
				
			||||||
 | 
					PendSV_Handler:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUSH     {R0,LR}                // Save EXC_RETURN
 | 
				
			||||||
 | 
					        BL       osRtxPendSV_Handler    // Call osRtxPendSV_Handler
 | 
				
			||||||
 | 
					        POP      {R0,R1}                // Restore EXC_RETURN
 | 
				
			||||||
 | 
					        MOV      LR,R1                  // Set EXC_RETURN
 | 
				
			||||||
 | 
					        B        Sys_Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .fnend
 | 
				
			||||||
 | 
					        .size    PendSV_Handler, .-PendSV_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .thumb_func
 | 
				
			||||||
 | 
					        .type    SysTick_Handler, %function
 | 
				
			||||||
 | 
					        .global  SysTick_Handler
 | 
				
			||||||
 | 
					        .fnstart
 | 
				
			||||||
 | 
					        .cantunwind
 | 
				
			||||||
 | 
					SysTick_Handler:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUSH     {R0,LR}                // Save EXC_RETURN
 | 
				
			||||||
 | 
					        BL       osRtxTick_Handler      // Call osRtxTick_Handler
 | 
				
			||||||
 | 
					        POP      {R0,R1}                // Restore EXC_RETURN
 | 
				
			||||||
 | 
					        MOV      LR,R1                  // Set EXC_RETURN
 | 
				
			||||||
 | 
					        B        Sys_Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .fnend
 | 
				
			||||||
 | 
					        .size   SysTick_Handler, .-SysTick_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .thumb_func
 | 
				
			||||||
 | 
					        .type    Sys_Context, %function
 | 
				
			||||||
 | 
					        .global  Sys_Context
 | 
				
			||||||
 | 
					        .fnstart
 | 
				
			||||||
 | 
					        .cantunwind
 | 
				
			||||||
 | 
					Sys_Context:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LDR      R3,=osRtxInfo+I_T_RUN_OFS // Load address of osRtxInfo.run
 | 
				
			||||||
 | 
					        LDM      R3!,{R1,R2}            // Load osRtxInfo.thread.run: curr & next
 | 
				
			||||||
 | 
					        CMP      R1,R2                  // Check if thread switch is required
 | 
				
			||||||
 | 
					        BEQ      Sys_ContextExit        // Branch when threads are the same
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSave:
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					        LDR      R0,[R1,#TCB_TZM_OFS]   // Load TrustZone memory identifier
 | 
				
			||||||
 | 
					        CBZ      R0,Sys_ContextSave1    // Branch if there is no secure context
 | 
				
			||||||
 | 
					        PUSH     {R1,R2,R3,R7}          // Save registers
 | 
				
			||||||
 | 
					        MOV      R7,LR                  // Get EXC_RETURN
 | 
				
			||||||
 | 
					        BL       TZ_StoreContext_S      // Store secure context
 | 
				
			||||||
 | 
					        MOV      LR,R7                  // Set EXC_RETURN
 | 
				
			||||||
 | 
					        POP      {R1,R2,R3,R7}          // Restore registers
 | 
				
			||||||
 | 
					        LSLS     R7,R7,#25              // Check domain of interrupted thread
 | 
				
			||||||
 | 
					        BMI      Sys_ContextSave1       // Branch if secure
 | 
				
			||||||
 | 
					        MRS      R0,PSP                 // Get PSP
 | 
				
			||||||
 | 
					        STR      R0,[R1,#TCB_SP_OFS]    // Store SP
 | 
				
			||||||
 | 
					        B        Sys_ContextSave2
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSave1:
 | 
				
			||||||
 | 
					        MRS      R0,PSP                 // Get PSP
 | 
				
			||||||
 | 
					        SUBS     R0,R0,#32              // Adjust address
 | 
				
			||||||
 | 
					        STR      R0,[R1,#TCB_SP_OFS]    // Store SP
 | 
				
			||||||
 | 
					        STMIA    R0!,{R4-R7}            // Save R4..R7
 | 
				
			||||||
 | 
					        MOV      R4,R8
 | 
				
			||||||
 | 
					        MOV      R5,R9
 | 
				
			||||||
 | 
					        MOV      R6,R10
 | 
				
			||||||
 | 
					        MOV      R7,R11
 | 
				
			||||||
 | 
					        STMIA    R0!,{R4-R7}            // Save R8..R11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSave2:
 | 
				
			||||||
 | 
					        MOV      R0,LR                  // Get EXC_RETURN
 | 
				
			||||||
 | 
					        ADDS     R1,R1,#TCB_SF_OFS      // Adjust address
 | 
				
			||||||
 | 
					        STRB     R0,[R1]                // Store stack frame information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSwitch:
 | 
				
			||||||
 | 
					        SUBS     R3,R3,#8               // Adjust address
 | 
				
			||||||
 | 
					        STR      R2,[R3]                // osRtxInfo.run: curr = next
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextRestore:
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_TZM_OFS]   // Load TrustZone memory identifier
 | 
				
			||||||
 | 
					        CBZ      R0,Sys_ContextRestore1 // Branch if there is no secure context
 | 
				
			||||||
 | 
					        PUSH     {R2,R3}                // Save registers
 | 
				
			||||||
 | 
					        BL       TZ_LoadContext_S       // Load secure context
 | 
				
			||||||
 | 
					        POP      {R2,R3}                // Restore registers
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextRestore1:
 | 
				
			||||||
 | 
					        MOV      R1,R2
 | 
				
			||||||
 | 
					        ADDS     R1,R1,#TCB_SF_OFS      // Adjust offset
 | 
				
			||||||
 | 
					        LDRB     R0,[R1]                // Load stack frame information
 | 
				
			||||||
 | 
					        MOVS     R1,#0xFF
 | 
				
			||||||
 | 
					        MVNS     R1,R1                  // R1=0xFFFFFF00
 | 
				
			||||||
 | 
					        ORRS     R0,R1
 | 
				
			||||||
 | 
					        MOV      LR,R0                  // Set EXC_RETURN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					        LSLS     R0,R0,#25              // Check domain of interrupted thread
 | 
				
			||||||
 | 
					        BPL      Sys_ContextRestore2    // Branch if non-secure
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_SP_OFS]    // Load SP
 | 
				
			||||||
 | 
					        MSR      PSP,R0                 // Set PSP
 | 
				
			||||||
 | 
					        BX       LR                     // Exit from handler
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_SM_OFS]    // Load stack memory base
 | 
				
			||||||
 | 
					        MSR      PSPLIM,R0              // Set PSPLIM
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextRestore2:
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_SP_OFS]    // Load SP
 | 
				
			||||||
 | 
					        ADDS     R0,R0,#16              // Adjust address
 | 
				
			||||||
 | 
					        LDMIA    R0!,{R4-R7}            // Restore R8..R11
 | 
				
			||||||
 | 
					        MOV      R8,R4
 | 
				
			||||||
 | 
					        MOV      R9,R5
 | 
				
			||||||
 | 
					        MOV      R10,R6
 | 
				
			||||||
 | 
					        MOV      R11,R7
 | 
				
			||||||
 | 
					        MSR      PSP,R0                 // Set PSP
 | 
				
			||||||
 | 
					        SUBS     R0,R0,#32              // Adjust address
 | 
				
			||||||
 | 
					        LDMIA    R0!,{R4-R7}            // Restore R4..R7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextExit:
 | 
				
			||||||
 | 
					        BX       LR                     // Exit from handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .fnend
 | 
				
			||||||
 | 
					        .size    Sys_Context, .-Sys_Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,288 @@
 | 
				
			||||||
 | 
					;/*
 | 
				
			||||||
 | 
					; * Copyright (c) 2016-2017 ARM Limited. All rights reserved.
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * Licensed under the Apache License, Version 2.0 (the License); you may
 | 
				
			||||||
 | 
					; * not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					; * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					; * distributed under the License is distributed on an AS IS BASIS, WITHOUT
 | 
				
			||||||
 | 
					; * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					; * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					; * limitations under the License.
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * -----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * Project:     CMSIS-RTOS RTX
 | 
				
			||||||
 | 
					; * Title:       ARMv8M Baseline Exception handlers
 | 
				
			||||||
 | 
					; *
 | 
				
			||||||
 | 
					; * -----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					; */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                NAME    irq_armv8mbl.s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I_T_RUN_OFS     EQU      28                     ; osRtxInfo.thread.run offset
 | 
				
			||||||
 | 
					TCB_SM_OFS      EQU      48                     ; TCB.stack_mem offset
 | 
				
			||||||
 | 
					TCB_SP_OFS      EQU      56                     ; TCB.SP offset
 | 
				
			||||||
 | 
					TCB_SF_OFS      EQU      34                     ; TCB.stack_frame offset
 | 
				
			||||||
 | 
					TCB_TZM_OFS     EQU      64                     ; TCB.tz_memory offset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                PRESERVE8
 | 
				
			||||||
 | 
					                SECTION .rodata:DATA:NOROOT(2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                EXPORT   irqRtxLib
 | 
				
			||||||
 | 
					irqRtxLib       DCB      0                      ; Non weak library reference
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                THUMB
 | 
				
			||||||
 | 
					                SECTION .text:CODE:NOROOT(2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_Handler
 | 
				
			||||||
 | 
					                EXPORT   SVC_Handler
 | 
				
			||||||
 | 
					                IMPORT   osRtxUserSVC
 | 
				
			||||||
 | 
					                IMPORT   osRtxInfo
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					                IMPORT   TZ_LoadContext_S
 | 
				
			||||||
 | 
					                IMPORT   TZ_StoreContext_S
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                MRS      R0,PSP                 ; Get PSP
 | 
				
			||||||
 | 
					                LDR      R1,[R0,#24]            ; Load saved PC from stack
 | 
				
			||||||
 | 
					                SUBS     R1,R1,#2               ; Point to SVC instruction
 | 
				
			||||||
 | 
					                LDRB     R1,[R1]                ; Load SVC number
 | 
				
			||||||
 | 
					                CMP      R1,#0
 | 
				
			||||||
 | 
					                BNE      SVC_User               ; Branch if not SVC 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                PUSH     {R0,LR}                ; Save PSP and EXC_RETURN
 | 
				
			||||||
 | 
					                LDM      R0,{R0-R3}             ; Load function parameters from stack
 | 
				
			||||||
 | 
					                BLX      R7                     ; Call service function
 | 
				
			||||||
 | 
					                POP      {R2,R3}                ; Restore PSP and EXC_RETURN
 | 
				
			||||||
 | 
					                STMIA    R2!,{R0-R1}            ; Store function return values
 | 
				
			||||||
 | 
					                MOV      LR,R3                  ; Set EXC_RETURN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_Context
 | 
				
			||||||
 | 
					                LDR      R3,=osRtxInfo+I_T_RUN_OFS; Load address of osRtxInfo.run
 | 
				
			||||||
 | 
					                LDMIA    R3!,{R1,R2}            ; Load osRtxInfo.thread.run: curr & next
 | 
				
			||||||
 | 
					                CMP      R1,R2                  ; Check if thread switch is required
 | 
				
			||||||
 | 
					                BEQ      SVC_Exit               ; Branch when threads are the same
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                CBZ      R1,SVC_ContextSwitch   ; Branch if running thread is deleted
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSave
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					                LDR      R0,[R1,#TCB_TZM_OFS]   ; Load TrustZone memory identifier
 | 
				
			||||||
 | 
					                CBZ      R0,SVC_ContextSave1    ; Branch if there is no secure context
 | 
				
			||||||
 | 
					                PUSH     {R1,R2,R3,R7}          ; Save registers
 | 
				
			||||||
 | 
					                MOV      R7,LR                  ; Get EXC_RETURN
 | 
				
			||||||
 | 
					                BL       TZ_StoreContext_S      ; Store secure context
 | 
				
			||||||
 | 
					                MOV      LR,R7                  ; Set EXC_RETURN
 | 
				
			||||||
 | 
					                POP      {R1,R2,R3,R7}          ; Restore registers
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSave1
 | 
				
			||||||
 | 
					                MRS      R0,PSP                 ; Get PSP
 | 
				
			||||||
 | 
					                SUBS     R0,R0,#32              ; Adjust PSP
 | 
				
			||||||
 | 
					                STR      R0,[R1,#TCB_SP_OFS]    ; Store SP
 | 
				
			||||||
 | 
					                STMIA    R0!,{R4-R7}            ; Save R4..R7
 | 
				
			||||||
 | 
					                MOV      R4,R8
 | 
				
			||||||
 | 
					                MOV      R5,R9
 | 
				
			||||||
 | 
					                MOV      R6,R10
 | 
				
			||||||
 | 
					                MOV      R7,R11
 | 
				
			||||||
 | 
					                STMIA    R0!,{R4-R7}            ; Save R8..R11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSave2
 | 
				
			||||||
 | 
					                MOV      R0,LR                  ; Get EXC_RETURN
 | 
				
			||||||
 | 
					                ADDS     R1,R1,#TCB_SF_OFS      ; Adjust address
 | 
				
			||||||
 | 
					                STRB     R0,[R1]                ; Store stack frame information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSwitch
 | 
				
			||||||
 | 
					                SUBS     R3,R3,#8               ; Adjust address
 | 
				
			||||||
 | 
					                STR      R2,[R3]                ; osRtxInfo.thread.run: curr = next
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextRestore
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					                LDR      R0,[R2,#TCB_TZM_OFS]   ; Load TrustZone memory identifier
 | 
				
			||||||
 | 
					                CBZ      R0,SVC_ContextRestore1 ; Branch if there is no secure context
 | 
				
			||||||
 | 
					                PUSH     {R2,R3}                ; Save registers
 | 
				
			||||||
 | 
					                BL       TZ_LoadContext_S       ; Load secure context
 | 
				
			||||||
 | 
					                POP      {R2,R3}                ; Restore registers
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextRestore1
 | 
				
			||||||
 | 
					                MOV      R1,R2
 | 
				
			||||||
 | 
					                ADDS     R1,R1,#TCB_SF_OFS      ; Adjust address
 | 
				
			||||||
 | 
					                LDRB     R0,[R1]                ; Load stack frame information
 | 
				
			||||||
 | 
					                MOVS     R1,#0xFF
 | 
				
			||||||
 | 
					                MVNS     R1,R1                  ; R1=0xFFFFFF00
 | 
				
			||||||
 | 
					                ORRS     R0,R1
 | 
				
			||||||
 | 
					                MOV      LR,R0                  ; Set EXC_RETURN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					                LSLS     R0,R0,#25              ; Check domain of interrupted thread
 | 
				
			||||||
 | 
					                BPL      SVC_ContextRestore2    ; Branch if non-secure
 | 
				
			||||||
 | 
					                LDR      R0,[R2,#TCB_SP_OFS]    ; Load SP
 | 
				
			||||||
 | 
					                MSR      PSP,R0                 ; Set PSP
 | 
				
			||||||
 | 
					                BX       LR                     ; Exit from handler
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					                LDR      R0,[R2,#TCB_SM_OFS]    ; Load stack memory base
 | 
				
			||||||
 | 
					                MSR      PSPLIM,R0              ; Set PSPLIM
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextRestore2
 | 
				
			||||||
 | 
					                LDR      R0,[R2,#TCB_SP_OFS]    ; Load SP
 | 
				
			||||||
 | 
					                ADDS     R0,R0,#16              ; Adjust address
 | 
				
			||||||
 | 
					                LDMIA    R0!,{R4-R7}            ; Restore R8..R11
 | 
				
			||||||
 | 
					                MOV      R8,R4
 | 
				
			||||||
 | 
					                MOV      R9,R5
 | 
				
			||||||
 | 
					                MOV      R10,R6
 | 
				
			||||||
 | 
					                MOV      R11,R7
 | 
				
			||||||
 | 
					                MSR      PSP,R0                 ; Set PSP
 | 
				
			||||||
 | 
					                SUBS     R0,R0,#32              ; Adjust address
 | 
				
			||||||
 | 
					                LDMIA    R0!,{R4-R7}            ; Restore R4..R7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_Exit
 | 
				
			||||||
 | 
					                BX       LR                     ; Exit from handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_User
 | 
				
			||||||
 | 
					                PUSH     {R4,LR}                ; Save registers
 | 
				
			||||||
 | 
					                LDR      R2,=osRtxUserSVC       ; Load address of SVC table
 | 
				
			||||||
 | 
					                LDR      R3,[R2]                ; Load SVC maximum number
 | 
				
			||||||
 | 
					                CMP      R1,R3                  ; Check SVC number range
 | 
				
			||||||
 | 
					                BHI      SVC_Done               ; Branch if out of range
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                LSLS     R1,R1,#2
 | 
				
			||||||
 | 
					                LDR      R4,[R2,R1]             ; Load address of SVC function
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                LDM      R0,{R0-R3}             ; Load function parameters from stack
 | 
				
			||||||
 | 
					                BLX      R4                     ; Call service function
 | 
				
			||||||
 | 
					                MRS      R4,PSP                 ; Get PSP
 | 
				
			||||||
 | 
					                STR      R0,[R4]                ; Store function return value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_Done
 | 
				
			||||||
 | 
					                POP      {R4,PC}                ; Return from handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PendSV_Handler
 | 
				
			||||||
 | 
					                EXPORT   PendSV_Handler
 | 
				
			||||||
 | 
					                IMPORT   osRtxPendSV_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                PUSH     {R0,LR}                ; Save EXC_RETURN
 | 
				
			||||||
 | 
					                BL       osRtxPendSV_Handler    ; Call osRtxPendSV_Handler
 | 
				
			||||||
 | 
					                POP      {R0,R1}                ; Restore EXC_RETURN
 | 
				
			||||||
 | 
					                MOV      LR,R1                  ; Set EXC_RETURN
 | 
				
			||||||
 | 
					                B        Sys_Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SysTick_Handler
 | 
				
			||||||
 | 
					                EXPORT   SysTick_Handler
 | 
				
			||||||
 | 
					                IMPORT   osRtxTick_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                PUSH     {R0,LR}                ; Save EXC_RETURN
 | 
				
			||||||
 | 
					                BL       osRtxTick_Handler      ; Call osRtxTick_Handler
 | 
				
			||||||
 | 
					                POP      {R0,R1}                ; Restore EXC_RETURN
 | 
				
			||||||
 | 
					                MOV      LR,R1                  ; Set EXC_RETURN
 | 
				
			||||||
 | 
					                B        Sys_Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_Context
 | 
				
			||||||
 | 
					                EXPORT   Sys_Context
 | 
				
			||||||
 | 
					                IMPORT   osRtxInfo
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					                IMPORT   TZ_LoadContext_S
 | 
				
			||||||
 | 
					                IMPORT   TZ_StoreContext_S
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                LDR      R3,=osRtxInfo+I_T_RUN_OFS; Load address of osRtxInfo.run
 | 
				
			||||||
 | 
					                LDM      R3!,{R1,R2}            ; Load osRtxInfo.thread.run: curr & next
 | 
				
			||||||
 | 
					                CMP      R1,R2                  ; Check if thread switch is required
 | 
				
			||||||
 | 
					                BEQ      Sys_ContextExit        ; Branch when threads are the same
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSave
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					                LDR      R0,[R1,#TCB_TZM_OFS]   ; Load TrustZone memory identifier
 | 
				
			||||||
 | 
					                CBZ      R0,Sys_ContextSave1    ; Branch if there is no secure context
 | 
				
			||||||
 | 
					                PUSH     {R1,R2,R3,R7}          ; Save registers
 | 
				
			||||||
 | 
					                MOV      R7,LR                  ; Get EXC_RETURN
 | 
				
			||||||
 | 
					                BL       TZ_StoreContext_S      ; Store secure context
 | 
				
			||||||
 | 
					                MOV      LR,R7                  ; Set EXC_RETURN
 | 
				
			||||||
 | 
					                POP      {R1,R2,R3,R7}          ; Restore registers
 | 
				
			||||||
 | 
					                LSLS     R7,R7,#25              ; Check domain of interrupted thread
 | 
				
			||||||
 | 
					                BMI      Sys_ContextSave1       ; Branch if secure
 | 
				
			||||||
 | 
					                MRS      R0,PSP                 ; Get PSP
 | 
				
			||||||
 | 
					                STR      R0,[R1,#TCB_SP_OFS]    ; Store SP
 | 
				
			||||||
 | 
					                B        Sys_ContextSave2
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSave1
 | 
				
			||||||
 | 
					                MRS      R0,PSP                 ; Get PSP
 | 
				
			||||||
 | 
					                SUBS     R0,R0,#32              ; Adjust address
 | 
				
			||||||
 | 
					                STR      R0,[R1,#TCB_SP_OFS]    ; Store SP
 | 
				
			||||||
 | 
					                STMIA    R0!,{R4-R7}            ; Save R4..R7
 | 
				
			||||||
 | 
					                MOV      R4,R8
 | 
				
			||||||
 | 
					                MOV      R5,R9
 | 
				
			||||||
 | 
					                MOV      R6,R10
 | 
				
			||||||
 | 
					                MOV      R7,R11
 | 
				
			||||||
 | 
					                STMIA    R0!,{R4-R7}            ; Save R8..R11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSave2
 | 
				
			||||||
 | 
					                MOV      R0,LR                  ; Get EXC_RETURN
 | 
				
			||||||
 | 
					                ADDS     R1,R1,#TCB_SF_OFS      ; Adjust address
 | 
				
			||||||
 | 
					                STRB     R0,[R1]                ; Store stack frame information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSwitch
 | 
				
			||||||
 | 
					                SUBS     R3,R3,#8               ; Adjust address
 | 
				
			||||||
 | 
					                STR      R2,[R3]                ; osRtxInfo.run: curr = next
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextRestore
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					                LDR      R0,[R2,#TCB_TZM_OFS]   ; Load TrustZone memory identifier
 | 
				
			||||||
 | 
					                CBZ      R0,Sys_ContextRestore1 ; Branch if there is no secure context
 | 
				
			||||||
 | 
					                PUSH     {R2,R3}                ; Save registers
 | 
				
			||||||
 | 
					                BL       TZ_LoadContext_S       ; Load secure context
 | 
				
			||||||
 | 
					                POP      {R2,R3}                ; Restore registers
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextRestore1
 | 
				
			||||||
 | 
					                MOV      R1,R2
 | 
				
			||||||
 | 
					                ADDS     R1,R1,#TCB_SF_OFS      ; Adjust offset
 | 
				
			||||||
 | 
					                LDRB     R0,[R1]                ; Load stack frame information
 | 
				
			||||||
 | 
					                MOVS     R1,#0xFF
 | 
				
			||||||
 | 
					                MVNS     R1,R1                  ; R1=0xFFFFFF00
 | 
				
			||||||
 | 
					                ORRS     R0,R1
 | 
				
			||||||
 | 
					                MOV      LR,R0                  ; Set EXC_RETURN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __DOMAIN_NS
 | 
				
			||||||
 | 
					                LSLS     R0,R0,#25              ; Check domain of interrupted thread
 | 
				
			||||||
 | 
					                BPL      Sys_ContextRestore2    ; Branch if non-secure
 | 
				
			||||||
 | 
					                LDR      R0,[R2,#TCB_SP_OFS]    ; Load SP
 | 
				
			||||||
 | 
					                MSR      PSP,R0                 ; Set PSP
 | 
				
			||||||
 | 
					                BX       LR                     ; Exit from handler
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					                LDR      R0,[R2,#TCB_SM_OFS]    ; Load stack memory base
 | 
				
			||||||
 | 
					                MSR      PSPLIM,R0              ; Set PSPLIM
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextRestore2
 | 
				
			||||||
 | 
					                LDR      R0,[R2,#TCB_SP_OFS]    ; Load SP
 | 
				
			||||||
 | 
					                ADDS     R0,R0,#16              ; Adjust address
 | 
				
			||||||
 | 
					                LDMIA    R0!,{R4-R7}            ; Restore R8..R11
 | 
				
			||||||
 | 
					                MOV      R8,R4
 | 
				
			||||||
 | 
					                MOV      R9,R5
 | 
				
			||||||
 | 
					                MOV      R10,R6
 | 
				
			||||||
 | 
					                MOV      R11,R7
 | 
				
			||||||
 | 
					                MSR      PSP,R0                 ; Set PSP
 | 
				
			||||||
 | 
					                SUBS     R0,R0,#32              ; Adjust address
 | 
				
			||||||
 | 
					                LDMIA    R0!,{R4-R7}            ; Restore R4..R7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextExit
 | 
				
			||||||
 | 
					                BX       LR                     ; Exit from handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                END
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,286 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2016-2017 ARM Limited. All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the License); you may
 | 
				
			||||||
 | 
					 * not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
 | 
				
			||||||
 | 
					 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * -----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Project:     CMSIS-RTOS RTX
 | 
				
			||||||
 | 
					 * Title:       ARMv8M Mainline Exception handlers
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * -----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .file    "irq_armv8mml.S"
 | 
				
			||||||
 | 
					        .syntax  unified
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .ifndef  __DOMAIN_NS
 | 
				
			||||||
 | 
					        .equ     __DOMAIN_NS, 0
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .ifndef  __FPU_USED
 | 
				
			||||||
 | 
					        .equ     __FPU_USED,  0
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .equ     I_T_RUN_OFS, 28        // osRtxInfo.thread.run offset
 | 
				
			||||||
 | 
					        .equ     TCB_SM_OFS,  48        // TCB.stack_mem offset
 | 
				
			||||||
 | 
					        .equ     TCB_SP_OFS,  56        // TCB.SP offset
 | 
				
			||||||
 | 
					        .equ     TCB_SF_OFS,  34        // TCB.stack_frame offset
 | 
				
			||||||
 | 
					        .equ     TCB_TZM_OFS, 64        // TCB.tz_memory offset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .section ".rodata"
 | 
				
			||||||
 | 
					        .global  irqRtxLib              // Non weak library reference
 | 
				
			||||||
 | 
					irqRtxLib:
 | 
				
			||||||
 | 
					        .byte    0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .thumb
 | 
				
			||||||
 | 
					        .section ".text"
 | 
				
			||||||
 | 
					        .align   2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .thumb_func
 | 
				
			||||||
 | 
					        .type    SVC_Handler, %function
 | 
				
			||||||
 | 
					        .global  SVC_Handler
 | 
				
			||||||
 | 
					        .fnstart
 | 
				
			||||||
 | 
					        .cantunwind
 | 
				
			||||||
 | 
					SVC_Handler:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        MRS      R0,PSP                 // Get PSP
 | 
				
			||||||
 | 
					        LDR      R1,[R0,#24]            // Load saved PC from stack
 | 
				
			||||||
 | 
					        LDRB     R1,[R1,#-2]            // Load SVC number
 | 
				
			||||||
 | 
					        CMP      R1,#0
 | 
				
			||||||
 | 
					        BNE      SVC_User               // Branch if not SVC 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUSH     {R0,LR}                // Save PSP and EXC_RETURN
 | 
				
			||||||
 | 
					        LDM      R0,{R0-R3,R12}         // Load function parameters and address from stack
 | 
				
			||||||
 | 
					        BLX      R12                    // Call service function
 | 
				
			||||||
 | 
					        POP      {R12,LR}               // Restore PSP and EXC_RETURN
 | 
				
			||||||
 | 
					        STM      R12,{R0-R1}            // Store function return values
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_Context:
 | 
				
			||||||
 | 
					        LDR      R3,=osRtxInfo+I_T_RUN_OFS // Load address of osRtxInfo.run
 | 
				
			||||||
 | 
					        LDM      R3,{R1,R2}             // Load osRtxInfo.thread.run: curr & next
 | 
				
			||||||
 | 
					        CMP      R1,R2                  // Check if thread switch is required
 | 
				
			||||||
 | 
					        IT       EQ
 | 
				
			||||||
 | 
					        BXEQ     LR                     // Exit when threads are the same
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .if      __FPU_USED == 1
 | 
				
			||||||
 | 
					        CBNZ     R1,SVC_ContextSave     // Branch if running thread is not deleted
 | 
				
			||||||
 | 
					        TST      LR,#0x10               // Check if extended stack frame
 | 
				
			||||||
 | 
					        BNE      SVC_ContextSwitch
 | 
				
			||||||
 | 
					        LDR      R1,=0xE000EF34         // FPCCR Address
 | 
				
			||||||
 | 
					        LDR      R0,[R1]                // Load FPCCR
 | 
				
			||||||
 | 
					        BIC      R0,#1                  // Clear LSPACT (Lazy state)
 | 
				
			||||||
 | 
					        STR      R0,[R1]                // Store FPCCR
 | 
				
			||||||
 | 
					        B        SVC_ContextSwitch
 | 
				
			||||||
 | 
					        .else
 | 
				
			||||||
 | 
					        CBZ      R1,SVC_ContextSwitch   // Branch if running thread is deleted
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSave:
 | 
				
			||||||
 | 
					        .if      __DOMAIN_NS == 1
 | 
				
			||||||
 | 
					        LDR      R0,[R1,#TCB_TZM_OFS]   // Load TrustZone memory identifier
 | 
				
			||||||
 | 
					        CBZ      R0,SVC_ContextSave1    // Branch if there is no secure context
 | 
				
			||||||
 | 
					        PUSH     {R1,R2,R3,LR}          // Save registers and EXC_RETURN
 | 
				
			||||||
 | 
					        BL       TZ_StoreContext_S      // Store secure context
 | 
				
			||||||
 | 
					        POP      {R1,R2,R3,LR}          // Restore registers and EXC_RETURN
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSave1:
 | 
				
			||||||
 | 
					        MRS      R0,PSP                 // Get PSP
 | 
				
			||||||
 | 
					        STMDB    R0!,{R4-R11}           // Save R4..R11
 | 
				
			||||||
 | 
					        .if      __FPU_USED == 1
 | 
				
			||||||
 | 
					        TST      LR,#0x10               // Check if extended stack frame
 | 
				
			||||||
 | 
					        IT       EQ
 | 
				
			||||||
 | 
					        VSTMDBEQ R0!,{S16-S31}          //  Save VFP S16.S31
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSave2:
 | 
				
			||||||
 | 
					        STR      R0,[R1,#TCB_SP_OFS]    // Store SP
 | 
				
			||||||
 | 
					        STRB     LR,[R1,#TCB_SF_OFS]    // Store stack frame information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextSwitch:
 | 
				
			||||||
 | 
					        STR      R2,[R3]                // osRtxInfo.thread.run: curr = next
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextRestore:
 | 
				
			||||||
 | 
					        .if      __DOMAIN_NS == 1
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_TZM_OFS]   // Load TrustZone memory identifier
 | 
				
			||||||
 | 
					        CBZ      R0,SVC_ContextRestore1 // Branch if there is no secure context
 | 
				
			||||||
 | 
					        PUSH     {R2,R3}                // Save registers
 | 
				
			||||||
 | 
					        BL       TZ_LoadContext_S       // Load secure context
 | 
				
			||||||
 | 
					        POP      {R2,R3}                // Restore registers
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextRestore1:
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_SM_OFS]    // Load stack memory base
 | 
				
			||||||
 | 
					        LDRB     R1,[R2,#TCB_SF_OFS]    // Load stack frame information
 | 
				
			||||||
 | 
					        MSR      PSPLIM,R0              // Set PSPLIM
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_SP_OFS]    // Load SP
 | 
				
			||||||
 | 
					        ORR      LR,R1,#0xFFFFFF00      // Set EXC_RETURN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .if      __DOMAIN_NS == 1
 | 
				
			||||||
 | 
					        TST      LR,#0x40               // Check domain of interrupted thread
 | 
				
			||||||
 | 
					        BNE      SVC_ContextRestore2    // Branch if secure
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .if      __FPU_USED == 1
 | 
				
			||||||
 | 
					        TST      LR,#0x10               // Check if extended stack frame
 | 
				
			||||||
 | 
					        IT       EQ
 | 
				
			||||||
 | 
					        VLDMIAEQ R0!,{S16-S31}          //  Restore VFP S16..S31
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					        LDMIA    R0!,{R4-R11}           // Restore R4..R11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_ContextRestore2:
 | 
				
			||||||
 | 
					        MSR      PSP,R0                 // Set PSP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_Exit:
 | 
				
			||||||
 | 
					        BX       LR                     // Exit from handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_User:
 | 
				
			||||||
 | 
					        PUSH     {R4,LR}                // Save registers
 | 
				
			||||||
 | 
					        LDR      R2,=osRtxUserSVC       // Load address of SVC table
 | 
				
			||||||
 | 
					        LDR      R3,[R2]                // Load SVC maximum number
 | 
				
			||||||
 | 
					        CMP      R1,R3                  // Check SVC number range
 | 
				
			||||||
 | 
					        BHI      SVC_Done               // Branch if out of range
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LDR      R4,[R2,R1,LSL #2]      // Load address of SVC function
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LDM      R0,{R0-R3}             // Load function parameters from stack
 | 
				
			||||||
 | 
					        BLX      R4                     // Call service function
 | 
				
			||||||
 | 
					        MRS      R4,PSP                 // Get PSP
 | 
				
			||||||
 | 
					        STR      R0,[R4]                // Store function return value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVC_Done:
 | 
				
			||||||
 | 
					        POP      {R4,PC}                // Return from handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .fnend
 | 
				
			||||||
 | 
					        .size    SVC_Handler, .-SVC_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .thumb_func
 | 
				
			||||||
 | 
					        .type    PendSV_Handler, %function
 | 
				
			||||||
 | 
					        .global  PendSV_Handler
 | 
				
			||||||
 | 
					        .fnstart
 | 
				
			||||||
 | 
					        .cantunwind
 | 
				
			||||||
 | 
					PendSV_Handler:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUSH     {R4,LR}                // Save EXC_RETURN
 | 
				
			||||||
 | 
					        BL       osRtxPendSV_Handler    // Call osRtxPendSV_Handler
 | 
				
			||||||
 | 
					        POP      {R4,LR}                // Restore EXC_RETURN
 | 
				
			||||||
 | 
					        B        Sys_Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .fnend
 | 
				
			||||||
 | 
					        .size    PendSV_Handler, .-PendSV_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .thumb_func
 | 
				
			||||||
 | 
					        .type    SysTick_Handler, %function
 | 
				
			||||||
 | 
					        .global  SysTick_Handler
 | 
				
			||||||
 | 
					        .fnstart
 | 
				
			||||||
 | 
					        .cantunwind
 | 
				
			||||||
 | 
					SysTick_Handler:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PUSH     {R4,LR}                // Save EXC_RETURN
 | 
				
			||||||
 | 
					        BL       osRtxTick_Handler      // Call osRtxTick_Handler
 | 
				
			||||||
 | 
					        POP      {R4,LR}                // Restore EXC_RETURN
 | 
				
			||||||
 | 
					        B        Sys_Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .fnend
 | 
				
			||||||
 | 
					        .size   SysTick_Handler, .-SysTick_Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .thumb_func
 | 
				
			||||||
 | 
					        .type    Sys_Context, %function
 | 
				
			||||||
 | 
					        .global  Sys_Context
 | 
				
			||||||
 | 
					        .fnstart
 | 
				
			||||||
 | 
					        .cantunwind
 | 
				
			||||||
 | 
					Sys_Context:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LDR      R3,=osRtxInfo+I_T_RUN_OFS // Load address of osRtxInfo.run
 | 
				
			||||||
 | 
					        LDM      R3,{R1,R2}             // Load osRtxInfo.thread.run: curr & next
 | 
				
			||||||
 | 
					        CMP      R1,R2                  // Check if thread switch is required
 | 
				
			||||||
 | 
					        IT       EQ
 | 
				
			||||||
 | 
					        BXEQ     LR                     // Exit when threads are the same
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSave:
 | 
				
			||||||
 | 
					        .if      __DOMAIN_NS == 1
 | 
				
			||||||
 | 
					        LDR      R0,[R1,#TCB_TZM_OFS]   // Load TrustZone memory identifier
 | 
				
			||||||
 | 
					        CBZ      R0,Sys_ContextSave1    // Branch if there is no secure context
 | 
				
			||||||
 | 
					        PUSH     {R1,R2,R3,LR}          // Save registers and EXC_RETURN
 | 
				
			||||||
 | 
					        BL       TZ_StoreContext_S      // Store secure context
 | 
				
			||||||
 | 
					        POP      {R1,R2,R3,LR}          // Restore registers and EXC_RETURN
 | 
				
			||||||
 | 
					        TST      LR,#0x40               // Check domain of interrupted thread
 | 
				
			||||||
 | 
					        IT       NE
 | 
				
			||||||
 | 
					        MRSNE    R0,PSP                 // Get PSP
 | 
				
			||||||
 | 
					        BNE      Sys_ContextSave2       // Branch if secure
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSave1:
 | 
				
			||||||
 | 
					        MRS      R0,PSP                 // Get PSP
 | 
				
			||||||
 | 
					        STMDB    R0!,{R4-R11}           // Save R4..R11
 | 
				
			||||||
 | 
					        .if      __FPU_USED == 1
 | 
				
			||||||
 | 
					        TST      LR,#0x10               // Check if extended stack frame
 | 
				
			||||||
 | 
					        IT       EQ
 | 
				
			||||||
 | 
					        VSTMDBEQ R0!,{S16-S31}          //  Save VFP S16.S31
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSave2:
 | 
				
			||||||
 | 
					        STR      R0,[R1,#TCB_SP_OFS]    // Store SP
 | 
				
			||||||
 | 
					        STRB     LR,[R1,#TCB_SF_OFS]    // Store stack frame information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextSwitch:
 | 
				
			||||||
 | 
					        STR      R2,[R3]                // osRtxInfo.run: curr = next
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextRestore:
 | 
				
			||||||
 | 
					        .if      __DOMAIN_NS == 1
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_TZM_OFS]   // Load TrustZone memory identifier
 | 
				
			||||||
 | 
					        CBZ      R0,Sys_ContextRestore1 // Branch if there is no secure context
 | 
				
			||||||
 | 
					        PUSH     {R2,R3}                // Save registers
 | 
				
			||||||
 | 
					        BL       TZ_LoadContext_S       // Load secure context
 | 
				
			||||||
 | 
					        POP      {R2,R3}                // Restore registers
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextRestore1:
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_SM_OFS]    // Load stack memory base
 | 
				
			||||||
 | 
					        LDRB     R1,[R2,#TCB_SF_OFS]    // Load stack frame information
 | 
				
			||||||
 | 
					        MSR      PSPLIM,R0              // Set PSPLIM
 | 
				
			||||||
 | 
					        LDR      R0,[R2,#TCB_SP_OFS]    // Load SP
 | 
				
			||||||
 | 
					        ORR      LR,R1,#0xFFFFFF00      // Set EXC_RETURN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .if      __DOMAIN_NS == 1
 | 
				
			||||||
 | 
					        TST      LR,#0x40               // Check domain of interrupted thread
 | 
				
			||||||
 | 
					        BNE      Sys_ContextRestore2    // Branch if secure
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .if      __FPU_USED == 1
 | 
				
			||||||
 | 
					        TST      LR,#0x10               // Check if extended stack frame
 | 
				
			||||||
 | 
					        IT       EQ
 | 
				
			||||||
 | 
					        VLDMIAEQ R0!,{S16-S31}          //  Restore VFP S16..S31
 | 
				
			||||||
 | 
					        .endif
 | 
				
			||||||
 | 
					        LDMIA    R0!,{R4-R11}           // Restore R4..R11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextRestore2:
 | 
				
			||||||
 | 
					        MSR      PSP,R0                 // Set PSP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sys_ContextExit:
 | 
				
			||||||
 | 
					        BX       LR                     // Exit from handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .fnend
 | 
				
			||||||
 | 
					        .size    Sys_Context, .-Sys_Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .end
 | 
				
			||||||
| 
						 | 
					@ -41,7 +41,11 @@ CORE_LABELS = {
 | 
				
			||||||
   "Cortex-M7" : ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"],
 | 
					   "Cortex-M7" : ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"],
 | 
				
			||||||
   "Cortex-M7F" : ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"],
 | 
					   "Cortex-M7F" : ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"],
 | 
				
			||||||
   "Cortex-M7FD" : ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"],
 | 
					   "Cortex-M7FD" : ["M7", "CORTEX_M", "RTOS_M4_M7", "LIKE_CORTEX_M7", "CORTEX"],
 | 
				
			||||||
   "Cortex-A9" : ["A9", "CORTEX_A", "LIKE_CORTEX_A9", "CORTEX"]
 | 
					   "Cortex-A9" : ["A9", "CORTEX_A", "LIKE_CORTEX_A9", "CORTEX"],
 | 
				
			||||||
 | 
					    "Cortex-M23": ["M23", "CORTEX_M", "LIKE_CORTEX_M23", "CORTEX"],
 | 
				
			||||||
 | 
					    "Cortex-M23-NS": ["M23", "CORTEX_M", "LIKE_CORTEX_M23", "CORTEX"],
 | 
				
			||||||
 | 
					    "Cortex-M33": ["M33", "CORTEX_M", "LIKE_CORTEX_M33", "CORTEX"],
 | 
				
			||||||
 | 
					    "Cortex-M33-NS": ["M33", "CORTEX_M", "LIKE_CORTEX_M33", "CORTEX"]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
################################################################################
 | 
					################################################################################
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -332,6 +332,10 @@ class mbedToolchain:
 | 
				
			||||||
        "Cortex-M7F" : ["__CORTEX_M7", "ARM_MATH_CM7", "__FPU_PRESENT=1", "__CMSIS_RTOS", "__MBED_CMSIS_RTOS_CM"],
 | 
					        "Cortex-M7F" : ["__CORTEX_M7", "ARM_MATH_CM7", "__FPU_PRESENT=1", "__CMSIS_RTOS", "__MBED_CMSIS_RTOS_CM"],
 | 
				
			||||||
        "Cortex-M7FD" : ["__CORTEX_M7", "ARM_MATH_CM7", "__FPU_PRESENT=1", "__CMSIS_RTOS", "__MBED_CMSIS_RTOS_CM"],
 | 
					        "Cortex-M7FD" : ["__CORTEX_M7", "ARM_MATH_CM7", "__FPU_PRESENT=1", "__CMSIS_RTOS", "__MBED_CMSIS_RTOS_CM"],
 | 
				
			||||||
        "Cortex-A9" : ["__CORTEX_A9", "ARM_MATH_CA9", "__FPU_PRESENT", "__CMSIS_RTOS", "__EVAL", "__MBED_CMSIS_RTOS_CA9"],
 | 
					        "Cortex-A9" : ["__CORTEX_A9", "ARM_MATH_CA9", "__FPU_PRESENT", "__CMSIS_RTOS", "__EVAL", "__MBED_CMSIS_RTOS_CA9"],
 | 
				
			||||||
 | 
					        "Cortex-M23-NS": ["__CORTEX_M23", "ARM_MATH_ARMV8MBL", "__DOMAIN_NS=1", "__CMSIS_RTOS", "__MBED_CMSIS_RTOS_CM"],
 | 
				
			||||||
 | 
					        "Cortex-M23": ["__CORTEX_M23", "ARM_MATH_ARMV8MBL", "__CMSIS_RTOS", "__MBED_CMSIS_RTOS_CM"],
 | 
				
			||||||
 | 
					        "Cortex-M33-NS": ["__CORTEX_M33", "ARM_MATH_ARMV8MML", "__DOMAIN_NS=1", "__FPU_PRESENT", "__CMSIS_RTOS", "__MBED_CMSIS_RTOS_CM"],
 | 
				
			||||||
 | 
					        "Cortex-M33": ["__CORTEX_M33", "ARM_MATH_ARMV8MML", "__FPU_PRESENT", "__CMSIS_RTOS", "__MBED_CMSIS_RTOS_CM"],
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MBED_CONFIG_FILE_NAME="mbed_config.h"
 | 
					    MBED_CONFIG_FILE_NAME="mbed_config.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,6 +56,10 @@ class GCC(mbedToolchain):
 | 
				
			||||||
            cpu = "cortex-m7"
 | 
					            cpu = "cortex-m7"
 | 
				
			||||||
        elif target.core == "Cortex-M7FD":
 | 
					        elif target.core == "Cortex-M7FD":
 | 
				
			||||||
            cpu = "cortex-m7"
 | 
					            cpu = "cortex-m7"
 | 
				
			||||||
 | 
					        elif target.core == "Cortex-M23-NS":
 | 
				
			||||||
 | 
					            cpu = "cortex-m23"
 | 
				
			||||||
 | 
					        elif target.core == "Cortex-M33-NS":
 | 
				
			||||||
 | 
					            cpu = "cortex-m33"
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            cpu = target.core.lower()
 | 
					            cpu = target.core.lower()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,6 +86,14 @@ class GCC(mbedToolchain):
 | 
				
			||||||
            self.cpu.append("-mfloat-abi=hard")
 | 
					            self.cpu.append("-mfloat-abi=hard")
 | 
				
			||||||
            self.cpu.append("-mno-unaligned-access")
 | 
					            self.cpu.append("-mno-unaligned-access")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if target.core.startswith("Cortex-M23"):
 | 
				
			||||||
 | 
					            self.cpu.append("-march=armv8-m.base")
 | 
				
			||||||
 | 
					        elif target.core.startswith("Cortex-M33"):
 | 
				
			||||||
 | 
					            self.cpu.append("-march=armv8-m.main")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if target.core == "Cortex-M23" or target.core == "Cortex-M33":
 | 
				
			||||||
 | 
					            self.cpu.append("-mcmse")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.flags["common"] += self.cpu
 | 
					        self.flags["common"] += self.cpu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        main_cc = join(tool_path, "arm-none-eabi-gcc")
 | 
					        main_cc = join(tool_path, "arm-none-eabi-gcc")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,29 +45,19 @@ class IAR(mbedToolchain):
 | 
				
			||||||
                               build_profile=build_profile)
 | 
					                               build_profile=build_profile)
 | 
				
			||||||
        if target.core == "Cortex-M7F" or target.core == "Cortex-M7FD":
 | 
					        if target.core == "Cortex-M7F" or target.core == "Cortex-M7FD":
 | 
				
			||||||
            cpuchoice = "Cortex-M7"
 | 
					            cpuchoice = "Cortex-M7"
 | 
				
			||||||
 | 
					        elif target.core.startswith("Cortex-M23"):
 | 
				
			||||||
 | 
					            cpuchoice = "8-M.baseline"
 | 
				
			||||||
 | 
					        elif target.core.startswith("Cortex-M33"):
 | 
				
			||||||
 | 
					            cpuchoice = "8-M.mainline"
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            cpuchoice = target.core
 | 
					            cpuchoice = target.core
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # flags_cmd are used only by our scripts, the project files have them already defined,
 | 
					        # flags_cmd are used only by our scripts, the project files have them already defined,
 | 
				
			||||||
        # using this flags results in the errors (duplication)
 | 
					        # using this flags results in the errors (duplication)
 | 
				
			||||||
        # asm accepts --cpu Core or --fpu FPU, not like c/c++ --cpu=Core
 | 
					        # asm accepts --cpu Core or --fpu FPU, not like c/c++ --cpu=Core
 | 
				
			||||||
        if target.core == "Cortex-M4F":
 | 
					        asm_flags_cmd = ["--cpu", cpuchoice]
 | 
				
			||||||
          asm_flags_cmd = [
 | 
					 | 
				
			||||||
              "--cpu", "Cortex-M4F"
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
          asm_flags_cmd = [
 | 
					 | 
				
			||||||
              "--cpu", cpuchoice
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
        # custom c flags
 | 
					        # custom c flags
 | 
				
			||||||
        if target.core == "Cortex-M4F":
 | 
					        c_flags_cmd = ["--cpu", cpuchoice]
 | 
				
			||||||
          c_flags_cmd = [
 | 
					 | 
				
			||||||
              "--cpu", "Cortex-M4F"
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
          c_flags_cmd = [
 | 
					 | 
				
			||||||
              "--cpu", cpuchoice
 | 
					 | 
				
			||||||
          ]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        c_flags_cmd.extend([
 | 
					        c_flags_cmd.extend([
 | 
				
			||||||
            "--thumb", "--dlib_config", "DLib_Config_Full.h"
 | 
					            "--thumb", "--dlib_config", "DLib_Config_Full.h"
 | 
				
			||||||
| 
						 | 
					@ -82,6 +72,8 @@ class IAR(mbedToolchain):
 | 
				
			||||||
        elif target.core == "Cortex-M7F":
 | 
					        elif target.core == "Cortex-M7F":
 | 
				
			||||||
            asm_flags_cmd += ["--fpu", "VFPv5_sp"]
 | 
					            asm_flags_cmd += ["--fpu", "VFPv5_sp"]
 | 
				
			||||||
            c_flags_cmd.append("--fpu=VFPv5_sp")
 | 
					            c_flags_cmd.append("--fpu=VFPv5_sp")
 | 
				
			||||||
 | 
					        elif target.core == "Cortex-M23" or target.core == "Cortex-M33":
 | 
				
			||||||
 | 
					            self.flags["asm"] += ["--cmse"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        IAR_BIN = join(TOOLCHAIN_PATHS['IAR'], "bin")
 | 
					        IAR_BIN = join(TOOLCHAIN_PATHS['IAR'], "bin")
 | 
				
			||||||
        main_cc = join(IAR_BIN, "iccarm")
 | 
					        main_cc = join(IAR_BIN, "iccarm")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue