⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmu.s

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 S
📖 第 1 页 / 共 2 页
字号:
        cmp     r4, #0                          @ End of table?
        moveq   pc, lr                          @ RETURN!!!! INVALID MEMORY MAP. NO MAPPING FOR KDATA AREA!

        and     r2, r2, r7                      @ VA needs 512MB, 1MB aligned.
        and     r3, r3, r8                      @ PA needs 4GB, 1MB aligned.

        @
        @ For each MB in this table entry, compare with KDATA Virtal Address...
        @
8:
        cmp     r2, r6                          @ KDATA VA = Section VA?
        beq     9f                             @ Found it!!! (r3) is the PA

        add     r2, r2, #0x00100000             @ (r2) = VA + 1MB
        add     r3, r3, #0x00100000             @ (r3) = PA + 1MB

        sub     r4, r4, #1                      @ Decrement number of MB left
        cmp     r4, #0
        bne     8b                             @ Map next MB

        b       5b                             @ Get next element

9:
        mov     r4, r9
        mov     r1, r3

@       Found MemoryMap entry for .KDATA section which contains the kernel data page,
@ the first-level page table, exception vector page, etc.
@
@       (r1) = base address of bank
@       (r4) = virtual address of FirstPT
@       (r11) = ptr to MemoryMap array

15:
        mov     r10, #BANK_SIZE
        sub     r10, r10, #1                    @ (r10) = mask for offset
        and     r10, r10, r4                    @ (r10) = offset into bank for FirstPT
        orr     r10, r10, r1                    @ (r10) = ptr to FirstPT

@       Zero out page tables & kernel data page

        mov     r0, #0                          @ (r0-r3) = 0's to store
        mov     r1, #0
        mov     r2, #0
        mov     r3, #0
        mov     r4, r10                         @ (r4) = first address to clear
        add     r5, r10, #KDEnd-PTs             @ (r5) = last address + 1
18:
        stmia   r4!, {r0-r3}
        stmia   r4!, {r0-r3}
        cmp     r4, r5
        blo     18b


