mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-06 18:05:37 +00:00
scsi-disk: add MODE_PAGE_APPLE_VENDOR quirk for Macintosh
One of the mechanisms MacOS uses to identify CDROM drives compatible with MacOS is to send a custom MODE SELECT command for page 0x30 to the drive. The response to this is a hard-coded manufacturer string which must match in order for the CDROM to be usable within MacOS. Add an implementation of the MODE SELECT page 0x30 response guarded by a newly defined SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR quirk bit so that CDROM drives attached to non-Apple machines function exactly as before. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Message-Id: <20220622105314.802852-3-mark.cave-ayland@ilande.co.uk> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
3412f9c3b4
commit
09d3786762
|
@ -1085,6 +1085,7 @@ static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
|
|||
[MODE_PAGE_R_W_ERROR] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
|
||||
[MODE_PAGE_AUDIO_CTL] = (1 << TYPE_ROM),
|
||||
[MODE_PAGE_CAPABILITIES] = (1 << TYPE_ROM),
|
||||
[MODE_PAGE_APPLE_VENDOR] = (1 << TYPE_ROM),
|
||||
};
|
||||
|
||||
uint8_t *p = *p_outbuf + 2;
|
||||
|
@ -1229,6 +1230,20 @@ static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
|
|||
p[19] = (16 * 176) & 0xff;
|
||||
break;
|
||||
|
||||
case MODE_PAGE_APPLE_VENDOR:
|
||||
if (s->quirks & (1 << SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR)) {
|
||||
length = 0x1e;
|
||||
if (page_control == 1) { /* Changeable Values */
|
||||
break;
|
||||
}
|
||||
|
||||
memset(p, 0, length);
|
||||
strcpy((char *)p + 8, "APPLE COMPUTER, INC ");
|
||||
break;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
@ -3085,6 +3100,8 @@ static Property scsi_cd_properties[] = {
|
|||
DEFAULT_MAX_IO_SIZE),
|
||||
DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version,
|
||||
5),
|
||||
DEFINE_PROP_BIT("quirk_mode_page_apple_vendor", SCSIDiskState, quirks,
|
||||
SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR, 0),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
|
|
@ -226,4 +226,7 @@ SCSIDevice *scsi_device_get(SCSIBus *bus, int channel, int target, int lun);
|
|||
/* scsi-generic.c. */
|
||||
extern const SCSIReqOps scsi_generic_req_ops;
|
||||
|
||||
/* scsi-disk.c */
|
||||
#define SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR 0
|
||||
|
||||
#endif
|
||||
|
|
|
@ -234,6 +234,7 @@
|
|||
#define MODE_PAGE_FAULT_FAIL 0x1c
|
||||
#define MODE_PAGE_TO_PROTECT 0x1d
|
||||
#define MODE_PAGE_CAPABILITIES 0x2a
|
||||
#define MODE_PAGE_APPLE_VENDOR 0x30
|
||||
#define MODE_PAGE_ALLS 0x3f
|
||||
/* Not in Mt. Fuji, but in ATAPI 2.6 -- deprecated now in favor
|
||||
* of MODE_PAGE_SENSE_POWER */
|
||||
|
|
Loading…
Reference in a new issue