فهرست منبع

remove little-endian assumption from arm atomic.h

this hidden endian dependency had left big endian arm badly broken.
Rich Felker 12 سال پیش
والد
کامیت
a3bdcd9376
1فایلهای تغییر یافته به همراه6 افزوده شده و 4 حذف شده
  1. 6 4
      arch/arm/atomic.h

+ 6 - 4
arch/arm/atomic.h

@@ -99,14 +99,16 @@ static inline void a_or(volatile int *p, int v)
 
 static inline void a_and_64(volatile uint64_t *p, uint64_t v)
 {
-	a_and((int *)p, v);
-	a_and((int *)p+1, v>>32);
+	union { uint64_t v; uint32_t r[2]; } u = { v };
+	a_and((int *)p, u.r[0]);
+	a_and((int *)p+1, u.r[1]);
 }
 
 static inline void a_or_64(volatile uint64_t *p, uint64_t v)
 {
-	a_or((int *)p, v);
-	a_or((int *)p+1, v>>32);
+	union { uint64_t v; uint32_t r[2]; } u = { v };
+	a_or((int *)p, u.r[0]);
+	a_or((int *)p+1, u.r[1]);
 }
 
 #endif