Print this page
de-linting of .s files
m
*** 28,41 ****
#include <sys/regset.h>
#include <sys/privregs.h>
#include <sys/x86_archext.h>
#include <sys/cpr_wakecode.h>
- #if !defined(__lint)
#include <sys/segments.h>
#include "assym.h"
- #endif
#ifdef DEBUG
#define LED 1
#define SERIAL 1
#endif /* DEBUG */
--- 28,39 ----
*** 74,94 ****
*
* Our actions:
*
*/
- #if defined(lint) || defined(__lint)
-
- /*ARGSUSED*/
- int
- wc_save_context(wc_cpu_t *pcpu)
- { return 0; }
-
- #else /* lint */
-
- #if defined(__amd64)
-
ENTRY_NP(wc_save_context)
movq (%rsp), %rdx / return address
movq %rdx, WC_RETADDR(%rdi)
pushq %rbp
--- 72,81 ----
*** 172,235 ****
ret
SET_SIZE(wc_save_context)
- #elif defined(__i386)
- ENTRY_NP(wc_save_context)
-
- movl 4(%esp), %eax / wc_cpu_t *
- movl %eax, WC_VIRTADDR(%eax)
-
- movl (%esp), %edx / return address
- movl %edx, WC_RETADDR(%eax)
-
- str WC_TR(%eax) / stash everything else we need
- sgdt WC_GDT(%eax)
- sldt WC_LDT(%eax)
- sidt WC_IDT(%eax)
-
- movl %cr0, %edx
- movl %edx, WC_CR0(%eax)
- movl %cr3, %edx
- movl %edx, WC_CR3(%eax)
- movl %cr4, %edx
- movl %edx, WC_CR4(%eax)
-
- movl %ebx, WC_EBX(%eax)
- movl %edi, WC_EDI(%eax)
- movl %esi, WC_ESI(%eax)
- movl %ebp, WC_EBP(%eax)
- movl %esp, WC_ESP(%eax)
-
- movw %ss, WC_SS(%eax)
- movw %cs, WC_CS(%eax)
- movw %ds, WC_DS(%eax)
- movw %es, WC_ES(%eax)
- movw %fs, WC_FS(%eax)
- movw %gs, WC_GS(%eax)
-
- pushfl
- popl WC_EFLAGS(%eax)
-
- pushl %gs:CPU_ID / save current cpu id
- popl WC_CPU_ID(%eax)
-
- wbinvd / flush the cache
- mfence
-
- movl $1, %eax / at suspend return 1
- ret
-
- SET_SIZE(wc_save_context)
-
- #endif /* __amd64 */
-
- #endif /* lint */
-
-
/*
* Our assumptions:
* - We are running in real mode.
* - Interrupts are disabled.
*
--- 159,169 ----
*** 242,265 ****
* - We load the default TSS into the hardware task register.
* - We restore registers
* - We return to original caller (a la setjmp)
*/
- #if defined(lint) || defined(__lint)
-
- void
- wc_rm_start(void)
- {}
-
- void
- wc_rm_end(void)
- {}
-
- #else /* lint */
-
- #if defined(__amd64)
-
ENTRY_NP(wc_rm_start)
/*
* For the Sun Studio 10 assembler we needed to do a .code32 and
* mentally invert the meaning of the addr16 and data16 prefixes to
--- 176,185 ----
*** 869,1169 ****
SET_SIZE(asmspin)
.globl wc_rm_end
wc_rm_end:
nop
-
- #elif defined(__i386)
-
- ENTRY_NP(wc_rm_start)
-
- /entry: jmp entry / stop here for HDT
-
- cli
- movw %cs, %ax
- movw %ax, %ds / establish ds ...
- movw %ax, %ss / ... and ss:esp
- D16 movl $WC_STKSTART, %esp
-
- #if LED
- D16 movl $WC_LED, %edx
- D16 movb $0xd1, %al
- outb (%dx)
- #endif
-
- #if SERIAL
- D16 movl $WC_COM, %edx
- D16 movb $0x61, %al
- outb (%dx)
- #endif
-
-
- D16 call vgainit
- D16 call kbdinit
- D16 call cominit
-
- #if LED
- D16 movl $WC_LED, %edx
- D16 movb $0xd2, %al
- outb (%dx)
- #endif
-
- #if SERIAL
- D16 movl $WC_COM, %edx
- D16 movb $0x62, %al
- outb (%dx)
- #endif
-
- D16 A16 movl $WC_CPU, %ebx / base add of wc_cpu_t
-
- #if LED
- D16 movb $0xd3, %al
- outb $WC_LED
- #endif
-
- #if SERIAL
- D16 movl $WC_COM, %edx
- D16 movb $0x63, %al
- outb (%dx)
- #endif
-
- D16 A16 movl %cs:WC_DS(%ebx), %edx / %ds post prot/paging transit
-
- #if LED
- D16 movb $0xd4, %al
- outb $WC_LED
- #endif
-
- D16 A16 lgdt %cs:WC_GDT(%ebx) / restore gdt and idtr
- D16 A16 lidt %cs:WC_IDT(%ebx)
-
- #if LED
- D16 movb $0xd5, %al
- outb $WC_LED
- #endif
-
- D16 A16 movl %cs:WC_CR4(%ebx), %eax / restore cr4
- D16 andl $_BITNOT(CR4_PGE), %eax / don't set Global Enable yet
- movl %eax, %cr4
-
- #if LED
- D16 movb $0xd6, %al
- outb $WC_LED
- #endif
-
- D16 A16 movl %cs:WC_CR3(%ebx), %eax / set PDPT
- movl %eax, %cr3
-
- #if LED
- D16 movb $0xd7, %al
- outb $WC_LED
- #endif
-
- D16 A16 movl %cs:WC_CR0(%ebx), %eax / enable prot/paging, etc.
- movl %eax, %cr0
-
- #if LED
- D16 movb $0xd8, %al
- outb $WC_LED
- #endif
-
- D16 A16 movl %cs:WC_VIRTADDR(%ebx), %ebx / virtaddr of wc_cpu_t
-
- #if LED
- D16 movb $0xd9, %al
- outb $WC_LED
- #endif
-
- #if LED
- D16 movb $0xda, %al
- outb $WC_LED
- #endif
-
- jmp flush / flush prefetch queue
- flush:
- D16 pushl $KCS_SEL
- D16 pushl $kernel_wc_code
- D16 lret / re-appear at kernel_wc_code
-
-
- /*
- * Support routine to re-initialize VGA subsystem
- */
- vgainit:
- D16 ret
-
- /*
- * Support routine to re-initialize keyboard (which is USB - help!)
- */
- kbdinit:
- D16 ret
-
- /*
- * Support routine to re-initialize COM ports to something sane for debug output
- */
- cominit:
- #if DEBUG
- /*
- * on debug kernels we need to initialize COM1 & COM2 here, so that
- * we can get debug output before the asy driver has resumed
- */
-
- / select COM1
- D16 movl $_CONST(COM1+LCR), %edx
- D16 movb $DLAB, %al / divisor latch
- outb (%dx)
-
- D16 movl $_CONST(COM1+DLL), %edx / divisor latch lsb
- D16 movb $B9600L, %al / divisor latch
- outb (%dx)
-
- D16 movl $_CONST(COM1+DLH), %edx / divisor latch hsb
- D16 movb $B9600H, %al / divisor latch
- outb (%dx)
-
- D16 movl $_CONST(COM1+LCR), %edx / select COM1
- D16 movb $_CONST(STOP1|BITS8), %al / 1 stop bit, 8bit word len
- outb (%dx)
-
- D16 movl $_CONST(COM1+MCR), %edx / select COM1
- D16 movb $_CONST(RTS|DTR), %al / 1 stop bit, 8bit word len
- outb (%dx)
-
- / select COM2
- D16 movl $_CONST(COM2+LCR), %edx
- D16 movb $DLAB, %al / divisor latch
- outb (%dx)
-
- D16 movl $_CONST(COM2+DLL), %edx / divisor latch lsb
- D16 movb $B9600L, %al / divisor latch
- outb (%dx)
-
- D16 movl $_CONST(COM2+DLH), %edx / divisor latch hsb
- D16 movb $B9600H, %al / divisor latch
- outb (%dx)
-
- D16 movl $_CONST(COM2+LCR), %edx / select COM1
- D16 movb $_CONST(STOP1|BITS8), %al / 1 stop bit, 8bit word len
- outb (%dx)
-
- D16 movl $_CONST(COM2+MCR), %edx / select COM1
- D16 movb $_CONST(RTS|DTR), %al / 1 stop bit, 8bit word len
- outb (%dx)
- #endif /* DEBUG */
-
- D16 ret
-
- .globl wc_rm_end
- wc_rm_end:
- nop
-
- .globl kernel_wc_code
- kernel_wc_code:
- / At this point we are with kernel's cs and proper eip.
- / We will be executing not from the copy in real mode platter,
- / but from the original code where boot loaded us.
- / By this time GDT and IDT are loaded as is cr0, cr3 and cr4.
- / %ebx is wc_cpu
- / %dx is our ds
-
- #if LED
- D16 movb $0xdb, %al
- outb $WC_LED
- #endif
-
- / got here OK
-
- movw %dx, %ds / $KDS_SEL
-
- #if LED
- movb $0xdc, %al
- outb $WC_LED
- #endif
-
- /*
- * Before proceeding, enable usage of the page table NX bit if
- * that's how the page tables are set up.
- */
- bt $X86FSET_NX, x86_featureset
- jnc 1f
- movl $MSR_AMD_EFER, %ecx
- rdmsr
- orl $AMD_EFER_NXE, %eax
- wrmsr
- 1:
-
- movl WC_CR4(%ebx), %eax / restore full cr4 (with Global Enable)
- movl %eax, %cr4
-
-
- lldt WC_LDT(%ebx) / $LDT_SEL
-
- movzwl WC_TR(%ebx), %eax / clear TSS busy bit
- addl WC_GDT+2(%ebx), %eax
- andl $_BITNOT(0x200), 4(%eax)
- ltr WC_TR(%ebx) / $UTSS_SEL
-
- movw WC_SS(%ebx), %ss / restore segment registers
- movw WC_ES(%ebx), %es
- movw WC_FS(%ebx), %fs
- movw WC_GS(%ebx), %gs
-
- /*
- * set the stack pointer to point into the identity mapped page
- * temporarily, so we can make function calls
- */
- .globl rm_platter_va
- movl rm_platter_va, %eax
- movl $WC_STKSTART, %esp
- addl %eax, %esp
- movl %esp, %ebp
-
- /*
- * if we are not running on the boot CPU restore stack contents by
- * calling i_cpr_restore_stack(curthread, save_stack);
- */
- call i_cpr_bootcpuid
- cmpl %eax, WC_CPU_ID(%ebx)
- je 2f
-
- pushl WC_SAVED_STACK(%ebx)
- pushl %gs:CPU_THREAD
- call i_cpr_restore_stack
- addl $0x10, %esp
- 2:
-
- movl WC_ESP(%ebx), %esp
- movl %esp, %ebp
-
- movl WC_RETADDR(%ebx), %eax / return to caller of wc_save_context
- movl %eax, (%esp)
-
- /*
- * APIC initialization, skip iff function pointer is NULL
- */
- cmpl $0, ap_mlsetup
- je 3f
- call *ap_mlsetup
- 3:
-
- call *cpr_start_cpu_func
-
- pushl WC_EFLAGS(%ebx) / restore flags
- popfl
-
- movl WC_EDI(%ebx), %edi / restore general registers
- movl WC_ESI(%ebx), %esi
- movl WC_EBP(%ebx), %ebp
- movl WC_EBX(%ebx), %ebx
-
- /exit: jmp exit / stop here for HDT
-
- xorl %eax, %eax / at wakeup return 0
- ret
-
- SET_SIZE(wc_rm_start)
-
-
- #endif /* defined(__amd64) */
-
- #endif /* lint */
--- 789,794 ----