Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add aarch64 support #104

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile.base
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ GCC_VER_INT=$(shell printf "%d%04d%04d" $(GCC_VER_SPC))
# compare to minimum version 4.8.0
GCC_GTE_48=$(shell expr $(GCC_VER_INT) \>= 400080000)

PEDANTIC = -Wall -pedantic -Wno-variadic-macros -Wno-long-long -Wno-overlength-strings
PEDANTIC = -Wall -pedantic -Wno-variadic-macros -Wno-long-long -Wno-overlength-strings -Wno-error=deprecated-declarations -Wno-error=stringop-truncation -Wno-error=format-truncation -Wno-error=stringop-overflow

# For clang, we need to ignore c99 extensions warnings it seems ...
ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang version"), 1)
Expand Down
8 changes: 6 additions & 2 deletions include/mdbm_log.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
extern "C" {
#endif

typedef struct va_list_s {
va_list ap;
} va_list_t;


/*============================================================*/
/* Core logging functions. */
Expand All @@ -23,14 +27,14 @@ extern "C" {
int mdbm_log_at (const char* file, int line, int level, const char* format, ...)
__attribute__ ((format (printf,4,5)))
__attribute__ ((visibility ("default")));
int mdbm_log_vlog_at (const char* file, int line, int level, const char* format, va_list args)
int mdbm_log_vlog_at (const char* file, int line, int level, const char* format, va_list_t* args)
__attribute__ ((format (printf,4,0)))
__attribute__ ((visibility ("default")));

int mdbm_logerror_at (const char* file, int line, int level, int error, const char* format, ...)
__attribute__ ((format (printf,5,6)))
__attribute__ ((visibility ("default")));
int mdbm_log_vlogerror_at (const char* file, int line, int level, int error, const char* format, va_list args)
int mdbm_log_vlogerror_at (const char* file, int line, int level, int error, const char* format, va_list_t* args)
__attribute__ ((format (printf,5,0)))
__attribute__ ((visibility ("default")));

Expand Down
10 changes: 9 additions & 1 deletion src/lib/atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,16 +78,23 @@ static inline void atomic_barrier() {
static inline void atomic_read_barrier() {
#ifdef __x86_64__
__asm__ __volatile__ ("lfence" : : : "memory");
#elif defined(__aarch64__)
__asm__ volatile ("dmb ishld" : : : "memory");
#else
__asm__ __volatile__ ("lock addl $0,0(%%esp)" : : : "memory");
#endif
}

static inline void atomic_pause() {
__asm__ __volatile__ ("pause");
#ifdef __x86_64__
__asm__ __volatile__ ("pause");
#elif defined(__aarch64__)
__asm__ __volatile__ ("isb");
#endif
}


#ifndef SYS_gettid
/* returns (linux-specific) thread-id (for single-thread processes it's just PID) */
static inline uint32_t gettid() {
/* AUTO_TSC("gettid()"); */
Expand All @@ -107,6 +114,7 @@ static inline uint32_t gettid() {
return tid;
#endif
}
#endif

#ifdef __cplusplus
}
Expand Down
24 changes: 12 additions & 12 deletions src/lib/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,20 +105,20 @@ size_t mdbm_strlcpy (char* dst, const char* src, size_t dstlen) {

int mdbm_log_at (const char* file, int line, int level, const char* format, ...) {
int ret;
va_list args;
va_start(args,format);
ret = mdbm_log_vlog_at(file, line, level, format, args);
va_end(args);
va_list_t args;
va_start(args.ap,format);
ret = mdbm_log_vlog_at(file, line, level, format, &args);
va_end(args.ap);
return ret;
}

#define MESSAGE_MAX 4096

int mdbm_log_vlogerror_at (const char* file, int line, int level, int error, const char* format, va_list args) {
int mdbm_log_vlogerror_at (const char* file, int line, int level, int error, const char* format, va_list_t* args) {
char buf[MESSAGE_MAX];
int len;

len = vsnprintf(buf,sizeof(buf)-2,format,args);
len = vsnprintf(buf,sizeof(buf)-2,format,args->ap);
strcpy(buf+len,": ");
len += 2;
if (!error) {
Expand All @@ -133,14 +133,14 @@ int mdbm_log_vlogerror_at (const char* file, int line, int level, int error, con

int mdbm_logerror_at (const char* file, int line, int level, int error, const char* format, ...) {
int ret;
va_list args;
va_start(args,format);
ret = mdbm_log_vlogerror_at(file, line, level,error,format,args);
va_end(args);
va_list_t args;
va_start(args.ap,format);
ret = mdbm_log_vlogerror_at(file, line, level,error,format,&args);
va_end(args.ap);
return ret;
}

int mdbm_log_vlog_at (const char* file, int line, int level, const char* format, va_list args) {
int mdbm_log_vlog_at (const char* file, int line, int level, const char* format, va_list_t* args) {
int pid;
struct timeval tv;
char buf[MESSAGE_MAX];
Expand Down Expand Up @@ -171,7 +171,7 @@ int mdbm_log_vlog_at (const char* file, int line, int level, const char* format,
}

if (args) {
vsnprintf(buf+offset,sizeof(buf)-offset-2,format,args);
vsnprintf(buf+offset,sizeof(buf)-offset-2,format,args->ap);
} else {
mdbm_strlcpy(buf+offset,format,sizeof(buf)-offset-2);
}
Expand Down
10 changes: 10 additions & 0 deletions src/lib/mdbm.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ volatile static uint64_t hi_tsc; /* Keeps track of high water mark TSC value
volatile static uint64_t next_gtod_tsc; /* timestamp, in units of TSC, when to re-read gtod */
volatile static uint64_t tsc_per_usec; /* TSC clock cycles per microsecond */

#ifdef __x86_64__
/* Intel (and later model AMD) Fetch Time-StampCounter
* WANRING: This value may be affected by speedstep and may vary randomly across cores. */
static inline uint64_t rdtsc(void)
Expand All @@ -153,6 +154,15 @@ static inline uint64_t rdtsc(void)
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return (((uint64_t)hi) << 32) | lo;
}
#elif defined(__aarch64__)
/* ARM64 */
__inline__ uint64_t rdtsc(void)
{
uint64_t val;
__asm__ __volatile__ ("mrs %0, cntvct_el0" : "=r" (val));
return val;
}
#endif

uint64_t
tsc_get_usec(void)
Expand Down
8 changes: 4 additions & 4 deletions src/lib/mdbm_lock.cc
Original file line number Diff line number Diff line change
Expand Up @@ -198,12 +198,12 @@ lock_error(MDBM* db, const char* what, ...)
const char* fname = db ? db->db_filename : NULL;
int flen = fname ? strlen(fname) : 0;
int len = strlen(what) + flen + 4;
va_list args;
va_list_t args;
char *fmtbuf = (char*)malloc(len);
snprintf(fmtbuf,len,"%s: %s",fname,what);
va_start(args,what);
mdbm_log_vlogerror(LOG_ERR,0,fmtbuf,args);
va_end(args);
va_start(args.ap,what);
mdbm_log_vlogerror(LOG_ERR,0,fmtbuf,&args);
va_end(args.ap);
if (locks) {
locks->printState();
}
Expand Down