int sys_sendfile64(struct tcb *tcp) { if (entering(tcp)) { printfd(tcp, tcp->u_arg[0]); tprints(", "); printfd(tcp, tcp->u_arg[1]); tprints(", "); print_loff_t(tcp, tcp->u_arg[2]); tprintf(", %lu", tcp->u_arg[3]); } return 0; }
int sys_splice(struct tcb *tcp) { if (entering(tcp)) { /* int fd_in */ printfd(tcp, tcp->u_arg[0]); tprints(", "); /* loff_t *off_in */ print_loff_t(tcp, tcp->u_arg[1]); tprints(", "); /* int fd_out */ printfd(tcp, tcp->u_arg[2]); tprints(", "); /* loff_t *off_out */ print_loff_t(tcp, tcp->u_arg[3]); tprints(", "); /* size_t len */ tprintf("%lu, ", tcp->u_arg[4]); /* unsigned int flags */ printflags(splice_flags, tcp->u_arg[5], "SPLICE_F_???"); } return 0; }
int mtd_ioctl(struct tcb *tcp, const unsigned int code, const long arg) { if (!verbose(tcp)) return RVAL_DECODED; switch (code) { case MEMERASE: case MEMLOCK: case MEMUNLOCK: case MEMISLOCKED: { struct erase_info_user einfo; tprints(", "); if (umove_or_printaddr(tcp, arg, &einfo)) break; tprintf("{start=%#" PRIx32 ", length=%#" PRIx32 "}", einfo.start, einfo.length); break; } case MEMERASE64: { struct erase_info_user64 einfo64; tprints(", "); if (umove_or_printaddr(tcp, arg, &einfo64)) break; tprintf("{start=%#" PRIx64 ", length=%#" PRIx64 "}", (uint64_t) einfo64.start, (uint64_t) einfo64.length); break; } case MEMWRITEOOB: case MEMREADOOB: { struct mtd_oob_buf mbuf; tprints(", "); if (umove_or_printaddr(tcp, arg, &mbuf)) break; tprintf("{start=%#" PRIx32 ", length=%#" PRIx32 ", ptr=...}", mbuf.start, mbuf.length); break; } case MEMWRITEOOB64: case MEMREADOOB64: { struct mtd_oob_buf64 mbuf64; tprints(", "); if (umove_or_printaddr(tcp, arg, &mbuf64)) break; tprintf("{start=%#" PRIx64 ", length=%#" PRIx64 ", ptr=...}", (uint64_t) mbuf64.start, (uint64_t) mbuf64.length); break; } case MEMGETREGIONINFO: { struct region_info_user rinfo; if (entering(tcp)) { tprints(", "); if (umove_or_printaddr(tcp, arg, &rinfo)) break; tprintf("{regionindex=%#x", rinfo.regionindex); return 1; } else { if (syserror(tcp)) { tprints("}"); break; } if (umove(tcp, arg, &rinfo) < 0) { tprints(", ???}"); break; } tprintf(", offset=%#x, erasesize=%#x, numblocks=%#x}", rinfo.offset, rinfo.erasesize, rinfo.numblocks); break; } } case OTPLOCK: { struct otp_info oinfo; tprints(", "); if (umove_or_printaddr(tcp, arg, &oinfo)) break; tprintf("{start=%#" PRIx32 ", length=%#" PRIx32 ", locked=%" PRIu32 "}", oinfo.start, oinfo.length, oinfo.locked); break; } case MEMWRITE: { struct mtd_write_req mreq; tprints(", "); if (umove_or_printaddr(tcp, arg, &mreq)) break; tprintf("{start=%#" PRIx64 ", len=%#" PRIx64, (uint64_t) mreq.start, (uint64_t) mreq.len); tprintf(", ooblen=%#" PRIx64 ", usr_data=%#" PRIx64, (uint64_t) mreq.ooblen, (uint64_t) mreq.usr_data); tprintf(", usr_oob=%#" PRIx64 ", mode=", (uint64_t) mreq.usr_oob); printxval(mtd_mode_options, mreq.mode, "MTD_OPS_???"); tprints(", padding=...}"); break; } case OTPSELECT: { unsigned int i; tprints(", "); if (umove_or_printaddr(tcp, arg, &i)) break; tprints("["); printxval(mtd_otp_options, i, "MTD_OTP_???"); tprints("]"); break; } case MTDFILEMODE: tprints(", "); printxval(mtd_file_mode_options, arg, "MTD_FILE_MODE_???"); break; case MEMGETBADBLOCK: case MEMSETBADBLOCK: tprints(", "); print_loff_t(tcp, arg); break; case MEMGETINFO: { struct mtd_info_user minfo; if (entering(tcp)) return 0; tprints(", "); if (umove_or_printaddr(tcp, arg, &minfo)) break; tprints("{type="); printxval(mtd_type_options, minfo.type, "MTD_???"); tprints(", flags="); printflags(mtd_flags_options, minfo.flags, "MTD_???"); tprintf(", size=%#" PRIx32 ", erasesize=%#" PRIx32, minfo.size, minfo.erasesize); tprintf(", writesize=%#" PRIx32 ", oobsize=%#" PRIx32, minfo.writesize, minfo.oobsize); tprintf(", padding=%#" PRIx64 "}", (uint64_t) minfo.padding); break; } case MEMGETOOBSEL: { struct nand_oobinfo ninfo; unsigned int i; if (entering(tcp)) return 0; tprints(", "); if (umove_or_printaddr(tcp, arg, &ninfo)) break; tprints("{useecc="); printxval(mtd_nandecc_options, ninfo.useecc, "MTD_NANDECC_???"); tprintf(", eccbytes=%#" PRIx32, ninfo.eccbytes); tprints(", oobfree={"); for (i = 0; i < ARRAY_SIZE(ninfo.oobfree); ++i) { unsigned int j; if (i) tprints("}, "); tprints("{"); for (j = 0; j < ARRAY_SIZE(ninfo.oobfree[0]); ++j) { if (j) tprints(", "); tprintf("%#" PRIx32, ninfo.oobfree[i][j]); } } tprints("}}, eccpos={"); for (i = 0; i < ARRAY_SIZE(ninfo.eccpos); ++i) { if (i) tprints(", "); tprintf("%#" PRIx32, ninfo.eccpos[i]); } tprints("}"); break; } case OTPGETREGIONINFO: { struct otp_info oinfo; if (entering(tcp)) return 0; tprints(", "); if (umove_or_printaddr(tcp, arg, &oinfo)) break; tprintf("{start=%#" PRIx32 ", length=%#" PRIx32 ", locked=%" PRIu32 "}", oinfo.start, oinfo.length, oinfo.locked); break; } case ECCGETLAYOUT: { struct nand_ecclayout_user nlay; unsigned int i; if (entering(tcp)) return 0; tprints(", "); if (umove_or_printaddr(tcp, arg, &nlay)) break; tprintf("{eccbytes=%#" PRIx32 ", eccpos={", nlay.eccbytes); for (i = 0; i < ARRAY_SIZE(nlay.eccpos); ++i) { if (i) tprints(", "); tprintf("%#" PRIx32, nlay.eccpos[i]); } tprintf("}, oobavail=%#" PRIx32 ", oobfree={", nlay.oobavail); for (i = 0; i < ARRAY_SIZE(nlay.oobfree); ++i) { if (i) tprints(", "); tprintf("{offset=%#" PRIx32 ", length=%#" PRIx32 "}", nlay.oobfree[i].offset, nlay.oobfree[i].length); } tprints("}"); break; } case ECCGETSTATS: { struct mtd_ecc_stats estat; if (entering(tcp)) return 0; tprints(", "); if (umove_or_printaddr(tcp, arg, &estat)) break; tprintf("{corrected=%#" PRIx32 ", failed=%#" PRIx32, estat.corrected, estat.failed); tprintf(", badblocks=%#" PRIx32 ", bbtblocks=%#" PRIx32 "}", estat.badblocks, estat.bbtblocks); break; } case OTPGETREGIONCOUNT: if (entering(tcp)) return 0; tprints(", "); printnum_int(tcp, arg, "%u"); break; case MEMGETREGIONCOUNT: if (entering(tcp)) return 0; tprints(", "); printnum_int(tcp, arg, "%d"); break; default: return RVAL_DECODED; } return RVAL_DECODED | 1; }
int mtd_ioctl(struct tcb *tcp, long code, long arg) { struct mtd_info_user minfo; struct erase_info_user einfo; struct erase_info_user64 einfo64; struct mtd_oob_buf mbuf; struct mtd_oob_buf64 mbuf64; struct region_info_user rinfo; struct otp_info oinfo; struct mtd_ecc_stats estat; struct mtd_write_req mreq; struct nand_oobinfo ninfo; struct nand_ecclayout_user nlay; int i, j; if (entering(tcp)) return 0; switch (code) { case MEMGETINFO: if (!verbose(tcp) || umove(tcp, arg, &minfo) < 0) return 0; tprints(", {type="); printxval(mtd_type_options, minfo.type, "MTD_???"); tprints(", flags="); printflags(mtd_flags_options, minfo.flags, "MTD_???"); tprintf(", size=%#" PRIx32 ", erasesize=%#" PRIx32, minfo.size, minfo.erasesize); tprintf(", writesize=%#" PRIx32 ", oobsize=%#" PRIx32, minfo.writesize, minfo.oobsize); tprintf(", padding=%#" PRIx64 "}", (uint64_t) minfo.padding); return 1; case MEMERASE: case MEMLOCK: case MEMUNLOCK: case MEMISLOCKED: if (!verbose(tcp) || umove(tcp, arg, &einfo) < 0) return 0; tprintf(", {start=%#" PRIx32 ", length=%#" PRIx32 "}", einfo.start, einfo.length); return 1; case MEMERASE64: if (!verbose(tcp) || umove(tcp, arg, &einfo64) < 0) return 0; tprintf(", {start=%#" PRIx64 ", length=%#" PRIx64 "}", (uint64_t) einfo64.start, (uint64_t) einfo64.length); return 1; case MEMWRITEOOB: case MEMREADOOB: if (!verbose(tcp) || umove(tcp, arg, &mbuf) < 0) return 0; tprintf(", {start=%#" PRIx32 ", length=%#" PRIx32 ", ptr=...}", mbuf.start, mbuf.length); return 1; case MEMWRITEOOB64: case MEMREADOOB64: if (!verbose(tcp) || umove(tcp, arg, &mbuf64) < 0) return 0; tprintf(", {start=%#" PRIx64 ", length=%#" PRIx64 ", ptr=...}", (uint64_t) mbuf64.start, (uint64_t) mbuf64.length); return 1; case MEMGETREGIONINFO: if (!verbose(tcp) || umove(tcp, arg, &rinfo) < 0) return 0; tprintf(", {offset=%#" PRIx32 ", erasesize=%#" PRIx32, rinfo.offset, rinfo.erasesize); tprintf(", numblocks=%#" PRIx32 ", regionindex=%#" PRIx32 "}", rinfo.numblocks, rinfo.regionindex); return 1; case MEMGETOOBSEL: if (!verbose(tcp) || umove(tcp, arg, &ninfo) < 0) return 0; tprints(", {useecc="); printxval(mtd_nandecc_options, ninfo.useecc, "MTD_NANDECC_???"); tprintf(", eccbytes=%#" PRIx32, ninfo.eccbytes); tprints(", oobfree={"); for (i = 0; i < ARRAY_SIZE(ninfo.oobfree); ++i) { if (i) tprints("}, "); tprints("{"); for (j = 0; j < ARRAY_SIZE(ninfo.oobfree[0]); ++j) { if (j) tprints(", "); tprintf("%#" PRIx32, ninfo.oobfree[i][j]); } } tprints("}}, eccpos={"); for (i = 0; i < ARRAY_SIZE(ninfo.eccpos); ++i) { if (i) tprints(", "); tprintf("%#" PRIx32, ninfo.eccpos[i]); } tprints("}"); return 1; case OTPGETREGIONINFO: case OTPLOCK: if (!verbose(tcp) || umove(tcp, arg, &oinfo) < 0) return 0; tprintf(", {start=%#" PRIx32 ", length=%#" PRIx32 ", locked=%" PRIu32 "}", oinfo.start, oinfo.length, oinfo.locked); return 1; case ECCGETLAYOUT: if (!verbose(tcp) || umove(tcp, arg, &nlay) < 0) return 0; tprintf(", {eccbytes=%#" PRIx32 ", eccpos={", nlay.eccbytes); for (i = 0; i < ARRAY_SIZE(nlay.eccpos); ++i) { if (i) tprints(", "); tprintf("%#" PRIx32, nlay.eccpos[i]); } tprintf("}, oobavail=%#" PRIx32 ", oobfree={", nlay.oobavail); for (i = 0; i < ARRAY_SIZE(nlay.oobfree); ++i) { if (i) tprints(", "); tprintf("{offset=%#" PRIx32 ", length=%#" PRIx32 "}", nlay.oobfree[i].offset, nlay.oobfree[i].length); } tprints("}"); return 1; case ECCGETSTATS: if (!verbose(tcp) || umove(tcp, arg, &estat) < 0) return 0; tprintf(", {corrected=%#" PRIx32 ", failed=%#" PRIx32, estat.corrected, estat.failed); tprintf(", badblocks=%#" PRIx32 ", bbtblocks=%#" PRIx32 "}", estat.badblocks, estat.bbtblocks); return 1; case MEMWRITE: if (!verbose(tcp) || umove(tcp, arg, &mreq) < 0) return 0; tprintf(", {start=%#" PRIx64 ", len=%#" PRIx64, (uint64_t) mreq.start, (uint64_t) mreq.len); tprintf(", ooblen=%#" PRIx64 ", usr_data=%#" PRIx64, (uint64_t) mreq.ooblen, (uint64_t) mreq.usr_data); tprintf(", usr_oob=%#" PRIx64 ", mode=", (uint64_t) mreq.usr_oob); printxval(mtd_mode_options, mreq.mode, "MTD_OPS_???"); tprints(", padding=...}"); return 1; case OTPSELECT: if (!verbose(tcp) || umove(tcp, arg, &i) < 0) return 0; tprints(", ["); printxval(mtd_otp_options, i, "MTD_OTP_???"); tprints("]"); return 1; case MEMGETBADBLOCK: case MEMSETBADBLOCK: if (!verbose(tcp)) return 0; tprints(", "); print_loff_t(tcp, arg); return 1; case OTPGETREGIONCOUNT: if (!verbose(tcp) || umove(tcp, arg, &i) < 0) return 0; tprintf(", [%i]", i); return 1; case MTDFILEMODE: /* XXX: process return value as enum mtd_file_modes */ case MEMGETREGIONCOUNT: /* These ones take simple args, so let default printer handle it */ default: return 0; } }