1605085a6SJohn Edward Broadbent #pragma once 2605085a6SJohn Edward Broadbent 3605085a6SJohn Edward Broadbent #include "erase.hpp" 4605085a6SJohn Edward Broadbent 5605085a6SJohn Edward Broadbent #include <linux/mmc/ioctl.h> 6605085a6SJohn Edward Broadbent #include <sys/ioctl.h> 7605085a6SJohn Edward Broadbent #include <sys/types.h> 8605085a6SJohn Edward Broadbent 9605085a6SJohn Edward Broadbent #include <stdplus/fd/managed.hpp> 10605085a6SJohn Edward Broadbent #include <util.hpp> 11605085a6SJohn Edward Broadbent 12605085a6SJohn Edward Broadbent #include <array> 13605085a6SJohn Edward Broadbent #include <cstddef> 14605085a6SJohn Edward Broadbent #include <span> 15605085a6SJohn Edward Broadbent #include <string_view> 16605085a6SJohn Edward Broadbent 17605085a6SJohn Edward Broadbent namespace estoraged 18605085a6SJohn Edward Broadbent { 19605085a6SJohn Edward Broadbent 20605085a6SJohn Edward Broadbent class IOCTLWrapperInterface 21605085a6SJohn Edward Broadbent { 22605085a6SJohn Edward Broadbent public: 23605085a6SJohn Edward Broadbent /** @brief Wrapper around ioctl 24605085a6SJohn Edward Broadbent * @details Used for mocking purposes. 25605085a6SJohn Edward Broadbent * 26605085a6SJohn Edward Broadbent * @param[in] devPath - File name of block device 27605085a6SJohn Edward Broadbent * @param[in] request - Device-dependent request code 28605085a6SJohn Edward Broadbent * @param[in] mmc_ioc_cmd - eMMC cmd 29605085a6SJohn Edward Broadbent */ 30605085a6SJohn Edward Broadbent virtual int doIoctl(std::string_view devPath, unsigned long request, 31605085a6SJohn Edward Broadbent struct mmc_ioc_cmd data) = 0; 32605085a6SJohn Edward Broadbent 33605085a6SJohn Edward Broadbent /** @brief Wrapper around ioctl 34605085a6SJohn Edward Broadbent * @details Used for mocking purposes. 35605085a6SJohn Edward Broadbent * 36605085a6SJohn Edward Broadbent * @param[in] devPath - File name of block device 37605085a6SJohn Edward Broadbent * @param[in] request - Device-dependent request code 38605085a6SJohn Edward Broadbent * @param[in] mmc_io_mutli_cmd - many eMMC cmd 39605085a6SJohn Edward Broadbent */ 40605085a6SJohn Edward Broadbent virtual int doIoctlMulti(std::string_view devPath, unsigned long request, 41605085a6SJohn Edward Broadbent struct mmc_io_multi_cmd_erase data) = 0; 42605085a6SJohn Edward Broadbent 43605085a6SJohn Edward Broadbent virtual ~IOCTLWrapperInterface() = default; 44605085a6SJohn Edward Broadbent IOCTLWrapperInterface() = default; 45605085a6SJohn Edward Broadbent IOCTLWrapperInterface(const IOCTLWrapperInterface&) = delete; 46605085a6SJohn Edward Broadbent IOCTLWrapperInterface& operator=(const IOCTLWrapperInterface&) = delete; 47605085a6SJohn Edward Broadbent 48605085a6SJohn Edward Broadbent IOCTLWrapperInterface(IOCTLWrapperInterface&&) = delete; 49605085a6SJohn Edward Broadbent IOCTLWrapperInterface& operator=(IOCTLWrapperInterface&&) = delete; 50605085a6SJohn Edward Broadbent }; 51605085a6SJohn Edward Broadbent 52605085a6SJohn Edward Broadbent // mockIOCTLWapper also inherits from IOCTLWrapperInterface 53605085a6SJohn Edward Broadbent class IOCTLWrapperImpl : public IOCTLWrapperInterface 54605085a6SJohn Edward Broadbent { 55605085a6SJohn Edward Broadbent public: 56605085a6SJohn Edward Broadbent int doIoctl(std::string_view devPath, unsigned long request, 57605085a6SJohn Edward Broadbent struct mmc_ioc_cmd data) override; 58605085a6SJohn Edward Broadbent int doIoctlMulti(std::string_view devPath, unsigned long request, 59605085a6SJohn Edward Broadbent struct mmc_io_multi_cmd_erase data) override; 60605085a6SJohn Edward Broadbent ~IOCTLWrapperImpl() override = default; 61605085a6SJohn Edward Broadbent IOCTLWrapperImpl() = default; 62605085a6SJohn Edward Broadbent 63605085a6SJohn Edward Broadbent IOCTLWrapperImpl(const IOCTLWrapperImpl&) = delete; 64605085a6SJohn Edward Broadbent IOCTLWrapperImpl& operator=(const IOCTLWrapperImpl&) = delete; 65605085a6SJohn Edward Broadbent 66605085a6SJohn Edward Broadbent IOCTLWrapperImpl(IOCTLWrapperImpl&&) = delete; 67605085a6SJohn Edward Broadbent IOCTLWrapperImpl& operator=(IOCTLWrapperImpl&&) = delete; 68605085a6SJohn Edward Broadbent }; 69605085a6SJohn Edward Broadbent 70605085a6SJohn Edward Broadbent class Sanitize : public Erase 71605085a6SJohn Edward Broadbent { 72605085a6SJohn Edward Broadbent public: 73d4554f2aSManojkiran Eda /** @brief Creates a sanitize erase object 74605085a6SJohn Edward Broadbent * 75605085a6SJohn Edward Broadbent * @param[in] inDevPath - the linux device path for the block device. 76605085a6SJohn Edward Broadbent * @param[in] IOCTLWrapper - This is a ioctl wrapper, it can be used for 77605085a6SJohn Edward Broadbent * testing 78605085a6SJohn Edward Broadbent */ Sanitize(std::string_view inDevPath,std::unique_ptr<IOCTLWrapperInterface> inIOCTL=std::make_unique<IOCTLWrapperImpl> ())79605085a6SJohn Edward Broadbent Sanitize(std::string_view inDevPath, 80605085a6SJohn Edward Broadbent std::unique_ptr<IOCTLWrapperInterface> inIOCTL = 81605085a6SJohn Edward Broadbent std::make_unique<IOCTLWrapperImpl>()) : 82*15b63e12SPatrick Williams Erase(inDevPath), ioctlWrapper(std::move(inIOCTL)) 83605085a6SJohn Edward Broadbent {} 84605085a6SJohn Edward Broadbent 85d4554f2aSManojkiran Eda /** @brief sanitize the drive, using eMMC specified erase commands 86605085a6SJohn Edward Broadbent * 87605085a6SJohn Edward Broadbent * param[in] driveSize - size of the drive in bytes 88605085a6SJohn Edward Broadbent */ 89605085a6SJohn Edward Broadbent void doSanitize(uint64_t driveSize); 90605085a6SJohn Edward Broadbent 91d4554f2aSManojkiran Eda /** @brief sanitize the drive, using eMMC specified erase commands 92605085a6SJohn Edward Broadbent * This function uses the built in utils to call sanitize 93605085a6SJohn Edward Broadbent */ doSanitize()94605085a6SJohn Edward Broadbent void doSanitize() 95605085a6SJohn Edward Broadbent { 965d799bb9SJohn Edward Broadbent doSanitize(util::findSizeOfBlockDevice(devPath)); 97605085a6SJohn Edward Broadbent } 98605085a6SJohn Edward Broadbent 99605085a6SJohn Edward Broadbent private: 100605085a6SJohn Edward Broadbent /* Wrapper for ioctl*/ 101605085a6SJohn Edward Broadbent std::unique_ptr<IOCTLWrapperInterface> ioctlWrapper; 102605085a6SJohn Edward Broadbent 103605085a6SJohn Edward Broadbent /** @brief uses the eMMC defined sanitize command, it is not the same as 104605085a6SJohn Edward Broadbent * vendor_sanitize */ 105605085a6SJohn Edward Broadbent void emmcSanitize(); 106605085a6SJohn Edward Broadbent 107605085a6SJohn Edward Broadbent /** @brief uses the eMMC defined erase command 108605085a6SJohn Edward Broadbent * 109605085a6SJohn Edward Broadbent * param[in] driveSize - size of the drive in bytes 110605085a6SJohn Edward Broadbent */ 111605085a6SJohn Edward Broadbent void emmcErase(uint64_t driveSize); 112605085a6SJohn Edward Broadbent }; 113605085a6SJohn Edward Broadbent 114605085a6SJohn Edward Broadbent // can't use the real mmc_ioc_multi_cmd b/c of zero length array 115605085a6SJohn Edward Broadbent // see uapi/linux/mmc/ioctl.h 116605085a6SJohn Edward Broadbent struct mmc_io_multi_cmd_erase 117605085a6SJohn Edward Broadbent { 118605085a6SJohn Edward Broadbent uint64_t num_of_cmds; 119605085a6SJohn Edward Broadbent struct mmc_ioc_cmd cmds[3]; // NOLINT (c arrays usage) 120605085a6SJohn Edward Broadbent }; 121605085a6SJohn Edward Broadbent 122605085a6SJohn Edward Broadbent } // namespace estoraged 123