From owner-svn-src-user@FreeBSD.ORG Fri Mar 21 04:52:47 2014 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 92AB07A9; Fri, 21 Mar 2014 04:52:47 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 730AB66A; Fri, 21 Mar 2014 04:52:47 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s2L4qlmN014980; Fri, 21 Mar 2014 04:52:47 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s2L4qlKi014979; Fri, 21 Mar 2014 04:52:47 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201403210452.s2L4qlKi014979@svn.freebsd.org> From: Marcel Moolenaar Date: Fri, 21 Mar 2014 04:52:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r263465 - user/marcel/mkimg X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Mar 2014 04:52:47 -0000 Author: marcel Date: Fri Mar 21 04:52:46 2014 New Revision: 263465 URL: http://svnweb.freebsd.org/changeset/base/263465 Log: Make this work on big-endian architectures by adding encoding. Modified: user/marcel/mkimg/gpt.c Modified: user/marcel/mkimg/gpt.c ============================================================================== --- user/marcel/mkimg/gpt.c Fri Mar 21 04:45:57 2014 (r263464) +++ user/marcel/mkimg/gpt.c Fri Mar 21 04:52:46 2014 (r263465) @@ -169,9 +169,10 @@ gpt_write_pmbr(int fd, off_t nblocks, u_ static struct gpt_ent * gpt_mktbl(u_int tblsz, u_int secsz) { + uuid_t uuid; struct gpt_ent *tbl, *ent; struct part *part; - uint64_t partsize; + uint64_t limit; tbl = calloc(tblsz, secsz); if (tbl == NULL) @@ -179,12 +180,12 @@ gpt_mktbl(u_int tblsz, u_int secsz) STAILQ_FOREACH(part, &partlist, link) { ent = tbl + part->index; - memcpy(&ent->ent_type, ALIAS_TYPE2PTR(part->type), - sizeof(uuid_t)); - uuidgen(&ent->ent_uuid, 1); - ent->ent_lba_start = part->offset / secsz; - partsize = part->size / secsz; - ent->ent_lba_end = ent->ent_lba_start + partsize - 1; + uuid_enc_le(&ent->ent_type, ALIAS_TYPE2PTR(part->type)); + uuidgen(&uuid, 1); + uuid_enc_le(&ent->ent_uuid, &uuid); + le64enc(&ent->ent_lba_start, part->offset / secsz); + limit = (part->offset + part->size) / secsz; + le64enc(&ent->ent_lba_end, limit - 1); /* TODO add support for labels */ } return (tbl); @@ -194,21 +195,25 @@ static int gpt_write_hdr(int fd, struct gpt_hdr *hdr, uint64_t self, uint64_t alt, uint64_t tbl, u_int secsz) { + uint32_t crc; - hdr->hdr_lba_self = self; - hdr->hdr_lba_alt = alt; - hdr->hdr_lba_table = tbl; + le64enc(&hdr->hdr_lba_self, self); + le64enc(&hdr->hdr_lba_alt, alt); + le64enc(&hdr->hdr_lba_table, tbl); hdr->hdr_crc_self = 0; - hdr->hdr_crc_self = crc32(hdr, hdr->hdr_size); + crc = crc32(hdr, offsetof(struct gpt_hdr, padding)); + le64enc(&hdr->hdr_crc_self, crc); return (gpt_filewrite(fd, self * secsz, hdr, secsz)); } static int gpt_write(int fd, off_t imgsz, u_int parts, u_int secsz) { + uuid_t uuid; struct gpt_ent *tbl; struct gpt_hdr *hdr; off_t nblocks; + uint32_t crc; u_int tblsz; int error; @@ -240,14 +245,16 @@ gpt_write(int fd, off_t imgsz, u_int par } memset(hdr, 0, secsz); memcpy(hdr->hdr_sig, GPT_HDR_SIG, sizeof(hdr->hdr_sig)); - hdr->hdr_revision = GPT_HDR_REVISION; - hdr->hdr_size = offsetof(struct gpt_hdr, padding); - hdr->hdr_lba_start = 2 + tblsz; - hdr->hdr_lba_end = nblocks - tblsz - 2; - uuidgen(&hdr->hdr_uuid, 1); - hdr->hdr_entries = parts; - hdr->hdr_entsz = sizeof(struct gpt_ent); - hdr->hdr_crc_table = crc32(tbl, hdr->hdr_entries * hdr->hdr_entsz); + le32enc(&hdr->hdr_revision, GPT_HDR_REVISION); + le32enc(&hdr->hdr_size, offsetof(struct gpt_hdr, padding)); + le64enc(&hdr->hdr_lba_start, 2 + tblsz); + le64enc(&hdr->hdr_lba_end, nblocks - tblsz - 2); + uuidgen(&uuid, 1); + uuid_enc_le(&hdr->hdr_uuid, &uuid); + le32enc(&hdr->hdr_entries, parts); + le32enc(&hdr->hdr_entsz, sizeof(struct gpt_ent)); + crc = crc32(tbl, parts * sizeof(struct gpt_ent)); + le32enc(&hdr->hdr_crc_table, crc); error = gpt_write_hdr(fd, hdr, 1, nblocks - 1, 2, secsz); if (!error) error = gpt_write_hdr(fd, hdr, nblocks - 1, 1,