Merge tag 'spi-fix-v5.6-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
[linux-2.6-microblaze.git] / arch / x86 / kernel / head_32.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *
4  *  Copyright (C) 1991, 1992  Linus Torvalds
5  *
6  *  Enhanced CPU detection and feature setting code by Mike Jagdis
7  *  and Martin Mares, November 1997.
8  */
9
10 .text
11 #include <linux/threads.h>
12 #include <linux/init.h>
13 #include <linux/linkage.h>
14 #include <asm/segment.h>
15 #include <asm/page_types.h>
16 #include <asm/pgtable_types.h>
17 #include <asm/cache.h>
18 #include <asm/thread_info.h>
19 #include <asm/asm-offsets.h>
20 #include <asm/setup.h>
21 #include <asm/processor-flags.h>
22 #include <asm/msr-index.h>
23 #include <asm/cpufeatures.h>
24 #include <asm/percpu.h>
25 #include <asm/nops.h>
26 #include <asm/bootparam.h>
27 #include <asm/export.h>
28 #include <asm/pgtable_32.h>
29
30 /* Physical address */
31 #define pa(X) ((X) - __PAGE_OFFSET)
32
33 /*
34  * References to members of the new_cpu_data structure.
35  */
36
37 #define X86             new_cpu_data+CPUINFO_x86
38 #define X86_VENDOR      new_cpu_data+CPUINFO_x86_vendor
39 #define X86_MODEL       new_cpu_data+CPUINFO_x86_model
40 #define X86_STEPPING    new_cpu_data+CPUINFO_x86_stepping
41 #define X86_HARD_MATH   new_cpu_data+CPUINFO_hard_math
42 #define X86_CPUID       new_cpu_data+CPUINFO_cpuid_level
43 #define X86_CAPABILITY  new_cpu_data+CPUINFO_x86_capability
44 #define X86_VENDOR_ID   new_cpu_data+CPUINFO_x86_vendor_id
45
46
47 #define SIZEOF_PTREGS 17*4
48
49 /*
50  * Worst-case size of the kernel mapping we need to make:
51  * a relocatable kernel can live anywhere in lowmem, so we need to be able
52  * to map all of lowmem.
53  */
54 KERNEL_PAGES = LOWMEM_PAGES
55
56 INIT_MAP_SIZE = PAGE_TABLE_SIZE(KERNEL_PAGES) * PAGE_SIZE
57 RESERVE_BRK(pagetables, INIT_MAP_SIZE)
58
59 /*
60  * 32-bit kernel entrypoint; only used by the boot CPU.  On entry,
61  * %esi points to the real-mode code as a 32-bit pointer.
62  * CS and DS must be 4 GB flat segments, but we don't depend on
63  * any particular GDT layout, because we load our own as soon as we
64  * can.
65  */
66 __HEAD
67 SYM_CODE_START(startup_32)
68         movl pa(initial_stack),%ecx
69         
70         /* test KEEP_SEGMENTS flag to see if the bootloader is asking
71                 us to not reload segments */
72         testb $KEEP_SEGMENTS, BP_loadflags(%esi)
73         jnz 2f
74
75 /*
76  * Set segments to known values.
77  */
78         lgdt pa(boot_gdt_descr)
79         movl $(__BOOT_DS),%eax
80         movl %eax,%ds
81         movl %eax,%es
82         movl %eax,%fs
83         movl %eax,%gs
84         movl %eax,%ss
85 2:
86         leal -__PAGE_OFFSET(%ecx),%esp
87
88 /*
89  * Clear BSS first so that there are no surprises...
90  */
91         cld
92         xorl %eax,%eax
93         movl $pa(__bss_start),%edi
94         movl $pa(__bss_stop),%ecx
95         subl %edi,%ecx
96         shrl $2,%ecx
97         rep ; stosl
98 /*
99  * Copy bootup parameters out of the way.
100  * Note: %esi still has the pointer to the real-mode data.
101  * With the kexec as boot loader, parameter segment might be loaded beyond
102  * kernel image and might not even be addressable by early boot page tables.
103  * (kexec on panic case). Hence copy out the parameters before initializing
104  * page tables.
105  */
106         movl $pa(boot_params),%edi
107         movl $(PARAM_SIZE/4),%ecx
108         cld
109         rep
110         movsl
111         movl pa(boot_params) + NEW_CL_POINTER,%esi
112         andl %esi,%esi
113         jz 1f                   # No command line
114         movl $pa(boot_command_line),%edi
115         movl $(COMMAND_LINE_SIZE/4),%ecx
116         rep
117         movsl
118 1:
119
120 #ifdef CONFIG_OLPC
121         /* save OFW's pgdir table for later use when calling into OFW */
122         movl %cr3, %eax
123         movl %eax, pa(olpc_ofw_pgd)
124 #endif
125
126 #ifdef CONFIG_MICROCODE
127         /* Early load ucode on BSP. */
128         call load_ucode_bsp
129 #endif
130
131         /* Create early pagetables. */
132         call  mk_early_pgtbl_32
133
134         /* Do early initialization of the fixmap area */
135         movl $pa(initial_pg_fixmap)+PDE_IDENT_ATTR,%eax
136 #ifdef  CONFIG_X86_PAE
137 #define KPMDS (((-__PAGE_OFFSET) >> 30) & 3) /* Number of kernel PMDs */
138         movl %eax,pa(initial_pg_pmd+0x1000*KPMDS-8)
139 #else
140         movl %eax,pa(initial_page_table+0xffc)
141 #endif
142
143 #ifdef CONFIG_PARAVIRT
144         /* This is can only trip for a broken bootloader... */
145         cmpw $0x207, pa(boot_params + BP_version)
146         jb .Ldefault_entry
147
148         /* Paravirt-compatible boot parameters.  Look to see what architecture
149                 we're booting under. */
150         movl pa(boot_params + BP_hardware_subarch), %eax
151         cmpl $num_subarch_entries, %eax
152         jae .Lbad_subarch
153
154         movl pa(subarch_entries)(,%eax,4), %eax
155         subl $__PAGE_OFFSET, %eax
156         jmp *%eax
157
158 .Lbad_subarch:
159 SYM_INNER_LABEL_ALIGN(xen_entry, SYM_L_WEAK)
160         /* Unknown implementation; there's really
161            nothing we can do at this point. */
162         ud2a
163
164         __INITDATA
165
166 subarch_entries:
167         .long .Ldefault_entry           /* normal x86/PC */
168         .long xen_entry                 /* Xen hypervisor */
169         .long .Ldefault_entry           /* Moorestown MID */
170 num_subarch_entries = (. - subarch_entries) / 4
171 .previous
172 #else
173         jmp .Ldefault_entry
174 #endif /* CONFIG_PARAVIRT */
175 SYM_CODE_END(startup_32)
176
177 #ifdef CONFIG_HOTPLUG_CPU
178 /*
179  * Boot CPU0 entry point. It's called from play_dead(). Everything has been set
180  * up already except stack. We just set up stack here. Then call
181  * start_secondary().
182  */
183 SYM_FUNC_START(start_cpu0)
184         movl initial_stack, %ecx
185         movl %ecx, %esp
186         call *(initial_code)
187 1:      jmp 1b
188 SYM_FUNC_END(start_cpu0)
189 #endif
190
191 /*
192  * Non-boot CPU entry point; entered from trampoline.S
193  * We can't lgdt here, because lgdt itself uses a data segment, but
194  * we know the trampoline has already loaded the boot_gdt for us.
195  *
196  * If cpu hotplug is not supported then this code can go in init section
197  * which will be freed later
198  */
199 SYM_FUNC_START(startup_32_smp)
200         cld
201         movl $(__BOOT_DS),%eax
202         movl %eax,%ds
203         movl %eax,%es
204         movl %eax,%fs
205         movl %eax,%gs
206         movl pa(initial_stack),%ecx
207         movl %eax,%ss
208         leal -__PAGE_OFFSET(%ecx),%esp
209
210 #ifdef CONFIG_MICROCODE
211         /* Early load ucode on AP. */
212         call load_ucode_ap
213 #endif
214
215 .Ldefault_entry:
216         movl $(CR0_STATE & ~X86_CR0_PG),%eax
217         movl %eax,%cr0
218
219 /*
220  * We want to start out with EFLAGS unambiguously cleared. Some BIOSes leave
221  * bits like NT set. This would confuse the debugger if this code is traced. So
222  * initialize them properly now before switching to protected mode. That means
223  * DF in particular (even though we have cleared it earlier after copying the
224  * command line) because GCC expects it.
225  */
226         pushl $0
227         popfl
228
229 /*
230  * New page tables may be in 4Mbyte page mode and may be using the global pages.
231  *
232  * NOTE! If we are on a 486 we may have no cr4 at all! Specifically, cr4 exists
233  * if and only if CPUID exists and has flags other than the FPU flag set.
234  */
235         movl $-1,pa(X86_CPUID)          # preset CPUID level
236         movl $X86_EFLAGS_ID,%ecx
237         pushl %ecx
238         popfl                           # set EFLAGS=ID
239         pushfl
240         popl %eax                       # get EFLAGS
241         testl $X86_EFLAGS_ID,%eax       # did EFLAGS.ID remained set?
242         jz .Lenable_paging              # hw disallowed setting of ID bit
243                                         # which means no CPUID and no CR4
244
245         xorl %eax,%eax
246         cpuid
247         movl %eax,pa(X86_CPUID)         # save largest std CPUID function
248
249         movl $1,%eax
250         cpuid
251         andl $~1,%edx                   # Ignore CPUID.FPU
252         jz .Lenable_paging              # No flags or only CPUID.FPU = no CR4
253
254         movl pa(mmu_cr4_features),%eax
255         movl %eax,%cr4
256
257         testb $X86_CR4_PAE, %al         # check if PAE is enabled
258         jz .Lenable_paging
259
260         /* Check if extended functions are implemented */
261         movl $0x80000000, %eax
262         cpuid
263         /* Value must be in the range 0x80000001 to 0x8000ffff */
264         subl $0x80000001, %eax
265         cmpl $(0x8000ffff-0x80000001), %eax
266         ja .Lenable_paging
267
268         /* Clear bogus XD_DISABLE bits */
269         call verify_cpu
270
271         mov $0x80000001, %eax
272         cpuid
273         /* Execute Disable bit supported? */
274         btl $(X86_FEATURE_NX & 31), %edx
275         jnc .Lenable_paging
276
277         /* Setup EFER (Extended Feature Enable Register) */
278         movl $MSR_EFER, %ecx
279         rdmsr
280
281         btsl $_EFER_NX, %eax
282         /* Make changes effective */
283         wrmsr
284
285 .Lenable_paging:
286
287 /*
288  * Enable paging
289  */
290         movl $pa(initial_page_table), %eax
291         movl %eax,%cr3          /* set the page table pointer.. */
292         movl $CR0_STATE,%eax
293         movl %eax,%cr0          /* ..and set paging (PG) bit */
294         ljmp $__BOOT_CS,$1f     /* Clear prefetch and normalize %eip */
295 1:
296         /* Shift the stack pointer to a virtual address */
297         addl $__PAGE_OFFSET, %esp
298
299 /*
300  * start system 32-bit setup. We need to re-do some of the things done
301  * in 16-bit mode for the "real" operations.
302  */
303         movl setup_once_ref,%eax
304         andl %eax,%eax
305         jz 1f                           # Did we do this already?
306         call *%eax
307 1:
308
309 /*
310  * Check if it is 486
311  */
312         movb $4,X86                     # at least 486
313         cmpl $-1,X86_CPUID
314         je .Lis486
315
316         /* get vendor info */
317         xorl %eax,%eax                  # call CPUID with 0 -> return vendor ID
318         cpuid
319         movl %eax,X86_CPUID             # save CPUID level
320         movl %ebx,X86_VENDOR_ID         # lo 4 chars
321         movl %edx,X86_VENDOR_ID+4       # next 4 chars
322         movl %ecx,X86_VENDOR_ID+8       # last 4 chars
323
324         orl %eax,%eax                   # do we have processor info as well?
325         je .Lis486
326
327         movl $1,%eax            # Use the CPUID instruction to get CPU type
328         cpuid
329         movb %al,%cl            # save reg for future use
330         andb $0x0f,%ah          # mask processor family
331         movb %ah,X86
332         andb $0xf0,%al          # mask model
333         shrb $4,%al
334         movb %al,X86_MODEL
335         andb $0x0f,%cl          # mask mask revision
336         movb %cl,X86_STEPPING
337         movl %edx,X86_CAPABILITY
338
339 .Lis486:
340         movl $0x50022,%ecx      # set AM, WP, NE and MP
341         movl %cr0,%eax
342         andl $0x80000011,%eax   # Save PG,PE,ET
343         orl %ecx,%eax
344         movl %eax,%cr0
345
346         lgdt early_gdt_descr
347         ljmp $(__KERNEL_CS),$1f
348 1:      movl $(__KERNEL_DS),%eax        # reload all the segment registers
349         movl %eax,%ss                   # after changing gdt.
350
351         movl $(__USER_DS),%eax          # DS/ES contains default USER segment
352         movl %eax,%ds
353         movl %eax,%es
354
355         movl $(__KERNEL_PERCPU), %eax
356         movl %eax,%fs                   # set this cpu's percpu
357
358         movl $(__KERNEL_STACK_CANARY),%eax
359         movl %eax,%gs
360
361         xorl %eax,%eax                  # Clear LDT
362         lldt %ax
363
364         call *(initial_code)
365 1:      jmp 1b
366 SYM_FUNC_END(startup_32_smp)
367
368 #include "verify_cpu.S"
369
370 /*
371  *  setup_once
372  *
373  *  The setup work we only want to run on the BSP.
374  *
375  *  Warning: %esi is live across this function.
376  */
377 __INIT
378 setup_once:
379 #ifdef CONFIG_STACKPROTECTOR
380         /*
381          * Configure the stack canary. The linker can't handle this by
382          * relocation.  Manually set base address in stack canary
383          * segment descriptor.
384          */
385         movl $gdt_page,%eax
386         movl $stack_canary,%ecx
387         movw %cx, 8 * GDT_ENTRY_STACK_CANARY + 2(%eax)
388         shrl $16, %ecx
389         movb %cl, 8 * GDT_ENTRY_STACK_CANARY + 4(%eax)
390         movb %ch, 8 * GDT_ENTRY_STACK_CANARY + 7(%eax)
391 #endif
392
393         andl $0,setup_once_ref  /* Once is enough, thanks */
394         ret
395
396 SYM_FUNC_START(early_idt_handler_array)
397         # 36(%esp) %eflags
398         # 32(%esp) %cs
399         # 28(%esp) %eip
400         # 24(%rsp) error code
401         i = 0
402         .rept NUM_EXCEPTION_VECTORS
403         .if ((EXCEPTION_ERRCODE_MASK >> i) & 1) == 0
404         pushl $0                # Dummy error code, to make stack frame uniform
405         .endif
406         pushl $i                # 20(%esp) Vector number
407         jmp early_idt_handler_common
408         i = i + 1
409         .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc
410         .endr
411 SYM_FUNC_END(early_idt_handler_array)
412         
413 SYM_CODE_START_LOCAL(early_idt_handler_common)
414         /*
415          * The stack is the hardware frame, an error code or zero, and the
416          * vector number.
417          */
418         cld
419
420         incl %ss:early_recursion_flag
421
422         /* The vector number is in pt_regs->gs */
423
424         cld
425         pushl   %fs             /* pt_regs->fs (__fsh varies by model) */
426         pushl   %es             /* pt_regs->es (__esh varies by model) */
427         pushl   %ds             /* pt_regs->ds (__dsh varies by model) */
428         pushl   %eax            /* pt_regs->ax */
429         pushl   %ebp            /* pt_regs->bp */
430         pushl   %edi            /* pt_regs->di */
431         pushl   %esi            /* pt_regs->si */
432         pushl   %edx            /* pt_regs->dx */
433         pushl   %ecx            /* pt_regs->cx */
434         pushl   %ebx            /* pt_regs->bx */
435
436         /* Fix up DS and ES */
437         movl    $(__KERNEL_DS), %ecx
438         movl    %ecx, %ds
439         movl    %ecx, %es
440
441         /* Load the vector number into EDX */
442         movl    PT_GS(%esp), %edx
443
444         /* Load GS into pt_regs->gs (and maybe clobber __gsh) */
445         movw    %gs, PT_GS(%esp)
446
447         movl    %esp, %eax      /* args are pt_regs (EAX), trapnr (EDX) */
448         call    early_fixup_exception
449
450         popl    %ebx            /* pt_regs->bx */
451         popl    %ecx            /* pt_regs->cx */
452         popl    %edx            /* pt_regs->dx */
453         popl    %esi            /* pt_regs->si */
454         popl    %edi            /* pt_regs->di */
455         popl    %ebp            /* pt_regs->bp */
456         popl    %eax            /* pt_regs->ax */
457         popl    %ds             /* pt_regs->ds (always ignores __dsh) */
458         popl    %es             /* pt_regs->es (always ignores __esh) */
459         popl    %fs             /* pt_regs->fs (always ignores __fsh) */
460         popl    %gs             /* pt_regs->gs (always ignores __gsh) */
461         decl    %ss:early_recursion_flag
462         addl    $4, %esp        /* pop pt_regs->orig_ax */
463         iret
464 SYM_CODE_END(early_idt_handler_common)
465
466 /* This is the default interrupt "handler" :-) */
467 SYM_FUNC_START(early_ignore_irq)
468         cld
469 #ifdef CONFIG_PRINTK
470         pushl %eax
471         pushl %ecx
472         pushl %edx
473         pushl %es
474         pushl %ds
475         movl $(__KERNEL_DS),%eax
476         movl %eax,%ds
477         movl %eax,%es
478         cmpl $2,early_recursion_flag
479         je hlt_loop
480         incl early_recursion_flag
481         pushl 16(%esp)
482         pushl 24(%esp)
483         pushl 32(%esp)
484         pushl 40(%esp)
485         pushl $int_msg
486         call printk
487
488         call dump_stack
489
490         addl $(5*4),%esp
491         popl %ds
492         popl %es
493         popl %edx
494         popl %ecx
495         popl %eax
496 #endif
497         iret
498
499 hlt_loop:
500         hlt
501         jmp hlt_loop
502 SYM_FUNC_END(early_ignore_irq)
503
504 __INITDATA
505         .align 4
506 SYM_DATA(early_recursion_flag, .long 0)
507
508 __REFDATA
509         .align 4
510 SYM_DATA(initial_code,          .long i386_start_kernel)
511 SYM_DATA(setup_once_ref,        .long setup_once)
512
513 #ifdef CONFIG_PAGE_TABLE_ISOLATION
514 #define PGD_ALIGN       (2 * PAGE_SIZE)
515 #define PTI_USER_PGD_FILL       1024
516 #else
517 #define PGD_ALIGN       (PAGE_SIZE)
518 #define PTI_USER_PGD_FILL       0
519 #endif
520 /*
521  * BSS section
522  */
523 __PAGE_ALIGNED_BSS
524         .align PGD_ALIGN
525 #ifdef CONFIG_X86_PAE
526 .globl initial_pg_pmd
527 initial_pg_pmd:
528         .fill 1024*KPMDS,4,0
529 #else
530 .globl initial_page_table
531 initial_page_table:
532         .fill 1024,4,0
533 #endif
534         .align PGD_ALIGN
535 initial_pg_fixmap:
536         .fill 1024,4,0
537 .globl swapper_pg_dir
538         .align PGD_ALIGN
539 swapper_pg_dir:
540         .fill 1024,4,0
541         .fill PTI_USER_PGD_FILL,4,0
542 .globl empty_zero_page
543 empty_zero_page:
544         .fill 4096,1,0
545 EXPORT_SYMBOL(empty_zero_page)
546
547 /*
548  * This starts the data section.
549  */
550 #ifdef CONFIG_X86_PAE
551 __PAGE_ALIGNED_DATA
552         /* Page-aligned for the benefit of paravirt? */
553         .align PGD_ALIGN
554 SYM_DATA_START(initial_page_table)
555         .long   pa(initial_pg_pmd+PGD_IDENT_ATTR),0     /* low identity map */
556 # if KPMDS == 3
557         .long   pa(initial_pg_pmd+PGD_IDENT_ATTR),0
558         .long   pa(initial_pg_pmd+PGD_IDENT_ATTR+0x1000),0
559         .long   pa(initial_pg_pmd+PGD_IDENT_ATTR+0x2000),0
560 # elif KPMDS == 2
561         .long   0,0
562         .long   pa(initial_pg_pmd+PGD_IDENT_ATTR),0
563         .long   pa(initial_pg_pmd+PGD_IDENT_ATTR+0x1000),0
564 # elif KPMDS == 1
565         .long   0,0
566         .long   0,0
567         .long   pa(initial_pg_pmd+PGD_IDENT_ATTR),0
568 # else
569 #  error "Kernel PMDs should be 1, 2 or 3"
570 # endif
571         .align PAGE_SIZE                /* needs to be page-sized too */
572
573 #ifdef CONFIG_PAGE_TABLE_ISOLATION
574         /*
575          * PTI needs another page so sync_initial_pagetable() works correctly
576          * and does not scribble over the data which is placed behind the
577          * actual initial_page_table. See clone_pgd_range().
578          */
579         .fill 1024, 4, 0
580 #endif
581
582 SYM_DATA_END(initial_page_table)
583 #endif
584
585 .data
586 .balign 4
587 /*
588  * The SIZEOF_PTREGS gap is a convention which helps the in-kernel unwinder
589  * reliably detect the end of the stack.
590  */
591 SYM_DATA(initial_stack,
592                 .long init_thread_union + THREAD_SIZE -
593                 SIZEOF_PTREGS - TOP_OF_KERNEL_STACK_PADDING)
594
595 __INITRODATA
596 int_msg:
597         .asciz "Unknown interrupt or fault at: %p %p %p\n"
598
599 #include "../../x86/xen/xen-head.S"
600
601 /*
602  * The IDT and GDT 'descriptors' are a strange 48-bit object
603  * only used by the lidt and lgdt instructions. They are not
604  * like usual segment descriptors - they consist of a 16-bit
605  * segment size, and 32-bit linear address value:
606  */
607
608         .data
609         ALIGN
610 # early boot GDT descriptor (must use 1:1 address mapping)
611         .word 0                         # 32 bit align gdt_desc.address
612 SYM_DATA_START_LOCAL(boot_gdt_descr)
613         .word __BOOT_DS+7
614         .long boot_gdt - __PAGE_OFFSET
615 SYM_DATA_END(boot_gdt_descr)
616
617 # boot GDT descriptor (later on used by CPU#0):
618         .word 0                         # 32 bit align gdt_desc.address
619 SYM_DATA_START(early_gdt_descr)
620         .word GDT_ENTRIES*8-1
621         .long gdt_page                  /* Overwritten for secondary CPUs */
622 SYM_DATA_END(early_gdt_descr)
623
624 /*
625  * The boot_gdt must mirror the equivalent in setup.S and is
626  * used only for booting.
627  */
628         .align L1_CACHE_BYTES
629 SYM_DATA_START(boot_gdt)
630         .fill GDT_ENTRY_BOOT_CS,8,0
631         .quad 0x00cf9a000000ffff        /* kernel 4GB code at 0x00000000 */
632         .quad 0x00cf92000000ffff        /* kernel 4GB data at 0x00000000 */
633 SYM_DATA_END(boot_gdt)