1
+ /*
2
+ * 86Box A hypervisor and IBM PC system emulator that specializes in
3
+ * running old operating systems and software designed for IBM
4
+ * PC systems and compatibles from 1981 through fairly recent
5
+ * system designs based on the PCI bus.
6
+ *
7
+ * This file is part of the 86Box distribution.
8
+ *
9
+ * USB mass storage emulation, ported from Bochs and somewhat rewritten.
10
+ *
11
+ * Authors: Cacodemon345
12
+ * Paul Brook
13
+ *
14
+ * Copyright 2006 CodeSourcery
15
+ * Copyright 2024 Cacodemon345
16
+ *
17
+ */
18
+
1
19
#include <stdarg.h>
2
20
#include <stdio.h>
3
21
#include <stdint.h>
@@ -144,6 +162,24 @@ typedef struct usb_device_msd
144
162
uint32_t force_stall ;
145
163
} usb_device_msd ;
146
164
165
+ #ifdef ENABLE_USB_MSD_LOG
166
+ int usb_msd_do_log = ENABLE_USB_MSD_LOG ;
167
+
168
+ static void
169
+ usb_msd_log (const char * fmt , ...)
170
+ {
171
+ va_list ap ;
172
+
173
+ if (usb_msd_do_log ) {
174
+ va_start (ap , fmt );
175
+ pclog_ex (fmt , ap );
176
+ va_end (ap );
177
+ }
178
+ }
179
+ #else
180
+ # define usb_msd_log (fmt , ...)
181
+ #endif
182
+
147
183
int
148
184
usb_device_msd_handle_control (usb_device_c * device , int request , int value , int index , int length , uint8_t * data )
149
185
{
@@ -214,7 +250,7 @@ usb_device_msd_handle_control(usb_device_c *device, int request, int value, int
214
250
215
251
216
252
if (ret < 0 )
217
- pclog ("request = 0x%04X, value = 0x%04X, index = 0x%04X, length = %d\n" , request , value , index , length );
253
+ usb_msd_log ("request = 0x%04X, value = 0x%04X, index = 0x%04X, length = %d\n" , request , value , index , length );
218
254
219
255
return ret ;
220
256
}
@@ -250,7 +286,7 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p)
250
286
251
287
if (usb_msd -> phase != USB_MSDM_CBW && usb_msd -> phase != USB_MSDM_CSW && usb_msd -> current_cbw .dCBWDataTransferLength < scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].buffer_length )
252
288
{
253
- pclog ("Phase error\n" );
289
+ usb_msd_log ("Phase error\n" );
254
290
usb_msd -> phase = USB_MSDM_CSW ;
255
291
usb_msd -> current_csw .bCSWStatus = 0x02 ;
256
292
goto fail ;
@@ -267,12 +303,12 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p)
267
303
{
268
304
usb_msd_cbw * cbw = (usb_msd_cbw * )p -> data ;
269
305
if (len != 31 ) {
270
- pclog ("len != 31\n" );
306
+ usb_msd_log ("len != 31\n" );
271
307
goto fail ;
272
308
}
273
309
274
310
if (cbw -> dCBWSignature != 0x43425355 ) {
275
- pclog ("Mismatched signature\n" );
311
+ usb_msd_log ("Mismatched signature\n" );
276
312
goto fail ;
277
313
}
278
314
@@ -297,7 +333,7 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p)
297
333
298
334
299
335
ret = len ;
300
- pclog ("CBWCB { 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X }\n" , cbw -> CBWCB [0 ],
336
+ usb_msd_log ("CBWCB { 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X }\n" , cbw -> CBWCB [0 ],
301
337
cbw -> CBWCB [1 ],
302
338
cbw -> CBWCB [2 ],
303
339
cbw -> CBWCB [3 ],
@@ -333,15 +369,15 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p)
333
369
case USB_MSDM_DATAOUT :
334
370
{
335
371
if (scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].status == SCSI_STATUS_CHECK_CONDITION ) {
336
- pclog ("Command failed\n" );
372
+ usb_msd_log ("Command failed\n" );
337
373
usb_msd -> phase = USB_MSDM_CSW ;
338
374
usb_msd -> current_csw .bCSWStatus = 0x01 ;
339
375
usb_msd -> current_csw .dCSWDataResidue = 0x0 ;
340
376
scsi_device_command_stop (& scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ]);
341
377
goto fail ;
342
378
}
343
379
if (scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].phase != SCSI_PHASE_DATA_OUT ) {
344
- pclog ("Phase error (not data out)\n" );
380
+ usb_msd_log ("Phase error (not data out, phase 0x%02X )\n" , scsi_devices [ usb_msd -> scsi_bus ][ usb_msd -> current_lun ]. phase );
345
381
usb_msd -> phase = USB_MSDM_CSW ;
346
382
usb_msd -> current_csw .bCSWStatus = 0x02 ;
347
383
scsi_device_command_stop (& scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ]);
@@ -353,7 +389,7 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p)
353
389
usb_msd -> expected_len -= MIN (usb_msd -> expected_len , p -> len );
354
390
if (usb_msd -> expected_len == 0 || p -> len < 64 )
355
391
{
356
- pclog ("Transfer finished (data out)\n" );
392
+ usb_msd_log ("Transfer finished (data out)\n" );
357
393
int residue = usb_msd -> current_cbw .dCBWDataTransferLength - scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].buffer_length ;
358
394
if (usb_msd -> temp_index < scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].buffer_length )
359
395
{
@@ -392,7 +428,7 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p)
392
428
393
429
if (usb_msd -> phase != USB_MSDM_CBW && usb_msd -> phase != USB_MSDM_CSW && usb_msd -> current_cbw .dCBWDataTransferLength < scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].buffer_length )
394
430
{
395
- pclog ("Phase error\n" );
431
+ usb_msd_log ("Phase error\n" );
396
432
usb_msd -> phase = USB_MSDM_CSW ;
397
433
usb_msd -> current_csw .bCSWStatus = 0x02 ;
398
434
usb_msd -> force_stall = 0 ;
@@ -408,7 +444,7 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p)
408
444
{
409
445
case USB_MSDM_DATAOUT :
410
446
{
411
- pclog ("Data out error (not data in)\n" );
447
+ usb_msd_log ("Data out error (not data in)\n" );
412
448
usb_msd -> phase = USB_MSDM_CSW ;
413
449
usb_msd -> current_csw .bCSWStatus = 0x02 ;
414
450
scsi_device_command_stop (& scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ]);
@@ -418,15 +454,15 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p)
418
454
{
419
455
uint32_t len = p -> len ;
420
456
if (scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].status == SCSI_STATUS_CHECK_CONDITION ) {
421
- pclog ("Command failed (data in)\n" );
457
+ usb_msd_log ("Command failed (data in)\n" );
422
458
usb_msd -> phase = USB_MSDM_CSW ;
423
459
usb_msd -> current_csw .bCSWStatus = 0x01 ;
424
460
usb_msd -> current_csw .dCSWDataResidue = 0x0 ;
425
461
scsi_device_command_stop (& scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ]);
426
462
goto fail ;
427
463
}
428
464
if (scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].phase != SCSI_PHASE_DATA_IN ) {
429
- pclog ("Phase error (not data in, phase 0x%02X)\n" , scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].phase );
465
+ usb_msd_log ("Phase error (not data in, phase 0x%02X)\n" , scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].phase );
430
466
usb_msd -> phase = USB_MSDM_CSW ;
431
467
usb_msd -> current_csw .bCSWStatus = 0x02 ;
432
468
scsi_device_command_stop (& scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ]);
@@ -440,7 +476,7 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p)
440
476
ret = len ;
441
477
if (usb_msd -> data_in_len == 0 )
442
478
{
443
- pclog ("Transfer finished (data in)\n" );
479
+ usb_msd_log ("Transfer finished (data in)\n" );
444
480
usb_msd -> current_csw .dCSWDataResidue = usb_msd -> current_cbw .dCBWDataTransferLength - scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].buffer_length ;
445
481
scsi_device_command_phase1 (& scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ]);
446
482
if (usb_msd -> current_cbw .dCBWDataTransferLength < scsi_devices [usb_msd -> scsi_bus ][usb_msd -> current_lun ].buffer_length )
@@ -462,7 +498,7 @@ usb_device_msd_handle_data(usb_device_c *device, USBPacket *p)
462
498
memcpy (p -> data , (void * )& usb_msd -> current_csw , MIN (p -> len , 13 ));
463
499
ret = MIN (p -> len , 13 );
464
500
usb_msd -> phase = USB_MSDM_CBW ;
465
- pclog ("CSW: 0x%08X, 0x%08X, 0x%08X, 0x%02X\n" , usb_msd -> current_csw .dCSWSignature , usb_msd -> current_csw .dCSWTag , usb_msd -> current_csw .dCSWDataResidue , usb_msd -> current_csw .bCSWStatus );
501
+ usb_msd_log ("CSW: 0x%08X, 0x%08X, 0x%08X, 0x%02X\n" , usb_msd -> current_csw .dCSWSignature , usb_msd -> current_csw .dCSWTag , usb_msd -> current_csw .dCSWDataResidue , usb_msd -> current_csw .bCSWStatus );
466
502
break ;
467
503
}
468
504
}
0 commit comments