Xinu7/src/serve11/sys/panic.s

Compare this file to the similar file:
Show the results in this format:

/* panic.s - panic, panic0, _panic */

DISABLE	=	340			/ PS to	disable	interrupts
ENABLE	=	000			/ PS to	enable interrupts

	.globl	panic, panic0, _panic, kernstk
/*------------------------------------------------------------------------
/*  panic0 -- entry point for "branch to zero" error; never called
/*------------------------------------------------------------------------
panic0:
	mfps	kernstk-2		/ save old ps for message
	mtps	$DISABLE		/ disable interrupts
	mov	sp,kernstk		/ save old sp for message
	mov	$kernstk-2,sp		/ use kernel stack for printing
	mov	$panmsg1,-(sp)		/ push address of message
	jsr	pc,_kprintf		/ print	message
	halt
	jmp	start			/ restart system if user continues

/*------------------------------------------------------------------------
/*  _panic  --  entry point when called by user programs
/*------------------------------------------------------------------------
_panic:					/ Note: "_panic" pushes the
					/ PC/PS to simulate a trap so it
					/ can flow into "panic" (the
					/ trap entry point, below)
	mfps	pansav			/ save old PS
	mtps	$DISABLE		/ disable interrupts
	mov	2(sp),pmsguser		/ address of users message
	mov	(sp),-(sp)		/ push ret. address and	user's
	mov	pansav,2(sp)		/  PS for trap simulation
	mtps	$DISABLE+8		/ put "user trap" code in PS

/*------------------------------------------------------------------------
/*  panic  -- entry point for traps and exceptions only; not called
/*------------------------------------------------------------------------
panic:
	mfps	pansav			/ save trap type code from ps
	mov	2(sp),kernstk		/ push on kernel stack:	old ps
	mov	(sp),kernstk-2		/	old pc
	mov	sp,kernstk-4		/	old sp (from before trap)
	add	$4,kernstk-4
	mov	$kernstk-4,sp
	mov	r5,-(sp)		/	old r5
	mov	r4,-(sp)		/	old r4
	mov	r3,-(sp)		/	old r3
	mov	r2,-(sp)		/	old r2
	mov	r1,-(sp)		/	old r1
	mov	r0,-(sp)		/	old r0
	jsr	pc,sizmem		/ size up memory (needed later)

/ set up call to kprintf to print register and stack dump

	mov	kernstk,-(sp)		/ user's ps
	mov	kernstk-2,-(sp)		/ user's pc
	mov	pansav,-(sp)		/ address of panic message
	bic	$177760,(sp)		/  (mask off type&use as index
	mov	(sp),-(sp)		/ panic	trap type
	asl	2(sp)			/ compute message address from type
	add	$pmsglist,2(sp)
	mov	*2(sp),2(sp)		/ go through vector to message
	mov	$panmsg2,-(sp)		/ push format address
	jsr	pc,_kprintf		/ print	message
	add	$10.,sp			/ pop off args to printf, leaving
					/   saved regs,	even though printed

/ dump stack as long as sp was valid

	mov	kernstk-4,r3		/ r3 = addr. user's stack before trap
	sub	$2,sp			/ save space for arg to	printf
	mov	$panmsg3,-(sp)		/ format arg for printf
	mov	$6,r4			/ count	of stack items to print
panloop:
	cmp	r3,_maxaddr		/ avoid	references beyond valid
	bhi	pandone			/  memory addresses
	mov	(r3),2(sp)		/ insert value to print	as arg.
	jsr	pc,_kprintf		/ print	one value
	dec	r4			/ decrement counter of # to print
	ble	pandone			/ stop if enough have been printed
	add	$2,r3			/ otherwise, move along	the stack
	jbr	panloop

/ clean	up and restore the state so user can continue after halt

pandone:
	add	$4,sp			/ pop off the printf args
	mov	(sp)+,r0		/ restore registers
	mov	(sp)+,r1
	mov	(sp)+,r2
	mov	(sp)+,r3
	mov	(sp)+,r4
	mov	(sp)+,r5
	mov	(sp)+,sp		/ restore user's stack pointer
	halt				/ user probably	won't continue
	mov	kernstk,-(sp)		/ but we should	restore	PS and PC
	mov	kernstk-2,-(sp)		/ in case of ODT "P" command,
	rtt				/ especially for call to _panic
	.data
pansav:
.	=	.+2^.			/ word for saving state	info.
panmsg1:
	.byte	12,12,'P,'a,'n,'i,'c,':,' ,'b,'r,'a,'n,'c,'h,' ,'t,'o
	.byte	' ,'l,'o,'c,'.,' ,'0,',,' ,'p,'s,'=,'%,'o,' ,'s,'p,'=,'%
	.byte	'o,12,12,0
panmsg2:
	.byte	12,12,'P,'a,'n,'i,'c,':,' ,'t,'r,'a,'p,' ,'t,'y,'p,'e
	.byte	' ,'%,'d,' ,'(,'%,'s,'),12
	.byte	'S,'t,'a,'t,'e,':,' ,'p,'c,'=,'%,'o,' ,'p,'s,'=,'%,'o
	.byte	' ,'r,'0,'=,'%,'o
	.byte	' ,'r,'1,'=,'%,'o
	.byte	' ,'r,'2,'=,'%,'o
	.byte	' ,'r,'3,'=,'%,'o
	.byte	' ,'r,'4,'=,'%,'o
	.byte	' ,'r,'5,'=,'%,'o,12
	.byte	'S,'t,'a,'c,'k,':,' ,'(,'t,'o,'p,' ,'a,'t,' ,'%,'o,'),12,0
panmsg3:
	.byte	'%,'o,12,0
	.even
pmsglist:
	pmsg0
	pmsg1
	pmsg2
	pmsg3
	pmsg4
	pmsg5
	pmsg6
	pmsg7
pmsguser:
	pmsg0				/ Gets overwritten on panic call
pmsg0:
	.byte	'B,'u,'s,' ,'e,'r,'r,'o,'r,0
pmsg1:
	.byte	'I,'l,'l,'e,'g,'a,'l,' ,'i,'n,'s,'t,'r,'u,'c,'t,'i,'o,'n,0
pmsg2:
	.byte	'B,'P,'T,' ,'o,'r,' ,'T,'-,'b,'i,'t,0
pmsg3:
	.byte	'I,'O,'T,0
pmsg4:
	.byte	'P,'o,'w,'e,'r,' ,'f,'a,'i,'l,0
pmsg5:
	.byte	'E,'M,'T,0
pmsg6:
	.byte	'T,'r,'a,'p,' ,'i,'n,'s,'t,'r,'u,'c,'t,'i,'o,'n,0
pmsg7:
	.byte	'U,'n,'k,'n,'o,'w,'n,' ,'d,'e,'v,'i,'c,'e,0

/* Stack used by kernel at startup and to handle panic messages.	*/

	.even
.	=	.+300.			/ decimal bytes	in kernel stack
kernstk:
.	=	.+2			/ Otherwise kernstk overlaps
					/ next symbol