xref: /inferno-os/os/boot/mpc/squeeze.h (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth 
2*74a4d8c2SCharles.Forsyth /*
3*74a4d8c2SCharles.Forsyth  * squeezed file format:
4*74a4d8c2SCharles.Forsyth  *	Sqhdr
5*74a4d8c2SCharles.Forsyth  *	original Exec header
6*74a4d8c2SCharles.Forsyth  *	two Squeeze tables
7*74a4d8c2SCharles.Forsyth  *	squeezed segment
8*74a4d8c2SCharles.Forsyth  *	unsqueezed segment, if any
9*74a4d8c2SCharles.Forsyth  */
10*74a4d8c2SCharles.Forsyth #define	SQMAGIC	(ulong)0xFEEF0F1E
11*74a4d8c2SCharles.Forsyth 
12*74a4d8c2SCharles.Forsyth typedef struct Sqhdr Sqhdr;
13*74a4d8c2SCharles.Forsyth struct Sqhdr {
14*74a4d8c2SCharles.Forsyth 	uchar	magic[4];	/* SQMAGIC */
15*74a4d8c2SCharles.Forsyth 	uchar	text[4];	/* squeezed length of text (excluding tables) */
16*74a4d8c2SCharles.Forsyth 	uchar	data[4];	/* squeezed length of data (excluding tables) */
17*74a4d8c2SCharles.Forsyth 	uchar	asis[4];	/* length of unsqueezed segment */
18*74a4d8c2SCharles.Forsyth 	uchar	toptxt[4];	/* value for 0 encoding in text */
19*74a4d8c2SCharles.Forsyth 	uchar	topdat[4];	/* value for 0 encoding in data */
20*74a4d8c2SCharles.Forsyth 	uchar	sum[4];	/* simple checksum of unsqueezed data */
21*74a4d8c2SCharles.Forsyth 	uchar	flags[4];
22*74a4d8c2SCharles.Forsyth };
23*74a4d8c2SCharles.Forsyth #define	SQHDRLEN	(8*4)
24*74a4d8c2SCharles.Forsyth 
25*74a4d8c2SCharles.Forsyth /*
26*74a4d8c2SCharles.Forsyth  * certain power instruction types are rearranged by sqz
27*74a4d8c2SCharles.Forsyth  * so as to move the variable part of the instruction word to the
28*74a4d8c2SCharles.Forsyth  * low order bits.  note that the mapping is its own inverse.
29*74a4d8c2SCharles.Forsyth  */
30*74a4d8c2SCharles.Forsyth #define	QREMAP(X)\
31*74a4d8c2SCharles.Forsyth 	switch((X)>>26){\
32*74a4d8c2SCharles.Forsyth 	case 19: case 31: case 59: case 63:\
33*74a4d8c2SCharles.Forsyth 		(X) = (((X) & 0xFC00F801) | (((X)>>15)&0x7FE) | (((X)&0x7FE)<<15));\
34*74a4d8c2SCharles.Forsyth 	}
35