mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +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_R_W_ERROR] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
|
||||||
[MODE_PAGE_AUDIO_CTL] = (1 << TYPE_ROM),
|
[MODE_PAGE_AUDIO_CTL] = (1 << TYPE_ROM),
|
||||||
[MODE_PAGE_CAPABILITIES] = (1 << TYPE_ROM),
|
[MODE_PAGE_CAPABILITIES] = (1 << TYPE_ROM),
|
||||||
|
[MODE_PAGE_APPLE_VENDOR] = (1 << TYPE_ROM),
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t *p = *p_outbuf + 2;
|
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;
|
p[19] = (16 * 176) & 0xff;
|
||||||
break;
|
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:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -3085,6 +3100,8 @@ static Property scsi_cd_properties[] = {
|
|||||||
DEFAULT_MAX_IO_SIZE),
|
DEFAULT_MAX_IO_SIZE),
|
||||||
DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version,
|
DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version,
|
||||||
5),
|
5),
|
||||||
|
DEFINE_PROP_BIT("quirk_mode_page_apple_vendor", SCSIDiskState, quirks,
|
||||||
|
SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR, 0),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -226,4 +226,7 @@ SCSIDevice *scsi_device_get(SCSIBus *bus, int channel, int target, int lun);
|
|||||||
/* scsi-generic.c. */
|
/* scsi-generic.c. */
|
||||||
extern const SCSIReqOps scsi_generic_req_ops;
|
extern const SCSIReqOps scsi_generic_req_ops;
|
||||||
|
|
||||||
|
/* scsi-disk.c */
|
||||||
|
#define SCSI_DISK_QUIRK_MODE_PAGE_APPLE_VENDOR 0
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -234,6 +234,7 @@
|
|||||||
#define MODE_PAGE_FAULT_FAIL 0x1c
|
#define MODE_PAGE_FAULT_FAIL 0x1c
|
||||||
#define MODE_PAGE_TO_PROTECT 0x1d
|
#define MODE_PAGE_TO_PROTECT 0x1d
|
||||||
#define MODE_PAGE_CAPABILITIES 0x2a
|
#define MODE_PAGE_CAPABILITIES 0x2a
|
||||||
|
#define MODE_PAGE_APPLE_VENDOR 0x30
|
||||||
#define MODE_PAGE_ALLS 0x3f
|
#define MODE_PAGE_ALLS 0x3f
|
||||||
/* Not in Mt. Fuji, but in ATAPI 2.6 -- deprecated now in favor
|
/* Not in Mt. Fuji, but in ATAPI 2.6 -- deprecated now in favor
|
||||||
* of MODE_PAGE_SENSE_POWER */
|
* of MODE_PAGE_SENSE_POWER */
|
||||||
|
Loading…
Reference in New Issue
Block a user