libraries/memoryaccess/hwbreak.cia
changeset 0 7f656887cf89
equal deleted inserted replaced
-1:000000000000 0:7f656887cf89
       
     1 // hwbreak.cia
       
     2 // 
       
     3 // Copyright (c) 2010 Accenture. All rights reserved.
       
     4 // This component and the accompanying materials are made available
       
     5 // under the terms of the "Eclipse Public License v1.0"
       
     6 // which accompanies this distribution, and is available
       
     7 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 // 
       
     9 // Initial Contributors:
       
    10 // Accenture - Initial contribution
       
    11 //
       
    12 #include <fshell/common.mmh>
       
    13 #include <u32std.h>
       
    14 
       
    15 #define READ_BCR(cond, n, resultreg) asm("MRC"#cond" p14,0,"#resultreg",c0,c"#n",5")
       
    16 #define WRITE_BCR(n, valuereg) asm("MCR p14,0,"#valuereg",c0,c"#n",5")
       
    17 #define WRITE_BVR(n, valuereg) asm("MCR p14,0,"#valuereg",c0,c"#n",4")
       
    18 
       
    19 #ifdef __GCCE__
       
    20 #ifdef __NAKED__
       
    21 #undef __NAKED__
       
    22 #endif
       
    23 #define __NAKED__ __attribute__((__naked__))
       
    24 #endif
       
    25 
       
    26 __NAKED__ void MCR_SetContextIdBrp(TInt /*aRegister*/, TUint /*aContextId*/)
       
    27 	{
       
    28 	asm("ldr r2, KContextIdBCR");
       
    29 	
       
    30 	// Use BVR 4 or 5 as appropriate
       
    31 	asm("cmp r0, #4");
       
    32 	asm("beq usefour");
       
    33 	
       
    34 	// otherwise use 5
       
    35 	WRITE_BVR(5, r1);
       
    36 	WRITE_BCR(5, r2);
       
    37 	asm("b contextdone");
       
    38 	
       
    39 	asm("usefour:");
       
    40 	WRITE_BVR(4, r1);
       
    41 	WRITE_BCR(4, r2);
       
    42 	
       
    43 	asm("contextdone:");
       
    44 	__JUMP(,lr);
       
    45 	
       
    46 	// These are according to "ARM 13.3.9. CP14 c80-c85, Breakpoint Control Registers (BCR)"
       
    47 	asm("KContextIdBCR:");
       
    48 	asm(".word 0x003001E7");
       
    49 	}
       
    50 
       
    51 __NAKED__ TUint MRC_ReadBcr(TInt /*aRegister*/)
       
    52 	{
       
    53 	// Switch on aRegister
       
    54 	asm("cmp r0, #0");
       
    55 	READ_BCR(eq, 0, r0);
       
    56 	__JUMP(eq, lr);
       
    57 
       
    58 	asm("cmp r0, #1");
       
    59 	READ_BCR(eq, 1, r0);
       
    60 	__JUMP(eq, lr);
       
    61 
       
    62 	asm("cmp r0, #2");
       
    63 	READ_BCR(eq, 2, r0);
       
    64 	__JUMP(eq, lr);
       
    65 
       
    66 	asm("cmp r0, #3");
       
    67 	READ_BCR(eq, 3, r0);
       
    68 	__JUMP(eq, lr);
       
    69 
       
    70 	asm("cmp r0, #4");
       
    71 	READ_BCR(eq, 4, r0);
       
    72 	__JUMP(eq, lr);
       
    73 
       
    74 	asm("cmp r0, #5");
       
    75 	READ_BCR(eq, 5, r0);
       
    76 	__JUMP(eq, lr);
       
    77 	
       
    78 	// Shouldn't get here, compiler shutter-upper
       
    79 #ifdef __GCCE__
       
    80 	return 0;
       
    81 #else
       
    82 	__JUMP(, lr);
       
    83 #endif
       
    84 	}
       
    85 	
       
    86 __NAKED__ void MCR_SetBreakpointPair(TInt /*aRegister*/, TUint /*aBvrValue*/, TUint /*aBcrValue*/ )
       
    87 	{
       
    88 	// Switch on aRegister
       
    89 	asm("cmp r0, #0");
       
    90 	asm("beq zero");
       
    91 	asm("cmp r0, #1");
       
    92 	asm("beq one");
       
    93 	asm("cmp r0, #2");
       
    94 	asm("beq two");
       
    95 	asm("cmp r0, #3");
       
    96 	asm("beq three");
       
    97 	
       
    98 	// If we reach here it's an error...
       
    99 	asm("b done");
       
   100 	
       
   101 	asm("zero:");
       
   102 	WRITE_BVR(0, r1);
       
   103 	WRITE_BCR(0, r2);
       
   104 	asm("b done");
       
   105 	
       
   106 	asm("one:");
       
   107 	WRITE_BVR(1, r1);
       
   108 	WRITE_BCR(1, r2);
       
   109 	asm("b done");
       
   110 	
       
   111 	asm("two:");
       
   112 	WRITE_BVR(2, r1);
       
   113 	WRITE_BCR(2, r2);
       
   114 	asm("b done");
       
   115 	
       
   116 	asm("three:");
       
   117 	WRITE_BVR(3, r1);
       
   118 	WRITE_BCR(4, r2);
       
   119 	asm("b done");
       
   120 	
       
   121 	asm("done:");
       
   122 	__JUMP(,lr);
       
   123 	}
       
   124 
       
   125 __NAKED__ TUint32 GetDscr()
       
   126 	{
       
   127 	asm("MRC p14,0,r0,c0,c1,0");
       
   128 	__JUMP(,lr);
       
   129 	}
       
   130 	
       
   131 __NAKED__ TUint32 GetDrar()
       
   132 	{
       
   133 	// Read Debug ROM Address Register
       
   134 	asm("MRC p14, 0, r0, c1, c0, 0");
       
   135 	__JUMP(,lr);
       
   136 	}
       
   137 
       
   138 __NAKED__ TUint32 GetDsar()
       
   139 	{
       
   140 	// Read Debug Self Address Offset Register
       
   141 	asm("MRC p14, 0, r0, c2, c0, 0");
       
   142 	__JUMP(,lr);
       
   143 	}
       
   144 
       
   145 __NAKED__ void MCR_SetDscr(TUint32 /*aVal*/)
       
   146 	{
       
   147 	asm("MCR p14,0,r0,c0,c1,0");
       
   148 	__JUMP(,lr);
       
   149 	}
       
   150 
       
   151 __NAKED__ TUint32 GetContextId()
       
   152 	{
       
   153 	asm("MRC p15, 0, r0, c13, c0, 1");
       
   154 	__JUMP(,lr);
       
   155 	}
       
   156 
       
   157 __NAKED__ void Dsb()
       
   158 	{
       
   159 	asm("Dsb:");
       
   160 	// Data Sync Barrier
       
   161 	// From the various definitions of ARM_DSBxx in cpudefs.h
       
   162 #if defined(FSHELL_ARM11XX_SUPPORT)
       
   163 	asm("mcr p15, 0, r0, c7, c10, 4 ")
       
   164 #elif defined(FSHELL_ARM_MEM_MAPPED_DEBUG)
       
   165 	asm("nop"); // Shut up complaints about branches to non-code symbols
       
   166 	asm(".word %a0" : : "i" ((TInt)(0xf57ff04f)));
       
   167 #endif
       
   168 	__JUMP(,lr);
       
   169 	}
       
   170 
       
   171 __NAKED__ void Isb()
       
   172 	{
       
   173 	asm("Isb:");
       
   174 	// Instruction Sync Barrier
       
   175 	// From the various definitions of ARM_ISBxx in cpudefs.h
       
   176 
       
   177 #if defined(FSHELL_ARM11XX_SUPPORT)
       
   178 	asm("mcr p15, 0, r0, c7, c5, 4 ")
       
   179 #elif defined(FSHELL_ARM_MEM_MAPPED_DEBUG)
       
   180 	asm("nop"); // Shut up complaints about branches to non-code symbols
       
   181 	asm(".word %a0" : : "i" ((TInt)(0xf57ff06f)));
       
   182 #endif
       
   183 	__JUMP(,lr);
       
   184 	}
       
   185 
       
   186 __NAKED__ void Imb()
       
   187 	{
       
   188 	// Instruction Memory Barrier
       
   189 	asm("push {r14}");
       
   190 	asm("bl Dsb");
       
   191 	asm("bl Isb");
       
   192 	asm("pop {r14}");
       
   193 	__JUMP(,lr);
       
   194 	}
       
   195 
       
   196 
       
   197 #if 0
       
   198 __NAKED__ void SetIvaBrp(TUint /*aAddress*/, TBool /*aUseContextIdFive*/, TInt /*aRegister*/ )
       
   199 	{
       
   200 	asm("cmp r1, #0");
       
   201 	// r3 gets the BCR value
       
   202 	asm("ldreq r3, KIvaBcrLinkedToFour");
       
   203 	asm("ldrne r3, KIvaBcrLinkedToFive");
       
   204 	asm("b DoSetIvaBrp"); // DoSetIvaBrp handles the return
       
   205 	
       
   206 	asm("KIvaBcrLinkedToFour:");
       
   207 	asm(".word 0x001401E5");
       
   208 	asm("KIvaBcrLinkedToFive:");
       
   209 	asm(".word 0x001501E5");
       
   210 	}	
       
   211 
       
   212 __NAKED__ void UnsetBrp(TInt /*aRegister*/)
       
   213 	{
       
   214 	asm("mov r2, r0");
       
   215 	asm("mov r1, #0");
       
   216 	asm("mov r0, #0");
       
   217 	asm("ldr r3, KIvaBcrDisabled");
       
   218 	asm("b DoSetIvaBrp");
       
   219 	
       
   220 	asm("KIvaBcrDisabled:");
       
   221 	asm(".word 0x001401E4");
       
   222 	}
       
   223 #endif