@       Setup 2nd level page table to map the high memory area which contains the
@ first level page table, 2nd level page tables, kernel data page, etc.

        add     r4, r10, #HighPT-PTs            @ (r4) = ptr to high page table
        orr     r0, r10, #0x051                 @ (r0) = PTE for 64K, kr/w kr/w r/o r/o page, uncached unbuffered
        str     r0, [r4, #0xD0*4]               @ store the entry into 8 consecutive slots
        str     r0, [r4, #0xD1*4]
        str     r0, [r4, #0xD2*4]
        str     r0, [r4, #0xD3*4]
@ 不需要全局第二级页表,放到每一个线程 -2004-12-28 修改        
@        str     r0, [r4, #0xD4*4]
@        str     r0, [r4, #0xD5*4]
@        str     r0, [r4, #0xD6*4]
@        str     r0, [r4, #0xD7*4]
@
        add     r8, r10, #ExceptionVectorsArea-PTs  @ (r8) = ptr to vector page

        @bl      OEMARMCacheMode                 @ places C and B bit values in r0 as set by OEM
		mov	r0, #0x0000000C

        mov     r2, r0
        orr     r0, r8, #0x002                  @ construct the PTE
        orr     r0, r0, r2
        str     r0, [r4, #0xF0*4]               @ store entry for exception vectors
        orr     r0, r0, #0x500                  @ (r0) = PTE for 4k r/o r/o kr/w kr/w C+B page
        str     r0, [r4, #0xF4*4]               @ store entry for abort stack
        str     r0, [r4, #0xF6*4]               @ store entry for FIQ stack  (access permissions overlap for abort and FIQ stacks, same 1k)
        orr     r0, r8, #0x042
        orr     r0, r0, r2                      @ (r0)= PTE for 4K r/o kr/w r/o r/o (C+B as set by OEM)
        str     r0, [r4, #0xF2*4]               @ store entry for interrupt stack
        add     r9, r10, #KPage-PTs             @ (r9) = ptr to kdata page
        orr     r0, r9, #0x002
        orr     r0, r0, r2                      @ (r0)=PTE for 4K (C+B as set by OEM)
        orr     r0, r0, #0x250                  @ (r0) = set perms kr/w kr/w kr/w+ur/o r/o
        str     r0, [r4, #0xFC*4]               @ store entry for kernel data page
        orr     r0, r4, #0x001                  @ (r0) = 1st level PTE for high memory section
        add     r1, r10, #0x4000
        str     r0, [r1, #-4]                   @ store PTE in last slot of 1st level table
.if 0
        mov     r0, r4
        mov     r1, #256                        @ dump 256 words
        CALL    WriteHex
.endif

@ Fill in first level page table entries to create "un-mapped" regions
@ from the contents of the MemoryMap array.
@
@       (r9) = ptr to KData page
@       (r10) = ptr to 1st level page table
@       (r11) = ptr to MemoryMap array

        add     r10, r10, #0x2000               @ (r10) = ptr to 1st PTE for "unmapped space"

        mov         r0, #0x02
        orr     r0, r0, r2                      @ (r0)=PTE for 0: 1MB (C+B as set by OEM)
        orr     r0, r0, #0x400                  @ set kernel r/w permission
20:
        mov     r1, r11                         @ (r1) = ptr to MemoryMap array


25:
        ldr     r2, [r1], #4                    @ (r2) = virtual address to map Bank at
        ldr     r3, [r1], #4                    @ (r3) = physical address to map from
        ldr     r4, [r1], #4                    @ (r4) = num MB to map

        cmp     r4, #0                          @ End of table?
        beq     29f

        ldr     r5, =0x1FF00000
        and     r2, r2, r5                      @ VA needs 512MB, 1MB aligned.

        ldr     r5, =0xFFF00000
        and     r3, r3, r5                      @ PA needs 4GB, 1MB aligned.

        add     r2, r10, r2, LSR #18
        add     r0, r0, r3                      @ (r0) = PTE for next physical page

28:
        str     r0, [r2], #4
        add     r0, r0, #0x00100000             @ (r0) = PTE for next physical page

        sub     r4, r4, #1                      @ Decrement number of MB left
        cmp     r4, #0
        bne     28b                            @ Map next MB

        bic     r0, r0, #0xF0000000             @ Clear Section Base Address Field
        bic     r0, r0, #0x0FF00000             @ Clear Section Base Address Field
        b       25b                            @ Get next element


29:
        tst     r0, #8
        bic     r0, r0, #0x0C                   @ clear cachable & bufferable bits in PTE
        add     r10, r10, #0x0800               @ (r10) = ptr to 1st PTE for "unmapped uncached space"
        bne     20b                            @ go setup PTEs for uncached space
        sub     r10, r10, #0x3000               @ (r10) = restore address of 1st level page table


@ Setup the vector area.
@
@       (r8) = ptr to exception vectors

        add     r7, pc, #VectorInstructions - (.+8)
        ldmia   r7!, {r0-r3}                    @ load 4 instructions
        stmia   r8!, {r0-r3}                    @ store the 4 vector instructions
        ldmia   r7!, {r0-r3}                    @ load 4 instructions
        stmia   r8!, {r0-r3}                    @ store the 4 vector instructions

@        add     r8, r8, #0x3E0-(8*4)
 @       ldmia   r7!, {r0-r3}
  @      stmia   r8!, {r0-r3}
   @     ldmia   r7!, {r0-r3}
    @    stmia   r8!, {r0-r3}

   @ convert VectorTable to Physical Address
        ldr     r0, =ES_VectorTable                @ (r0) = VA of VectorTable
        mov     r1, r11                         @ (r1) = &OEMAddressTable[0]
        bl      PhyAdrFromVirAdr
        mov     r7, r0                          @ (r7) = PA of VectorTable
        add     r8, r8, #0x3E0-(8*4)            @ (r8) = target location of the vector table
        ldmia   r7!, {r0-r3}
        stmia   r8!, {r0-r3}
        ldmia   r7!, {r0-r3}
        stmia   r8!, {r0-r3}



@ The page tables and exception vectors are setup. Initialize the MMU and turn it on.

@
        mov     r1, #1
        mtc15   r1, c3                          @ setup access to domain 0
        mtc15   r10, c2
        bl      TLBClear

    @   set mmu option
	@  about test the same code with different mmu seting( timer interrupt's period is 10 ms )
	@  if mmu, the cpu speed is about 88.910 seconds
	@  if mmu + data cache , cpu speed is about 80.760 seconds
	@  if mmu + icache,      cpu speed is about 4.610  seconds
	@  if mmu + dcache + icache + write buffer, cpu speed is about 3.620 seconds
	@  test by lilin

        mfc15   r1, c1
@		mov   r1, #0                @r1 = 0

@-----fast begin--------------------------        
        orr     r1, r1, #0x007F                 @ changed to read-mod-write for ARM920 Enable: MMU, Align, DCache, WriteBuffer
	    orr     r1, r1, #0x0200                 @ ROM protection enable
        orr     r1, r1, #0x1000                 @ ICache enable
@-----fast end--------------------------

@-----medium begin--------------------------
       @orr     r1, r1, #0x1                @ enable  mmu
       @orr     r1, r1, #0x0004         @ enable data cache
    	@orr     r1, r1, #0x1000         @ Enable icache
       @orr     r1, r1, #0x0008         @ Enable write buffer=8
    	@orr     r1, r1, #0x0200         @ ROM protection enable
@----medium end----------------------------

@-----slow begin--------------------------       
	   @orr     r1, r1, #0x1                @ enable  mmu
	   @orr     r1, r1, #0x0200         @ ROM protection enable
@-----slow end--------------------------

        orr     r1, r1, #0x2000         @ interrupt base address = 0xffff0000 

@ kkkk:    
 @   ldr r0, =0xaadefdd
 @   bl PutHex
 @   b kkkk
       
        ldr     r0, VirtualStart
        cmp     r0, #0                          @ make sure no stall on "mov pc,r0" below
        mtc15   r1, c1                          @ enable the MMU & Caches
        mov     pc, r0                          @  & jump to new virtual address
        nop

@ MMU & caches now enabled.
@
@       (r10) = physcial address of 1st level page table

VStart:
        ldr     sp, =KStack
        add     r4, sp, #KData-KStack           @ (r4) = ptr to KDataStruct
        
		@mov     r0, #0x80000000
        @str     r0, [r4, #hBase]                @ set HandleBase
        @ldr     r0, =DirectRet
        @str     r0, [r4, #pAPIReturn]           @ set DirectReturn address
        @add     r1, r10, #0x4000                @ (r1) = physical addr of 2nd page table pool
        @orr     r1, r1, #1                      @ (r1) = page table descriptor for pool entries
        @str     r1, [r4, #ptDesc]               @ save for LoadPageTable()

@ Initialize stacks for each mode.
        mov     r1, #ABORT_MODE | 0x80
        msr     cpsr_c, r1                      @ switch to Abort Mode w/IRQs disabled
        add     sp, r4, #AbortStack-KData
        mov     r1, sp                          @ r1 = abort sp
        mov     r2, #IRQ_MODE | 0x80
        msr     cpsr_c, r2                      @ switch to IRQ Mode w/IRQs disabled
        add     sp, r4, #IntStack-KData
        mov     r2, sp                          @ r2 = irq sp

        mov     r3, #FIQ_MODE | 0x80
        msr     cpsr_c, r3                      @ switch to FIQ Mode w/IRQs disabled
        add     sp, r4, #FIQStack-KData

        mov     r3,  #UNDEF_MODE | 0x80
        msr     cpsr_c, r3                      @ switch to Undefined Mode w/IRQs disabled
        mov     sp, r4                          @ (sp_undef) = &KData
        mov     r3, sp


@        mov     r3,  #SVC_MODE | 0x80
@        msr     cpsr_c, r3                      @ switch to svc Mode w/IRQs disabled
@        mov     r0, sp                          @ (sp_undef) = &KData
@		sub     r0, r0, #0x20          

		mov     r3, #SYS_MODE | 0x80
        msr     cpsr_c, r3                      @ switch to Supervisor Mode w/IRQs enabled
@		mov     sp, r0
        ldr     sp, =KDBase
		mov     r3, sp                          @ r3 = sys sp
		mov     r0, r10                         @ r0 = first levle page table phycial address
		b       _InitKernel

		.type	VirtualStart, #object
		VirtualStart: .word	VStart
		.size	VirtualStart, . - VirtualStart

@VirtualStart DCD VStart

VectorInstructions:
        ldr     pc, [pc, #0x3E0-8]              @ undefined instruction
        @BREAKPOINT                              @ undefined instruction

        ldr     pc, [pc, #0x3E0-8]              @ undefined instruction
        ldr     pc, [pc, #0x3E0-8]              @ SVC
        ldr     pc, [pc, #0x3E0-8]              @ Prefetch abort
        ldr     pc, [pc, #0x3E0-8]              @ data abort

        @BREAKPOINT                              @ unused vector location
		ldr     pc, [pc, #0x3E0-8]              @ unused vector location

        ldr     pc, [pc, #0x3E0-8]              @ IRQ
        ldr     pc, [pc, #0x3E0-8]              @ FIQ

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -