Module Name: src Committed By: maxv Date: Wed May 11 17:48:05 UTC 2016
Modified Files: src/sys/arch/i386/i386: locore.S Log Message: Switch to C-style comments, and reduce a little the diff between i386 and amd64. No functional changes. To generate a diff of this commit: cvs rdiff -u -r1.114 -r1.115 src/sys/arch/i386/i386/locore.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/i386/i386/locore.S diff -u src/sys/arch/i386/i386/locore.S:1.114 src/sys/arch/i386/i386/locore.S:1.115 --- src/sys/arch/i386/i386/locore.S:1.114 Sun Aug 30 01:46:03 2015 +++ src/sys/arch/i386/i386/locore.S Wed May 11 17:48:05 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.114 2015/08/30 01:46:03 uebayasi Exp $ */ +/* $NetBSD: locore.S,v 1.115 2016/05/11 17:48:05 maxv Exp $ */ /* * Copyright-o-rama! @@ -64,7 +64,6 @@ * POSSIBILITY OF SUCH DAMAGE. */ - /*- * Copyright (c) 1998, 2000, 2004, 2006, 2007, 2009 The NetBSD Foundation, Inc. * All rights reserved. @@ -129,7 +128,7 @@ */ #include <machine/asm.h> -__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.114 2015/08/30 01:46:03 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.115 2016/05/11 17:48:05 maxv Exp $"); #include "opt_compat_oldboot.h" #include "opt_copy_symtab.h" @@ -159,7 +158,6 @@ __KERNEL_RCSID(0, "$NetBSD: locore.S,v 1 #include <machine/multiboot.h> #endif -/* XXX temporary kluge; these should not be here */ /* Get definitions for IOM_BEGIN, IOM_END, and IOM_SIZE */ #include <dev/isa/isareg.h> @@ -170,6 +168,35 @@ __KERNEL_RCSID(0, "$NetBSD: locore.S,v 1 #endif /* XEN */ #define RELOC(x) _RELOC(_C_LABEL(x)) +#ifndef PAE +#define PROC0_PDIR_OFF 0 +#else +#define PROC0_L3_OFF 0 +#define PROC0_PDIR_OFF 1 * PAGE_SIZE +#endif + +#define PROC0_STK_OFF (PROC0_PDIR_OFF + PDP_SIZE * PAGE_SIZE) +#define PROC0_PTP1_OFF (PROC0_STK_OFF + UPAGES * PAGE_SIZE) + +/* + * fillkpt - Fill in a kernel page table + * eax = pte (page frame | control | status) + * ebx = page table address + * ecx = number of pages to map + * + * For PAE, each entry is 8 bytes long: we must set the 4 upper bytes to 0. + * This is done by the first instruction of fillkpt. In the non-PAE case, this + * instruction just clears the page table entry. + */ + +#define fillkpt \ +1: movl $0,(PDE_SIZE-4)(%ebx) ; /* upper 32 bits: 0 */ \ + movl %eax,(%ebx) ; /* store phys addr */ \ + addl $PDE_SIZE,%ebx ; /* next PTE/PDE */ \ + addl $PAGE_SIZE,%eax ; /* next phys page */ \ + loop 1b ; + + #ifdef XEN /* * Xen guest identifier and loader selection @@ -242,30 +269,32 @@ LABEL(lapic_tpr) END(lapic_tpr) #endif .type _C_LABEL(cputype), @object -LABEL(cputype) .long 0 # are we 80486, Pentium, or.. +LABEL(cputype) .long 0 /* are we 80486, Pentium, or.. */ END(cputype) .type _C_LABEL(cpuid_level), @object LABEL(cpuid_level) .long 0 END(cpuid_level) .type _C_LABEL(atdevbase), @object -LABEL(atdevbase) .long 0 # location of start of iomem in virtual +LABEL(atdevbase) .long 0 /* location of start of iomem in virt */ END(atdevbase) .type _C_LABEL(lwp0uarea), @object LABEL(lwp0uarea) .long 0 END(lwp0uarea) .type _C_LABEL(PDPpaddr), @object -LABEL(PDPpaddr) .long 0 # paddr of PDP, for libkvm +LABEL(PDPpaddr) .long 0 /* paddr of PDP, for libkvm */ END(PDPpaddr) .type _C_LABEL(tablesize), @object _C_LABEL(tablesize): .long 0 END(tablesize) + + /* Space for the temporary stack */ .size tmpstk, tmpstk - . - .space 512 + .space 512 tmpstk: #ifdef XEN - .align PAGE_SIZE, 0x0 # Align on page boundary + .align PAGE_SIZE, 0x0 /* Align on page boundary */ LABEL(tmpgdt) - .space PAGE_SIZE # Xen expects a page + .space PAGE_SIZE /* Xen expects a page */ END(tmpgdt) #endif /* XEN */ @@ -275,7 +304,10 @@ END(tmpgdt) ENTRY(start) #ifndef XEN - movw $0x1234,0x472 # warm boot + + /* Warm boot */ + movw $0x1234,0x472 + #if defined(MULTIBOOT) jmp 1f @@ -299,7 +331,7 @@ _C_LABEL(Multiboot_Header): * space to process it later -- after we are relocated. It will * be safer to run complex C code than doing it at this point. */ - pushl %ebx # Address of Multiboot information + pushl %ebx /* Address of Multiboot information */ call _C_LABEL(multiboot_pre_reloc) addl $4,%esp jmp 2f @@ -312,7 +344,7 @@ _C_LABEL(Multiboot_Header): * (boothowto, [bootdev], bootinfo, esym, biosextmem, biosbasemem), * 4 bytes each. */ - addl $4,%esp # Discard return address to boot loader + addl $4,%esp /* Discard return address to boot loader */ call _C_LABEL(native_loader) addl $24,%esp @@ -404,30 +436,30 @@ is486: movl $CPU_486,RELOC(cputype) popfl jmp 2f trycyrix486: - movl $CPU_6x86,RELOC(cputype) # set CPU type + movl $CPU_6x86,RELOC(cputype) /* set CPU type */ /* * Check for Cyrix 486 CPU by seeing if the flags change during a * divide. This is documented in the Cx486SLC/e SMM Programmer's * Guide. */ xorl %edx,%edx - cmpl %edx,%edx # set flags to known state + cmpl %edx,%edx /* set flags to known state */ pushfl - popl %ecx # store flags in ecx + popl %ecx /* store flags in ecx */ movl $-1,%eax movl $4,%ebx - divl %ebx # do a long division + divl %ebx /* do a long division */ pushfl popl %eax - xorl %ecx,%eax # are the flags different? - testl $0x8d5,%eax # only check C|PF|AF|Z|N|V - jne 2f # yes; must be Cyrix 6x86 CPU - movl $CPU_486DLC,RELOC(cputype) # set CPU type + xorl %ecx,%eax /* are the flags different? */ + testl $0x8d5,%eax /* only check C|PF|AF|Z|N|V */ + jne 2f /* yes; must be Cyrix 6x86 CPU */ + movl $CPU_486DLC,RELOC(cputype) /* set CPU type */ #ifndef CYRIX_CACHE_WORKS /* Disable caching of the ISA hole only. */ invd - movb $CCR0,%al # Configuration Register index (CCR0) + movb $CCR0,%al /* Configuration Register index (CCR0) */ outb %al,$0x22 inb $0x23,%al orb $(CCR0_NC1|CCR0_BARB),%al @@ -439,8 +471,8 @@ trycyrix486: invd #else /* CYRIX_CACHE_WORKS */ /* Set cache parameters */ - invd # Start with guaranteed clean cache - movb $CCR0,%al # Configuration Register index (CCR0) + invd /* Start with guaranteed clean cache */ + movb $CCR0,%al /* Configuration Register index (CCR0) */ outb %al,$0x22 inb $0x23,%al andb $~CCR0_NC0,%al @@ -498,10 +530,11 @@ try586: /* Use the `cpuid' instruction. * The boot program should check: * text+data <= &stack_variable - more_space_for_stack * text+data+bss+pad+space_for_page_tables <= end_of_memory - * Oops, the gdt is in the carcass of the boot program so clearing + * + * XXX: the gdt is in the carcass of the boot program so clearing * the rest of memory is still not possible. */ - movl $_RELOC(tmpstk),%esp # bootstrap stack end location + movl $_RELOC(tmpstk),%esp /* * Virtual address space of kernel, without PAE. The page dir is 1 page long. @@ -514,33 +547,6 @@ try586: /* Use the `cpuid' instruction. * text | data | bss | [syms] | [blobs] | L3 | page dir | proc0 kstack | L1 ptp * 0 1 5 6 7 */ -#ifndef PAE -#define PROC0_PDIR_OFF 0 -#else -#define PROC0_L3_OFF 0 -#define PROC0_PDIR_OFF 1 * PAGE_SIZE -#endif - -#define PROC0_STK_OFF (PROC0_PDIR_OFF + PDP_SIZE * PAGE_SIZE) -#define PROC0_PTP1_OFF (PROC0_STK_OFF + UPAGES * PAGE_SIZE) - -/* - * fillkpt - Fill in a kernel page table - * eax = pte (page frame | control | status) - * ebx = page table address - * ecx = number of pages to map - * - * For PAE, each entry is 8 bytes long: we must set the 4 upper bytes to 0. - * This is done by the first instruction of fillkpt. In the non-PAE case, this - * instruction just clears the page table entry. - */ - -#define fillkpt \ -1: movl $0,(PDE_SIZE-4)(%ebx) ; /* clear bits */ \ - movl %eax,(%ebx) ; /* store phys addr */ \ - addl $PDE_SIZE,%ebx ; /* next pte/pde */ \ - addl $PAGE_SIZE,%eax ; /* next phys page */ \ - loop 1b ; /* Find end of kernel image. */ movl $RELOC(end),%edi @@ -564,7 +570,7 @@ try586: /* Use the `cpuid' instruction. 1: /* Compute sizes */ movl %edi,%esi - addl $PGOFSET,%esi # page align up + addl $PGOFSET,%esi andl $~PGOFSET,%esi /* nkptp[1] = (esi + ~L2_FRAME) >> L2_SHIFT + 1; */ @@ -635,14 +641,14 @@ try586: /* Use the `cpuid' instruction. /* Map the data, BSS, and bootstrap tables read-write. */ leal (PG_V|PG_KW)(%edx),%eax movl RELOC(tablesize),%ecx - addl %esi,%ecx # end of tables - subl %edx,%ecx # subtract end of text + addl %esi,%ecx /* end of tables */ + subl %edx,%ecx /* subtract end of text */ shrl $PGSHIFT,%ecx fillkpt /* Map ISA I/O mem (later atdevbase) */ - movl $(IOM_BEGIN|PG_V|PG_KW/*|PG_N*/),%eax # having these bits set - movl $(IOM_SIZE>>PGSHIFT),%ecx # for this many pte s, + movl $(IOM_BEGIN|PG_V|PG_KW/*|PG_N*/),%eax + movl $(IOM_SIZE>>PGSHIFT),%ecx fillkpt /* @@ -691,18 +697,17 @@ try586: /* Use the `cpuid' instruction. * Startup checklist: * 1. Load %cr3 with pointer to PDIR (or L3 PD page for PAE). */ - movl %esi,%eax # phys address of ptd in proc 0 - movl %eax,%cr3 # load ptd addr into mmu + movl %esi,%eax /* phys address of PTD in proc0 */ + movl %eax,%cr3 /* load PTD addr into MMU */ /* * 2. Enable paging and the rest of it. */ - movl %cr0,%eax # get control word - # enable paging & NPX + movl %cr0,%eax orl $(CR0_PE|CR0_PG|CR0_NE|CR0_TS|CR0_MP|CR0_WP|CR0_AM),%eax - movl %eax,%cr0 # and page NOW! + movl %eax,%cr0 - pushl $begin # jump to high mem + pushl $begin /* jump to high mem */ ret begin: @@ -712,9 +717,9 @@ begin: * memory, remove it. */ movl _C_LABEL(nkptp)+1*4,%ecx - leal (PROC0_PDIR_OFF)(%esi),%ebx # old, phys address of PDIR - addl $(KERNBASE), %ebx # new, virtual address of PDIR -1: movl $0,(PDE_SIZE-4)(%ebx) # Upper bits (for PAE) + leal (PROC0_PDIR_OFF)(%esi),%ebx /* old, phys address of PDIR */ + addl $(KERNBASE), %ebx /* new, virt address of PDIR */ +1: movl $0,(PDE_SIZE-4)(%ebx) /* upper bits (for PAE) */ movl $0,(%ebx) addl $PDE_SIZE,%ebx loop 1b @@ -729,8 +734,8 @@ begin: leal (PROC0_STK_OFF+KERNBASE)(%esi),%eax movl %eax,_C_LABEL(lwp0uarea) leal (USPACE-FRAMESIZE)(%eax),%esp - movl %esi,PCB_CR3(%eax) # pcb->pcb_cr3 - xorl %ebp,%ebp # mark end of frames + movl %esi,PCB_CR3(%eax) /* pcb->pcb_cr3 */ + xorl %ebp,%ebp /* mark end of frames */ #if defined(MULTIBOOT) /* It is now safe to parse the Multiboot information structure @@ -740,21 +745,21 @@ begin: call _C_LABEL(multiboot_post_reloc) #endif - subl $NGDT*8, %esp # space for temporary gdt + subl $NGDT*8, %esp /* space for temporary gdt */ pushl %esp call _C_LABEL(initgdt) addl $4,%esp movl _C_LABEL(tablesize),%eax - addl %esi,%eax # skip past stack and page tables + addl %esi,%eax /* skip past stack and page tables */ #ifdef PAE - pushl $0 # init386() expects a 64 bits paddr_t with PAE + pushl $0 /* init386() expects a 64 bits paddr_t with PAE */ #endif pushl %eax - call _C_LABEL(init386) # wire 386 chip for unix operation - addl $PDE_SIZE,%esp # pop paddr_t - addl $NGDT*8,%esp # pop temporary gdt + call _C_LABEL(init386) /* wire 386 chip for unix operation */ + addl $PDE_SIZE,%esp /* pop paddr_t */ + addl $NGDT*8,%esp /* pop temporary gdt */ #ifdef SAFARI_FIFO_HACK movb $5,%al @@ -781,8 +786,8 @@ begin: popfl cld - movl %esp, %ebx # save start of available space - movl $_RELOC(tmpstk),%esp # bootstrap stack end location + movl %esp, %ebx /* save start of available space */ + movl $_RELOC(tmpstk),%esp /* bootstrap stack end location */ /* Clear BSS. */ xorl %eax,%eax @@ -813,7 +818,7 @@ begin: * done using it. */ movl $RELOC(tmpgdt), %eax - pushl %eax # start of temporary gdt + pushl %eax /* start of temporary gdt */ call _C_LABEL(initgdt) addl $4,%esp @@ -827,17 +832,17 @@ begin: /* Set up bootstrap stack. */ leal (USPACE-FRAMESIZE)(%eax),%esp - xorl %ebp,%ebp # mark end of frames + xorl %ebp,%ebp /* mark end of frames */ addl $USPACE, %esi - subl $KERNBASE, %esi #init386 want a physical address + subl $KERNBASE, %esi /* init386 wants a physical address */ #ifdef PAE - pushl $0 # init386() expects a 64 bits paddr_t with PAE + pushl $0 /* init386() expects a 64 bits paddr_t with PAE */ #endif pushl %esi - call _C_LABEL(init386) # wire 386 chip for unix operation - addl $PDE_SIZE,%esp # pop paddr_t + call _C_LABEL(init386) /* wire 386 chip for unix operation */ + addl $PDE_SIZE,%esp /* pop paddr_t */ call _C_LABEL(main) #endif /* XEN */ END(start) @@ -911,13 +916,13 @@ NENTRY(sigcode) * Handler has returned here as if we called it. The sigcontext * is on the stack after the 3 args "we" pushed. */ - leal 12(%esp),%eax # get pointer to sigcontext - movl %eax,4(%esp) # put it in the argument slot - # fake return address already there + leal 12(%esp),%eax /* get pointer to sigcontext */ + movl %eax,4(%esp) /* put it in the argument slot */ + /* fake return address already there */ movl $SYS_compat_16___sigreturn14,%eax - int $0x80 # enter kernel with args on stack + int $0x80 /* enter kernel with args on stack */ movl $SYS_exit,%eax - int $0x80 # exit if sigreturn fails + int $0x80 /* exit if sigreturn fails */ .globl _C_LABEL(esigcode) _C_LABEL(esigcode): END(sigcode) @@ -929,14 +934,14 @@ END(sigcode) */ ENTRY(setjmp) movl 4(%esp),%eax - movl %ebx,(%eax) # save ebx - movl %esp,4(%eax) # save esp - movl %ebp,8(%eax) # save ebp - movl %esi,12(%eax) # save esi - movl %edi,16(%eax) # save edi - movl (%esp),%edx # get rta - movl %edx,20(%eax) # save eip - xorl %eax,%eax # return 0 + movl %ebx,(%eax) /* save ebx */ + movl %esp,4(%eax) /* save esp */ + movl %ebp,8(%eax) /* save ebp */ + movl %esi,12(%eax) /* save esi */ + movl %edi,16(%eax) /* save edi */ + movl (%esp),%edx /* get rta */ + movl %edx,20(%eax) /* save eip */ + xorl %eax,%eax /* return 0 */ ret END(setjmp) @@ -947,14 +952,14 @@ END(setjmp) */ ENTRY(longjmp) movl 4(%esp),%eax - movl (%eax),%ebx # restore ebx - movl 4(%eax),%esp # restore esp - movl 8(%eax),%ebp # restore ebp - movl 12(%eax),%esi # restore esi - movl 16(%eax),%edi # restore edi - movl 20(%eax),%edx # get rta - movl %edx,(%esp) # put in return frame - movl $1,%eax # return 1 + movl (%eax),%ebx /* restore ebx */ + movl 4(%eax),%esp /* restore esp */ + movl 8(%eax),%ebp /* restore ebp */ + movl 12(%eax),%esi /* restore esi */ + movl 16(%eax),%edi /* restore edi */ + movl 20(%eax),%edx /* get rta */ + movl %edx,(%esp) /* put in return frame */ + movl $1,%eax /* return 1 */ ret END(longjmp) @@ -964,13 +969,13 @@ END(longjmp) * Mimic cpu_switchto() for postmortem debugging. */ ENTRY(dumpsys) - pushl %ebx # set up fake switchframe - pushl %esi # and save context - pushl %edi + pushl %ebx /* set up fake switchframe */ + pushl %esi /* and save context */ + pushl %edi movl %esp,_C_LABEL(dumppcb)+PCB_ESP movl %ebp,_C_LABEL(dumppcb)+PCB_EBP - call _C_LABEL(dodumpsys) # dump! - addl $(3*4), %esp # unwind switchframe + call _C_LABEL(dodumpsys) /* dump! */ + addl $(3*4), %esp /* unwind switchframe */ ret END(dumpsys) @@ -1001,9 +1006,9 @@ ENTRY(cpu_switchto) 0: #endif - movl 16(%esp),%esi # oldlwp - movl 20(%esp),%edi # newlwp - movl 24(%esp),%edx # returning + movl 16(%esp),%esi /* oldlwp */ + movl 20(%esp),%edi /* newlwp */ + movl 24(%esp),%edx /* returning */ testl %esi,%esi jz 1f @@ -1138,7 +1143,7 @@ END(cpu_switchto) * Update pcb, saving current processor state. */ ENTRY(savectx) - movl 4(%esp),%edx # edx = pcb + movl 4(%esp),%edx /* edx = pcb */ movl %esp,PCB_ESP(%edx) movl %ebp,PCB_EBP(%edx) ret @@ -1152,12 +1157,12 @@ END(savectx) IDTVEC(osyscall) #ifndef XEN /* XXX we are in trouble! interrupts be off here. */ - cli # must be first instruction + cli /* must be first instruction */ #endif - pushfl # set eflags in trap frame + pushfl /* set eflags in trap frame */ popl 8(%esp) - orl $PSL_I,8(%esp) # re-enable ints on return to user - pushl $7 # size of instruction for restart + orl $PSL_I,8(%esp) /* re-enable ints on return to user */ + pushl $7 /* size of instruction for restart */ jmp syscall1 IDTVEC_END(osyscall) @@ -1167,9 +1172,9 @@ IDTVEC_END(osyscall) * Trap gate entry for syscall */ IDTVEC(syscall) - pushl $2 # size of instruction for restart + pushl $2 /* size of instruction for restart */ syscall1: - pushl $T_ASTFLT # trap # for doing ASTs + pushl $T_ASTFLT /* trap # for doing ASTs */ INTRENTRY STI(%eax) #ifdef DIAGNOSTIC @@ -1184,13 +1189,13 @@ syscall1: #endif 1: #endif /* DIAGNOSTIC */ - addl $1,CPUVAR(NSYSCALL) # count it atomically - adcl $0,CPUVAR(NSYSCALL)+4 # count it atomically + addl $1,CPUVAR(NSYSCALL) /* count it atomically */ + adcl $0,CPUVAR(NSYSCALL)+4 /* count it atomically */ movl CPUVAR(CURLWP),%edi movl L_PROC(%edi),%edx - movl %esp,L_MD_REGS(%edi) # save pointer to frame + movl %esp,L_MD_REGS(%edi) /* save pointer to frame */ pushl %esp - call *P_MD_SYSCALL(%edx) # get pointer to syscall() function + call *P_MD_SYSCALL(%edx) /* get pointer to syscall() function */ addl $4,%esp .Lsyscall_checkast: /* Check for ASTs on exit to user mode. */ @@ -1207,17 +1212,17 @@ syscall1: /* process pending interrupts */ CLI(%eax) movl CPUVAR(ILEVEL), %ebx - movl $.Lsyscall_resume, %esi # address to resume loop at + movl $.Lsyscall_resume, %esi /* address to resume loop at */ .Lsyscall_resume: - movl %ebx,%eax # get cpl + movl %ebx,%eax /* get cpl */ movl CPUVAR(IUNMASK)(,%eax,4),%eax - andl CPUVAR(IPENDING),%eax # any non-masked bits left? + andl CPUVAR(IPENDING),%eax /* any non-masked bits left? */ jz 17f bsrl %eax,%eax btrl %eax,CPUVAR(IPENDING) movl CPUVAR(ISOURCES)(,%eax,4),%eax jmp *IS_RESUME(%eax) -17: movl %ebx, CPUVAR(ILEVEL) #restore cpl +17: movl %ebx, CPUVAR(ILEVEL) /* restore cpl */ jmp .Lsyscall_checkast 14: #endif /* XEN */ @@ -1256,8 +1261,8 @@ syscall1: IDTVEC_END(syscall) IDTVEC(svr4_fasttrap) - pushl $2 # size of instruction for restart - pushl $T_ASTFLT # trap # for doing ASTs + pushl $2 /* size of instruction for restart */ + pushl $T_ASTFLT /* trap # for doing ASTs */ INTRENTRY STI(%eax) pushl $RW_READER @@ -1270,7 +1275,7 @@ IDTVEC(svr4_fasttrap) addl $4,%esp 2: /* Check for ASTs on exit to user mode. */ cli - CHECK_ASTPENDING(%eax) + CHECK_ASTPENDING(%eax) je 1f /* Always returning to user mode here. */ CLEAR_ASTPENDING(%eax) @@ -1294,12 +1299,12 @@ IDTVEC(svr4_fasttrap) * Anything 120MHz or above is fine. */ NENTRY(npx586bug1) - fildl 4(%esp) # x - fildl 8(%esp) # y + fildl 4(%esp) /* x */ + fildl 8(%esp) /* y */ fld %st(1) - fdiv %st(1),%st # x/y - fmulp %st,%st(1) # (x/y)*y - fsubrp %st,%st(1) # x-(x/y)*y + fdiv %st(1),%st /* x/y */ + fmulp %st,%st(1) /* (x/y)*y */ + fsubrp %st,%st(1) /* x-(x/y)*y */ pushl $0 fistpl (%esp) popl %eax