Package: trafficserver
Version: 4.1.2-1
Tags: sid patch
Severity: important
Justification: FTBFS
User: debian-mips-dev-disc...@lists.alioth.debian.org
Usertags: mips-patch


While trying to build trafficserver on mips architecture,
build fails with an error:

> In file included from ../../lib/ts/libts.h:64:0,
>                  from P_EventSystem.h:34,
>                  from EventSystem.cc:31:
> ../../lib/ts/ink_queue.h:144:2: error: #error "unsupported processor"
>  #error "unsupported processor"

After some extensions,
I was able to build trafficserver successfully.
Also, all tests passed.
Mips related changes are included in add-mips-support.patch.


Beside these changes,
for trafficserver version 4.1.2-1 it is needed to
apply patch:
0001-TS-2454-Fix-undefined-reference-to-__sync_fetch_and_.patch
from:
https://issues.apache.org/jira/browse/TS-2454.

These changes are needed to avoid an error:
> ../../lib/ts/.libs/libtsutil.so: undefined reference to 
> `__sync_fetch_and_sub_8'

This patch is included in newer 4.2.0 trafficserver version.



Could you please consider including these changes
in order to support trafficserver for
MIPS platform?


Thanks,
Dejan
diff -uNr trafficserver-4.1.2/lib/ts/ink_atomic.h trafficserver-4.1.2.mips/lib/ts/ink_atomic.h
--- trafficserver-4.1.2.orig/lib/ts/ink_atomic.h	2013-12-05 22:07:48.000000000 +0000
+++ trafficserver-4.1.2/lib/ts/ink_atomic.h	2014-02-12 16:10:38.000000000 +0000
@@ -168,7 +170,7 @@
 }
 
 // Special hacks for ARM 32-bit
-#if defined(__arm__) && (SIZEOF_VOIDP == 4)
+#if (defined(__arm__)|| defined(__mips__))  && (SIZEOF_VOIDP == 4)
 extern ProcessMutex __global_death;
 
 template<>
diff -uNr trafficserver-4.1.2/lib/ts/ink_queue.h trafficserver-4.1.2.mips/lib/ts/ink_queue.h
--- trafficserver-4.1.2.orig/lib/ts/ink_queue.h	2013-12-05 22:07:48.000000000 +0000
+++ trafficserver-4.1.2/lib/ts/ink_queue.h	2014-02-12 14:09:35.000000000 +0000
@@ -85,7 +85,7 @@
   // lock, use INK_QUEUE_LD to read safely.
   typedef union
   {
-#if (defined(__i386__) || defined(__arm__)) && (SIZEOF_VOIDP == 4)
+#if (defined(__i386__) || defined(__arm__) || defined(__mips__)) && (SIZEOF_VOIDP == 4)
     struct
     {
       void *pointer;
@@ -124,7 +124,7 @@
 #define TO_PTR(_x) ((void*)(_x))
 #endif
 
-#if (defined(__i386__) || defined(__arm__)) && (SIZEOF_VOIDP == 4)
+#if (defined(__i386__) || defined(__arm__) || defined(__mips__)) && (SIZEOF_VOIDP == 4)
 #define FREELIST_POINTER(_x) (_x).s.pointer
 #define FREELIST_VERSION(_x) (_x).s.version
 #define SET_FREELIST_POINTER_VERSION(_x,_p,_v) \
diff -uNr trafficserver-4.1.2/lib/ts/ink_queue_utils.cc trafficserver-4.1.2.mips/lib/ts/ink_queue_utils.cc
--- trafficserver-4.1.2.orig/lib/ts/ink_queue_utils.cc	2013-12-05 22:07:48.000000000 +0000
+++ trafficserver-4.1.2/lib/ts/ink_queue_utils.cc	2014-02-28 15:11:43.000000000 +0000
@@ -68,7 +68,7 @@
 void
 ink_queue_load_64(void *dst, void *src)
 {
-#if (defined(__i386__) || defined(__arm__)) && (SIZEOF_VOIDP == 4)
+#if (defined(__i386__) || defined(__arm__) || defined(__mips__)) && (SIZEOF_VOIDP == 4)
   volatile int32_t src_version = (*(head_p *) src).s.version;
   void *src_pointer = (*(head_p *) src).s.pointer;
 
diff -uNr trafficserver-4.1.2/plugins/experimental/geoip_acl/lulu.h trafficserver-4.1.2.mips/plugins/experimental/geoip_acl/lulu.h
--- trafficserver-4.1.2.orig/plugins/experimental/geoip_acl/lulu.h	2013-12-05 22:07:48.000000000 +0000
+++ trafficserver-4.1.2/plugins/experimental/geoip_acl/lulu.h	2014-02-12 16:35:36.000000000 +0000
@@ -42,6 +42,10 @@
 #define mb()  __asm__ __volatile__ ( "dmb" : : : "memory")
 #define rmb() __asm__ __volatile__ ( "dmb" : : : "memory")
 #define wmb() __asm__ __volatile__ ( "" : : : "memory")
+#elif defined(__mips__)
+#define mb()  __asm__ __volatile__ ( "sync" : : : "memory")
+#define rmb() __asm__ __volatile__ ( "sync" : : : "memory")
+#define wmb() __asm__ __volatile__ ( "" : : : "memory")
 #else
 #error "Define barriers"
 #endif
diff -uNr trafficserver-4.1.2/plugins/header_filter/lulu.h trafficserver-4.1.2.mips/plugins/header_filter/lulu.h
--- trafficserver-4.1.2.orig/plugins/header_filter/lulu.h	2013-12-05 22:07:48.000000000 +0000
+++ trafficserver-4.1.2/plugins/header_filter/lulu.h	2014-02-12 16:30:46.000000000 +0000
@@ -41,6 +41,10 @@
 #define mb()  __asm__ __volatile__ ( "dmb" : : : "memory")
 #define rmb() __asm__ __volatile__ ( "dmb" : : : "memory")
 #define wmb() __asm__ __volatile__ ( "" : : : "memory")
+#elif defined(__mips__)
+#define mb()  __asm__ __volatile__ ( "sync" : : : "memory")
+#define rmb() __asm__ __volatile__ ( "sync" : : : "memory")
+#define wmb() __asm__ __volatile__ ( "" : : : "memory")
 #elif defined(__arm__)
 #else
 #error "Define barriers"
diff -uNr trafficserver-4.1.2/plugins/header_rewrite/lulu.h trafficserver-4.1.2.mips/plugins/header_rewrite/lulu.h
--- trafficserver-4.1.2.orig/plugins/header_rewrite/lulu.h	2013-12-05 22:07:48.000000000 +0000
+++ trafficserver-4.1.2/plugins/header_rewrite/lulu.h	2014-02-12 16:31:46.000000000 +0000
@@ -39,6 +39,10 @@
 #define mb()  __asm__ __volatile__ ( "dmb" : : : "memory")
 #define rmb() __asm__ __volatile__ ( "dmb" : : : "memory")
 #define wmb() __asm__ __volatile__ ( "" : : : "memory")
+#elif defined(__mips__)
+#define mb()  __asm__ __volatile__ ( "sync" : : : "memory")
+#define rmb() __asm__ __volatile__ ( "sync" : : : "memory")
+#define wmb() __asm__ __volatile__ ( "" : : : "memory")
 #else
 #error "Define barriers"
 #endif
From 71c0cfdd7e8da6d792e1ac5771eff6e31561659f Mon Sep 17 00:00:00 2001
From: Yunkai Zhang <yun...@redstar.celldoft.com>
Date: Sat, 28 Dec 2013 19:59:33 +0800
Subject: [PATCH] TS-2454: Fix undefined reference to `__sync_fetch_and_sub_8'
 on ARM 32bit system

