svn commit: r185497 - head/sys/geom/part
Marcel Moolenaar
marcel at FreeBSD.org
Sun Nov 30 16:07:18 PST 2008
Author: marcel
Date: Mon Dec 1 00:07:17 2008
New Revision: 185497
URL: http://svn.freebsd.org/changeset/base/185497
Log:
Allow boot code to be smaller than what the scheme expects.
This effectively changes the boot code size to be an upper
bound and makes the interface more flexible.
Modified:
head/sys/geom/part/g_part.c
head/sys/geom/part/g_part_gpt.c
head/sys/geom/part/g_part_mbr.c
head/sys/geom/part/g_part_pc98.c
Modified: head/sys/geom/part/g_part.c
==============================================================================
--- head/sys/geom/part/g_part.c Sun Nov 30 23:46:31 2008 (r185496)
+++ head/sys/geom/part/g_part.c Mon Dec 1 00:07:17 2008 (r185497)
@@ -535,8 +535,8 @@ g_part_ctl_bootcode(struct gctl_req *req
error = ENODEV;
goto fail;
}
- if (gpp->gpp_codesize != sz) {
- error = EINVAL;
+ if (gpp->gpp_codesize > sz) {
+ error = EFBIG;
goto fail;
}
Modified: head/sys/geom/part/g_part_gpt.c
==============================================================================
--- head/sys/geom/part/g_part_gpt.c Sun Nov 30 23:46:31 2008 (r185496)
+++ head/sys/geom/part/g_part_gpt.c Mon Dec 1 00:07:17 2008 (r185497)
@@ -374,9 +374,14 @@ static int
g_part_gpt_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp)
{
struct g_part_gpt_table *table;
+ size_t codesz;
+ codesz = DOSPARTOFF;
table = (struct g_part_gpt_table *)basetable;
- bcopy(gpp->gpp_codeptr, table->mbr, DOSPARTOFF);
+ bzero(table->mbr, codesz);
+ codesz = MIN(codesz, gpp->gpp_codesize);
+ if (codesz > 0)
+ bcopy(gpp->gpp_codeptr, table->mbr, codesz);
return (0);
}
Modified: head/sys/geom/part/g_part_mbr.c
==============================================================================
--- head/sys/geom/part/g_part_mbr.c Sun Nov 30 23:46:31 2008 (r185496)
+++ head/sys/geom/part/g_part_mbr.c Mon Dec 1 00:07:17 2008 (r185497)
@@ -213,9 +213,14 @@ static int
g_part_mbr_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp)
{
struct g_part_mbr_table *table;
+ size_t codesz;
+ codesz = DOSPARTOFF;
table = (struct g_part_mbr_table *)basetable;
- bcopy(gpp->gpp_codeptr, table->mbr, DOSPARTOFF);
+ bzero(table->mbr, codesz);
+ codesz = MIN(codesz, gpp->gpp_codesize);
+ if (codesz > 0)
+ bcopy(gpp->gpp_codeptr, table->mbr, codesz);
return (0);
}
Modified: head/sys/geom/part/g_part_pc98.c
==============================================================================
--- head/sys/geom/part/g_part_pc98.c Sun Nov 30 23:46:31 2008 (r185496)
+++ head/sys/geom/part/g_part_pc98.c Mon Dec 1 00:07:17 2008 (r185497)
@@ -209,9 +209,14 @@ 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;
+ codesz = DOSMAGICOFFSET;
table = (struct g_part_pc98_table *)basetable;
- bcopy(gpp->gpp_codeptr, table->boot, DOSMAGICOFFSET);
+ bzero(table->boot, codesz);
+ codesz = MIN(codesz, gpp->gpp_codesize);
+ if (codesz > 0)
+ bcopy(gpp->gpp_codeptr, table->boot, codesz);
return (0);
}
More information about the svn-src-all
mailing list