From da440c30b5ddf795d4d710a38e75d4bdd0caa19a Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 12 Sep 2018 19:46:26 +0200 Subject: [PATCH] Fixed all the signedness, non-constant initializer, and shadowed variable warnings in disk/zip.c and scsi/scsi_disk.c. --- src/disk/zip.c | 51 +++++++++++++++++-------------- src/scsi/scsi.h | 9 +++++- src/scsi/scsi_disk.c | 72 ++++++++++++++++++++++---------------------- 3 files changed, 72 insertions(+), 60 deletions(-) diff --git a/src/disk/zip.c b/src/disk/zip.c index e2a4c28d3..e5827f2c8 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -9,7 +9,7 @@ * Implementation of the Iomega ZIP drive with SCSI(-like) * commands, for both ATAPI and SCSI usage. * - * Version: @(#)zip.c 1.0.21 2018/05/28 + * Version: @(#)zip.c 1.0.22 2018/09/12 * * Author: Miran Grca, * @@ -129,13 +129,15 @@ const uint8_t zip_command_flags[0x100] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static uint64_t zip_mode_sense_page_flags = (1LL << GPMODE_R_W_ERROR_PAGE) | - (1LL << 0x02LL) | (1LL << 0x2FLL) | - (1LL << GPMODE_ALL_PAGES); -static uint64_t zip_250_mode_sense_page_flags = (1LL << GPMODE_R_W_ERROR_PAGE) | - (1LL << 0x05LL) | (1LL << 0x08LL) | - (1LL << 0x2FLL) | - (1LL << GPMODE_ALL_PAGES); +static uint64_t zip_mode_sense_page_flags = (GPMODEP_R_W_ERROR_PAGE | + GPMODEP_UNK_PAGE_02 | + GPMODEP_UNK_PAGE_2F | + GPMODEP_ALL_PAGES); +static uint64_t zip_250_mode_sense_page_flags = (GPMODEP_R_W_ERROR_PAGE | + GPMODEP_UNK_PAGE_05 | + GPMODEP_UNK_PAGE_08 | + GPMODEP_UNK_PAGE_2F | + GPMODEP_ALL_PAGES); static const mode_sense_pages_t zip_mode_sense_pages_default = @@ -854,13 +856,13 @@ zip_mode_sense_read(zip_t *dev, uint8_t page_control, uint8_t page, uint8_t pos) static uint32_t zip_mode_sense(zip_t *dev, uint8_t *buf, uint32_t pos, uint8_t type, uint8_t block_descriptor_len) { - uint64_t page_flags; + uint64_t pf; uint8_t page_control = (type >> 6) & 3; if (dev->drv->is_250) - page_flags = zip_250_mode_sense_page_flags; + pf = zip_250_mode_sense_page_flags; else - page_flags = zip_mode_sense_page_flags; + pf = zip_mode_sense_page_flags; int i = 0; int j = 0; @@ -889,7 +891,7 @@ zip_mode_sense(zip_t *dev, uint8_t *buf, uint32_t pos, uint8_t type, uint8_t blo for (i = 0; i < 0x40; i++) { if ((type == GPMODE_ALL_PAGES) || (type == i)) { - if (page_flags & (1LL << dev->current_page_code)) { + if (pf & (1LL << dev->current_page_code)) { buf[pos++] = zip_mode_sense_read(dev, page_control, i, 0); msplen = zip_mode_sense_read(dev, page_control, i, 1); buf[pos++] = msplen; @@ -907,7 +909,7 @@ zip_mode_sense(zip_t *dev, uint8_t *buf, uint32_t pos, uint8_t type, uint8_t blo static void zip_update_request_length(zip_t *dev, int len, int block_len) { - uint32_t bt, min_len = 0; + int bt, min_len = 0; dev->max_transfer_len = dev->request_length; @@ -1227,7 +1229,7 @@ zip_data_phase_error(zip_t *dev) static int -zip_blocks(zip_t *dev, uint32_t *len, int first_batch, int out) +zip_blocks(zip_t *dev, int32_t *len, int first_batch, int out) { dev->data_pos = 0; @@ -1447,7 +1449,7 @@ zip_request_sense_for_scsi(zip_t *dev, uint8_t *buffer, uint8_t alloc_length) static void -zip_set_buf_len(zip_t *dev, int32_t *BufLen, uint32_t *src_len) +zip_set_buf_len(zip_t *dev, int32_t *BufLen, int32_t *src_len) { if (dev->drv->bus_type == ZIP_BUS_SCSI) { if (*BufLen == -1) @@ -1485,9 +1487,10 @@ zip_command(zip_t *dev, uint8_t *cdb) { int pos = 0, block_desc = 0; int ret; - uint32_t len, max_len; - uint32_t alloc_length, i = 0; - unsigned size_idx, idx = 0; + int32_t len, max_len; + int32_t alloc_length; + uint32_t i = 0; + int size_idx, idx = 0; unsigned preamble_len; int32_t blen = 0; int32_t *BufLen; @@ -1660,7 +1663,7 @@ zip_command(zip_t *dev, uint8_t *cdb) dev->requested_blocks = max_len; dev->packet_len = alloc_length; - zip_set_buf_len(dev, BufLen, &dev->packet_len); + zip_set_buf_len(dev, BufLen, (int32_t *) &dev->packet_len); zip_data_command_finish(dev, alloc_length, 512, alloc_length, 0); @@ -1747,7 +1750,7 @@ zip_command(zip_t *dev, uint8_t *cdb) dev->requested_blocks = max_len; dev->packet_len = max_len << 9; - zip_set_buf_len(dev, BufLen, &dev->packet_len); + zip_set_buf_len(dev, BufLen, (int32_t *) &dev->packet_len); zip_data_command_finish(dev, dev->packet_len, 512, dev->packet_len, 1); @@ -1809,7 +1812,7 @@ zip_command(zip_t *dev, uint8_t *cdb) dev->requested_blocks = max_len; dev->packet_len = alloc_length; - zip_set_buf_len(dev, BufLen, &dev->packet_len); + zip_set_buf_len(dev, BufLen, (int32_t *) &dev->packet_len); zip_data_command_finish(dev, dev->packet_len, 512, dev->packet_len, 1); @@ -2059,7 +2062,7 @@ atapi_out: zip_buf_alloc(dev, 8); - if (zip_read_capacity(dev, dev->current_cdb, zipbufferb, &len) == 0) { + if (zip_read_capacity(dev, dev->current_cdb, zipbufferb, (uint32_t *) &len) == 0) { zip_buf_free(dev); return; } @@ -2165,9 +2168,11 @@ zip_phase_data_out(zip_t *dev) uint8_t hdr_len, val, old_val, ch; - uint32_t last_to_write = 0, len = 0; + uint32_t last_to_write = 0; uint32_t c, h, s; + int len = 0; + switch(dev->current_cdb[0]) { case GPCMD_VERIFY_6: case GPCMD_VERIFY_10: diff --git a/src/scsi/scsi.h b/src/scsi/scsi.h index ab01692d5..e45209538 100644 --- a/src/scsi/scsi.h +++ b/src/scsi/scsi.h @@ -8,7 +8,7 @@ * * SCSI controller handler header. * - * Version: @(#)scsi_h 1.0.17 2018/06/02 + * Version: @(#)scsi_h 1.0.18 2018/09/12 * * Authors: TheCollector1995, * Miran Grca, @@ -105,9 +105,16 @@ /* Mode page codes for presence */ #define GPMODEP_R_W_ERROR_PAGE 0x0000000000000002LL +#define GPMODEP_UNK_PAGE_02 0x0000000000000004LL +#define GPMODEP_UNK_PAGE_03 0x0000000000000008LL +#define GPMODEP_UNK_PAGE_04 0x0000000000000010LL +#define GPMODEP_UNK_PAGE_05 0x0000000000000020LL +#define GPMODEP_UNK_PAGE_08 0x0000000000000100LL #define GPMODEP_CDROM_PAGE 0x0000000000002000LL #define GPMODEP_CDROM_AUDIO_PAGE 0x0000000000004000LL #define GPMODEP_CAPABILITIES_PAGE 0x0000040000000000LL +#define GPMODEP_UNK_PAGE_2F 0x0000800000000000LL +#define GPMODEP_UNK_PAGE_30 0x0001000000000000LL #define GPMODEP_ALL_PAGES 0x8000000000000000LL /* SCSI Status Codes */ diff --git a/src/scsi/scsi_disk.c b/src/scsi/scsi_disk.c index 22d7f117b..31afaecf2 100644 --- a/src/scsi/scsi_disk.c +++ b/src/scsi/scsi_disk.c @@ -6,7 +6,7 @@ * * Emulation of SCSI fixed disks. * - * Version: @(#)scsi_disk.c 1.0.20 2018/05/28 + * Version: @(#)scsi_disk.c 1.0.21 2018/09/12 * * Author: Miran Grca, * @@ -126,7 +126,10 @@ const uint8_t scsi_disk_command_flags[0x100] = { }; -uint64_t scsi_disk_mode_sense_page_flags = (1LL << 0x03) | (1LL << 0x04) | (1LL << 0x30) | (1LL << 0x3F); +uint64_t scsi_disk_mode_sense_page_flags = (GPMODEP_UNK_PAGE_03 | + GPMODEP_UNK_PAGE_04 | + GPMODEP_UNK_PAGE_30 | + GPMODEP_ALL_PAGES); /* This should be done in a better way but for time being, it's been done this way so it's not as huge and more readable. */ static const mode_sense_pages_t scsi_disk_mode_sense_pages_default = @@ -572,16 +575,29 @@ scsi_disk_request_sense_for_scsi(scsi_disk_t *dev, uint8_t *buffer, uint8_t allo } +static void +scsi_disk_set_buf_len(scsi_disk_t *dev, int32_t *BufLen, int32_t *src_len) +{ + if (*BufLen == -1) + *BufLen = *src_len; + else { + *BufLen = MIN(*src_len, *BufLen); + *src_len = *BufLen; + } + scsi_disk_log("SCSI HD %i: Actual transfer length: %i\n", dev->id, *BufLen); +} + + void scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb) { uint8_t *hdbufferb; int32_t *BufLen; - uint32_t len; - int max_len, pos = 0; - unsigned idx = 0; + int32_t len, max_len, alloc_length; + int pos = 0; + int idx = 0; unsigned size_idx, preamble_len; - uint32_t alloc_length, last_sector = 0; + uint32_t last_sector = 0; char device_identify[9] = { '8', '6', 'B', '_', 'H', 'D', '0', '0', 0 }; char device_identify_ex[15] = { '8', '6', 'B', '_', 'H', 'D', '0', '0', ' ', 'v', '1', '.', '0', '0', 0 }; int block_desc = 0; @@ -646,8 +662,8 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb) case GPCMD_REQUEST_SENSE: /* If there's a unit attention condition and there's a buffered not ready, a standalone REQUEST SENSE should forget about the not ready, and report unit attention straight away. */ - if ((*BufLen == -1) || (cdb[4] < *BufLen)) - *BufLen = cdb[4]; + len = cdb[4]; + scsi_disk_set_buf_len(dev, BufLen, &len); if (*BufLen < cdb[4]) cdb[4] = *BufLen; @@ -660,10 +676,7 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb) case GPCMD_MECHANISM_STATUS: len = (cdb[7] << 16) | (cdb[8] << 8) | cdb[9]; - - if ((*BufLen == -1) || (len < *BufLen)) - *BufLen = len; - + scsi_disk_set_buf_len(dev, BufLen, &len); scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN); scsi_disk_data_command_finish(dev, 8, 8, len, 0); break; @@ -704,9 +717,7 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb) alloc_length = dev->packet_len = max_len << 9; - if ((*BufLen == -1) || (alloc_length < *BufLen)) - *BufLen = alloc_length; - + scsi_disk_set_buf_len(dev, BufLen, &alloc_length); scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN); if (dev->requested_blocks > 1) @@ -770,9 +781,7 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb) alloc_length = dev->packet_len = max_len << 9; - if ((*BufLen == -1) || (alloc_length < *BufLen)) - *BufLen = alloc_length; - + scsi_disk_set_buf_len(dev, BufLen, &alloc_length); scsi_disk_set_phase(dev, SCSI_PHASE_DATA_OUT); if (dev->requested_blocks > 1) @@ -810,9 +819,7 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb) alloc_length = dev->packet_len = max_len << 9; - if ((*BufLen == -1) || (alloc_length < *BufLen)) - *BufLen = alloc_length; - + scsi_disk_set_buf_len(dev, BufLen, &alloc_length); scsi_disk_set_phase(dev, SCSI_PHASE_DATA_OUT); if (dev->requested_blocks > 1) @@ -865,9 +872,7 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb) else if (len < alloc_length) alloc_length = len; - if ((*BufLen == -1) || (alloc_length < *BufLen)) - *BufLen = alloc_length; - + scsi_disk_set_buf_len(dev, BufLen, &alloc_length); scsi_disk_log("SCSI HDD %i: Reading mode page: %02X...\n", dev->id, cdb[2]); scsi_disk_data_command_finish(dev, len, len, alloc_length, 0); @@ -882,12 +887,9 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb) else len = (cdb[7] << 8) | cdb[8]; - if ((*BufLen == -1) || (len < *BufLen)) - *BufLen = len; - + scsi_disk_set_buf_len(dev, BufLen, &len); dev->total_length = len; dev->do_page_save = cdb[1] & 1; - scsi_disk_data_command_finish(dev, len, len, len, 1); return; @@ -989,8 +991,7 @@ atapi_out: if (len > max_len) len = max_len; - if ((*BufLen == -1) || (len < *BufLen)) - *BufLen = len; + scsi_disk_set_buf_len(dev, BufLen, &len); if (len > *BufLen) len = *BufLen; @@ -1023,13 +1024,12 @@ atapi_out: case GPCMD_READ_CDROM_CAPACITY: dev->temp_buffer = (uint8_t *) malloc(8); - if (scsi_disk_read_capacity(dev, dev->current_cdb, dev->temp_buffer, &len) == 0) { + if (scsi_disk_read_capacity(dev, dev->current_cdb, dev->temp_buffer, (uint32_t *) &len) == 0) { scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); return; } - if ((*BufLen == -1) || (len < *BufLen)) - *BufLen = len; + scsi_disk_set_buf_len(dev, BufLen, &len); scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN); scsi_disk_data_command_finish(dev, len, len, len, 0); @@ -1070,7 +1070,7 @@ scsi_disk_phase_data_in(scsi_disk_t *dev) case GPCMD_READ_10: case GPCMD_READ_12: if ((dev->requested_blocks > 0) && (*BufLen > 0)) { - if (dev->packet_len > *BufLen) + if (dev->packet_len > (uint32_t) *BufLen) hdd_image_read(dev->id, dev->sector_pos, *BufLen >> 9, hdbufferb); else hdd_image_read(dev->id, dev->sector_pos, dev->requested_blocks, hdbufferb); @@ -1126,7 +1126,7 @@ scsi_disk_phase_data_out(scsi_disk_t *dev) case GPCMD_WRITE_12: case GPCMD_WRITE_AND_VERIFY_12: if ((dev->requested_blocks > 0) && (*BufLen > 0)) { - if (dev->packet_len > *BufLen) + if (dev->packet_len > (uint32_t) *BufLen) hdd_image_write(dev->id, dev->sector_pos, *BufLen >> 9, hdbufferb); else hdd_image_write(dev->id, dev->sector_pos, dev->requested_blocks, hdbufferb); @@ -1138,7 +1138,7 @@ scsi_disk_phase_data_out(scsi_disk_t *dev) else last_to_write = dev->sector_pos + dev->sector_len - 1; - for (i = dev->sector_pos; i <= last_to_write; i++) { + for (i = dev->sector_pos; i <= (int) last_to_write; i++) { if (dev->current_cdb[1] & 2) { hdbufferb[0] = (i >> 24) & 0xff; hdbufferb[1] = (i >> 16) & 0xff;