1 /* wim.h: Defines the layout of the "Window Invalid Register" on 2 Version 8 of the Sparc Architecture. 3 4 Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu) 5 */ 6 7 #ifndef __LINUX_SPARC_WIM_H 8 #define __LINUX_SPARC_WIM_H 9 10 #ifdef __LINUX_SPARC_V8 /* register doesn't exist on the V9 */ 11 12 /* The Window Invalid Register %wim, holds a set of which register 13 windows are 'valid' at this point in time. 14 15 ------------------------------------------------------------ 16 |W31|W30|W29|W28|W27|W26|W25|W24|W23|....|W5|W4|W3|W2|W1|W0| 17 ------------------------------------------------------------ 18 19 Each register window on the chip gets one bit. If the bit is 20 set then the window is currently 'invalid' and hardware will 21 trap if that window is entered via a 'save', 'restore', or 22 'rett' instruction. Privileged software is responsible for 23 updating this on trap fills/spills etc. Therefore if a 'save' 24 instruction is executed and it causes the Current Window 25 Pointer to equal a register window which has it's bit set in 26 %wim we get a 'overflow' trap, a restore into such a register 27 invokes a window 'spill' trap. 28 */ 29 30 #define __LINUX_SPARC_HAS_WIM 31 32 /* Macro to fine the %wim bit mask for the current window pointer */ 33 #define CWP_TO_WIM_MASK(cwp) (1<<(cwp)) 34 35 /* Assembly version of above macro, 'cwp' and 'wimask' must be registers */ 36 #define ASM_CWP_TO_WIM_MASK(cwp,wimask) \ 37 or %g0, 0x1, wimask \ 38 sll wimask, cwp, wimask 39 40 /* Assembly macro to find if the given window is set to invalid in the %wim. 41 Again 'window', 'result', and 'scratch' must be in registers. This leaves 42 a non-zero value in result if the window is indeed invalid. This routine 43 works because we keep exactly one window invalid at all times to maximize 44 register utilization, which means both kernel and user windows can be in 45 the register file at the same time in certain trap situations. 46 */ 47 #define ASM_REG_WIN_INVAL(window,result,scratch) \ 48 rd %wim, result \ 49 or %g0, 0x1, scratch \ 50 sll scratch, window, scratch \ 51 and scratch, result, result 52 53 #endif /* !(__LINUX_SPARC_V8) */ 54 55 #endif /* !(__LINUX_SPARC_WIM_H) */ 56