From owner-svn-src-user@FreeBSD.ORG Sun Mar 23 20:17:39 2014 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 3560C376; Sun, 23 Mar 2014 20:17:39 +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 07CD9C7; Sun, 23 Mar 2014 20:17:39 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s2NKHcZ3077087; Sun, 23 Mar 2014 20:17:38 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s2NKHcN2077086; Sun, 23 Mar 2014 20:17:38 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201403232017.s2NKHcN2077086@svn.freebsd.org> From: Marcel Moolenaar Date: Sun, 23 Mar 2014 20:17:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r263674 - 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: Sun, 23 Mar 2014 20:17:39 -0000 Author: marcel Date: Sun Mar 23 20:17:38 2014 New Revision: 263674 URL: http://svnweb.freebsd.org/changeset/base/263674 Log: Implement the EBR scheme. Use a function for filling in the CHS fields. For now, put 0xff in each field. This needs to be revisited when we have proper geometry. Note that even without proper CHS values, it's already accepted by the kernel. Modified: user/marcel/mkimg/ebr.c Modified: user/marcel/mkimg/ebr.c ============================================================================== --- user/marcel/mkimg/ebr.c Sun Mar 23 20:15:21 2014 (r263673) +++ user/marcel/mkimg/ebr.c Sun Mar 23 20:17:38 2014 (r263674) @@ -29,13 +29,18 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include +#include +#include #include "mkimg.h" #include "scheme.h" static struct mkimg_alias ebr_aliases[] = { + { ALIAS_FAT32, ALIAS_INT2TYPE(DOSPTYP_FAT32) }, + { ALIAS_FREEBSD, ALIAS_INT2TYPE(DOSPTYP_386BSD) }, { ALIAS_NONE, 0 } }; @@ -48,10 +53,67 @@ ebr_metadata(u_int where) return (secs); } +static void +ebr_chs(u_char *cyl, u_char *hd, u_char *sec, uint32_t lba __unused) +{ + + *cyl = 0xff; /* XXX */ + *hd = 0xff; /* XXX */ + *sec = 0xff; /* XXX */ +} + static int -ebr_write(int fd __unused, lba_t imgsz __unused, void *bootcode __unused) +ebr_write(int fd, lba_t imgsz __unused, void *bootcode __unused) { - return (ENOSYS); + u_char *ebr; + struct dos_partition *dp; + struct part *part, *next; + lba_t block, trksz; + int error; + + ebr = malloc(secsz); + if (ebr == NULL) + return (ENOMEM); + memset(ebr, 0, secsz); + le16enc(ebr + DOSMAGICOFFSET, DOSMAGIC); + + error = 0; + trksz = 1; /* Sectors/track */ + STAILQ_FOREACH_SAFE(part, &partlist, link, next) { + block = part->block - trksz; + dp = (void *)(ebr + DOSPARTOFF); + ebr_chs(&dp->dp_scyl, &dp->dp_shd, &dp->dp_ssect, trksz); + dp->dp_typ = ALIAS_TYPE2INT(part->type); + ebr_chs(&dp->dp_ecyl, &dp->dp_ehd, &dp->dp_esect, + part->block + part->size - 1); + le32enc(&dp->dp_start, trksz); + le32enc(&dp->dp_size, part->size); + + /* Add link entry */ + if (next != NULL) { + dp++; + ebr_chs(&dp->dp_scyl, &dp->dp_shd, &dp->dp_ssect, + next->block - trksz); + dp->dp_typ = DOSPTYP_EXT; + ebr_chs(&dp->dp_ecyl, &dp->dp_ehd, &dp->dp_esect, + next->block + next->size - 1); + le32enc(&dp->dp_start, next->block - trksz); + le32enc(&dp->dp_size, next->size + trksz); + } + + error = mkimg_seek(fd, block); + if (error == 0) { + if (write(fd, ebr, secsz) != secsz) + error = errno; + } + if (error) + break; + + memset(ebr + DOSPARTOFF, 0, 2 * DOSPARTSIZE); + } + + free(ebr); + return (error); } static struct mkimg_scheme ebr_scheme = {