xref: /netbsd-src/sys/arch/i386/stand/lib/bootinfo_biosgeom.c (revision 27578b9aac214cc7796ead81dcc5427e79d5f2a0)
1 /*	$NetBSD: bootinfo_biosgeom.c,v 1.9 2001/07/07 22:57:57 perry Exp $	*/
2 
3 /*
4  * Copyright (c) 1997
5  *	Matthias Drochner.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *	This product includes software developed for the NetBSD Project
18  *	by Matthias Drochner.
19  * 4. The name of the author may not be used to endorse or promote products
20  *    derived from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  */
34 
35 #include <sys/types.h>
36 #include <machine/disklabel.h>
37 #include <machine/cpu.h>
38 
39 #include <lib/libkern/libkern.h>
40 #include <lib/libsa/stand.h>
41 
42 #include "libi386.h"
43 #include "biosdisk_ll.h"
44 #include "bootinfo.h"
45 
46 void bi_getbiosgeom()
47 {
48 	struct btinfo_biosgeom *bibg;
49 	int i, j, nvalid;
50 	unsigned char nhd;
51 	unsigned int cksum;
52 
53 	pvbcopy((void *)(0x400 + 0x75), &nhd, 1);
54 #ifdef GEOM_DEBUG
55 	printf("nhd %d\n", (int)nhd);
56 #endif
57 
58 	bibg = alloc(sizeof(struct btinfo_biosgeom)
59 		     + (nhd - 1) * sizeof(struct bi_biosgeom_entry));
60 	if (!bibg)
61 		return;
62 
63 	for (i = nvalid = 0; i < MAX_BIOSDISKS && nvalid < (int)nhd; i++) {
64 		struct biosdisk_ll d;
65 		struct biosdisk_ext13info ed;
66 		char buf[BIOSDISK_SECSIZE];
67 
68 		d.dev = 0x80 + i;
69 
70 		if (set_geometry(&d, &ed))
71 			continue;
72 		memset(&bibg->disk[nvalid], 0, sizeof(bibg->disk[nvalid]));
73 
74 		bibg->disk[nvalid].sec = d.sec;
75 		bibg->disk[nvalid].head = d.head;
76 		bibg->disk[nvalid].cyl = d.cyl;
77 		bibg->disk[nvalid].dev = d.dev;
78 
79 		if (readsects(&d, 0, 1, buf, 0)) {
80 			bibg->disk[nvalid].flags |= BI_GEOM_INVALID;
81 			nvalid++;
82 			continue;
83 		}
84 
85 #ifdef GEOM_DEBUG
86 		printf("#%d: %x: C %d H %d S %d\n", nvalid,
87 		    d.dev, d.cyl, d.head, d.sec);
88 #endif
89 
90 		if (d.flags & BIOSDISK_EXT13) {
91 			if (ed.flags & EXT13_GEOM_VALID)
92 				bibg->disk[nvalid].totsec = ed.totsec;
93 			else
94 				bibg->disk[nvalid].totsec = 0;
95 			bibg->disk[nvalid].flags |= BI_GEOM_EXTINT13;
96 		}
97 		for (j = 0, cksum = 0; j < BIOSDISK_SECSIZE; j++)
98 			cksum += buf[j];
99 		bibg->disk[nvalid].cksum = cksum;
100 		memcpy(bibg->disk[nvalid].dosparts, &buf[MBR_PARTOFF],
101 		      sizeof(bibg->disk[nvalid].dosparts));
102 		nvalid++;
103 	}
104 
105 	bibg->num = nvalid;
106 
107 	BI_ADD(bibg, BTINFO_BIOSGEOM, sizeof(struct btinfo_biosgeom)
108 	       + nvalid * sizeof(struct bi_biosgeom_entry));
109 }
110