调试2410的wince遇到问题。下面的代码是eboot中打开mmu的代码,但是mmu打开后bl main就跳到了空的地址,之前到bl之前运行都是对的,小弟对于mmu不是太了解,有没有那位高手能帮我分析一下,不胜感激,最后付了OEMAddressTable 其中 PHYBASE EQU 0x30000000 ; physical start PTs EQU 0x31E00000
GWMMUINIT ; Compute physical address of the OEMAddressTable. 20 add r11, pc, #SDATA - (. + 8) ldr r10, =PTs ; (r10) = 1st level page table
; Setup 1st level page table (using section descriptor) ; Fill in first level page table entries to create "un-mapped" regions ; from the contents of the MemoryMap array. ; ; (r10) = 1st level page table ; (r11) = ptr to MemoryMap array
add r10, r10, #0x2000 ; (r10) = ptr to 1st PTE for "unmapped space" mov r0, #0x0E ; (r0) = PTE for 0: 1MB cachable bufferable orr r0, r0, #0x400 ; set kernel r/w permission 25 mov r1, r11 ; (r1) = ptr to MemoryMap array
30 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 %f40
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
35 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 %b35 ; Map next MB
bic r0, r0, #0xF0000000 ; Clear Section Base Address Field bic r0, r0, #0x0FF00000 ; Clear Section Base Address Field b %b30 ; Get next element 40 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 %b25 ; go setup PTEs for uncached space sub r10, r10, #0x3000 ; (r10) = restore address of 1st level page table
; Setup mmu to map (VA == 0) to (PA == 0x30000000). ldr r0, =PTs ; PTE entry for VA = 0 ldr r1, =0x3000040E ; uncache/unbuffer/rw, PA base == 0x30000000 str r1, [r0]
; uncached area. add r0, r0, #0x0800 ; PTE entry for VA = 0x0200.0000 , uncached ldr r1, =0x30000402 ; uncache/unbuffer/rw, base == 0x30000000 str r1, [r0] ; Comment: ; The following loop is to direct map RAM VA == PA. i.e. ; VA == 0x30XXXXXX => PA == 0x30XXXXXX for S3C2400 ; Fill in 8 entries to have a direct mapping for DRAM ; ldr r10, =PTs ; restore address of 1st level page table ldr r0, =PHYBASE
add r10, r10, #(0x3000 / 4) ; (r10) = ptr to 1st PTE for 0x30000000
add r0, r0, #0x1E ; 1MB cachable bufferable orr r0, r0, #0x400 ; set kernel r/w permission mov r1, #0 mov r3, #64 45 mov r2, r1 ; (r2) = virtual address to map Bank at cmp r2, #0x20000000:SHR:BANK_SHIFT add r2, r10, r2, LSL #BANK_SHIFT-18 strlo r0, [r2] add r0, r0, #0x00100000 ; (r0) = PTE for next physical page subs r3, r3, #1 add r1, r1, #1 bgt %b45
ldr r10, =PTs ; (r10) = restore address of 1st level page table
; The page tables and exception vectors are setup. ; Initialize the MMU and turn it on. mov r1, #1 mcr p15, 0, r1, c3, c0, 0 ; setup access to domain 0 mcr p15, 0, r10, c2, c0, 0 mcr p15, 0, r0, c8, c7, 0 ; flush I+D TLBs mov r1, #0x0071 ; Enable: MMU orr r1, r1, #0x0004 ; Enable the cache
ldr r0, =VirtualStart
cmp r0, #0 ; make sure no stall on "mov pc,r0" below mcr p15, 0, r1, c1, c0, 0 mov pc, r0 ; & jump to new virtual address nop
; MMU & caches now enabled. ; (r10) = physcial address of 1st level page table ;
VirtualStart
mov sp, #0x8C000000 add sp, sp, #0x30000 ; arbitrary initial super-page stack pointer ldr r0, = 0x91600054 ldr r1, = 0x80 str r1, [r0]
bl Main
LTORG
SDATA DATA
DCD 0x80000000, 0x02000000, 30 ; 30 MB SROM(SRAM/ROM) BANK 0 DCD 0x82000000, 0x08000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1 DCD 0x84000000, 0x10000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 2 DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3 DCD 0x88000000, 0x20000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 4 DCD 0x8A000000, 0x28000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 5 DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0,1 DCD 0x90800000, 0x48000000, 1 ; Memory control register DCD 0x90900000, 0x49000000, 1 ; USB Host register DCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control register DCD 0x90B00000, 0x4B000000, 1 ; DMA control register DCD 0x90C00000, 0x4C000000, 1 ; Clock & Power register DCD 0x90D00000, 0x4D000000, 1 ; LCD control register DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register DCD 0x91000000, 0x50000000, 1 ; UART control register DCD 0x91100000, 0x51000000, 1 ; PWM timer register DCD 0x91200000, 0x52000000, 1 ; USB device register DCD 0x91300000, 0x53000000, 1 ; Watchdog Timer register DCD 0x91400000, 0x54000000, 1 ; IIC control register DCD 0x91500000, 0x55000000, 1 ; IIS control register DCD 0x91600000, 0x56000000, 1 ; I/O Port register DCD 0x91700000, 0x57000000, 1 ; RTC control register DCD 0x91800000, 0x58000000, 1 ; A/D convert register DCD 0x91900000, 0x59000000, 1 ; SPI register DCD 0x91A00000, 0x5A000000, 1 ; SD Interface register DCD 0x92000000, 0x00000000, 2 ; 2 MB SROM(SRAM/ROM) BANK 0 DCD 0x00000000, 0x00000000, 0 ; End of Table (MB MUST BE ZERO!) ALIGN
|