xref: /plan9-contrib/sys/src/9/pcboot/dosfs.h (revision 25210b069a6ed8c047fa67220cf1dff32812f121)
1*25210b06SDavid du Colombier typedef struct Dosboot	Dosboot;
2*25210b06SDavid du Colombier typedef struct Dos	Dos;
3*25210b06SDavid du Colombier typedef struct Dosdir	Dosdir;
4*25210b06SDavid du Colombier typedef struct Dosfile	Dosfile;
5*25210b06SDavid du Colombier typedef struct Dospart	Dospart;
6*25210b06SDavid du Colombier typedef struct File File;
7*25210b06SDavid du Colombier typedef struct Bootfs Bootfs;
8*25210b06SDavid du Colombier 
9*25210b06SDavid du Colombier int fsread(File *file, void *a, long n);
10*25210b06SDavid du Colombier int fsboot(Bootfs *fs, char *path, Boot *b);
11*25210b06SDavid du Colombier int fswalk(Bootfs *fs, char *path, File *f);
12*25210b06SDavid du Colombier 
13*25210b06SDavid du Colombier struct Dospart
14*25210b06SDavid du Colombier {
15*25210b06SDavid du Colombier 	uchar flag;		/* active flag */
16*25210b06SDavid du Colombier 	uchar shead;		/* starting head */
17*25210b06SDavid du Colombier 	uchar scs[2];		/* starting cylinder/sector */
18*25210b06SDavid du Colombier 	uchar type;		/* partition type */
19*25210b06SDavid du Colombier 	uchar ehead;		/* ending head */
20*25210b06SDavid du Colombier 	uchar ecs[2];		/* ending cylinder/sector */
21*25210b06SDavid du Colombier 	uchar start[4];		/* starting sector */
22*25210b06SDavid du Colombier 	uchar len[4];		/* length in sectors */
23*25210b06SDavid du Colombier };
24*25210b06SDavid du Colombier 
25*25210b06SDavid du Colombier #define FAT12	0x01
26*25210b06SDavid du Colombier #define FAT16	0x04
27*25210b06SDavid du Colombier #define EXTEND	0x05
28*25210b06SDavid du Colombier #define FATHUGE	0x06
29*25210b06SDavid du Colombier #define FAT32	0x0b
30*25210b06SDavid du Colombier #define FAT32X	0x0c
31*25210b06SDavid du Colombier #define EXTHUGE	0x0f
32*25210b06SDavid du Colombier #define DMDDO	0x54
33*25210b06SDavid du Colombier #define PLAN9	0x39
34*25210b06SDavid du Colombier #define LEXTEND 0x85
35*25210b06SDavid du Colombier 
36*25210b06SDavid du Colombier struct Dosfile{
37*25210b06SDavid du Colombier 	Dos	*dos;		/* owning dos file system */
38*25210b06SDavid du Colombier 	char	name[8];
39*25210b06SDavid du Colombier 	char	ext[3];
40*25210b06SDavid du Colombier 	uchar	attr;
41*25210b06SDavid du Colombier 	long	length;
42*25210b06SDavid du Colombier 	long	pstart;		/* physical start cluster address */
43*25210b06SDavid du Colombier 	long	pcurrent;	/* physical current cluster address */
44*25210b06SDavid du Colombier 	long	lcurrent;	/* logical current cluster address */
45*25210b06SDavid du Colombier 	long	offset;
46*25210b06SDavid du Colombier };
47*25210b06SDavid du Colombier 
48*25210b06SDavid du Colombier struct Dos{
49*25210b06SDavid du Colombier 	long	start;		/* start of file system */
50*25210b06SDavid du Colombier 	int	sectsize;	/* in bytes */
51*25210b06SDavid du Colombier 	int	clustsize;	/* in sectors */
52*25210b06SDavid du Colombier 	int	clustbytes;	/* in bytes */
53*25210b06SDavid du Colombier 	int	nresrv;		/* sectors */
54*25210b06SDavid du Colombier 	int	nfats;		/* usually 2 */
55*25210b06SDavid du Colombier 	int	rootsize;	/* number of entries */
56*25210b06SDavid du Colombier 	int	volsize;	/* in sectors */
57*25210b06SDavid du Colombier 	int	mediadesc;
58*25210b06SDavid du Colombier 	int	fatsize;	/* in sectors */
59*25210b06SDavid du Colombier 	int	fatclusters;
60*25210b06SDavid du Colombier 	int	fatbits;	/* 12 or 16 */
61*25210b06SDavid du Colombier 	long	fataddr;	/* sector number */
62*25210b06SDavid du Colombier 	long	rootaddr;
63*25210b06SDavid du Colombier 	long	rootclust;
64*25210b06SDavid du Colombier 	long	dataaddr;
65*25210b06SDavid du Colombier 	long	freeptr;
66*25210b06SDavid du Colombier };
67*25210b06SDavid du Colombier 
68*25210b06SDavid du Colombier typedef struct Dosboot Dosboot;
69*25210b06SDavid du Colombier typedef struct Dosdir Dosdir;
70*25210b06SDavid du Colombier 
71*25210b06SDavid du Colombier struct Dosboot{
72*25210b06SDavid du Colombier 	uchar	magic[3];
73*25210b06SDavid du Colombier 	uchar	version[8];
74*25210b06SDavid du Colombier 	uchar	sectsize[2];
75*25210b06SDavid du Colombier 	uchar	clustsize;
76*25210b06SDavid du Colombier 	uchar	nresrv[2];
77*25210b06SDavid du Colombier 	uchar	nfats;
78*25210b06SDavid du Colombier 	uchar	rootsize[2];
79*25210b06SDavid du Colombier 	uchar	volsize[2];
80*25210b06SDavid du Colombier 	uchar	mediadesc;
81*25210b06SDavid du Colombier 	uchar	fatsize[2];
82*25210b06SDavid du Colombier 	uchar	trksize[2];
83*25210b06SDavid du Colombier 	uchar	nheads[2];
84*25210b06SDavid du Colombier 	uchar	nhidden[4];
85*25210b06SDavid du Colombier 	uchar	bigvolsize[4];
86*25210b06SDavid du Colombier /* fat 32 */
87*25210b06SDavid du Colombier 	uchar	bigfatsize[4];
88*25210b06SDavid du Colombier 	uchar	extflags[2];
89*25210b06SDavid du Colombier 	uchar	fsversion[2];
90*25210b06SDavid du Colombier 	uchar	rootdirstartclust[4];
91*25210b06SDavid du Colombier 	uchar	fsinfosect[2];
92*25210b06SDavid du Colombier 	uchar	backupbootsect[2];
93*25210b06SDavid du Colombier /* ???
94*25210b06SDavid du Colombier 	uchar	driveno;
95*25210b06SDavid du Colombier 	uchar	reserved0;
96*25210b06SDavid du Colombier 	uchar	bootsig;
97*25210b06SDavid du Colombier 	uchar	volid[4];
98*25210b06SDavid du Colombier 	uchar	label[11];
99*25210b06SDavid du Colombier 	uchar	reserved1[8];
100*25210b06SDavid du Colombier */
101*25210b06SDavid du Colombier };
102*25210b06SDavid du Colombier 
103*25210b06SDavid du Colombier struct Dosdir{
104*25210b06SDavid du Colombier 	uchar	name[8];
105*25210b06SDavid du Colombier 	uchar	ext[3];
106*25210b06SDavid du Colombier 	uchar	attr;
107*25210b06SDavid du Colombier 	uchar	lowercase;
108*25210b06SDavid du Colombier 	uchar	hundredth;
109*25210b06SDavid du Colombier 	uchar	ctime[2];
110*25210b06SDavid du Colombier 	uchar	cdate[2];
111*25210b06SDavid du Colombier 	uchar	adate[2];
112*25210b06SDavid du Colombier 	uchar	highstart[2];
113*25210b06SDavid du Colombier 	uchar	mtime[2];
114*25210b06SDavid du Colombier 	uchar	mdate[2];
115*25210b06SDavid du Colombier 	uchar	start[2];
116*25210b06SDavid du Colombier 	uchar	length[4];
117*25210b06SDavid du Colombier };
118*25210b06SDavid du Colombier 
119*25210b06SDavid du Colombier #define	DOSRONLY	0x01
120*25210b06SDavid du Colombier #define	DOSHIDDEN	0x02
121*25210b06SDavid du Colombier #define	DOSSYSTEM	0x04
122*25210b06SDavid du Colombier #define	DOSVLABEL	0x08
123*25210b06SDavid du Colombier #define	DOSDIR	0x10
124*25210b06SDavid du Colombier #define	DOSARCH	0x20
125*25210b06SDavid du Colombier 
126*25210b06SDavid du Colombier // #pragma incomplete Bootfs
127*25210b06SDavid du Colombier 
128*25210b06SDavid du Colombier struct File{
129*25210b06SDavid du Colombier 	union{
130*25210b06SDavid du Colombier 		Dosfile	dos;
131*25210b06SDavid du Colombier 		int walked;
132*25210b06SDavid du Colombier 	};
133*25210b06SDavid du Colombier 	Bootfs	*fs;
134*25210b06SDavid du Colombier 	char	*path;
135*25210b06SDavid du Colombier };
136*25210b06SDavid du Colombier 
137*25210b06SDavid du Colombier struct Bootfs{
138*25210b06SDavid du Colombier 	union {
139*25210b06SDavid du Colombier 		Dos dos;
140*25210b06SDavid du Colombier 	};
141*25210b06SDavid du Colombier 	Chan	*devch;
142*25210b06SDavid du Colombier 	char	*disk;
143*25210b06SDavid du Colombier 
144*25210b06SDavid du Colombier 	/* for *bios.c */
145*25210b06SDavid du Colombier 	int	dev;				/* device id */
146*25210b06SDavid du Colombier 	long	(*diskread)(Bootfs*, void*, long);	/* disk read routine */
147*25210b06SDavid du Colombier 	vlong	(*diskseek)(Bootfs*, vlong);	/* disk seek routine */
148*25210b06SDavid du Colombier 
149*25210b06SDavid du Colombier 	long	(*read)(File*, void*, long);
150*25210b06SDavid du Colombier 	int	(*walk)(File*, char*);
151*25210b06SDavid du Colombier 	File	root;
152*25210b06SDavid du Colombier };
153*25210b06SDavid du Colombier 
154*25210b06SDavid du Colombier extern int	dosinit(Bootfs*, char *);
155*25210b06SDavid du Colombier 
156*25210b06SDavid du Colombier #define BADPTR(x) ((ulong)(x) < 0x80000000)
157