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