xref: /plan9/sys/src/9/teg2/notes/byte-order (revision 3de6a9c0b3d5cf34fc4090d0bf1930d83799a7fd)
1*3de6a9c0SDavid du Colombierstatic void
2*3de6a9c0SDavid du Colombierforcele(void)
3*3de6a9c0SDavid du Colombier{
4*3de6a9c0SDavid du Colombier#ifdef BIGENDCHECK
5*3de6a9c0SDavid du Colombier	union {
6*3de6a9c0SDavid du Colombier		ulong 	ul;
7*3de6a9c0SDavid du Colombier		uchar	uc[sizeof(ulong)];
8*3de6a9c0SDavid du Colombier	} u;
9*3de6a9c0SDavid du Colombier
10*3de6a9c0SDavid du Colombier	u.ul = 0;
11*3de6a9c0SDavid du Colombier	coherence();
12*3de6a9c0SDavid du Colombier	u.uc[0] = 1;
13*3de6a9c0SDavid du Colombier	coherence();
14*3de6a9c0SDavid du Colombier	if (u.ul == 1)
15*3de6a9c0SDavid du Colombier		return;
16*3de6a9c0SDavid du Colombier
17*3de6a9c0SDavid du Colombier	emerge('?');
18*3de6a9c0SDavid du Colombier	emerge('e');
19*3de6a9c0SDavid du Colombier	if ((u.ul & MASK(8)) == 0) {
20*3de6a9c0SDavid du Colombier		emerge('B');
21*3de6a9c0SDavid du Colombier		panic("rdbaseticks: cpu%d is big-endian", m->machno);
22*3de6a9c0SDavid du Colombier	} else {
23*3de6a9c0SDavid du Colombier		emerge('W');
24*3de6a9c0SDavid du Colombier		panic("rdbaseticks: cpu%d is whacked-endian", m->machno);
25*3de6a9c0SDavid du Colombier	}
26*3de6a9c0SDavid du Colombier#endif
27*3de6a9c0SDavid du Colombier}
28*3de6a9c0SDavid du Colombier
29*3de6a9c0SDavid du Colombiervoid
30*3de6a9c0SDavid du Colombierckbigendian(char *state)
31*3de6a9c0SDavid du Colombier{
32*3de6a9c0SDavid du Colombier	int wrong;
33*3de6a9c0SDavid du Colombier
34*3de6a9c0SDavid du Colombier	wrong = 0;
35*3de6a9c0SDavid du Colombier	if (getpsr() & PsrBigend) {
36*3de6a9c0SDavid du Colombier		setendlittle();
37*3de6a9c0SDavid du Colombier		wrong++;
38*3de6a9c0SDavid du Colombier		wave('?');
39*3de6a9c0SDavid du Colombier		wave('e');
40*3de6a9c0SDavid du Colombier		wave('p');
41*3de6a9c0SDavid du Colombier		if (state == nil)
42*3de6a9c0SDavid du Colombier			state = "running";
43*3de6a9c0SDavid du Colombier		iprint("cpu%d: %s in big-endian mode\n", m->machno, state);
44*3de6a9c0SDavid du Colombier	}
45*3de6a9c0SDavid du Colombier	if (controlget() & CpCee) {
46*3de6a9c0SDavid du Colombier		wrong++;
47*3de6a9c0SDavid du Colombier		wave('?');
48*3de6a9c0SDavid du Colombier		wave('e');
49*3de6a9c0SDavid du Colombier		wave('e');
50*3de6a9c0SDavid du Colombier		if (state == nil)
51*3de6a9c0SDavid du Colombier			state = "running";
52*3de6a9c0SDavid du Colombier		iprint("cpu%d: %s with big-endian exceptions\n", m->machno, state);
53*3de6a9c0SDavid du Colombier	}
54*3de6a9c0SDavid du Colombier	if (wrong) {
55*3de6a9c0SDavid du Colombier		dumpstack();
56*3de6a9c0SDavid du Colombier		delay(3000);
57*3de6a9c0SDavid du Colombier		panic("cpu%d: big-endian", m->machno);
58*3de6a9c0SDavid du Colombier	}
59*3de6a9c0SDavid du Colombier}
60