maptlb.s 2.74 KB
/**************************************************************************
 *									  *
 *		 Copyright (C) 1994, Silicon Graphics, Inc.		  *
 *									  *
 *  These coded instructions, statements, and computer programs  contain  *
 *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
 *  are protected by Federal copyright law.  They  may  not be disclosed  *
 *  to  third  parties  or copied or duplicated in any form, in whole or  *
 *  in part, without the prior written consent of Silicon Graphics, Inc.  *
 *									  *
 **************************************************************************/

#include <asm.h>
#include <regdef.h>
#include <R4300.h>
#include <ultraerror.h>

/*
 * void osMapTLB(int index, OSPageMask pm, void *vaddr,
 *		 u32 evenpaddr,	u32 oddpaddr, s32 asid);
 */
LEAF(osMapTLB)
#ifdef _DEBUG
	.set	reorder
	bgez	a0,1f			# check if index >= 0
	b	2f
1:
	li	t0,NTLBENTRIES		# check if index < NTLBENTRIES
	blt	a0,t0,3f
2:
	move	a2,a0			# invoke error handler if not
	li	a0,ERR_OSMAPTLB_INDEX
	li	a1,1
	j	__osError
3:
	lw	t0,20(sp)		# get asid argument
	li	t1,-1
	bge	t0,t1,4f		# check if asid >= -1
	b	5f
4:
	li	t1,TLBHI_NPID		# check if asid <= TLBHI_NPID
	ble	t0,t1,6f
5:
	move	a2,t0			# invoke error handler if not
	li	a0,ERR_OSMAPTLB_ASID
	li	a1,1
	j	__osError
6:
#endif	/* _DEBUG */
	.set	noreorder
	mfc0	t0,C0_ENTRYHI		# save TLBPID
	mtc0	a0,C0_INX		# set index
	mtc0	a1,C0_PAGEMASK		# set page mask
	lw	t1,20(sp)		# get asid argument
	beq	t1,-1,7f		# is asid == -1?
	li	t4,TLBLO_G		# BDELAY: set invalid entrylo bits 
	li	t2,TLBLO_NONCOHRNT|TLBLO_D|TLBLO_V # set non-global entrylo bits
	b	8f			# go to set entryhi
	or	a2,t1			# BDELAY: create final entryhi
7:	
	li	t2,TLBLO_NONCOHRNT|TLBLO_D|TLBLO_V|TLBLO_G # set global bits
8:
	mtc0	a2,C0_ENTRYHI		# set virtual address
	beq	a3,-1,9f		# is evenpaddr == -1?
	nop
	srl	t3,a3,12-TLBLO_PFNSHIFT # line up physical page frame number
	or	t3,t2			# or in flag bits
	mtc0	t3,C0_ENTRYLO0		# set even physical address & flags
	b	10f
	nop
9:
	mtc0	t4,C0_ENTRYLO0		# invalidate even page mapping
10:
	lw	t3,16(sp)		# get oddpaddr argument
	beq	t3,-1,11f		# is oddpaddr == -1?
	nop
	srl	t3,6			# line up physical page frame number
	or	t3,t2			# or in flag bits
	mtc0	t3,C0_ENTRYLO1		# set odd physical address & flags
	b	12f
	nop
11:
	mtc0	t4,C0_ENTRYLO1		# invalidate odd page mapping
	bne	a3,-1,12f		# are *both* paddrs -1?
	nop				# if so ...
	li	t3,K0BASE		# set virtual address to unmapped
	mtc0	t3,C0_ENTRYHI		#  (necessary on R4300)
12:
	nop                             # 7-5-1 = 1 nop for fall through,
					# jump case already taken care of
	tlbwi            		# set tlb entry
	nop				# 8-3-1 = 4 nop
	nop				
	nop
	nop

	mtc0	t0,C0_ENTRYHI		# restore saved TLBPID
	j	ra
	nop
END(osMapTLB)