void cgibin_reg_general(WEBBLK *webblk) { int i; REGS *regs; regs = sysblk.regs[sysblk.pcpu]; if (!regs) regs = &sysblk.dummyregs; html_header(webblk); hprintf(webblk->sock, "<H2>General Registers</H2>\n"); hprintf(webblk->sock, "<PRE>\n"); if(regs->arch_mode != ARCH_900) for (i = 0; i < 16; i++) hprintf(webblk->sock, "GR%2.2d=%8.8X%s", i, regs->GR_L(i), ((i & 0x03) == 0x03) ? "\n" : "\t"); else for (i = 0; i < 16; i++) hprintf(webblk->sock, "GR%1.1X=%16.16" I64_FMT "X%s", i, (U64)regs->GR_G(i), ((i & 0x03) == 0x03) ? "\n" : " "); hprintf(webblk->sock, "</PRE>\n"); html_footer(webblk); }
/*-------------------------------------------------------------------*/ int ARCH_DEP(load_ipl) (U16 lcss, U16 devnum, int cpu, int clear) { REGS *regs; /* -> Regs */ DEVBLK *dev; /* -> Device control block */ int i; /* Array subscript */ BYTE unitstat; /* IPL device unit status */ BYTE chanstat; /* IPL device channel status */ int rc; /* Get started */ if ((rc = ARCH_DEP(common_load_begin) (cpu, clear)) ) return rc; /* Ensure CPU is online */ if (!IS_CPU_ONLINE(cpu)) { char buf[80]; MSGBUF(buf, "CP%02.2X Offline", devnum); WRMSG (HHC00810, "E", PTYPSTR(sysblk.pcpu), sysblk.pcpu, buf); return -1; } /* The actual IPL proper starts here... */ regs = sysblk.regs[cpu]; /* Point to IPL CPU's registers */ /* Point to the device block for the IPL device */ dev = find_device_by_devnum (lcss,devnum); if (dev == NULL) { char buf[80]; MSGBUF(buf, "device %4.4X not found", devnum); WRMSG (HHC00810, "E", PTYPSTR(sysblk.pcpu), sysblk.pcpu, buf); HDC1(debug_cpu_state, regs); return -1; } if(sysblk.haveiplparm) { for(i=0;i<16;i++) { regs->GR_L(i)=fetch_fw(&sysblk.iplparmstring[i*4]); } sysblk.haveiplparm=0; } /* Set Main Storage Reference and Update bits */ STORAGE_KEY(regs->PX, regs) |= (STORKEY_REF | STORKEY_CHANGE); sysblk.main_clear = sysblk.xpnd_clear = 0; /* Build the IPL CCW at location 0 */ regs->psa->iplpsw[0] = 0x02; /* CCW command = Read */ regs->psa->iplpsw[1] = 0; /* Data address = zero */ regs->psa->iplpsw[2] = 0; regs->psa->iplpsw[3] = 0; regs->psa->iplpsw[4] = CCW_FLAGS_CC | CCW_FLAGS_SLI; /* CCW flags */ regs->psa->iplpsw[5] = 0; /* Reserved byte */ regs->psa->iplpsw[6] = 0; /* Byte count = 24 */ regs->psa->iplpsw[7] = 24; /* Enable the subchannel for the IPL device */ dev->pmcw.flag5 |= PMCW5_E; /* Build the operation request block */ /*@IWZ*/ memset (&dev->orb, 0, sizeof(ORB)); /*@IWZ*/ dev->busy = 1; RELEASE_INTLOCK(NULL); /* Execute the IPL channel program */ ARCH_DEP(execute_ccw_chain) (dev); OBTAIN_INTLOCK(NULL); /* Clear the interrupt pending and device busy conditions */ obtain_lock (&sysblk.iointqlk); DEQUEUE_IO_INTERRUPT_QLOCKED(&dev->ioint); DEQUEUE_IO_INTERRUPT_QLOCKED(&dev->pciioint); DEQUEUE_IO_INTERRUPT_QLOCKED(&dev->attnioint); release_lock(&sysblk.iointqlk); dev->busy = 0; dev->scsw.flag2 = 0; dev->scsw.flag3 = 0; /* Check that load completed normally */ unitstat = dev->scsw.unitstat; chanstat = dev->scsw.chanstat; if (unitstat != (CSW_CE | CSW_DE) || chanstat != 0) { char buf[80]; char buf2[16]; memset(buf,0,sizeof(buf)); for (i=0; i < (int)dev->numsense; i++) { MSGBUF(buf2, "%2.2X", dev->sense[i]); strlcat(buf, buf2, sizeof(buf) ); if ((i & 3) == 3) strlcat(buf, " ", sizeof(buf)); } { char buffer[256]; MSGBUF(buffer, "architecture mode %s, csw status %2.2X%2.2X, sense %s", get_arch_mode_string((REGS *)0), unitstat, chanstat, buf); WRMSG (HHC00828, "E", PTYPSTR(sysblk.pcpu), sysblk.pcpu, buffer); } HDC1(debug_cpu_state, regs); return -1; } #ifdef FEATURE_S370_CHANNEL /* Test the EC mode bit in the IPL PSW */ if (regs->psa->iplpsw[1] & 0x08) { /* In EC mode, store device address at locations 184-187 */ STORE_FW(regs->psa->ioid, dev->devnum); } else { /* In BC mode, store device address at locations 2-3 */ STORE_HW(regs->psa->iplpsw + 2, dev->devnum); } #endif /*FEATURE_S370_CHANNEL*/ #ifdef FEATURE_CHANNEL_SUBSYSTEM /* Set LPUM */ dev->pmcw.lpum = 0x80; STORE_FW(regs->psa->ioid, (dev->ssid<<16)|dev->subchan); /* Store zeroes at locations 188-191 */ memset (regs->psa->ioparm, 0, 4); #endif /*FEATURE_CHANNEL_SUBSYSTEM*/ /* Save IPL device number, cpu number and lcss */ sysblk.ipldev = devnum; sysblk.iplcpu = regs->cpuad; sysblk.ipllcss = lcss; sysblk.ipled = TRUE; /* Finish up... */ return ARCH_DEP(common_load_finish) (regs); } /* end function load_ipl */
void cgibin_debug_registers(WEBBLK *webblk) { int i, cpu = 0; int select_gr, select_cr, select_ar; char *value; REGS *regs; if((value = cgi_variable(webblk,"cpu"))) cpu = atoi(value); if((value = cgi_variable(webblk,"select_gr")) && *value == 'S') select_gr = 1; else select_gr = 0; if((value = cgi_variable(webblk,"select_cr")) && *value == 'S') select_cr = 1; else select_cr = 0; if((value = cgi_variable(webblk,"select_ar")) && *value == 'S') select_ar = 1; else select_ar = 0; /* Validate cpu number */ if (cpu < 0 || cpu >= MAX_CPU || !IS_CPU_ONLINE(cpu)) for (cpu = 0; cpu < MAX_CPU; cpu++) if(IS_CPU_ONLINE(cpu)) break; if(cpu < MAX_CPU) regs = sysblk.regs[cpu]; else regs = sysblk.regs[sysblk.pcpu]; if (!regs) regs = &sysblk.dummyregs; if((value = cgi_variable(webblk,"alter_gr")) && *value == 'A') { for(i = 0; i < 16; i++) { char regname[16]; sprintf(regname,"alter_gr%d",i); if((value = cgi_variable(webblk,regname))) { if(regs->arch_mode != ARCH_900) sscanf(value,"%"I32_FMT"x",&(regs->GR_L(i))); else sscanf(value,"%"I64_FMT"x",&(regs->GR_G(i))); } } } if((value = cgi_variable(webblk,"alter_cr")) && *value == 'A') { for(i = 0; i < 16; i++) { char regname[16]; sprintf(regname,"alter_cr%d",i); if((value = cgi_variable(webblk,regname))) { if(regs->arch_mode != ARCH_900) sscanf(value,"%"I32_FMT"x",&(regs->CR_L(i))); else sscanf(value,"%"I64_FMT"x",&(regs->CR_G(i))); } } } if((value = cgi_variable(webblk,"alter_ar")) && *value == 'A') { for(i = 0; i < 16; i++) { char regname[16]; sprintf(regname,"alter_ar%d",i); if((value = cgi_variable(webblk,regname))) sscanf(value,"%x",&(regs->AR(i))); } } html_header(webblk); hprintf(webblk->sock,"<form method=post>\n" "<select type=submit name=cpu>\n"); for(i = 0; i < MAX_CPU; i++) if(IS_CPU_ONLINE(i)) hprintf(webblk->sock,"<option value=%d%s>CPU%4.4X</option>\n", i,i==cpu?" selected":"",i); hprintf(webblk->sock,"</select>\n" "<input type=submit name=selcpu value=\"Select\">\n" "<input type=hidden name=cpu value=%d>\n" "<input type=hidden name=select_gr value=%c>\n" "<input type=hidden name=select_cr value=%c>\n" "<input type=hidden name=select_ar value=%c>\n", cpu, select_gr?'S':'H',select_cr?'S':'H',select_ar?'S':'H'); hprintf(webblk->sock,"Mode: %s\n",get_arch_mode_string(regs)); hprintf(webblk->sock,"</form>\n"); if(!select_gr) { hprintf(webblk->sock,"<form method=post>\n" "<input type=submit name=select_gr " "value=\"Select General Registers\">\n" "<input type=hidden name=cpu value=%d>\n" "<input type=hidden name=select_cr value=%c>\n" "<input type=hidden name=select_ar value=%c>\n" "</form>\n",cpu,select_cr?'S':'H',select_ar?'S':'H'); } else { hprintf(webblk->sock,"<form method=post>\n" "<input type=submit name=select_gr " "value=\"Hide General Registers\">\n" "<input type=hidden name=cpu value=%d>\n" "<input type=hidden name=select_cr value=%c>\n" "<input type=hidden name=select_ar value=%c>\n" "</form>\n",cpu,select_cr?'S':'H',select_ar?'S':'H'); hprintf(webblk->sock,"<form method=post>\n" "<table>\n"); for(i = 0; i < 16; i++) { if(regs->arch_mode != ARCH_900) hprintf(webblk->sock,"%s<td>GR%d</td><td><input type=text name=alter_gr%d size=8 " "value=%8.8X></td>\n%s", (i&3)==0?"<tr>\n":"",i,i,regs->GR_L(i),((i&3)==3)?"</tr>\n":""); else hprintf(webblk->sock,"%s<td>GR%d</td><td><input type=text name=alter_gr%d size=16 " "value=%16.16" I64_FMT "X></td>\n%s", (i&3)==0?"<tr>\n":"",i,i,(U64)regs->GR_G(i),((i&3)==3)?"</tr>\n":""); } hprintf(webblk->sock,"</table>\n" "<input type=submit name=refresh value=\"Refresh\">\n" "<input type=submit name=alter_gr value=\"Alter\">\n" "<input type=hidden name=cpu value=%d>\n" "<input type=hidden name=select_gr value=S>\n" "<input type=hidden name=select_cr value=%c>\n" "<input type=hidden name=select_ar value=%c>\n" "</form>\n",cpu,select_cr?'S':'H',select_ar?'S':'H'); } if(!select_cr) { hprintf(webblk->sock,"<form method=post>\n" "<input type=submit name=select_cr " "value=\"Select Control Registers\">\n" "<input type=hidden name=cpu value=%d>\n" "<input type=hidden name=select_gr value=%c>\n" "<input type=hidden name=select_ar value=%c>\n" "</form>\n",cpu,select_gr?'S':'H',select_ar?'S':'H'); } else { hprintf(webblk->sock,"<form method=post>\n" "<input type=submit name=select_cr " "value=\"Hide Control Registers\">\n" "<input type=hidden name=cpu value=%d>\n" "<input type=hidden name=select_gr value=%c>\n" "<input type=hidden name=select_ar value=%c>\n" "</form>\n",cpu,select_gr?'S':'H',select_ar?'S':'H'); hprintf(webblk->sock,"<form method=post>\n" "<table>\n"); for(i = 0; i < 16; i++) { if(regs->arch_mode != ARCH_900) hprintf(webblk->sock,"%s<td>CR%d</td><td><input type=text name=alter_cr%d size=8 " "value=%8.8X></td>\n%s", (i&3)==0?"<tr>\n":"",i,i,regs->CR_L(i),((i&3)==3)?"</tr>\n":""); else hprintf(webblk->sock,"%s<td>CR%d</td><td><input type=text name=alter_cr%d size=16 " "value=%16.16" I64_FMT "X></td>\n%s", (i&3)==0?"<tr>\n":"",i,i,(U64)regs->CR_G(i),((i&3)==3)?"</tr>\n":""); } hprintf(webblk->sock,"</table>\n" "<input type=submit name=refresh value=\"Refresh\">\n" "<input type=submit name=alter_cr value=\"Alter\">\n" "<input type=hidden name=cpu value=%d>\n" "<input type=hidden name=select_cr value=S>\n" "<input type=hidden name=select_gr value=%c>\n" "<input type=hidden name=select_ar value=%c>\n" "</form>\n",cpu,select_gr?'S':'H',select_ar?'S':'H'); } if(regs->arch_mode != ARCH_370) { if(!select_ar) { hprintf(webblk->sock,"<form method=post>\n" "<input type=submit name=select_ar " "value=\"Select Access Registers\">\n" "<input type=hidden name=cpu value=%d>\n" "<input type=hidden name=select_gr value=%c>\n" "<input type=hidden name=select_cr value=%c>\n" "</form>\n",cpu,select_gr?'S':'H',select_cr?'S':'H'); } else { hprintf(webblk->sock,"<form method=post>\n" "<input type=submit name=select_ar " "value=\"Hide Access Registers\">\n" "<input type=hidden name=cpu value=%d>\n" "<input type=hidden name=select_gr value=%c>\n" "<input type=hidden name=select_cr value=%c>\n" "</form>\n",cpu,select_gr?'S':'H',select_cr?'S':'H'); hprintf(webblk->sock,"<form method=post>\n" "<table>\n"); for(i = 0; i < 16; i++) { hprintf(webblk->sock,"%s<td>AR%d</td><td><input type=text name=alter_ar%d size=8 " "value=%8.8X></td>\n%s", (i&3)==0?"<tr>\n":"",i,i,regs->AR(i),((i&3)==3)?"</tr>\n":""); } hprintf(webblk->sock,"</table>\n" "<input type=submit name=refresh value=\"Refresh\">\n" "<input type=submit name=alter_ar value=\"Alter\">\n" "<input type=hidden name=cpu value=%d>\n" "<input type=hidden name=select_gr value=%c>\n" "<input type=hidden name=select_cr value=%c>\n" "<input type=hidden name=select_ar value=S>\n" "</form>\n",cpu,select_gr?'S':'H',select_cr?'S':'H'); } } html_footer(webblk); }
/*-------------------------------------------------------------------*/ int ARCH_DEP(load_ipl) (U16 lcss, U16 devnum, int cpu, int clear) { REGS *regs; /* -> Regs */ DEVBLK *dev; /* -> Device control block */ int i; /* Array subscript */ BYTE unitstat; /* IPL device unit status */ BYTE chanstat; /* IPL device channel status */ /* Get started */ if (ARCH_DEP(common_load_begin) (cpu, clear) != 0) return -1; /* The actual IPL proper starts here... */ regs = sysblk.regs[cpu]; /* Point to IPL CPU's registers */ /* Point to the device block for the IPL device */ dev = find_device_by_devnum (lcss,devnum); if (dev == NULL) { logmsg (_("HHCCP027E Device %4.4X not in configuration%s\n"), devnum, (sysblk.arch_mode == ARCH_370 ? " or not conneceted to channelset" : "")); HDC1(debug_cpu_state, regs); return -1; } #if defined(OPTION_IPLPARM) if(sysblk.haveiplparm) { for(i=0;i<16;i++) { regs->GR_L(i)=fetch_fw(&sysblk.iplparmstring[i*4]); } sysblk.haveiplparm=0; } #endif /* Set Main Storage Reference and Update bits */ STORAGE_KEY(regs->PX, regs) |= (STORKEY_REF | STORKEY_CHANGE); sysblk.main_clear = sysblk.xpnd_clear = 0; /* Build the IPL CCW at location 0 */ regs->psa->iplpsw[0] = 0x02; /* CCW command = Read */ regs->psa->iplpsw[1] = 0; /* Data address = zero */ regs->psa->iplpsw[2] = 0; regs->psa->iplpsw[3] = 0; regs->psa->iplpsw[4] = CCW_FLAGS_CC | CCW_FLAGS_SLI; /* CCW flags */ regs->psa->iplpsw[5] = 0; /* Reserved byte */ regs->psa->iplpsw[6] = 0; /* Byte count = 24 */ regs->psa->iplpsw[7] = 24; /* Enable the subchannel for the IPL device */ dev->pmcw.flag5 |= PMCW5_E; /* Build the operation request block */ /*@IWZ*/ memset (&dev->orb, 0, sizeof(ORB)); /*@IWZ*/ dev->busy = 1; RELEASE_INTLOCK(NULL); /* Execute the IPL channel program */ ARCH_DEP(execute_ccw_chain) (dev); OBTAIN_INTLOCK(NULL); /* Clear the interrupt pending and device busy conditions */ obtain_lock (&sysblk.iointqlk); DEQUEUE_IO_INTERRUPT_QLOCKED(&dev->ioint); DEQUEUE_IO_INTERRUPT_QLOCKED(&dev->pciioint); DEQUEUE_IO_INTERRUPT_QLOCKED(&dev->attnioint); release_lock(&sysblk.iointqlk); dev->busy = 0; dev->scsw.flag2 = 0; dev->scsw.flag3 = 0; /* Check that load completed normally */ #ifdef FEATURE_S370_CHANNEL unitstat = dev->csw[4]; chanstat = dev->csw[5]; #endif /*FEATURE_S370_CHANNEL*/ #ifdef FEATURE_CHANNEL_SUBSYSTEM unitstat = dev->scsw.unitstat; chanstat = dev->scsw.chanstat; #endif /*FEATURE_CHANNEL_SUBSYSTEM*/ if (unitstat != (CSW_CE | CSW_DE) || chanstat != 0) { logmsg (_("HHCCP029E %s mode IPL failed: CSW status=%2.2X%2.2X\n" " Sense="), get_arch_mode_string(regs), unitstat, chanstat); for (i=0; i < (int)dev->numsense; i++) { logmsg ("%2.2X", dev->sense[i]); if ((i & 3) == 3) logmsg(" "); } logmsg ("\n"); HDC1(debug_cpu_state, regs); return -1; } #ifdef FEATURE_S370_CHANNEL /* Test the EC mode bit in the IPL PSW */ if (regs->psa->iplpsw[1] & 0x08) { /* In EC mode, store device address at locations 184-187 */ STORE_FW(regs->psa->ioid, dev->devnum); } else { /* In BC mode, store device address at locations 2-3 */ STORE_HW(regs->psa->iplpsw + 2, dev->devnum); } #endif /*FEATURE_S370_CHANNEL*/ #ifdef FEATURE_CHANNEL_SUBSYSTEM /* Set LPUM */ dev->pmcw.lpum = 0x80; STORE_FW(regs->psa->ioid, (dev->ssid<<16)|dev->subchan); /* Store zeroes at locations 188-191 */ memset (regs->psa->ioparm, 0, 4); #endif /*FEATURE_CHANNEL_SUBSYSTEM*/ /* Save IPL device number, cpu number and lcss */ sysblk.ipldev = devnum; sysblk.iplcpu = regs->cpuad; sysblk.ipllcss = lcss; /* Finish up... */ return ARCH_DEP(common_load_finish) (regs); } /* end function load_ipl */