Annotation of sys/arch/i386/i386/mptramp.s, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: mptramp.s,v 1.8 2007/02/20 21:15:01 tom Exp $ */
! 2:
! 3: /*-
! 4: * Copyright (c) 2000 The NetBSD Foundation, Inc.
! 5: * All rights reserved.
! 6: *
! 7: * This code is derived from software contributed to The NetBSD Foundation
! 8: * by RedBack Networks Inc.
! 9: *
! 10: * Author: Bill Sommerfeld
! 11: *
! 12: * Redistribution and use in source and binary forms, with or without
! 13: * modification, are permitted provided that the following conditions
! 14: * are met:
! 15: * 1. Redistributions of source code must retain the above copyright
! 16: * notice, this list of conditions and the following disclaimer.
! 17: * 2. Redistributions in binary form must reproduce the above copyright
! 18: * notice, this list of conditions and the following disclaimer in the
! 19: * documentation and/or other materials provided with the distribution.
! 20: * 3. All advertising materials mentioning features or use of this software
! 21: * must display the following acknowledgement:
! 22: * This product includes software developed by the NetBSD
! 23: * Foundation, Inc. and its contributors.
! 24: * 4. Neither the name of The NetBSD Foundation nor the names of its
! 25: * contributors may be used to endorse or promote products derived
! 26: * from this software without specific prior written permission.
! 27: *
! 28: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
! 29: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
! 30: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! 31: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
! 32: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 33: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 34: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 35: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 36: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 37: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 38: * POSSIBILITY OF SUCH DAMAGE.
! 39: */
! 40:
! 41: /*
! 42: * Copyright (c) 1999 Stefan Grefen
! 43: *
! 44: * Redistribution and use in source and binary forms, with or without
! 45: * modification, are permitted provided that the following conditions
! 46: * are met:
! 47: * 1. Redistributions of source code must retain the above copyright
! 48: * notice, this list of conditions and the following disclaimer.
! 49: * 2. Redistributions in binary form must reproduce the above copyright
! 50: * notice, this list of conditions and the following disclaimer in the
! 51: * documentation and/or other materials provided with the distribution.
! 52: * 3. All advertising materials mentioning features or use of this software
! 53: * must display the following acknowledgement:
! 54: * This product includes software developed by the NetBSD
! 55: * Foundation, Inc. and its contributors.
! 56: * 4. Neither the name of The NetBSD Foundation nor the names of its
! 57: * contributors may be used to endorse or promote products derived
! 58: * from this software without specific prior written permission.
! 59: *
! 60: * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
! 61: * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 62: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 63: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR AND CONTRIBUTORS BE LIABLE
! 64: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 65: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 66: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 67: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 68: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 69: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 70: * SUCH DAMAGE.
! 71: */
! 72: /*
! 73: * MP startup ...
! 74: * the stuff from cpu_spinup_trampoline to mp_startup
! 75: * is copied into the first 640 KB
! 76: *
! 77: * We startup the processors now when the kthreads become ready.
! 78: * The steps are:
! 79: * 1) Get the processors running kernel-code from a special
! 80: * page-table and stack page, do chip identification.
! 81: * 2) halt the processors waiting for them to be enabled
! 82: * by a idle-thread
! 83: */
! 84:
! 85: #include "assym.h"
! 86: #include <machine/param.h>
! 87: #include <machine/asm.h>
! 88: #include <machine/specialreg.h>
! 89: #include <machine/segments.h>
! 90: #include <machine/gdt.h>
! 91: #include <machine/mpbiosvar.h>
! 92: #include <machine/i82489reg.h>
! 93:
! 94: #define GDTE(a,b) .byte 0xff,0xff,0x0,0x0,0x0,a,b,0x0
! 95: #define _RELOC(x) ((x) - KERNBASE)
! 96: #define RELOC(x) _RELOC(_C_LABEL(x))
! 97:
! 98: #define _TRMP_LABEL(a) a = . - _C_LABEL(cpu_spinup_trampoline) + MP_TRAMPOLINE
! 99:
! 100: /*
! 101: * Debug code to stop aux. processors in various stages based on the
! 102: * value in cpu_trace.
! 103: *
! 104: * %edi points at cpu_trace; cpu_trace[0] is the "hold point";
! 105: * cpu_trace[1] is the point which the cpu has reached.
! 106: * cpu_trace[2] is the last value stored by HALTT.
! 107: */
! 108:
! 109:
! 110: #ifdef MPDEBUG
! 111: #define HALT(x) 1: movl (%edi),%ebx;cmpl $ x,%ebx ; jle 1b ; movl $x,4(%edi)
! 112: #define HALTT(x,y) movl y,8(%edi); HALT(x)
! 113: #else
! 114: #define HALT(x) /**/
! 115: #define HALTT(x,y) /**/
! 116: #endif
! 117:
! 118: .globl _C_LABEL(cpu),_C_LABEL(cpu_id),_C_LABEL(cpu_vendor)
! 119: .globl _C_LABEL(cpuid_level),_C_LABEL(cpu_feature)
! 120:
! 121: .global _C_LABEL(cpu_spinup_trampoline)
! 122: .global _C_LABEL(cpu_spinup_trampoline_end)
! 123: .global _C_LABEL(cpu_hatch)
! 124: .global _C_LABEL(mp_pdirpa)
! 125: .global _C_LABEL(gdt), _C_LABEL(local_apic)
! 126:
! 127: .text
! 128: .align 4,0x0
! 129: .code16
! 130: _C_LABEL(cpu_spinup_trampoline):
! 131: cli
! 132: xorw %ax, %ax
! 133: movw %ax, %ds
! 134: movw %ax, %es
! 135: movw %ax, %ss
! 136: data32 addr32 lgdt (gdt_desc) # load flat descriptor table
! 137: movl %cr0, %eax # get cr0
! 138: orl $0x1, %eax # enable protected mode
! 139: movl %eax, %cr0 # doit
! 140: ljmp $0x8, $mp_startup
! 141:
! 142: _TRMP_LABEL(mp_startup)
! 143: .code32
! 144:
! 145: movl $0x10, %eax # data segment
! 146: movw %ax, %ds
! 147: movw %ax, %ss
! 148: movw %ax, %es
! 149: movw %ax, %fs
! 150: movw %ax, %gs
! 151: movl $(MP_TRAMPOLINE+NBPG-16),%esp # bootstrap stack end,
! 152: # with scratch space..
! 153:
! 154: #ifdef MPDEBUG
! 155: leal RELOC(cpu_trace),%edi
! 156: #endif
! 157:
! 158: HALT(0x1)
! 159: /* First, reset the PSL. */
! 160: pushl $PSL_MBO
! 161: popfl
! 162:
! 163: movl RELOC(mp_pdirpa),%ecx
! 164: HALTT(0x5,%ecx)
! 165:
! 166: /* Load base of page directory and enable mapping. */
! 167: movl %ecx,%cr3 # load ptd addr into mmu
! 168: movl %cr0,%eax # get control word
! 169: # enable paging & NPX emulation
! 170: orl $(CR0_PE|CR0_PG|CR0_NE|CR0_TS|CR0_EM|CR0_MP|CR0_WP),%eax
! 171: movl %eax,%cr0 # and let's page NOW!
! 172:
! 173: #ifdef MPDEBUG
! 174: leal _C_LABEL(cpu_trace),%edi
! 175: #endif
! 176: HALT(0x6)
! 177:
! 178: # ok, we're now running with paging enabled and sharing page tables with cpu0.
! 179: # figure out which processor we really are, what stack we should be on, etc.
! 180:
! 181: movl _C_LABEL(local_apic)+LAPIC_ID,%ecx
! 182: shrl $LAPIC_ID_SHIFT,%ecx
! 183: leal 0(,%ecx,4),%ecx
! 184: movl _C_LABEL(cpu_info)(%ecx),%ecx
! 185:
! 186: HALTT(0x7, %ecx)
! 187:
! 188: # %ecx points at our cpu_info structure..
! 189:
! 190: movw $((MAXGDTSIZ*8) - 1), 6(%esp) # prepare segment descriptor
! 191: movl CPU_INFO_GDT(%ecx), %eax # for real gdt
! 192: movl %eax, 8(%esp)
! 193: HALTT(0x8, %eax)
! 194: lgdt 6(%esp)
! 195: HALT(0x9)
! 196: jmp 1f
! 197: nop
! 198: 1:
! 199: HALT(0xa)
! 200: movl $GSEL(GDATA_SEL, SEL_KPL),%eax #switch to new segment
! 201: HALTT(0x10, %eax)
! 202: movw %ax,%ds
! 203: HALT(0x11)
! 204: movw %ax,%es
! 205: HALT(0x12)
! 206: movw %ax,%ss
! 207: HALT(0x13)
! 208: pushl $GSEL(GCODE_SEL, SEL_KPL)
! 209: pushl $mp_cont
! 210: HALT(0x14)
! 211: lret
! 212: .align 4,0x0
! 213: _TRMP_LABEL(gdt_table)
! 214: .word 0x0,0x0,0x0,0x0 # null GDTE
! 215: GDTE(0x9f,0xcf) # Kernel text
! 216: GDTE(0x93,0xcf) # Kernel data
! 217: _TRMP_LABEL(gdt_desc)
! 218: .word 0x17 # limit 3 entries
! 219: .long gdt_table # where is gdt
! 220:
! 221: _C_LABEL(cpu_spinup_trampoline_end): #end of code copied to MP_TRAMPOLINE
! 222: mp_cont:
! 223:
! 224: movl CPU_INFO_IDLE_PCB(%ecx),%esi
! 225:
! 226: # %esi now points at our PCB.
! 227:
! 228: HALTT(0x19, %esi)
! 229:
! 230: movl PCB_ESP(%esi),%esp
! 231: movl PCB_EBP(%esi),%ebp
! 232:
! 233: HALT(0x20)
! 234: /* Switch address space. */
! 235: movl PCB_CR3(%esi),%eax
! 236: HALTT(0x22, %eax)
! 237: movl %eax,%cr3
! 238: HALT(0x25)
! 239: /* Load segment registers. */
! 240: movl $GSEL(GCPU_SEL, SEL_KPL),%eax
! 241: HALTT(0x26,%eax)
! 242: movl %eax,%fs
! 243: xorl %eax,%eax
! 244: HALTT(0x27,%eax)
! 245: movl %eax,%gs
! 246: movl PCB_CR0(%esi),%eax
! 247: HALTT(0x28,%eax)
! 248: movl %eax,%cr0
! 249: HALTT(0x30,%ecx)
! 250: pushl %ecx
! 251: call _C_LABEL(cpu_hatch)
! 252: HALT(0x33)
! 253: xorl %esi,%esi
! 254: jmp _C_LABEL(idle_start)
! 255:
! 256: .data
! 257: _C_LABEL(mp_pdirpa):
! 258: .long 0
! 259: #ifdef MPDEBUG
! 260: .global _C_LABEL(cpu_trace)
! 261: _C_LABEL(cpu_trace):
! 262: .long 0x40
! 263: .long 0xff
! 264: .long 0xff
! 265: #endif
CVSweb