1 // SPDX-License-Identifier: GPL-2.0
3 #include <asm/facility.h>
4 #include <asm/sections.h>
6 /* will be used in arch/s390/kernel/uv.c */
7 #ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST
8 int __bootdata_preserved(prot_virt_guest
);
10 #if IS_ENABLED(CONFIG_KVM)
11 int __bootdata_preserved(prot_virt_host
);
13 struct uv_info
__bootdata_preserved(uv_info
);
15 void uv_query_info(void)
17 struct uv_cb_qui uvcb
= {
18 .header
.cmd
= UVC_CMD_QUI
,
19 .header
.len
= sizeof(uvcb
)
22 if (!test_facility(158))
25 /* rc==0x100 means that there is additional data we do not process */
26 if (uv_call(0, (uint64_t)&uvcb
) && uvcb
.header
.rc
!= 0x100)
29 if (IS_ENABLED(CONFIG_KVM
)) {
30 memcpy(uv_info
.inst_calls_list
, uvcb
.inst_calls_list
, sizeof(uv_info
.inst_calls_list
));
31 uv_info
.uv_base_stor_len
= uvcb
.uv_base_stor_len
;
32 uv_info
.guest_base_stor_len
= uvcb
.conf_base_phys_stor_len
;
33 uv_info
.guest_virt_base_stor_len
= uvcb
.conf_base_virt_stor_len
;
34 uv_info
.guest_virt_var_stor_len
= uvcb
.conf_virt_var_stor_len
;
35 uv_info
.guest_cpu_stor_len
= uvcb
.cpu_stor_len
;
36 uv_info
.max_sec_stor_addr
= ALIGN(uvcb
.max_guest_stor_addr
, PAGE_SIZE
);
37 uv_info
.max_num_sec_conf
= uvcb
.max_num_sec_conf
;
38 uv_info
.max_guest_cpus
= uvcb
.max_guest_cpus
;
41 #ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST
42 if (test_bit_inv(BIT_UVC_CMD_SET_SHARED_ACCESS
, (unsigned long *)uvcb
.inst_calls_list
) &&
43 test_bit_inv(BIT_UVC_CMD_REMOVE_SHARED_ACCESS
, (unsigned long *)uvcb
.inst_calls_list
))