/*-------------------------------------------------------------------*/ int ARCH_DEP(initial_cpu_reset) (REGS *regs) { int rc1 = 0, rc; /* Clear reset pending indicators */ regs->sigpireset = regs->sigpreset = 0; /* Clear the registers */ memset ( ®s->psw, 0, sizeof(regs->psw) ); memset ( ®s->captured_zpsw, 0, sizeof(regs->captured_zpsw) ); #ifndef NOCHECK_AEA_ARRAY_BOUNDS memset ( ®s->cr_struct, 0, sizeof(regs->cr_struct) ); #else memset ( ®s->cr, 0, sizeof(regs->cr) ); #endif regs->fpc = 0; regs->PX = 0; regs->psw.AMASK_G = AMASK24; /* Ensure memory sizes are properly indicated */ regs->mainstor = sysblk.mainstor; regs->storkeys = sysblk.storkeys; regs->mainlim = sysblk.mainsize ? (sysblk.mainsize - 1) : 0; regs->psa = (PSA_3XX*)regs->mainstor; /* Perform a CPU reset (after setting PSA) */ rc1 = ARCH_DEP(cpu_reset) (regs); regs->todpr = 0; regs->clkc = 0; set_cpu_timer(regs, 0); #ifdef _FEATURE_INTERVAL_TIMER set_int_timer(regs, 0); #endif /* The breaking event address register is initialised to 1 */ regs->bear = 1; /* Initialize external interrupt masks in control register 0 */ regs->CR(0) = CR0_XM_INTKEY | CR0_XM_EXTSIG | (FACILITY_ENABLED(INTERVAL_TIMER, regs) ? CR0_XM_ITIMER : 0); #if defined(FEATURE_S370_CHANNEL) && !defined(FEATURE_ACCESS_REGISTERS) /* For S/370 initialize the channel masks in CR2 */ regs->CR(2) = 0xFFFFFFFF; #endif /* defined(FEATURE_S370_CHANNEL) && !defined(FEATURE_ACCESS_REGISTERS) */ regs->chanset = #if defined(FEATURE_CHANNEL_SWITCHING) regs->cpuad < FEATURE_LCSS_MAX ? regs->cpuad : #endif /*defined(FEATURE_CHANNEL_SWITCHING)*/ 0xFFFF; /* Initialize the machine check masks in control register 14 */ regs->CR(14) = CR14_CHKSTOP | CR14_SYNCMCEL | CR14_XDMGRPT; #ifndef FEATURE_LINKAGE_STACK /* For S/370 initialize the MCEL address in CR15 */ regs->CR(15) = 512; #endif /*!FEATURE_LINKAGE_STACK*/ if(regs->host && regs->guestregs) if( (rc = ARCH_DEP(initial_cpu_reset)(regs->guestregs)) ) rc1 = rc; #ifdef FEATURE_MESSAGE_SECURITY_ASSIST_EXTENSION_3 renew_wrapping_keys(); #endif /* FEATURE_MESSAGE_SECURITY_ASSIST_EXTENSION_3 */ return rc1; } /* end function initial_cpu_reset */
void ARCH_DEP(diagf18_call) (int r1, int r2, REGS *regs) { /* Guest related paramters and values */ U16 options; /* supplied options */ #if 0 if (sizeof(CPB) != 16) { logmsg("CPB size not 8: %d\n",sizeof(CPB)); } #endif /* Specification exception if Rx is not even/odd or facility not enabled */ if ( (!FACILITY_ENABLED(HOST_RESOURCE_ACCESS,regs)) || ((r1 & 0x1) != 0) ) { ARCH_DEP(program_interrupt) (regs, PGM_SPECIFICATION_EXCEPTION); } switch(regs->GR_L(r1)) { /*--------------------------------------------------------*/ /* Perform the Query Operation */ /*--------------------------------------------------------*/ case QUERY: /* Specification exception if CPB is not on a doubleword boundary */ if ( (regs->GR(2) & 0x7 ) !=0 ) { ARCH_DEP(program_interrupt) (regs, PGM_SPECIFICATION_EXCEPTION); } /* Store the CPB at the designated location */ ARCH_DEP(wstorec) (&cap,(BYTE)sizeof(CPB)-1,(VADR)GR_A(r2,regs),USE_REAL_ADDR,regs); break; #if defined(CSOCKET) /*--------------------------------------------------------*/ /* Perform Socket Function in Compatibility Mode */ /*--------------------------------------------------------*/ case CSOCKET: #if defined(FEATURE_ESAME) if (regs->psw.amode64) { ARCH_DEP(program_interrupt) (regs, PGM_SPECIFICATION_EXCEPTION); } #endif /* defined(ESAME) */ break; #endif /* defined(CSOCKET) */ #if defined(CFILE) /*--------------------------------------------------------*/ /* Perform File Operation in Compatibility Mode */ /*--------------------------------------------------------*/ case CFILE: #if defined(FEATURE_ESAME) if (regs->psw.amode64) { ARCH_DEP(program_interrupt) (regs, PGM_SPECIFICATION_EXCEPTION); } #endif /* defined(ESAME) */ options = df18_ck_opts ( (U16)regs->GR_L(r1+1) & 0x0000FFFF, (U16) COMPAT_INVALID, regs ); /* Retrieve the Parameter Block address from Ry */ ARCH_DEP(hdiagf18_FC) (options, (VADR)GR_A(r2,regs), regs); break; #endif /* defined(CFILE) */ #if defined(NSOCKET) /*--------------------------------------------------------*/ /* Perform Socket Function in Native Mode */ /*--------------------------------------------------------*/ case NSOCKET: break; #endif /* defined(NSOCKET) */ #if defined(NFILE) /*--------------------------------------------------------*/ /* Perform File Operation in Native Mode */ /*--------------------------------------------------------*/ case NFILE: break; #endif /* defined(NFILE) */ default: ARCH_DEP(program_interrupt)(regs, PGM_SPECIFICATION_EXCEPTION); } /* end switch(regs->GR_L(r1)) */ } /* end function ARCH_DEP(host_rsc_acc) */