From fbf59246a0283b6929cab46a9081733a2dcfa2ca Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Sun, 19 Mar 2017 22:15:49 -0400 Subject: [PATCH] KA10: Fixed coverity errors. --- PDP10/ka10_defs.h | 3 ++ PDP10/ka10_dk.c | 3 +- PDP10/ka10_dp.c | 5 +- PDP10/ka10_dt.c | 2 + PDP10/ka10_rc.c | 3 +- PDP10/ka10_rp.c | 113 +++++++++++++++++++++++++--------------------- PDP10/ka10_sys.c | 7 ++- 7 files changed, 80 insertions(+), 56 deletions(-) diff --git a/PDP10/ka10_defs.h b/PDP10/ka10_defs.h index ac81f38..47d8094 100644 --- a/PDP10/ka10_defs.h +++ b/PDP10/ka10_defs.h @@ -261,6 +261,8 @@ extern DEVICE rpa_dev; extern DEVICE rpb_dev; extern DEVICE rpc_dev; extern DEVICE rpd_dev; +extern DEVICE rsa_dev; +extern DEVICE tua_dev; extern DEVICE lpt_dev; extern DEVICE ptp_dev; extern DEVICE ptr_dev; @@ -321,6 +323,7 @@ int df10_write(struct df10 *df); #define NUM_DEVS_DT 1 #define NUM_DEVS_DK 1 #define NUM_DEVS_RP 1 +#define NUM_DEVS_RS 0 #define NUM_DEVS_TU 0 /* Global data */ diff --git a/PDP10/ka10_dk.c b/PDP10/ka10_dk.c index 014e534..784e4fd 100644 --- a/PDP10/ka10_dk.c +++ b/PDP10/ka10_dk.c @@ -91,11 +91,12 @@ DEVICE dk_dev = { t_stat dk_devio(uint32 dev, uint64 *data) { int unit = (dev - DK_DEVNUM) >> 2; - UNIT *uptr = &dk_unit[unit]; + UNIT *uptr; int32 t; if (unit < 0 || unit >= NUM_DEVS_DK) return SCPE_OK; + uptr = &dk_unit[unit]; switch (dev & 3) { case CONI: *data = (uint64)(uptr->STAT_REG); diff --git a/PDP10/ka10_dp.c b/PDP10/ka10_dp.c index b6c7d04..8f33dd3 100644 --- a/PDP10/ka10_dp.c +++ b/PDP10/ka10_dp.c @@ -324,7 +324,7 @@ DEVICE *dp_devs[] = { t_stat dp_devio(uint32 dev, uint64 *data) { uint64 res; int ctlr = (dev - DP_DEVNUM) >> 2; - struct df10 *df10 = &dp_df10[ctlr]; + struct df10 *df10; DEVICE *dptr; UNIT *uptr; int unit; @@ -335,6 +335,7 @@ t_stat dp_devio(uint32 dev, uint64 *data) { if (ctlr < 0 || ctlr >= NUM_DEVS_DP) return SCPE_OK; + df10 = &dp_df10[ctlr]; dptr = dp_devs[ctlr]; unit = dp_cur_unit[ctlr]; uptr = &dp_unit[(ctlr * NUM_UNITS_DP) + unit]; @@ -582,7 +583,7 @@ t_stat dp_svc (UNIT *uptr) /* Read the block */ int da = ((cyl * dp_drv_tab[dtype].surf + surf) * dp_drv_tab[dtype].sect + sect) * RP_NUMWD; - sim_fseek(uptr->fileref, da * sizeof(uint64), SEEK_SET); + (void)sim_fseek(uptr->fileref, da * sizeof(uint64), SEEK_SET); wc = sim_fread (&dp_buf[ctlr][0], sizeof(uint64), RP_NUMWD, uptr->fileref); for (; wc < RP_NUMWD; wc++) diff --git a/PDP10/ka10_dt.c b/PDP10/ka10_dt.c index fc1e686..2f32cf1 100644 --- a/PDP10/ka10_dt.c +++ b/PDP10/ka10_dt.c @@ -417,8 +417,10 @@ t_stat dt_devio(uint32 dev, uint64 *data) { } if (*data & (DTC_FWDRV|DTC_RVDRV|DTC_STSTOP)) { i = DTC_GETUNI(dtsa); +#if DT_NUMDR < 8 if (i >= DT_NUMDR) break; +#endif if (*data & DTC_STSTOP) { if ((dt_unit[i].u4 & (DTC_MOT)) != 0) { dt_unit[i].u3 |= DTC_FNC_STOP; diff --git a/PDP10/ka10_rc.c b/PDP10/ka10_rc.c index 7edb0b0..3a2e899 100644 --- a/PDP10/ka10_rc.c +++ b/PDP10/ka10_rc.c @@ -191,7 +191,7 @@ DEVICE *rc_devs[] = { t_stat rc_devio(uint32 dev, uint64 *data) { int ctlr = (dev - RC_DEVNUM) >> 2; - struct df10 *df10 = &rc_df10[ctlr]; + struct df10 *df10; UNIT *uptr; DEVICE *dptr; int unit; @@ -203,6 +203,7 @@ t_stat rc_devio(uint32 dev, uint64 *data) { if (ctlr < 0 || ctlr >= NUM_DEVS_RC) return SCPE_OK; + df10 = &rc_df10[ctlr]; dptr = rc_devs[ctlr]; switch(dev & 3) { case CONI: diff --git a/PDP10/ka10_rp.c b/PDP10/ka10_rp.c index bd44381..8907eb1 100644 --- a/PDP10/ka10_rp.c +++ b/PDP10/ka10_rp.c @@ -29,9 +29,6 @@ #if (NUM_DEVS_RP > 0) -#define BUF_EMPTY(u) (u->hwmark == 0xFFFFFFFF) -#define CLR_BUF(u) u->hwmark = 0xFFFFFFFF - #define RP_NUMWD 128 /* 36bit words/sec */ #define RP_DEVNUM 0270 /* First device number */ #define NUM_UNITS_RP 8 @@ -43,8 +40,13 @@ #define UNIT_M_DTYPE 7 #define UNIT_WLK (1 << UNIT_V_WLK) #define UNIT_DTYPE (UNIT_M_DTYPE << UNIT_V_DTYPE) +#define DTYPE(x) (((x) & UNIT_M_DTYPE) << UNIT_V_DTYPE) #define GET_DTYPE(x) (((x) >> UNIT_V_DTYPE) & UNIT_M_DTYPE) #define UNIT_WPRT (UNIT_WLK | UNIT_RO) /* write protect */ +#define CNTRL_V_CTYPE (UNIT_V_UF + 4) +#define CNTRL_M_CTYPE 7 +#define GET_CNTRL(x) (((x) >> CNTRL_V_CTYPE) & CNTRL_M_CTYPE) +#define CNTRL(x) (((x) & CNTRL_M_CTYPE) << CNTRL_V_CTYPE) /* Parameters in the unit descriptor */ @@ -312,75 +314,75 @@ const char *rp_description (DEVICE *dptr); UNIT rp_unit[] = { /* Controller 1 */ { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(0), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(0), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(0), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(0), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(0), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(0), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(0), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(0), RP06_SIZE) }, #if (NUM_DEVS_RP > 1) /* Controller 2 */ { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(1), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(1), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(1), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(1), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(1), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(1), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(1), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(1), RP06_SIZE) }, #if (NUM_DEVS_RP > 2) /* Controller 3 */ { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(2), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(2), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(2), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(2), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(2), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(2), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(2), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(2), RP06_SIZE) }, #if (NUM_DEVS_RP > 3) /* Controller 4 */ { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(3), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(3), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(3), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(3), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(3), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(3), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(3), RP06_SIZE) }, { UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) }, + UNIT_ROABLE+DTYPE(RP06_DTYPE)+CNTRL(3), RP06_SIZE) }, #endif #endif #endif @@ -520,7 +522,7 @@ t_stat rp_devio(uint32 dev, uint64 *data) { } else if (rp_reg[ctlr] == 054) { *data = (t_uint64)(rp_rae[ctlr]); } else if ((rp_reg[ctlr] & 040) == 0) { - *data = (t_uint64)(rp_read(ctlr, rp_drive[ctlr], rp_reg[ctlr]) & 0777777); + *data = (t_uint64)(rp_read(ctlr, rp_drive[ctlr], rp_reg[ctlr]) & 0177777); *data |= ((t_uint64)(rp_drive[ctlr])) << 18; } *data |= ((t_uint64)(rp_reg[ctlr])) << 30; @@ -539,6 +541,18 @@ t_stat rp_devio(uint32 dev, uint64 *data) { df10->status |= CC_CHAN_ACT; return SCPE_OK; } + if ((*data & 1) == 0) { + return SCPE_OK; + } + + if (((*data >> 1) & 077) < FNC_XFER) { + df10->status |= CXR_ILC; + df10_setirq(df10); + sim_debug(DEBUG_DATAIO, dptr, + "RP %03o command abort %012llo, %d[%d] PC=%06o %06o\n", + dev, *data, ctlr, rp_drive[ctlr], PC, df10->status); + return SCPE_OK; + } rp_drive[ctlr] = (int)(*data >> 18) & 07; /* Check if access error */ if (rp_rae[ctlr] & (1 << rp_drive[ctlr])) { @@ -573,7 +587,7 @@ t_stat rp_devio(uint32 dev, uint64 *data) { (int)(*data & 0777777)); } } else { - if (rp_reg[ctlr] <= 040) { + if (rp_reg[ctlr] < 040 && rp_reg[ctlr] != 04) { rp_drive[ctlr] = (int)(*data >> 18) & 07; } } @@ -694,7 +708,7 @@ rp_write(int ctlr, int unit, int reg, uint32 data) { uptr->u4 &= 0177777; uptr->u4 |= data << 16; break; - case 010: /* error register 2 */ + case 014: /* error register 2 */ if (data != 0) uptr->u3 |= DS_ERR; uptr->u5 &= 0177777; @@ -708,7 +722,7 @@ rp_write(int ctlr, int unit, int reg, uint32 data) { uptr->u4 |= data; break; case 013: /* current cylinder */ - case 014: /* serial no */ + case 010: /* serial no */ case 015: /* error register 3 */ case 016: /* ecc position */ case 017: /* ecc pattern */ @@ -763,10 +777,12 @@ rp_read(int ctlr, int unit, int reg) { case 013: /* current cylinder */ temp = uptr->u5 & 0177777; break; - case 014: /* serial no */ + case 010: /* serial no */ + temp = (020 * ctlr) + (unit + 1); + break; case 003: /* maintenance */ case 007: /* look ahead */ - case 010: /* error register 2 */ + case 014: /* error register 2 */ case 015: /* error register 3 */ case 016: /* ecc position */ case 017: /* ecc pattern */ @@ -782,7 +798,7 @@ rp_read(int ctlr, int unit, int reg) { t_stat rp_svc (UNIT *uptr) { int dtype = GET_DTYPE(uptr->flags); - int ctlr; + int ctlr = GET_CNTRL(uptr->flags); int unit; DEVICE *dptr; struct df10 *df; @@ -791,14 +807,8 @@ t_stat rp_svc (UNIT *uptr) t_stat r; /* Find dptr, and df10 */ - for (ctlr = 0; ctlr < NUM_DEVS_RP; ctlr++) { - dptr = rp_devs[ctlr]; - unit = uptr - dptr->units; - if (unit < 8) - break; - } - if (unit > 8) - return SCPE_OK; + dptr = rp_devs[ctlr]; + unit = uptr - dptr->units; df = &rp_df10[ctlr]; /* Check if seeking */ if (uptr->u3 & DS_PIP) { @@ -979,7 +989,7 @@ t_stat rp_svc (UNIT *uptr) if (r) { sim_activate(uptr, 20); } else { - sim_debug(DEBUG_DETAIL, dptr, "RPA%o write done\n", unit); + sim_debug(DEBUG_DETAIL, dptr, "RPA%o write done\n", unit); uptr->u3 |= DS_DRY; uptr->u3 &= ~CR_GO; df->status &= ~BUSY; @@ -1031,6 +1041,7 @@ rp_boot(int32 unit_num, DEVICE * rptr) (void)sim_fseek(uptr->fileref, 0, SEEK_SET); (void)sim_fread (&rp_buf[0][0], sizeof(uint64), RP_NUMWD, uptr->fileref); + uptr->u3 |= DS_VV; addr = rp_buf[0][0] & RMASK; wc = (rp_buf[0][0] >> 18) & RMASK; ptr = 1; diff --git a/PDP10/ka10_sys.c b/PDP10/ka10_sys.c index 453d4b9..f014726 100644 --- a/PDP10/ka10_sys.c +++ b/PDP10/ka10_sys.c @@ -102,13 +102,18 @@ DEVICE *sim_devices[] = { #endif #endif #endif +#if (NUM_DEVS_RS > 0) + &rsa_dev, +#endif +#if (NUM_DEVS_TU > 0) + &tua_dev, +#endif #if (NUM_DEVS_RC > 0) &rca_dev, #if (NUM_DEVS_RC > 1) &rcb_dev, #endif #endif -// Insert RH TM #if (NUM_DEVS_DT > 0) &dt_dev, #endif