static inline struct ide_channel * get_selected_channel(struct ide_internal * ide, ushort_t port) {
int channel_idx = get_channel_index(port);
- return &(ide->channels[channel_idx]);
+ if (channel_idx >= 0) {
+ return &(ide->channels[channel_idx]);
+ } else {
+ PrintError(VM_NONE,VCORE_NONE,"ide: Cannot Determine Selected Channel\n");
+ return 0;
+ }
}
static inline struct ide_drive * get_selected_drive(struct ide_channel * channel) {
cmd_ret = v3_write_gpa_memory(core, prd_entry.base_addr + prd_offset,
bytes_to_write, drive->data_buf);
- // check cmd_ret
+ if (cmd_ret!=bytes_to_write) {
+ PrintError(core->vm_info, core, "Failed to write data to memory\n");
+ return -1;
+ }
+
bytes_to_write = 0;
drive->transfer_index, drive->transfer_length,
drive->hd_state.cur_sector_num);
- if (drive->transfer_index >= drive->transfer_length) {
+ if (drive->transfer_index >= drive->transfer_length && drive->transfer_index>=DATA_BUFFER_SIZE) {
PrintError(VM_NONE, VCORE_NONE, "Buffer overrun... (xfer_len=%llu) (cur_idx=%llu) (post_idx=%llu)\n",
drive->transfer_length, drive->transfer_index,
drive->transfer_index + length);
- if (drive->transfer_index >= drive->transfer_length) {
+ if (drive->transfer_index >= drive->transfer_length && drive->transfer_index>=DATA_BUFFER_SIZE) {
PrintError(VM_NONE, VCORE_NONE, "Buffer Overrun... (xfer_len=%llu) (cur_idx=%llu) (post_idx=%llu)\n",
drive->transfer_length, drive->transfer_index,
drive->transfer_index + length);
}
if (model_str != NULL) {
- strncpy(drive->model, model_str, sizeof(drive->model) - 1);
+ strncpy(drive->model, model_str, sizeof(drive->model));
+ drive->model[sizeof(drive->model)-1] = 0;
}
if (strcasecmp(type_str, "cdrom") == 0) {