On Tue, 16 Mar 2021 09:16:50 +0000 Janosch Frank <frankja@xxxxxxxxxxxxx> wrote: > They are needed in the new UV tests. > > As we now extend the size of the query struct, we need to set the > length in the UV guest query test to a constant instead of using > sizeof. > > Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> Reviewed-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> > --- > lib/s390x/asm/uv.h | 148 > ++++++++++++++++++++++++++++++++++++++++++++- s390x/uv-guest.c | > 2 +- 2 files changed, 148 insertions(+), 2 deletions(-) > > diff --git a/lib/s390x/asm/uv.h b/lib/s390x/asm/uv.h > index 9c491844..11f70a9f 100644 > --- a/lib/s390x/asm/uv.h > +++ b/lib/s390x/asm/uv.h > @@ -17,16 +17,54 @@ > #define UVC_RC_INV_STATE 0x0003 > #define UVC_RC_INV_LEN 0x0005 > #define UVC_RC_NO_RESUME 0x0007 > +#define UVC_RC_INV_GHANDLE 0x0020 > +#define UVC_RC_INV_CHANDLE 0x0021 > > #define UVC_CMD_QUI 0x0001 > +#define UVC_CMD_INIT_UV 0x000f > +#define UVC_CMD_CREATE_SEC_CONF 0x0100 > +#define UVC_CMD_DESTROY_SEC_CONF 0x0101 > +#define UVC_CMD_CREATE_SEC_CPU 0x0120 > +#define UVC_CMD_DESTROY_SEC_CPU 0x0121 > +#define UVC_CMD_CONV_TO_SEC_STOR 0x0200 > +#define UVC_CMD_CONV_FROM_SEC_STOR 0x0201 > +#define UVC_CMD_SET_SEC_CONF_PARAMS 0x0300 > +#define UVC_CMD_UNPACK_IMG 0x0301 > +#define UVC_CMD_VERIFY_IMG 0x0302 > +#define UVC_CMD_CPU_RESET 0x0310 > +#define UVC_CMD_CPU_RESET_INITIAL 0x0311 > +#define UVC_CMD_PERF_CONF_CLEAR_RESET 0x0320 > +#define UVC_CMD_CPU_RESET_CLEAR 0x0321 > +#define UVC_CMD_CPU_SET_STATE 0x0330 > +#define UVC_CMD_SET_UNSHARED_ALL 0x0340 > +#define UVC_CMD_PIN_PAGE_SHARED 0x0341 > +#define UVC_CMD_UNPIN_PAGE_SHARED 0x0342 > #define UVC_CMD_SET_SHARED_ACCESS 0x1000 > #define UVC_CMD_REMOVE_SHARED_ACCESS 0x1001 > > /* Bits in installed uv calls */ > enum uv_cmds_inst { > BIT_UVC_CMD_QUI = 0, > + BIT_UVC_CMD_INIT_UV = 1, > + BIT_UVC_CMD_CREATE_SEC_CONF = 2, > + BIT_UVC_CMD_DESTROY_SEC_CONF = 3, > + BIT_UVC_CMD_CREATE_SEC_CPU = 4, > + BIT_UVC_CMD_DESTROY_SEC_CPU = 5, > + BIT_UVC_CMD_CONV_TO_SEC_STOR = 6, > + BIT_UVC_CMD_CONV_FROM_SEC_STOR = 7, > BIT_UVC_CMD_SET_SHARED_ACCESS = 8, > BIT_UVC_CMD_REMOVE_SHARED_ACCESS = 9, > + BIT_UVC_CMD_SET_SEC_PARMS = 11, > + BIT_UVC_CMD_UNPACK_IMG = 13, > + BIT_UVC_CMD_VERIFY_IMG = 14, > + BIT_UVC_CMD_CPU_RESET = 15, > + BIT_UVC_CMD_CPU_RESET_INITIAL = 16, > + BIT_UVC_CMD_CPU_SET_STATE = 17, > + BIT_UVC_CMD_PREPARE_CLEAR_RESET = 18, > + BIT_UVC_CMD_CPU_PERFORM_CLEAR_RESET = 19, > + BIT_UVC_CMD_UNSHARE_ALL = 20, > + BIT_UVC_CMD_PIN_PAGE_SHARED = 21, > + BIT_UVC_CMD_UNPIN_PAGE_SHARED = 22, > }; > > struct uv_cb_header { > @@ -36,13 +74,81 @@ struct uv_cb_header { > u16 rrc; /* Return Reason Code */ > } __attribute__((packed)) __attribute__((aligned(8))); > > +struct uv_cb_init { > + struct uv_cb_header header; > + u64 reserved08[2]; > + u64 stor_origin; > + u64 stor_len; > + u64 reserved28[4]; > + > +} __attribute__((packed)) __attribute__((aligned(8))); > + > struct uv_cb_qui { > struct uv_cb_header header; > u64 reserved08; > u64 inst_calls_list[4]; > - u64 reserved30[15]; > + u64 reserved30[2]; > + u64 uv_base_stor_len; > + u64 reserved48; > + u64 conf_base_phys_stor_len; > + u64 conf_base_virt_stor_len; > + u64 conf_virt_var_stor_len; > + u64 cpu_stor_len; > + u32 reserved70[3]; > + u32 max_num_sec_conf; > + u64 max_guest_stor_addr; > + u8 reserved88[158 - 136]; > + u16 max_guest_cpus; > + u8 reserveda0[200 - 160]; > +} __attribute__((packed)) __attribute__((aligned(8))); > + > +struct uv_cb_cgc { > + struct uv_cb_header header; > + u64 reserved08[2]; > + u64 guest_handle; > + u64 conf_base_stor_origin; > + u64 conf_var_stor_origin; > + u64 reserved30; > + u64 guest_stor_origin; > + u64 guest_stor_len; > + u64 guest_sca; > + u64 guest_asce; > + u64 reserved60[5]; > } __attribute__((packed)) __attribute__((aligned(8))); > > +struct uv_cb_csc { > + struct uv_cb_header header; > + u64 reserved08[2]; > + u64 cpu_handle; > + u64 guest_handle; > + u64 stor_origin; > + u8 reserved30[6]; > + u16 num; > + u64 state_origin; > + u64 reserved[4]; > +} __attribute__((packed)) __attribute__((aligned(8))); > + > +struct uv_cb_unp { > + struct uv_cb_header header; > + u64 reserved08[2]; > + u64 guest_handle; > + u64 gaddr; > + u64 tweak[2]; > + u64 reserved38[3]; > +} __attribute__((packed)) __attribute__((aligned(8))); > + > +/* > + * A common UV call struct for the following calls: > + * Destroy cpu/config > + * Verify > + */ > +struct uv_cb_nodata { > + struct uv_cb_header header; > + u64 reserved08[2]; > + u64 handle; > + u64 reserved20[4]; > +} __attribute__((packed)) __attribute__((aligned(8))); > + > struct uv_cb_share { > struct uv_cb_header header; > u64 reserved08[3]; > @@ -50,6 +156,32 @@ struct uv_cb_share { > u64 reserved28; > } __attribute__((packed)) __attribute__((aligned(8))); > > +/* Convert to Secure */ > +struct uv_cb_cts { > + struct uv_cb_header header; > + u64 reserved08[2]; > + u64 guest_handle; > + u64 gaddr; > +} __attribute__((packed)) __attribute__((aligned(8))); > + > +/* Convert from Secure / Pin Page Shared */ > +struct uv_cb_cfs { > + struct uv_cb_header header; > + u64 reserved08[2]; > + u64 paddr; > +} __attribute__((packed)) __attribute__((aligned(8))); > + > +/* Set Secure Config Parameter */ > +struct uv_cb_ssc { > + struct uv_cb_header header; > + u64 reserved08[2]; > + u64 guest_handle; > + u64 sec_header_origin; > + u32 sec_header_len; > + u32 reserved2c; > + u64 reserved30[4]; > +} __attribute__((packed)) __attribute__((aligned(8))); > + > static inline int uv_call_once(unsigned long r1, unsigned long r2) > { > int cc; > @@ -118,4 +250,18 @@ static inline int uv_remove_shared(unsigned long > addr) return share(addr, UVC_CMD_REMOVE_SHARED_ACCESS); > } > > +struct uv_cb_cpu_set_state { > + struct uv_cb_header header; > + u64 reserved08[2]; > + u64 cpu_handle; > + u8 reserved20[7]; > + u8 state; > + u64 reserved28[5]; > +}; > + > +#define PV_CPU_STATE_OPR 1 > +#define PV_CPU_STATE_STP 2 > +#define PV_CPU_STATE_CHKSTP 3 > +#define PV_CPU_STATE_OPR_LOAD 5 > + > #endif > diff --git a/s390x/uv-guest.c b/s390x/uv-guest.c > index a13669ab..95a968c5 100644 > --- a/s390x/uv-guest.c > +++ b/s390x/uv-guest.c > @@ -59,7 +59,7 @@ static void test_query(void) > { > struct uv_cb_qui uvcb = { > .header.cmd = UVC_CMD_QUI, > - .header.len = sizeof(uvcb) - 8, > + .header.len = 0xa0, > }; > int cc; >