| /* |
| * 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 |
| */ |