mirror of
https://github.com/simh/simh.git
synced 2026-01-26 12:02:14 +00:00
SCP: Extended debugging to allow for unit specific debug for disk and tape
This commit is contained in:
51
sim_disk.c
51
sim_disk.c
@@ -132,7 +132,7 @@ if ((!callback) || !ctx->asynch_io)
|
||||
\
|
||||
pthread_mutex_lock (&ctx->io_lock); \
|
||||
\
|
||||
sim_debug (ctx->dbit, ctx->dptr, \
|
||||
sim_debug_unit (ctx->dbit, uptr, \
|
||||
"sim_disk AIO_CALL(op=%d, unit=%d, lba=0x%X, sects=%d)\n",\
|
||||
op, (int)(uptr-ctx->dptr->units), _lba, _sects);\
|
||||
\
|
||||
@@ -168,7 +168,7 @@ struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
this thread needs to run */
|
||||
sim_os_set_thread_priority (PRIORITY_ABOVE_NORMAL);
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "_disk_io(unit=%d) starting\n", (int)(uptr-ctx->dptr->units));
|
||||
sim_debug_unit (ctx->dbit, uptr, "_disk_io(unit=%d) starting\n", (int)(uptr-ctx->dptr->units));
|
||||
|
||||
pthread_mutex_lock (&ctx->io_lock);
|
||||
pthread_cond_signal (&ctx->startup_cond); /* Signal we're ready to go */
|
||||
@@ -195,7 +195,7 @@ while (ctx->asynch_io) {
|
||||
}
|
||||
pthread_mutex_unlock (&ctx->io_lock);
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "_disk_io(unit=%d) exiting\n", (int)(uptr-ctx->dptr->units));
|
||||
sim_debug_unit (ctx->dbit, uptr, "_disk_io(unit=%d) exiting\n", (int)(uptr-ctx->dptr->units));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -216,7 +216,7 @@ static void _disk_completion_dispatch (UNIT *uptr)
|
||||
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
DISK_PCALLBACK callback = ctx->callback;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "_disk_completion_dispatch(unit=%d, dop=%d, callback=%p)\n", (int)(uptr-ctx->dptr->units), ctx->io_dop, ctx->callback);
|
||||
sim_debug_unit (ctx->dbit, uptr, "_disk_completion_dispatch(unit=%d, dop=%d, callback=%p)\n", (int)(uptr-ctx->dptr->units), ctx->io_dop, ctx->callback);
|
||||
|
||||
if (ctx->io_dop != DOP_DONE)
|
||||
abort(); /* horribly wrong, stop */
|
||||
@@ -232,7 +232,7 @@ static t_bool _disk_is_active (UNIT *uptr)
|
||||
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
|
||||
if (ctx) {
|
||||
sim_debug (ctx->dbit, ctx->dptr, "_disk_is_active(unit=%d, dop=%d)\n", (int)(uptr-ctx->dptr->units), ctx->io_dop);
|
||||
sim_debug_unit (ctx->dbit, uptr, "_disk_is_active(unit=%d, dop=%d)\n", (int)(uptr-ctx->dptr->units), ctx->io_dop);
|
||||
return (ctx->io_dop != DOP_DONE);
|
||||
}
|
||||
return FALSE;
|
||||
@@ -243,7 +243,7 @@ static t_bool _disk_cancel (UNIT *uptr)
|
||||
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
|
||||
if (ctx) {
|
||||
sim_debug (ctx->dbit, ctx->dptr, "_disk_cancel(unit=%d, dop=%d)\n", (int)(uptr-ctx->dptr->units), ctx->io_dop);
|
||||
sim_debug_unit (ctx->dbit, uptr, "_disk_cancel(unit=%d, dop=%d)\n", (int)(uptr-ctx->dptr->units), ctx->io_dop);
|
||||
if (ctx->asynch_io) {
|
||||
pthread_mutex_lock (&ctx->io_lock);
|
||||
while (ctx->io_dop != DOP_DONE)
|
||||
@@ -386,14 +386,16 @@ return SCPE_OK;
|
||||
t_bool sim_disk_isavailable (UNIT *uptr)
|
||||
{
|
||||
struct disk_context *ctx;
|
||||
t_bool is_available;
|
||||
|
||||
if (!(uptr->flags & UNIT_ATT)) /* attached? */
|
||||
return FALSE;
|
||||
switch (DK_GET_FMT (uptr)) { /* case on format */
|
||||
case DKUF_F_STD: /* SIMH format */
|
||||
return TRUE;
|
||||
is_available = TRUE;
|
||||
break;
|
||||
case DKUF_F_VHD: /* VHD format */
|
||||
return TRUE;
|
||||
is_available = TRUE;
|
||||
break;
|
||||
case DKUF_F_RAW: /* Raw Physical Disk Access */
|
||||
ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
@@ -417,11 +419,14 @@ switch (DK_GET_FMT (uptr)) { /* case on format */
|
||||
}
|
||||
else
|
||||
ctx->media_removed = 1;
|
||||
return !ctx->media_removed;
|
||||
is_available = !ctx->media_removed;
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
is_available = FALSE;
|
||||
break;
|
||||
}
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_disk_isavailable(unit=%d)=%s\n", (int)(uptr-ctx->dptr->units), is_available ? "true" : "false");
|
||||
return is_available;
|
||||
}
|
||||
|
||||
t_bool sim_disk_isavailable_a (UNIT *uptr, DISK_PCALLBACK callback)
|
||||
@@ -481,7 +486,7 @@ return SCPE_NOFNC;
|
||||
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
pthread_attr_t attr;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "sim_disk_set_async(unit=%d)\n", (int)(uptr-ctx->dptr->units));
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_disk_set_async(unit=%d)\n", (int)(uptr-ctx->dptr->units));
|
||||
|
||||
ctx->asynch_io = sim_asynch_enabled;
|
||||
ctx->asynch_io_latency = latency;
|
||||
@@ -518,7 +523,7 @@ struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
/* make sure device exists */
|
||||
if (!ctx) return SCPE_UNATT;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "sim_disk_clr_async(unit=%d)\n", (int)(uptr-ctx->dptr->units));
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_disk_clr_async(unit=%d)\n", (int)(uptr-ctx->dptr->units));
|
||||
|
||||
if (ctx->asynch_io) {
|
||||
pthread_mutex_lock (&ctx->io_lock);
|
||||
@@ -543,7 +548,7 @@ uint32 err, tbc;
|
||||
size_t i;
|
||||
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "_sim_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
sim_debug_unit (ctx->dbit, uptr, "_sim_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
|
||||
da = ((t_offset)lba) * ctx->sector_size;
|
||||
tbc = sects * ctx->sector_size;
|
||||
@@ -567,7 +572,7 @@ t_stat r;
|
||||
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
t_seccnt sread = 0;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "sim_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
|
||||
if ((sects == 1) && /* Single sector reads */
|
||||
(lba >= (uptr->capac*ctx->capac_factor)/(ctx->sector_size/((ctx->dptr->flags & DEV_SECTORS) ? 512 : 1)))) {/* beyond the end of the disk */
|
||||
@@ -659,7 +664,7 @@ uint32 err, tbc;
|
||||
size_t i;
|
||||
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "_sim_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
sim_debug_unit (ctx->dbit, uptr, "_sim_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
|
||||
da = ((t_offset)lba) * ctx->sector_size;
|
||||
tbc = sects * ctx->sector_size;
|
||||
@@ -682,7 +687,7 @@ uint32 f = DK_GET_FMT (uptr);
|
||||
t_stat r;
|
||||
uint8 *tbuf = NULL;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "sim_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
|
||||
if (uptr->dynflags & UNIT_DISK_CHK) {
|
||||
DEVICE *dptr = find_dev_from_unit (uptr);
|
||||
@@ -1553,7 +1558,7 @@ ctx->xfer_element_size = (uint32)xfer_element_size; /* save xfer_element_siz
|
||||
ctx->dptr = dptr; /* save DEVICE pointer */
|
||||
ctx->dbit = dbit; /* save debug bit */
|
||||
ctx->media_removed = 0; /* default present */
|
||||
sim_debug (ctx->dbit, ctx->dptr, "sim_disk_attach(unit=%d,filename='%s')\n", (int)(uptr-ctx->dptr->units), uptr->filename);
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_disk_attach(unit=%d,filename='%s')\n", (int)(uptr-ctx->dptr->units), uptr->filename);
|
||||
ctx->auto_format = auto_format; /* save that we auto selected format */
|
||||
ctx->storage_sector_size = (uint32)sector_size; /* Default */
|
||||
if ((sim_switches & SWMASK ('R')) || /* read only? */
|
||||
@@ -1790,7 +1795,7 @@ if ((uptr == NULL) || !(uptr->flags & UNIT_ATT))
|
||||
ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
fileref = uptr->fileref;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "sim_disk_detach(unit=%d,filename='%s')\n", (int)(uptr-ctx->dptr->units), uptr->filename);
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_disk_detach(unit=%d,filename='%s')\n", (int)(uptr-ctx->dptr->units), uptr->filename);
|
||||
|
||||
switch (DK_GET_FMT (uptr)) { /* case on format */
|
||||
case DKUF_F_STD: /* Simh */
|
||||
@@ -1966,7 +1971,7 @@ struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
if (!(uptr->flags & UNIT_ATT)) /* attached? */
|
||||
return SCPE_OK;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "sim_disk_reset(unit=%d)\n", (int)(uptr-ctx->dptr->units));
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_disk_reset(unit=%d)\n", (int)(uptr-ctx->dptr->units));
|
||||
|
||||
_sim_disk_io_flush(uptr);
|
||||
AIO_VALIDATE;
|
||||
@@ -2554,7 +2559,7 @@ OVERLAPPED pos;
|
||||
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
long long addr;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
|
||||
addr = ((long long)lba) * ctx->sector_size;
|
||||
memset (&pos, 0, sizeof (pos));
|
||||
@@ -2575,7 +2580,7 @@ OVERLAPPED pos;
|
||||
struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
long long addr;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
|
||||
addr = ((long long)lba) * ctx->sector_size;
|
||||
memset (&pos, 0, sizeof (pos));
|
||||
@@ -2657,7 +2662,7 @@ struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
off_t addr;
|
||||
ssize_t bytesread;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_rdsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
|
||||
addr = ((off_t)lba) * ctx->sector_size;
|
||||
bytesread = pread((int)((long)uptr->fileref), buf, sects * ctx->sector_size, addr);
|
||||
@@ -2677,7 +2682,7 @@ struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
||||
off_t addr;
|
||||
ssize_t byteswritten;
|
||||
|
||||
sim_debug (ctx->dbit, ctx->dptr, "sim_os_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
sim_debug_unit (ctx->dbit, uptr, "sim_os_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n", (int)(uptr-ctx->dptr->units), lba, sects);
|
||||
|
||||
addr = ((off_t)lba) * ctx->sector_size;
|
||||
byteswritten = pwrite((int)((long)uptr->fileref), buf, sects * ctx->sector_size, addr);
|
||||
|
||||
Reference in New Issue
Block a user