svn commit: r314577 - in head: tools/build/cross-build/mkimg usr.bin/mkimg

Simon J. Gerraty sjg at FreeBSD.org
Fri Mar 3 01:56:56 UTC 2017


Author: sjg
Date: Fri Mar  3 01:56:55 2017
New Revision: 314577
URL: https://svnweb.freebsd.org/changeset/base/314577

Log:
  Allow building mkimg as cross-tool
  
  For linux the mmap offset must also be page aligned, and we
  need to disable macros like __FBSDID()
  
  Change the linux osdep_uuidgen() to use more portable gettimeofday().
  
  Reviewed by: marcel

Added:
  head/tools/build/cross-build/mkimg/
  head/tools/build/cross-build/mkimg/Makefile   (contents, props changed)
  head/tools/build/cross-build/mkimg/Makefile.depend   (contents, props changed)
Modified:
  head/usr.bin/mkimg/Makefile
  head/usr.bin/mkimg/image.c
  head/usr.bin/mkimg/mkimg.h
  head/usr.bin/mkimg/uuid.c

Added: head/tools/build/cross-build/mkimg/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/build/cross-build/mkimg/Makefile	Fri Mar  3 01:56:55 2017	(r314577)
@@ -0,0 +1,27 @@
+# $FreeBSD$
+
+# allow building mkimg as a host tool.
+
+MKIMG_SRC = ${SRCTOP}/usr.bin/mkimg
+.PATH: ${MKIMG_SRC}
+
+.if ${.MAKE.OS} == "Linux"
+WARNS= 0
+
+CFLAGS+= \
+	-D"__FBSDID(x)=" \
+	-D_XOPEN_SOURCE -D_GNU_SOURCE
+
+.PATH: ${SRCTOP}/lib/libutil
+SRCS+= expand_number.c
+
+.endif
+
+MK_STAGING=no
+MK_TESTS= no
+
+.include <${MKIMG_SRC}/Makefile>
+
+.if ${.MAKE.OS} == "Linux"
+LDADD+= -lbsd
+.endif

Added: head/tools/build/cross-build/mkimg/Makefile.depend
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/build/cross-build/mkimg/Makefile.depend	Fri Mar  3 01:56:55 2017	(r314577)
@@ -0,0 +1,11 @@
+# $FreeBSD$
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif

Modified: head/usr.bin/mkimg/Makefile
==============================================================================
--- head/usr.bin/mkimg/Makefile	Fri Mar  3 01:50:10 2017	(r314576)
+++ head/usr.bin/mkimg/Makefile	Fri Mar  3 01:56:55 2017	(r314577)
@@ -3,7 +3,7 @@
 .include <src.opts.mk>
 
 PROG=	mkimg
-SRCS=	format.c image.c mkimg.c scheme.c uuid.c
+SRCS+=	format.c image.c mkimg.c scheme.c uuid.c
 MAN=	mkimg.1
 
 MKIMG_VERSION=20161016

