diff -Nuar megactl-0.4.1.orig/src/megactl.c megactl-0.4.1/src/megactl.c
--- megactl-0.4.1.orig/src/megactl.c	2007-08-21 00:19:53.000000000 -0700
+++ megactl-0.4.1/src/megactl.c	2014-07-14 11:15:14.538745305 -0700
@@ -45,6 +45,9 @@
 
 ********************************************************************/
 
+#define __STDC_FORMAT_MACROS
+#include <inttypes.h>
+
 #include	"mega.h"
 #include	"megaioctl.h"
 #include	"adapter.h"
@@ -207,7 +210,7 @@
 
     for (k = 0; (b >= 1024) && (k < sizeof (suffix) / sizeof (suffix[0]) - 1); ++k, b /= 1024)
 	;
-    snprintf (bytes, sizeof bytes, "%3llu%s%s", b, suffix[k], unit);
+    snprintf (bytes, sizeof bytes, "%3"PRIu64"%s%s", b, suffix[k], unit);
     return bytes;
 }
 
@@ -604,6 +607,8 @@
 	fprintf (stderr, "megaraid driver version %x too old.\n", driverVersion);
 	return 1;
     }
+#else
+	driverVersion = 0;
 #endif
 
     if (megaGetNumAdapters (fd, &numAdapters, sas) < 0)
diff -Nuar megactl-0.4.1.orig/src/megaioctl.c megactl-0.4.1/src/megaioctl.c
--- megactl-0.4.1.orig/src/megaioctl.c	2014-07-14 11:30:03.590781305 -0700
+++ megactl-0.4.1/src/megaioctl.c	2014-07-14 11:31:36.410258930 -0700
@@ -87,7 +87,11 @@
     m->cmd = cmd;
     m->opcode = opcode;
     m->subopcode = subopcode;
+#ifdef __x86_64__
+    m->xferaddr = (uint64_t) data;
+#else
     m->xferaddr = (uint32_t) data;
+#endif
     if (data)
 	memset (data, 0, len);
 
@@ -115,7 +119,11 @@
     m->cmd = cmd;
     m->opcode = opcode;
     m->subopcode = subopcode;
+#ifdef __x86_64__
+    m->xferaddr = (uint64_t) data;
+#else
     m->xferaddr = (uint32_t) data;
+#endif
     if (data)
 	memset (data, 0, len);
 
@@ -178,11 +186,19 @@
 	u.ui.fcs.adapno = MKADAP(adapter->adapno);
 	u.data = data;
 	m->cmd = MBOXCMD_PASSTHRU;
+#ifdef __x86_64__
+	m->xferaddr = (uint64_t) p;
+#else
 	m->xferaddr = (uint32_t) p;
+#endif
 	p->timeout = 3;
 	p->ars = 1;
 	p->target = target;
-	p->dataxferaddr = (uint32_t) data;
+#ifdef __x86_64__
+    p->dataxferaddr = (uint64_t) data;
+#else
+    p->dataxferaddr = (uint32_t) data;
+#endif
 	p->dataxferlen = len;
 	p->scsistatus = 239;	/* HMMM */
 	memcpy (p->cdb, cdb, cdblen);
diff -Nuar megactl-0.4.1.orig/src/megatrace.c megactl-0.4.1/src/megatrace.c
--- megactl-0.4.1.orig/src/megatrace.c	2014-07-14 01:31:47.704312799 -0700
+++ megactl-0.4.1/src/megatrace.c	2014-07-14 11:37:20.570755832 -0700
@@ -170,7 +170,11 @@
 		    fprintf (stderr, "ptrace:getregs: %s\n", strerror (errno));
 		    exit (1);
 		}
+#ifdef __x86_64__
+		call = r.orig_rax;
+#else
 		call = r.orig_eax;
+#endif
 		/*printthis = call == SYS_ioctl;*/
 
 		if (state == INBOUND)
