> +/** > + * Test some bits in the instruction format that are specified to be ignored. > + */ > +static void test_instbits(void) > +{ > + SCCBHeader *h = (SCCBHeader *)pagebuf; > + int cc; > + > + expect_pgm_int(); > + sclp_mark_busy(); > + h->length = 8; > + sclp_setup_int(); > + > + asm volatile( > + " .insn rre,0xb2204200,%1,%2\n" /* servc %1,%2 */ > + " ipm %0\n" > + " srl %0,28" > + : "=&d" (cc) : "d" (valid_code), "a" (__pa(pagebuf)) > + : "cc", "memory"); > + if (lc->pgm_int_code) { > + sclp_handle_ext(); > + cc = 1; > + } else if (!cc) > + I wonder if something like the following would be possible: expect_pgm_int(); ... asm volatiole(); ... sclp_wait_busy(); check_pgm_int_code(PGM_INT_CODE_SPECIFICATION); We would have to clear "sclp_busy" when we get a progam interrupt on a servc instruction - shouldn't be too hard to add to the program exception handler. > + report(cc == 0, "Instruction format ignored bits"); > +} > + > +/** > + * Find a valid READ INFO command code; not all codes are always allowed, and > + * probing should be performed in the right order. > + */ > +static void find_valid_sclp_code(void) > +{ > + const unsigned int commands[] = { SCLP_CMDW_READ_SCP_INFO_FORCED, > + SCLP_CMDW_READ_SCP_INFO }; > + SCCBHeader *h = (SCCBHeader *)pagebuf; > + int i, cc; > + > + for (i = 0; i < ARRAY_SIZE(commands); i++) { > + sclp_mark_busy(); > + memset(h, 0, sizeof(*h)); > + h->length = 4096; > + > + valid_code = commands[i]; > + cc = sclp_service_call(commands[i], h); > + if (cc) > + break; > + if (h->response_code == SCLP_RC_NORMAL_READ_COMPLETION) > + return; > + if (h->response_code != SCLP_RC_INVALID_SCLP_COMMAND) > + break; > + } > + valid_code = 0; This can be dropped because ... > + report_abort("READ_SCP_INFO failed"); ... you abort here. -- Thanks, David / dhildenb