Print this page
de-linting of .s files
m
@@ -24,16 +24,10 @@
* Use is subject to license terms.
* Copyright 2018 Joyent, Inc.
*/
-#if defined(__lint)
-
-int fb_swtch_silence_lint = 0;
-
-#else
-
#include <sys/asm_linkage.h>
#include <sys/segments.h>
#include <sys/controlregs.h>
#include <sys/machparam.h>
#include <sys/multiboot.h>
@@ -94,11 +88,10 @@
_start:
/* Disable interrupts */
cli
-#if defined(__amd64)
/* Switch to a low memory stack */
movq $_start, %rsp
addq $FASTBOOT_STACK_OFFSET, %rsp
/*
@@ -110,27 +103,10 @@
movq %rsp, %rdi /* destination on the new stack */
movq $FI_VALID, %rcx /* size to copy */
rep
smovb
-#elif defined(__i386)
- movl 0x4(%esp), %esi /* address of fastboot info struct */
-
- /* Switch to a low memory stack */
- movl $_start, %esp
- addl $FASTBOOT_STACK_OFFSET, %esp
-
- /* Copy struct to stack */
- movl %esp, %edi /* destination on the new stack */
- movl $FI_VALID, %ecx /* size to copy */
- rep
- smovb
-
-#endif
-
-#if defined(__amd64)
-
xorl %eax, %eax
xorl %edx, %edx
movl $MSR_AMD_FSBASE, %ecx
wrmsr
@@ -139,42 +115,36 @@
wrmsr
movl $MSR_AMD_KGSBASE, %ecx
wrmsr
-#endif
/*
* zero out all the registers to make sure they're 16 bit clean
*/
-#if defined(__amd64)
xorq %r8, %r8
xorq %r9, %r9
xorq %r10, %r10
xorq %r11, %r11
xorq %r12, %r12
xorq %r13, %r13
xorq %r14, %r14
xorq %r15, %r15
-#endif
xorl %eax, %eax
xorl %ebx, %ebx
xorl %ecx, %ecx
xorl %edx, %edx
xorl %ebp, %ebp
-#if defined(__amd64)
/*
* Load our own GDT
*/
lgdt gdt_info
-#endif
/*
* Load our own IDT
*/
lidt idt_info
-#if defined(__amd64)
/*
* Invalidate all TLB entries.
* Load temporary pagetables to copy kernel and boot-archive
*/
movq %cr4, %rax
@@ -227,97 +197,35 @@
* - shutting down paging (bit 31 of cr0). This will flush the
* TLBs.
* - turning off PCID in cr4
* - disabling LME (long mode enable) in EFER (extended feature reg)
*/
-#endif
DISABLE_PAGING /* clobbers %eax */
-#if defined(__amd64)
ljmp $B32CODE_SEL, $1f
1:
-#endif
/*
* Clear PGE, PAE and PSE flags as dboot expects them to be
* cleared.
*/
movl %cr4, %eax
andl $_BITNOT(CR4_PGE | CR4_PAE | CR4_PSE), %eax
movl %eax, %cr4
-#if defined(__amd64)
movl $MSR_AMD_EFER, %ecx /* Extended Feature Enable */
rdmsr
btcl $8, %eax /* bit 8 Long Mode Enable bit */
wrmsr
-#elif defined(__i386)
- /*
- * If fi_has_pae is set, re-enable paging with PAE.
- */
- leal FI_FILES(%esp), %ebx /* offset to the files */
- movl FI_HAS_PAE(%esp), %edi /* need to enable paging or not */
- cmpl $0, %edi
- je paging_on /* no need to enable paging */
-
- movl FI_LAST_TABLE_PA(%esp), %esi /* page table PA */
-
- /*
- * Turn on PAE
- */
- movl %cr4, %eax
- orl $CR4_PAE, %eax
- movl %eax, %cr4
-
- /*
- * Load top pagetable base address into cr3
- */
- movl FI_PAGETABLE_PA(%esp), %eax
- movl %eax, %cr3
-
- movl %cr0, %eax
- orl $_CONST(CR0_PG | CR0_WP | CR0_AM), %eax
- andl $_BITNOT(CR0_NW | CR0_CD), %eax
- movl %eax, %cr0
- jmp paging_on
-paging_on:
-
- /* copy unix to final destination */
- leal _MUL(FASTBOOT_UNIX, FI_FILES_INCR)(%ebx), %edx
- call map_copy
-
- /* copy boot archive to final destination */
- leal _MUL(FASTBOOT_BOOTARCHIVE, FI_FILES_INCR)(%ebx), %edx
- call map_copy
-
- /* Disable paging one more time */
- DISABLE_PAGING
-
- /* Copy sections if there are any */
- leal _MUL(FASTBOOT_UNIX, FI_FILES_INCR)(%ebx), %edx
- movl FB_SECTCNT(%edx), %eax
- cmpl $0, %eax
- je 1f
- call copy_sections
-1:
-
- /* Whatever flags we turn on we need to turn off */
- movl %cr4, %eax
- andl $_BITNOT(CR4_PAE), %eax
- movl %eax, %cr4
-#endif /* __i386 */
-
dboot_jump:
/* Jump to dboot */
movl $DBOOT_ENTRY_ADDRESS, %edi
movl FI_NEW_MBI_PA(%esp), %ebx
movl $MB_BOOTLOADER_MAGIC, %eax
jmp *%edi
-#if defined(__amd64)
-
.code64
ENTRY_NP(copy_sections)
/*
* On entry
* %rdi points to the fboot_file_t
@@ -359,97 +267,13 @@
jmp 2b
1:
ret
SET_SIZE(map_copy)
-#elif defined(__i386)
-
- ENTRY_NP(copy_sections)
- /*
- * On entry
- * %edx points to the fboot_file_t
- * %eax contains the number of sections
- */
- pushl %ebp
- pushl %ebx
- pushl %esi
- pushl %edi
-
- movl %eax, %ebp
-
- COPY_SECT(%edx, %ebx, %ebp)
-
- popl %edi
- popl %esi
- popl %ebx
- popl %ebp
- ret
- SET_SIZE(copy_sections)
-
- ENTRY_NP(map_copy)
- /*
- * On entry
- * %edx points to the fboot_file_t
- * %edi has FB_HAS_PAE(%esp)
- * %esi has FI_LAST_TABLE_PA(%esp)
- */
- pushl %eax
- pushl %ebx
- pushl %ecx
- pushl %edx
- pushl %ebp
- pushl %esi
- pushl %edi
- movl %esi, %ebp /* Save page table PA in %ebp */
-
- movl FB_PTE_LIST_PA(%edx), %eax /* PA list of the source */
- movl FB_DEST_PA(%edx), %ebx /* PA of the destination */
-
-loop:
- movl (%eax), %esi /* Are we done? */
- cmpl $FASTBOOT_TERMINATE, %esi
- je done
-
- cmpl $1, (%esp) /* Is paging on? */
- jne no_paging /* Nope */
-
- movl %ebp, %edi /* Page table PA */
- movl %esi, (%edi) /* Program low 32-bit */
- movl 4(%eax), %esi /* high bits of the table */
- movl %esi, 4(%edi) /* Program high 32-bit */
- movl %cr3, %esi /* Reload cr3 */
- movl %esi, %cr3
- movl FB_VA(%edx), %esi /* Load from VA */
- jmp do_copy
-no_paging:
- andl $_BITNOT(MMU_PAGEOFFSET), %esi /* clear lower 12-bit */
-do_copy:
- movl %ebx, %edi
- movl $PAGESIZE, %ecx
- shrl $2, %ecx /* 4-byte at a time */
- rep
- smovl
- addl $8, %eax /* We built the PTEs as 8-byte entries */
- addl $PAGESIZE, %ebx
- jmp loop
-done:
- popl %edi
- popl %esi
- popl %ebp
- popl %edx
- popl %ecx
- popl %ebx
- popl %eax
- ret
- SET_SIZE(map_copy)
-#endif /* __i386 */
-
-
idt_info:
.value 0x3ff
.quad 0
/*
* We need to trampoline thru a gdt we have in low memory.
*/
#include "../boot/boot_gdt.s"
-#endif /* __lint */