megactl/debian/patches/007-tracefix.dpatch

240 lines
6.7 KiB
Plaintext
Executable File

#! /bin/sh /usr/share/dpatch/dpatch-run
## 004-tracefix.dpatch by Mario Fetka (geos_one) <mario.fetka@gmail.com>
##
## DP: megatrace fixup for 64bit systems
## DP: thx. to gentoo devs
@DPATCH@
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;