[BACK]Return to mptramp.s CVS log [TXT][DIR] Up to [local] / sys / arch / i386 / i386

Annotation of sys/arch/i386/i386/mptramp.s, Revision 1.1.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