1
0
mirror of https://github.com/simh/simh.git synced 2026-02-27 01:00:07 +00:00

DISK: Assure that all sim_disk using devices properly honor NOAUTOSIZE

This commit is contained in:
Mark Pizzolato
2022-07-28 14:45:55 -07:00
parent 67c8534055
commit 81fd92e4ee
2 changed files with 96 additions and 10 deletions

View File

@@ -50,6 +50,8 @@ Public routines:
sim_disk_show_fmt show disk format
sim_disk_set_capac set disk capacity
sim_disk_show_capac show disk capacity
sim_disk_set_autosize MTAB set autosize
sim_disk_show_autosize MTAB display autosize
sim_disk_set_async enable asynchronous operation
sim_disk_clr_async disable asynchronous operation
sim_disk_data_trace debug support
@@ -594,25 +596,41 @@ t_stat sim_disk_set_noautosize (int32 flag, CONST char *cptr)
{
DEVICE *dptr;
uint32 dev, unit, count = 0;
int32 saved_sim_show_message = sim_show_message;
if (flag == sim_disk_no_autosize)
return sim_messagef (SCPE_ARG, "Autosizing is already %sabled!\n",
sim_disk_no_autosize ? "dis" : "en");
sim_show_message = FALSE;
for (dev = 0; (dptr = sim_devices[dev]) != NULL; dev++) {
if (((DEV_TYPE (dptr) != DEV_DISK) && (DEV_TYPE (dptr) != DEV_SCSI)) ||
((dptr->flags & DEV_DIS) != 0))
continue;
t_bool device_disabled = ((dptr->flags & DEV_DIS) != 0);
if ((DEV_TYPE (dptr) != DEV_DISK) &&
(DEV_TYPE (dptr) != DEV_SCSI)) /* If not a sim_disk device? */
continue; /* skip this device */
if (device_disabled)
dptr->flags &= ~DEV_DIS; /* Temporarily enable device */
++count;
for (unit = 0; unit < dptr->numunits; unit++) {
char cmd[CBUFSIZE];
int32 saved_sim_show_message = sim_show_message;
t_bool unit_disabled = ((dptr->units[unit].flags & UNIT_DIS) != 0);
sim_show_message = FALSE;
if (unit_disabled && /* disabled and */
((dptr->units[unit].flags & UNIT_DISABLE) == 0)) /* can't be enabled? */
continue; /* Not a drive unit, so skip. */
if (unit_disabled)
dptr->units[unit].flags &= ~UNIT_DIS; /* Temporarily enable unit */
sprintf (cmd, "%s %sAUTOSIZE", sim_uname (&dptr->units[unit]), (flag != 0) ? "NO" : "");
set_cmd (0, cmd);
sim_show_message = saved_sim_show_message;
if (unit_disabled)
dptr->units[unit].flags |= ~UNIT_DIS; /* leave unit disabled again */
}
if (device_disabled)
dptr->flags |= DEV_DIS; /* leave device the way we found it */
}
sim_show_message = saved_sim_show_message;
if (count == 0)
return sim_messagef (SCPE_ARG, "No disk devices support autosizing\n");
sim_disk_no_autosize = flag;
@@ -621,9 +639,41 @@ return SCPE_OK;
t_bool sim_disk_autosize_disabled (void)
{
return sim_disk_no_autosize;
return (sim_disk_no_autosize != 0);
}
/* Set disk autosize */
t_stat sim_disk_set_autosize (UNIT *uptr, int32 val, CONST char *cptr, void *desc)
{
if (uptr == NULL)
return SCPE_IERR;
if (cptr != NULL)
return sim_messagef (SCPE_ARG, "%s: Unexpected autosize argument: %s\n", sim_uname (uptr), cptr);
if (sim_disk_no_autosize)
return sim_messagef (SCPE_ARG, "%s: Disk autosizing is globally disabled\n", sim_uname (uptr));
if (val ^ ((uptr->flags & DKUF_NOAUTOSIZE) != 0))
return SCPE_OK;
if (val)
uptr->flags &= ~DKUF_NOAUTOSIZE;
else
uptr->flags |= DKUF_NOAUTOSIZE;
return SCPE_OK;
}
/* Show disk autosize */
t_stat sim_disk_show_autosize (FILE *st, UNIT *uptr, int32 val, CONST void *desc)
{
if (sim_disk_no_autosize)
fprintf (st, "global noautosize");
else
fprintf (st, "%sautosize", ((uptr->flags & DKUF_NOAUTOSIZE) != 0) ? "no" : "");
return SCPE_OK;
}
/* Test for write protect */
t_bool sim_disk_wrp (UNIT *uptr)
@@ -3038,7 +3088,8 @@ if (!(uptr->flags & UNIT_ATTABLE)) /* not attachable? */
return SCPE_NOATT;
if ((dptr = find_dev_from_unit (uptr)) == NULL)
return SCPE_NOATT;
if (sim_disk_no_autosize) {
if ((sim_disk_autosize_disabled ()) || /* global autosize disabled OR */
((uptr->flags & DKUF_NOAUTOSIZE) != 0)) { /* unit autosize disabled? */
dontchangecapac = TRUE;
drivetypes = NULL;
}
@@ -7067,11 +7118,21 @@ sim_disk_set_noautosize (FALSE, NULL);
sim_show_message = saved_sim_show_message;
for (i = 0; NULL != (dptr = sim_devices[i]); i++) {
DRVTYP *drive;
MTAB autos[] = {
{ MTAB_XTD|MTAB_VUN, 1, NULL, "AUTOSIZE",
&sim_disk_set_autosize, NULL, NULL, "Enable disk autosize on attach" },
{ MTAB_XTD|MTAB_VUN, 0, NULL, "NOAUTOSIZE",
&sim_disk_set_autosize, NULL, NULL, "Disable disk autosize on attach" },
{ MTAB_XTD|MTAB_VUN, 0, "AUTOSIZE", NULL,
NULL, &sim_disk_show_autosize, NULL, "Display disk autosize on attach setting" }};
MTAB *mtab = dptr->modifiers;
MTAB *nmtab = NULL;
t_stat (*validator)(UNIT *up, int32 v, CONST char *cp, void *dp) = NULL;
uint32 modifiers = 0;
uint32 setters = 0;
uint32 dumb_autosizers = 0;
uint32 smart_autosizers = 0;
uint32 drives = 0;
uint32 aliases = 0;
@@ -7089,6 +7150,16 @@ for (i = 0; NULL != (dptr = sim_devices[i]); i++) {
/* find device type modifier entries */
for (j = 0; mtab[j].mask != 0; j++) {
++modifiers;
if (((mtab[j].pstring != NULL) &&
((strcasecmp (mtab[j].pstring, "AUTOSIZE") == 0) ||
(strcasecmp (mtab[j].pstring, "NOAUTOSIZE") == 0))) ||
((mtab[j].mstring != NULL) &&
((strcasecmp (mtab[j].mstring, "AUTOSIZE") == 0) ||
(strcasecmp (mtab[j].mstring, "NOAUTOSIZE") == 0))))
if ((mtab[j].mask & (MTAB_XTD|MTAB_VUN)) == 0)
++dumb_autosizers;
else
++smart_autosizers;
for (k = 0; drive[k].name != NULL; k++) {
if ((mtab[j].mstring == NULL) ||
(strncasecmp (mtab[j].mstring, drive[k].name, strlen (drive[k].name))))
@@ -7103,8 +7174,21 @@ for (i = 0; NULL != (dptr = sim_devices[i]); i++) {
continue;
++setters;
}
nmtab = (MTAB *)calloc (2 + drives + aliases + (modifiers - setters), sizeof (MTAB));
for (j = l = 0; mtab[j].mask != 0; j++) {
nmtab = (MTAB *)calloc (2 + ((smart_autosizers == 0) * (sizeof (autos)/sizeof (autos[0]))) + drives + aliases + (modifiers - (setters + dumb_autosizers)), sizeof (MTAB));
l = 0;
if (smart_autosizers == 0) {
for (k = 0; k < (sizeof (autos)/sizeof (autos[0])); k++)
nmtab[l++] = autos[k];
}
for (j = 0; mtab[j].mask != 0; j++) {
if ((((mtab[j].pstring != NULL) &&
((strcasecmp (mtab[j].pstring, "AUTOSIZE") == 0) ||
(strcasecmp (mtab[j].pstring, "NOAUTOSIZE") == 0))) ||
((mtab[j].mstring != NULL) &&
((strcasecmp (mtab[j].mstring, "AUTOSIZE") == 0) ||
(strcasecmp (mtab[j].mstring, "NOAUTOSIZE") == 0)))) &&
((mtab[j].mask & (MTAB_XTD|MTAB_VUN)) == 0))
continue; /* skip dumb autosizers */
for (k = 0; drive[k].name != NULL; k++) {
if ((mtab[j].mstring == NULL) ||
(strncasecmp (mtab[j].mstring, drive[k].name, strlen (drive[k].name))))

View File

@@ -121,6 +121,8 @@ t_stat sim_disk_set_fmt (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat sim_disk_show_fmt (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
t_stat sim_disk_set_capac (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat sim_disk_show_capac (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
t_stat sim_disk_set_autosize (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat sim_disk_show_autosize (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
t_stat sim_disk_set_asynch (UNIT *uptr, int latency);
t_stat sim_disk_clr_asynch (UNIT *uptr);
t_stat sim_disk_reset (UNIT *uptr);