2
0

usb-msd.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. /*
  2. * USB Mass Storage Device emulation
  3. *
  4. * Copyright (c) 2006 CodeSourcery.
  5. * Written by Paul Brook
  6. *
  7. * This code is licensed under the LGPL.
  8. */
  9. #include "qemu-common.h"
  10. #include "qemu-option.h"
  11. #include "qemu-config.h"
  12. #include "usb.h"
  13. #include "usb-desc.h"
  14. #include "scsi.h"
  15. #include "console.h"
  16. #include "monitor.h"
  17. #include "sysemu.h"
  18. #include "blockdev.h"
  19. //#define DEBUG_MSD
  20. #ifdef DEBUG_MSD
  21. #define DPRINTF(fmt, ...) \
  22. do { printf("usb-msd: " fmt , ## __VA_ARGS__); } while (0)
  23. #else
  24. #define DPRINTF(fmt, ...) do {} while(0)
  25. #endif
  26. /* USB requests. */
  27. #define MassStorageReset 0xff
  28. #define GetMaxLun 0xfe
  29. enum USBMSDMode {
  30. USB_MSDM_CBW, /* Command Block. */
  31. USB_MSDM_DATAOUT, /* Transfer data to device. */
  32. USB_MSDM_DATAIN, /* Transfer data from device. */
  33. USB_MSDM_CSW /* Command Status. */
  34. };
  35. typedef struct {
  36. USBDevice dev;
  37. enum USBMSDMode mode;
  38. uint32_t scsi_len;
  39. uint8_t *scsi_buf;
  40. uint32_t usb_len;
  41. uint8_t *usb_buf;
  42. uint32_t data_len;
  43. uint32_t residue;
  44. uint32_t tag;
  45. SCSIRequest *req;
  46. SCSIBus bus;
  47. BlockConf conf;
  48. char *serial;
  49. SCSIDevice *scsi_dev;
  50. uint32_t removable;
  51. int result;
  52. /* For async completion. */
  53. USBPacket *packet;
  54. } MSDState;
  55. struct usb_msd_cbw {
  56. uint32_t sig;
  57. uint32_t tag;
  58. uint32_t data_len;
  59. uint8_t flags;
  60. uint8_t lun;
  61. uint8_t cmd_len;
  62. uint8_t cmd[16];
  63. };
  64. struct usb_msd_csw {
  65. uint32_t sig;
  66. uint32_t tag;
  67. uint32_t residue;
  68. uint8_t status;
  69. };
  70. enum {
  71. STR_MANUFACTURER = 1,
  72. STR_PRODUCT,
  73. STR_SERIALNUMBER,
  74. STR_CONFIG_FULL,
  75. STR_CONFIG_HIGH,
  76. };
  77. static const USBDescStrings desc_strings = {
  78. [STR_MANUFACTURER] = "QEMU " QEMU_VERSION,
  79. [STR_PRODUCT] = "QEMU USB HARDDRIVE",
  80. [STR_SERIALNUMBER] = "1",
  81. [STR_CONFIG_FULL] = "Full speed config (usb 1.1)",
  82. [STR_CONFIG_HIGH] = "High speed config (usb 2.0)",
  83. };
  84. static const USBDescIface desc_iface_full = {
  85. .bInterfaceNumber = 0,
  86. .bNumEndpoints = 2,
  87. .bInterfaceClass = USB_CLASS_MASS_STORAGE,
  88. .bInterfaceSubClass = 0x06, /* SCSI */
  89. .bInterfaceProtocol = 0x50, /* Bulk */
  90. .eps = (USBDescEndpoint[]) {
  91. {
  92. .bEndpointAddress = USB_DIR_IN | 0x01,
  93. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  94. .wMaxPacketSize = 64,
  95. },{
  96. .bEndpointAddress = USB_DIR_OUT | 0x02,
  97. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  98. .wMaxPacketSize = 64,
  99. },
  100. }
  101. };
  102. static const USBDescDevice desc_device_full = {
  103. .bcdUSB = 0x0200,
  104. .bMaxPacketSize0 = 8,
  105. .bNumConfigurations = 1,
  106. .confs = (USBDescConfig[]) {
  107. {
  108. .bNumInterfaces = 1,
  109. .bConfigurationValue = 1,
  110. .iConfiguration = STR_CONFIG_FULL,
  111. .bmAttributes = 0xc0,
  112. .nif = 1,
  113. .ifs = &desc_iface_full,
  114. },
  115. },
  116. };
  117. static const USBDescIface desc_iface_high = {
  118. .bInterfaceNumber = 0,
  119. .bNumEndpoints = 2,
  120. .bInterfaceClass = USB_CLASS_MASS_STORAGE,
  121. .bInterfaceSubClass = 0x06, /* SCSI */
  122. .bInterfaceProtocol = 0x50, /* Bulk */
  123. .eps = (USBDescEndpoint[]) {
  124. {
  125. .bEndpointAddress = USB_DIR_IN | 0x01,
  126. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  127. .wMaxPacketSize = 512,
  128. },{
  129. .bEndpointAddress = USB_DIR_OUT | 0x02,
  130. .bmAttributes = USB_ENDPOINT_XFER_BULK,
  131. .wMaxPacketSize = 512,
  132. },
  133. }
  134. };
  135. static const USBDescDevice desc_device_high = {
  136. .bcdUSB = 0x0200,
  137. .bMaxPacketSize0 = 64,
  138. .bNumConfigurations = 1,
  139. .confs = (USBDescConfig[]) {
  140. {
  141. .bNumInterfaces = 1,
  142. .bConfigurationValue = 1,
  143. .iConfiguration = STR_CONFIG_HIGH,
  144. .bmAttributes = 0xc0,
  145. .nif = 1,
  146. .ifs = &desc_iface_high,
  147. },
  148. },
  149. };
  150. static const USBDesc desc = {
  151. .id = {
  152. .idVendor = 0,
  153. .idProduct = 0,
  154. .bcdDevice = 0,
  155. .iManufacturer = STR_MANUFACTURER,
  156. .iProduct = STR_PRODUCT,
  157. .iSerialNumber = STR_SERIALNUMBER,
  158. },
  159. .full = &desc_device_full,
  160. .high = &desc_device_high,
  161. .str = desc_strings,
  162. };
  163. static void usb_msd_copy_data(MSDState *s)
  164. {
  165. uint32_t len;
  166. len = s->usb_len;
  167. if (len > s->scsi_len)
  168. len = s->scsi_len;
  169. if (s->mode == USB_MSDM_DATAIN) {
  170. memcpy(s->usb_buf, s->scsi_buf, len);
  171. } else {
  172. memcpy(s->scsi_buf, s->usb_buf, len);
  173. }
  174. s->usb_len -= len;
  175. s->scsi_len -= len;
  176. s->usb_buf += len;
  177. s->scsi_buf += len;
  178. s->data_len -= len;
  179. if (s->scsi_len == 0 || s->data_len == 0) {
  180. scsi_req_continue(s->req);
  181. }
  182. }
  183. static void usb_msd_send_status(MSDState *s, USBPacket *p)
  184. {
  185. struct usb_msd_csw csw;
  186. int len;
  187. csw.sig = cpu_to_le32(0x53425355);
  188. csw.tag = cpu_to_le32(s->tag);
  189. csw.residue = s->residue;
  190. csw.status = s->result;
  191. len = MIN(sizeof(csw), p->len);
  192. memcpy(p->data, &csw, len);
  193. }
  194. static void usb_msd_transfer_data(SCSIRequest *req, uint32_t len)
  195. {
  196. MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent);
  197. USBPacket *p = s->packet;
  198. assert((s->mode == USB_MSDM_DATAOUT) == (req->cmd.mode == SCSI_XFER_TO_DEV));
  199. s->scsi_len = len;
  200. s->scsi_buf = scsi_req_get_buf(req);
  201. if (p) {
  202. usb_msd_copy_data(s);
  203. if (s->packet && s->usb_len == 0) {
  204. /* Set s->packet to NULL before calling usb_packet_complete
  205. because another request may be issued before
  206. usb_packet_complete returns. */
  207. DPRINTF("Packet complete %p\n", p);
  208. s->packet = NULL;
  209. usb_packet_complete(&s->dev, p);
  210. }
  211. }
  212. }
  213. static void usb_msd_command_complete(SCSIRequest *req, uint32_t status)
  214. {
  215. MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent);
  216. USBPacket *p = s->packet;
  217. DPRINTF("Command complete %d\n", status);
  218. s->residue = s->data_len;
  219. s->result = status != 0;
  220. if (s->packet) {
  221. if (s->data_len == 0 && s->mode == USB_MSDM_DATAOUT) {
  222. /* A deferred packet with no write data remaining must be
  223. the status read packet. */
  224. usb_msd_send_status(s, p);
  225. s->mode = USB_MSDM_CBW;
  226. } else {
  227. if (s->data_len) {
  228. s->data_len -= s->usb_len;
  229. if (s->mode == USB_MSDM_DATAIN) {
  230. memset(s->usb_buf, 0, s->usb_len);
  231. }
  232. s->usb_len = 0;
  233. }
  234. if (s->data_len == 0) {
  235. s->mode = USB_MSDM_CSW;
  236. }
  237. }
  238. s->packet = NULL;
  239. usb_packet_complete(&s->dev, p);
  240. } else if (s->data_len == 0) {
  241. s->mode = USB_MSDM_CSW;
  242. }
  243. scsi_req_unref(req);
  244. s->req = NULL;
  245. }
  246. static void usb_msd_request_cancelled(SCSIRequest *req)
  247. {
  248. MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent);
  249. if (req == s->req) {
  250. scsi_req_unref(s->req);
  251. s->req = NULL;
  252. s->packet = NULL;
  253. s->scsi_len = 0;
  254. }
  255. }
  256. static void usb_msd_handle_reset(USBDevice *dev)
  257. {
  258. MSDState *s = (MSDState *)dev;
  259. DPRINTF("Reset\n");
  260. s->mode = USB_MSDM_CBW;
  261. }
  262. static int usb_msd_handle_control(USBDevice *dev, USBPacket *p,
  263. int request, int value, int index, int length, uint8_t *data)
  264. {
  265. MSDState *s = (MSDState *)dev;
  266. int ret;
  267. ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
  268. if (ret >= 0) {
  269. return ret;
  270. }
  271. ret = 0;
  272. switch (request) {
  273. case DeviceRequest | USB_REQ_GET_INTERFACE:
  274. data[0] = 0;
  275. ret = 1;
  276. break;
  277. case DeviceOutRequest | USB_REQ_SET_INTERFACE:
  278. ret = 0;
  279. break;
  280. case EndpointOutRequest | USB_REQ_CLEAR_FEATURE:
  281. ret = 0;
  282. break;
  283. case InterfaceOutRequest | USB_REQ_SET_INTERFACE:
  284. ret = 0;
  285. break;
  286. /* Class specific requests. */
  287. case ClassInterfaceOutRequest | MassStorageReset:
  288. /* Reset state ready for the next CBW. */
  289. s->mode = USB_MSDM_CBW;
  290. ret = 0;
  291. break;
  292. case ClassInterfaceRequest | GetMaxLun:
  293. data[0] = 0;
  294. ret = 1;
  295. break;
  296. default:
  297. ret = USB_RET_STALL;
  298. break;
  299. }
  300. return ret;
  301. }
  302. static void usb_msd_cancel_io(USBDevice *dev, USBPacket *p)
  303. {
  304. MSDState *s = DO_UPCAST(MSDState, dev, dev);
  305. scsi_req_cancel(s->req);
  306. }
  307. static int usb_msd_handle_data(USBDevice *dev, USBPacket *p)
  308. {
  309. MSDState *s = (MSDState *)dev;
  310. int ret = 0;
  311. struct usb_msd_cbw cbw;
  312. uint8_t devep = p->devep;
  313. uint8_t *data = p->data;
  314. int len = p->len;
  315. switch (p->pid) {
  316. case USB_TOKEN_OUT:
  317. if (devep != 2)
  318. goto fail;
  319. switch (s->mode) {
  320. case USB_MSDM_CBW:
  321. if (len != 31) {
  322. fprintf(stderr, "usb-msd: Bad CBW size");
  323. goto fail;
  324. }
  325. memcpy(&cbw, data, 31);
  326. if (le32_to_cpu(cbw.sig) != 0x43425355) {
  327. fprintf(stderr, "usb-msd: Bad signature %08x\n",
  328. le32_to_cpu(cbw.sig));
  329. goto fail;
  330. }
  331. DPRINTF("Command on LUN %d\n", cbw.lun);
  332. if (cbw.lun != 0) {
  333. fprintf(stderr, "usb-msd: Bad LUN %d\n", cbw.lun);
  334. goto fail;
  335. }
  336. s->tag = le32_to_cpu(cbw.tag);
  337. s->data_len = le32_to_cpu(cbw.data_len);
  338. if (s->data_len == 0) {
  339. s->mode = USB_MSDM_CSW;
  340. } else if (cbw.flags & 0x80) {
  341. s->mode = USB_MSDM_DATAIN;
  342. } else {
  343. s->mode = USB_MSDM_DATAOUT;
  344. }
  345. DPRINTF("Command tag 0x%x flags %08x len %d data %d\n",
  346. s->tag, cbw.flags, cbw.cmd_len, s->data_len);
  347. s->residue = 0;
  348. s->scsi_len = 0;
  349. s->req = scsi_req_new(s->scsi_dev, s->tag, 0, NULL);
  350. scsi_req_enqueue(s->req, cbw.cmd);
  351. /* ??? Should check that USB and SCSI data transfer
  352. directions match. */
  353. if (s->mode != USB_MSDM_CSW && s->residue == 0) {
  354. scsi_req_continue(s->req);
  355. }
  356. ret = len;
  357. break;
  358. case USB_MSDM_DATAOUT:
  359. DPRINTF("Data out %d/%d\n", len, s->data_len);
  360. if (len > s->data_len)
  361. goto fail;
  362. s->usb_buf = data;
  363. s->usb_len = len;
  364. if (s->scsi_len) {
  365. usb_msd_copy_data(s);
  366. }
  367. if (s->residue && s->usb_len) {
  368. s->data_len -= s->usb_len;
  369. if (s->data_len == 0)
  370. s->mode = USB_MSDM_CSW;
  371. s->usb_len = 0;
  372. }
  373. if (s->usb_len) {
  374. DPRINTF("Deferring packet %p\n", p);
  375. s->packet = p;
  376. ret = USB_RET_ASYNC;
  377. } else {
  378. ret = len;
  379. }
  380. break;
  381. default:
  382. DPRINTF("Unexpected write (len %d)\n", len);
  383. goto fail;
  384. }
  385. break;
  386. case USB_TOKEN_IN:
  387. if (devep != 1)
  388. goto fail;
  389. switch (s->mode) {
  390. case USB_MSDM_DATAOUT:
  391. if (s->data_len != 0 || len < 13)
  392. goto fail;
  393. /* Waiting for SCSI write to complete. */
  394. s->packet = p;
  395. ret = USB_RET_ASYNC;
  396. break;
  397. case USB_MSDM_CSW:
  398. DPRINTF("Command status %d tag 0x%x, len %d\n",
  399. s->result, s->tag, len);
  400. if (len < 13)
  401. goto fail;
  402. usb_msd_send_status(s, p);
  403. s->mode = USB_MSDM_CBW;
  404. ret = 13;
  405. break;
  406. case USB_MSDM_DATAIN:
  407. DPRINTF("Data in %d/%d, scsi_len %d\n", len, s->data_len, s->scsi_len);
  408. if (len > s->data_len)
  409. len = s->data_len;
  410. s->usb_buf = data;
  411. s->usb_len = len;
  412. if (s->scsi_len) {
  413. usb_msd_copy_data(s);
  414. }
  415. if (s->residue && s->usb_len) {
  416. s->data_len -= s->usb_len;
  417. memset(s->usb_buf, 0, s->usb_len);
  418. if (s->data_len == 0)
  419. s->mode = USB_MSDM_CSW;
  420. s->usb_len = 0;
  421. }
  422. if (s->usb_len) {
  423. DPRINTF("Deferring packet %p\n", p);
  424. s->packet = p;
  425. ret = USB_RET_ASYNC;
  426. } else {
  427. ret = len;
  428. }
  429. break;
  430. default:
  431. DPRINTF("Unexpected read (len %d)\n", len);
  432. goto fail;
  433. }
  434. break;
  435. default:
  436. DPRINTF("Bad token\n");
  437. fail:
  438. ret = USB_RET_STALL;
  439. break;
  440. }
  441. return ret;
  442. }
  443. static void usb_msd_password_cb(void *opaque, int err)
  444. {
  445. MSDState *s = opaque;
  446. if (!err)
  447. err = usb_device_attach(&s->dev);
  448. if (err)
  449. qdev_unplug(&s->dev.qdev);
  450. }
  451. static const struct SCSIBusOps usb_msd_scsi_ops = {
  452. .transfer_data = usb_msd_transfer_data,
  453. .complete = usb_msd_command_complete,
  454. .cancel = usb_msd_request_cancelled
  455. };
  456. static int usb_msd_initfn(USBDevice *dev)
  457. {
  458. MSDState *s = DO_UPCAST(MSDState, dev, dev);
  459. BlockDriverState *bs = s->conf.bs;
  460. DriveInfo *dinfo;
  461. if (!bs) {
  462. error_report("usb-msd: drive property not set");
  463. return -1;
  464. }
  465. /*
  466. * Hack alert: this pretends to be a block device, but it's really
  467. * a SCSI bus that can serve only a single device, which it
  468. * creates automatically. But first it needs to detach from its
  469. * blockdev, or else scsi_bus_legacy_add_drive() dies when it
  470. * attaches again.
  471. *
  472. * The hack is probably a bad idea.
  473. */
  474. bdrv_detach(bs, &s->dev.qdev);
  475. s->conf.bs = NULL;
  476. if (!s->serial) {
  477. /* try to fall back to value set with legacy -drive serial=... */
  478. dinfo = drive_get_by_blockdev(bs);
  479. if (*dinfo->serial) {
  480. s->serial = strdup(dinfo->serial);
  481. }
  482. }
  483. if (s->serial) {
  484. usb_desc_set_string(dev, STR_SERIALNUMBER, s->serial);
  485. }
  486. usb_desc_init(dev);
  487. scsi_bus_new(&s->bus, &s->dev.qdev, 0, 1, &usb_msd_scsi_ops);
  488. s->scsi_dev = scsi_bus_legacy_add_drive(&s->bus, bs, 0, !!s->removable);
  489. if (!s->scsi_dev) {
  490. return -1;
  491. }
  492. s->bus.qbus.allow_hotplug = 0;
  493. usb_msd_handle_reset(dev);
  494. if (bdrv_key_required(bs)) {
  495. if (cur_mon) {
  496. monitor_read_bdrv_key_start(cur_mon, bs, usb_msd_password_cb, s);
  497. s->dev.auto_attach = 0;
  498. } else {
  499. autostart = 0;
  500. }
  501. }
  502. add_boot_device_path(s->conf.bootindex, &dev->qdev, "/disk@0,0");
  503. return 0;
  504. }
  505. static USBDevice *usb_msd_init(const char *filename)
  506. {
  507. static int nr=0;
  508. char id[8];
  509. QemuOpts *opts;
  510. DriveInfo *dinfo;
  511. USBDevice *dev;
  512. const char *p1;
  513. char fmt[32];
  514. /* parse -usbdevice disk: syntax into drive opts */
  515. snprintf(id, sizeof(id), "usb%d", nr++);
  516. opts = qemu_opts_create(qemu_find_opts("drive"), id, 0);
  517. p1 = strchr(filename, ':');
  518. if (p1++) {
  519. const char *p2;
  520. if (strstart(filename, "format=", &p2)) {
  521. int len = MIN(p1 - p2, sizeof(fmt));
  522. pstrcpy(fmt, len, p2);
  523. qemu_opt_set(opts, "format", fmt);
  524. } else if (*filename != ':') {
  525. printf("unrecognized USB mass-storage option %s\n", filename);
  526. return NULL;
  527. }
  528. filename = p1;
  529. }
  530. if (!*filename) {
  531. printf("block device specification needed\n");
  532. return NULL;
  533. }
  534. qemu_opt_set(opts, "file", filename);
  535. qemu_opt_set(opts, "if", "none");
  536. /* create host drive */
  537. dinfo = drive_init(opts, 0);
  538. if (!dinfo) {
  539. qemu_opts_del(opts);
  540. return NULL;
  541. }
  542. /* create guest device */
  543. dev = usb_create(NULL /* FIXME */, "usb-storage");
  544. if (!dev) {
  545. return NULL;
  546. }
  547. if (qdev_prop_set_drive(&dev->qdev, "drive", dinfo->bdrv) < 0) {
  548. qdev_free(&dev->qdev);
  549. return NULL;
  550. }
  551. if (qdev_init(&dev->qdev) < 0)
  552. return NULL;
  553. return dev;
  554. }
  555. static struct USBDeviceInfo msd_info = {
  556. .product_desc = "QEMU USB MSD",
  557. .qdev.name = "usb-storage",
  558. .qdev.fw_name = "storage",
  559. .qdev.size = sizeof(MSDState),
  560. .usb_desc = &desc,
  561. .init = usb_msd_initfn,
  562. .handle_packet = usb_generic_handle_packet,
  563. .cancel_packet = usb_msd_cancel_io,
  564. .handle_attach = usb_desc_attach,
  565. .handle_reset = usb_msd_handle_reset,
  566. .handle_control = usb_msd_handle_control,
  567. .handle_data = usb_msd_handle_data,
  568. .usbdevice_name = "disk",
  569. .usbdevice_init = usb_msd_init,
  570. .qdev.props = (Property[]) {
  571. DEFINE_BLOCK_PROPERTIES(MSDState, conf),
  572. DEFINE_PROP_STRING("serial", MSDState, serial),
  573. DEFINE_PROP_BIT("removable", MSDState, removable, 0, false),
  574. DEFINE_PROP_END_OF_LIST(),
  575. },
  576. };
  577. static void usb_msd_register_devices(void)
  578. {
  579. usb_qdev_register(&msd_info);
  580. }
  581. device_init(usb_msd_register_devices)