summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2008-12-01 00:07:17 +0000
committermarcel <marcel@FreeBSD.org>2008-12-01 00:07:17 +0000
commitc1d7ffc25e6ad608b9a9fc776fe3b5f97340051f (patch)
tree51f00ee526991c6876f648de4469a77f37b7579a
parent5c813d4376f9af5c59729208974ee620e3091b10 (diff)
downloadFreeBSD-src-c1d7ffc25e6ad608b9a9fc776fe3b5f97340051f.zip
FreeBSD-src-c1d7ffc25e6ad608b9a9fc776fe3b5f97340051f.tar.gz
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.
-rw-r--r--sys/geom/part/g_part.c4
-rw-r--r--sys/geom/part/g_part_gpt.c7
-rw-r--r--sys/geom/part/g_part_mbr.c7
-rw-r--r--sys/geom/part/g_part_pc98.c7
4 files changed, 20 insertions, 5 deletions
diff --git a/sys/geom/part/g_part.c b/sys/geom/part/g_part.c
index 71c0b05..ad84956 100644
--- a/sys/geom/part/g_part.c
+++ b/sys/geom/part/g_part.c
@@ -535,8 +535,8 @@ g_part_ctl_bootcode(struct gctl_req *req, struct g_part_parms *gpp)
error = ENODEV;
goto fail;
}
- if (gpp->gpp_codesize != sz) {
- error = EINVAL;
+ if (gpp->gpp_codesize > sz) {
+ error = EFBIG;
goto fail;
}
diff --git a/sys/geom/part/g_part_gpt.c b/sys/geom/part/g_part_gpt.c
index 7bdfa07..13a4561 100644
--- a/sys/geom/part/g_part_gpt.c
+++ b/sys/geom/part/g_part_gpt.c
@@ -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);
}
diff --git a/sys/geom/part/g_part_mbr.c b/sys/geom/part/g_part_mbr.c
index 9e3e809..b0ba323 100644
--- a/sys/geom/part/g_part_mbr.c
+++ b/sys/geom/part/g_part_mbr.c
@@ -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);
}
diff --git a/sys/geom/part/g_part_pc98.c b/sys/geom/part/g_part_pc98.c
index 2b997bc..f0f1474 100644
--- a/sys/geom/part/g_part_pc98.c
+++ b/sys/geom/part/g_part_pc98.c
@@ -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);
}
OpenPOWER on IntegriCloud