SysUtils.Mos 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. MODULE SysUtils; (** AUTHOR ""; PURPOSE ""; *)
  2. IMPORT S:=SYSTEM;
  3. CONST
  4. cacheline = 32;
  5. L2CCBBase = 0F8F02000H; (*XPS_L2CC_BASEADDR*)
  6. L2CCCacheSync = L2CCBBase + 00730H; (* Cache Sync *)(*XPS_L2CC_CACHE_SYNC_OFFSET *)
  7. L2CCCacheIInvldPAOfs = 00770H; (*XPS_L2CC_CACHE_INVLD_PA_OFFSET*)
  8. L2CCCacheInvClnPAOfs= 007F0H; (* Cache Invalidate and Clean by PA *)(*XPS_L2CC_CACHE_INV_CLN_PA_OFFSET*)
  9. PageTableBaseAddress = 10000000H - 100000H;
  10. PROCEDURE -GetSP*(): ADDRESS;
  11. CODE
  12. mov r0, sp
  13. END GetSP;
  14. PROCEDURE -dsb();
  15. CODE
  16. d32 0F57FF04FH ; dsb
  17. END dsb;
  18. PROCEDURE -isb();
  19. CODE
  20. d32 0F57FF06FH ; isb to sync the change to the CacheSizeID reg
  21. END isb;
  22. PROCEDURE DCacheFlushRange*(adr:ADDRESS; len:LONGINT);
  23. VAR
  24. end:ADDRESS;
  25. L2CCOffset:ADDRESS;
  26. BEGIN
  27. (* UartMin.Str("DCFRange;");*)
  28. L2CCOffset := L2CCBBase + L2CCCacheInvClnPAOfs;
  29. IF len # 0 THEN
  30. (* Back the starting address up to the start of a cache line
  31. perform cache operations until adr+len *)
  32. end := adr + len;
  33. adr := S.VAL(ADDRESS,S.VAL(SET,adr) * (-S.VAL(SET,cacheline - 1)));
  34. (* Select cache L0 Data cache in CSSR *)
  35. CODE
  36. mcr p15, 2, r0, c0, c0, 0 (* mtcp(XREG_CP15_CACHE_SIZE_SEL, 0);*)
  37. END;
  38. WHILE adr < end DO
  39. (* Flush L1 Data cache line *)
  40. CODE
  41. str r3, [fp, #adr] (* load*)
  42. mcr p15, 0, r3, c7, c14, 1; MCR XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC :: "r" (adr));
  43. END;
  44. (* Flush L2 cache line *)
  45. S.PUT(L2CCOffset, adr);
  46. dsb();
  47. adr := adr+cacheline;
  48. END;
  49. END;
  50. (* Wait for L1 and L2 flush to complete *)
  51. dsb();
  52. REPEAT UNTIL S.GET32(L2CCCacheSync) = 0;
  53. END DCacheFlushRange;
  54. PROCEDURE DCacheInvalidateRange*(adr:ADDRESS; len:LONGINT);
  55. VAR
  56. end:ADDRESS;
  57. L2CCOffset:ADDRESS;
  58. BEGIN
  59. (* UartMin.StrLn("DCIRange;");*)
  60. L2CCOffset := L2CCBBase + L2CCCacheIInvldPAOfs;
  61. IF len # 0 THEN
  62. (* Back the starting address up to the start of a cache line
  63. * perform cache operations until adr+len
  64. *)
  65. end := adr + len;
  66. adr := S.VAL(ADDRESS,S.VAL(SET,adr) * (-S.VAL(SET,cacheline - 1)));
  67. (* Select L1 Data cache in CSSR *)
  68. CODE
  69. mcr p15, 2, r2, c0, c0, 0 (* XREG_CP15_INVAL_DC_LINE_MVA_POC;*)
  70. END;
  71. WHILE adr < end DO
  72. (* Invalidate L2 cache line *)
  73. S.PUT(L2CCOffset, adr);
  74. dsb();
  75. (* Invalidate L1 Data cache line *)
  76. CODE
  77. str r3, [fp, #adr] (* load*)
  78. mcr p15, 0, r3, c7, c6, 1; MCR XREG_CP15_INVAL_DC_LINE_MVA_POC :: "r" (adr));
  79. END;
  80. adr :=adr + cacheline;
  81. END;
  82. END;
  83. (* Wait for L1 and L2 invalidate to complete *)
  84. dsb();
  85. REPEAT UNTIL S.GET32(L2CCCacheSync) = 0;
  86. END DCacheInvalidateRange;
  87. PROCEDURE SetTlbAttributes*(addr:ADDRESS; attrib:SET);
  88. VAR
  89. ptr, section:ADDRESS;
  90. BEGIN
  91. (*
  92. mtcp(XREG_CP15_INVAL_UTLB_UNLOCKED, 0);*)
  93. CODE
  94. mov r3, #0
  95. mcr p15, 0, r3, c8, c7,0
  96. END;
  97. dsb();
  98. section := addr DIV 0100000H;
  99. ptr := PageTableBaseAddress+ section;(*TODO: Platform.MMUPhysicalTableBase !!!!!!!!!!!!!!!!!!!*)
  100. S.PUT(ptr, S.VAL(SET,addr) * S.VAL(SET,0FFF00000H) + attrib);
  101. dsb();
  102. (* mtcp(XREG_CP15_INVAL_UTLB_UNLOCKED, 0);
  103. (* Invalidate all branch predictors *)
  104. mtcp(XREG_CP15_INVAL_BRANCH_ARRAY, 0);
  105. *)
  106. CODE
  107. mov r3, #0
  108. mcr p15, 0, r3, c8, c7, 0
  109. mcr p15, 0, r3, c7, c5, 6
  110. END;
  111. dsb(); (* ensure completion of the BP and TLB invalidation *)
  112. isb(); (* synchronize context on this processor *)
  113. END SetTlbAttributes;
  114. END SysUtils.