- deprecated option 'newharddrivesupport' removed from hard drive code

- sense code ASC_ILLEGAL_OPCODE added for unimplemented/unknown ATAPI commands
- some panics changed to errors
- unsupported bits message in drive and head register changed to BX_DEBUG
- improved info about not existing drive
- indent mode fixed in ATAPI packet command section
This commit is contained in:
Volker Ruppert 2005-10-02 10:16:54 +00:00
parent 9b264e8830
commit 0cacb9af0c
5 changed files with 591 additions and 609 deletions

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: bochs.h,v 1.158 2005-09-18 07:16:28 vruppert Exp $
// $Id: bochs.h,v 1.159 2005-10-02 10:16:53 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -656,7 +656,6 @@ typedef struct BOCHSAPI {
bx_cmosimage_options cmosimage;
bx_clock_options clock;
bx_ne2k_options ne2k;
bx_param_bool_c *OnewHardDriveSupport;
bx_load32bitOSImage_t load32bitOSImage;
bx_log_options log;
bx_keyboard_options keyboard;

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: config.cc,v 1.46 2005-09-22 21:12:26 vruppert Exp $
// $Id: config.cc,v 1.47 2005-10-02 10:16:53 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -745,11 +745,6 @@ void bx_init_options ()
}
}
bx_options.OnewHardDriveSupport = new bx_param_bool_c (BXP_NEWHARDDRIVESUPPORT,
"New hard drive support",
"Enables new features found on newer hard drives.",
1);
// boot sequence
for (i=0; i<3; i++) {
sprintf (name, "Boot drive #%d", i+1);
@ -1719,7 +1714,6 @@ void bx_reset_options ()
bx_options.atadevice[channel][slave].Otranslation->reset();
}
}
bx_options.OnewHardDriveSupport->reset();
// boot
for (i=0; i<3; i++) {

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: siminterface.h,v 1.141 2005-09-22 21:12:26 vruppert Exp $
// $Id: siminterface.h,v 1.142 2005-10-02 10:16:53 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Intro to siminterface by Bryce Denney:
@ -341,7 +341,6 @@ typedef enum {
BXP_SCREENMODE,
BXP_I440FX_SUPPORT,
BXP_PCI,
BXP_NEWHARDDRIVESUPPORT,
BXP_LOG_FILENAME,
BXP_LOG_PREFIX,
BXP_DEBUGGER_LOG_FILENAME,

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: harddrv.cc,v 1.142 2005-09-14 19:52:41 vruppert Exp $
// $Id: harddrv.cc,v 1.143 2005-10-02 10:16:53 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -149,7 +149,7 @@ bx_hard_drive_c::init(void)
char string[5];
char sbtext[8];
BX_DEBUG(("Init $Id: harddrv.cc,v 1.142 2005-09-14 19:52:41 vruppert Exp $"));
BX_DEBUG(("Init $Id: harddrv.cc,v 1.143 2005-10-02 10:16:53 vruppert Exp $"));
for (channel=0; channel<BX_MAX_ATA_CHANNEL; channel++) {
if (bx_options.ata[channel].Opresent->get() == 1) {
@ -747,10 +747,7 @@ bx_hard_drive_c::read(Bit32u address, unsigned io_len)
BX_SELECTED_CONTROLLER(channel).status.busy = 0;
BX_SELECTED_CONTROLLER(channel).status.drive_ready = 1;
BX_SELECTED_CONTROLLER(channel).status.write_fault = 0;
if (bx_options.OnewHardDriveSupport->get ())
BX_SELECTED_CONTROLLER(channel).status.seek_complete = 1;
else
BX_SELECTED_CONTROLLER(channel).status.seek_complete = 0;
BX_SELECTED_CONTROLLER(channel).status.corrected_data = 0;
BX_SELECTED_CONTROLLER(channel).status.err = 0;
@ -797,7 +794,6 @@ bx_hard_drive_c::read(Bit32u address, unsigned io_len)
case 0xec: // IDENTIFY DEVICE
case 0xa1:
if (bx_options.OnewHardDriveSupport->get ()) {
unsigned index;
BX_SELECTED_CONTROLLER(channel).status.busy = 0;
@ -827,12 +823,10 @@ bx_hard_drive_c::read(Bit32u address, unsigned io_len)
BX_INFO(("Read all drive ID Bytes ..."));
}
GOTO_RETURN_VALUE;
}
else
BX_PANIC(("IO read(0x%04x): current command is %02xh", address,
(unsigned) BX_SELECTED_CONTROLLER(channel).current_command));
break;
case 0xa0: {
case 0xa0:
{
unsigned index = BX_SELECTED_CONTROLLER(channel).buffer_index;
unsigned increment = 0;
@ -1284,8 +1278,7 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
BX_SELECTED_CONTROLLER(channel).status.drq = 1;
BX_SELECTED_CONTROLLER(channel).status.corrected_data = 0;
BX_SELECTED_CONTROLLER(channel).status.err = 0;
}
else { /* no more sectors to write */
} else { /* no more sectors to write */
BX_SELECTED_CONTROLLER(channel).status.busy = 0;
BX_SELECTED_CONTROLLER(channel).status.drive_ready = 1;
BX_SELECTED_CONTROLLER(channel).status.drq = 0;
@ -1321,7 +1314,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
raise_interrupt(channel);
break;
case 0x03: { // request sense
case 0x03: // request sense
{
int alloc_length = BX_SELECTED_CONTROLLER(channel).buffer[4];
init_send_atapi_command(channel, atapi_command, 18, alloc_length);
@ -1349,7 +1343,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
}
break;
case 0x1b: { // start stop unit
case 0x1b: // start stop unit
{
//bx_bool Immed = (BX_SELECTED_CONTROLLER(channel).buffer[1] >> 0) & 1;
bx_bool LoEj = (BX_SELECTED_CONTROLLER(channel).buffer[4] >> 1) & 1;
bx_bool Start = (BX_SELECTED_CONTROLLER(channel).buffer[4] >> 0) & 1;
@ -1385,7 +1380,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
}
break;
case 0xbd: { // mechanism status
case 0xbd: // mechanism status
{
Bit16u alloc_length = read_16bit(BX_SELECTED_CONTROLLER(channel).buffer + 8);
if (alloc_length == 0)
@ -1409,7 +1405,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
}
break;
case 0x5a: { // mode sense
case 0x5a: // mode sense
{
Bit16u alloc_length = read_16bit(BX_SELECTED_CONTROLLER(channel).buffer + 7);
Bit8u PC = BX_SELECTED_CONTROLLER(channel).buffer[2] >> 6;
@ -1459,8 +1456,7 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
case 0x0d: // CD-ROM
case 0x0e: // CD-ROM audio control
case 0x3f: // all
BX_ERROR(("cdrom: MODE SENSE (curr), code=%x"
" not implemented yet",
BX_ERROR(("cdrom: MODE SENSE (curr), code=%x not implemented yet",
PageCode));
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST,
ASC_INV_FIELD_IN_CMD_PACKET, 1);
@ -1469,8 +1465,7 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
default:
// not implemeted by this device
BX_INFO(("cdrom: MODE SENSE PC=%x, PageCode=%x,"
" not implemented by device",
BX_INFO(("cdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device",
PC, PageCode));
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST,
ASC_INV_FIELD_IN_CMD_PACKET, 1);
@ -1486,8 +1481,7 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
case 0x0e: // CD-ROM audio control
case 0x2a: // CD-ROM capabilities & mech. status
case 0x3f: // all
BX_ERROR(("cdrom: MODE SENSE (chg), code=%x"
" not implemented yet",
BX_ERROR(("cdrom: MODE SENSE (chg), code=%x not implemented yet",
PageCode));
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST,
ASC_INV_FIELD_IN_CMD_PACKET, 1);
@ -1496,8 +1490,7 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
default:
// not implemeted by this device
BX_INFO(("cdrom: MODE SENSE PC=%x, PageCode=%x,"
" not implemented by device",
BX_INFO(("cdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device",
PC, PageCode));
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST,
ASC_INV_FIELD_IN_CMD_PACKET, 1);
@ -1537,18 +1530,20 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
BX_SELECTED_CONTROLLER(channel).buffer[27] = 0;
ready_to_send_atapi(channel);
break;
case 0x01: // error recovery
case 0x0d: // CD-ROM
case 0x0e: // CD-ROM audio control
case 0x3f: // all
BX_PANIC(("cdrom: MODE SENSE (dflt), code=%x",
PageCode));
BX_ERROR(("cdrom: MODE SENSE (dflt), code=%x not implemented", PageCode));
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST,
ASC_INV_FIELD_IN_CMD_PACKET, 1);
raise_interrupt(channel);
break;
default:
// not implemeted by this device
BX_INFO(("cdrom: MODE SENSE PC=%x, PageCode=%x,"
" not implemented by device",
BX_INFO(("cdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device",
PC, PageCode));
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST,
ASC_INV_FIELD_IN_CMD_PACKET, 1);
@ -1569,7 +1564,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
}
break;
case 0x12: { // inquiry
case 0x12: // inquiry
{
Bit8u alloc_length = BX_SELECTED_CONTROLLER(channel).buffer[4];
init_send_atapi_command(channel, atapi_command, 36, alloc_length);
@ -1603,7 +1599,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
}
break;
case 0x25: { // read cd-rom capacity
case 0x25: // read cd-rom capacity
{
// no allocation length???
init_send_atapi_command(channel, atapi_command, 8, 8);
@ -1626,7 +1623,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
}
break;
case 0xbe: { // read cd
case 0xbe: // read cd
{
if (BX_SELECTED_DRIVE(channel).cdrom.ready) {
BX_ERROR(("Read CD with CD present not implemented"));
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET, 1);
@ -1638,7 +1636,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
}
break;
case 0x43: { // read toc
case 0x43: // read toc
{
if (BX_SELECTED_DRIVE(channel).cdrom.ready) {
#ifdef LOWLEVEL_CDROM
bool msf = (BX_SELECTED_CONTROLLER(channel).buffer[1] >> 1) & 1;
@ -1682,8 +1681,7 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
#ifdef LOWLEVEL_CDROM
if (!(BX_SELECTED_DRIVE(channel).cdrom.cd->read_toc(BX_SELECTED_CONTROLLER(channel).buffer,
&toc_length, msf, starting_track, format))) {
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST,
ASC_INV_FIELD_IN_CMD_PACKET, 1);
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET, 1);
raise_interrupt(channel);
} else {
init_send_atapi_command(channel, atapi_command, toc_length, alloc_length);
@ -1710,7 +1708,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
case 2:
default:
BX_PANIC(("(READ TOC) Format %d not supported", format));
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET, 1);
raise_interrupt(channel);
break;
}
#endif // WIN32
@ -1775,7 +1774,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
}
break;
case 0x2b: { // seek
case 0x2b: // seek
{
Bit32u lba = read_32bit(BX_SELECTED_CONTROLLER(channel).buffer + 2);
if (!BX_SELECTED_DRIVE(channel).cdrom.ready) {
atapi_cmd_error(channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 1);
@ -1794,7 +1794,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
}
break;
case 0x1e: { // prevent/allow medium removal
case 0x1e: // prevent/allow medium removal
{
if (BX_SELECTED_DRIVE(channel).cdrom.ready) {
BX_SELECTED_DRIVE(channel).cdrom.locked = BX_SELECTED_CONTROLLER(channel).buffer[4] & 1;
atapi_cmd_nop(channel);
@ -1805,7 +1806,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
}
break;
case 0x42: { // read sub-channel
case 0x42: // read sub-channel
{
bool msf = get_packet_field(channel,1, 1, 1);
bool sub_q = get_packet_field(channel,2, 6, 1);
Bit8u data_format = get_packet_byte(channel,3);
@ -1839,7 +1841,8 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
}
break;
case 0x51: { // read disc info
case 0x51: // read disc info
{
// no-op to keep the Linux CD-ROM driver happy
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET, 1);
raise_interrupt(channel);
@ -1859,21 +1862,18 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
case 0x4e: // stop play/scan
case 0x46: // ???
case 0x4a: // ???
BX_ERROR(("ATAPI command 0x%x not implemented yet",
atapi_command));
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET, 1);
BX_ERROR(("ATAPI command 0x%x not implemented yet", atapi_command));
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST, ASC_ILLEGAL_OPCODE, 1);
raise_interrupt(channel);
break;
default:
BX_PANIC(("Unknown ATAPI command 0x%x (%d)",
atapi_command, atapi_command));
// We'd better signal the error if the user chose to continue
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET, 1);
raise_interrupt(channel);
break;
}
}
default:
BX_ERROR(("Unknown ATAPI command 0x%x (%d)", atapi_command, atapi_command));
atapi_cmd_error(channel, SENSE_ILLEGAL_REQUEST, ASC_ILLEGAL_OPCODE, 1);
raise_interrupt(channel);
break;
}
}
break;
default:
@ -1926,19 +1926,19 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
// b3..0 HD3..HD0
{
if ( (value & 0xa0) != 0xa0 ) // 1x1xxxxx
BX_INFO(("IO write 0x%04x (%02x): not 1x1xxxxxb", address, (unsigned) value));
BX_DEBUG(("IO write 0x%04x (%02x): not 1x1xxxxxb", address, (unsigned) value));
Bit32u drvsel = BX_HD_THIS channels[channel].drive_select = (value >> 4) & 0x01;
WRITE_HEAD_NO(channel,value & 0xf);
if (BX_SELECTED_CONTROLLER(channel).lba_mode == 0 && ((value >> 6) & 1) == 1)
BX_DEBUG(("enabling LBA mode"));
WRITE_LBA_MODE(channel,(value >> 6) & 1);
if (!BX_SELECTED_IS_PRESENT(channel)) {
BX_ERROR (("device set to %d which does not exist",drvsel));
BX_ERROR (("ata%d: device set to %d which does not exist", channel, drvsel));
BX_SELECTED_CONTROLLER(channel).error_register = 0x04; // aborted
BX_SELECTED_CONTROLLER(channel).status.err = 1;
}
break;
}
break;
case 0x07: // hard disk command 0x1f7
// (mch) Writes to the command register with drive_select != 0
@ -2145,7 +2145,6 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
break;
case 0xec: // IDENTIFY DEVICE
if (bx_options.OnewHardDriveSupport->get ()) {
if (bx_dbg.disk || (BX_SELECTED_IS_CD(channel) && bx_dbg.cdrom))
BX_INFO(("Drive ID Command issued : 0xec "));
@ -2175,10 +2174,6 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
raise_interrupt(channel);
identify_drive(channel);
}
} else {
BX_INFO(("sent IDENTIFY DEVICE (0xec) to old hard drive"));
command_aborted(channel, value);
}
break;
case 0xef: // SET FEATURES
@ -2196,15 +2191,13 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
break;
default:
BX_PANIC(("ata%d-%d: SET FEATURES with unknown subcommand: 0x%02x",
BX_ERROR(("ata%d-%d: SET FEATURES with unknown subcommand: 0x%02x",
channel,BX_SLAVE_SELECTED(channel),(unsigned) BX_SELECTED_CONTROLLER(channel).features));
// We'd better signal the error if the user chose to continue
command_aborted(channel, value);
}
break;
case 0x40: // READ VERIFY SECTORS
if (bx_options.OnewHardDriveSupport->get ()) {
if (!BX_SELECTED_IS_HD(channel)) {
BX_PANIC(("ata%d-%d: read verify issued to non-disk",
channel,BX_SLAVE_SELECTED(channel)));
@ -2217,10 +2210,6 @@ bx_hard_drive_c::write(Bit32u address, Bit32u value, unsigned io_len)
BX_SELECTED_CONTROLLER(channel).status.drq = 0;
BX_SELECTED_CONTROLLER(channel).status.err = 0;
raise_interrupt(channel);
} else {
BX_INFO(("sent READ VERIFY SECTORS (0x40) to old hard drive"));
command_aborted(channel, value);
}
break;
case 0xc6: // SET MULTIPLE MODE (mch)

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: harddrv.h,v 1.32 2005-08-21 17:40:45 vruppert Exp $
// $Id: harddrv.h,v 1.33 2005-10-02 10:16:54 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -108,10 +108,11 @@ typedef enum _sense {
} sense_t;
typedef enum _asc {
ASC_ILLEGAL_OPCODE = 0x20,
ASC_LOGICAL_BLOCK_OOR = 0x21,
ASC_INV_FIELD_IN_CMD_PACKET = 0x24,
ASC_MEDIUM_NOT_PRESENT = 0x3a,
ASC_SAVING_PARAMETERS_NOT_SUPPORTED = 0x39,
ASC_LOGICAL_BLOCK_OOR = 0x21
ASC_MEDIUM_NOT_PRESENT = 0x3a
} asc_t;
class LOWLEVEL_CDROM;