From owner-svn-src-user@FreeBSD.ORG Tue Mar 25 00:29:57 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 26EEBC48; Tue, 25 Mar 2014 00:29:57 +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 EEC8AE31; Tue, 25 Mar 2014 00:29:56 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s2P0Tu4c080834; Tue, 25 Mar 2014 00:29:56 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s2P0Tub6080833; Tue, 25 Mar 2014 00:29:56 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201403250029.s2P0Tub6080833@svn.freebsd.org> From: Marcel Moolenaar Date: Tue, 25 Mar 2014 00:29:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r263697 - 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: Tue, 25 Mar 2014 00:29:57 -0000 Author: marcel Date: Tue Mar 25 00:29:56 2014 New Revision: 263697 URL: http://svnweb.freebsd.org/changeset/base/263697 Log: Mostly implement the pc98 scheme. The partition table has no LBA fields at all, so we're entirely dependent upon CHS addressing. And CHS addressing is what needs more work. Modified: user/marcel/mkimg/pc98.c Modified: user/marcel/mkimg/pc98.c ============================================================================== --- user/marcel/mkimg/pc98.c Tue Mar 25 00:27:18 2014 (r263696) +++ user/marcel/mkimg/pc98.c Tue Mar 25 00:29:56 2014 (r263697) @@ -29,13 +29,19 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include +#include +#include #include "mkimg.h" #include "scheme.h" +#define PC98_BOOTCODESZ 8192 + static struct mkimg_alias pc98_aliases[] = { + { ALIAS_FREEBSD, ALIAS_INT2TYPE(PC98_PTYP_386BSD) }, { ALIAS_NONE, 0 } }; @@ -44,14 +50,56 @@ pc98_metadata(u_int where) { u_int secs; - secs = (where == SCHEME_META_IMG_START) ? 2 : 0; - return (secs); + secs = PC98_BOOTCODESZ / secsz; + return ((where == SCHEME_META_IMG_START) ? secs : 0); +} + +static void +pc98_chs(u_short *cyl, u_char *hd, u_char *sec, uint32_t lba __unused) +{ + + *cyl = 0xffff; /* XXX */ + *hd = 0xff; /* XXX */ + *sec = 0xff; /* XXX */ } static int -pc98_write(int fd __unused, lba_t imgsz __unused, void *bootcode __unused) +pc98_write(int fd, lba_t imgsz __unused, void *bootcode) { - return (ENOSYS); + struct part *part; + struct pc98_partition *dpbase, *dp; + u_char *buf; + int error, ptyp; + + buf = malloc(PC98_BOOTCODESZ); + if (buf == NULL) + return (ENOMEM); + if (bootcode != NULL) { + memcpy(buf, bootcode, PC98_BOOTCODESZ); + memset(buf + secsz, 0, secsz); + } else + memset(buf, 0, PC98_BOOTCODESZ); + le16enc(buf + PC98_MAGICOFS, PC98_MAGIC); + dpbase = (void *)(buf + secsz); + STAILQ_FOREACH(part, &partlist, link) { + dp = dpbase + part->index; + ptyp = ALIAS_TYPE2INT(part->type); + dp->dp_mid = ptyp; + dp->dp_sid = ptyp >> 8; + pc98_chs(&dp->dp_scyl, &dp->dp_shd, &dp->dp_ssect, + part->block); + pc98_chs(&dp->dp_scyl, &dp->dp_shd, &dp->dp_ssect, + part->block + part->size - 1); + if (part->label != NULL) + memcpy(dp->dp_name, part->label, strlen(part->label)); + } + error = mkimg_seek(fd, 0); + if (error == 0) { + if (write(fd, buf, PC98_BOOTCODESZ) != PC98_BOOTCODESZ) + error = errno; + } + free(buf); + return (error); } static struct mkimg_scheme pc98_scheme = { @@ -60,6 +108,8 @@ static struct mkimg_scheme pc98_scheme = .aliases = pc98_aliases, .metadata = pc98_metadata, .write = pc98_write, + .bootcode = PC98_BOOTCODESZ, + .labellen = 16, .nparts = PC98_NPARTS };