From b96be51a57f1c198b741b77c0f9def4481312c36 Mon Sep 17 00:00:00 2001 From: wangrong Date: Fri, 14 Jan 2022 16:29:28 +0800 Subject: [PATCH] fix trafficserver segmentation fault on arm64 on arm64, compression and decompression of pointers are inconsistent use top 12 bits to save version info and update pointer extraction method --- include/tscore/ink_queue.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/tscore/ink_queue.h b/include/tscore/ink_queue.h index 6d242cd9f15..fd215d713f7 100644 --- a/include/tscore/ink_queue.h +++ b/include/tscore/ink_queue.h @@ -136,7 +136,11 @@ union head_p { #define SET_FREELIST_POINTER_VERSION(_x, _p, _v) \ (_x).s.pointer = _p; \ (_x).s.version = _v -#elif defined(__x86_64__) || defined(__ia64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(__mips64) +#elif defined(__aarch64__) +#define FREELIST_POINTER(_x) ((void *)((((intptr_t)(_x).data) & 0x000FFFFFFFFFFFFFULL))) +#define FREELIST_VERSION(_x) (((intptr_t)(_x).data) >> 52) +#define SET_FREELIST_POINTER_VERSION(_x, _p, _v) (_x).data = (((intptr_t)(_p)) | (((_v)&0xFFFULL) << 52)) +#elif defined(__x86_64__) || defined(__ia64__) || defined(__powerpc64__) || defined(__mips64) #define FREELIST_POINTER(_x) \ ((void *)(((((intptr_t)(_x).data) << 16) >> 16) | (((~((((intptr_t)(_x).data) << 16 >> 63) - 1)) >> 48) << 48))) // sign extend #define FREELIST_VERSION(_x) (((intptr_t)(_x).data) >> 48)