From d46e2bc8c67d86ab28713b21b8ea2caade5ce15d Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 7 Sep 2025 01:12:30 +0200 Subject: [PATCH] Apply the dynamic SCSI buffer window sizing fix to MO, removable disk, and CD-ROM as well. --- src/disk/mo.c | 11 ++++++++++- src/disk/rdisk.c | 11 ++++++++++- src/include/86box/mo.h | 1 + src/include/86box/rdisk.h | 1 + src/include/86box/scsi_cdrom.h | 1 + src/scsi/scsi_cdrom.c | 15 +++++++++++---- src/scsi/scsi_disk.c | 2 ++ 7 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/disk/mo.c b/src/disk/mo.c index b287f68a0..5ffe74f78 100644 --- a/src/disk/mo.c +++ b/src/disk/mo.c @@ -664,8 +664,17 @@ static void mo_buf_alloc(mo_t *dev, uint32_t len) { mo_log(dev->log, "Allocated buffer length: %i\n", len); - if (dev->buffer == NULL) + + if (dev->buffer == NULL) { dev->buffer = (uint8_t *) malloc(len); + dev->buffer_sz = len; + } + + if (len > dev->buffer_sz) { + uint8_t *buf = (uint8_t *) realloc(dev->buffer, len); + dev->buffer = buf; + dev->buffer_sz = len; + } } static void diff --git a/src/disk/rdisk.c b/src/disk/rdisk.c index b51dc4e66..683b1e963 100644 --- a/src/disk/rdisk.c +++ b/src/disk/rdisk.c @@ -747,8 +747,17 @@ static void rdisk_buf_alloc(rdisk_t *dev, const uint32_t len) { rdisk_log(dev->log, "Allocated buffer length: %i\n", len); - if (dev->buffer == NULL) + + if (dev->buffer == NULL) { dev->buffer = (uint8_t *) malloc(len); + dev->buffer_sz = len; + } + + if (len > dev->buffer_sz) { + uint8_t *buf = (uint8_t *) realloc(dev->buffer, len); + dev->buffer = buf; + dev->buffer_sz = len; + } } static void diff --git a/src/include/86box/mo.h b/src/include/86box/mo.h index 6d308adb8..76e7cbdbe 100644 --- a/src/include/86box/mo.h +++ b/src/include/86box/mo.h @@ -140,6 +140,7 @@ typedef struct mo_t { void * log; uint8_t *buffer; + size_t buffer_sz; uint8_t atapi_cdb[16]; uint8_t current_cdb[16]; uint8_t sense[256]; diff --git a/src/include/86box/rdisk.h b/src/include/86box/rdisk.h index df48ba703..c226a2c9d 100644 --- a/src/include/86box/rdisk.h +++ b/src/include/86box/rdisk.h @@ -117,6 +117,7 @@ typedef struct rdisk_t { void *log; uint8_t *buffer; + size_t buffer_sz; uint8_t atapi_cdb[16]; uint8_t current_cdb[16]; uint8_t sense[256]; diff --git a/src/include/86box/scsi_cdrom.h b/src/include/86box/scsi_cdrom.h index c01f347a8..005223e27 100644 --- a/src/include/86box/scsi_cdrom.h +++ b/src/include/86box/scsi_cdrom.h @@ -36,6 +36,7 @@ typedef struct scsi_cdrom_t { void * log; uint8_t * buffer; + size_t buffer_sz; uint8_t atapi_cdb[16]; uint8_t current_cdb[16]; uint8_t sense[256]; diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index be23a66fe..309886357 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -857,11 +857,18 @@ scsi_cdrom_unit_attention(scsi_cdrom_t *dev) static void scsi_cdrom_buf_alloc(scsi_cdrom_t *dev, const uint32_t len) { - if (dev->buffer == NULL) - dev->buffer = (uint8_t *) malloc(len); + scsi_cdrom_log(dev->log, "Allocated buffer length: %i\n", len); - scsi_cdrom_log(dev->log, "Allocated buffer length: %i, buffer = %p\n", - len, dev->buffer); + if (dev->buffer == NULL) { + dev->buffer = (uint8_t *) malloc(len); + dev->buffer_sz = len; + } + + if (len > dev->buffer_sz) { + uint8_t *buf = (uint8_t *) realloc(dev->buffer, len); + dev->buffer = buf; + dev->buffer_sz = len; + } } static void diff --git a/src/scsi/scsi_disk.c b/src/scsi/scsi_disk.c index bfa8b42cf..9c8d36f7f 100644 --- a/src/scsi/scsi_disk.c +++ b/src/scsi/scsi_disk.c @@ -623,10 +623,12 @@ static void scsi_disk_buf_alloc(scsi_disk_t *dev, uint32_t len) { scsi_disk_log(dev->log, "Allocated buffer length: %i\n", len); + if (dev->temp_buffer == NULL) { dev->temp_buffer = (uint8_t *) malloc(len); dev->temp_buffer_sz = len; } + if (len > dev->temp_buffer_sz) { uint8_t *buf = (uint8_t *) realloc(dev->temp_buffer, len); dev->temp_buffer = buf;