240 lines
6.7 KiB
Plaintext
Executable File
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;
|