Signed-off-by: Yunkai Zhang <yun...@redstar.celldoft.com>
Signed-off-by: Yunkai Zhang <qiushu....@taobao.com>
---
 lib/ts/ink_atomic.h | 39 ++++++++++++++++++++++++++++++++-------
 1 file changed, 32 insertions(+), 7 deletions(-)

diff --git a/lib/ts/ink_atomic.h b/lib/ts/ink_atomic.h
index 51d87c0..fc8a9f3 100644
--- a/lib/ts/ink_atomic.h
+++ b/lib/ts/ink_atomic.h
@@ -50,6 +50,7 @@ typedef volatile int8_t vint8;
 typedef volatile int16_t vint16;
 typedef volatile int32_t vint32;
 typedef volatile int64_t vint64;
+typedef volatile uint64_t vuint64;
 typedef volatile long vlong;
 typedef volatile void *vvoidp;
 
@@ -57,6 +58,7 @@ typedef vint8 *pvint8;
 typedef vint16 *pvint16;
 typedef vint32 *pvint32;
 typedef vint64 *pvint64;
+typedef vuint64 *pvuint64;
 typedef vlong *pvlong;
 typedef vvoidp *pvvoidp;
 
@@ -194,9 +196,8 @@ ink_atomic_cas<int64_t>(pvint64 mem, int64_t old, int64_t new_value) {
   return 0;
 }
 
-template<>
-inline int64_t
-ink_atomic_increment<int64_t>(pvint64 mem, int64_t value) {
+template<typename Amount> static inline int64_t
+ink_atomic_increment(pvint64 mem, Amount value) {
   int64_t curr;
   ink_mutex_acquire(&__global_death);
   curr = *mem;
@@ -205,10 +206,34 @@ ink_atomic_increment<int64_t>(pvint64 mem, int64_t value) {
   return curr;
 }
 
-template<>
-inline int64_t
-ink_atomic_increment<int64_t>(pvint64 mem, int value) {
-  return ink_atomic_increment(mem, static_cast<int64_t>(value));
+template<typename Amount> static inline int64_t
+ink_atomic_decrement(pvint64 mem, Amount value) {
+  int64_t curr;
+  ink_mutex_acquire(&__global_death);
+  curr = *mem;
+  *mem = curr - value;
+  ink_mutex_release(&__global_death);
+  return curr;
+}
+
+template<typename Amount> static inline uint64_t
+ink_atomic_increment(pvuint64 mem, Amount value) {
+  uint64_t curr;
+  ink_mutex_acquire(&__global_death);
+  curr = *mem;
+  *mem = curr + value;
+  ink_mutex_release(&__global_death);
+  return curr;
+}
+
+template<typename Amount> static inline uint64_t
+ink_atomic_decrement(pvuint64 mem, Amount value) {
+  uint64_t curr;
+  ink_mutex_acquire(&__global_death);
+  curr = *mem;
+  *mem = curr - value;
+  ink_mutex_release(&__global_death);
+  return curr;
 }
 
 #endif /* Special hacks for ARM 32-bit */
-- 
1.8.4.2

Reply via email to