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

TOMOYO Linux Cross Reference
Linux/arch/x86/kernel/head_32.S

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/kernel/head_32.S (Architecture mips) and /arch/alpha/kernel/head_32.S (Architecture alpha)


  1 /* SPDX-License-Identifier: GPL-2.0 */            
  2 /*                                                
  3  *                                                
  4  *  Copyright (C) 1991, 1992  Linus Torvalds      
  5  *                                                
  6  *  Enhanced CPU detection and feature setting    
  7  *  and Martin Mares, November 1997.              
  8  */                                               
  9                                                   
 10 .text                                             
 11 #include <linux/export.h>                         
 12 #include <linux/threads.h>                        
 13 #include <linux/init.h>                           
 14 #include <linux/linkage.h>                        
 15 #include <asm/segment.h>                          
 16 #include <asm/page_types.h>                       
 17 #include <asm/pgtable_types.h>                    
 18 #include <asm/cache.h>                            
 19 #include <asm/thread_info.h>                      
 20 #include <asm/asm-offsets.h>                      
 21 #include <asm/setup.h>                            
 22 #include <asm/processor-flags.h>                  
 23 #include <asm/msr-index.h>                        
 24 #include <asm/cpufeatures.h>                      
 25 #include <asm/percpu.h>                           
 26 #include <asm/nops.h>                             
 27 #include <asm/nospec-branch.h>                    
 28 #include <asm/bootparam.h>                        
 29 #include <asm/pgtable_32.h>                       
 30                                                   
 31 /* Physical address */                            
 32 #define pa(X) ((X) - __PAGE_OFFSET)               
 33                                                   
 34 /*                                                
 35  * References to members of the new_cpu_data s    
 36  */                                               
 37                                                   
 38 #define X86             new_cpu_data+CPUINFO_x    
 39 #define X86_VENDOR      new_cpu_data+CPUINFO_x    
 40 #define X86_MODEL       new_cpu_data+CPUINFO_x    
 41 #define X86_STEPPING    new_cpu_data+CPUINFO_x    
 42 #define X86_HARD_MATH   new_cpu_data+CPUINFO_h    
 43 #define X86_CPUID       new_cpu_data+CPUINFO_c    
 44 #define X86_CAPABILITY  new_cpu_data+CPUINFO_x    
 45 #define X86_VENDOR_ID   new_cpu_data+CPUINFO_x    
 46                                                   
 47 /*                                                
 48  * Worst-case size of the kernel mapping we ne    
 49  * a relocatable kernel can live anywhere in l    
 50  * to map all of lowmem.                          
 51  */                                               
 52 KERNEL_PAGES = LOWMEM_PAGES                       
 53                                                   
 54 INIT_MAP_SIZE = PAGE_TABLE_SIZE(KERNEL_PAGES)     
 55 RESERVE_BRK(pagetables, INIT_MAP_SIZE)            
 56                                                   
 57 /*                                                
 58  * 32-bit kernel entrypoint; only used by the     
 59  * %esi points to the real-mode code as a 32-b    
 60  * CS and DS must be 4 GB flat segments, but w    
 61  * any particular GDT layout, because we load     
 62  * can.                                           
 63  */                                               
 64 __HEAD                                            
 65 SYM_CODE_START(startup_32)                        
 66         movl pa(initial_stack),%ecx               
 67                                                   
 68 /*                                                
 69  * Set segments to known values.                  
 70  */                                               
 71         lgdt pa(boot_gdt_descr)                   
 72         movl $(__BOOT_DS),%eax                    
 73         movl %eax,%ds                             
 74         movl %eax,%es                             
 75         movl %eax,%fs                             
 76         movl %eax,%gs                             
 77         movl %eax,%ss                             
 78         leal -__PAGE_OFFSET(%ecx),%esp            
 79                                                   
 80 /*                                                
 81  * Clear BSS first so that there are no surpri    
 82  */                                               
 83         cld                                       
 84         xorl %eax,%eax                            
 85         movl $pa(__bss_start),%edi                
 86         movl $pa(__bss_stop),%ecx                 
 87         subl %edi,%ecx                            
 88         shrl $2,%ecx                              
 89         rep ; stosl                               
 90 /*                                                
 91  * Copy bootup parameters out of the way.         
 92  * Note: %esi still has the pointer to the rea    
 93  * With the kexec as boot loader, parameter se    
 94  * kernel image and might not even be addressa    
 95  * (kexec on panic case). Hence copy out the p    
 96  * page tables.                                   
 97  */                                               
 98         movl $pa(boot_params),%edi                
 99         movl $(PARAM_SIZE/4),%ecx                 
