1 #include <libcflat.h> 2 #include <bitops.h> 3 #include <alloc.h> 4 #include <alloc_page.h> 5 #include <asm/page.h> 6 #include <asm/arch_def.h> 7 8 #include <asm/facility.h> 9 #include <asm/uv.h> 10 #include <uv.h> 11 12 static struct uv_cb_qui uvcb_qui = { 13 .header.cmd = UVC_CMD_QUI, 14 .header.len = sizeof(uvcb_qui), 15 }; 16 17 bool uv_os_is_guest(void) 18 { 19 return test_facility(158) && 20 uv_query_test_call(BIT_UVC_CMD_SET_SHARED_ACCESS) && 21 uv_query_test_call(BIT_UVC_CMD_REMOVE_SHARED_ACCESS); 22 } 23 24 bool uv_os_is_host(void) 25 { 26 return test_facility(158) && uv_query_test_call(BIT_UVC_CMD_INIT_UV); 27 } 28 29 bool uv_query_test_call(unsigned int nr) 30 { 31 /* Query needs to be called first */ 32 assert(uvcb_qui.header.rc); 33 assert(nr < BITS_PER_LONG * ARRAY_SIZE(uvcb_qui.inst_calls_list)); 34 35 return test_bit_inv(nr, uvcb_qui.inst_calls_list); 36 } 37 38 int uv_setup(void) 39 { 40 if (!test_facility(158)) 41 return 0; 42 43 assert(!uv_call(0, (u64)&uvcb_qui)); 44 return 1; 45 } 46