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

TOMOYO Linux Cross Reference
Linux/arch/x86/include/asm/segment.h

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ 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.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/x86/include/asm/segment.h (Architecture m68k) and /arch/sparc/include/asm-sparc/segment.h (Architecture sparc)


  1 /* SPDX-License-Identifier: GPL-2.0 */              1 
  2 #ifndef _ASM_X86_SEGMENT_H                        
  3 #define _ASM_X86_SEGMENT_H                        
  4                                                   
  5 #include <linux/const.h>                          
  6 #include <asm/alternative.h>                      
  7 #include <asm/ibt.h>                              
  8                                                   
  9 /*                                                
 10  * Constructor for a conventional segment GDT     
 11  * This is a macro so it can be used in initia    
 12  */                                               
 13 #define GDT_ENTRY(flags, base, limit)             
 14         ((((base)  & _AC(0xff000000,ULL)) << (    
 15          (((flags) & _AC(0x0000f0ff,ULL)) << 4    
 16          (((limit) & _AC(0x000f0000,ULL)) << (    
 17          (((base)  & _AC(0x00ffffff,ULL)) << 1    
 18          (((limit) & _AC(0x0000ffff,ULL))))       
 19                                                   
 20 /* Simple and small GDT entries for booting on    
 21                                                   
 22 #define GDT_ENTRY_BOOT_CS       2                 
 23 #define GDT_ENTRY_BOOT_DS       3                 
 24 #define GDT_ENTRY_BOOT_TSS      4                 
 25 #define __BOOT_CS               (GDT_ENTRY_BOO    
 26 #define __BOOT_DS               (GDT_ENTRY_BOO    
 27 #define __BOOT_TSS              (GDT_ENTRY_BOO    
 28                                                   
 29 /*                                                
 30  * Bottom two bits of selector give the ring      
 31  * privilege level                                
 32  */                                               
 33 #define SEGMENT_RPL_MASK        0x3               
 34                                                   
 35 /*                                                
 36  * When running on Xen PV, the actual privileg    
 37  * not 0. Testing the Requested Privilege Leve    
 38  * determine whether the context is user mode     
 39  * SEGMENT_RPL_MASK is wrong because the PV ke    
 40  * matches the 0x3 mask.                          
 41  *                                                
 42  * Testing with USER_SEGMENT_RPL_MASK is valid    
 43  * kernels because privilege level 2 is never     
 44  */                                               
 45 #define USER_SEGMENT_RPL_MASK   0x2               
 46                                                   
 47 /* User mode is privilege level 3: */             
 48 #define USER_RPL                0x3               
 49                                                   
 50 /* Bit 2 is Table Indicator (TI): selects betw    
 51 #define SEGMENT_TI_MASK         0x4               
 52 /* LDT segment has TI set ... */                  
 53 #define SEGMENT_LDT             0x4               
 54 /* ... GDT has it cleared */                      
 55 #define SEGMENT_GDT             0x0               
 56                                                   
 57 #define GDT_ENTRY_INVALID_SEG   0                 
 58                                                   
 59 #if defined(CONFIG_X86_32) && !defined(BUILD_V    
 60 /*                                                
 61  * The layout of the per-CPU GDT under Linux:     
 62  *                                                
 63  *   0 - null                                     
 64  *   1 - reserved                                 
 65  *   2 - reserved                                 
 66  *   3 - reserved                                 
 67  *                                                
 68  *   4 - unused                                   
 69  *   5 - unused                                   
 70  *                                                
 71  *  ------- start of TLS (Thread-Local Storage    
 72  *                                                
 73  *   6 - TLS segment #1                 [ glib    
 74  *   7 - TLS segment #2                 [ Wine    
 75  *   8 - TLS segment #3                           
 76  *   9 - reserved                                 
 77  *  10 - reserved                                 
 78  *  11 - reserved                                 
 79  *                                                
 80  *  ------- start of kernel segments:             
 81  *                                                
 82  *  12 - kernel code segment                      
 83  *  13 - kernel data segment                      
 84  *  14 - default user CS                          
 85  *  15 - default user DS                          
 86  *  16 - TSS                                      
 87  *  17 - LDT                                      
 88  *  18 - PNPBIOS support (16->32 gate)            
 89  *  19 - PNPBIOS support                          
 90  *  20 - PNPBIOS support                          
 91  *  21 - PNPBIOS support                          
 92  *  22 - PNPBIOS support                          
 93  *  23 - APM BIOS support                         
 94  *  24 - APM BIOS support                         
 95  *  25 - APM BIOS support                         
 96  *                                                
 97  *  26 - ESPFIX small SS                          
 98  *  27 - per-cpu                        [ offs    
 99  *  28 - VDSO getcpu                              
100  *  29 - unused                                   
101  *  30 - unused                                   
102  *  31 - TSS for double fault handler             
103  */                                               
104 #define GDT_ENTRY_TLS_MIN               6         
105 #define GDT_ENTRY_TLS_MAX               (GDT_E    
106                                                   
107 #define GDT_ENTRY_KERNEL_CS             12        
108 #define GDT_ENTRY_KERNEL_DS             13        
109 #define GDT_ENTRY_DEFAULT_USER_CS       14        
110 #define GDT_ENTRY_DEFAULT_USER_DS       15        
111 #define GDT_ENTRY_TSS                   16        
112 #define GDT_ENTRY_LDT                   17        
113 #define GDT_ENTRY_PNPBIOS_CS32          18        
114 #define GDT_ENTRY_PNPBIOS_CS16          19        
115 #define GDT_ENTRY_PNPBIOS_DS            20        
116 #define GDT_ENTRY_PNPBIOS_TS1           21        
117 #define GDT_ENTRY_PNPBIOS_TS2           22        
118 #define GDT_ENTRY_APMBIOS_BASE          23        
119                                                   
120 #define GDT_ENTRY_ESPFIX_SS             26        
121 #define GDT_ENTRY_PERCPU                27        
122 #define GDT_ENTRY_CPUNODE               28        
123                                                   
124 #define GDT_ENTRY_DOUBLEFAULT_TSS       31        
125                                                   
126 /*                                                
127  * Number of entries in the GDT table:            
128  */                                               
129 #define GDT_ENTRIES                     32        
130                                                   
131 /*                                                
132  * Segment selector values corresponding to th    
133  */                                               
134                                                   
135 #define __KERNEL_CS                     (GDT_E    
136 #define __KERNEL_DS                     (GDT_E    
137 #define __USER_DS                       (GDT_E    
138 #define __USER_CS                       (GDT_E    
139 #define __USER32_CS                     __USER    
140 #define __ESPFIX_SS                     (GDT_E    
141                                                   
142 /* segment for calling fn: */                     
143 #define PNP_CS32                        (GDT_E    
144 /* code segment for BIOS: */                      
145 #define PNP_CS16                        (GDT_E    
146                                                   
147 /* "Is this PNP code selector (PNP_CS32 or PNP    
148 #define SEGMENT_IS_PNP_CODE(x)          (((x)     
149                                                   
150 /* data segment for BIOS: */                      
151 #define PNP_DS                          (GDT_E    
152 /* transfer data segment: */                      
153 #define PNP_TS1                         (GDT_E    
154 /* another data segment: */                       
155 #define PNP_TS2                         (GDT_E    
156                                                   
157 #ifdef CONFIG_SMP                                 
158 # define __KERNEL_PERCPU                (GDT_E    
159 #else                                             
160 # define __KERNEL_PERCPU                0         
161 #endif                                            
162                                                   
163 #define __CPUNODE_SEG                   (GDT_E    
164                                                   
165 #else /* 64-bit: */                               
166                                                   
167 #include <asm/cache.h>                            
168                                                   
169 #define GDT_ENTRY_KERNEL32_CS           1         
170 #define GDT_ENTRY_KERNEL_CS             2         
171 #define GDT_ENTRY_KERNEL_DS             3         
172                                                   
173 /*                                                
174  * We cannot use the same code segment descrip    
175  * not even in long flat mode, because of diff    
176  *                                                
177  * GDT layout to get 64-bit SYSCALL/SYSRET sup    
178  * selectors:                                     
179  *                                                
180  *   if returning to 32-bit userspace: cs = ST    
181  *   if returning to 64-bit userspace: cs = ST    
182  *                                                
183  * ss = STAR.SYSRET_CS+8 (in either case)         
184  *                                                
185  * thus USER_DS should be between 32-bit and 6    
186  */                                               
187 #define GDT_ENTRY_DEFAULT_USER32_CS     4         
188 #define GDT_ENTRY_DEFAULT_USER_DS       5         
189 #define GDT_ENTRY_DEFAULT_USER_CS       6         
190                                                   
191 /* Needs two entries */                           
192 #define GDT_ENTRY_TSS                   8         
193 /* Needs two entries */                           
194 #define GDT_ENTRY_LDT                   10        
195                                                   
196 #define GDT_ENTRY_TLS_MIN               12        
197 #define GDT_ENTRY_TLS_MAX               14        
198                                                   
199 #define GDT_ENTRY_CPUNODE               15        
200                                                   
201 /*                                                
202  * Number of entries in the GDT table:            
203  */                                               
204 #define GDT_ENTRIES                     16        
205                                                   
206 /*                                                
207  * Segment selector values corresponding to th    
208  *                                                
209  * Note, selectors also need to have a correct    
210  * expressed with the +3 value for user-space     
211  */                                               
212 #define __KERNEL32_CS                   (GDT_E    
213 #define __KERNEL_CS                     (GDT_E    
214 #define __KERNEL_DS                     (GDT_E    
215 #define __USER32_CS                     (GDT_E    
216 #define __USER_DS                       (GDT_E    
217 #define __USER_CS                       (GDT_E    
218 #define __CPUNODE_SEG                   (GDT_E    
219                                                   
220 #endif                                            
221                                                   
222 #define IDT_ENTRIES                     256       
223 #define NUM_EXCEPTION_VECTORS           32        
224                                                   
225 /* Bitmask of exception vectors which push an     
226 #define EXCEPTION_ERRCODE_MASK          0x2002    
227                                                   
228 #define GDT_SIZE                        (GDT_E    
229 #define GDT_ENTRY_TLS_ENTRIES           3         
230 #define TLS_SIZE                        (GDT_E    
231                                                   
232 /* Bit size and mask of CPU number stored in t    
233 #define VDSO_CPUNODE_BITS               12        
234 #define VDSO_CPUNODE_MASK               0xfff     
235                                                   
236 #ifndef __ASSEMBLY__                              
237                                                   
238 /* Helper functions to store/load CPU and node    
239                                                   
240 static inline unsigned long vdso_encode_cpunod    
241 {                                                 
242         return (node << VDSO_CPUNODE_BITS) | c    
243 }                                                 
244                                                   
245 static inline void vdso_read_cpunode(unsigned     
246 {                                                 
247         unsigned int p;                           
248                                                   
249         /*                                        
250          * Load CPU and node number from the G    
251          * and works on all CPUs.  This is vol    
252          * correctly with respect to barrier()    
253          * hoisting it out of the calling func    
254          *                                        
255          * If RDPID is available, use it.         
256          */                                       
257         alternative_io ("lsl %[seg],%[p]",        
258                         ".byte 0xf3,0x0f,0xc7,    
259                         X86_FEATURE_RDPID,        
260                         [p] "=a" (p), [seg] "r    
261                                                   
262         if (cpu)                                  
263                 *cpu = (p & VDSO_CPUNODE_MASK)    
264         if (node)                                 
265                 *node = (p >> VDSO_CPUNODE_BIT    
266 }                                                 
267                                                   
268 #endif /* !__ASSEMBLY__ */                        
269                                                   
270 #ifdef __KERNEL__                                 
271                                                   
272 /*                                                
273  * early_idt_handler_array is an array of entr    
274  * early IDT.  For simplicity, it's a real arr    
275  * every nine bytes.  That leaves room for an     
276  * vector has no error code (two bytes), a 'pu    
277  * bytes), and a jump to the common entry code    
278  */                                               
279 #define EARLY_IDT_HANDLER_SIZE (9 + ENDBR_INSN    
280                                                   
281 /*                                                
282  * xen_early_idt_handler_array is for Xen pv g    
283  * early_idt_handler_array it contains a prequ    
284  * pop %rcx; pop %r11; jmp early_idt_handler_a    
285  * max 8 bytes.                                   
286  */                                               
287 #define XEN_EARLY_IDT_HANDLER_SIZE (8 + ENDBR_    
288                                                   
289 #ifndef __ASSEMBLY__                              
290                                                   
291 extern const char early_idt_handler_array[NUM_    
292 extern void early_ignore_irq(void);               
293                                                   
294 #ifdef CONFIG_XEN_PV                              
295 extern const char xen_early_idt_handler_array[    
296 #endif                                            
297                                                   
298 /*                                                
299  * Load a segment. Fall back on loading the ze    
300  * wrong.  This variant assumes that loading z    
301  * This is always the case on Intel CPUs and,     
302  * failure to fully clear the cached descripto    
303  * FS and GS.                                     
304  */                                               
305 #define __loadsegment_simple(seg, value)          
306 do {                                              
307         unsigned short __val = (value);           
308                                                   
309         asm volatile("                            
310                      "1:        movl %k0,%%" #    
311                      _ASM_EXTABLE_TYPE_REG(1b,    
312                      : "+r" (__val) : : "memor    
313 } while (0)                                       
314                                                   
315 #define __loadsegment_ss(value) __loadsegment_    
316 #define __loadsegment_ds(value) __loadsegment_    
317 #define __loadsegment_es(value) __loadsegment_    
318                                                   
319 #ifdef CONFIG_X86_32                              
320                                                   
321 /*                                                
322  * On 32-bit systems, the hidden parts of FS a    
323  * the selector is NULL, so there's no funny b    
324  */                                               
325 #define __loadsegment_fs(value) __loadsegment_    
326 #define __loadsegment_gs(value) __loadsegment_    
327                                                   
328 #else                                             
329                                                   
330 static inline void __loadsegment_fs(unsigned s    
331 {                                                 
332         asm volatile("                            
333                      "1:        movw %0, %%fs     
334                      "2:                          
335                                                   
336                      _ASM_EXTABLE_TYPE(1b, 2b,    
337                                                   
338                      : : "rm" (value) : "memor    
339 }                                                 
340                                                   
341 /* __loadsegment_gs is intentionally undefined    
342                                                   
343 #endif                                            
344                                                   
345 #define loadsegment(seg, value) __loadsegment_    
346                                                   
347 /*                                                
348  * Save a segment register away:                  
349  */                                               
350 #define savesegment(seg, value)                   
351         asm("mov %%" #seg ",%0":"=r" (value) :    
352                                                   
353 #endif /* !__ASSEMBLY__ */                        
354 #endif /* __KERNEL__ */                           
355                                                   
356 #endif /* _ASM_X86_SEGMENT_H */                   
357                                                   

~ [ 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