100         cld                                       
101         rep                                       
102         movsl                                     
103         movl pa(boot_params) + NEW_CL_POINTER,    
104         andl %esi,%esi                            
105         jz 1f                   # No command l    
106         movl $pa(boot_command_line),%edi          
107         movl $(COMMAND_LINE_SIZE/4),%ecx          
108         rep                                       
109         movsl                                     
110 1:                                                
111                                                   
112 #ifdef CONFIG_OLPC                                
113         /* save OFW's pgdir table for later us    
114         movl %cr3, %eax                           
115         movl %eax, pa(olpc_ofw_pgd)               
116 #endif                                            
117                                                   
118         /* Create early pagetables. */            
119         call  mk_early_pgtbl_32                   
120                                                   
121         /* Do early initialization of the fixm    
122         movl $pa(initial_pg_fixmap)+PDE_IDENT_    
123 #ifdef  CONFIG_X86_PAE                            
124 #define KPMDS (((-__PAGE_OFFSET) >> 30) & 3) /    
125         movl %eax,pa(initial_pg_pmd+0x1000*KPM    
126 #else                                             
127         movl %eax,pa(initial_page_table+0xffc)    
128 #endif                                            
129                                                   
130         jmp .Ldefault_entry                       
131 SYM_CODE_END(startup_32)                          
132                                                   
133 /*                                                
134  * Non-boot CPU entry point; entered from tram    
135  * We can't lgdt here, because lgdt itself use    
136  * we know the trampoline has already loaded t    
137  *                                                
138  * If cpu hotplug is not supported then this c    
139  * which will be freed later                      
140  */                                               
141 SYM_FUNC_START(startup_32_smp)                    
142         cld                                       
143         movl $(__BOOT_DS),%eax                    
144         movl %eax,%ds                             
145         movl %eax,%es                             
146         movl %eax,%fs                             
147         movl %eax,%gs                             
148         movl pa(initial_stack),%ecx               
149         movl %eax,%ss                             
150         leal -__PAGE_OFFSET(%ecx),%esp            
151                                                   
152 .Ldefault_entry:                                  
153         movl $(CR0_STATE & ~X86_CR0_PG),%eax      
154         movl %eax,%cr0                            
155                                                   
156 /*                                                
157  * We want to start out with EFLAGS unambiguou    
158  * bits like NT set. This would confuse the de    
159  * initialize them properly now before switchi    
160  * DF in particular (even though we have clear    
161  * command line) because GCC expects it.          
162  */                                               
163         pushl $0                                  
164         popfl                                     
165                                                   
166 /*                                                
167  * New page tables may be in 4Mbyte page mode     
168  *                                                
169  * NOTE! If we are on a 486 we may have no cr4    
170  * if and only if CPUID exists and has flags o    
171  */                                               
172         movl $-1,pa(X86_CPUID)          # pres    
173         movl $X86_EFLAGS_ID,%ecx                  
174         pushl %ecx                                
175         popfl                           # set     
176         pushfl                                    
177         popl %eax                       # get     
178         testl $X86_EFLAGS_ID,%eax       # did     
179         jz .Lenable_paging              # hw d    
180                                         # whic    
181                                                   
182         xorl %eax,%eax                            
183         cpuid                                     
184         movl %eax,pa(X86_CPUID)         # save    
185                                                   
186         movl $1,%eax                              
187         cpuid                                     
188         andl $~1,%edx                   # Igno    
189         jz .Lenable_paging              # No f    
190                                                   
191         movl pa(mmu_cr4_features),%eax            
192         movl %eax,%cr4                            
193                                                   
194         testb $X86_CR4_PAE, %al         # chec    
195         jz .Lenable_paging                        
196                                                   
197         /* Check if extended functions are imp    
198         movl $0x80000000, %eax                    
199         cpuid                                     
200         /* Value must be in the range 0x800000    
201         subl $0x80000001, %eax                    
202         cmpl $(0x8000ffff-0x80000001), %eax       
203         ja .Lenable_paging                        
204                                                   
205         /* Clear bogus XD_DISABLE bits */         
206         call verify_cpu                           
207                                                   
208         mov $0x80000001, %eax                     
209         cpuid                                     
210         /* Execute Disable bit supported? */      
211         btl $(X86_FEATURE_NX & 31), %edx          
212         jnc .Lenable_paging                       
213                                                   
214         /* Setup EFER (Extended Feature Enable    
215         movl $MSR_EFER, %ecx                      
216         rdmsr                                     
217                                                   
218         btsl $_EFER_NX, %eax                      
219         /* Make changes effective */              
220         wrmsr                                     
221                                                   
222 .Lenable_paging:                                  
223                                                   
224 /*                                                
225  * Enable paging                                  
226  */                                               
227         movl $pa(initial_page_table), %eax        
228         movl %eax,%cr3          /* set the pag    
229         movl $CR0_STATE,%eax                      
230         movl %eax,%cr0          /* ..and set p    
231         ljmp $__BOOT_CS,$1f     /* Clear prefe    
232 1:                                                
233         /* Shift the stack pointer to a virtua    
234         addl $__PAGE_OFFSET, %esp                 
235                                                   
236 /*                                                
237  * Check if it is 486                             
238  */                                               
239         movb $4,X86                     # at l    
240         cmpl $-1,X86_CPUID                        
241         je .Lis486                                
242                                                   
243         /* get vendor info */                     
244         xorl %eax,%eax                  # call    
245         cpuid                                     
246         movl %eax,X86_CPUID             # save    
247         movl %ebx,X86_VENDOR_ID         # lo 4    
248         movl %edx,X86_VENDOR_ID+4       # next    
249         movl %ecx,X86_VENDOR_ID+8       # last    
250                                                   
251         orl %eax,%eax                   # do w    
252         je .Lis486                                
253                                                   
254         movl $1,%eax            # Use the CPUI    
255         cpuid                                     
256         movb %al,%cl            # save reg for    
257         andb $0x0f,%ah          # mask process    
258         movb %ah,X86                              
259         andb $0xf0,%al          # mask model      
260         shrb $4,%al                               
261         movb %al,X86_MODEL                        
262         andb $0x0f,%cl          # mask mask re    
263         movb %cl,X86_STEPPING                     
264         movl %edx,X86_CAPABILITY                  
265                                                   
266 .Lis486:                                          
267         movl $0x50022,%ecx      # set AM, WP,     
268         movl %cr0,%eax                            
269         andl $0x80000011,%eax   # Save PG,PE,E    
270         orl %ecx,%eax                             
271         movl %eax,%cr0                            
272                                                   
273         lgdt early_gdt_descr                      
274         ljmp $(__KERNEL_CS),$1f                   
275 1:      movl $(__KERNEL_DS),%eax        # relo    
276         movl %eax,%ss                   # afte    
277                                                   
278         movl $(__USER_DS),%eax          # DS/E    
279         movl %eax,%ds                             
280         movl %eax,%es                             
281                                                   
282         movl $(__KERNEL_PERCPU), %eax             
283         movl %eax,%fs                   # set     
284                                                   
285         xorl %eax,%eax                            
286         movl %eax,%gs                   # clea    
287                                                   
288         xorl %eax,%eax                  # Clea    
289         lldt %ax                                  
290                                                   
291         call *(initial_code)                      
292 1:      jmp 1b                                    
293 SYM_FUNC_END(startup_32_smp)                      
294                                                   
295 #include "verify_cpu.S"                           
296                                                   
297 __INIT                                            
298 SYM_FUNC_START(early_idt_handler_array)           
299         # 36(%esp) %eflags                        
300         # 32(%esp) %cs                            
301         # 28(%esp) %eip                           
302         # 24(%rsp) error code                     
303         i = 0                                     
304         .rept NUM_EXCEPTION_VECTORS               
305         .if ((EXCEPTION_ERRCODE_MASK >> i) & 1    
306         pushl $0                # Dummy error     
307         .endif                                    
308         pushl $i                # 20(%esp) Vec    
309         jmp early_idt_handler_common              
310         i = i + 1                                 
311         .fill early_idt_handler_array + i*EARL    
312         .endr                                     
313 SYM_FUNC_END(early_idt_handler_array)             
314                                                   
315 SYM_CODE_START_LOCAL(early_idt_handler_common)    
316         /*                                        
317          * The stack is the hardware frame, an    
318          * vector number.                         
319          */                                       
320         cld                                       
321                                                   
322         incl %ss:early_recursion_flag             
323                                                   
324         /* The vector number is in pt_regs->gs    
325                                                   
326         cld                                       
327         pushl   %fs             /* pt_regs->fs    
328         pushl   %es             /* pt_regs->es    
329         pushl   %ds             /* pt_regs->ds    
330         pushl   %eax            /* pt_regs->ax    
331         pushl   %ebp            /* pt_regs->bp    
332         pushl   %edi            /* pt_regs->di    
333         pushl   %esi            /* pt_regs->si    
334         pushl   %edx            /* pt_regs->dx    
335         pushl   %ecx            /* pt_regs->cx    
336         pushl   %ebx            /* pt_regs->bx    
337                                                   
338         /* Fix up DS and ES */                    
339         movl    $(__KERNEL_DS), %ecx              
340         movl    %ecx, %ds                         
341         movl    %ecx, %es                         
342                                                   
343         /* Load the vector number into EDX */     
344         movl    PT_GS(%esp), %edx                 
345                                                   
346         /* Load GS into pt_regs->gs (and maybe    
347         movw    %gs, PT_GS(%esp)                  
348                                                   
349         movl    %esp, %eax      /* args are pt    
350         call    early_fixup_exception             
351                                                   
352         popl    %ebx            /* pt_regs->bx    
353         popl    %ecx            /* pt_regs->cx    
354         popl    %edx            /* pt_regs->dx    
355         popl    %esi            /* pt_regs->si    
356         popl    %edi            /* pt_regs->di    
357         popl    %ebp            /* pt_regs->bp    
358         popl    %eax            /* pt_regs->ax    
359         popl    %ds             /* pt_regs->ds    
360         popl    %es             /* pt_regs->es    
361         popl    %fs             /* pt_regs->fs    
362         popl    %gs             /* pt_regs->gs    
363         decl    %ss:early_recursion_flag          
364         addl    $4, %esp        /* pop pt_regs    
365         iret                                      
366 SYM_CODE_END(early_idt_handler_common)            
367                                                   
368 /* This is the default interrupt "handler" :-)    
369 SYM_FUNC_START(early_ignore_irq)                  
370         cld                                       
371 #ifdef CONFIG_PRINTK                              
372         pushl %eax                                
373         pushl %ecx                                
374         pushl %edx                                
375         pushl %es                                 
376         pushl %ds                                 
377         movl $(__KERNEL_DS),%eax                  
378         movl %eax,%ds                             
379         movl %eax,%es                             
380         cmpl $2,early_recursion_flag              
381         je hlt_loop                               
382         incl early_recursion_flag                 
383         pushl 16(%esp)                            
384         pushl 24(%esp)                            
385         pushl 32(%esp)                            
386         pushl 40(%esp)                            
387         pushl $int_msg                            
388         call _printk                              
389                                                   
390         call dump_stack                           
391                                                   
392         addl $(5*4),%esp                          
393         popl %ds                                  
394         popl %es                                  
395         popl %edx                                 
396         popl %ecx                                 
397         popl %eax                                 
398 #endif                                            
399         iret                                      
400                                                   
401 hlt_loop:                                         
402         hlt                                       
403         jmp hlt_loop                              
404 SYM_FUNC_END(early_ignore_irq)                    
405                                                   
406 __INITDATA                                        
407         .align 4                                  
408 SYM_DATA(early_recursion_flag, .long 0)           
409                                                   
410 __REFDATA                                         
411         .align 4                                  
412 SYM_DATA(initial_code,          .long i386_sta    
413                                                   
414 #ifdef CONFIG_MITIGATION_PAGE_TABLE_ISOLATION     
415 #define PGD_ALIGN       (2 * PAGE_SIZE)           
416 #define PTI_USER_PGD_FILL       1024              
417 #else                                             
418 #define PGD_ALIGN       (PAGE_SIZE)               
419 #define PTI_USER_PGD_FILL       0                 
420 #endif                                            
421 /*                                                
422  * BSS section                                    
423  */                                               
424 __PAGE_ALIGNED_BSS                                
425         .align PGD_ALIGN                          
426 #ifdef CONFIG_X86_PAE                             
427 .globl initial_pg_pmd                             
428 initial_pg_pmd:                                   
429         .fill 1024*KPMDS,4,0                      
430 #else                                             
431 .globl initial_page_table                         
432 initial_page_table:                               
433         .fill 1024,4,0                            
434 #endif                                            
435         .align PGD_ALIGN                          
436 initial_pg_fixmap:                                
437         .fill 1024,4,0                            
438 .globl swapper_pg_dir                             
439         .align PGD_ALIGN                          
440 swapper_pg_dir:                                   
441         .fill 1024,4,0                            
442         .fill PTI_USER_PGD_FILL,4,0               
443 .globl empty_zero_page                            
444 empty_zero_page:                                  
445         .fill 4096,1,0                            
446 EXPORT_SYMBOL(empty_zero_page)                    
447                                                   
448 /*                                                
449  * This starts the data section.                  
450  */                                               
451 #ifdef CONFIG_X86_PAE                             
452 __PAGE_ALIGNED_DATA                               
453         /* Page-aligned for the benefit of par    
454         .align PGD_ALIGN                          
455 SYM_DATA_START(initial_page_table)                
456         .long   pa(initial_pg_pmd+PGD_IDENT_AT    
457 # if KPMDS == 3                                   
458         .long   pa(initial_pg_pmd+PGD_IDENT_AT    
459         .long   pa(initial_pg_pmd+PGD_IDENT_AT    
460         .long   pa(initial_pg_pmd+PGD_IDENT_AT    
461 # elif KPMDS == 2                                 
462         .long   0,0                               
463         .long   pa(initial_pg_pmd+PGD_IDENT_AT    
464         .long   pa(initial_pg_pmd+PGD_IDENT_AT    
465 # elif KPMDS == 1                                 
466         .long   0,0                               
467         .long   0,0                               
468         .long   pa(initial_pg_pmd+PGD_IDENT_AT    
469 # else                                            
470 #  error "Kernel PMDs should be 1, 2 or 3"        
471 # endif                                           
472         .align PAGE_SIZE                /* nee    
473                                                   
474 #ifdef CONFIG_MITIGATION_PAGE_TABLE_ISOLATION     
475         /*                                        
476          * PTI needs another page so sync_init    
477          * and does not scribble over the data    
478          * actual initial_page_table. See clon    
479          */                                       
480         .fill 1024, 4, 0                          
481 #endif                                            
482                                                   
483 SYM_DATA_END(initial_page_table)                  
484 #endif                                            
485                                                   
486 .data                                             
487 .balign 4                                         
488 SYM_DATA(initial_stack, .long __top_init_kerne    
489                                                   
490 __INITRODATA                                      
491 int_msg:                                          
492         .asciz "Unknown interrupt or fault at:    
493                                                   
494 #include "../xen/xen-head.S"                      
495                                                   
496 /*                                                
497  * The IDT and GDT 'descriptors' are a strange    
498  * only used by the lidt and lgdt instructions    
499  * like usual segment descriptors - they consi    
500  * segment size, and 32-bit linear address val    
501  */                                               
502                                                   
503         .data                                     
504         ALIGN                                     
505 # early boot GDT descriptor (must use 1:1 addr    
506         .word 0                         # 32 b    
507 SYM_DATA_START_LOCAL(boot_gdt_descr)              
508         .word __BOOT_DS+7                         
509         .long boot_gdt - __PAGE_OFFSET            
510 SYM_DATA_END(boot_gdt_descr)                      
511                                                   
512 # boot GDT descriptor (later on used by CPU#0)    
513         .word 0                         # 32 b    
514 SYM_DATA_START(early_gdt_descr)                   
515         .word GDT_ENTRIES*8-1                     
516         .long gdt_page                  /* Ove    
517 SYM_DATA_END(early_gdt_descr)                     
518                                                   
519 /*                                                
520  * The boot_gdt must mirror the equivalent in     
521  * used only for booting.                         
522  */                                               
523         .align L1_CACHE_BYTES                     
524 SYM_DATA_START(boot_gdt)                          
525         .fill GDT_ENTRY_BOOT_CS,8,0               
526         .quad 0x00cf9a000000ffff        /* ker    
527         .quad 0x00cf92000000ffff        /* ker    
528 SYM_DATA_END(boot_gdt)                            
                                                      

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