Browse Source

Merged revision(s) 32075, 32077 from trunk:
* arm: Support for the kuser_memory_barrier kernel function for memory barriers.
........
* arm-android: Use kuser_memory_barrier by default.
........

git-svn-id: branches/fixes_3_0@33441 -

yury 9 years ago
parent
commit
60f32f6edd
2 changed files with 46 additions and 6 deletions
  1. 40 6
      rtl/arm/arm.inc
  2. 6 0
      rtl/arm/armdefines.inc

+ 40 - 6
rtl/arm/arm.inc

@@ -1168,12 +1168,29 @@ asm
   // assembler settings 
   // assembler settings 
 {$ifdef CPUARM_HAS_DMB}
 {$ifdef CPUARM_HAS_DMB}
   .long 0xf57ff05f  // dmb sy
   .long 0xf57ff05f  // dmb sy
-{$else}
+{$else CPUARM_HAS_DMB}
 {$ifdef CPUARMV6}
 {$ifdef CPUARMV6}
   mov r0, #0
   mov r0, #0
   .long 0xee070fba  // mcr 15, 0, r0, cr7, cr10, {5}
   .long 0xee070fba  // mcr 15, 0, r0, cr7, cr10, {5}
-{$endif}
-{$endif}
+{$else CPUARMV6}
+{$ifdef SYSTEM_HAS_KUSER_MEMORY_BARRIER}
+  stmfd r13!, {lr}
+  mvn   r0, #0x0000f000
+  sub   r0, r0, #0x5F
+{$ifdef CPUARM_HAS_BLX}
+  blx r0       // Call kuser_memory_barrier at address 0xffff0fa0
+{$else CPUARM_HAS_BLX}
+  mov lr, pc
+{$ifdef CPUARM_HAS_BX}
+  bx  r0
+{$else CPUARM_HAS_BX}
+  mov pc, r0
+{$endif CPUARM_HAS_BX}
+{$endif CPUARM_HAS_BLX}
+  ldmfd r13!, {pc}
+{$endif SYSTEM_HAS_KUSER_MEMORY_BARRIER}
+{$endif CPUARMV6}
+{$endif CPUARM_HAS_DMB}
 end;
 end;
 
 
 procedure ReadBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
 procedure ReadBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
@@ -1197,12 +1214,29 @@ asm
   // "dmb st" may be more optimal than the more generic "dmb sy"
   // "dmb st" may be more optimal than the more generic "dmb sy"
 {$ifdef CPUARM_HAS_DMB}
 {$ifdef CPUARM_HAS_DMB}
   .long 0xf57ff05e  // dmb st
   .long 0xf57ff05e  // dmb st
-{$else}
+{$else CPUARM_HAS_DMB}
 {$ifdef CPUARMV6}
 {$ifdef CPUARMV6}
   mov r0, #0
   mov r0, #0
   .long 0xee070fba  // mcr 15, 0, r0, cr7, cr10, {5} 
   .long 0xee070fba  // mcr 15, 0, r0, cr7, cr10, {5} 
-{$endif}
-{$endif}
+{$else CPUARMV6}
+{$ifdef SYSTEM_HAS_KUSER_MEMORY_BARRIER}
+  stmfd r13!, {lr}
+  mvn   r0, #0x0000f000
+  sub   r0, r0, #0x5F
+{$ifdef CPUARM_HAS_BLX}
+  blx r0       // Call kuser_memory_barrier at address 0xffff0fa0
+{$else CPUARM_HAS_BLX}
+  mov lr, pc
+{$ifdef CPUARM_HAS_BX}
+  bx  r0
+{$else CPUARM_HAS_BX}
+  mov pc, r0
+{$endif CPUARM_HAS_BX}
+{$endif CPUARM_HAS_BLX}
+  ldmfd r13!, {pc}
+{$endif SYSTEM_HAS_KUSER_MEMORY_BARRIER}
+{$endif CPUARMV6}
+{$endif CPUARM_HAS_DMB}
 end;
 end;
 
 
 {$endif}
 {$endif}

+ 6 - 0
rtl/arm/armdefines.inc

@@ -19,3 +19,9 @@
     {$define SYSTEM_HAS_KUSER_CMPXCHG} // system has kuser_cmpxchg method
     {$define SYSTEM_HAS_KUSER_CMPXCHG} // system has kuser_cmpxchg method
   {$endif}
   {$endif}
 {$endif}
 {$endif}
+
+{$if defined(ANDROID)}
+  {$if defined(CPUARMEL) or defined(CPUARMHF)}
+    {$define SYSTEM_HAS_KUSER_MEMORY_BARRIER} // system has kuser_memory_barrier method
+  {$endif}
+{$endif}