summaryrefslogtreecommitdiffstats
path: root/sbin/fdisk_pc98
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2006-02-26 07:37:10 +0000
committerimp <imp@FreeBSD.org>2006-02-26 07:37:10 +0000
commit7dec5978c15992be13c830f1fe18eb0eacd7b2ca (patch)
tree841e8090792ec635fe67bc8f30f9fa1bc7873579 /sbin/fdisk_pc98
parenta8acef0bfb8502573b7e11703dee9d7b7027497d (diff)
downloadFreeBSD-src-7dec5978c15992be13c830f1fe18eb0eacd7b2ca.zip
FreeBSD-src-7dec5978c15992be13c830f1fe18eb0eacd7b2ca.tar.gz
Fixes and new features:
o Merge the -I switch from i386 verison to initialize the partition table to use the maximum amount possible for a single FreeBSD table. o Improve warning when the geom method fails (which I think it always will until geom_pc98 is updated to respond to this ctl message) o when writing out the boot sector, we have to write out a minimum of 1024 bytes or the sector size. This is different than the i386 case where we need to write out a minimum of 512 bytes (which is also the minimum sector size). We already handle this difference on reading, but didn't in writing, so attempting to write a new partition table would fail. o Add MID to the -s output, since pc98 users are likely interested in both of these parameters. # I can now initialize disks on my pc98 machine either by -I or by # manually entering the parameters. I don't know if fdisk -B works or not, # since I'm not willing to risk my only working boot disk to test it..
Diffstat (limited to 'sbin/fdisk_pc98')
-rw-r--r--sbin/fdisk_pc98/fdisk.88
-rw-r--r--sbin/fdisk_pc98/fdisk.c66
2 files changed, 62 insertions, 12 deletions
diff --git a/sbin/fdisk_pc98/fdisk.8 b/sbin/fdisk_pc98/fdisk.8
index c4b25c7..24b62ee 100644
--- a/sbin/fdisk_pc98/fdisk.8
+++ b/sbin/fdisk_pc98/fdisk.8
@@ -9,7 +9,7 @@
.Sh SYNOPSIS
.Nm
.\" !PC98 .Op Fl BIaistu
-.Op Fl Bastu
+.Op Fl BIastu
.Op Fl b Ar bootcode
.Op Fl 1234
.Op Ar disk
@@ -67,6 +67,12 @@ Ignored
if
.Fl f
is given.
+.It Fl I
+Initialize the partition table. One
+.Fx
+slice covering the entire disk will be created.
+Some space at the start of the disk will reserved for the IPL program
+and the pc98 partition table itself.
.It Fl f Ar configfile
Set partition values using the file
.Ar configfile .
diff --git a/sbin/fdisk_pc98/fdisk.c b/sbin/fdisk_pc98/fdisk.c
index b5d6cc7..e50d397 100644
--- a/sbin/fdisk_pc98/fdisk.c
+++ b/sbin/fdisk_pc98/fdisk.c
@@ -103,6 +103,7 @@ typedef struct cmd {
} CMD;
static int B_flag = 0; /* replace boot code */
+static int I_flag = 0; /* Inizialize disk to defaults */
static int a_flag = 0; /* set active partition */
static int i_flag = 0; /* replace partition data */
static int u_flag = 0; /* update partition data */
@@ -170,6 +171,7 @@ static int decimal(const char *str, int *num, int deflt);
static const char *get_type(int type);
static void usage(void);
static int string(const char *str, char **ans);
+static void reset_boot(void);
int
main(int argc, char *argv[])
@@ -179,11 +181,14 @@ main(int argc, char *argv[])
int partition = -1;
struct pc98_partition *partp;
- while ((c = getopt(argc, argv, "Ba:f:istuv12345678")) != -1)
+ while ((c = getopt(argc, argv, "BIa:f:istuv12345678")) != -1)
switch (c) {
case 'B':
B_flag = 1;
break;
+ case 'I':
+ I_flag = 1;
+ break;
case 'a':
a_flag = 1;
break;
@@ -249,21 +254,45 @@ main(int argc, char *argv[])
err(1, "read_s0");
printf("%s: %d cyl %d hd %d sec\n", disk, dos_cyls, dos_heads,
dos_sectors);
- printf("Part %11s %11s SID\n", "Start", "Size");
+ printf("Part %11s %11s %4s %4s\n", "Start", "Size", "MID",
+ "SID");
for (i = 0; i < NDOSPART; i++) {
partp = ((struct pc98_partition *) &mboot.parts) + i;
if (partp->dp_sid == 0)
continue;
- printf("%4d: %11u %11u 0x%02x\n", i + 1,
+ printf("%4d: %11u %11u 0x%02x 0x%02x\n", i + 1,
partp->dp_scyl * cylsecs,
(partp->dp_ecyl - partp->dp_scyl + 1) * cylsecs,
- partp->dp_sid);
+ partp->dp_mid, partp->dp_sid);
}
exit(0);
}
printf("******* Working on device %s *******\n",disk);
+ if (I_flag) {
+ read_s0();
+ reset_boot();
+ partp = (struct pc98_partition *) (&mboot.parts[0]);
+ partp->dp_mid = DOSMID_386BSD;
+ partp->dp_sid = DOSSID_386BSD;
+ /* Start c/h/s. */
+ partp->dp_scyl = partp->dp_ipl_cyl = 1;
+ partp->dp_shd = partp->dp_ipl_head = 1;
+ partp->dp_ssect = partp->dp_ipl_sct = 0;
+
+ /* End c/h/s. */
+ partp->dp_ecyl = dos_cyls - 1;
+ partp->dp_ehd = dos_cylsecs / dos_sectors;
+ partp->dp_esect = dos_sectors;
+
+ if (v_flag)
+ print_s0(-1);
+ if (!t_flag)
+ write_s0();
+ exit(0);
+ }
+
if (f_flag) {
if (v_flag)
print_s0(-1);
@@ -315,7 +344,7 @@ static void
usage()
{
fprintf(stderr, "%s%s",
- "usage: fdisk [-Baistu] [-12345678] [disk]\n",
+ "usage: fdisk [-BIaistu] [-12345678] [disk]\n",
" fdisk -f configfile [-itv] [disk]\n");
exit(1);
}
@@ -571,7 +600,7 @@ open_disk(int flag)
}
if ( !(st.st_mode & S_IFCHR) )
warnx("device %s is not character special", disk);
- rwmode = a_flag || B_flag || flag ? O_RDWR : O_RDONLY;
+ rwmode = I_flag || a_flag || B_flag || flag ? O_RDWR : O_RDONLY;
fd = open(disk, rwmode);
if (fd == -1 && errno == EPERM && rwmode == O_RDWR)
fd = open(disk, O_RDONLY);
@@ -604,8 +633,9 @@ write_disk(off_t sector, void *buf)
struct gctl_req *grq;
const char *q;
char fbuf[BUFSIZ];
- int i, fdw;
+ int i, fdw, sz;
+ sz = secsize > MIN_SEC_SIZE ? secsize : MIN_SEC_SIZE * 2;
grq = gctl_get_handle();
gctl_ro_param(grq, "verb", -1, "write PC98");
gctl_ro_param(grq, "class", -1, "PC98");
@@ -615,17 +645,18 @@ write_disk(off_t sector, void *buf)
else
q++;
gctl_ro_param(grq, "geom", -1, q);
- gctl_ro_param(grq, "data", secsize, buf);
+ gctl_ro_param(grq, "data", sz, buf);
q = gctl_issue(grq);
if (q == NULL) {
gctl_free(grq);
return(0);
}
- warnx("%s", q);
+ warnx("Geom problem: %s", q);
gctl_free(grq);
- error = pwrite(fd, buf, secsize, (sector * 512));
- if (error == secsize)
+ warnx("Warning: Partitioning via geom failed, trying raw write");
+ error = pwrite(fd, buf, sz, sector * 512);
+ if (error == sz)
return (0);
for (i = 0; i < NDOSPART; i++) {
@@ -859,3 +890,16 @@ get_rootdisk(void)
return s;
}
+
+static void
+reset_boot(void)
+{
+ int i;
+ struct pc98_partition *partp;
+
+ init_boot();
+ for (i = 1; i <= NDOSPART; i++) {
+ partp = ((struct pc98_partition *) &mboot.parts) + i - 1;
+ bzero((char *)partp, sizeof (struct pc98_partition));
+ }
+}
OpenPOWER on IntegriCloud