~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/alpha/lib/fpreg.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 /*
  3  * arch/alpha/lib/fpreg.c
  4  *
  5  * (C) Copyright 1998 Linus Torvalds
  6  */
  7 
  8 #include <linux/compiler.h>
  9 #include <linux/export.h>
 10 #include <linux/preempt.h>
 11 #include <asm/fpu.h>
 12 #include <asm/thread_info.h>
 13 #include <asm/fpu.h>
 14 
 15 #if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
 16 #define STT(reg,val)  asm volatile ("ftoit $f"#reg",%0" : "=r"(val));
 17 #else
 18 #define STT(reg,val)  asm volatile ("stt $f"#reg",%0" : "=m"(val));
 19 #endif
 20 
 21 unsigned long
 22 alpha_read_fp_reg (unsigned long reg)
 23 {
 24         unsigned long val;
 25 
 26         if (unlikely(reg >= 32))
 27                 return 0;
 28         preempt_disable();
 29         if (current_thread_info()->status & TS_SAVED_FP)
 30                 val = current_thread_info()->fp[reg];
 31         else switch (reg) {
 32               case  0: STT( 0, val); break;
 33               case  1: STT( 1, val); break;
 34               case  2: STT( 2, val); break;
 35               case  3: STT( 3, val); break;
 36               case  4: STT( 4, val); break;
 37               case  5: STT( 5, val); break;
 38               case  6: STT( 6, val); break;
 39               case  7: STT( 7, val); break;
 40               case  8: STT( 8, val); break;
 41               case  9: STT( 9, val); break;
 42               case 10: STT(10, val); break;
 43               case 11: STT(11, val); break;
 44               case 12: STT(12, val); break;
 45               case 13: STT(13, val); break;
 46               case 14: STT(14, val); break;
 47               case 15: STT(15, val); break;
 48               case 16: STT(16, val); break;
 49               case 17: STT(17, val); break;
 50               case 18: STT(18, val); break;
 51               case 19: STT(19, val); break;
 52               case 20: STT(20, val); break;
 53               case 21: STT(21, val); break;
 54               case 22: STT(22, val); break;
 55               case 23: STT(23, val); break;
 56               case 24: STT(24, val); break;
 57               case 25: STT(25, val); break;
 58               case 26: STT(26, val); break;
 59               case 27: STT(27, val); break;
 60               case 28: STT(28, val); break;
 61               case 29: STT(29, val); break;
 62               case 30: STT(30, val); break;
 63               case 31: STT(31, val); break;
 64         }
 65         preempt_enable();
 66         return val;
 67 }
 68 EXPORT_SYMBOL(alpha_read_fp_reg);
 69 
 70 #if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
 71 #define LDT(reg,val)  asm volatile ("itoft %0,$f"#reg : : "r"(val));
 72 #else
 73 #define LDT(reg,val)  asm volatile ("ldt $f"#reg",%0" : : "m"(val));
 74 #endif
 75 
 76 void
 77 alpha_write_fp_reg (unsigned long reg, unsigned long val)
 78 {
 79         if (unlikely(reg >= 32))
 80                 return;
 81 
 82         preempt_disable();
 83         if (current_thread_info()->status & TS_SAVED_FP) {
 84                 current_thread_info()->status |= TS_RESTORE_FP;
 85                 current_thread_info()->fp[reg] = val;
 86         } else switch (reg) {
 87               case  0: LDT( 0, val); break;
 88               case  1: LDT( 1, val); break;
 89               case  2: LDT( 2, val); break;
 90               case  3: LDT( 3, val); break;
 91               case  4: LDT( 4, val); break;
 92               case  5: LDT( 5, val); break;
 93               case  6: LDT( 6, val); break;
 94               case  7: LDT( 7, val); break;
 95               case  8: LDT( 8, val); break;
 96               case  9: LDT( 9, val); break;
 97               case 10: LDT(10, val); break;
 98               case 11: LDT(11, val); break;
 99               case 12: LDT(12, val); break;
100               case 13: LDT(13, val); break;
101               case 14: LDT(14, val); break;
102               case 15: LDT(15, val); break;
103               case 16: LDT(16, val); break;
104               case 17: LDT(17, val); break;
105               case 18: LDT(18, val); break;
106               case 19: LDT(19, val); break;
107               case 20: LDT(20, val); break;
108               case 21: LDT(21, val); break;
109               case 22: LDT(22, val); break;
110               case 23: LDT(23, val); break;
111               case 24: LDT(24, val); break;
112               case 25: LDT(25, val); break;
113               case 26: LDT(26, val); break;
114               case 27: LDT(27, val); break;
115               case 28: LDT(28, val); break;
116               case 29: LDT(29, val); break;
117               case 30: LDT(30, val); break;
118               case 31: LDT(31, val); break;
119         }
120         preempt_enable();
121 }
122 EXPORT_SYMBOL(alpha_write_fp_reg);
123 
124 #if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
125 #define STS(reg,val)  asm volatile ("ftois $f"#reg",%0" : "=r"(val));
126 #else
127 #define STS(reg,val)  asm volatile ("sts $f"#reg",%0" : "=m"(val));
128 #endif
129 
130 unsigned long
131 alpha_read_fp_reg_s (unsigned long reg)
132 {
133         unsigned long val;
134 
135         if (unlikely(reg >= 32))
136                 return 0;
137 
138         preempt_disable();
139         if (current_thread_info()->status & TS_SAVED_FP) {
140                 LDT(0, current_thread_info()->fp[reg]);
141                 STS(0, val);
142         } else switch (reg) {
143               case  0: STS( 0, val); break;
144               case  1: STS( 1, val); break;
145               case  2: STS( 2, val); break;
146               case  3: STS( 3, val); break;
147               case  4: STS( 4, val); break;
148               case  5: STS( 5, val); break;
149               case  6: STS( 6, val); break;
150               case  7: STS( 7, val); break;
151               case  8: STS( 8, val); break;
152               case  9: STS( 9, val); break;
153               case 10: STS(10, val); break;
154               case 11: STS(11, val); break;
155               case 12: STS(12, val); break;
156               case 13: STS(13, val); break;
157               case 14: STS(14, val); break;
158               case 15: STS(15, val); break;
159               case 16: STS(16, val); break;
160               case 17: STS(17, val); break;
161               case 18: STS(18, val); break;
162               case 19: STS(19, val); break;
163               case 20: STS(20, val); break;
164               case 21: STS(21, val); break;
165               case 22: STS(22, val); break;
166               case 23: STS(23, val); break;
167               case 24: STS(24, val); break;
168               case 25: STS(25, val); break;
169               case 26: STS(26, val); break;
170               case 27: STS(27, val); break;
171               case 28: STS(28, val); break;
172               case 29: STS(29, val); break;
173               case 30: STS(30, val); break;
174               case 31: STS(31, val); break;
175         }
176         preempt_enable();
177         return val;
178 }
179 EXPORT_SYMBOL(alpha_read_fp_reg_s);
180 
181 #if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
182 #define LDS(reg,val)  asm volatile ("itofs %0,$f"#reg : : "r"(val));
183 #else
184 #define LDS(reg,val)  asm volatile ("lds $f"#reg",%0" : : "m"(val));
185 #endif
186 
187 void
188 alpha_write_fp_reg_s (unsigned long reg, unsigned long val)
189 {
190         if (unlikely(reg >= 32))
191                 return;
192 
193         preempt_disable();
194         if (current_thread_info()->status & TS_SAVED_FP) {
195                 current_thread_info()->status |= TS_RESTORE_FP;
196                 LDS(0, val);
197                 STT(0, current_thread_info()->fp[reg]);
198         } else switch (reg) {
199               case  0: LDS( 0, val); break;
200               case  1: LDS( 1, val); break;
201               case  2: LDS( 2, val); break;
202               case  3: LDS( 3, val); break;
203               case  4: LDS( 4, val); break;
204               case  5: LDS( 5, val); break;
205               case  6: LDS( 6, val); break;
206               case  7: LDS( 7, val); break;
207               case  8: LDS( 8, val); break;
208               case  9: LDS( 9, val); break;
209               case 10: LDS(10, val); break;
210               case 11: LDS(11, val); break;
211               case 12: LDS(12, val); break;
212               case 13: LDS(13, val); break;
213               case 14: LDS(14, val); break;
214               case 15: LDS(15, val); break;
215               case 16: LDS(16, val); break;
216               case 17: LDS(17, val); break;
217               case 18: LDS(18, val); break;
218               case 19: LDS(19, val); break;
219               case 20: LDS(20, val); break;
220               case 21: LDS(21, val); break;
221               case 22: LDS(22, val); break;
222               case 23: LDS(23, val); break;
223               case 24: LDS(24, val); break;
224               case 25: LDS(25, val); break;
225               case 26: LDS(26, val); break;
226               case 27: LDS(27, val); break;
227               case 28: LDS(28, val); break;
228               case 29: LDS(29, val); break;
229               case 30: LDS(30, val); break;
230               case 31: LDS(31, val); break;
231         }
232         preempt_enable();
233 }
234 EXPORT_SYMBOL(alpha_write_fp_reg_s);
235 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php