Changeset 8ae37323 in rtems for cpukit/score
- Timestamp:
- 08/10/14 16:36:30 (8 years ago)
- Branches:
- 4.11, 5, master
- Children:
- 6cdc090
- Parents:
- 81329f9
- git-author:
- Sebastian Huber <sebastian.huber@…> (08/10/14 16:36:30)
- git-committer:
- Sebastian Huber <sebastian.huber@…> (08/12/14 17:08:19)
- Location:
- cpukit/score/cpu/arm
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
cpukit/score/cpu/arm/arm-context-validate.S
r81329f9 r8ae37323 1 1 /* 2 * Copyright (c) 2013 embedded brains GmbH. All rights reserved.2 * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved. 3 3 * 4 4 * embedded brains GmbH … … 30 30 #define FRAME_OFFSET_LR 32 31 31 32 #ifdef ARM_MULTILIB_VFP _D3232 #ifdef ARM_MULTILIB_VFP 33 33 #define FRAME_OFFSET_D8 40 34 34 #define FRAME_OFFSET_D9 48 … … 72 72 str r1, [sp, #FRAME_OFFSET_LR] 73 73 74 #ifdef ARM_MULTILIB_VFP _D3274 #ifdef ARM_MULTILIB_VFP 75 75 vstr d8, [sp, #FRAME_OFFSET_D8] 76 76 vstr d9, [sp, #FRAME_OFFSET_D9] … … 97 97 98 98 99 #ifdef ARM_MULTILIB_VFP _D3299 #ifdef ARM_MULTILIB_VFP 100 100 /* R3 contains the FPSCR */ 101 101 vmrs r3, FPSCR 102 102 movs r4, #0x001f 103 #ifdef ARM_MULTILIB_ARCH_V7M 104 movt r4, #0xf000 105 #else 103 106 movt r4, #0xf800 107 #endif 104 108 bic r3, r3, r4 105 109 and r4, r4, r0 … … 121 125 fill_register lr 122 126 123 #ifdef ARM_MULTILIB_VFP _D32127 #ifdef ARM_MULTILIB_VFP 124 128 .macro fill_vfp_register reg 125 129 add r1, r1, #1 … … 143 147 fill_vfp_register d14 144 148 fill_vfp_register d15 149 #ifdef ARM_MULTILIB_VFP_D32 145 150 fill_vfp_register d16 146 151 fill_vfp_register d17 … … 159 164 fill_vfp_register d30 160 165 fill_vfp_register d31 161 #endif 166 #endif /* ARM_MULTILIB_VFP_D32 */ 167 #endif /* ARM_MULTILIB_VFP */ 162 168 163 169 /* Check */ … … 175 181 mov r1, r0 176 182 177 #ifndef ARM_MULTILIB_VFP _D32183 #ifndef ARM_MULTILIB_VFP 178 184 check_register r3 179 185 #endif … … 190 196 check_register lr 191 197 192 #ifdef ARM_MULTILIB_VFP _D32198 #ifdef ARM_MULTILIB_VFP 193 199 b check_vfp 194 200 #endif … … 218 224 mov lr, r1 219 225 220 #ifdef ARM_MULTILIB_VFP _D32226 #ifdef ARM_MULTILIB_VFP 221 227 vldr d8, [sp, #FRAME_OFFSET_D8] 222 228 vldr d9, [sp, #FRAME_OFFSET_D9] … … 235 241 FUNCTION_END(_CPU_Context_validate) 236 242 237 #ifdef ARM_MULTILIB_VFP _D32243 #ifdef ARM_MULTILIB_VFP 238 244 check_vfp: 239 245 … … 271 277 check_vfp_register d14 272 278 check_vfp_register d15 279 #ifdef ARM_MULTILIB_VFP_D32 273 280 check_vfp_register d16 274 281 check_vfp_register d17 … … 287 294 check_vfp_register d30 288 295 check_vfp_register d31 296 #endif /* ARM_MULTILIB_VFP_D32 */ 289 297 290 298 /* Restore r4 and r5 */ … … 294 302 295 303 b check 296 297 #endif 304 #endif /* ARM_MULTILIB_VFP */ -
cpukit/score/cpu/arm/arm-context-volatile-clobber.S
r81329f9 r8ae37323 1 1 /* 2 * Copyright (c) 2013 embedded brains GmbH. All rights reserved.2 * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved. 3 3 * 4 4 * embedded brains GmbH … … 28 28 .endm 29 29 30 #ifdef ARM_MULTILIB_VFP _D3230 #ifdef ARM_MULTILIB_VFP 31 31 vmrs r1, FPSCR 32 32 movs r2, #0x001f … … 50 50 clobber_vfp_register d6 51 51 clobber_vfp_register d7 52 #ifdef ARM_MULTILIB_VFP_D32 52 53 clobber_vfp_register d16 53 54 clobber_vfp_register d17 … … 66 67 clobber_vfp_register d30 67 68 clobber_vfp_register d31 68 #endif 69 #endif /* ARM_MULTILIB_VFP_D32 */ 70 #endif /* ARM_MULTILIB_VFP */ 69 71 70 72 clobber_register r1 -
cpukit/score/cpu/arm/arm_exc_interrupt.S
r81329f9 r8ae37323 76 76 stmdb sp!, {SP_OF_INTERRUPTED_CONTEXT, lr} 77 77 78 #ifdef ARM_MULTILIB_VFP _D3278 #ifdef ARM_MULTILIB_VFP 79 79 /* Save VFP context */ 80 80 vmrs r0, FPSCR 81 81 vstmdb sp!, {d0-d7} 82 #ifdef ARM_MULTILIB_VFP_D32 82 83 vstmdb sp!, {d16-d31} 84 #endif 83 85 stmdb sp!, {r0, r1} 84 #endif 86 #endif /* ARM_MULTILIB_VFP */ 85 87 86 88 /* Get per-CPU control of current processor */ … … 167 169 SWITCH_FROM_THUMB_TO_ARM 168 170 169 #ifdef ARM_MULTILIB_VFP _D32171 #ifdef ARM_MULTILIB_VFP 170 172 /* Restore VFP context */ 171 173 ldmia sp!, {r0, r1} 174 #ifdef ARM_MULTILIB_VFP_D32 172 175 vldmia sp!, {d16-d31} 176 #endif 173 177 vldmia sp!, {d0-d7} 174 178 vmsr FPSCR, r0 175 #endif 179 #endif /* ARM_MULTILIB_VFP */ 176 180 177 181 /* Restore SP_OF_INTERRUPTED_CONTEXT register and link register */ -
cpukit/score/cpu/arm/armv4-exception-default.S
r81329f9 r8ae37323 119 119 mov r0, sp 120 120 121 #ifdef ARM_MULTILIB_VFP_D32 121 /* Clear VFP context pointer */ 122 add r3, sp, #ARM_EXCEPTION_FRAME_VFP_CONTEXT_OFFSET 123 mov r1, #0 124 str r1, [r3] 125 126 #ifdef ARM_MULTILIB_VFP 122 127 /* Ensure that the FPU is enabled */ 123 128 vmrs r1, FPEXC 124 129 tst r1, #(1 << 30) 125 beq fpu_save_done130 beq 1f 126 131 127 add r3, sp, #ARM_EXCEPTION_FRAME_VFP_CONTEXT_OFFSET132 /* Save VFP context */ 128 133 sub sp, #(ARM_VFP_CONTEXT_SIZE + 4) 129 134 add r4, sp, #4 … … 133 138 stmia r4!, {r1-r2} 134 139 vstmia r4!, {d0-d15} 140 #ifdef ARM_MULTILIB_VFP_D32 135 141 vstmia r4!, {d16-d31} 136 137 fpu_save_done: 142 #else 143 mov r1, #0 144 mov r2, #0 145 adds r3, r4, #128 146 2: 147 stmia r4!, {r1-r2} 148 cmp r4, r3 149 bne 2b 138 150 #endif 151 1: 152 #endif /* ARM_MULTILIB_VFP */ 139 153 140 154 /* Call high level handler */ -
cpukit/score/cpu/arm/armv7m-context-switch.c
r81329f9 r8ae37323 6 6 7 7 /* 8 * Copyright (c) 2011 Sebastian Huber. All rights reserved.8 * Copyright (c) 2011-2014 Sebastian Huber. All rights reserved. 9 9 * 10 10 * embedded brains GmbH … … 38 38 "ldr r3, [r2, %[isrpcpuoff]]\n" 39 39 "stm r0, {r4-r11, lr}\n" 40 #ifdef ARM_MULTILIB_VFP 41 "add r4, r0, %[d8off]\n" 42 "vstm r4, {d8-d15}\n" 43 #endif 40 44 "str sp, [r0, %[spctxoff]]\n" 41 45 "str r3, [r0, %[isrctxoff]]\n" 42 46 "ldr r3, [r1, %[isrctxoff]]\n" 43 47 "ldr sp, [r1, %[spctxoff]]\n" 48 #ifdef ARM_MULTILIB_VFP 49 "add r4, r1, %[d8off]\n" 50 "vldm r4, {d8-d15}\n" 51 #endif 44 52 "ldm r1, {r4-r11, lr}\n" 45 53 "str r3, [r2, %[isrpcpuoff]]\n" … … 48 56 : [spctxoff] "J" (offsetof(Context_Control, register_sp)), 49 57 [isrctxoff] "J" (offsetof(Context_Control, isr_nest_level)), 50 [isrpcpuoff] "J" (offsetof(Per_CPU_Control, isr_nest_level)) 58 [isrpcpuoff] "J" (offsetof(Per_CPU_Control, isr_nest_level)), 59 [d8off] "J" (ARM_CONTEXT_CONTROL_D8_OFFSET) 51 60 ); 52 61 } -
cpukit/score/cpu/arm/armv7m-exception-default.c
r81329f9 r8ae37323 39 39 "mrs r1, ipsr\n" 40 40 "str r1, [sp, %[cpuvecoff]]\n" 41 42 /* Argument for high level handler */ 41 43 "mov r0, sp\n" 44 45 /* Clear VFP context pointer */ 46 "add r3, sp, %[cpuvfpoff]\n" 47 "mov r1, #0\n" 48 "str r1, [r3]\n" 49 50 #ifdef ARM_MULTILIB_VFP 51 /* Ensure that the FPU is enabled */ 52 "ldr r4, =%[cpacr]\n" 53 "tst r4, #(0xf << 20)\n" 54 "bne 1f\n" 55 56 /* Save VFP context */ 57 "sub sp, %[vfpsz]\n" 58 "add r4, sp, #4\n" 59 "bic r4, r4, #7\n" 60 "str r4, [r3]\n" 61 "vmrs r2, FPSCR\n" 62 "stmia r4!, {r1-r2}\n" 63 "vstmia r4!, {d0-d15}\n" 64 "mov r1, #0\n" 65 "mov r2, #0\n" 66 "adds r3, r4, #128\n" 67 "2:\n" 68 "stmia r4!, {r1-r2}\n" 69 "cmp r4, r3\n" 70 "bne 2b\n" 71 "1:\n" 72 #endif 73 42 74 "b _ARM_Exception_default\n" 43 75 : 44 76 : [cpufsz] "i" (sizeof(CPU_Exception_frame)), 45 77 [v7mfsz] "i" (sizeof(ARMV7M_Exception_frame)), 46 [cpuspoff] "J" (offsetof(CPU_Exception_frame, register_sp)),47 78 [cpulroff] "i" (offsetof(CPU_Exception_frame, register_lr)), 48 79 [v7mlroff] "i" (offsetof(ARMV7M_Exception_frame, register_lr)), 49 [cpuvecoff] "J" (offsetof(CPU_Exception_frame, vector)) 80 [cpuvecoff] "J" (offsetof(CPU_Exception_frame, vector)), 81 [cpuvfpoff] "i" (ARM_EXCEPTION_FRAME_VFP_CONTEXT_OFFSET), 82 [cpacr] "i" (ARMV7M_CPACR), 83 [vfpsz] "i" (ARM_VFP_CONTEXT_SIZE) 50 84 ); 51 85 } -
cpukit/score/cpu/arm/armv7m-isr-dispatch.c
r81329f9 r8ae37323 6 6 7 7 /* 8 * Copyright (c) 2011 Sebastian Huber. All rights reserved.8 * Copyright (c) 2011-2014 Sebastian Huber. All rights reserved. 9 9 * 10 10 * embedded brains GmbH … … 38 38 } 39 39 40 static void _ARMV7M_Trigger_lazy_floating_point_context_save( void ) 41 { 42 #ifdef ARM_MULTILIB_VFP 43 __asm__ volatile ( 44 "vmov.f32 s0, s0\n" 45 ); 46 #endif 47 } 48 40 49 void _ARMV7M_Pendable_service_call( void ) 41 50 { 51 ARMV7M_Exception_frame *ef; 52 42 53 _ISR_Nest_level = 1; 54 43 55 _ARMV7M_SCB->icsr = ARMV7M_SCB_ICSR_PENDSVCLR; 44 ARMV7M_Exception_frame *ef = (ARMV7M_Exception_frame *) _ARMV7M_Get_PSP(); 56 _ARMV7M_Trigger_lazy_floating_point_context_save(); 57 58 ef = (ARMV7M_Exception_frame *) _ARMV7M_Get_PSP(); 45 59 --ef; 46 _ARMV7M_Set_PSP( (uint32_t) ef);60 _ARMV7M_Set_PSP( (uint32_t) ef ); 47 61 48 62 /* … … 58 72 void _ARMV7M_Supervisor_call( void ) 59 73 { 60 ARMV7M_Exception_frame *ef = (ARMV7M_Exception_frame *) _ARMV7M_Get_PSP(); 74 ARMV7M_Exception_frame *ef; 75 76 _ARMV7M_Trigger_lazy_floating_point_context_save(); 77 78 ef = (ARMV7M_Exception_frame *) _ARMV7M_Get_PSP(); 61 79 ++ef; 62 _ARMV7M_Set_PSP((uint32_t) ef); 80 _ARMV7M_Set_PSP( (uint32_t) ef ); 81 63 82 _ISR_Nest_level = 0; 64 83 RTEMS_COMPILER_MEMORY_BARRIER(); 84 65 85 if ( _Thread_Dispatch_necessary ) { 66 86 _ARMV7M_Pendable_service_call(); -
cpukit/score/cpu/arm/cpu.c
r81329f9 r8ae37323 36 36 #include <rtems/score/cpu.h> 37 37 38 #ifdef ARM_MULTILIB_VFP _D3238 #ifdef ARM_MULTILIB_VFP 39 39 RTEMS_STATIC_ASSERT( 40 40 offsetof( Context_Control, register_d8 ) == ARM_CONTEXT_CONTROL_D8_OFFSET, -
cpukit/score/cpu/arm/cpu_asm.S
r81329f9 r8ae37323 59 59 stmia r0, {r2, r4, r5, r6, r7, r8, r9, r10, r11, r13, r14} 60 60 61 #ifdef ARM_MULTILIB_VFP _D3261 #ifdef ARM_MULTILIB_VFP 62 62 add r3, r0, #ARM_CONTEXT_CONTROL_D8_OFFSET 63 63 vstm r3, {d8-d15} … … 102 102 #endif 103 103 104 #ifdef ARM_MULTILIB_VFP _D32104 #ifdef ARM_MULTILIB_VFP 105 105 add r3, r1, #ARM_CONTEXT_CONTROL_D8_OFFSET 106 106 vldm r3, {d8-d15} -
cpukit/score/cpu/arm/rtems/score/arm.h
r81329f9 r8ae37323 51 51 #endif 52 52 53 #if defined(__ARM_NEON__) 54 #define ARM_MULTILIB_VFP_D32 55 #elif !defined(__SOFTFP__) 56 #error "FPU support not implemented" 53 #if !defined(__SOFTFP__) 54 #if defined(__ARM_NEON__) 55 #define ARM_MULTILIB_VFP_D32 56 #elif defined(__VFP_FP__) 57 #define ARM_MULTILIB_VFP_D16 58 #else 59 #error "FPU support not implemented" 60 #endif 61 #endif 62 63 #if defined(ARM_MULTILIB_VFP_D16) \ 64 || defined(ARM_MULTILIB_VFP_D32) 65 #define ARM_MULTILIB_VFP 57 66 #endif 58 67 -
cpukit/score/cpu/arm/rtems/score/armv7m.h
r81329f9 r8ae37323 6 6 7 7 /* 8 * Copyright (c) 2011 Sebastian Huber. All rights reserved.8 * Copyright (c) 2011-2014 Sebastian Huber. All rights reserved. 9 9 * 10 10 * embedded brains GmbH … … 30 30 #ifdef ARM_MULTILIB_ARCH_V7M 31 31 32 /* Coprocessor Access Control Register, CPACR */ 33 #define ARMV7M_CPACR 0xe000ed88 34 35 #ifndef ASM 36 32 37 typedef struct { 33 38 uint32_t reserved_0; … … 48 53 void *register_pc; 49 54 uint32_t register_xpsr; 55 #ifdef ARM_MULTILIB_VFP 56 uint32_t register_s0; 57 uint32_t register_s1; 58 uint32_t register_s2; 59 uint32_t register_s3; 60 uint32_t register_s4; 61 uint32_t register_s5; 62 uint32_t register_s6; 63 uint32_t register_s7; 64 uint32_t register_s8; 65 uint32_t register_s9; 66 uint32_t register_s10; 67 uint32_t register_s11; 68 uint32_t register_s12; 69 uint32_t register_s13; 70 uint32_t register_s14; 71 uint32_t register_s15; 72 uint32_t register_fpscr; 73 uint32_t reserved; 74 #endif 50 75 } ARMV7M_Exception_frame; 51 76 … … 98 123 uint32_t bfar; 99 124 uint32_t afsr; 125 uint32_t reserved_e000ed40[18]; 126 uint32_t cpacr; 127 uint32_t reserved_e000ed8c[106]; 128 uint32_t fpccr; 129 uint32_t fpcar; 130 uint32_t fpdscr; 131 uint32_t mvfr0; 132 uint32_t mvfr1; 100 133 } ARMV7M_SCB; 101 134 … … 505 538 void _ARMV7M_Supervisor_call( void ); 506 539 540 #endif /* ASM */ 541 507 542 #endif /* ARM_MULTILIB_ARCH_V7M */ 508 543 -
cpukit/score/cpu/arm/rtems/score/cpu.h
r81329f9 r8ae37323 9 9 * processor. 10 10 * 11 * Copyright (c) 2009-201 3embedded brains GmbH.11 * Copyright (c) 2009-2014 embedded brains GmbH. 12 12 * 13 13 * Copyright (c) 2007 Ray Xu <Rayx.cn@gmail.com> … … 213 213 #endif 214 214 215 #ifdef ARM_MULTILIB_VFP _D32215 #ifdef ARM_MULTILIB_VFP 216 216 #define ARM_CONTEXT_CONTROL_D8_OFFSET 48 217 217 #endif 218 218 219 219 #ifdef RTEMS_SMP 220 #ifdef ARM_MULTILIB_VFP _D32220 #ifdef ARM_MULTILIB_VFP 221 221 #define ARM_CONTEXT_CONTROL_IS_EXECUTING_OFFSET 112 222 222 #else … … 279 279 uint32_t thread_id; 280 280 #endif 281 #ifdef ARM_MULTILIB_VFP _D32281 #ifdef ARM_MULTILIB_VFP 282 282 uint64_t register_d8; 283 283 uint64_t register_d9;
Note: See TracChangeset
for help on using the changeset viewer.