version 1.138, 2016/10/16 10:51:31 |
version 1.139, 2016/11/11 11:00:38 |
|
|
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_pmap_bootstrap |
|
|
/* |
/* |
* First avail returned by xen_pmap_bootstrap in %eax |
* The first VA available is returned by xen_pmap_bootstrap 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 UAREA. */ |
subl $KERNBASE, %esi /* init386 wants a physical address */ |
addl $USPACE,%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 */ |