svn commit: r218558 - head/sys/geom/part

Takahashi Yoshihiro nyan at FreeBSD.org
Fri Feb 11 13:18:01 UTC 2011


Author: nyan
Date: Fri Feb 11 13:18:00 2011
New Revision: 218558
URL: http://svn.freebsd.org/changeset/base/218558

Log:
  Add support to write boot menu.

Modified:
  head/sys/geom/part/g_part_pc98.c

Modified: head/sys/geom/part/g_part_pc98.c
==============================================================================
--- head/sys/geom/part/g_part_pc98.c	Fri Feb 11 13:14:17 2011	(r218557)
+++ head/sys/geom/part/g_part_pc98.c	Fri Feb 11 13:18:00 2011	(r218558)
@@ -46,11 +46,14 @@ __FBSDID("$FreeBSD$");
 #include "g_part_if.h"
 
 #define	SECSIZE		512
+#define	MENUSIZE	7168
+#define	BOOTSIZE	8192
 
 struct g_part_pc98_table {
 	struct g_part_table	base;
 	u_char		boot[SECSIZE];
 	u_char		table[SECSIZE];
+	u_char		menu[MENUSIZE];
 };
 
 struct g_part_pc98_entry {
@@ -105,7 +108,7 @@ static struct g_part_scheme g_part_pc98_
 	.gps_entrysz = sizeof(struct g_part_pc98_entry),
 	.gps_minent = NDOSPART,
 	.gps_maxent = NDOSPART,
-	.gps_bootcodesz = SECSIZE,
+	.gps_bootcodesz = BOOTSIZE,
 };
 G_PART_SCHEME_DECLARE(g_part_pc98);
 
@@ -204,14 +207,16 @@ static int
 g_part_pc98_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp)
 {
 	struct g_part_pc98_table *table;
-	size_t codesz;
+	const u_char *codeptr;
+
+	if (gpp->gpp_codesize != BOOTSIZE)
+		return (EINVAL);
 
-	codesz = DOSMAGICOFFSET;
 	table = (struct g_part_pc98_table *)basetable;
-	bzero(table->boot, codesz);
-	codesz = MIN(codesz, gpp->gpp_codesize);
-	if (codesz > 0)
-		bcopy(gpp->gpp_codeptr, table->boot, codesz);
+	codeptr = gpp->gpp_codeptr;
+	bcopy(codeptr, table->boot, SECSIZE);
+	bcopy(codeptr + SECSIZE*2, table->menu, MENUSIZE);
+
 	return (0);
 }
 
@@ -356,7 +361,7 @@ g_part_pc98_probe(struct g_part_table *t
 	pp = cp->provider;
 
 	/* Sanity-check the provider. */
-	if (pp->sectorsize < SECSIZE || pp->mediasize < 2 * SECSIZE)
+	if (pp->sectorsize < SECSIZE || pp->mediasize < BOOTSIZE)
 		return (ENOSPC);
 	if (pp->sectorsize > SECSIZE)
 		return (ENXIO);
@@ -419,7 +424,7 @@ g_part_pc98_read(struct g_part_table *ba
 	table = (struct g_part_pc98_table *)basetable;
 	msize = pp->mediasize / SECSIZE;
 
-	buf = g_read_data(cp, 0L, 2 * SECSIZE, &error);
+	buf = g_read_data(cp, 0L, BOOTSIZE, &error);
 	if (buf == NULL)
 		return (error);
 
@@ -427,6 +432,7 @@ g_part_pc98_read(struct g_part_table *ba
 
 	bcopy(buf, table->boot, sizeof(table->boot));
 	bcopy(buf + SECSIZE, table->table, sizeof(table->table));
+	bcopy(buf + SECSIZE*2, table->menu, sizeof(table->menu));
 
 	for (index = NDOSPART - 1; index >= 0; index--) {
 		p = buf + SECSIZE + index * DOSPARTSIZE;
@@ -567,5 +573,7 @@ g_part_pc98_write(struct g_part_table *b
 	error = g_write_data(cp, 0, table->boot, SECSIZE);
 	if (!error)
 		error = g_write_data(cp, SECSIZE, table->table, SECSIZE);
+	if (!error)
+		error = g_write_data(cp, SECSIZE*2, table->menu, MENUSIZE);
 	return (error);
 }


More information about the svn-src-head mailing list