os/kernelhwsrv/kerneltest/e32test/nkernsa/arm/armutils.cia
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     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