xref: /inferno-os/libnandfs/local.h (revision 28942ead413418b56c5be78e8c4c400881fba72e)
1 typedef struct NandfsBlockData NandfsBlockData;
2 typedef struct NandfsAuxiliary NandfsAuxiliary;
3 
4 struct NandfsBlockData {
5 	ulong path;
6 	short tag;
7 	ulong nerase;
8 	int partial;
9 };
10 
11 struct Nandfs {
12 	LogfsLowLevel ll;
13 	char *(*read)(void*, void*, long, ulong);
14 	char *(*write)(void*, void*, long, ulong);
15 	char *(*erase)(void*, long blockaddr);
16 	char *(*sync)(void*);
17 	void *magic;
18 	long rawblocksize;
19 	long baseblock;
20 	long limitblock;
21 	NandfsBlockData *blockdata;
22 	int trace;
23 	int worseblocks;
24 	int printbad;
25 };
26 
27 struct NandfsAuxiliary {
28 	uchar parth[4];		// ggpppppp pppppppp pppppppp pp1hhhhh (bigendian) self-protected
29 	uchar tag;			// self-protecting
30 	uchar blockstatus;	// self-protecting
31 	uchar nerasemagicmsw[2];	// see nerasemagiclsw
32 	uchar ecc2[3];		// self-protecting
33 	uchar nerasemagiclsw[2];	// mmmmmm mmeeeeee eeeeeeeeee ee1hhhhh (bigendian) self-protected
34 	uchar ecc1[3];		// self-protecting
35 };
36 
37 #define getbig2(p) (((p)[0] << 8) | (p)[1])
38 #define getbig4(p) (((p)[0] << 24) | ((p)[1] << 16) | ((p)[2] << 8) | (p)[3])
39 #define getlittle3(p) (((p)[2] << 16) | ((p)[1] << 8) | (p)[0])
40 #define putlittle3(p, q) ((p)[0] = (q), (p)[1] = (q) >> 8, (p)[2] = (q) >> 16)
41 #define putbig2(p, q) ((p)[0] = (q) >> 8, (p)[1] = (q))
42 #define putbig4(p, q) ((p)[0] = (q) >> 24, (p)[1] = (q) >> 16, (p)[2] = (q) >> 8, (p)[3] = (q))
43 
44 LogfsLowLevelReadResult _nandfscorrectauxiliary(NandfsAuxiliary*);
45 
46 extern uchar _nandfsvalidtags[];
47 extern int _nandfsvalidtagscount;
48 
49 ulong _nandfshamming31_26calc(ulong in);
50 int _nandfshamming31_26correct(ulong *in);
51 
52 void _nandfsextracttags(NandfsAuxiliary*, NandfsTags*);
53 
54 extern char Enomem[], Eperm[], Eio[];
55