| 216 | } |
| 217 | |
| 218 | int write_part_gpt(disk_t *disk_car, const list_part_t *list_part, const int ro, const int verbose) |
| 219 | { |
| 220 | struct gpt_hdr *gpt; |
| 221 | struct gpt_ent* gpt_entries; |
| 222 | struct gpt_hdr *gpt_org; |
| 223 | struct gpt_ent* gpt_entries_org; |
| 224 | const list_part_t *element; |
| 225 | const unsigned int hdr_entries=128; |
| 226 | const unsigned int gpt_entries_size=hdr_entries*sizeof(struct gpt_ent); |
| 227 | if(ro>0) |
| 228 | return 0; |
| 229 | gpt_entries_org=(struct gpt_ent*)MALLOC(gpt_entries_size); |
| 230 | disk_car->pread(disk_car, gpt_entries_org, gpt_entries_size, 2 * disk_car->sector_size); |
| 231 | |
| 232 | gpt_entries=(struct gpt_ent*)MALLOC(gpt_entries_size); |
| 233 | for(element=list_part;element!=NULL;element=element->next) |
| 234 | { |
| 235 | if(element->part->order > 0 && element->part->order <= hdr_entries) |
| 236 | { |
| 237 | partition_generate_gpt_entry(&gpt_entries[element->part->order-1], |
| 238 | element->part, disk_car, gpt_entries_org); |
| 239 | } |
| 240 | } |
| 241 | gpt=(struct gpt_hdr*)MALLOC(disk_car->sector_size); |
| 242 | gpt_org=(struct gpt_hdr*)MALLOC(disk_car->sector_size); |
| 243 | if(disk_car->pread(disk_car, gpt_org, disk_car->sector_size, disk_car->sector_size) == disk_car->sector_size) |
| 244 | guid_cpy(&gpt->hdr_guid, &gpt_org->hdr_guid); |
| 245 | else |
| 246 | efi_generate_uuid(&gpt->hdr_guid); |
| 247 | |
| 248 | memcpy(gpt->hdr_sig, GPT_HDR_SIG, 8); |
| 249 | gpt->hdr_revision=le32(GPT_HDR_REVISION); |
| 250 | gpt->hdr_size=le32(92); |
| 251 | gpt->hdr_entries=le32(hdr_entries); |
| 252 | gpt->hdr_entsz=le32(sizeof(struct gpt_ent)); |
| 253 | gpt->__reserved=le32(0); |
| 254 | gpt->hdr_lba_start=le64(1 + gpt_entries_size/disk_car->sector_size + 1); |
| 255 | gpt->hdr_lba_end=le64((disk_car->disk_size-1 - gpt_entries_size)/disk_car->sector_size - 1); |
| 256 | gpt->hdr_crc_table=le32(get_crc32(gpt_entries, gpt_entries_size, 0xFFFFFFFF)^0xFFFFFFFF); |
| 257 | gpt->hdr_lba_self=le64(1); |
| 258 | gpt->hdr_lba_alt=le64((disk_car->disk_size-1)/disk_car->sector_size); |
| 259 | gpt->hdr_lba_table=le64(1+1); |
| 260 | gpt->hdr_crc_self=le32(0); |
| 261 | gpt->hdr_crc_self=le32(get_crc32(gpt, le32(gpt->hdr_size), 0xFFFFFFFF)^0xFFFFFFFF); |
| 262 | |
| 263 | #ifdef DEBUG_GPT |
| 264 | dump2_log(gpt_entries, gpt_entries_org, gpt_entries_size); |
| 265 | dump2_log(gpt, gpt_org, disk_car->sector_size); |
| 266 | #endif |
| 267 | |
| 268 | if((unsigned)disk_car->pwrite(disk_car, gpt_entries, gpt_entries_size, le64(gpt->hdr_lba_table) * disk_car->sector_size) != gpt_entries_size) |
| 269 | { |
| 270 | free(gpt_org); |
| 271 | free(gpt_entries_org); |
| 272 | free(gpt); |
| 273 | free(gpt_entries); |
| 274 | return 1; |
| 275 | } |
nothing calls this directly
no test coverage detected