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