#include <Disk.h>


Definition at line 92 of file Disk.h.
Public Member Functions | |
| CDisk (CConfigurator *cfg, CSystem *sys, CDiskController *c, int idebus, int idedev) | |
| Constructor. | |
| virtual | ~CDisk (void) |
| Destructor. | |
| virtual int | SaveState (FILE *f) |
| Save state to a Virtual Machine State file. | |
| virtual int | RestoreState (FILE *f) |
| Restore state from a Virtual Machine State file. | |
| virtual void | scsi_select_me (int bus) |
| Called when this device is selected. | |
| virtual size_t | scsi_expected_xfer_me (int bus) |
| Return the number of bytes expected or available. | |
| virtual void * | scsi_xfer_ptr_me (int bus, size_t bytes) |
| Return a pointer where the initiator can read or write data. | |
| virtual void | scsi_xfer_done_me (int bus) |
| Process data written or read. | |
| void | set_atapi_mode () |
| int | do_scsi_command () |
| Handle a SCSI command. | |
| int | do_scsi_message () |
| Handle a (series of) SCSI message(s). | |
| void | do_scsi_error (int errcode) |
| virtual bool | seek_byte (off_t_large byte)=0 |
| virtual size_t | read_bytes (void *dest, size_t bytes)=0 |
| virtual size_t | write_bytes (void *src, size_t bytes)=0 |
| bool | seek_block (off_t_large lba) |
| size_t | read_blocks (void *dest, size_t blocks) |
| size_t | write_blocks (void *src, size_t blocks) |
| size_t | get_block_size () |
| void | set_block_size (size_t bs) |
| void | determine_layout () |
| off_t_large | get_lba_size () |
| off_t_large | get_byte_size () |
| off_t_large | get_chs_size () |
| off_t_large | get_cylinders () |
| long | get_heads () |
| long | get_sectors () |
| char * | get_serial () |
| char * | get_model () |
| char * | get_rev () |
| bool | ro () |
| bool | rw () |
| bool | cdrom () |
| void | calc_cylinders () |
| the number of cylinders to report. | |
Protected Attributes | |
| CConfigurator * | myCfg |
| CDiskController * | myCtrl |
| int | myBus |
| int | myDev |
| char * | serial_number |
| char * | model_number |
| char * | revision_number |
| bool | read_only |
| bool | is_cdrom |
| off_t_large | byte_size |
| off_t_large | cylinders |
| long | heads |
| long | sectors |
| bool | atapi_mode |
| struct CDisk::SDisk_state | state |
Data Structures | |
| struct | SDisk_state |
| The state structure contains all elements that need to be saved to the statefile. More... | |
| CDisk::CDisk | ( | CConfigurator * | cfg, | |
| CSystem * | sys, | |||
| CDiskController * | c, | |||
| int | idebus, | |||
| int | idedev | |||
| ) |
Constructor.
Definition at line 130 of file Disk.cpp.
References atapi_mode, CDisk::SDisk_state::SDisk_scsi::SDisk_sense::available, CDisk::SDisk_state::block_size, CHECK_ALLOCATION, CSystemComponent::devid_string, CConfigurator::get_bool_value(), CConfigurator::get_myName(), CConfigurator::get_myParent(), CConfigurator::get_myValue(), CConfigurator::get_text_value(), is_cdrom, myBus, myCfg, myCtrl, myDev, read_only, CDiskController::register_disk(), revision_number, CDisk::SDisk_state::scsi, CDisk::SDisk_state::SDisk_scsi::sense, serial_number, and state.
| CDisk::~CDisk | ( | void | ) | [virtual] |
| int CDisk::SaveState | ( | FILE * | f | ) | [virtual] |
Save state to a Virtual Machine State file.
Implements CSystemComponent.
Definition at line 220 of file Disk.cpp.
References CSystemComponent::devid_string, disk_magic1, disk_magic2, and state.
| int CDisk::RestoreState | ( | FILE * | f | ) | [virtual] |
Restore state from a Virtual Machine State file.
Implements CSystemComponent.
Definition at line 235 of file Disk.cpp.
References determine_layout(), CSystemComponent::devid_string, disk_magic1, disk_magic2, and state.
| void CDisk::scsi_select_me | ( | int | bus | ) | [virtual] |
Called when this device is selected.
Set status fields up to begin a new SCSI command sequence and set the SCSI bus phase to Message Out.
Reimplemented from CSCSIDevice.
Definition at line 191 of file Disk.cpp.
References atapi_mode, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::available, CDisk::SDisk_state::SDisk_scsi::SDisk_dati::available, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::available, CDisk::SDisk_state::SDisk_scsi::cmd, CDisk::SDisk_state::SDisk_scsi::dati, CDisk::SDisk_state::SDisk_scsi::dato, CDisk::SDisk_state::SDisk_scsi::SDisk_dato::expected, CDisk::SDisk_state::SDisk_scsi::lun_selected, CDisk::SDisk_state::SDisk_scsi::msgi, CDisk::SDisk_state::SDisk_scsi::msgo, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::read, CDisk::SDisk_state::SDisk_scsi::SDisk_dati::read, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::read, CDisk::SDisk_state::scsi, SCSI_PHASE_COMMAND, SCSI_PHASE_MSG_OUT, CSCSIDevice::scsi_set_phase(), CDisk::SDisk_state::SDisk_scsi::stat, state, CDisk::SDisk_state::SDisk_scsi::SDisk_dato::written, CDisk::SDisk_state::SDisk_scsi::SDisk_cmd::written, and CDisk::SDisk_state::SDisk_scsi::SDisk_msgo::written.
| size_t CDisk::scsi_expected_xfer_me | ( | int | bus | ) | [virtual] |
Return the number of bytes expected or available.
Return the number of bytes we still expect to receive from the initiator, or still have available for the initiator, in the current SCSI phase.
For an overview of data transfer during a SCSI bus phase, see SCSIDevice::scsi_xfer_ptr.
Reimplemented from CSCSIDevice.
Definition at line 305 of file Disk.cpp.
References CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::available, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::available, CDisk::SDisk_state::SDisk_scsi::SDisk_dati::available, CDisk::SDisk_state::SDisk_scsi::cmd, CDisk::SDisk_state::SDisk_scsi::dati, CDisk::SDisk_state::SDisk_scsi::dato, CSystemComponent::devid_string, CDisk::SDisk_state::SDisk_scsi::SDisk_dato::expected, FAILURE_2, CDisk::SDisk_state::SDisk_scsi::msgi, CDisk::SDisk_state::SDisk_scsi::msgo, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::read, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::read, CDisk::SDisk_state::SDisk_scsi::SDisk_dati::read, CDisk::SDisk_state::scsi, CSCSIDevice::scsi_get_phase(), SCSI_PHASE_COMMAND, SCSI_PHASE_DATA_IN, SCSI_PHASE_DATA_OUT, SCSI_PHASE_MSG_IN, SCSI_PHASE_MSG_OUT, SCSI_PHASE_STATUS, CDisk::SDisk_state::SDisk_scsi::stat, state, CDisk::SDisk_state::SDisk_scsi::SDisk_msgo::written, CDisk::SDisk_state::SDisk_scsi::SDisk_cmd::written, and CDisk::SDisk_state::SDisk_scsi::SDisk_dato::written.
| void * CDisk::scsi_xfer_ptr_me | ( | int | bus, | |
| size_t | bytes | |||
| ) | [virtual] |
Return a pointer where the initiator can read or write data.
Return a pointer to where the initiator can read or write (the remainder of) our data in the current SCSI phase.
For an overview of data transfer during a SCSI bus phase, see SCSIDevice::scsi_xfer_ptr.
Reimplemented from CSCSIDevice.
Definition at line 342 of file Disk.cpp.
References CDisk::SDisk_state::SDisk_scsi::cmd, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::data, CDisk::SDisk_state::SDisk_scsi::SDisk_msgo::data, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::data, CDisk::SDisk_state::SDisk_scsi::SDisk_cmd::data, CDisk::SDisk_state::SDisk_scsi::SDisk_dati::data, CDisk::SDisk_state::SDisk_scsi::SDisk_dato::data, CDisk::SDisk_state::SDisk_scsi::dati, CDisk::SDisk_state::SDisk_scsi::dato, CSystemComponent::devid_string, FAILURE_2, CDisk::SDisk_state::SDisk_scsi::msgi, CDisk::SDisk_state::SDisk_scsi::msgo, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::read, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::read, CDisk::SDisk_state::SDisk_scsi::SDisk_dati::read, CDisk::SDisk_state::scsi, CSCSIDevice::scsi_get_phase(), SCSI_PHASE_COMMAND, SCSI_PHASE_DATA_IN, SCSI_PHASE_DATA_OUT, SCSI_PHASE_MSG_IN, SCSI_PHASE_MSG_OUT, SCSI_PHASE_STATUS, CDisk::SDisk_state::SDisk_scsi::stat, state, CDisk::SDisk_state::SDisk_scsi::SDisk_msgo::written, CDisk::SDisk_state::SDisk_scsi::SDisk_cmd::written, and CDisk::SDisk_state::SDisk_scsi::SDisk_dato::written.
| void CDisk::scsi_xfer_done_me | ( | int | bus | ) | [virtual] |
Process data written or read.
Determine what action (if any) should be taken after a transfer, and what the next SCSI bus phase should be.
For an overview of data transfer during a SCSI bus phase, see SCSIDevice::scsi_xfer_ptr.
Reimplemented from CSCSIDevice.
Definition at line 422 of file Disk.cpp.
References atapi_mode, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::available, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::available, CDisk::SDisk_state::SDisk_scsi::SDisk_dati::available, CDisk::SDisk_state::SDisk_scsi::cmd, CDisk::SDisk_state::SDisk_scsi::dati, CDisk::SDisk_state::SDisk_scsi::dato, CSystemComponent::devid_string, do_scsi_command(), do_scsi_message(), CDisk::SDisk_state::SDisk_scsi::SDisk_dato::expected, FAILURE, FAILURE_2, CDisk::SDisk_state::SDisk_scsi::msgi, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::read, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::read, CDisk::SDisk_state::SDisk_scsi::SDisk_dati::read, CDisk::SDisk_state::scsi, CSCSIDevice::scsi_free(), CSCSIDevice::scsi_get_phase(), SCSI_PHASE_COMMAND, SCSI_PHASE_DATA_IN, SCSI_PHASE_DATA_OUT, SCSI_PHASE_MSG_IN, SCSI_PHASE_MSG_OUT, SCSI_PHASE_STATUS, CSCSIDevice::scsi_set_phase(), CDisk::SDisk_state::SDisk_scsi::stat, state, CDisk::SDisk_state::SDisk_scsi::SDisk_cmd::written, and CDisk::SDisk_state::SDisk_scsi::SDisk_dato::written.
| void CDisk::set_atapi_mode | ( | ) | [inline] |
Definition at line 106 of file Disk.h.
References atapi_mode.
Referenced by CAliM1543C_ide::register_disk().
| int CDisk::do_scsi_command | ( | ) |
Handle a SCSI command.
Called when a SCSI command has been received. We parse the command, and set up the state for the data in or data out phases.
If a data out phase is required, we return the value 2 to indicate this. In that case, do_scsi_command will be called again once the data out has been received from the initiator.
Definition at line 715 of file Disk.cpp.
References CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::available, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::available, CDisk::SDisk_state::SDisk_scsi::SDisk_dati::available, CDisk::SDisk_state::SDisk_scsi::SDisk_sense::available, cdrom(), CDisk::SDisk_state::SDisk_scsi::cmd, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::data, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::data, CDisk::SDisk_state::SDisk_scsi::SDisk_dato::data, CDisk::SDisk_state::SDisk_scsi::SDisk_dati::data, CDisk::SDisk_state::SDisk_scsi::SDisk_sense::data, CDisk::SDisk_state::SDisk_scsi::SDisk_cmd::data, CDisk::SDisk_state::SDisk_scsi::dati, DATI_BUFSZ, CDisk::SDisk_state::SDisk_scsi::dato, DATO_BUFSZ, CSystemComponent::devid_string, do_scsi_error(), CDisk::SDisk_state::SDisk_scsi::SDisk_dato::expected, FAILURE_1, FAILURE_2, get_block_size(), get_cylinders(), get_heads(), get_lba_size(), get_sectors(), lba2msf(), CDisk::SDisk_state::SDisk_scsi::locked, CDisk::SDisk_state::SDisk_scsi::lun_selected, CDisk::SDisk_state::SDisk_scsi::msgi, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::read, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::read, CDisk::SDisk_state::SDisk_scsi::SDisk_dati::read, read_blocks(), CDisk::SDisk_state::scsi, SCSI_ILL_CMD, CSCSIDevice::scsi_initiator_id, SCSI_LBA_RANGE, SCSI_OK, SCSI_TOO_BIG, SCSIBLOCKCMD_READ_CAPACITY, SCSICDROM_READ_TOC, SCSICDRRW_BLANK, SCSICDRRW_CLOSE_TRACK, SCSICDRRW_FORMAT, SCSICDRRW_READ_BUFFER_CAP, SCSICDRRW_READ_DISC_INFO, SCSICDRRW_READ_MASTER_CUE, SCSICDRRW_READ_TRACK_INFO, SCSICDRRW_REPAIR_TRACK, SCSICDRRW_RESERVE_TRACK, SCSICDRRW_SEND_CUE_SHEET, SCSICDRRW_SEND_OPC_INFO, SCSICMD_INQUIRY, SCSICMD_MODE_SELECT, SCSICMD_MODE_SENSE, SCSICMD_MODE_SENSE_10, SCSICMD_PREVENT_ALLOW_REMOVE, SCSICMD_READ, SCSICMD_READ_10, SCSICMD_READ_12, SCSICMD_READ_CD, SCSICMD_READ_LONG, SCSICMD_REQUEST_SENSE, SCSICMD_SYNCHRONIZE_CACHE, SCSICMD_TEST_UNIT_READY, SCSICMD_WRITE, SCSICMD_WRITE_10, SCSIMP_CACHING, SCSIMP_CDROM_CAP, SCSIMP_FLEX_PARAMS, SCSIMP_FORMAT_PARAMS, SCSIMP_READ_WRITE_ERRREC, SCSIMP_RIGID_GEOMETRY, SCSIMP_VENDOR, seek_block(), CDisk::SDisk_state::SDisk_scsi::sense, serial_number, set_block_size(), CDisk::SDisk_state::SDisk_scsi::stat, state, write_blocks(), CDisk::SDisk_state::SDisk_scsi::SDisk_dato::written, and CDisk::SDisk_state::SDisk_scsi::SDisk_cmd::written.
Referenced by scsi_xfer_done_me().
| int CDisk::do_scsi_message | ( | ) |
Handle a (series of) SCSI message(s).
Called when one or more SCSI messages have been received. We parse the message(s) and return what the next SCSI bus phase should be.
Definition at line 1569 of file Disk.cpp.
References CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::available, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::data, CDisk::SDisk_state::SDisk_scsi::SDisk_msgo::data, CSystemComponent::devid_string, FAILURE_2, CDisk::SDisk_state::SDisk_scsi::lun_selected, CDisk::SDisk_state::SDisk_scsi::msgi, CDisk::SDisk_state::SDisk_scsi::msgo, CDisk::SDisk_state::scsi, SCSI_PHASE_COMMAND, SCSI_PHASE_MSG_IN, state, and CDisk::SDisk_state::SDisk_scsi::SDisk_msgo::written.
Referenced by scsi_xfer_done_me().
| void CDisk::do_scsi_error | ( | int | errcode | ) |
Definition at line 595 of file Disk.cpp.
References CDisk::SDisk_state::SDisk_scsi::SDisk_sense::available, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::available, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::available, CDisk::SDisk_state::SDisk_scsi::SDisk_sense::data, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::data, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::data, CSystemComponent::devid_string, CDisk::SDisk_state::SDisk_scsi::msgi, CDisk::SDisk_state::SDisk_scsi::SDisk_msgi::read, CDisk::SDisk_state::SDisk_scsi::SDisk_stat::read, CDisk::SDisk_state::scsi, SCSI_ILL_CMD, SCSI_LBA_RANGE, SCSI_OK, SCSI_TOO_BIG, CDisk::SDisk_state::SDisk_scsi::sense, CDisk::SDisk_state::SDisk_scsi::stat, and state.
Referenced by do_scsi_command().
| virtual bool CDisk::seek_byte | ( | off_t_large | byte | ) | [pure virtual] |
| virtual size_t CDisk::read_bytes | ( | void * | dest, | |
| size_t | bytes | |||
| ) | [pure virtual] |
| virtual size_t CDisk::write_bytes | ( | void * | src, | |
| size_t | bytes | |||
| ) | [pure virtual] |
| bool CDisk::seek_block | ( | off_t_large | lba | ) | [inline] |
Definition at line 116 of file Disk.h.
References CDisk::SDisk_state::block_size, seek_byte(), and state.
Referenced by do_scsi_command().
| size_t CDisk::read_blocks | ( | void * | dest, | |
| size_t | blocks | |||
| ) | [inline] |
Definition at line 120 of file Disk.h.
References CDisk::SDisk_state::block_size, read_bytes(), and state.
Referenced by do_scsi_command().
| size_t CDisk::write_blocks | ( | void * | src, | |
| size_t | blocks | |||
| ) | [inline] |
Definition at line 124 of file Disk.h.
References CDisk::SDisk_state::block_size, state, and write_bytes().
Referenced by do_scsi_command().
| size_t CDisk::get_block_size | ( | ) | [inline] |
Definition at line 129 of file Disk.h.
References CDisk::SDisk_state::block_size, and state.
Referenced by do_scsi_command().
| void CDisk::set_block_size | ( | size_t | bs | ) | [inline] |
Definition at line 130 of file Disk.h.
References CDisk::SDisk_state::block_size, determine_layout(), and state.
Referenced by do_scsi_command().
| void CDisk::determine_layout | ( | ) |
Definition at line 1715 of file Disk.cpp.
References cylinders, get_lba_size(), get_primes(), heads, MAX_HD, MAX_SEC, pri16, and sectors.
Referenced by CDiskDevice::CDiskDevice(), CDiskFile::CDiskFile(), CDiskRam::CDiskRam(), RestoreState(), and set_block_size().
| off_t_large CDisk::get_lba_size | ( | ) | [inline] |
Definition at line 138 of file Disk.h.
References CDisk::SDisk_state::block_size, byte_size, and state.
Referenced by determine_layout(), and do_scsi_command().
| off_t_large CDisk::get_byte_size | ( | ) | [inline] |
| off_t_large CDisk::get_chs_size | ( | ) | [inline] |
| off_t_large CDisk::get_cylinders | ( | ) | [inline] |
| long CDisk::get_heads | ( | ) | [inline] |
| long CDisk::get_sectors | ( | ) | [inline] |
| char* CDisk::get_serial | ( | ) | [inline] |
| char* CDisk::get_model | ( | ) | [inline] |
| char* CDisk::get_rev | ( | ) | [inline] |
| bool CDisk::cdrom | ( | ) | [inline] |
Definition at line 151 of file Disk.h.
References is_cdrom.
Referenced by do_scsi_command(), and CAliM1543C_ide::register_disk().
| void CDisk::calc_cylinders | ( | ) |
the number of cylinders to report.
Definition at line 176 of file Disk.cpp.
References CDisk::SDisk_state::block_size, byte_size, cylinders, heads, off_t_large, sectors, and state.
CConfigurator* CDisk::myCfg [protected] |
Reimplemented from CSystemComponent.
Definition at line 155 of file Disk.h.
Referenced by CDisk(), CDiskDevice::CDiskDevice(), CDiskFile::CDiskFile(), and CDiskRam::CDiskRam().
CDiskController* CDisk::myCtrl [protected] |
int CDisk::myBus [protected] |
int CDisk::myDev [protected] |
char* CDisk::serial_number [protected] |
char* CDisk::model_number [protected] |
Definition at line 161 of file Disk.h.
Referenced by CDiskDevice::CDiskDevice(), CDiskFile::CDiskFile(), CDiskRam::CDiskRam(), and get_model().
char* CDisk::revision_number [protected] |
bool CDisk::read_only [protected] |
Definition at line 164 of file Disk.h.
Referenced by CDisk(), CDiskDevice::CDiskDevice(), CDiskFile::CDiskFile(), ro(), rw(), CDiskFile::write_bytes(), and CDiskDevice::write_bytes().
bool CDisk::is_cdrom [protected] |
off_t_large CDisk::byte_size [protected] |
Definition at line 167 of file Disk.h.
Referenced by calc_cylinders(), CDiskDevice::CDiskDevice(), CDiskFile::CDiskFile(), CDiskRam::CDiskRam(), get_byte_size(), get_lba_size(), CDiskRam::read_bytes(), and CDiskRam::write_bytes().
off_t_large CDisk::cylinders [protected] |
Definition at line 168 of file Disk.h.
Referenced by calc_cylinders(), CDiskDevice::CDiskDevice(), CDiskFile::CDiskFile(), CDiskRam::CDiskRam(), determine_layout(), get_chs_size(), and get_cylinders().
long CDisk::heads [protected] |
Definition at line 169 of file Disk.h.
Referenced by calc_cylinders(), CDiskDevice::CDiskDevice(), CDiskFile::CDiskFile(), CDiskRam::CDiskRam(), determine_layout(), get_chs_size(), and get_heads().
long CDisk::sectors [protected] |
Definition at line 170 of file Disk.h.
Referenced by calc_cylinders(), CDiskDevice::CDiskDevice(), CDiskFile::CDiskFile(), CDiskRam::CDiskRam(), determine_layout(), get_chs_size(), and get_sectors().
bool CDisk::atapi_mode [protected] |
Definition at line 172 of file Disk.h.
Referenced by CDisk(), scsi_select_me(), scsi_xfer_done_me(), and set_atapi_mode().
struct CDisk::SDisk_state CDisk::state [protected] |
Referenced by calc_cylinders(), CDisk(), CDiskDevice::CDiskDevice(), CDiskFile::CDiskFile(), CDiskRam::CDiskRam(), do_scsi_command(), do_scsi_error(), do_scsi_message(), get_block_size(), get_lba_size(), read_blocks(), CDiskRam::read_bytes(), CDiskFile::read_bytes(), CDiskDevice::read_bytes(), RestoreState(), SaveState(), scsi_expected_xfer_me(), scsi_select_me(), scsi_xfer_done_me(), scsi_xfer_ptr_me(), seek_block(), set_block_size(), write_blocks(), CDiskRam::write_bytes(), CDiskFile::write_bytes(), and CDiskDevice::write_bytes().