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-all
mailing list