version 1.135, 2016/07/09 06:58:06 |
version 1.135.2.3, 2017/01/07 08:56:18 |
Line 270 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 270 __KERNEL_RCSID(0, "$NetBSD$"); |
|
*/ |
*/ |
.data |
.data |
|
|
.globl _C_LABEL(lapic_tpr) |
|
|
|
#if NLAPIC > 0 |
|
#ifdef __ELF__ |
|
.align PAGE_SIZE |
|
#else |
|
.align 12 |
|
#endif |
|
.globl _C_LABEL(local_apic) |
|
.globl _C_LABEL(lapic_id) |
|
|
|
.type _C_LABEL(local_apic), @object |
|
LABEL(local_apic) |
|
.space LAPIC_ID |
|
END(local_apic) |
|
.type _C_LABEL(lapic_id), @object |
|
LABEL(lapic_id) |
|
.long 0x00000000 |
|
.space LAPIC_TPRI-(LAPIC_ID+4) |
|
END(lapic_id) |
|
.type _C_LABEL(lapic_tpr), @object |
|
LABEL(lapic_tpr) |
|
.space LAPIC_PPRI-LAPIC_TPRI |
|
END(lapic_tpr) |
|
.type _C_LABEL(lapic_ppr), @object |
|
_C_LABEL(lapic_ppr): |
|
.space LAPIC_ISR-LAPIC_PPRI |
|
END(lapic_ppr) |
|
.type _C_LABEL(lapic_isr), @object |
|
_C_LABEL(lapic_isr): |
|
.space PAGE_SIZE-LAPIC_ISR |
|
END(lapic_isr) |
|
#else |
|
.type _C_LABEL(lapic_tpr), @object |
|
LABEL(lapic_tpr) |
|
.long 0 |
|
END(lapic_tpr) |
|
#endif |
|
|
|
.globl _C_LABEL(tablesize) |
.globl _C_LABEL(tablesize) |
.globl _C_LABEL(nox_flag) |
.globl _C_LABEL(nox_flag) |
.globl _C_LABEL(cputype) |
.globl _C_LABEL(cputype) |
|
|
*/ |
*/ |
|
|
/* Find end of kernel image; brings us on (1). */ |
/* Find end of kernel image; brings us on (1). */ |
movl $RELOC(end),%edi |
movl $RELOC(__kernel_end),%edi |
|
|
#if (NKSYMS || defined(DDB) || defined(MODULAR)) && !defined(makeoptions_COPY_SYMTAB) |
#if (NKSYMS || defined(DDB) || defined(MODULAR)) && !defined(makeoptions_COPY_SYMTAB) |
/* Save the symbols (if loaded); brinds us on (2). */ |
/* Save the symbols (if loaded); brinds us on (2). */ |
|
|
incl %eax /* one more PTP for VAs stolen by bootstrap */ |
incl %eax /* one more PTP for VAs stolen by bootstrap */ |
1: movl %eax,RELOC(nkptp)+1*4 |
1: movl %eax,RELOC(nkptp)+1*4 |
|
|
/* tablesize = (PDP_SIZE + UPAGES + nkptp) << PGSHIFT; */ |
/* tablesize = (PDP_SIZE + UPAGES + nkptp[1]) << PGSHIFT; */ |
addl $(PDP_SIZE+UPAGES),%eax |
addl $(PDP_SIZE+UPAGES),%eax |
#ifdef PAE |
#ifdef PAE |
incl %eax /* one more page for L3 */ |
incl %eax /* one more page for L3 */ |
|
|
#endif |
#endif |
movl %eax,RELOC(tablesize) |
movl %eax,RELOC(tablesize) |
|
|
/* Ensure that nkptp covers BOOTSTRAP TABLES. */ |
/* Ensure that nkptp[1] covers BOOTSTRAP TABLES, ie: |
|
* (esi + tablesize) >> L2_SHIFT + 1 < nkptp[1] */ |
addl %esi,%eax |
addl %esi,%eax |
addl $~L2_FRAME,%eax |
addl $~L2_FRAME,%eax |
shrl $L2_SHIFT,%eax |
shrl $L2_SHIFT,%eax |
|
|
pushl $0 /* init386() expects a 64 bits paddr_t with PAE */ |
pushl $0 /* init386() expects a 64 bits paddr_t with PAE */ |
#endif |
#endif |
pushl %eax |
pushl %eax |
call _C_LABEL(init386) /* wire 386 chip for unix operation */ |
call _C_LABEL(init386) |
addl $PDE_SIZE,%esp /* pop paddr_t */ |
addl $PDE_SIZE,%esp /* pop paddr_t */ |
addl $NGDT*8,%esp /* pop temporary gdt */ |
addl $NGDT*8,%esp /* pop temporary gdt */ |
|
|
|
|
popfl |
popfl |
|
|
cld |
cld |
movl %esp, %ebx /* save start of available space */ |
|
movl $_RELOC(tmpstk),%esp /* bootstrap stack end location */ |
/* |
|
* Xen info: |
|
* - %esp -> stack, *theoretically* the last used page by Xen bootstrap |
|
*/ |
|
movl %esp,%ebx |
|
movl $_RELOC(tmpstk),%esp |
|
|
/* Clear BSS. */ |
/* Clear BSS. */ |
xorl %eax,%eax |
xorl %eax,%eax |
movl $RELOC(__bss_start),%edi |
movl $RELOC(__bss_start),%edi |
movl $RELOC(_end),%ecx |
movl $RELOC(_end),%ecx |
subl %edi,%ecx |
subl %edi,%ecx |
rep stosb |
rep |
|
stosb |
|
|
/* Copy the necessary stuff from start_info structure. */ |
/* Copy the necessary stuff from start_info structure. */ |
/* We need to copy shared_info early, so that sti/cli work */ |
/* We need to copy shared_info early, so that sti/cli work */ |
movl $RELOC(start_info_union),%edi |
movl $RELOC(start_info_union),%edi |
movl $128,%ecx |
movl $128,%ecx |
rep movsl |
rep |
|
movsl |
|
|
/* Clear segment registers; always null in proc0. */ |
/* Clear segment registers. */ |
xorl %eax,%eax |
xorl %eax,%eax |
movw %ax,%fs |
movw %ax,%fs |
movw %ax,%gs |
movw %ax,%gs |
decl %eax |
|
movl %eax,RELOC(cpuid_level) |
|
|
|
xorl %eax,%eax |
xorl %eax,%eax |
cpuid |
cpuid |
movl %eax,RELOC(cpuid_level) |
movl %eax,RELOC(cpuid_level) |
|
|
/* |
/* |
* Use a temp page. We'll re- add it to uvm(9) once we're |
* Use a temporary GDT page. We'll re-add it to uvm(9) once we're done |
* done using it. |
* using it. |
*/ |
*/ |
movl $RELOC(tmpgdt), %eax |
movl $RELOC(tmpgdt),%eax |
pushl %eax /* start of temporary gdt */ |
pushl %eax /* start of temporary gdt */ |
call _C_LABEL(initgdt) |
call _C_LABEL(initgdt) |
addl $4,%esp |
addl $4,%esp |
|
|
call xen_pmap_bootstrap |
call xen_locore |
|
|
/* |
/* |
* First avail returned by xen_pmap_bootstrap in %eax |
* The first VA available is returned by xen_locore in %eax. We |
|
* use it as the UAREA, and set up the stack here. |
*/ |
*/ |
movl %eax, %esi; |
movl %eax,%esi |
movl %esi, _C_LABEL(lwp0uarea) |
movl %esi,_C_LABEL(lwp0uarea) |
|
|
/* Set up bootstrap stack. */ |
|
leal (USPACE-FRAMESIZE)(%eax),%esp |
leal (USPACE-FRAMESIZE)(%eax),%esp |
xorl %ebp,%ebp /* mark end of frames */ |
xorl %ebp,%ebp /* mark end of frames */ |
|
|
addl $USPACE, %esi |
/* Set first_avail after the DUMMY PAGE (see xen_locore). */ |
subl $KERNBASE, %esi /* init386 wants a physical address */ |
addl $(USPACE+PAGE_SIZE),%esi |
|
subl $KERNBASE,%esi /* init386 wants a physical address */ |
|
|
#ifdef PAE |
#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 |
#endif |
pushl %esi |
pushl %esi |
call _C_LABEL(init386) /* wire 386 chip for unix operation */ |
call _C_LABEL(init386) |
addl $PDE_SIZE,%esp /* pop paddr_t */ |
addl $PDE_SIZE,%esp /* pop paddr_t */ |
call _C_LABEL(main) |
call _C_LABEL(main) |
#endif /* XEN */ |
#endif /* XEN */ |