xref: /csrg-svn/sys/tahoe/stand/machdep.c (revision 25869)
1*25869Ssam /*	machdep.c	1.1	86/01/12	*/
2*25869Ssam 
3*25869Ssam #include "../tahoe/mem.h"
4*25869Ssam #include "../tahoe/mtpr.h"
5*25869Ssam #include "../tahoe/SYS.h"
6*25869Ssam 
7*25869Ssam 	.set	_scb, 0x0	# mask for total disable
8*25869Ssam 	.set	HIGH, 0x1f	# mask for total disable
9*25869Ssam 	.set	BERVEC, 0x80	# offset into scb of the bus error vector
10*25869Ssam 	.set	RESTVEC, 0x8	# offset into scb of the restart vector
11*25869Ssam 
12*25869Ssam ENTRY(mtpr, 0)
13*25869Ssam 	mtpr	8(fp),4(fp)
14*25869Ssam 	ret
15*25869Ssam 
16*25869Ssam ENTRY(mfpr, 0)
17*25869Ssam 	mfpr	4(fp),r0
18*25869Ssam 	ret
19*25869Ssam 
20*25869Ssam ENTRY(bcopy, R2|R1|R0)
21*25869Ssam 	movl	4(fp),r0
22*25869Ssam 	movl	8(fp),r1
23*25869Ssam 	movl	12(fp),r2
24*25869Ssam 	movblk
25*25869Ssam 	ret
26*25869Ssam 
27*25869Ssam /*
28*25869Ssam  * badaddr(addr, len)
29*25869Ssam  *	see if access addr with a len type instruction causes a machine check
30*25869Ssam  *	len is length of access (1=byte, 2=short, 4=long)
31*25869Ssam  *	r0 = 0 means good(exists); r0 =1 means does not exist.
32*25869Ssam  */
33*25869Ssam ENTRY(badaddr, R5|R4|R3|R2|R1)
34*25869Ssam 	mfpr	$IPL,r1
35*25869Ssam 	mtpr	$HIGH,$IPL
36*25869Ssam 	mfpr	$SCBB,r5
37*25869Ssam 	mtpr	$0,$SCBB
38*25869Ssam 	movl	*$BERVEC,r2
39*25869Ssam 	movl	4(fp),r3
40*25869Ssam 	movl	8(fp),r4
41*25869Ssam 	movab	9f,*$BERVEC
42*25869Ssam 	bbc	$0,r4,1f; tstb	(r3)
43*25869Ssam 1:	bbc	$1,r4,1f; tstw	(r3)
44*25869Ssam 1:	bbc	$2,r4,1f; tstl	(r3)
45*25869Ssam 1:	clrl	r0			# made it w/o machine checks
46*25869Ssam 2:	movl	r2,*$BERVEC
47*25869Ssam 	mtpr	r1,$IPL
48*25869Ssam 	mtpr	r5,$SCBB
49*25869Ssam 	ret
50*25869Ssam 
51*25869Ssam 	.align	2
52*25869Ssam 9:			# Here we catch buss error (if it comes)
53*25869Ssam 	andl3	4(sp),$ERRCD,r0
54*25869Ssam 	cmpl	r0,$APE
55*25869Ssam 	jneq	1f
56*25869Ssam 	halt			# Address parity error !!!
57*25869Ssam 1:	cmpl	r0,$VBE
58*25869Ssam 	jneq	1f
59*25869Ssam 	halt			# Versabus error
60*25869Ssam 1:
61*25869Ssam 	movl	$1,r0		# Anything else = bad address
62*25869Ssam 	movab	8(sp),sp	# discard buss error trash
63*25869Ssam 	movab	2b,(sp)		# new program counter on stack.
64*25869Ssam 	rei
65*25869Ssam 
66*25869Ssam ENTRY(movow, 0)
67*25869Ssam 	movow	10(fp),*4(fp)
68*25869Ssam 	ret
69*25869Ssam 
70*25869Ssam ENTRY(movob, 0)
71*25869Ssam 	movob	9(fp),*4(fp)
72*25869Ssam 	ret
73