15104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin/* 25104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * Copyright (c) 2012 Mike Frysinger <vapier@gentoo.org> 339bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2012-2017 The strace developers. 45104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * 55104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * Redistribution and use in source and binary forms, with or without 65104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * modification, are permitted provided that the following conditions 75104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * are met: 85104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright 95104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * notice, this list of conditions and the following disclaimer. 105104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright 115104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * notice, this list of conditions and the following disclaimer in the 125104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * documentation and/or other materials provided with the distribution. 135104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products 145104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * derived from this software without specific prior written permission. 155104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * 165104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 175104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 185104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 195104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 205104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 215104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 225104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 235104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 245104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 255104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin */ 275104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 285104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#include "defs.h" 295104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 305104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#include <linux/ioctl.h> 315104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 325104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin/* The UBI api changes, so we have to keep a local copy */ 335104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#include <linux/version.h> 345104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 7, 0) 355104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin# include "ubi-user.h" 365104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#else 375104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin# include <mtd/ubi-user.h> 385104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#endif 395104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 405104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#include "xlat/ubi_volume_types.h" 415104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#include "xlat/ubi_volume_props.h" 425104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 435104db4e605996165dee8685459032d760d8ab02Dmitry V. Levinint 44d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesubi_ioctl(struct tcb *const tcp, const unsigned int code, 45d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes const kernel_ulong_t arg) 465104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin{ 475104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (!verbose(tcp)) 485104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin return RVAL_DECODED; 495104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 505104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin switch (code) { 515104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCMKVOL: 525104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (entering(tcp)) { 535104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin struct ubi_mkvol_req mkvol; 545104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 555104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(", "); 565104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (umove_or_printaddr(tcp, arg, &mkvol)) 575104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 585104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 595104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprintf("{vol_id=%" PRIi32 ", alignment=%" PRIi32 605104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin ", bytes=%" PRIi64 ", vol_type=", mkvol.vol_id, 615104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin mkvol.alignment, (int64_t)mkvol.bytes); 625104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin printxval(ubi_volume_types, 635104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin (uint8_t) mkvol.vol_type, "UBI_???_VOLUME"); 645104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprintf(", name_len=%" PRIi16 ", name=", mkvol.name_len); 655104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (print_quoted_string(mkvol.name, 665104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin CLAMP(mkvol.name_len, 0, UBI_MAX_VOLUME_NAME), 675104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin QUOTE_0_TERMINATED) > 0) { 685104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints("..."); 695104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 705104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints("}"); 715104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin return 1; 725104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 735104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (!syserror(tcp)) { 745104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(" => "); 755104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin printnum_int(tcp, arg, "%d"); 765104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 775104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 785104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 795104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCRSVOL: { 805104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin struct ubi_rsvol_req rsvol; 815104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 825104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(", "); 835104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (umove_or_printaddr(tcp, arg, &rsvol)) 845104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 855104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 865104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprintf("{vol_id=%" PRIi32 ", bytes=%" PRIi64 "}", 875104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin rsvol.vol_id, (int64_t)rsvol.bytes); 885104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 895104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 905104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 915104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCRNVOL: { 925104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin struct ubi_rnvol_req rnvol; 935104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin int c; 945104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 955104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(", "); 965104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (umove_or_printaddr(tcp, arg, &rnvol)) 975104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 985104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 995104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprintf("{count=%" PRIi32 ", ents=[", rnvol.count); 1005104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin for (c = 0; c < CLAMP(rnvol.count, 0, UBI_MAX_RNVOL); ++c) { 1015104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (c) 1025104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(", "); 1035104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprintf("{vol_id=%" PRIi32 ", name_len=%" PRIi16 1045104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin ", name=", rnvol.ents[c].vol_id, 1055104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin rnvol.ents[c].name_len); 1065104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (print_quoted_string(rnvol.ents[c].name, 1075104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin CLAMP(rnvol.ents[c].name_len, 0, UBI_MAX_VOLUME_NAME), 1085104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin QUOTE_0_TERMINATED) > 0) { 1095104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints("..."); 1105104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 1115104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints("}"); 1125104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 1135104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints("]}"); 1145104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1155104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 1165104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1175104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCEBCH: { 1185104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin struct ubi_leb_change_req leb; 1195104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1205104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(", "); 1215104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (umove_or_printaddr(tcp, arg, &leb)) 1225104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1235104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1245104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprintf("{lnum=%d, bytes=%d}", leb.lnum, leb.bytes); 1255104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1265104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 1275104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1285104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCATT: 1295104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (entering(tcp)) { 1305104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin struct ubi_attach_req attach; 1315104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1325104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(", "); 1335104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (umove_or_printaddr(tcp, arg, &attach)) 1345104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1355104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1365104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprintf("{ubi_num=%" PRIi32 ", mtd_num=%" PRIi32 1375104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin ", vid_hdr_offset=%" PRIi32 1385104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin ", max_beb_per1024=%" PRIi16 "}", 1395104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin attach.ubi_num, attach.mtd_num, 1405104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin attach.vid_hdr_offset, attach.max_beb_per1024); 1415104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin return 1; 1425104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 1435104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (!syserror(tcp)) { 1445104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(" => "); 1455104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin printnum_int(tcp, arg, "%d"); 1465104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 1475104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1485104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1495104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCEBMAP: { 1505104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin struct ubi_map_req map; 1515104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1525104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(", "); 1535104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (umove_or_printaddr(tcp, arg, &map)) 1545104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1555104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1565104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprintf("{lnum=%" PRIi32 ", dtype=%" PRIi8 "}", 1575104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin map.lnum, map.dtype); 1585104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1595104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 1605104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1615104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCSETVOLPROP: { 1625104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin struct ubi_set_vol_prop_req prop; 1635104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1645104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(", "); 1655104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin if (umove_or_printaddr(tcp, arg, &prop)) 1665104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1675104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1685104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints("{property="); 1695104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin printxval(ubi_volume_props, prop.property, "UBI_VOL_PROP_???"); 1705104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprintf(", value=%#" PRIx64 "}", (uint64_t)prop.value); 1715104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1725104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 1735104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1745104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1755104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCVOLUP: 1765104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(", "); 1775104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin printnum_int64(tcp, arg, "%" PRIi64); 1785104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1795104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1805104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCDET: 1815104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCEBER: 1825104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCEBISMAP: 1835104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCEBUNMAP: 1845104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCRMVOL: 1855104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin tprints(", "); 1865104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin printnum_int(tcp, arg, "%d"); 1875104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1885104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1895104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#ifdef UBI_IOCVOLCRBLK 1905104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCVOLCRBLK: 1915104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#endif 1925104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#ifdef UBI_IOCVOLRMBLK 1935104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin case UBI_IOCVOLRMBLK: 1945104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin#endif 1955104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin /* no arguments */ 1965104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin break; 1975104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 1985104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin default: 1995104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin return RVAL_DECODED; 2005104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin } 2015104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin 2025104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin return RVAL_DECODED | 1; 2035104db4e605996165dee8685459032d760d8ab02Dmitry V. Levin} 204