blob: 7d84daf1340b52dbf6160d66e3341b2e12d8a59f [file] [log] [blame]
/*
* tbiroot.S
*
* Copyright (C) 2001, 2002, 2012 Imagination Technologies.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2 as published by the
* Free Software Foundation.
*
* Module that creates and via ___TBI function returns a TBI Root Block for
* interrupt and background processing on the current thread.
*/
.file "tbiroot.S"
#include <asm/metag_regs.h>
/*
* Get data structures and defines from the TBI C header
*/
#include <asm/tbx.h>
/* If signals need to be exchanged we must create a TBI Root Block */
.data
.balign 8
.global ___pTBIs
.type ___pTBIs,object
___pTBIs:
.long 0 /* Bgnd+Int root block ptrs */
.long 0
.size ___pTBIs,.-___pTBIs
/*
* Return ___pTBIs value specific to execution level with promotion/demotion
*
* Register Usage: D1Ar1 is Id, D0Re0 is the primary result
* D1Re0 is secondary result (___pTBIs for other exec level)
*/
.text
.balign 4
.global ___TBI
.type ___TBI,function
___TBI:
TSTT D1Ar1,#HI(TBID_ISTAT_BIT) /* Bgnd or Int level? */
MOVT A1LbP,#HI(___pTBIs)
ADD A1LbP,A1LbP,#LO(___pTBIs)
GETL D0Re0,D1Re0,[A1LbP] /* Base of root block table */
SWAPNZ D0Re0,D1Re0 /* Swap if asked */
MOV PC,D1RtP
.size ___TBI,.-___TBI
/*
* Return identifier of the current thread in TBI segment or signal format with
* secondary mask to indicate privilege and interrupt level of thread
*/
.text
.balign 4
.global ___TBIThrdPrivId
.type ___TBIThrdPrivId,function
___TBIThrdPrivId:
.global ___TBIThreadId
.type ___TBIThreadId,function
___TBIThreadId:
#ifndef METAC_0_1
MOV D1Re0,TXSTATUS /* Are we privileged or int? */
MOV D0Re0,TXENABLE /* Which thread are we? */
/* Disable privilege adaption for now */
ANDT D1Re0,D1Re0,#HI(TXSTATUS_ISTAT_BIT) /* +TXSTATUS_PSTAT_BIT) */
LSL D1Re0,D1Re0,#TBID_ISTAT_S-TXSTATUS_ISTAT_S
AND D0Re0,D0Re0,#TXENABLE_THREAD_BITS
LSL D0Re0,D0Re0,#TBID_THREAD_S-TXENABLE_THREAD_S
#else
/* Thread 0 only */
XOR D0Re0,D0Re0,D0Re0
XOR D1Re0,D1Re0,D1Re0
#endif
MOV PC,D1RtP /* Return */
.size ___TBIThrdPrivId,.-___TBIThrdPrivId
.size ___TBIThreadId,.-___TBIThreadId
/*
* End of tbiroot.S
*/