summaryrefslogtreecommitdiffstats
path: root/sys/geom/part
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 /sys/geom/part
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.
Diffstat (limited to 'sys/geom/part')
-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