Lines Matching refs:vtoc

36 #include <sys/vtoc.h>
75 * Default vtoc information for non-SVr4 partitions
140 efi_alloc_and_init(int fd, uint32_t nparts, struct dk_gpt **vtoc)
176 if ((*vtoc = calloc(length, 1)) == NULL)
179 vptr = *vtoc;
204 efi_alloc_and_read(int fd, struct dk_gpt **vtoc)
214 if ((*vtoc = calloc(length, 1)) == NULL)
217 (*vtoc)->efi_num_of_partition_entries = nentries;
218 rval = efi_read(fd, *vtoc);
221 ((*vtoc)->efi_num_of_partition_entries > nentries)) {
225 ((*vtoc)->efi_num_of_partition_entries - 1);
226 nentries = (*vtoc)->efi_num_of_partition_entries;
227 if ((tmp = realloc(*vtoc, length)) == NULL) {
228 free (*vtoc);
229 *vtoc = NULL;
232 *vtoc = tmp;
233 rval = efi_read(fd, *vtoc);
242 free (*vtoc);
243 *vtoc = NULL;
309 efi_read(int fd, struct dk_gpt *vtoc)
373 if (NBLOCKS(vtoc->efi_num_of_partition_entries,
376 vtoc->efi_num_of_partition_entries =
379 label_len = vtoc->efi_num_of_partition_entries
392 user_length = vtoc->efi_num_of_partition_entries;
448 vtoc->efi_flags |= EFI_GPT_PRIMARY_CORRUPT;
449 vtoc->efi_num_of_partition_entries =
517 vtoc->efi_version = LE_32(efi->efi_gpt_Revision);
518 vtoc->efi_num_of_partition_entries =
520 vtoc->efi_part_size = LE_32(efi->efi_gpt_SizeOfPartitionEntry);
521 vtoc->efi_lbasize = disk_info.dki_lbsize;
522 vtoc->efi_last_lba = disk_info.dki_capacity - 1;
523 vtoc->efi_first_u_lba = LE_64(efi->efi_gpt_FirstUsableLBA);
524 vtoc->efi_last_u_lba = LE_64(efi->efi_gpt_LastUsableLBA);
525 vtoc->efi_altern_lba = LE_64(efi->efi_gpt_AlternateLBA);
526 UUID_LE_CONVERT(vtoc->efi_disk_uguid, efi->efi_gpt_DiskGUID);
532 if (user_length < vtoc->efi_num_of_partition_entries) {
536 if (vtoc->efi_num_of_partition_entries <
538 vtoc->efi_num_of_partition_entries =
542 for (i = 0; i < vtoc->efi_num_of_partition_entries; i++) {
544 UUID_LE_CONVERT(vtoc->efi_parts[i].p_guid,
551 if (bcmp(&vtoc->efi_parts[i].p_guid,
554 vtoc->efi_parts[i].p_tag = j;
558 if ((vtoc->efi_parts[i].p_tag == V_UNASSIGNED)) {
560 (uchar_t *)&vtoc->efi_parts[i].p_guid)) {
561 vtoc->efi_parts[i].p_tag = V_UNKNOWN;
574 vtoc->efi_nparts = i;
575 vtoc->efi_parts[i].p_flag =
577 vtoc->efi_parts[i].p_start =
581 vtoc->efi_parts[i].p_size = 0;
583 vtoc->efi_parts[i].p_size =
585 vtoc->efi_parts[i].p_start + 1;
588 vtoc->efi_parts[i].p_name[j] =
593 UUID_LE_CONVERT(vtoc->efi_parts[i].p_uguid,
596 vtoc->efi_nparts++;
639 write_pmbr(int fd, struct dk_gpt *vtoc)
648 len = (vtoc->efi_lbasize == 0) ? sizeof (mb) : vtoc->efi_lbasize;
694 size_in_lba = vtoc->efi_last_lba;
729 check_input(struct dk_gpt *vtoc)
737 for (i = 0; i < vtoc->efi_nparts; i++) {
738 tmpp_tag = vtoc->efi_parts[i].p_tag;
745 if (bcmp(&vtoc->efi_parts[i].p_guid,
756 (vtoc->efi_parts[i].p_size != 0)) {
761 vtoc->efi_parts[i].p_size);
768 (uchar_t *)&vtoc->efi_parts[i].p_guid)) {
804 if ((vtoc->efi_parts[i].p_start < vtoc->efi_first_u_lba) ||
805 (vtoc->efi_parts[i].p_start > vtoc->efi_last_u_lba)) {
810 vtoc->efi_parts[i].p_start);
813 vtoc->efi_first_u_lba,
814 vtoc->efi_last_u_lba);
818 if ((vtoc->efi_parts[i].p_start +
819 vtoc->efi_parts[i].p_size <
820 vtoc->efi_first_u_lba) ||
821 (vtoc->efi_parts[i].p_start +
822 vtoc->efi_parts[i].p_size >
823 vtoc->efi_last_u_lba + 1)) {
828 vtoc->efi_parts[i].p_start +
829 vtoc->efi_parts[i].p_size);
832 vtoc->efi_first_u_lba,
833 vtoc->efi_last_u_lba);
838 for (j = 0; j < vtoc->efi_nparts; j++) {
839 isize = vtoc->efi_parts[i].p_size;
840 jsize = vtoc->efi_parts[j].p_size;
841 istart = vtoc->efi_parts[i].p_start;
842 jstart = vtoc->efi_parts[j].p_start;
986 efi_write(int fd, struct dk_gpt *vtoc)
1018 if (check_input(vtoc)) {
1028 if ((vtoc->efi_nparts > vtoc->efi_num_of_partition_entries) &&
1029 (vtoc->efi_num_of_partition_entries != 0)) {
1035 } else if (vtoc->efi_num_of_partition_entries == 0) {
1036 nparts = vtoc->efi_nparts;
1037 if (vtoc->efi_nparts <= EFI_MIN_NUMBER_PARTITION_ENTRIES) {
1041 num_of_partition_entries = vtoc->efi_nparts;
1044 nparts = vtoc->efi_num_of_partition_entries;
1046 vtoc->efi_num_of_partition_entries;
1048 for (i = 0; i < sizeof (vtoc->efi_reserved) / sizeof (uint_t); i++) {
1049 if (vtoc->efi_reserved[i] != 0) {
1060 if (NBLOCKS(vtoc->efi_nparts, vtoc->efi_lbasize) < 34) {
1061 dk_ioc.dki_length = EFI_MIN_ARRAY_SIZE + vtoc->efi_lbasize;
1063 dk_ioc.dki_length = NBLOCKS(vtoc->efi_nparts,
1064 vtoc->efi_lbasize) *
1065 vtoc->efi_lbasize;
1071 nblocks = dk_ioc.dki_length / vtoc->efi_lbasize - 1;
1078 lba_backup_gpt_hdr = vtoc->efi_last_u_lba + 1 + nblocks;
1086 efi->efi_gpt_Revision = LE_32(vtoc->efi_version); /* 0x02000100 */
1091 efi->efi_gpt_FirstUsableLBA = LE_64(vtoc->efi_first_u_lba);
1092 efi->efi_gpt_LastUsableLBA = LE_64(vtoc->efi_last_u_lba);
1097 UUID_LE_CONVERT(efi->efi_gpt_DiskGUID, vtoc->efi_disk_uguid);
1100 efi_parts = (efi_gpe_t *)((char *)dk_ioc.dki_data + vtoc->efi_lbasize);
1104 if (vtoc->efi_parts[i].p_tag == V_UNKNOWN) {
1107 vtoc->efi_parts[i].p_guid);
1113 if (vtoc->efi_parts[i].p_tag != j)
1132 vtoc->efi_parts[i].p_tag);
1139 LE_64(vtoc->efi_parts[i].p_start);
1141 if (vtoc->efi_parts[i].p_size != 0) {
1143 LE_64(vtoc->efi_parts[i].p_start +
1144 vtoc->efi_parts[i].p_size - 1);
1147 LE_16(vtoc->efi_parts[i].p_flag);
1150 LE_16((ushort_t)vtoc->efi_parts[i].p_name[j]);
1152 if ((vtoc->efi_parts[i].p_tag != V_UNASSIGNED) &&
1153 uuid_is_null((uchar_t *)&vtoc->efi_parts[i].p_uguid)) {
1155 &vtoc->efi_parts[i].p_uguid);
1157 bcopy(&vtoc->efi_parts[i].p_uguid,
1187 dk_ioc.dki_lba = vtoc->efi_last_u_lba + 1;
1188 dk_ioc.dki_length -= vtoc->efi_lbasize;
1191 vtoc->efi_lbasize);
1201 vtoc->efi_last_u_lba + 1,
1210 dk_ioc.dki_length = vtoc->efi_lbasize;
1213 vtoc->efi_lbasize);
1216 efi->efi_gpt_PartitionEntryLBA = LE_64(vtoc->efi_last_u_lba + 1);
1232 (void) write_pmbr(fd, vtoc);
1251 struct vtoc vtoc;
1258 if (ioctl(fd, DKIOCGVTOC, &vtoc) == -1)
1267 efi_err_check(struct dk_gpt *vtoc)
1277 for (i = 0; i < vtoc->efi_nparts; i++) {
1279 if ((vtoc->efi_parts[i].p_tag == V_UNASSIGNED) &&
1280 (vtoc->efi_parts[i].p_size != 0)) {
1283 "of %llu\n", i, vtoc->efi_parts[i].p_size);
1285 if (vtoc->efi_parts[i].p_tag == V_UNASSIGNED) {
1288 if (vtoc->efi_parts[i].p_tag == V_RESERVED) {
1295 if (vtoc->efi_parts[i].p_size != EFI_MIN_RESV_SIZE)
1300 if ((vtoc->efi_parts[i].p_start < vtoc->efi_first_u_lba) ||
1301 (vtoc->efi_parts[i].p_start > vtoc->efi_last_u_lba)) {
1305 vtoc->efi_parts[i].p_start);
1308 vtoc->efi_first_u_lba,
1309 vtoc->efi_last_u_lba);
1311 if ((vtoc->efi_parts[i].p_start +
1312 vtoc->efi_parts[i].p_size <
1313 vtoc->efi_first_u_lba) ||
1314 (vtoc->efi_parts[i].p_start +
1315 vtoc->efi_parts[i].p_size >
1316 vtoc->efi_last_u_lba + 1)) {
1320 vtoc->efi_parts[i].p_start +
1321 vtoc->efi_parts[i].p_size);
1324 vtoc->efi_first_u_lba,
1325 vtoc->efi_last_u_lba);
1328 for (j = 0; j < vtoc->efi_nparts; j++) {
1329 isize = vtoc->efi_parts[i].p_size;
1330 jsize = vtoc->efi_parts[j].p_size;
1331 istart = vtoc->efi_parts[i].p_start;
1332 jstart = vtoc->efi_parts[j].p_start;
1362 efi_auto_sense(int fd, struct dk_gpt **vtoc)
1370 if (efi_alloc_and_init(fd, EFI_NUMPAR, vtoc) != 0) {
1377 for (i = 0; i < min((*vtoc)->efi_nparts, V_NUMPAR); i++) {
1378 (*vtoc)->efi_parts[i].p_tag = default_vtoc_map[i].p_tag;
1379 (*vtoc)->efi_parts[i].p_flag = default_vtoc_map[i].p_flag;
1380 (*vtoc)->efi_parts[i].p_start = 0;
1381 (*vtoc)->efi_parts[i].p_size = 0;
1389 (*vtoc)->efi_parts[0].p_start = 34;
1390 (*vtoc)->efi_parts[0].p_size = 262144;
1393 (*vtoc)->efi_parts[1].p_start = 262178;
1394 (*vtoc)->efi_parts[1].p_size = 262144;
1397 (*vtoc)->efi_parts[2].p_tag = V_UNASSIGNED;
1400 (*vtoc)->efi_parts[6].p_start = 524322;
1401 (*vtoc)->efi_parts[6].p_size = (*vtoc)->efi_last_u_lba - 524322
1405 (*vtoc)->efi_parts[8].p_start = (*vtoc)->efi_last_u_lba - (1024 * 16);
1406 (*vtoc)->efi_parts[8].p_size = (1024 * 16);
1407 (*vtoc)->efi_parts[8].p_tag = V_RESERVED;