《vxWorksbsp分析之rominit.pdf》由会员分享,可在线阅读,更多相关《vxWorksbsp分析之rominit.pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Rominit C 4 vxWorks.h sysLib.h BSP config.h BSP Asm.h:.globl copyright_wind_river.long copyright_wind_river/*the first in.data*/.globl romwait.globl _romInit.globl _sdata _romlnit_sdata 0start of data.text.align 16.text.align 1616 CPU rominit Cli jmp cold cold balign 1632-bit16-bit16-bit 32-bit romW
2、armHigh:Cli movl SP_ARG1(%esp),%ebx esp+SP_ARG1 ebx jmp warm warm.balign 1632-bit16-bit16-bit32-bit romWarmLow:cli cld movl$RAM_LOW_ADRS,%esi/*RAM_LOW_ADRS esi movl$ROM_TEXT_ADRS,%edi/*RAM_LOW_ADRS edi movl$ROM_SlZE,%ecx/*RAM_size ecx shrl$2,%ecx/*ecx 256 64 rep movsl esi-edi ecx=0 movl SP_ARG1(%esp
3、),%ebx esp+SP_ARG1 ebx jmp warm/*jump to warm*/.ascii Copyright 1984-2002 Wind River Systems,Inc.balign 16,0 x90 cold:/cold .byte 0 x67,0 x66 blign1 6 lidt%cs:(romIdtr-romInit)cs:(romIdtr-romInit).byte 0 x67,0 x66 blign1 6 Igdt%cs:(romGdtr-romInit)cs:(romGdtr-romInit)mov%cr0,%eax/*move CR0 to EAX*/.
4、byte 0 x66/*next inst has 32bit operand*/or$0 x00000001,%eax/*set the PE bit*/mov%eax,%cr0/*move EAX to CR0*/cr0PE1jmp romInit1/*rominit1 Rominit1:rominit1 .byte 0 x66/*next inst has 32bit operand*/mov$0 x0010,%eax/*set data segment 0 x10 is 3rd one*/mov%ax,%ds/*set DS*/mov%ax,%es/*set ES*/mov%ax,%f
5、s/*set FS*/mov%ax,%gs/*set GS*/mov%ax,%ss/*set SS*/.byte 0 x66/*next inst has 32bit operand*/mov$ROM_STACK,%esp/*set lower mem stack pointer*/.byte 0 x67,0 x66/*next inst has 32bit operand*/ljmp$0 x08,$ROM_ TEXT_ADRS+romInit2-romInit DS,ES,FS,GS,SS0 x0010GDT20DPL=0esp ROM_STACK,CS16-bit32-bitCSCS0 x
6、08GDT1DPL=0CS romIDT In terrupt Description TableromGdtr:.word 0 x0027.long ROM_TEXT_ADRS+ROM_GDT/balign 16,0 x90 romGdt:/*0(selector=0 x0000):Null descriptor*/.word.word.byte.byte.byte.byte 0 x0000 0 x0000 0 x00 0 x00 0 x00 0 x00 /*1(selector=0 x0008):Code descriptor*/.word.word.byte 0 xffff/*limit
7、:xffff*/16 0 x0000/*base:xxxx0000*/16 0 x00/*base:xx00 xxxx*/8 .byte.byte.byte 0 x9a/0 xcf/4 0 x00/*base:8 /*2(selector=0 x0010):Data descriptor*/.word.word.byte.byte.byte.byte 0 xffff/*limit:xffff*/0 x0000/*base:xxxx0000*/0 x00/*base:xx00 xxxx*/0 x92/*Data r/w,Present,DPL0*/0 xcf/*limit:fxxxx,Page
8、Gra,32bit*/0 x00/*base:00 xxxxxx*/*3(selector=0 x0018):Code descriptor,for the nesting interrupt*/.word.word.byte.byte.byte.byte 0 xffff/*limit:xffff*/0 x0000/*base:xxxx0000*/0 x00/*base:xx00 xxxx*/0 x9a/*Code e/r,Present,DPL0*/0 xcf/*limit:fxxxx,Page Gra,32bit*/0 x00/*base:00 xxxxxx*/*4(selector=0
9、x0020):Code descriptor,for the nesting interrupt*/.word 0 xffff/*limit:xffff*/.word 0 x0000/*base:xxxx0000*/.byte 0 x00/*base:xx00 xxxx*/.byte 0 x9a/*Code e/r,Present,DPL0*/.byte 0 xcf/*limit:fxxxx,Page Gra,32bit*/.byte 0 x00/*base:00 xxxxxx*/.balign 16,0 x90 romInit2:/rominit2 cli movl$ROM_STACK,%e
10、sp esp rom_stack 0 x8000h#if defined(TGT_CPU)&defined(SYMMETRIC_IO_MODE)movl$MP_N_CPU,%eax lock incl(%eax)#endif TGT_CPU SYMMETRIC_IO_MODE#ifdef INCLUDE_WINDML/*WindML+VesaBIOS initialization*/Movl$VESA_BIOS_DATA_PREFIX,%ebx/*move BIOS prefix addr to EBX*/movl$VESA_BIOS_KEY_1,(%ebx)/*store BIOS*/add
11、l$4,%ebx/*increment EBX*/movl$VESA_BIOS_KEY_2,(%ebx)/*store DATA*/movl$VESA_BIOS_DATA_SIZE,%ecx/*load ECX with nBytes to copy*/shrl$2,%ecx/*get nLongs to copy*/movl$0,%esi/*load ESI with source addr*/movl$VESA_BIOS_DATA_ADDRESS,%edi/*load EDI with dest addr*/rep movsl/*copy BIOS data to VRAM*/#endif
12、/*INCLUDE_WINDML*/*/INCLUDE_WINDML VesaBIOS#ifndef INCLUDE_IACSFL call FUNC(romA20on)cmpl$0,%eax jne romInitHlt/*#endif INCLUDE_IACSFL warm:/warm ARCH_REGS_INIT/*DR0-7*/#if(CPU=PENTIUM)|(CPU=PENTIUM2)|(CPU=PENTIUM3)|(CPU=PENTIUM4)xorl%eax,%eax/*zero EAX*/movl%eax,%cr4/*enable A20*/*is A20 enabled?*/
13、no:jump romInitHlt*/#endif cr4 movl$romGdtr,%eax romGdt subl$FUNC(romInit),%eax addl$ROM_TEXT_ADRS,%eax pushl%eax call FUNC(romLoadGdt)movl$STACK_ADRS,%esp/*initialise the stack pointer*/movl$ROM_TEXT_ADRS,%esi/*get src addr(ROM_TEXT_ADRS)movl$romInit,%edi/*get dst addr(romInit)*/cmpl%esi,%edi/*is s
14、rc and dst same?*/je romInit4 rom_text_adrsrominitrominit4 movl$FUNC(end),%ecx/*get end addr*/subl%edi,%ecx/*get nBytes to copy*/shrl$2,%ecx/*get nLongs to copy*/cld/*clear the direction bit*/rep/*repeat next inst ECX time*/movsl rom_text_adrsrominitrom_text_adrs(en d-romi nit)romlnit4:rominit4 xorl
15、%ebp,%ebp ebp pushl$0 popfl/pushl%ebx ebx movl$FUNC(romStart),%eax/*jump to romStart*/call*%eax/romStart romInitHlt:pushl%eax call FUNC(romEaxShow)/romEaxShow eax hlt jmp romInitHlt .balign 16,0 x90 FUNC_LABEL(romA20on)/romA20on:a20call FUNC(romWait)/romwait movl$0 xd1,%eax/*64h d1h*/outb%al,$0 x64
16、call FUNC(romWait)60h dfh*/romwait movl$0 xff,%eax 64h ffh*/outb%al,$0 x64 call FUNC(romWait)romwait movl$0 x000000,%eax/*Check if it worked*/movl$0 x100000,%edx pushl(%eax)pushl(%edx)movl$0 x0,(%eax)movl$0 x0,(%edx)movl$0 x01234567,(%eax)cmpl$0 x01234567,(%edx)popl(%edx)popl(%eax)jne romA20on0 A20O
17、OOOOOh100000,20 0 A20/*another way to enable A20*/movl$0 x02,%eax outb%al,$0 x92/92H 02 xorl%ecx,%ecx ecx romA20on1:/92H 02 inb$0 x92,%al andb$0 x02,%al loopz romA20on1/92H 02 movl$0 xdf,%eax/*Enable A20*/outb%al,$0 x60 call FUNC(romWait)movl$0 x000000,%eax/*Check if it worked*/movl$0 x100000,%edx p
18、ushl(%eax)pushl(%edx)movl$0 x0,(%eax)movl$0 x0,(%edx)movl$0 x01234567,(%eax)cmpl$0 x01234567,(%edx)popl(%edx)popl(%eax)jne romA20on0 movl$0 xdeaddead,%eax/*error,cant enable A20*/ret A20OOOOOOh100000,20 0 A20 A20 romA20on0:xorl%eax,%eax ret/A20 EAX .balign 16,0 x90 FUNC_LABEL(romLoadGdt)movl SP_ARG1
19、(%esp),%eax lgdt(%eax)movw$0 x0010,%ax/*a selector 0 x10 is 3rd one*/movw%ax,%ds movw%ax,%es movw%ax,%fs movw%ax,%gs movw%ax,%ss ret DS,ES,FS,GS,SS0 x0010GDT20DPL=0 FUNC_LABEL(romWait)/xorl%ecx,%ecx ecx romWait0:movl$0 x64,%edx/*Check if it is ready to write*/inb%dx,%al andb$2,%al loopnz romWait0/64h 02 ret.balign 16,0 x90 FUNC_LABEL(romEaxShow)/eax /*show EAX register in your display device available*/ret