From bc99d6d5def7913d40cee2b8bffcd4f0ef6dd4f6 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sun, 26 Jun 2022 14:39:25 -0700 Subject: [PATCH] SCP: Updated REG manipulation APIs and REGister sanity checks for all macros - bounds check accesses in get_rval and put_rval for circular registers - extend unit tests for REGister sanity checks to include all macros - add sanity checks for new REGister macros --- doc/simh.doc | Bin 317952 -> 319488 bytes scp.c | 192 +++++++++++++++++++++++++++++++++++++++++---------- sim_defs.h | 8 +-- 3 files changed, 160 insertions(+), 40 deletions(-) diff --git a/doc/simh.doc b/doc/simh.doc index f31937ae04981c249010f8388f404b208b708852..9f8048e36715d8794a5835bd7fef677a1102dad8 100644 GIT binary patch delta 59056 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 delta 57636 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 diff --git a/scp.c b/scp.c index 1d55a9cb..2cda9aa9 100644 --- a/scp.c +++ b/scp.c @@ -293,7 +293,9 @@ else \ (void)0 +/* Size of a DEVICE's data element */ #define SZ_D(dp) (size_map[((dp)->dwidth + CHAR_BIT - 1) / CHAR_BIT]) +/* Size of a REGister's data element */ #define SZ_R(rp) \ (size_map[((rp)->width + (rp)->offset + CHAR_BIT - 1) / CHAR_BIT]) #if defined (USE_INT64) @@ -9925,11 +9927,8 @@ t_value get_rval (REG *rptr, uint32 idx) t_value val; void *ptr; -if ((rptr->depth > 1) && (rptr->flags & REG_CIRC)) { /* if the register is a circular queue */ - idx = idx + rptr->qptr; /* then adjust the index relative to the queue */ - if (idx >= rptr->depth) /* if the index is beyond the end of the array */ - idx = idx - rptr->depth; /* then wrap it around */ - } +if ((rptr->depth > 1) && (rptr->flags & REG_CIRC)) /* if the register is a circular queue */ + idx = (idx + rptr->qptr) % rptr->depth; /* then adjust the index relative to the queue (wrapped as needed) */ ptr = ((char *) rptr->loc) + (idx * rptr->stride); /* point at the starting byte of the item */ @@ -10042,11 +10041,8 @@ if (pc_chk && (rptr == sim_PC)) /* if the PC is changing mask = ~(width_mask [rptr->width] << rptr->offset); /* set up a mask to produce a hole in the element */ val = val << rptr->offset; /* and position the new value to fit the hole */ -if ((rptr->depth > 1) && (rptr->flags & REG_CIRC)) { /* if the register is a circular queue */ - idx = idx + rptr->qptr; /* then adjust the index relative to the queue */ - if (idx >= rptr->depth) /* if the index is beyond the end of the array */ - idx = idx - rptr->depth; /* then wrap it around */ - } +if ((rptr->depth > 1) && (rptr->flags & REG_CIRC)) /* if the register is a circular queue */ + idx = (idx + rptr->qptr) % rptr->depth; /* then adjust the index relative to the queue (wrapped as needed) */ ptr = ((char *) rptr->loc) + (idx * rptr->stride); /* point at the starting byte of the item */ @@ -16142,7 +16138,7 @@ for (i = 0; (dptr = devices[i]) != NULL; i++) { for (rptr = dptr->registers; (rptr != NULL) && (rptr->name != NULL); rptr++) { uint32 bytes = 1; uint32 rsz = SZ_R(rptr); - uint32 memsize = ((rptr->flags & REG_FIT) || (rptr->depth > 1)) ? rptr->depth * rsz : 4; + uint32 memsize = (rptr->depth >= 1) ? rptr->depth * rsz : rsz; DEVICE *udptr = NULL; t_bool Bad; @@ -16152,6 +16148,17 @@ for (i = 0; (dptr = devices[i]) != NULL; i++) { if (rptr->depth > 1) bytes = rptr->size; + if (rptr->macro && (strstr (rptr->macro, "URDATA") != NULL)) { + DEVICE **d; + + for (d = devices; *d != NULL; d++) { + if (((UNIT *)rptr->loc >= (*d)->units) && + ((UNIT *)rptr->loc < (*d)->units + (*d)->numunits)) { + udptr = *d; + break; + } + } + } if (((rptr->width + rptr->offset + CHAR_BIT - 1) / CHAR_BIT) >= sizeof(size_map) / sizeof(size_map[0])) { Bad = TRUE; rsz = 0; @@ -16162,10 +16169,11 @@ for (i = 0; (dptr = devices[i]) != NULL; i++) { } if (sim_switches & SWMASK ('R')) /* Debug output */ - sim_printf ("%5s:%-9.9s %s(rdx=%u, wd=%u, off=%u, dep=%u, strsz=%u, objsz=%u, elesz=%u, rsz=%u, %s %s%s membytes=%u, macro=%s)\n", dptr->name, rptr->name, rptr->macro, - rptr->radix, rptr->width, rptr->offset, rptr->depth, (uint32)rptr->stride, (uint32)rptr->obj_size, (uint32)rptr->size, rsz, rptr->desc ? rptr->desc : "", - (rptr->flags & REG_FIT) ? "REG_FIT" : "", (rptr->flags & REG_VMIO) ? " REG_VMIO" : "", - memsize, rptr->macro ? rptr->macro : ""); + sim_printf ("%5s:%-9.9s %s%s%s(rdx=%u, wd=%u, off=%u, dep=%u, strsz=%u, objsz=%u, elesz=%u, rsz=%u, %s%s%s membytes=%u)\n", + dptr->name, rptr->name, rptr->desc ? rptr->desc : "", rptr->desc ? "\n\t" : "", rptr->macro ? rptr->macro : "", + rptr->radix, rptr->width, rptr->offset, rptr->depth, (uint32)rptr->stride, (uint32)rptr->obj_size, (uint32)rptr->size, rsz, + (rptr->flags & REG_VMAD) ? " REG_VMAD" : "", (rptr->flags & REG_VMIO) ? " REG_VMIO" : "", + (rptr->flags & REG_DEPOSIT) ? " REG_DEPOSIT" : "", memsize); MFlush (f); if (rptr->depth == 1) { @@ -16184,6 +16192,49 @@ for (i = 0; (dptr = devices[i]) != NULL; i++) { Bad = TRUE; Mprintf (f, "a 0 bit wide register is meaningless\n"); } + if ((rptr->obj_size != 0) && (rptr->size != 0) && (rptr->depth != 0) && (rptr->macro != NULL)) { + if (strstr (rptr->macro, "URDATA") != NULL) { + if (udptr == NULL) { + Bad = TRUE; + Mprintf (f, "\tthe indicated UNIT can't be found for this %u depth array\n", rptr->depth); + } + else { + UNIT *uptr; + + for (uptr = udptr->units; (uint32)(uptr - udptr->units) < udptr->numunits; uptr++) { + if (((char *)rptr->loc) < (char *)(uptr + 1)) + break; + } + if ((rptr->depth + (uptr - udptr->units)) > udptr->numunits) { + Bad = TRUE; + Mprintf (f, "\tthe %u depth of the UNIT array exceeds the number of units on the %s device which is %u\n", rptr->depth, dptr->name, udptr->numunits); + } + if (rptr->obj_size > sizeof (t_value)) { + Bad = TRUE; + Mprintf (f, "\t%u is larger than the size of the t_value type (%u)\n", (uint32)rptr->obj_size, (uint32)sizeof (t_value)); + } + } + } + else { + bytes *= rptr->depth; + if (!Bad) + if ((rsz * rptr->depth == rptr->obj_size) || + ((rptr->macro && (strstr (rptr->macro, "STRDATA") != NULL)) && (rsz <= rptr->obj_size)) || + ((rptr->depth == 1) && + ((rptr->obj_size == sizeof (t_value)) || (rsz < rptr->obj_size))) || + ((rptr->depth != 1) && (bytes == rptr->obj_size)) || + ((rptr->depth != 1) && (rptr->offset == 0) && (rptr->width == 8) && + ((rptr->depth == rptr->obj_size) || (rptr->depth == rptr->obj_size - 1))) || + ((rptr->depth != 1) && (rptr->offset == 0) && (rptr->obj_size == rptr->size))) + continue; + Bad = TRUE; + Mprintf (f, "\ttherefore EXAMINE and SAVE operations will reference %u byte%s\n", bytes, (bytes != 1) ? "s" : ""); + Mprintf (f, "\tand DEPOSIT and RESTORE operations will affect %u byte%s of memory\n", bytes, (bytes != 1) ? "s" : ""); + Mprintf (f, "\twhile the variable lives in %u bytes of memory\n", (uint32)rptr->obj_size); + } + } + else + Mprintf (f, "\tthis register entry is not properly initialized\n"); if (Bad) { FMwrite (stdout, f); stat = SCPE_IERR; @@ -16214,28 +16265,95 @@ uint8 treg8; uint16 treg16; uint32 treg32; t_value tregval; +uint16 treg16array[5]; +uint16 treg16arrayx2[5][4]; -static struct validation_test { - REG reg[5]; - t_stat expected_result; - } validations[] = { - { { { ORDATAD (REG8, treg8, 8*sizeof(treg8), "8 bit register") }, - { ORDATAD (REG16, treg16, 8*sizeof(treg16), "16 bit register") }, - { ORDATAD (REG32, treg32, 8*sizeof(treg32), "32 bit register") }, - { ORDATAD (REGVAL, tregval, 8*sizeof(tregval), "value register") }, - {NULL} }, - SCPE_OK}, - { { { ORDATAD (REG8, treg8, 8*sizeof(treg8), "8 bit register") }, - { ORDATAD (REG16, treg16, 8*sizeof(treg16), "16 bit register") }, - { ORDATAD (REG32, treg32, 8*sizeof(treg32), "32 bit register") }, - { ORDATAD (REGVAL, tregval, 8*sizeof(tregval), "value register") }, - {NULL} }, - SCPE_OK}, - { { {NULL} } } - }; static UNIT validate_units[3]; +static struct validation_test { + REG reg[7]; + t_stat expected_result; + } validations[] = { + { { { ORDATAD (OREG8, treg8, 8*sizeof(treg8), "8 bit register") }, + { ORDATAD (OREG16, treg16, 8*sizeof(treg16), "16 bit register") }, + { ORDATAD (OREG32, treg32, 8*sizeof(treg32), "32 bit register") }, + { ORDATAD (OREGVAL, tregval, 8*sizeof(tregval), "value register") }, + {NULL} }, + SCPE_OK}, + { { { DRDATAD (DREG8, treg8, 8*sizeof(treg8), "8 bit register") }, + { DRDATAD (DREG16, treg16, 8*sizeof(treg16), "16 bit register") }, + { DRDATAD (DREG32, treg32, 8*sizeof(treg32), "32 bit register") }, + { DRDATAD (DREGVAL, tregval, 8*sizeof(tregval), "value register") }, + {NULL} }, + SCPE_OK}, + { { { HRDATAD (HREG8, treg8, 8*sizeof(treg8), "8 bit register") }, + { HRDATAD (HREG16, treg16, 8*sizeof(treg16), "16 bit register") }, + { HRDATAD (HREG32, treg32, 8*sizeof(treg32), "32 bit register") }, + { HRDATAD (HREGVAL, tregval, 8*sizeof(tregval), "value register") }, + {NULL} }, + SCPE_OK}, + { { { BINRDATAD (BINREG8, treg8, 8*sizeof(treg8), "8 bit register") }, + { BINRDATAD (BINREG16, treg16, 8*sizeof(treg16), "16 bit register") }, + { BINRDATAD (BINREG32, treg32, 8*sizeof(treg32), "32 bit register") }, + { BINRDATAD (BINREGVAL, tregval, 8*sizeof(tregval), "value register") }, + {NULL} }, + SCPE_OK}, + { { { FLDATAD (FLREG8, treg8, 0, "Flag in 0'th bit of 8 bit register") }, + { FLDATAD (FLREG8, treg8, (8*sizeof(treg8)-1), "Flag in 7'th bit of 8 bit register") }, + { FLDATAD (FLREG160, treg16, 0, "Flag in 0'th bit of 16 bit register") }, + { FLDATAD (FLREG1615,treg16, (8*sizeof(treg16)-1), "Flag in 15'th bit of 16 bit register") }, + { FLDATAD (FLREG320, treg32, 0, "Flag in 0'th bit of 32 bit register") }, + { FLDATAD (FLREG3231,treg32, (8*sizeof(treg32)-1), "Flag in 31'st bit of 32 bit register") }, + {NULL} }, + SCPE_OK}, + { { { GRDATAD (FLREG8, treg8, 16, (8*sizeof(treg8))/2, (8*sizeof(treg8))/4, "2 bit field starting at offset 4 in an 8 bit register") }, + { GRDATAD (FLREG16, treg16, 16, (8*sizeof(treg16))/2, (8*sizeof(treg16))/4, "4 bit field starting at offset 8 in a 16 bit register") }, + { GRDATAD (FLREG32, treg32, 16, (8*sizeof(treg32))/2, (8*sizeof(treg32))/4, "8 bit field starting at offset 16 in a 32 bit register") }, + {NULL} }, + SCPE_OK}, + { { { XRDATA (FLREG32, &treg32, 16, 8, 0, sizeof(treg32), 1, 1) }, + {NULL} }, + SCPE_OK}, + { { { BRDATAD (FLREG16, treg16array, 16, 16, 5, "array of 5 uint16's") }, + {NULL} }, + SCPE_OK}, + { { { CRDATAD (FLREG16, treg16arrayx2, 16, 16, 20, "array of 5x4 uint16's") }, + {NULL} }, + SCPE_OK}, + { { { VBRDATAD (FLREG16, treg16array, 16, 16, 5, "5 Successive scalar values") }, + {NULL} }, + SCPE_OK}, + { { { URDATAD (FLREG32, validate_units[0].pos, 16, 32, 0, 3, PV_LEFT, "Unit POS register array for 3 units") }, + {NULL} }, + SCPE_OK}, + { { { URDATAD (FLREG32, validate_units[2].pos, 16, 32, 0, 3, PV_LEFT, "Unit POS register array for 3 units out of bounds") }, + {NULL} }, + SCPE_IERR}, + { { { STRDATAD (STRPOS, validate_units[0].pos, 16, 32, 0, 3, sizeof(UNIT), PV_LEFT, "Structure") }, + {NULL} }, + SCPE_OK}, + { { { SAVEDATA (ALLUNITS, validate_units) }, + {NULL} }, + SCPE_OK}, + { { { FLDATAD (FLREG8, treg8, 0, "Flag in 0'th bit of 8 bit register") }, + { FLDATAD (FLREG8, treg8, (8*sizeof(treg8)-1), "Flag in 7'th bit of 8 bit register") }, + { FLDATAD (FLREG8, treg8, 8*sizeof(treg8), "Flag outside of 8 bit register") }, + {NULL} }, + SCPE_IERR}, + { { { FLDATAD (FLREG16, treg16, 0, "Flag in 0'th bit of 16 bit register") }, + { FLDATAD (FLREG16, treg16, (8*sizeof(treg16)-1), "Flag in 15'th bit of 16 bit register") }, + { FLDATAD (FLREG16, treg16, 8*sizeof(treg16), "Flag outside of 16 bit register") }, + {NULL} }, + SCPE_IERR}, + { { { FLDATAD (FLREG32, treg32, 0, "Flag in 0'th bit of 32 bit register") }, + { FLDATAD (FLREG32, treg32, (8*sizeof(treg32)-1), "Flag in 31'st bit of 32 bit register") }, + { FLDATAD (FLREG32, treg32, 8*sizeof(treg32), "Flag outside of 32 bit register") }, + {NULL} }, + SCPE_IERR}, + { { {NULL} } } + }; + static DEVICE validate_test = { "TEST-REG", validate_units, NULL, NULL, 3, 16, 22, 4, 16, 16}; @@ -16245,17 +16363,19 @@ static t_stat test_register_validation (void) struct validation_test *v; DEVICE *v_devs[] = {&validate_test, NULL}; +t_stat tstat, stat = SCPE_OK; if (sim_switches & SWMASK ('T')) sim_messagef (SCPE_OK, "test_register_validation - starting\n"); for (v = validations; v->reg[0].name != NULL; v++) { validate_test.registers = v->reg; - if (SCPE_OK != sim_sanity_check_register_declarations (v_devs)) - break; + tstat = sim_sanity_check_register_declarations (v_devs); + if (tstat != v->expected_result) + stat = tstat; } if (sim_switches & SWMASK ('T')) sim_messagef (SCPE_OK, "test_register_validation - done\n"); -return SCPE_OK; +return stat; } typedef const char *(*parse_function)(const char *input, char *output, char end_char); diff --git a/sim_defs.h b/sim_defs.h index d0555c23..ab16ab58 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -1026,7 +1026,7 @@ struct MEMFILE { _RegCheck(#nm,&(loc),rdx,wd,off,dep,desc,flds,qptr,siz,sizeof((loc)),REGDATA),(fl) /* v3 compatible macro */ #define XRDATA(nm,loc,rdx,wd,off,dep,siz,str) \ - _RegCheck(#nm,loc,rdx,wd,off,dep,NULL,NULL,0,siz,sizeof((loc)),XRDATA),(fl) + _RegCheck(#nm,loc,rdx,wd,off,dep,NULL,NULL,0,siz,sizeof((loc)),XRDATA) /* Right Justified Octal Register Data */ #define ORDATA(nm,loc,wd) \ @@ -1079,11 +1079,11 @@ struct MEMFILE { _RegCheck(#nm,aloc,rdx,wd,0,dep,desc,flds,0,0,sizeof(*(aloc)),BRDATADF) /* Arrayed register whose data is kept in a standard C array Register */ #define CRDATA(nm,aloc,rdx,wd,dep) \ - _RegCheck(#nm,aloc,rdx,wd,0,dep,NULL,NULL,0,0,sizeof(**(aloc)),CRDATA) + _RegCheck(#nm,aloc,rdx,wd,0,dep,NULL,NULL,0,0,sizeof(**(&aloc)),CRDATA) #define CRDATAD(nm,aloc,rdx,wd,dep,desc) \ - _RegCheck(#nm,aloc,rdx,wd,0,dep,desc,NULL,0,0,sizeof(**(aloc)),CRDATAD) + _RegCheck(#nm,aloc,rdx,wd,0,dep,desc,NULL,0,0,sizeof(**(&aloc)),CRDATAD) #define CRDATADF(nm,aloc,rdx,wd,dep,desc,flds) \ - _RegCheck(#nm,aloc,rdx,wd,0,dep,desc,flds,0,0,sizeof(**(aloc)),CRDATADF) + _RegCheck(#nm,aloc,rdx,wd,0,dep,desc,flds,0,0,sizeof(**(&aloc)),CRDATADF) /* Range of memory whose data is successive scalar values accessed like an array Register */ #define VBRDATA(nm,loc,rdx,wd,dep) \