Re: [kvm-unit-tests PATCH v2 2/8] s390x: uv-host: Add uninitialized UV tests

Steffen Eiden
2022-07-08T09:10:14Z

On 7/6/22 08:40, Janosch Frank wrote:
> Let's also test for rc 0x3
>
> Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
> Reviewed-by: Nico Boehr <nrb@linux.ibm.com>
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
> ---
> s390x/uv-host.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 77 insertions(+), 2 deletions(-)
>
> diff --git a/s390x/uv-host.c b/s390x/uv-host.c
> index 983cb4a1..5aeacb42 100644
> --- a/s390x/uv-host.c
> +++ b/s390x/uv-host.c
> @@ -101,6 +101,25 @@ static void test_priv(void)
> report_prefix_pop();
> }
>
> +static void test_uv_uninitialized(void)
> +{
> + struct uv_cb_header uvcb = {};
> + int i;
> +
> + report_prefix_push("uninitialized");
> +
> + for (i = 0; cmds[i].name; i++) {
> + if (cmds[i].cmd == UVC_CMD_INIT_UV)
> + continue;
> + expect_pgm_int();
> + uvcb.cmd = cmds[i].cmd;
> + uvcb.len = cmds[i].len;
> + uv_call_once(0, (uint64_t)&uvcb);
> + report(uvcb.rc == UVC_RC_INV_STATE, "%s", cmds[i].name);
> + }
> + report_prefix_pop();
> +}
> +
> static void test_config_destroy(void)
> {
> int rc;
> @@ -468,13 +487,68 @@ static void test_invalid(void)
> report_prefix_pop();
> }
>
> +static void setup_test_clear(void)
> +{
> + unsigned long vsize;
> + int rc;
> +
> + uvcb_cgc.header.cmd = UVC_CMD_CREATE_SEC_CONF;
> + uvcb_cgc.header.len = sizeof(uvcb_cgc);
> +
> + uvcb_cgc.guest_stor_origin = 0;
> + uvcb_cgc.guest_stor_len = 42 * (1UL << 20);
> + vsize = uvcb_qui.conf_base_virt_stor_len +
> + ((uvcb_cgc.guest_stor_len / (1UL << 20)) * uvcb_qui.conf_virt_var_stor_len);
> +
> + uvcb_cgc.conf_base_stor_origin = (uint64_t)memalign(PAGE_SIZE * 4, uvcb_qui.conf_base_phys_stor_len);
> + uvcb_cgc.conf_var_stor_origin = (uint64_t)memalign(PAGE_SIZE, vsize);
> + uvcb_cgc.guest_asce = (uint64_t)memalign(PAGE_SIZE, 4 * PAGE_SIZE) | ASCE_DT_SEGMENT | REGION_TABLE_LENGTH | ASCE_P;
> + uvcb_cgc.guest_sca = (uint64_t)memalign(PAGE_SIZE * 4, PAGE_SIZE * 4);
> +
> + rc = uv_call(0, (uint64_t)&uvcb_cgc);
> + assert(rc == 0);
> +
> + uvcb_csc.header.len = sizeof(uvcb_csc);
> + uvcb_csc.header.cmd = UVC_CMD_CREATE_SEC_CPU;
> + uvcb_csc.guest_handle = uvcb_cgc.guest_handle;
> + uvcb_csc.stor_origin = (unsigned long)memalign(PAGE_SIZE, uvcb_qui.cpu_stor_len);
> + uvcb_csc.state_origin = (unsigned long)memalign(PAGE_SIZE, PAGE_SIZE);
> +
> + rc = uv_call(0, (uint64_t)&uvcb_csc);
> + assert(rc == 0);
> +}
> +
> static void test_clear(void)
> {
> - uint64_t *tmp = (void *)uvcb_init.stor_origin;
> + uint64_t *tmp;
> +
> + report_prefix_push("load normal reset");
> +
> + /*
> + * Setup a config and a cpu so we can check if a diag308 reset
> + * clears the donated memory and makes the pages unsecure.
> + */
> + setup_test_clear();
>
> diag308_load_reset(1);
> sclp_console_setup();
> - report(!*tmp, "memory cleared after reset 1");
> +
> + tmp = (void *)uvcb_init.stor_origin;
> + report(!*tmp, "uv init donated memory cleared");
> +
> + tmp = (void *)uvcb_cgc.conf_base_stor_origin;
> + report(!*tmp, "config base donated memory cleared");
> +
> + tmp = (void *)uvcb_cgc.conf_base_stor_origin;
> + report(!*tmp, "config variable donated memory cleared");
> +
> + tmp = (void *)uvcb_csc.stor_origin;
> + report(!*tmp, "cpu donated memory cleared after reset 1");
> +
> + /* Check if uninitialized after reset */
> + test_uv_uninitialized();
> +
> + report_prefix_pop();
> }
>
> static void setup_vmem(void)
> @@ -505,6 +579,7 @@ int main(void)
>
> test_priv();
> test_invalid();
> + test_uv_uninitialized();
> test_query();
> test_init();
>