@@ -188,18 +192,30 @@
 		{
 		    if ((call < 0) || (call > callmax) || (callinfo[call].name == NULL))
 		    {
+#ifdef __x86_64__
+			fprintf (stderr, "= 0x%08llx\n", (unsigned long long) r.rax);
+#else
 			fprintf (stderr, "= 0x%08lx\n", (unsigned long) r.eax);
+#endif
 		    }
 		    else
 		    {
 			if (callinfo[call].ptrval)
 			{
 			    if (printcalls || printthis)
+#ifdef __x86_64__
+				fprintf (stderr, " = 0x%08llx\n", r.rax);
+#else
 				fprintf (stderr, " = 0x%08lx\n", r.eax);
+#endif
 			}
 			else
 			{
+#ifdef __x86_64__
+			    long	rv = r.rax;
+#else
 			    long	rv = r.eax;
+#endif
 			    if (rv < 0)
 			    {
 				if (printcalls || printthis)
@@ -219,16 +235,22 @@
 		    unsigned int		len = 16;
 		    unsigned char		buf[65536];
 
+#ifdef __x86_64__
+		    unsigned long long	fd = r.rbx;
+		    unsigned long long	ioc = r.rcx;
+		    unsigned long long	arg = r.rdx;
+#else
 		    unsigned long		fd = r.ebx;
-
 		    unsigned long		ioc = r.ecx;
+		    unsigned long		arg = r.edx;
+#endif
+
 		    unsigned int		iocdir = _IOC_DIR(ioc);
 		    unsigned char		ioctype = _IOC_TYPE(ioc);
 		    unsigned int		iocnr = _IOC_NR(ioc);
 		    unsigned int		iocsize = _IOC_SIZE(ioc);
 		    char			*iocdirname;
 
-		    unsigned long		arg = r.edx;
 
 		    switch (iocdir)
 		    {
@@ -240,7 +262,11 @@
 
 		    fprintf (stderr, "%s: ioctl(%ld, _IOC(\"%s\",'%c',0x%02x,0x%02x), 0x%08lx)", tbuf, fd, iocdirname, ioctype, iocnr, iocsize, arg);
 		    if (state == OUTBOUND)
+#ifdef __x86_64__
+			fprintf (stderr, " = %lld\n", r.rax);
+#else
 			fprintf (stderr, " = %ld\n", r.eax);
+#endif
 		    if (getenv ("LOG_INBOUND"))
 			fprintf (stderr, "\n");
 
@@ -249,10 +275,18 @@
 		    if (len > sizeof buf)
 			len = sizeof buf;
 
+#ifdef __x86_64__
+		    if (printregs)
+			fprintf (stderr, "    rbx=%08llx rcx=%08llx rdx=%08llx rsi=%08llx rdi=%08llx rbp=%08llx rax=%08llx ds=%08llx es=%08llx fs=%08llx gs=%08llx orig_rax=%08llx rip=%08llx cs=%08llx eflags=%08llx rsp=%08llx ss=%08llx\n", r.rbx, r.rcx, r.rdx, r.rsi, r.rdi, r.rbp, r.rax, r.ds, r.es, r.fs, r.gs, r.orig_rax, r.rip, r.cs, r.eflags, r.rsp, r.ss);
+
+		    copyout (buf, len, pid, r.rdx);
+#else
 		    if (printregs)
 			fprintf (stderr, "    ebx=%08lx ecx=%08lx edx=%08lx esi=%08lx edi=%08lx ebp=%08lx eax=%08lx xds=%08lx xes=%08lx xfs=%08lx xgs=%08lx orig_eax=%08lx eip=%08lx xcs=%08lx eflags=%08lx esp=%08lx xss=%08lx\n", r.ebx, r.ecx, r.edx, r.esi, r.edi, r.ebp, r.eax, r.xds, r.xes, r.xfs, r.xgs, r.orig_eax, r.eip, r.xcs, r.eflags, r.esp, r.xss);
 
 		    copyout (buf, len, pid, r.edx);
+#endif
+
 
 		    if ((ioctype == 'm') && (iocnr == 0) && (iocsize == sizeof (struct uioctl_t)))
 		    {
@@ -405,7 +439,11 @@
 			else
 			{
 			    fprintf (stderr, "    host %d, off 0x%04x, count %d, sense_off 0x%08x, sense_len 0x%08x\n", iocp->host_no, iocp->sgl_off, iocp->sge_count, iocp->sense_off, iocp->sense_len);
+#ifdef __x86_64__
+			    dumpbytes (stderr, buf, len, (void *) r.rdx, NULL);
+#else
 			    dumpbytes (stderr, buf, len, (void *) r.edx, NULL);
+#endif
 			}
 			if (log)
 			{
@@ -427,23 +465,38 @@
 		    }
 		    else
 		    {
+#ifdef __x86_64__
+			dumpbytes (stderr, buf, len, (void *) r.rdx, NULL);
+#else
 			dumpbytes (stderr, buf, len, (void *) r.edx, NULL);
+#endif
 		    }
 		    fprintf (stderr, "\n");
 		}
 
 		switch (state)
 		{
+#ifdef __x86_64__
+		    static u64		lastrip = 0;
+#else
 		    static u32		lasteip = 0;
+#endif
+
 
 		 case UNTRACED:
 		    /* We don't know whether we were inbound or outbound on the first signal; this
 		       appears to differ between kernels. So we defer until we see the same eip in
 		       two successive traps, at which point we know we were outbound, so the next
 		       trap is inbound. */
+#ifdef __x86_64__
+		    if (lastrip == r.rip)
+			state = INBOUND;
+		    lastrip = r.rip;
+#else
 		    if (lasteip == r.eip)
 			state = INBOUND;
 		    lasteip = r.eip;
+#endif
 		    break;
 		 case INBOUND:		state = OUTBOUND; break;
 		 case OUTBOUND:		state = INBOUND; break;
