2
0

usb-msd.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576
  1. /*
  2. * USB Mass Storage Device emulation
  3. *
  4. * Copyright (c) 2006 CodeSourcery.
  5. * Written by Paul Brook
  6. *
  7. * This code is licenced under the LGPL.
  8. */
  9. #include "qemu-common.h"
  10. #include "usb.h"
  11. #include "block.h"
  12. #include "scsi-disk.h"
  13. #include "console.h"
  14. //#define DEBUG_MSD
  15. #ifdef DEBUG_MSD
  16. #define DPRINTF(fmt, args...) \
  17. do { printf("usb-msd: " fmt , ##args); } while (0)
  18. #else
  19. #define DPRINTF(fmt, args...) do {} while(0)
  20. #endif
  21. /* USB requests. */
  22. #define MassStorageReset 0xff
  23. #define GetMaxLun 0xfe
  24. enum USBMSDMode {
  25. USB_MSDM_CBW, /* Command Block. */
  26. USB_MSDM_DATAOUT, /* Tranfer data to device. */
  27. USB_MSDM_DATAIN, /* Transfer data from device. */
  28. USB_MSDM_CSW /* Command Status. */
  29. };
  30. typedef struct {
  31. USBDevice dev;
  32. enum USBMSDMode mode;
  33. uint32_t scsi_len;
  34. uint8_t *scsi_buf;
  35. uint32_t usb_len;
  36. uint8_t *usb_buf;
  37. uint32_t data_len;
  38. uint32_t residue;
  39. uint32_t tag;
  40. BlockDriverState *bs;
  41. SCSIDevice *scsi_dev;
  42. int result;
  43. /* For async completion. */
  44. USBPacket *packet;
  45. } MSDState;
  46. struct usb_msd_cbw {
  47. uint32_t sig;
  48. uint32_t tag;
  49. uint32_t data_len;
  50. uint8_t flags;
  51. uint8_t lun;
  52. uint8_t cmd_len;
  53. uint8_t cmd[16];
  54. };
  55. struct usb_msd_csw {
  56. uint32_t sig;
  57. uint32_t tag;
  58. uint32_t residue;
  59. uint8_t status;
  60. };
  61. static const uint8_t qemu_msd_dev_descriptor[] = {
  62. 0x12, /* u8 bLength; */
  63. 0x01, /* u8 bDescriptorType; Device */
  64. 0x00, 0x01, /* u16 bcdUSB; v1.0 */
  65. 0x00, /* u8 bDeviceClass; */
  66. 0x00, /* u8 bDeviceSubClass; */
  67. 0x00, /* u8 bDeviceProtocol; [ low/full speeds only ] */
  68. 0x08, /* u8 bMaxPacketSize0; 8 Bytes */
  69. /* Vendor and product id are arbitrary. */
  70. 0x00, 0x00, /* u16 idVendor; */
  71. 0x00, 0x00, /* u16 idProduct; */
  72. 0x00, 0x00, /* u16 bcdDevice */
  73. 0x01, /* u8 iManufacturer; */
  74. 0x02, /* u8 iProduct; */
  75. 0x03, /* u8 iSerialNumber; */
  76. 0x01 /* u8 bNumConfigurations; */
  77. };
  78. static const uint8_t qemu_msd_config_descriptor[] = {
  79. /* one configuration */
  80. 0x09, /* u8 bLength; */
  81. 0x02, /* u8 bDescriptorType; Configuration */
  82. 0x20, 0x00, /* u16 wTotalLength; */
  83. 0x01, /* u8 bNumInterfaces; (1) */
  84. 0x01, /* u8 bConfigurationValue; */
  85. 0x00, /* u8 iConfiguration; */
  86. 0xc0, /* u8 bmAttributes;
  87. Bit 7: must be set,
  88. 6: Self-powered,
  89. 5: Remote wakeup,
  90. 4..0: resvd */
  91. 0x00, /* u8 MaxPower; */
  92. /* one interface */
  93. 0x09, /* u8 if_bLength; */
  94. 0x04, /* u8 if_bDescriptorType; Interface */
  95. 0x00, /* u8 if_bInterfaceNumber; */
  96. 0x00, /* u8 if_bAlternateSetting; */
  97. 0x02, /* u8 if_bNumEndpoints; */
  98. 0x08, /* u8 if_bInterfaceClass; MASS STORAGE */
  99. 0x06, /* u8 if_bInterfaceSubClass; SCSI */
  100. 0x50, /* u8 if_bInterfaceProtocol; Bulk Only */
  101. 0x00, /* u8 if_iInterface; */
  102. /* Bulk-In endpoint */
  103. 0x07, /* u8 ep_bLength; */
  104. 0x05, /* u8 ep_bDescriptorType; Endpoint */
  105. 0x81, /* u8 ep_bEndpointAddress; IN Endpoint 1 */
  106. 0x02, /* u8 ep_bmAttributes; Bulk */
  107. 0x40, 0x00, /* u16 ep_wMaxPacketSize; */
  108. 0x00, /* u8 ep_bInterval; */
  109. /* Bulk-Out endpoint */
  110. 0x07, /* u8 ep_bLength; */
  111. 0x05, /* u8 ep_bDescriptorType; Endpoint */
  112. 0x02, /* u8 ep_bEndpointAddress; OUT Endpoint 2 */
  113. 0x02, /* u8 ep_bmAttributes; Bulk */
  114. 0x40, 0x00, /* u16 ep_wMaxPacketSize; */
  115. 0x00 /* u8 ep_bInterval; */
  116. };
  117. static void usb_msd_copy_data(MSDState *s)
  118. {
  119. uint32_t len;
  120. len = s->usb_len;
  121. if (len > s->scsi_len)
  122. len = s->scsi_len;
  123. if (s->mode == USB_MSDM_DATAIN) {
  124. memcpy(s->usb_buf, s->scsi_buf, len);
  125. } else {
  126. memcpy(s->scsi_buf, s->usb_buf, len);
  127. }
  128. s->usb_len -= len;
  129. s->scsi_len -= len;
  130. s->usb_buf += len;
  131. s->scsi_buf += len;
  132. s->data_len -= len;
  133. if (s->scsi_len == 0) {
  134. if (s->mode == USB_MSDM_DATAIN) {
  135. s->scsi_dev->read_data(s->scsi_dev, s->tag);
  136. } else if (s->mode == USB_MSDM_DATAOUT) {
  137. s->scsi_dev->write_data(s->scsi_dev, s->tag);
  138. }
  139. }
  140. }
  141. static void usb_msd_send_status(MSDState *s)
  142. {
  143. struct usb_msd_csw csw;
  144. csw.sig = cpu_to_le32(0x53425355);
  145. csw.tag = cpu_to_le32(s->tag);
  146. csw.residue = s->residue;
  147. csw.status = s->result;
  148. memcpy(s->usb_buf, &csw, 13);
  149. }
  150. static void usb_msd_command_complete(void *opaque, int reason, uint32_t tag,
  151. uint32_t arg)
  152. {
  153. MSDState *s = (MSDState *)opaque;
  154. USBPacket *p = s->packet;
  155. if (tag != s->tag) {
  156. fprintf(stderr, "usb-msd: Unexpected SCSI Tag 0x%x\n", tag);
  157. }
  158. if (reason == SCSI_REASON_DONE) {
  159. DPRINTF("Command complete %d\n", arg);
  160. s->residue = s->data_len;
  161. s->result = arg != 0;
  162. if (s->packet) {
  163. if (s->data_len == 0 && s->mode == USB_MSDM_DATAOUT) {
  164. /* A deferred packet with no write data remaining must be
  165. the status read packet. */
  166. usb_msd_send_status(s);
  167. s->mode = USB_MSDM_CBW;
  168. } else {
  169. if (s->data_len) {
  170. s->data_len -= s->usb_len;
  171. if (s->mode == USB_MSDM_DATAIN)
  172. memset(s->usb_buf, 0, s->usb_len);
  173. s->usb_len = 0;
  174. }
  175. if (s->data_len == 0)
  176. s->mode = USB_MSDM_CSW;
  177. }
  178. s->packet = NULL;
  179. usb_packet_complete(p);
  180. } else if (s->data_len == 0) {
  181. s->mode = USB_MSDM_CSW;
  182. }
  183. return;
  184. }
  185. s->scsi_len = arg;
  186. s->scsi_buf = s->scsi_dev->get_buf(s->scsi_dev, tag);
  187. if (p) {
  188. usb_msd_copy_data(s);
  189. if (s->usb_len == 0) {
  190. /* Set s->packet to NULL before calling usb_packet_complete
  191. because annother request may be issued before
  192. usb_packet_complete returns. */
  193. DPRINTF("Packet complete %p\n", p);
  194. s->packet = NULL;
  195. usb_packet_complete(p);
  196. }
  197. }
  198. }
  199. static void usb_msd_handle_reset(USBDevice *dev)
  200. {
  201. MSDState *s = (MSDState *)dev;
  202. DPRINTF("Reset\n");
  203. s->mode = USB_MSDM_CBW;
  204. }
  205. static int usb_msd_handle_control(USBDevice *dev, int request, int value,
  206. int index, int length, uint8_t *data)
  207. {
  208. MSDState *s = (MSDState *)dev;
  209. int ret = 0;
  210. switch (request) {
  211. case DeviceRequest | USB_REQ_GET_STATUS:
  212. data[0] = (1 << USB_DEVICE_SELF_POWERED) |
  213. (dev->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP);
  214. data[1] = 0x00;
  215. ret = 2;
  216. break;
  217. case DeviceOutRequest | USB_REQ_CLEAR_FEATURE:
  218. if (value == USB_DEVICE_REMOTE_WAKEUP) {
  219. dev->remote_wakeup = 0;
  220. } else {
  221. goto fail;
  222. }
  223. ret = 0;
  224. break;
  225. case DeviceOutRequest | USB_REQ_SET_FEATURE:
  226. if (value == USB_DEVICE_REMOTE_WAKEUP) {
  227. dev->remote_wakeup = 1;
  228. } else {
  229. goto fail;
  230. }
  231. ret = 0;
  232. break;
  233. case DeviceOutRequest | USB_REQ_SET_ADDRESS:
  234. dev->addr = value;
  235. ret = 0;
  236. break;
  237. case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
  238. switch(value >> 8) {
  239. case USB_DT_DEVICE:
  240. memcpy(data, qemu_msd_dev_descriptor,
  241. sizeof(qemu_msd_dev_descriptor));
  242. ret = sizeof(qemu_msd_dev_descriptor);
  243. break;
  244. case USB_DT_CONFIG:
  245. memcpy(data, qemu_msd_config_descriptor,
  246. sizeof(qemu_msd_config_descriptor));
  247. ret = sizeof(qemu_msd_config_descriptor);
  248. break;
  249. case USB_DT_STRING:
  250. switch(value & 0xff) {
  251. case 0:
  252. /* language ids */
  253. data[0] = 4;
  254. data[1] = 3;
  255. data[2] = 0x09;
  256. data[3] = 0x04;
  257. ret = 4;
  258. break;
  259. case 1:
  260. /* vendor description */
  261. ret = set_usb_string(data, "QEMU " QEMU_VERSION);
  262. break;
  263. case 2:
  264. /* product description */
  265. ret = set_usb_string(data, "QEMU USB HARDDRIVE");
  266. break;
  267. case 3:
  268. /* serial number */
  269. ret = set_usb_string(data, "1");
  270. break;
  271. default:
  272. goto fail;
  273. }
  274. break;
  275. default:
  276. goto fail;
  277. }
  278. break;
  279. case DeviceRequest | USB_REQ_GET_CONFIGURATION:
  280. data[0] = 1;
  281. ret = 1;
  282. break;
  283. case DeviceOutRequest | USB_REQ_SET_CONFIGURATION:
  284. ret = 0;
  285. break;
  286. case DeviceRequest | USB_REQ_GET_INTERFACE:
  287. data[0] = 0;
  288. ret = 1;
  289. break;
  290. case DeviceOutRequest | USB_REQ_SET_INTERFACE:
  291. ret = 0;
  292. break;
  293. case EndpointOutRequest | USB_REQ_CLEAR_FEATURE:
  294. if (value == 0 && index != 0x81) { /* clear ep halt */
  295. goto fail;
  296. }
  297. ret = 0;
  298. break;
  299. /* Class specific requests. */
  300. case MassStorageReset:
  301. /* Reset state ready for the next CBW. */
  302. s->mode = USB_MSDM_CBW;
  303. ret = 0;
  304. break;
  305. case GetMaxLun:
  306. data[0] = 0;
  307. ret = 1;
  308. break;
  309. default:
  310. fail:
  311. ret = USB_RET_STALL;
  312. break;
  313. }
  314. return ret;
  315. }
  316. static void usb_msd_cancel_io(USBPacket *p, void *opaque)
  317. {
  318. MSDState *s = opaque;
  319. s->scsi_dev->cancel_io(s->scsi_dev, s->tag);
  320. s->packet = NULL;
  321. s->scsi_len = 0;
  322. }
  323. static int usb_msd_handle_data(USBDevice *dev, USBPacket *p)
  324. {
  325. MSDState *s = (MSDState *)dev;
  326. int ret = 0;
  327. struct usb_msd_cbw cbw;
  328. uint8_t devep = p->devep;
  329. uint8_t *data = p->data;
  330. int len = p->len;
  331. switch (p->pid) {
  332. case USB_TOKEN_OUT:
  333. if (devep != 2)
  334. goto fail;
  335. switch (s->mode) {
  336. case USB_MSDM_CBW:
  337. if (len != 31) {
  338. fprintf(stderr, "usb-msd: Bad CBW size");
  339. goto fail;
  340. }
  341. memcpy(&cbw, data, 31);
  342. if (le32_to_cpu(cbw.sig) != 0x43425355) {
  343. fprintf(stderr, "usb-msd: Bad signature %08x\n",
  344. le32_to_cpu(cbw.sig));
  345. goto fail;
  346. }
  347. DPRINTF("Command on LUN %d\n", cbw.lun);
  348. if (cbw.lun != 0) {
  349. fprintf(stderr, "usb-msd: Bad LUN %d\n", cbw.lun);
  350. goto fail;
  351. }
  352. s->tag = le32_to_cpu(cbw.tag);
  353. s->data_len = le32_to_cpu(cbw.data_len);
  354. if (s->data_len == 0) {
  355. s->mode = USB_MSDM_CSW;
  356. } else if (cbw.flags & 0x80) {
  357. s->mode = USB_MSDM_DATAIN;
  358. } else {
  359. s->mode = USB_MSDM_DATAOUT;
  360. }
  361. DPRINTF("Command tag 0x%x flags %08x len %d data %d\n",
  362. s->tag, cbw.flags, cbw.cmd_len, s->data_len);
  363. s->residue = 0;
  364. s->scsi_dev->send_command(s->scsi_dev, s->tag, cbw.cmd, 0);
  365. /* ??? Should check that USB and SCSI data transfer
  366. directions match. */
  367. if (s->residue == 0) {
  368. if (s->mode == USB_MSDM_DATAIN) {
  369. s->scsi_dev->read_data(s->scsi_dev, s->tag);
  370. } else if (s->mode == USB_MSDM_DATAOUT) {
  371. s->scsi_dev->write_data(s->scsi_dev, s->tag);
  372. }
  373. }
  374. ret = len;
  375. break;
  376. case USB_MSDM_DATAOUT:
  377. DPRINTF("Data out %d/%d\n", len, s->data_len);
  378. if (len > s->data_len)
  379. goto fail;
  380. s->usb_buf = data;
  381. s->usb_len = len;
  382. if (s->scsi_len) {
  383. usb_msd_copy_data(s);
  384. }
  385. if (s->residue && s->usb_len) {
  386. s->data_len -= s->usb_len;
  387. if (s->data_len == 0)
  388. s->mode = USB_MSDM_CSW;
  389. s->usb_len = 0;
  390. }
  391. if (s->usb_len) {
  392. DPRINTF("Deferring packet %p\n", p);
  393. usb_defer_packet(p, usb_msd_cancel_io, s);
  394. s->packet = p;
  395. ret = USB_RET_ASYNC;
  396. } else {
  397. ret = len;
  398. }
  399. break;
  400. default:
  401. DPRINTF("Unexpected write (len %d)\n", len);
  402. goto fail;
  403. }
  404. break;
  405. case USB_TOKEN_IN:
  406. if (devep != 1)
  407. goto fail;
  408. switch (s->mode) {
  409. case USB_MSDM_DATAOUT:
  410. if (s->data_len != 0 || len < 13)
  411. goto fail;
  412. /* Waiting for SCSI write to complete. */
  413. usb_defer_packet(p, usb_msd_cancel_io, s);
  414. s->packet = p;
  415. ret = USB_RET_ASYNC;
  416. break;
  417. case USB_MSDM_CSW:
  418. DPRINTF("Command status %d tag 0x%x, len %d\n",
  419. s->result, s->tag, len);
  420. if (len < 13)
  421. goto fail;
  422. s->usb_len = len;
  423. s->usb_buf = data;
  424. usb_msd_send_status(s);
  425. s->mode = USB_MSDM_CBW;
  426. ret = 13;
  427. break;
  428. case USB_MSDM_DATAIN:
  429. DPRINTF("Data in %d/%d\n", len, s->data_len);
  430. if (len > s->data_len)
  431. len = s->data_len;
  432. s->usb_buf = data;
  433. s->usb_len = len;
  434. if (s->scsi_len) {
  435. usb_msd_copy_data(s);
  436. }
  437. if (s->residue && s->usb_len) {
  438. s->data_len -= s->usb_len;
  439. memset(s->usb_buf, 0, s->usb_len);
  440. if (s->data_len == 0)
  441. s->mode = USB_MSDM_CSW;
  442. s->usb_len = 0;
  443. }
  444. if (s->usb_len) {
  445. DPRINTF("Deferring packet %p\n", p);
  446. usb_defer_packet(p, usb_msd_cancel_io, s);
  447. s->packet = p;
  448. ret = USB_RET_ASYNC;
  449. } else {
  450. ret = len;
  451. }
  452. break;
  453. default:
  454. DPRINTF("Unexpected read (len %d)\n", len);
  455. goto fail;
  456. }
  457. break;
  458. default:
  459. DPRINTF("Bad token\n");
  460. fail:
  461. ret = USB_RET_STALL;
  462. break;
  463. }
  464. return ret;
  465. }
  466. static void usb_msd_handle_destroy(USBDevice *dev)
  467. {
  468. MSDState *s = (MSDState *)dev;
  469. s->scsi_dev->destroy(s->scsi_dev);
  470. bdrv_delete(s->bs);
  471. qemu_free(s);
  472. }
  473. USBDevice *usb_msd_init(const char *filename, BlockDriverState **pbs)
  474. {
  475. MSDState *s;
  476. BlockDriverState *bdrv;
  477. BlockDriver *drv = NULL;
  478. const char *p1;
  479. char fmt[32];
  480. p1 = strchr(filename, ':');
  481. if (p1++) {
  482. const char *p2;
  483. if (strstart(filename, "format=", &p2)) {
  484. int len = MIN(p1 - p2, sizeof(fmt));
  485. pstrcpy(fmt, len, p2);
  486. drv = bdrv_find_format(fmt);
  487. if (!drv) {
  488. printf("invalid format %s\n", fmt);
  489. return NULL;
  490. }
  491. } else if (*filename != ':') {
  492. printf("unrecognized USB mass-storage option %s\n", filename);
  493. return NULL;
  494. }
  495. filename = p1;
  496. }
  497. if (!*filename) {
  498. printf("block device specification needed\n");
  499. return NULL;
  500. }
  501. s = qemu_mallocz(sizeof(MSDState));
  502. bdrv = bdrv_new("usb");
  503. if (bdrv_open2(bdrv, filename, 0, drv) < 0)
  504. goto fail;
  505. s->bs = bdrv;
  506. *pbs = bdrv;
  507. s->dev.speed = USB_SPEED_FULL;
  508. s->dev.handle_packet = usb_generic_handle_packet;
  509. s->dev.handle_reset = usb_msd_handle_reset;
  510. s->dev.handle_control = usb_msd_handle_control;
  511. s->dev.handle_data = usb_msd_handle_data;
  512. s->dev.handle_destroy = usb_msd_handle_destroy;
  513. snprintf(s->dev.devname, sizeof(s->dev.devname), "QEMU USB MSD(%.16s)",
  514. filename);
  515. s->scsi_dev = scsi_disk_init(bdrv, 0, usb_msd_command_complete, s);
  516. usb_msd_handle_reset((USBDevice *)s);
  517. return (USBDevice *)s;
  518. fail:
  519. qemu_free(s);
  520. return NULL;
  521. }