MMU.S
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:6k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. ;
  2. ; Copyright (c) Microsoft Corporation.  All rights reserved.
  3. ;
  4. ;
  5. ; Use of this source code is subject to the terms of the Microsoft end-user
  6. ; license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
  7. ; If you did not accept the terms of the EULA, you are not authorized to use
  8. ; this source code. For a copy of the EULA, please see the LICENSE.RTF on your
  9. ; install media.
  10. ;
  11. ; Module Name:
  12. ;
  13. ;   mmu.s
  14. ;
  15. ; Abstract:
  16. ;
  17. ;   This module contains code for setting up a page table, enabling the MMU,
  18. ;   and enabling the Dcache.  It is used to set up for the bootloader.
  19. ;
  20. ; Author:
  21. ;
  22. ;    Thomas Fenwick (thomasf) 04-Feb-97
  23. ;
  24. ; Environment:
  25. ;
  26. ;    Kernel mode only.
  27. ;
  28. ; Revision History:
  29. ;
  30. ;   Janet Schneider (v-janets) 06-November-1997
  31. ;   Scott Shell (scottsh) 18-Jan-1999               Revised for Hornet
  32. ;
  33. ;   Revised from armtrap.s
  34. ;
  35. ;--
  36.     INCLUDE kxarm.h
  37. MemoryMap   EQU 0x2a4       ; From ksarm.h - to get this to compile
  38. BANK_SIZE   EQU 0x00100000  ; 1MB per bank in MemoryMap array
  39. BANK_SHIFT  EQU 20
  40. ;
  41. ;   Define RAM space for the Page Tables:
  42. ;
  43. PHYBASE     EQU 0x30000000  ; physical start
  44. PTs     EQU 0x30010000  ; 1st level page table address (PHYBASE + 0x10000)
  45.                     ; save room for interrupt vectors.
  46.     MACRO
  47.     MTC15   $cpureg, $cp15reg
  48.     mcr p15, 0, $cpureg, $cp15reg, c0, 0
  49.     MEND
  50.     MACRO
  51.     MFC15   $cpureg, $cp15reg
  52.     mrc p15, 0, $cpureg, $cp15reg, c0, 0
  53.     MEND
  54.     TEXTAREA
  55.     IMPORT  main
  56. ; KernelStart - Set up the MMU and Dcache for bootloader
  57. ;
  58. ; This routine will initialize the first-level page table based up the contents
  59. ; of the MemoryMap array and enable the MMU and caches.
  60. ;
  61. ;   Entry   (r0) = pointer to MemoryMap array in physical memory
  62. ;   Exit    returns if MemoryMap is invalid
  63. ; For Catfish, we are always in RAM.
  64.     LEAF_ENTRY KernelStart
  65. 15  mov r11, r0         ; (r11) = &MemoryMap (save pointer)
  66.     ldr r10, =PTs       ; (r10) = 1st level page table
  67. ; Setup 1st level page table (using section descriptor) 
  68. ; Fill in first level page table entries to create "un-mapped" regions
  69. ; from the contents of the MemoryMap array.
  70. ;
  71. ;   (r10) = 1st level page table
  72. ;   (r11) = ptr to MemoryMap array
  73.     add r10, r10, #0x2000   ; (r10) = ptr to 1st PTE for "unmapped space"
  74.     mov r0, #0x0E       ; (r0) = PTE for 0: 1MB cachable bufferable
  75.     orr r0, r0, #0x400      ; set kernel r/w permission
  76. 20  mov r1, r11         ; (r1) = ptr to MemoryMap array
  77.         
  78. 25  ldr r2, [r1], #4        ; (r2) = virtual address to map Bank at
  79.     ldr r3, [r1], #4        ; (r3) = physical address to map from
  80.     ldr r4, [r1], #4        ; (r4) = num MB to map
  81.     cmp r4, #0                  ; End of table?
  82.     beq %F29
  83.     ldr r5, =0x1FF00000
  84.     and r2, r2, r5              ; VA needs 512MB, 1MB aligned.                
  85.     ldr r5, =0xFFF00000
  86.     and r3, r3, r5              ; PA needs 4GB, 1MB aligned.
  87.     add r2, r10, r2, LSR #18
  88.     add r0, r0, r3              ; (r0) = PTE for next physical page
  89. 28  str r0, [r2], #4
  90.     add r0, r0, #0x00100000     ; (r0) = PTE for next physical page
  91.     sub r4, r4, #1              ; Decrement number of MB left 
  92.     cmp r4, #0
  93.     bne %B28                    ; Map next MB
  94.     bic r0, r0, #0xF0000000     ; Clear Section Base Address Field
  95.     bic r0, r0, #0x0FF00000     ; Clear Section Base Address Field
  96.     b   %B25                    ; Get next element
  97.         
  98. 29  tst r0, #8
  99.     bic r0, r0, #0x0C       ; clear cachable & bufferable bits in PTE
  100.     add r10, r10, #0x0800   ; (r10) = ptr to 1st PTE for "unmapped uncached space"
  101.     bne %B20            ; go setup PTEs for uncached space
  102.     sub r10, r10, #0x3000   ; (r10) = restore address of 1st level page table
  103. ; setup mmu to map (VA == 0) to (PA == 0x30000000)
  104.     ldr r0, =PTs        ; PTE entry for VA = 0
  105.     ldr r1, =0x3000040E     ; uncache/unbuffer/rw, PA base == 0x30000000
  106.     str r1, [r0]
  107. ; uncached area
  108.     add r0, r0, #0x0800     ; PTE entry for VA = 0x0200.0000 , uncached 
  109.     ldr r1, =0x30000402     ; uncache/unbuffer/rw, base == 0x30000000
  110.     str r1, [r0]
  111.     
  112. ; Comment:
  113. ; The following loop is to direct map RAM VA == PA. i.e. 
  114. ;   VA == 0x30XXXXXX => PA == 0x30XXXXXX for S3C2400
  115. ; Fill in 8 entries to have a direct mapping for DRAM
  116.     ldr r10, =PTs       ; restore address of 1st level page table
  117.     ldr r0,  =PHYBASE
  118.     add r10, r10, #(0x3000 / 4) ; (r10) = ptr to 1st PTE for 0x30000000
  119.     add r0, r0, #0x1E       ; 1MB cachable bufferable
  120.     orr r0, r0, #0x400      ; set kernel r/w permission
  121.     mov r1, #0 
  122.     mov r3, #64
  123. 35  mov r2, r1          ; (r2) = virtual address to map Bank at
  124.     cmp r2, #0x20000000:SHR:BANK_SHIFT
  125.     add r2, r10, r2, LSL #BANK_SHIFT-18
  126.     strlo   r0, [r2]
  127.     add r0, r0, #0x00100000 ; (r0) = PTE for next physical page
  128.     subs    r3, r3, #1
  129.     add r1, r1, #1
  130.     bgt %B35
  131.     ldr r10, =PTs       ; (r10) = restore address of 1st level page table
  132. ;
  133. ; The page tables and exception vectors are setup. Initialize the MMU and turn
  134. ; it on.
  135.     mov     r1, #1
  136.     MTC15   r1, c3                  ; setup access to domain 0
  137.     MTC15   r10, c2
  138.     mcr     p15, 0, r0, c8, c7, 0   ; flush I+D TLBs
  139.     mov     r1, #0x0071             ; Enable: MMU
  140.     orr     r1, r1, #0x0004     ; Enable the cache
  141.     ldr     r0, =VirtualStart
  142.     cmp     r0, #0                  ; make sure no stall on "mov pc,r0" below
  143.     MTC15   r1, c1                  ; enable the MMU & Caches
  144.     mov     pc, r0                  ;  & jump to new virtual address
  145.     nop
  146. ; MMU & caches now enabled.
  147. ;
  148. ;   (r10) = physcial address of 1st level page table
  149. VirtualStart
  150.     mov sp, #0x8C000000
  151.     add sp, sp, #0x30000    ; arbitrary initial super-page stack pointer
  152.     b   main
  153.     END