We already have some coverage of SSCH due to its use in start_ccw1_chain() in css_lib, but two more cases deserve our attention: - unaligned operand address. We check for misalignment by 1 and 2 bytes. - an invalid ORB structure. Signed-off-by: Nico Boehr <nrb@xxxxxxxxxxxxx> Reviewed-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> Reviewed-by: Pierre Morel <pmorel@xxxxxxxxxxxxx> --- s390x/css.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/s390x/css.c b/s390x/css.c index 6a2db79c8097..a90a0cd64e2b 100644 --- a/s390x/css.c +++ b/s390x/css.c @@ -464,6 +464,38 @@ static void test_stcrw(void) report_prefix_pop(); } +static void test_ssch(void) +{ + const int align_to = 4; + struct orb orb; + + if (!test_device_sid) { + report_skip("No device"); + return; + } + + report_prefix_push("Unaligned"); + for (int i = 1; i < align_to; i *= 2) { + report_prefix_pushf("%d", i); + + expect_pgm_int(); + ssch(test_device_sid, (struct orb *)(alignment_test_page + i)); + check_pgm_int_code(PGM_INT_CODE_SPECIFICATION); + + report_prefix_pop(); + } + report_prefix_pop(); + + report_prefix_push("Invalid ORB"); + + memset(&orb, 0xff, sizeof(orb)); + expect_pgm_int(); + ssch(test_device_sid, &orb); + check_pgm_int_code(PGM_INT_CODE_OPERAND); + + report_prefix_pop(); +} + static struct { const char *name; void (*func)(void); @@ -478,6 +510,7 @@ static struct { { "measurement block format1", test_schm_fmt1 }, { "msch", test_msch }, { "stcrw", test_stcrw }, + { "ssch", test_ssch }, { NULL, NULL } }; -- 2.31.1