893 /*
894 * hv_mach_pri() is not supported on a guest domain.
895 * Unregister pboot API group to prevent failures.
896 */
897 (void) hsvc_unregister(&pboot_hsvc);
898 hsvc_pboot_available = B_FALSE;
899 DS_PRI_DBG("ds_get_hv_pri: hv_mach_pri service is not "
900 "available. errorno: 0x%lx\n", status);
901 return (0);
902 } else if (pri_size == 0) {
903 return (1);
904 } else {
905 DS_PRI_DBG("ds_get_hv_pri: hv_mach_pri pri size: 0x%lx\n",
906 pri_size);
907 }
908
909 /*
910 * contig_mem_alloc requires size to be a power of 2.
911 * Increase size to next power of 2 if necessary.
912 */
913 if ((pri_size & (pri_size - 1)) != 0)
914 buf_size = 1 << highbit(pri_size);
915 DS_PRI_DBG("ds_get_hv_pri: buf_size = 0x%lx\n", buf_size);
916
917 buf_va = contig_mem_alloc(buf_size);
918 if (buf_va == NULL)
919 return (1);
920
921 buf_pa = va_to_pa(buf_va);
922 DS_PRI_DBG("ds_get_hv_pri: buf_pa 0x%lx\n", buf_pa);
923 status = hv_mach_pri(buf_pa, &pri_size);
924 DS_PRI_DBG("ds_get_hv_pri: hv_mach_pri status = 0x%lx\n", status);
925
926 if (status == H_EOK) {
927 pri_data = kmem_alloc(pri_size, KM_SLEEP);
928 sp->ds_pri = pri_data;
929 sp->ds_pri_len = pri_size;
930 bcopy(buf_va, pri_data, sp->ds_pri_len);
931 sp->state |= DS_PRI_HAS_PRI;
932 sp->gencount++;
933 }
|
893 /*
894 * hv_mach_pri() is not supported on a guest domain.
895 * Unregister pboot API group to prevent failures.
896 */
897 (void) hsvc_unregister(&pboot_hsvc);
898 hsvc_pboot_available = B_FALSE;
899 DS_PRI_DBG("ds_get_hv_pri: hv_mach_pri service is not "
900 "available. errorno: 0x%lx\n", status);
901 return (0);
902 } else if (pri_size == 0) {
903 return (1);
904 } else {
905 DS_PRI_DBG("ds_get_hv_pri: hv_mach_pri pri size: 0x%lx\n",
906 pri_size);
907 }
908
909 /*
910 * contig_mem_alloc requires size to be a power of 2.
911 * Increase size to next power of 2 if necessary.
912 */
913 if (!ISP2(pri_size))
914 buf_size = 1 << highbit(pri_size);
915 DS_PRI_DBG("ds_get_hv_pri: buf_size = 0x%lx\n", buf_size);
916
917 buf_va = contig_mem_alloc(buf_size);
918 if (buf_va == NULL)
919 return (1);
920
921 buf_pa = va_to_pa(buf_va);
922 DS_PRI_DBG("ds_get_hv_pri: buf_pa 0x%lx\n", buf_pa);
923 status = hv_mach_pri(buf_pa, &pri_size);
924 DS_PRI_DBG("ds_get_hv_pri: hv_mach_pri status = 0x%lx\n", status);
925
926 if (status == H_EOK) {
927 pri_data = kmem_alloc(pri_size, KM_SLEEP);
928 sp->ds_pri = pri_data;
929 sp->ds_pri_len = pri_size;
930 bcopy(buf_va, pri_data, sp->ds_pri_len);
931 sp->state |= DS_PRI_HAS_PRI;
932 sp->gencount++;
933 }
|