Message ID | 20220706064024.16573-3-frankja@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390x: uv-host: Access check extensions and improvements | expand |
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(); >
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();