int gpt_fill_header(block_dev_desc_t *dev_desc, gpt_header *gpt_h, char *str_guid, int parts_count) { gpt_h->signature = cpu_to_le64(GPT_HEADER_SIGNATURE); gpt_h->revision = cpu_to_le32(GPT_HEADER_REVISION_V1); gpt_h->header_size = cpu_to_le32(sizeof(gpt_header)); gpt_h->my_lba = cpu_to_le64(1); gpt_h->alternate_lba = cpu_to_le64(dev_desc->lba - 1); gpt_h->first_usable_lba = cpu_to_le64(34); gpt_h->last_usable_lba = cpu_to_le64(dev_desc->lba - 34); gpt_h->partition_entry_lba = cpu_to_le64(2); gpt_h->num_partition_entries = cpu_to_le32(GPT_ENTRY_NUMBERS); gpt_h->sizeof_partition_entry = cpu_to_le32(sizeof(gpt_entry)); gpt_h->header_crc32 = 0; gpt_h->partition_entry_array_crc32 = 0; if (uuid_str_to_bin(str_guid, gpt_h->disk_guid.b, UUID_STR_FORMAT_GUID)) return -1; return 0; }
static int DhcpExtended(u8 *e, int message_type, IPaddr_t ServerID, IPaddr_t RequestedIP) { u8 *start = e; u8 *cnt; #if defined(CONFIG_BOOTP_PXE) char *uuid; u16 clientarch; #endif #if defined(CONFIG_BOOTP_VENDOREX) u8 *x; #endif #if defined(CONFIG_BOOTP_SEND_HOSTNAME) char *hostname; #endif *e++ = 99; /* RFC1048 Magic Cookie */ *e++ = 130; *e++ = 83; *e++ = 99; *e++ = 53; /* DHCP Message Type */ *e++ = 1; *e++ = message_type; *e++ = 57; /* Maximum DHCP Message Size */ *e++ = 2; *e++ = (576 - 312 + OPT_FIELD_SIZE) >> 8; *e++ = (576 - 312 + OPT_FIELD_SIZE) & 0xff; if (ServerID) { int tmp = ntohl(ServerID); *e++ = 54; /* ServerID */ *e++ = 4; *e++ = tmp >> 24; *e++ = tmp >> 16; *e++ = tmp >> 8; *e++ = tmp & 0xff; } if (RequestedIP) { int tmp = ntohl(RequestedIP); *e++ = 50; /* Requested IP */ *e++ = 4; *e++ = tmp >> 24; *e++ = tmp >> 16; *e++ = tmp >> 8; *e++ = tmp & 0xff; } #if defined(CONFIG_BOOTP_SEND_HOSTNAME) hostname = getenv("hostname"); if (hostname) { int hostnamelen = strlen(hostname); *e++ = 12; /* Hostname */ *e++ = hostnamelen; memcpy(e, hostname, hostnamelen); e += hostnamelen; } #endif #if defined(CONFIG_BOOTP_PXE) clientarch = CONFIG_BOOTP_PXE_CLIENTARCH; *e++ = 93; /* Client System Architecture */ *e++ = 2; *e++ = (clientarch >> 8) & 0xff; *e++ = clientarch & 0xff; *e++ = 94; /* Client Network Interface Identifier */ *e++ = 3; *e++ = 1; /* type field for UNDI */ *e++ = 0; /* major revision */ *e++ = 0; /* minor revision */ uuid = getenv("pxeuuid"); if (uuid) { if (uuid_str_valid(uuid)) { *e++ = 97; /* Client Machine Identifier */ *e++ = 17; *e++ = 0; /* type 0 - UUID */ uuid_str_to_bin(uuid, e, UUID_STR_FORMAT_STD); e += 16; } else { printf("Invalid pxeuuid: %s\n", uuid); } } #endif #ifdef CONFIG_BOOTP_VCI_STRING put_vci(e, CONFIG_BOOTP_VCI_STRING); #endif #if defined(CONFIG_BOOTP_VENDOREX) x = dhcp_vendorex_prep(e); if (x) return x - start; #endif *e++ = 55; /* Parameter Request List */ cnt = e++; /* Pointer to count of requested items */ *cnt = 0; #if defined(CONFIG_BOOTP_SUBNETMASK) *e++ = 1; /* Subnet Mask */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_TIMEOFFSET) *e++ = 2; *cnt += 1; #endif #if defined(CONFIG_BOOTP_GATEWAY) *e++ = 3; /* Router Option */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_DNS) *e++ = 6; /* DNS Server(s) */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_HOSTNAME) *e++ = 12; /* Hostname */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_BOOTFILESIZE) *e++ = 13; /* Boot File Size */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_BOOTPATH) *e++ = 17; /* Boot path */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_NISDOMAIN) *e++ = 40; /* NIS Domain name request */ *cnt += 1; #endif #if defined(CONFIG_BOOTP_NTPSERVER) *e++ = 42; *cnt += 1; #endif /* no options, so back up to avoid sending an empty request list */ if (*cnt == 0) e -= 2; *e++ = 255; /* End of the list */ /* Pad to minimal length */ #ifdef CONFIG_DHCP_MIN_EXT_LEN while ((e - start) < CONFIG_DHCP_MIN_EXT_LEN) *e++ = 0; #endif return e - start; }
int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e, disk_partition_t *partitions, int parts) { lbaint_t offset = (lbaint_t)le64_to_cpu(gpt_h->first_usable_lba); lbaint_t start; lbaint_t last_usable_lba = (lbaint_t) le64_to_cpu(gpt_h->last_usable_lba); int i, k; size_t efiname_len, dosname_len; #ifdef CONFIG_PARTITION_UUIDS char *str_uuid; unsigned char *bin_uuid; #endif for (i = 0; i < parts; i++) { /* partition starting lba */ start = partitions[i].start; if (start && (start < offset)) { printf("Partition overlap\n"); return -1; } if (start) { gpt_e[i].starting_lba = cpu_to_le64(start); offset = start + partitions[i].size; } else { gpt_e[i].starting_lba = cpu_to_le64(offset); offset += partitions[i].size; } if (offset >= last_usable_lba) { printf("Partitions layout exceds disk size\n"); return -1; } /* partition ending lba */ if ((i == parts - 1) && (partitions[i].size == 0)) /* extend the last partition to maximuim */ gpt_e[i].ending_lba = gpt_h->last_usable_lba; else gpt_e[i].ending_lba = cpu_to_le64(offset - 1); /* partition type GUID */ memcpy(gpt_e[i].partition_type_guid.b, &PARTITION_BASIC_DATA_GUID, 16); #ifdef CONFIG_PARTITION_UUIDS str_uuid = partitions[i].uuid; bin_uuid = gpt_e[i].unique_partition_guid.b; if (uuid_str_to_bin(str_uuid, bin_uuid, UUID_STR_FORMAT_STD)) { printf("Partition no. %d: invalid guid: %s\n", i, str_uuid); return -1; } #endif /* partition attributes */ memset(&gpt_e[i].attributes, 0, sizeof(gpt_entry_attributes)); /* partition name */ efiname_len = sizeof(gpt_e[i].partition_name) / sizeof(efi_char16_t); dosname_len = sizeof(partitions[i].name); memset(gpt_e[i].partition_name, 0, sizeof(gpt_e[i].partition_name)); for (k = 0; k < min(dosname_len, efiname_len); k++) gpt_e[i].partition_name[k] = (efi_char16_t)(partitions[i].name[k]); debug("%s: name: %s offset[%d]: 0x" LBAF " size[%d]: 0x" LBAF "\n", __func__, partitions[i].name, i, offset, i, partitions[i].size); } return 0; }