1/* 2 * Copyright (c) 2011 Aeroflex Gaisler 3 * 4 * BSD license: 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 25 26#include <asm-leon/leon.h> 27#include <asm-leon/leonstack.h> 28#include <asm-leon/asmmacro.h> 29 30 .seg "text" 31 32 33/* Number of register windows */ 34 .global _nwindows_min1, _nwindows 35 36 ! Window overflow trap handler on save. 37 ! Touches %g1 38 /* ------- */ 39 .weak _window_overflow 40 .set _window_overflow,__window_overflow 41 .weak _window_overflow_svt 42 .set _window_overflow_svt,__window_overflow_svt 43 /* ------- */ 44 !.global _window_overflow,_window_overflow_svt 45 .global __window_overflow_rettseq,__window_overflow_rettseq_ret,__window_overflow_slow1 46 47__window_overflow_svt: 48__window_overflow: 49#ifndef _FLAT 50__window_overflow_rettseq: 51 mov %wim, %l3 ! Calculate next WIM 52 mov %g1, %l7 53 srl %l3, 1, %g1 54__window_overflow_rettseq_ret: 55 sethi %hi(_nwindows_min1), %l4 ! NWINDOWS-1 56 ld [%l4+%lo(_nwindows_min1)], %l4 57 58 sll %l3, %l4 , %l4 59 or %l4, %g1, %g1 60 61 save ! Get into window to be saved. 62 mov %g1, %wim 63 nop; nop; nop 64 std %l0, [%sp + 0]; 65 std %l2, [%sp + 8]; 66 std %l4, [%sp + 16]; 67 std %l6, [%sp + 24]; 68 std %i0, [%sp + 32]; 69 std %i2, [%sp + 40]; 70 std %i4, [%sp + 48]; 71 std %i6, [%sp + 56]; 72 restore ! Go back to trap window. 73 mov %l7, %g1 74 75 jmp %l1 ! Re-execute save. 76 rett %l2 77 nop 78 79__window_overflow_slow1: ! space for possible stackcheck patch 80 nop 81 nop 82#else 83 ta 0 ! halt 84__window_overflow_rettseq: 85__window_overflow_rettseq_ret: 86__window_overflow_slow1: 87 nop 88 nop 89 nop 90#endif 91 92 /* Window underflow trap handler on restore. */ 93 94 ! Touches %g1 95 /* ------- */ 96 .weak _window_underflow 97 .set _window_underflow,__window_underflow 98 .weak _window_underflow_svt 99 .set _window_underflow_svt,__window_underflow_svt 100 /* ------- */ 101 !.global _window_underflow,_window_underflow_svt 102 103__window_underflow_svt: 104__window_underflow: 105#ifndef _FLAT 106 mov %wim, %l3 ! Calculate next WIM 107 sll %l3, 1, %l4 108 109 sethi %hi(_nwindows_min1), %l5 ! NWINDOWS-1 110 ld [%l5+%lo(_nwindows_min1)], %l5 111 112 srl %l3, %l5, %l5 113 or %l5, %l4, %l5 114 mov %l5, %wim 115 nop; nop; nop 116 restore ! Two restores to get into the 117 restore ! window to restore 118 ldd [%sp + 0], %l0; ! Restore window from the stack 119 ldd [%sp + 8], %l2; 120 ldd [%sp + 16], %l4; 121 ldd [%sp + 24], %l6; 122 ldd [%sp + 32], %i0; 123 ldd [%sp + 40], %i2; 124 ldd [%sp + 48], %i4; 125 ldd [%sp + 56], %i6; 126 save ! Get back to the trap window. 127 save 128 jmp %l1 ! Re-execute restore. 129 rett %l2 130#else 131 ta 0 ! halt 132#endif 133 134 135