Let's check if the UV really protected all the memory we donated. Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> --- s390x/uv-host.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/s390x/uv-host.c b/s390x/uv-host.c index a1a6d120..0f0b18a1 100644 --- a/s390x/uv-host.c +++ b/s390x/uv-host.c @@ -142,7 +142,8 @@ static void test_cpu_destroy(void) static void test_cpu_create(void) { int rc; - unsigned long tmp; + unsigned long tmp, i; + uint8_t *access_ptr; report_prefix_push("csc"); uvcb_csc.header.len = sizeof(uvcb_csc); @@ -194,6 +195,18 @@ static void test_cpu_create(void) report(rc == 0 && uvcb_csc.header.rc == UVC_RC_EXECUTED && uvcb_csc.cpu_handle, "success"); + rc = 1; + for (i = 0; i < uvcb_qui.cpu_stor_len / PAGE_SIZE; i++) { + expect_pgm_int(); + access_ptr = (void *)uvcb_csc.stor_origin + PAGE_SIZE * i; + *access_ptr = 42; + if (clear_pgm_int() != PGM_INT_CODE_SECURE_STOR_ACCESS) { + rc = 0; + break; + } + } + report(rc, "Storage protection"); + tmp = uvcb_csc.stor_origin; uvcb_csc.stor_origin = (unsigned long)memalign(PAGE_SIZE, uvcb_qui.cpu_stor_len); rc = uv_call(0, (uint64_t)&uvcb_csc); @@ -205,8 +218,9 @@ static void test_cpu_create(void) static void test_config_create(void) { int rc; - unsigned long vsize, tmp; + unsigned long vsize, tmp, i; static struct uv_cb_cgc uvcb; + uint8_t *access_ptr; uvcb_cgc.header.cmd = UVC_CMD_CREATE_SEC_CONF; uvcb_cgc.header.len = sizeof(uvcb_cgc); @@ -292,6 +306,30 @@ static void test_config_create(void) rc = uv_call(0, (uint64_t)&uvcb_cgc); report(rc == 0 && uvcb_cgc.header.rc == UVC_RC_EXECUTED, "successful"); + rc = 1; + for (i = 0; i < vsize / PAGE_SIZE; i++) { + expect_pgm_int(); + access_ptr = (void *)uvcb_cgc.conf_var_stor_origin + PAGE_SIZE * i; + *access_ptr = 42; + if (clear_pgm_int() != PGM_INT_CODE_SECURE_STOR_ACCESS) { + rc = 0; + break; + } + } + report(rc, "Base storage protection"); + + rc = 1; + for (i = 0; i < uvcb_qui.conf_base_phys_stor_len / PAGE_SIZE; i++) { + expect_pgm_int(); + access_ptr = (void *)uvcb_cgc.conf_base_stor_origin + PAGE_SIZE * i; + *access_ptr = 42; + if (clear_pgm_int() != PGM_INT_CODE_SECURE_STOR_ACCESS) { + rc = 0; + break; + } + } + report(rc, "Variable storage protection"); + uvcb_cgc.header.rc = 0; uvcb_cgc.header.rrc = 0; tmp = uvcb_cgc.guest_handle; -- 2.34.1