#! /bin/sh /usr/share/dpatch/dpatch-run ## 004-tracefix.dpatch by Mario Fetka (geos_one) ## ## 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 + #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;