Initial import from FreeBSD RELENG_4:
[dragonfly.git] / lib / libdisk / change.c
1 /*
2  * ----------------------------------------------------------------------------
3  * "THE BEER-WARE LICENSE" (Revision 42):
4  * <phk@login.dknet.dk> wrote this file.  As long as you retain this notice you
5  * can do whatever you want with this stuff. If we meet some day, and you think
6  * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7  * ----------------------------------------------------------------------------
8  *
9  * $FreeBSD: src/lib/libdisk/change.c,v 1.14.2.5 2002/10/24 13:03:44 nyan Exp $
10  *
11  */
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <unistd.h>
16 #include <fcntl.h>
17 #include <string.h>
18 #include <sys/types.h>
19 #include "libdisk.h"
20
21 void
22 Set_Bios_Geom(struct disk *disk, u_long cyl, u_long hd, u_long sect)
23 {
24         disk->bios_cyl = cyl;
25         disk->bios_hd = hd;
26         disk->bios_sect = sect;
27 }
28
29 void
30 Sanitize_Bios_Geom(struct disk *disk)
31 {
32         int sane;
33
34         sane = 1;
35
36 #ifdef PC98
37         if (disk->bios_cyl >= 65536)
38 #else
39         if (disk->bios_cyl > 1024)
40 #endif
41                 sane = 0;
42         if (disk->bios_hd > 16)
43                 sane = 0;
44 #ifdef PC98
45         if (disk->bios_sect >= 256)
46 #else
47         if (disk->bios_sect > 63)
48 #endif
49                 sane = 0;
50         if (disk->bios_cyl*disk->bios_hd*disk->bios_sect != disk->chunks->size)
51                 sane = 0;
52         if (sane)
53                 return;
54
55         /* First try something that IDE can handle */
56         disk->bios_sect = 63;
57         disk->bios_hd = 16;
58         disk->bios_cyl = disk->chunks->size / (disk->bios_sect*disk->bios_hd);
59
60 #ifdef PC98
61         if (disk->bios_cyl < 65536)
62 #else
63         if (disk->bios_cyl < 1024)
64 #endif
65                 return;
66
67         /* Hmm, try harder... */
68 #ifdef PC98
69         /* Assume standard SCSI parameter */
70         disk->bios_sect = 128;
71         disk->bios_hd = 8;
72 #else
73         disk->bios_hd = 255;
74 #endif
75         disk->bios_cyl = disk->chunks->size / (disk->bios_sect*disk->bios_hd);
76
77         return;
78 }
79
80 void
81 All_FreeBSD(struct disk *d, int force_all)
82 {
83         struct chunk *c;
84
85     again:
86         for (c = d->chunks->part; c; c = c->next)
87                 if (c->type != unused) {
88                         Delete_Chunk(d, c);
89                         goto again;
90                 }
91         c = d->chunks;
92         if (force_all) {
93                 Sanitize_Bios_Geom(d);
94 #ifdef PC98
95                 Create_Chunk(d, c->offset, c->size, freebsd, 0x494,
96                     CHUNK_FORCE_ALL, "FreeBSD");
97 #else
98                 Create_Chunk(d, c->offset, c->size, freebsd, 0xa5,
99                     CHUNK_FORCE_ALL);
100 #endif
101         } else {
102 #ifdef PC98
103                 Create_Chunk(d, c->offset, c->size, freebsd, 0x494, 0,
104                     "FreeBSD");
105 #else
106                 Create_Chunk(d, c->offset, c->size, freebsd, 0xa5, 0);
107 #endif
108         }
109 }