from cinap teach truss about amd64. problem: truss'ing seek() results in a data fault. i think this is an acid issue. Reference: /n/atom/patch/applied/trussamd64 Date: Fri Feb 14 02:56:08 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/lib/acid/truss Fri Feb 14 02:55:01 2014 +++ /sys/lib/acid/truss Fri Feb 14 02:55:02 2014 @@ -95,6 +95,7 @@ "await", "pread", "pwrite", + "tsemacqure", }; trussapecalls = { @@ -146,6 +147,7 @@ "__NAWAIT", "_PREAD", "_PWRITE", + "_TSEMACQUIRE", }; defn addressof(pattern) { @@ -198,7 +200,7 @@ } defn truss() { - local pc, lst, offset, prevpc, pcspret, ret; + local pc, lst, offset, prevpc, pcspret, arg, ret; offset = trapoffset(); @@ -225,33 +227,34 @@ trussflush(); prevpc = *PC; step(); + arg = eval pcspret[1]; ret = eval pcspret[2]; print("\treturn value: ", ret\D, "\n"); if (ret>=0) && (match(prevpc, readPC)>=0) then { print("\tdata: "); - printtextordata(*((eval pcspret[1])+4), ret); + printtextordata(arg[1], ret); print("\n"); } if (ret>=0) && (match(prevpc, fd2pathPC)>=0) then { - print("\tdata: \"", *(*((eval pcspret[1])+4)\s), "\"\n"); + print("\tdata: \"", *(arg[1]\s), "\"\n"); } if (ret>=0) && (match(prevpc, errstrPC)>=0) then { - print("\tdata: \"", *(*(eval pcspret[1])\s), "\"\n"); + print("\tdata: \"", *(arg[1]\s), "\"\n"); } if (ret>=0) && (match(prevpc, awaitPC)>=0) then { print("\tdata: "); - printtextordata(*(eval pcspret[1]), ret); + printtextordata(arg[0], ret); print("\n"); } // compatibility hacks for old kernel: if (ret>=0) && (match(prevpc, _waitPC)>=0) then { print("\tdata: "); - printtextordata(*(eval pcspret[1]), 12+3*12+64); + printtextordata(arg[0], 12+3*12+64); print("\n"); } if (ret>=0) && (match(prevpc, _errstrPC)>=0) then { print("\tdata: "); - printtextordata(*(eval pcspret[1]), 64); + printtextordata(arg[0], 64); print("\n"); } } --- /sys/lib/acid/syscall Fri Feb 14 02:55:04 2014 +++ /sys/lib/acid/syscall Fri Feb 14 02:55:05 2014 @@ -80,53 +80,54 @@ syscalls = { { 0, {"sysr1", "s", code(0)}}, - { 1, {"_errstr", "s", code(*sys_errstr:arg)}}, - { 2, {"bind", "ssX", code(*sysbind:arg)}}, - { 3, {"chdir", "s", code(*sysbind:arg)}}, - { 4, {"close", "D", code(*sysclose:arg)}}, - { 5, {"dup", "DD", code(*sysdup:arg)}}, - { 6, {"alarm", "D", code(*sysalarm:arg)}}, - { 7, {"exec", "sS", code(*sysexec:arg)}}, - { 8, {"exits", "s", code(*sysexits:arg)}}, - { 9, {"_fsession", "DX", code(*sys_fsession:arg)}}, - {10, {"fauth", "DX", code(*sysfauth:arg)}}, - {11, {"_fstat", "DX", code(*sys_fstat:arg)}}, - {12, {"segbrk", "XX", code(*syssegbrk:arg)}}, - {13, {"_mount", "DsXs", code(*sys_mount:arg)}}, - {14, {"open", "sD", code(*sysopen:arg)}}, - {15, {"_read", "DXD", code(*sys_read:arg)}}, - {16, {"oseek", "DDD", code(*sysoseek:arg)}}, - {17, {"sleep", "D", code(*syssleep:arg)}}, - {18, {"_stat", "sX", code(*sys_stat:arg)}}, - {19, {"rfork", "X", code(*sysstat:arg)}}, - {20, {"_write", "DXD", code(*sys_write:arg)}}, - {21, {"pipe", "X", code(*syspipe:arg)}}, - {22, {"create", "sDO", code(*syscreate:arg)}}, - {23, {"fd2path", "DXD", code(*sysfd2path:arg)}}, - {24, {"brk_", "X", code(*sysbrk_:arg)}}, - {25, {"remove", "s", code(*sysremove:arg)}}, - {26, {"_wstat", "sX", code(*sys_wstat:arg)}}, - {27, {"_fwstat", "DX", code(*sys_fwstat:arg)}}, - {28, {"notify", "X", code(*sysnotify:arg)}}, - {29, {"noted", "D", code(*sysnoted:arg)}}, - {30, {"segattach", "DsXD", code(*syssegattach:arg)}}, - {31, {"segdetach", "X", code(*syssegdetach:arg)}}, - {32, {"segfree", "XD", code(*syssegfree:arg)}}, - {33, {"segflush", "XD", code(*syssegflush:arg)}}, - {34, {"rendezvous", "XX", code(*sysrendezvous:arg)}}, - {35, {"unmount", "ss", code(*sysunmount:arg)}}, - {36, {"_wait", "X", code(*sys_wait:arg)}}, - {39, {"seek", "XDVD", code(*sysseek:arg)}}, - {40, {"fversion", "DDsD", code(*sysfversion:arg)}}, - {41, {"errstr", "TD", code(*syserrstr:arg)}}, - {42, {"stat", "sXD", code(*sysstat:arg)}}, - {43, {"fstat", "DXD", code(*sysfstat:arg)}}, - {44, {"wstat", "sXD", code(*syswstat:arg)}}, - {45, {"fwstat", "DXD", code(*sysfwstat:arg)}}, - {46, {"mount", "DDsXs", code(*sysmount:arg)}}, - {47, {"await", "TD", code(*sysawait:arg)}}, - {50, {"pread", "DXDZ", code(*syspread:arg)}}, - {51, {"pwrite", "DTDZ", code(*syspwrite:arg)}}, + { 1, {"_errstr", "s", code(*sys_errstr:list)}}, + { 2, {"bind", "ssX", code(*sysbind:list)}}, + { 3, {"chdir", "s", code(*sysbind:list)}}, + { 4, {"close", "D", code(*sysclose:list)}}, + { 5, {"dup", "DD", code(*sysdup:list)}}, + { 6, {"alarm", "D", code(*sysalarm:list)}}, + { 7, {"exec", "sS", code(*sysexec:list)}}, + { 8, {"exits", "s", code(*sysexits:list)}}, + { 9, {"_fsession", "DX", code(*sys_fsession:list)}}, + {10, {"fauth", "DX", code(*sysfauth:list)}}, + {11, {"_fstat", "DX", code(*sys_fstat:list)}}, + {12, {"segbrk", "XX", code(*syssegbrk:list)}}, + {13, {"_mount", "DsXs", code(*sys_mount:list)}}, + {14, {"open", "sD", code(*sysopen:list)}}, + {15, {"_read", "DXD", code(*sys_read:list)}}, + {16, {"oseek", "DDD", code(*sysoseek:list)}}, + {17, {"sleep", "D", code(*syssleep:list)}}, + {18, {"_stat", "sX", code(*sys_stat:list)}}, + {19, {"rfork", "X", code(*sysstat:list)}}, + {20, {"_write", "DXD", code(*sys_write:list)}}, + {21, {"pipe", "X", code(*syspipe:list)}}, + {22, {"create", "sDO", code(*syscreate:list)}}, + {23, {"fd2path", "DXD", code(*sysfd2path:list)}}, + {24, {"brk_", "X", code(*sysbrk_:list)}}, + {25, {"remove", "s", code(*sysremove:list)}}, + {26, {"_wstat", "sX", code(*sys_wstat:list)}}, + {27, {"_fwstat", "DX", code(*sys_fwstat:list)}}, + {28, {"notify", "X", code(*sysnotify:list)}}, + {29, {"noted", "D", code(*sysnoted:list)}}, + {30, {"segattach", "DsXD", code(*syssegattach:list)}}, + {31, {"segdetach", "X", code(*syssegdetach:list)}}, + {32, {"segfree", "XD", code(*syssegfree:list)}}, + {33, {"segflush", "XD", code(*syssegflush:list)}}, + {34, {"rendezvous", "XX", code(*sysrendezvous:list)}}, + {35, {"unmount", "ss", code(*sysunmount:list)}}, + {36, {"_wait", "X", code(*sys_wait:list)}}, + {39, {"seek", "XDVD", code(*sysseek:list)}}, + {40, {"fversion", "DDsD", code(*sysfversion:list)}}, + {41, {"errstr", "TD", code(*syserrstr:list)}}, + {42, {"stat", "sXD", code(*sysstat:list)}}, + {43, {"fstat", "DXD", code(*sysfstat:list)}}, + {44, {"wstat", "sXD", code(*syswstat:list)}}, + {45, {"fwstat", "DXD", code(*sysfwstat:list)}}, + {46, {"mount", "DDsXs", code(*sysmount:list)}}, + {47, {"await", "TD", code(*sysawait:list)}}, + {50, {"pread", "DXDZ", code(*syspread:list)}}, + {51, {"pwrite", "DTDZ", code(*syspread:list)}}, + {52, {"tsemacquire", "XD", code(*systsemacquire:list)}}, }; defn syscall() { @@ -150,6 +151,8 @@ // return sys call number, address of first argument, location of syscall return value if objtype == "386" then return { code(*(*PC-4)), code(*SP+4), code(*AX) }; + if objtype == "amd64" then + return { code(*BP), code(*SP+8), code(*AX) }; if (objtype == "mips") || (objtype == "mips2") then return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R1) }; if objtype == "arm" then @@ -161,6 +164,7 @@ defn trapoffset() { // return offset from entry point to trap instr if objtype == "386" then return 5; + if objtype == "amd64" then return 12; if objtype == "mips" then return 8; if objtype == "mips2" then return 8; if objtype == "arm" then return 8; // untested @@ -170,6 +174,7 @@ defn trapreason() { // return reason for trap if objtype == "386" then return reason(*TRAP); + if objtype == "amd64" then return reason(*TYPE); if objtype == "mips" then return reason(*CAUSE); if objtype == "mips2" then return reason(*CAUSE); if objtype == "arm" then return "unknown trap"; // untested