diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/conf/files | 1 | ||||
-rw-r--r-- | sys/conf/files.pc98 | 1 | ||||
-rw-r--r-- | sys/geom/geom_pc98.c | 26 | ||||
-rw-r--r-- | sys/geom/geom_pc98_enc.c | 77 | ||||
-rw-r--r-- | sys/sys/diskpc98.h | 3 |
5 files changed, 84 insertions, 24 deletions
diff --git a/sys/conf/files b/sys/conf/files index 12dd911..90c4664 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -909,6 +909,7 @@ geom/geom_mbr.c optional geom_mbr geom/geom_mbr_enc.c optional geom_mbr geom/geom_mirror.c optional geom_mirror geom/geom_pc98.c optional geom_pc98 +geom/geom_pc98_enc.c optional geom_pc98 geom/geom_slice.c standard geom/geom_subr.c standard geom/geom_sunlabel.c optional geom_sunlabel diff --git a/sys/conf/files.pc98 b/sys/conf/files.pc98 index 26ffdbf..b83c162 100644 --- a/sys/conf/files.pc98 +++ b/sys/conf/files.pc98 @@ -126,6 +126,7 @@ dev/syscons/sysmouse.c optional sc geom/geom_bsd.c standard geom/geom_bsd_enc.c standard geom/geom_pc98.c standard +geom/geom_pc98_enc.c standard gnu/i386/fpemul/div_small.s optional gpl_math_emulate \ warning "kernel contains GPL contaminated math emulator" gnu/i386/fpemul/errors.c optional gpl_math_emulate diff --git a/sys/geom/geom_pc98.c b/sys/geom/geom_pc98.c index adcf1a3..312ae3c 100644 --- a/sys/geom/geom_pc98.c +++ b/sys/geom/geom_pc98.c @@ -47,28 +47,6 @@ #define PC98_CLASS_NAME "PC98" -static void -g_dec_pc98_partition(u_char *ptr, struct pc98_partition *d) -{ - u_int u; - - d->dp_mid = ptr[0]; - d->dp_sid = ptr[1]; - d->dp_dum1 = ptr[2]; - d->dp_dum2 = ptr[3]; - d->dp_ipl_sct = ptr[4]; - d->dp_ipl_head = ptr[5]; - d->dp_ipl_cyl = le16dec(ptr + 6); - d->dp_ssect = ptr[8]; - d->dp_shd = ptr[9]; - d->dp_scyl = le16dec(ptr + 10); - d->dp_esect = ptr[12]; - d->dp_ehd = ptr[13]; - d->dp_ecyl = le16dec(ptr + 14); - for (u = 0; u < sizeof(d->dp_name); u++) - d->dp_name[u] = ptr[16 + u]; -} - struct g_pc98_softc { u_int fwsectors, fwheads, sectorsize; int type[NDOSPART]; @@ -113,7 +91,7 @@ g_pc98_modify(struct g_geom *gp, struct g_pc98_softc *ms, u_char *sec) #endif for (i = 0; i < NDOSPART; i++) - g_dec_pc98_partition( + pc98_partition_dec( sec + 512 + i * sizeof(struct pc98_partition), &dp[i]); for (i = 0; i < NDOSPART; i++) { @@ -261,7 +239,7 @@ g_pc98_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, mp = gsp->softc; g_slice_dumpconf(sb, indent, gp, cp, pp); if (pp != NULL) { - g_dec_pc98_partition( + pc98_partition_dec( mp->sec + 512 + pp->index * sizeof(struct pc98_partition), &dp); strncpy(sname, dp.dp_name, 16); diff --git a/sys/geom/geom_pc98_enc.c b/sys/geom/geom_pc98_enc.c new file mode 100644 index 0000000..5424ea4 --- /dev/null +++ b/sys/geom/geom_pc98_enc.c @@ -0,0 +1,77 @@ +/*- + * Copyright (c) 2003 TAKAHASHI Yoshihiro + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include <sys/types.h> +#include <sys/diskpc98.h> +#include <sys/endian.h> + +void +pc98_partition_dec(void const *pp, struct pc98_partition *d) +{ + unsigned char const *ptr = pp; + int i; + + d->dp_mid = ptr[0]; + d->dp_sid = ptr[1]; + d->dp_dum1 = ptr[2]; + d->dp_dum2 = ptr[3]; + d->dp_ipl_sct = ptr[4]; + d->dp_ipl_head = ptr[5]; + d->dp_ipl_cyl = le16dec(ptr + 6); + d->dp_ssect = ptr[8]; + d->dp_shd = ptr[9]; + d->dp_scyl = le16dec(ptr + 10); + d->dp_esect = ptr[12]; + d->dp_ehd = ptr[13]; + d->dp_ecyl = le16dec(ptr + 14); + for (i = 0; i < sizeof (d->dp_name); i++) + d->dp_name[i] = ptr[16 + i]; +} + +void +pc98_partition_enc(void *pp, struct pc98_partition *d) +{ + unsigned char *ptr = pp; + int i; + + ptr[0] = d->dp_mid; + ptr[1] = d->dp_sid; + ptr[2] = d->dp_dum1; + ptr[3] = d->dp_dum2; + ptr[4] = d->dp_ipl_sct; + ptr[5] = d->dp_ipl_head; + le16enc(ptr + 6, d->dp_ipl_cyl); + ptr[8] = d->dp_ssect; + ptr[9] = d->dp_shd; + le16enc(ptr + 10, d->dp_scyl); + ptr[12] = d->dp_esect; + ptr[13] = d->dp_ehd; + le16enc(ptr + 14, d->dp_ecyl); + for (i = 0; i < sizeof (d->dp_name); i++) + ptr[16 + i] = d->dp_name[i]; +} diff --git a/sys/sys/diskpc98.h b/sys/sys/diskpc98.h index 3bfb2c8..67b80e0 100644 --- a/sys/sys/diskpc98.h +++ b/sys/sys/diskpc98.h @@ -66,6 +66,9 @@ struct pc98_partition { CTASSERT(sizeof (struct pc98_partition) == 32); #endif +void pc98_partition_dec(void const *pp, struct pc98_partition *d); +void pc98_partition_enc(void *pp, struct pc98_partition *d); + #define DIOCGPC98 _IOR('M', 128, u_char[8192]) #define DIOCSPC98 _IOW('M', 129, u_char[8192]) |