Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 23 Mar 2014 20:17:38 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r263674 - user/marcel/mkimg
Message-ID:  <201403232017.s2NKHcN2077086@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <sys/types.h>
 #include <sys/diskmbr.h>
+#include <sys/endian.h>
 #include <sys/errno.h>
 #include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
 
 #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 = {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201403232017.s2NKHcN2077086>