12ea7afb6SJanosch Frank /* 22ea7afb6SJanosch Frank * s390x Ultravisor related definitions 32ea7afb6SJanosch Frank * 46a87e02cSSteffen Eiden * Copyright IBM Corp. 2020, 2022 52ea7afb6SJanosch Frank * 62ea7afb6SJanosch Frank * Authors: 72ea7afb6SJanosch Frank * Janosch Frank <frankja@linux.ibm.com> 82ea7afb6SJanosch Frank * 92ea7afb6SJanosch Frank * This code is free software; you can redistribute it and/or modify it 102ea7afb6SJanosch Frank * under the terms of the GNU General Public License version 2. 112ea7afb6SJanosch Frank */ 12eb5a1bbaSCornelia Huck #ifndef _ASMS390X_UV_H_ 13eb5a1bbaSCornelia Huck #define _ASMS390X_UV_H_ 142ea7afb6SJanosch Frank 1504bf4919SJanosch Frank /* Enables printing of command code and return codes for failed UVCs */ 1604bf4919SJanosch Frank #ifndef UVC_ERR_DEBUG 1704bf4919SJanosch Frank #define UVC_ERR_DEBUG 0 1804bf4919SJanosch Frank #endif 1904bf4919SJanosch Frank 202ea7afb6SJanosch Frank #define UVC_RC_EXECUTED 0x0001 212ea7afb6SJanosch Frank #define UVC_RC_INV_CMD 0x0002 222ea7afb6SJanosch Frank #define UVC_RC_INV_STATE 0x0003 232ea7afb6SJanosch Frank #define UVC_RC_INV_LEN 0x0005 242ea7afb6SJanosch Frank #define UVC_RC_NO_RESUME 0x0007 2583d815a2SJanosch Frank #define UVC_RC_INV_GHANDLE 0x0020 2683d815a2SJanosch Frank #define UVC_RC_INV_CHANDLE 0x0021 272ea7afb6SJanosch Frank 282ea7afb6SJanosch Frank #define UVC_CMD_QUI 0x0001 2983d815a2SJanosch Frank #define UVC_CMD_INIT_UV 0x000f 3083d815a2SJanosch Frank #define UVC_CMD_CREATE_SEC_CONF 0x0100 3183d815a2SJanosch Frank #define UVC_CMD_DESTROY_SEC_CONF 0x0101 3283d815a2SJanosch Frank #define UVC_CMD_CREATE_SEC_CPU 0x0120 3383d815a2SJanosch Frank #define UVC_CMD_DESTROY_SEC_CPU 0x0121 3483d815a2SJanosch Frank #define UVC_CMD_CONV_TO_SEC_STOR 0x0200 3583d815a2SJanosch Frank #define UVC_CMD_CONV_FROM_SEC_STOR 0x0201 36f3c0b3caSJanosch Frank #define UVC_CMD_DESTR_SEC_STOR 0x0202 3783d815a2SJanosch Frank #define UVC_CMD_SET_SEC_CONF_PARAMS 0x0300 3883d815a2SJanosch Frank #define UVC_CMD_UNPACK_IMG 0x0301 3983d815a2SJanosch Frank #define UVC_CMD_VERIFY_IMG 0x0302 4083d815a2SJanosch Frank #define UVC_CMD_CPU_RESET 0x0310 4183d815a2SJanosch Frank #define UVC_CMD_CPU_RESET_INITIAL 0x0311 425630c446SJanosch Frank #define UVC_CMD_PREPARE_RESET 0x0320 4383d815a2SJanosch Frank #define UVC_CMD_CPU_RESET_CLEAR 0x0321 4483d815a2SJanosch Frank #define UVC_CMD_CPU_SET_STATE 0x0330 4583d815a2SJanosch Frank #define UVC_CMD_SET_UNSHARED_ALL 0x0340 4683d815a2SJanosch Frank #define UVC_CMD_PIN_PAGE_SHARED 0x0341 4783d815a2SJanosch Frank #define UVC_CMD_UNPIN_PAGE_SHARED 0x0342 482ea7afb6SJanosch Frank #define UVC_CMD_SET_SHARED_ACCESS 0x1000 492ea7afb6SJanosch Frank #define UVC_CMD_REMOVE_SHARED_ACCESS 0x1001 506a87e02cSSteffen Eiden #define UVC_CMD_ATTESTATION 0x1020 512ea7afb6SJanosch Frank 522ea7afb6SJanosch Frank /* Bits in installed uv calls */ 532ea7afb6SJanosch Frank enum uv_cmds_inst { 542ea7afb6SJanosch Frank BIT_UVC_CMD_QUI = 0, 5583d815a2SJanosch Frank BIT_UVC_CMD_INIT_UV = 1, 5683d815a2SJanosch Frank BIT_UVC_CMD_CREATE_SEC_CONF = 2, 5783d815a2SJanosch Frank BIT_UVC_CMD_DESTROY_SEC_CONF = 3, 5883d815a2SJanosch Frank BIT_UVC_CMD_CREATE_SEC_CPU = 4, 5983d815a2SJanosch Frank BIT_UVC_CMD_DESTROY_SEC_CPU = 5, 6083d815a2SJanosch Frank BIT_UVC_CMD_CONV_TO_SEC_STOR = 6, 6183d815a2SJanosch Frank BIT_UVC_CMD_CONV_FROM_SEC_STOR = 7, 622ea7afb6SJanosch Frank BIT_UVC_CMD_SET_SHARED_ACCESS = 8, 632ea7afb6SJanosch Frank BIT_UVC_CMD_REMOVE_SHARED_ACCESS = 9, 6483d815a2SJanosch Frank BIT_UVC_CMD_SET_SEC_PARMS = 11, 6583d815a2SJanosch Frank BIT_UVC_CMD_UNPACK_IMG = 13, 6683d815a2SJanosch Frank BIT_UVC_CMD_VERIFY_IMG = 14, 6783d815a2SJanosch Frank BIT_UVC_CMD_CPU_RESET = 15, 6883d815a2SJanosch Frank BIT_UVC_CMD_CPU_RESET_INITIAL = 16, 6983d815a2SJanosch Frank BIT_UVC_CMD_CPU_SET_STATE = 17, 705630c446SJanosch Frank BIT_UVC_CMD_PREPARE_RESET = 18, 7183d815a2SJanosch Frank BIT_UVC_CMD_CPU_PERFORM_CLEAR_RESET = 19, 7283d815a2SJanosch Frank BIT_UVC_CMD_UNSHARE_ALL = 20, 7383d815a2SJanosch Frank BIT_UVC_CMD_PIN_PAGE_SHARED = 21, 7483d815a2SJanosch Frank BIT_UVC_CMD_UNPIN_PAGE_SHARED = 22, 756a87e02cSSteffen Eiden BIT_UVC_CMD_ATTESTATION = 28, 762ea7afb6SJanosch Frank }; 772ea7afb6SJanosch Frank 782ea7afb6SJanosch Frank struct uv_cb_header { 792ea7afb6SJanosch Frank u16 len; 802ea7afb6SJanosch Frank u16 cmd; /* Command Code */ 812ea7afb6SJanosch Frank u16 rc; /* Response Code */ 822ea7afb6SJanosch Frank u16 rrc; /* Return Reason Code */ 832ea7afb6SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 842ea7afb6SJanosch Frank 8583d815a2SJanosch Frank struct uv_cb_init { 8683d815a2SJanosch Frank struct uv_cb_header header; 8783d815a2SJanosch Frank u64 reserved08[2]; 8883d815a2SJanosch Frank u64 stor_origin; 8983d815a2SJanosch Frank u64 stor_len; 9083d815a2SJanosch Frank u64 reserved28[4]; 9183d815a2SJanosch Frank 9283d815a2SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 9383d815a2SJanosch Frank 942ea7afb6SJanosch Frank struct uv_cb_qui { 958b3403a1SJanosch Frank struct uv_cb_header header; /* 0x0000 */ 968b3403a1SJanosch Frank u64 reserved08; /* 0x0008 */ 978b3403a1SJanosch Frank u64 inst_calls_list[4]; /* 0x0010 */ 988b3403a1SJanosch Frank u64 reserved30[2]; /* 0x0030 */ 998b3403a1SJanosch Frank u64 uv_base_stor_len; /* 0x0040 */ 1008b3403a1SJanosch Frank u64 reserved48; /* 0x0048 */ 1018b3403a1SJanosch Frank u64 conf_base_phys_stor_len; /* 0x0050 */ 1028b3403a1SJanosch Frank u64 conf_base_virt_stor_len; /* 0x0058 */ 1038b3403a1SJanosch Frank u64 conf_virt_var_stor_len; /* 0x0060 */ 1048b3403a1SJanosch Frank u64 cpu_stor_len; /* 0x0068 */ 1058b3403a1SJanosch Frank u32 reserved70[3]; /* 0x0070 */ 1068b3403a1SJanosch Frank u32 max_num_sec_conf; /* 0x007c */ 1078b3403a1SJanosch Frank u64 max_guest_stor_addr; /* 0x0080 */ 1088b3403a1SJanosch Frank u8 reserved88[158 - 136]; /* 0x0088 */ 1098b3403a1SJanosch Frank uint16_t max_guest_cpus; /* 0x009e */ 1108b3403a1SJanosch Frank u64 uv_feature_indications; /* 0x00a0 */ 111*8348b72dSSteffen Eiden uint8_t reserveda8[224 - 168]; /* 0x00a8 */ 112*8348b72dSSteffen Eiden uint64_t supp_att_hdr_ver; /* 0x00e0 */ 113*8348b72dSSteffen Eiden uint64_t supp_paf; /* 0x00e8 */ 114*8348b72dSSteffen Eiden uint8_t reservedf0[256 - 240]; /* 0x00f0 */ 11583d815a2SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 11683d815a2SJanosch Frank 11783d815a2SJanosch Frank struct uv_cb_cgc { 11883d815a2SJanosch Frank struct uv_cb_header header; 11983d815a2SJanosch Frank u64 reserved08[2]; 12083d815a2SJanosch Frank u64 guest_handle; 12183d815a2SJanosch Frank u64 conf_base_stor_origin; 12283d815a2SJanosch Frank u64 conf_var_stor_origin; 12383d815a2SJanosch Frank u64 reserved30; 12483d815a2SJanosch Frank u64 guest_stor_origin; 12583d815a2SJanosch Frank u64 guest_stor_len; 12683d815a2SJanosch Frank u64 guest_sca; 12783d815a2SJanosch Frank u64 guest_asce; 12883d815a2SJanosch Frank u64 reserved60[5]; 12983d815a2SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 13083d815a2SJanosch Frank 13183d815a2SJanosch Frank struct uv_cb_csc { 13283d815a2SJanosch Frank struct uv_cb_header header; 13383d815a2SJanosch Frank u64 reserved08[2]; 13483d815a2SJanosch Frank u64 cpu_handle; 13583d815a2SJanosch Frank u64 guest_handle; 13683d815a2SJanosch Frank u64 stor_origin; 13783d815a2SJanosch Frank u8 reserved30[6]; 13883d815a2SJanosch Frank u16 num; 13983d815a2SJanosch Frank u64 state_origin; 14083d815a2SJanosch Frank u64 reserved[4]; 14183d815a2SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 14283d815a2SJanosch Frank 14383d815a2SJanosch Frank struct uv_cb_unp { 14483d815a2SJanosch Frank struct uv_cb_header header; 14583d815a2SJanosch Frank u64 reserved08[2]; 14683d815a2SJanosch Frank u64 guest_handle; 14783d815a2SJanosch Frank u64 gaddr; 14883d815a2SJanosch Frank u64 tweak[2]; 14983d815a2SJanosch Frank u64 reserved38[3]; 15083d815a2SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 15183d815a2SJanosch Frank 15283d815a2SJanosch Frank /* 15383d815a2SJanosch Frank * A common UV call struct for the following calls: 15483d815a2SJanosch Frank * Destroy cpu/config 15583d815a2SJanosch Frank * Verify 15683d815a2SJanosch Frank */ 15783d815a2SJanosch Frank struct uv_cb_nodata { 15883d815a2SJanosch Frank struct uv_cb_header header; 15983d815a2SJanosch Frank u64 reserved08[2]; 16083d815a2SJanosch Frank u64 handle; 16183d815a2SJanosch Frank u64 reserved20[4]; 1622ea7afb6SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 1632ea7afb6SJanosch Frank 1642ea7afb6SJanosch Frank struct uv_cb_share { 1652ea7afb6SJanosch Frank struct uv_cb_header header; 1662ea7afb6SJanosch Frank u64 reserved08[3]; 1672ea7afb6SJanosch Frank u64 paddr; 1682ea7afb6SJanosch Frank u64 reserved28; 1692ea7afb6SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 1702ea7afb6SJanosch Frank 17183d815a2SJanosch Frank /* Convert to Secure */ 17283d815a2SJanosch Frank struct uv_cb_cts { 17383d815a2SJanosch Frank struct uv_cb_header header; 17483d815a2SJanosch Frank u64 reserved08[2]; 17583d815a2SJanosch Frank u64 guest_handle; 17683d815a2SJanosch Frank u64 gaddr; 17783d815a2SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 17883d815a2SJanosch Frank 17983d815a2SJanosch Frank /* Convert from Secure / Pin Page Shared */ 18083d815a2SJanosch Frank struct uv_cb_cfs { 18183d815a2SJanosch Frank struct uv_cb_header header; 18283d815a2SJanosch Frank u64 reserved08[2]; 18383d815a2SJanosch Frank u64 paddr; 18483d815a2SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 18583d815a2SJanosch Frank 1866a87e02cSSteffen Eiden /* Retrieve Attestation Measurement */ 1876a87e02cSSteffen Eiden struct uv_cb_attest { 1886a87e02cSSteffen Eiden struct uv_cb_header header; /* 0x0000 */ 1896a87e02cSSteffen Eiden uint64_t reserved08[2]; /* 0x0008 */ 1906a87e02cSSteffen Eiden uint64_t arcb_addr; /* 0x0018 */ 1916a87e02cSSteffen Eiden uint64_t continuation_token; /* 0x0020 */ 1926a87e02cSSteffen Eiden uint8_t reserved28[6]; /* 0x0028 */ 1936a87e02cSSteffen Eiden uint16_t user_data_length; /* 0x002e */ 1946a87e02cSSteffen Eiden uint8_t user_data[256]; /* 0x0030 */ 1956a87e02cSSteffen Eiden uint32_t reserved130[3]; /* 0x0130 */ 1966a87e02cSSteffen Eiden uint32_t measurement_length; /* 0x013c */ 1976a87e02cSSteffen Eiden uint64_t measurement_address; /* 0x0140 */ 1986a87e02cSSteffen Eiden uint8_t config_uid[16]; /* 0x0148 */ 1996a87e02cSSteffen Eiden uint32_t reserved158; /* 0x0158 */ 2006a87e02cSSteffen Eiden uint32_t add_data_length; /* 0x015c */ 2016a87e02cSSteffen Eiden uint64_t add_data_address; /* 0x0160 */ 2026a87e02cSSteffen Eiden uint64_t reserved168[4]; /* 0x0168 */ 2036a87e02cSSteffen Eiden } __attribute__((packed)) __attribute__((aligned(8))); 2046a87e02cSSteffen Eiden 20583d815a2SJanosch Frank /* Set Secure Config Parameter */ 20683d815a2SJanosch Frank struct uv_cb_ssc { 20783d815a2SJanosch Frank struct uv_cb_header header; 20883d815a2SJanosch Frank u64 reserved08[2]; 20983d815a2SJanosch Frank u64 guest_handle; 21083d815a2SJanosch Frank u64 sec_header_origin; 21183d815a2SJanosch Frank u32 sec_header_len; 21283d815a2SJanosch Frank u32 reserved2c; 21383d815a2SJanosch Frank u64 reserved30[4]; 21483d815a2SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 21583d815a2SJanosch Frank 21688fb0e5dSJanosch Frank static inline int uv_call_once(unsigned long r1, unsigned long r2) 2172ea7afb6SJanosch Frank { 2182ea7afb6SJanosch Frank int cc; 2192ea7afb6SJanosch Frank 2202ea7afb6SJanosch Frank asm volatile( 2212ea7afb6SJanosch Frank "0: .insn rrf,0xB9A40000,%[r1],%[r2],0,0\n" 2222ea7afb6SJanosch Frank " ipm %[cc]\n" 2232ea7afb6SJanosch Frank " srl %[cc],28\n" 2242ea7afb6SJanosch Frank : [cc] "=d" (cc) 2252ea7afb6SJanosch Frank : [r1] "a" (r1), [r2] "a" (r2) 2262ea7afb6SJanosch Frank : "memory", "cc"); 22704bf4919SJanosch Frank 22804bf4919SJanosch Frank if (UVC_ERR_DEBUG && cc == 1) 22904bf4919SJanosch Frank printf("UV call error: call %x rc %x rrc %x\n", 23004bf4919SJanosch Frank ((struct uv_cb_header *)r2)->cmd, 23104bf4919SJanosch Frank ((struct uv_cb_header *)r2)->rc, 23204bf4919SJanosch Frank ((struct uv_cb_header *)r2)->rrc); 23304bf4919SJanosch Frank 2342ea7afb6SJanosch Frank return cc; 2352ea7afb6SJanosch Frank } 2362ea7afb6SJanosch Frank 23788fb0e5dSJanosch Frank static inline int uv_call(unsigned long r1, unsigned long r2) 23888fb0e5dSJanosch Frank { 23988fb0e5dSJanosch Frank int cc; 24088fb0e5dSJanosch Frank 24188fb0e5dSJanosch Frank /* 24288fb0e5dSJanosch Frank * CC 2 and 3 tell us to re-execute because the instruction 24388fb0e5dSJanosch Frank * hasn't yet finished. 24488fb0e5dSJanosch Frank */ 24588fb0e5dSJanosch Frank do { 24688fb0e5dSJanosch Frank cc = uv_call_once(r1, r2); 24788fb0e5dSJanosch Frank } while (cc > 1); 24888fb0e5dSJanosch Frank 24988fb0e5dSJanosch Frank return cc; 25088fb0e5dSJanosch Frank } 25188fb0e5dSJanosch Frank 252027c8015SPierre Morel static inline int share(unsigned long addr, u16 cmd) 253027c8015SPierre Morel { 254027c8015SPierre Morel struct uv_cb_share uvcb = { 255027c8015SPierre Morel .header.cmd = cmd, 256027c8015SPierre Morel .header.len = sizeof(uvcb), 257027c8015SPierre Morel .paddr = addr 258027c8015SPierre Morel }; 259027c8015SPierre Morel 260e55cd64aSJanosch Frank return uv_call(0, (u64)&uvcb); 261027c8015SPierre Morel } 262027c8015SPierre Morel 263027c8015SPierre Morel /* 264027c8015SPierre Morel * Guest 2 request to the Ultravisor to make a page shared with the 265027c8015SPierre Morel * hypervisor for IO. 266027c8015SPierre Morel * 267027c8015SPierre Morel * @addr: Real or absolute address of the page to be shared 268027c8015SPierre Morel */ 269027c8015SPierre Morel static inline int uv_set_shared(unsigned long addr) 270027c8015SPierre Morel { 271027c8015SPierre Morel return share(addr, UVC_CMD_SET_SHARED_ACCESS); 272027c8015SPierre Morel } 273027c8015SPierre Morel 274027c8015SPierre Morel /* 275027c8015SPierre Morel * Guest 2 request to the Ultravisor to make a page unshared. 276027c8015SPierre Morel * 277027c8015SPierre Morel * @addr: Real or absolute address of the page to be unshared 278027c8015SPierre Morel */ 279027c8015SPierre Morel static inline int uv_remove_shared(unsigned long addr) 280027c8015SPierre Morel { 281027c8015SPierre Morel return share(addr, UVC_CMD_REMOVE_SHARED_ACCESS); 282027c8015SPierre Morel } 283027c8015SPierre Morel 284f3c0b3caSJanosch Frank static inline int uv_cmd_nodata(uint64_t handle, uint16_t cmd, uint16_t *rc, uint16_t *rrc) 285f3c0b3caSJanosch Frank { 286f3c0b3caSJanosch Frank struct uv_cb_nodata uvcb = { 287f3c0b3caSJanosch Frank .header.cmd = cmd, 288f3c0b3caSJanosch Frank .header.len = sizeof(uvcb), 289f3c0b3caSJanosch Frank .handle = handle, 290f3c0b3caSJanosch Frank }; 291f3c0b3caSJanosch Frank int cc; 292f3c0b3caSJanosch Frank 293f3c0b3caSJanosch Frank assert(handle); 294f3c0b3caSJanosch Frank cc = uv_call(0, (uint64_t)&uvcb); 295f3c0b3caSJanosch Frank *rc = uvcb.header.rc; 296f3c0b3caSJanosch Frank *rrc = uvcb.header.rrc; 297f3c0b3caSJanosch Frank return cc; 298f3c0b3caSJanosch Frank } 299f3c0b3caSJanosch Frank 300f3c0b3caSJanosch Frank static inline int uv_import(uint64_t handle, unsigned long gaddr) 301f3c0b3caSJanosch Frank { 302f3c0b3caSJanosch Frank struct uv_cb_cts uvcb = { 303f3c0b3caSJanosch Frank .header.cmd = UVC_CMD_CONV_TO_SEC_STOR, 304f3c0b3caSJanosch Frank .header.len = sizeof(uvcb), 305f3c0b3caSJanosch Frank .guest_handle = handle, 306f3c0b3caSJanosch Frank .gaddr = gaddr, 307f3c0b3caSJanosch Frank }; 308f3c0b3caSJanosch Frank 309f3c0b3caSJanosch Frank return uv_call(0, (uint64_t)&uvcb); 310f3c0b3caSJanosch Frank } 311f3c0b3caSJanosch Frank 312f3c0b3caSJanosch Frank static inline int uv_export(unsigned long paddr) 313f3c0b3caSJanosch Frank { 314f3c0b3caSJanosch Frank struct uv_cb_cfs uvcb = { 315f3c0b3caSJanosch Frank .header.cmd = UVC_CMD_CONV_FROM_SEC_STOR, 316f3c0b3caSJanosch Frank .header.len = sizeof(uvcb), 317f3c0b3caSJanosch Frank .paddr = paddr 318f3c0b3caSJanosch Frank }; 319f3c0b3caSJanosch Frank 320f3c0b3caSJanosch Frank return uv_call(0, (u64)&uvcb); 321f3c0b3caSJanosch Frank } 322f3c0b3caSJanosch Frank 323f3c0b3caSJanosch Frank /* 324f3c0b3caSJanosch Frank * Requests the Ultravisor to destroy a guest page and make it 325f3c0b3caSJanosch Frank * accessible to the host. The destroy clears the page instead of 326f3c0b3caSJanosch Frank * exporting. 327f3c0b3caSJanosch Frank * 328f3c0b3caSJanosch Frank * @paddr: Absolute host address of page to be destroyed 329f3c0b3caSJanosch Frank */ 330f3c0b3caSJanosch Frank static inline int uv_destroy_page(unsigned long paddr) 331f3c0b3caSJanosch Frank { 332f3c0b3caSJanosch Frank struct uv_cb_cfs uvcb = { 333f3c0b3caSJanosch Frank .header.cmd = UVC_CMD_DESTR_SEC_STOR, 334f3c0b3caSJanosch Frank .header.len = sizeof(uvcb), 335f3c0b3caSJanosch Frank .paddr = paddr 336f3c0b3caSJanosch Frank }; 337f3c0b3caSJanosch Frank 338f3c0b3caSJanosch Frank return uv_call(0, (uint64_t)&uvcb); 339f3c0b3caSJanosch Frank } 340f3c0b3caSJanosch Frank 34183d815a2SJanosch Frank struct uv_cb_cpu_set_state { 34283d815a2SJanosch Frank struct uv_cb_header header; 34383d815a2SJanosch Frank u64 reserved08[2]; 34483d815a2SJanosch Frank u64 cpu_handle; 34583d815a2SJanosch Frank u8 reserved20[7]; 34683d815a2SJanosch Frank u8 state; 34783d815a2SJanosch Frank u64 reserved28[5]; 34883d815a2SJanosch Frank }; 34983d815a2SJanosch Frank 35083d815a2SJanosch Frank #define PV_CPU_STATE_OPR 1 35183d815a2SJanosch Frank #define PV_CPU_STATE_STP 2 35283d815a2SJanosch Frank #define PV_CPU_STATE_CHKSTP 3 35383d815a2SJanosch Frank #define PV_CPU_STATE_OPR_LOAD 5 35483d815a2SJanosch Frank 355f3c0b3caSJanosch Frank static inline int uv_set_cpu_state(uint64_t handle, uint8_t state) 356f3c0b3caSJanosch Frank { 357f3c0b3caSJanosch Frank struct uv_cb_cpu_set_state uvcb = { 358f3c0b3caSJanosch Frank .header.cmd = UVC_CMD_CPU_SET_STATE, 359f3c0b3caSJanosch Frank .header.len = sizeof(uvcb), 360f3c0b3caSJanosch Frank .cpu_handle = handle, 361f3c0b3caSJanosch Frank .state = state, 362f3c0b3caSJanosch Frank }; 363f3c0b3caSJanosch Frank 364f3c0b3caSJanosch Frank assert(handle); 365f3c0b3caSJanosch Frank return uv_call(0, (uint64_t)&uvcb); 366f3c0b3caSJanosch Frank } 367f3c0b3caSJanosch Frank 368f3c0b3caSJanosch Frank static inline int uv_set_se_hdr(uint64_t handle, void *hdr, size_t len) 369f3c0b3caSJanosch Frank { 370f3c0b3caSJanosch Frank struct uv_cb_ssc uvcb = { 371f3c0b3caSJanosch Frank .header.cmd = UVC_CMD_SET_SEC_CONF_PARAMS, 372f3c0b3caSJanosch Frank .header.len = sizeof(uvcb), 373f3c0b3caSJanosch Frank .sec_header_origin = (uint64_t)hdr, 374f3c0b3caSJanosch Frank .sec_header_len = len, 375f3c0b3caSJanosch Frank .guest_handle = handle, 376f3c0b3caSJanosch Frank }; 377f3c0b3caSJanosch Frank 378f3c0b3caSJanosch Frank assert(handle); 379f3c0b3caSJanosch Frank return uv_call(0, (uint64_t)&uvcb); 380f3c0b3caSJanosch Frank } 381f3c0b3caSJanosch Frank 382f4f97af0SJanosch Frank static inline int uv_unp_page(uint64_t handle, uint64_t gaddr, uint64_t tweak1, uint64_t tweak2) 383f4f97af0SJanosch Frank { 384f4f97af0SJanosch Frank struct uv_cb_unp uvcb = { 385f4f97af0SJanosch Frank .header.cmd = UVC_CMD_UNPACK_IMG, 386f4f97af0SJanosch Frank .header.len = sizeof(uvcb), 387f4f97af0SJanosch Frank .guest_handle = handle, 388f4f97af0SJanosch Frank .gaddr = gaddr, 389f4f97af0SJanosch Frank .tweak[0] = tweak1, 390f4f97af0SJanosch Frank .tweak[1] = tweak2, 391f4f97af0SJanosch Frank }; 392f4f97af0SJanosch Frank 393f4f97af0SJanosch Frank return uv_call(0, (uint64_t)&uvcb); 394f4f97af0SJanosch Frank } 395f4f97af0SJanosch Frank 3962ea7afb6SJanosch Frank #endif 397