Modified: head/usr.bin/mkimg/image.c
==============================================================================
--- head/usr.bin/mkimg/image.c	Fri Mar  3 01:50:10 2017	(r314576)
+++ head/usr.bin/mkimg/image.c	Fri Mar  3 01:56:55 2017	(r314577)
@@ -304,12 +304,20 @@ image_chunk_copyin(lba_t blk, void *buf,
  */
 
 static void *
-image_file_map(int fd, off_t ofs, size_t sz)
+image_file_map(int fd, off_t ofs, size_t sz, off_t *iofp)
 {
 	void *ptr;
 	size_t unit;
 	int flags, prot;
+	off_t x;
 
+	/* On Linux anyway ofs must also be page aligned */
+	if ((x = (ofs % image_swap_pgsz)) != 0) {
+	    ofs -= x;
+	    sz += x;
+	    *iofp = x;
+	} else
+	    *iofp = 0;
 	unit = (secsz > image_swap_pgsz) ? secsz : image_swap_pgsz;
 	assert((unit & (unit - 1)) == 0);
 
@@ -347,6 +355,7 @@ image_copyin_stream(lba_t blk, int fd, u
 	size_t iosz;
 	ssize_t rdsz;
 	int error;
+	off_t iof;
 
 	/*
 	 * This makes sure we're doing I/O in multiples of the page
@@ -361,12 +370,12 @@ image_copyin_stream(lba_t blk, int fd, u
 		swofs = image_swap_alloc(iosz);
 		if (swofs == -1LL)
 			return (errno);
-		buffer = image_file_map(image_swap_fd, swofs, iosz);
+		buffer = image_file_map(image_swap_fd, swofs, iosz, &iof);
 		if (buffer == NULL)
 			return (errno);
-		rdsz = read(fd, buffer, iosz);
+		rdsz = read(fd, &buffer[iof], iosz);
 		if (rdsz > 0)
-			error = image_chunk_copyin(blk, buffer, rdsz, swofs,
+			error = image_chunk_copyin(blk, &buffer[iof], rdsz, swofs,
 			    image_swap_fd);
 		else if (rdsz < 0)
 			error = errno;
@@ -389,8 +398,9 @@ image_copyin_stream(lba_t blk, int fd, u
 static int
 image_copyin_mapped(lba_t blk, int fd, uint64_t *sizep)
 {
-	off_t cur, data, end, hole, pos;
-	void *buf;
+	off_t cur, data, end, hole, pos, iof;
+	void *mp;
+	char *buf;
 	uint64_t bytesize;
 	size_t iosz, sz;
 	int error;
@@ -450,11 +460,12 @@ image_copyin_mapped(lba_t blk, int fd, u
 				sz = (pos - data > (off_t)iosz)
 				    ? iosz : (size_t)(pos - data);
 
-				buf = image_file_map(fd, data, sz);
-				if (buf != NULL) {
+				buf = mp = image_file_map(fd, data, sz, &iof);
+				if (mp != NULL) {
+					buf += iof;
 					error = image_chunk_copyin(blk, buf,
 					    sz, data, fd);
-					image_file_unmap(buf, sz);
+					image_file_unmap(mp, sz);
 				} else
 					error = errno;
 
@@ -564,19 +575,22 @@ image_copyout_zeroes(int fd, size_t coun
 static int
 image_copyout_file(int fd, size_t size, int ifd, off_t iofs)
 {
-	void *buf;
+	void *mp;
+	char *buf;
 	size_t iosz, sz;
 	int error;
+	off_t iof;
 
 	iosz = secsz * image_swap_pgsz;
 
 	while (size > 0) {
 		sz = (size > iosz) ? iosz : size;
-		buf = image_file_map(ifd, iofs, sz);
+		buf = mp = image_file_map(ifd, iofs, sz, &iof);
 		if (buf == NULL)
 			return (errno);
+		buf += iof;
 		error = image_copyout_memory(fd, sz, buf);
-		image_file_unmap(buf, sz);
+		image_file_unmap(mp, sz);
 		if (error)
 			return (error);
 		size -= sz;

Modified: head/usr.bin/mkimg/mkimg.h
==============================================================================
--- head/usr.bin/mkimg/mkimg.h	Fri Mar  3 01:50:10 2017	(r314576)
+++ head/usr.bin/mkimg/mkimg.h	Fri Mar  3 01:56:55 2017	(r314577)
@@ -104,4 +104,10 @@ typedef struct mkimg_uuid mkimg_uuid_t;
 void mkimg_uuid(mkimg_uuid_t *);
 void mkimg_uuid_enc(void *, const mkimg_uuid_t *);
 
+#ifdef __linux__
+# if !defined(__unused)
+#   define __unused __attribute__ ((__unused__))
+# endif
+#endif
+
 #endif /* _MKIMG_MKIMG_H_ */

Modified: head/usr.bin/mkimg/uuid.c
==============================================================================
--- head/usr.bin/mkimg/uuid.c	Fri Mar  3 01:50:10 2017	(r314576)
+++ head/usr.bin/mkimg/uuid.c	Fri Mar  3 01:56:55 2017	(r314577)
@@ -66,16 +66,16 @@ osdep_uuidgen(mkimg_uuid_t *uuid)
 static void
 osdep_uuidgen(mkimg_uuid_t *uuid)
 {
-	struct timespec tp;
+	struct timeval tv;
 	uint64_t time = 0x01B21DD213814000LL;
 	u_int i;
 	uint16_t seq;
 
-	if (clock_gettime(CLOCK_REALTIME, &tp) == -1)
+	if (gettimeofday(&tv, NULL) == -1)
 		abort();
 
-	time += (uint64_t)tp.tv_sec * 10000000LL;
-	time += tp.tv_nsec / 100;
+	time += (uint64_t)tv.tv_sec * 10000000LL;
+	time += tv.tv_usec * 10;
 
 	uuid->time_low = (uint32_t)time;
 	uuid->time_mid = (uint16_t)(time >> 32);


More information about the svn-src-all mailing list