kerneltest/e32test/nkernsa/arm/armutils.cia
changeset 9 96e5fb8b040d
child 43 c1f20ce4abcf
equal deleted inserted replaced
-1:000000000000 9:96e5fb8b040d
       
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // e32test\nkernsa\arm\armutils.cia
       
    15 // 
       
    16 //
       
    17 
       
    18 #include <arm.h>
       
    19 #include <nktest/nkutils.h>
       
    20 #include <e32cia.h>
       
    21 
       
    22 #ifdef __SMP__
       
    23 #include <arm_tmr.h>
       
    24 #endif
       
    25 
       
    26 extern "C" {
       
    27 
       
    28 void thread_request_signal(NThread* aThread);
       
    29 
       
    30 extern TUint64 fcf;
       
    31 extern TUint32 nfcf;
       
    32 extern TUint32 nfcfs;
       
    33 
       
    34 __NAKED__ void __cpu_idle()
       
    35 	{
       
    36 	ARM_WFI;
       
    37 	__JUMP(,lr);
       
    38 	}
       
    39 
       
    40 __NAKED__ void __cpu_yield()
       
    41 	{
       
    42 	ARM_YIELD;
       
    43 	__JUMP(,lr);
       
    44 	}
       
    45 
       
    46 __NAKED__ TLinAddr __stack_pointer()
       
    47 	{
       
    48 	asm("mov	r0, sp ");
       
    49 	__JUMP(,lr);
       
    50 	}
       
    51 
       
    52 __NAKED__ TUint32 __cpu_status_reg()
       
    53 	{
       
    54 	asm("mrs	r0, cpsr ");
       
    55 	__JUMP(,lr);
       
    56 	}
       
    57 
       
    58 __NAKED__ TUint32 __cpu_id()
       
    59 	{
       
    60 	asm("mrc	p15, 0, r0, c0, c0, 5 ");
       
    61 	__JUMP(,lr);
       
    62 	}
       
    63 
       
    64 __NAKED__ TUint32 __trace_cpu_num()
       
    65 	{
       
    66 	asm("mrc	p15, 0, r0, c0, c0, 5 ");
       
    67 	asm("and	r0, r0, #15 ");
       
    68 	__JUMP(,lr);
       
    69 	}
       
    70 
       
    71 __NAKED__ TUint32 __get_rwno_tid()
       
    72 	{
       
    73 	GET_RWNO_TID(,r0);
       
    74 	__JUMP(,lr);
       
    75 	}
       
    76 
       
    77 __NAKED__ TUint32 __get_static_data()
       
    78 	{
       
    79 	asm("ldr	r0, 1f ");
       
    80 	asm("ldr	r0, [r0] ");
       
    81 	__JUMP(,lr);
       
    82 	asm("1:		");
       
    83 	asm(".word	%a0" : : "i" ((TInt)&TheScheduler));
       
    84 	}
       
    85 
       
    86 #ifdef __SMP__
       
    87 __NAKED__ TUint32 __get_local_timer_address()
       
    88 	{
       
    89 	GET_RWNO_TID(,r0);
       
    90 	asm("nop ");
       
    91 	asm("nop ");
       
    92 	asm("nop ");
       
    93 	asm("ldr	r0, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,i_LocalTimerAddr));
       
    94 	asm("nop ");
       
    95 	asm("nop ");
       
    96 	asm("nop ");
       
    97 	__JUMP(,lr);
       
    98 	}
       
    99 
       
   100 __NAKED__ TUint32 __get_local_timer_count()
       
   101 	{
       
   102 	GET_RWNO_TID(,r0);
       
   103 	asm("nop ");
       
   104 	asm("nop ");
       
   105 	asm("nop ");
       
   106 	asm("ldr	r1, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,i_LocalTimerAddr));
       
   107 	asm("nop ");
       
   108 	asm("nop ");
       
   109 	asm("nop ");
       
   110 	asm("ldr	r0, [r1, #%a0]" : : "i" _FOFF(ArmLocalTimer,iTimerCount));
       
   111 	asm("cmp	r0, #0 ");
       
   112 	__JUMP(,lr);
       
   113 	}
       
   114 
       
   115 __NAKED__ TUint32 __set_local_timer_count()
       
   116 	{
       
   117 	GET_RWNO_TID(,r0);
       
   118 	asm("nop ");
       
   119 	asm("nop ");
       
   120 	asm("nop ");
       
   121 	asm("ldr	r1, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,i_LocalTimerAddr));
       
   122 	asm("nop ");
       
   123 	asm("nop ");
       
   124 	asm("nop ");
       
   125 	asm("ldr	r0, [r1, #%a0]" : : "i" _FOFF(ArmLocalTimer,iTimerCount));
       
   126 	asm("str	r0, [r1, #%a0]" : : "i" _FOFF(ArmLocalTimer,iTimerCount));
       
   127 	__JUMP(,lr);
       
   128 	}
       
   129 
       
   130 __NAKED__ TUint32 __swp_local_timer_count()
       
   131 	{
       
   132 	GET_RWNO_TID(,r0);
       
   133 	asm("nop ");
       
   134 	asm("nop ");
       
   135 	asm("nop ");
       
   136 	asm("ldr	r1, [r0, #%a0]" : : "i" _FOFF(TSubScheduler,i_LocalTimerAddr));
       
   137 	asm("nop ");
       
   138 	asm("nop ");
       
   139 	asm("nop ");
       
   140 	asm("ldr	r0, [r1, #%a0]!" : : "i" _FOFF(ArmLocalTimer,iTimerCount));
       
   141 	asm("swp	r0, r0, [r1] ");
       
   142 	__JUMP(,lr);
       
   143 	}
       
   144 #endif
       
   145 
       
   146 TUint32 __NAKED__ norm_fast_counter()
       
   147 	{
       
   148 	asm("str	lr, [sp, #-4]! ");
       
   149 	asm("bl "	CSM_CFUNC(fast_counter));
       
   150 	asm("ldr	r2, __nfcfs ");
       
   151 	asm("ldr	r2, [r2] ");
       
   152 	asm("rsb	r3, r2, #32 ");
       
   153 	asm("mov	r0, r0, lsr r2 ");
       
   154 	asm("orr	r0, r0, r1, lsl r3 ");
       
   155 	__POPRET("");
       
   156 
       
   157 	asm("__nfcfs: ");
       
   158 	asm(".word nfcfs ");
       
   159 	}
       
   160 
       
   161 __NAKED__ TUint32 set_bit0_if_nonnull(TUint32&)
       
   162 	{
       
   163 	__DATA_MEMORY_BARRIER_Z__(r12);
       
   164 	asm("mov	r3, r0 ");
       
   165 	asm("1: ");
       
   166 	LDREX(0,3);
       
   167 	asm("movs	r1, r0 ");
       
   168 	asm("beq	2f ");
       
   169 	asm("orr	r1, r1, #1 ");
       
   170 	STREX(12,1,3);
       
   171 	asm("cmp	r12, #0 ");
       
   172 	asm("bne	1b ");
       
   173 	asm("2: ");
       
   174 	__DATA_MEMORY_BARRIER_Z__(r12);
       
   175 	__JUMP(,lr);
       
   176 	}
       
   177 
       
   178 __NAKED__ void flip_bit0(TUint32&)
       
   179 	{
       
   180 	__DATA_MEMORY_BARRIER_Z__(r12);
       
   181 	asm("1: ");
       
   182 	LDREX(1,0);
       
   183 	asm("eor	r1, r1, #1 ");
       
   184 	STREX(12,1,0);
       
   185 	asm("cmp	r12, #0 ");
       
   186 	asm("bne	1b ");
       
   187 	__DATA_MEMORY_BARRIER__(r12);
       
   188 	__JUMP(,lr);
       
   189 	}
       
   190 
       
   191 __NAKED__ TUint32 swap_out_if_bit0_clear(TUint32&)
       
   192 	{
       
   193 	__DATA_MEMORY_BARRIER_Z__(r12);
       
   194 	asm("mov	r3, r0 ");
       
   195 	asm("1: ");
       
   196 	LDREX(0,3);
       
   197 	asm("tst	r0, #1 ");
       
   198 	asm("bne	2f ");
       
   199 	STREX(2,12,3);
       
   200 	asm("cmp	r2, #0 ");
       
   201 	asm("bne	1b ");
       
   202 	asm("2: ");
       
   203 	__DATA_MEMORY_BARRIER_Z__(r12);
       
   204 	__JUMP(,lr);
       
   205 	}
       
   206 
       
   207 __NAKED__ TUint32 __cpsr()
       
   208 	{
       
   209 	asm("mrs	r0, cpsr ");
       
   210 	__JUMP(,lr);
       
   211 	}
       
   212 }
       
   213 
       
   214 __NAKED__ void RequestComplete(NThread* /*aThread*/, NRequestStatus*& /*aStatus*/, TInt /*aValue*/)
       
   215 	{
       
   216 	__DATA_MEMORY_BARRIER_Z__(r12);
       
   217 	asm("str	lr, [sp, #-4]! ");
       
   218 	asm("1: ");
       
   219 	LDREX(3,1);
       
   220 	STREX(14,12,1);
       
   221 	asm("cmp	r14, #0 ");
       
   222 	asm("bne	1b ");
       
   223 	asm("cmp	r3, #0 ");
       
   224 	asm("ldr	lr, [sp], #4 ");
       
   225 	asm("strne	r2, [r3] ");
       
   226 	asm("bne "	CSM_CFUNC(thread_request_signal));
       
   227 	__JUMP(,lr);
       
   228 	}
       
   229 
       
   230