Zynq.Memory.Mos 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. MODULE Memory;
  2. IMPORT Platform, Board, Caches, SYSTEM, Trace;
  3. CONST
  4. (* access permissions *)
  5. SrwUrw* = 3;
  6. FullAccess* = SrwUrw*400H+SrwUrw*100H+SrwUrw*40H+SrwUrw*10H; (* for small pages only *)
  7. LastStackPage* = SrwUrw*400H+SrwUrw*100H+SrwUrw*40H; (* for small pages only *)
  8. (* Control Register Flags *)
  9. DCache = 2;
  10. ICache = 12;
  11. (* Unit prefixes *)
  12. k = 1024;
  13. M = k * k;
  14. LogM = 20; (* log2(M) *)
  15. (* first level page table types *)
  16. flCoarse = 1;
  17. flSection = 2;
  18. (* Second Level *)
  19. slFault = 0;
  20. slSmall = 2;
  21. (* cachable/bufferable mapping options *)
  22. cb = 0;
  23. C* = 8;(* + 4;*)
  24. B* = 4;
  25. CB* = C + B;
  26. (* Inner and Outer Cacheable, Write-Through, no Write Allocate *)
  27. Cacheable* = 100CH; (* here inner cacheable, write-back, write-allocate *)
  28. (* Shareable *)
  29. Shareable* = 10000H;
  30. (* NIL *)
  31. NilAdr* = -1;
  32. (** Number of entries in the first level page table *)
  33. PageTableLength* = 4096;
  34. (** Initialize UART trace here *)
  35. InitTrace * = FALSE;
  36. VAR
  37. lnk : PROCEDURE;
  38. dCacheBase : LONGINT;
  39. virtualPageTable- : ADDRESS;
  40. (** Enables current processor's L1 caches *)
  41. (*PROCEDURE EnableL1Cache;
  42. CODE
  43. ; Enable Cache and TLB maintenance broadcast
  44. mrc p15, 0, r0, c1, c0, 1
  45. orr r0, r0, #1H
  46. mcr p15, 0, r0, c1, c0, 1
  47. isb
  48. ; Enable Caching in SCTLR
  49. mrc p15, 0, r0, c1, c0, 0
  50. orr r0, r0, #4H
  51. mcr p15, 0, r0, c1, c0, 0
  52. isb
  53. END EnableL1Cache;
  54. (** Enable L2 cache, prefetching and other speculative execution support *)
  55. PROCEDURE EnableL2Cache;
  56. CODE
  57. ldr r0,[pc, #L2CCCrtl-$-8] ; Load L2CC base address base + control register
  58. mov r1, #0 ; force the disable bit
  59. str r1, [r0,#0] ; disable the L2 Caches
  60. ldr r0, [pc, #L2CCAuxCtrl-$-8] ; Load L2CC base address base + Aux control register
  61. ldr r1,[r0,#0] ; read the register
  62. ldr r2, [pc, #L2CCAuxControl-$-8] ; set the default bits
  63. orr r1,r1,r2
  64. str r1, [r0,#0] ; store the Aux Control Register
  65. ldr r0,[pc, #L2CCTAGLatReg-$-8] ; Load L2CC base address base + TAG Latency address
  66. ldr r1, [pc, #L2CCTAGLatency-$-8] ; set the latencies for the TAG
  67. str r1, [r0,#0] ; store the TAG Latency register Register
  68. ldr r0, [pc, #L2CCDataLatReg-$-8] ; Load L2CC base address base + Data Latency address
  69. ldr r1,[pc, #L2CCDataLatency-$-8] ; set the latencies for the Data
  70. str r1, [r0,#0] ; store the Data Latency register Register
  71. ldr r0,[pc, #L2CCWay-$-8] ; Load L2CC base address base + way register
  72. ldr r2, [pc, #H0xffff-$-8]
  73. str r2, [r0,#0] ; force invalidate
  74. ldr r0, [pc, #L2CCSync-$-8] ; need to poll 0x730, PSS_L2CC_CACHE_SYNC_OFFSET
  75. ; Load L2CC base address base + sync register
  76. ; poll for completion
  77. Sync:
  78. ldr r1, [r0,#0]
  79. cmp r1, #0
  80. bne Sync
  81. ldr r0,[pc, #L2CCIntRaw-$-8] ; clear pending interrupts
  82. ldr r1,[r0,#0]
  83. ldr r0,[pc, #L2CCIntClear-$-8]
  84. str r1,[r0,#0]
  85. ldr r0,[pc,#L2CCCrtl-$-8] ; Load L2CC base address base + control register
  86. ldr r1,[r0,#0] ; read the register
  87. mov r2, #1 ; set the enable bit
  88. orr r1,r1,r2
  89. str r1, [r0,#0] ; enable the L2 Caches
  90. mrc p15,0,r0,c1,c0,0 ; flow prediction enable
  91. orr r0, r0, #0x800 ; #0x800
  92. mcr p15,0,r0,c1,c0,0
  93. isb
  94. mrc p15,0,r0,c1,c0,1 ; read Auxiliary Control Register
  95. orr r0, r0, #4 ; enable Dside prefetch
  96. orr r0, r0, #2 ; enable L2 Prefetch hint
  97. mcr p15,0,r0,c1,c0,1 ; write Auxiliary Control Register
  98. isb
  99. b exit
  100. ; Data
  101. H0xffff: d32 0FFFFH
  102. L2CCWay: d32 0F8F02000H + 077CH
  103. L2CCSync: d32 0F8F02000H + 0730H
  104. L2CCCrtl: d32 0F8F02000H + 0100H
  105. L2CCAuxCtrl: d32 0F8F02000H + 0104H
  106. L2CCTAGLatReg: d32 0F8F02000H + 0108H
  107. L2CCDataLatReg: d32 0F8F02000H + 010CH
  108. L2CCIntClear: d32 0F8F02000H + 0220H
  109. L2CCIntRaw: d32 0F8F02000H + 021CH
  110. L2CCAuxControl: d32 72360000H
  111. L2CCTAGLatency: d32 0111H
  112. L2CCDataLatency: d32 0121H
  113. exit:
  114. END EnableL2Cache;*)
  115. (** Enables the Snoop Control Unit
  116. for L1 coherency and LDREX/STREX global monitor
  117. *)
  118. PROCEDURE EnableSCU;
  119. CODE
  120. ; set scu enable bit in scu
  121. ldr r7, [pc, #H0xf8f00000-$-8]
  122. ldr r0, [r7, #0]
  123. orr r0, r0, #1
  124. str r0, [r7,#0]
  125. ; invalidate scu
  126. ldr r7, [pc, #H0xf8f0000c-$-8]
  127. ldr r6, [pc, #H0xffff-$-8]
  128. str r6, [r7, #0]
  129. b exit
  130. ; Data
  131. H0xf8f00000: d32 0F8F00000H
  132. H0xf8f0000c: d32 0F8F0000CH
  133. H0xffff: d32 0FFFFH
  134. exit:
  135. END EnableSCU;
  136. (** Init NEON / VFP Engine *)
  137. PROCEDURE InitFPU;
  138. CODE
  139. MRC p15, 0, R0, C1, C0, 2;
  140. ORR R0, R0, #0x00f00000;
  141. MCR p15, 0, R0, C1, C0, 2;
  142. ISB
  143. MOV R0, #0x40000000;
  144. VMSR FPEXC, R0;
  145. END InitFPU;
  146. (** Activate Assymmetric Multiprocessing Mode for current CPU.
  147. This desactivates L1 cache coherency
  148. *)
  149. PROCEDURE SetAmpMode;
  150. CODE
  151. MRC p15, 0, R0, C1, C0, 1
  152. MOV R1, #040H
  153. RSB R1, R1, #0
  154. ORR R0, R0, R1
  155. MCR p15, 0, R0, C1, C0, 1
  156. ISB
  157. END SetAmpMode;
  158. (** Enable coprocessors CP10 and CP11(= VFP and NEON engine) *)
  159. PROCEDURE EnableCoprocessors;
  160. CODE
  161. mov r0, r0
  162. mrc p15, 0, r1, c1, c0, 2 ; read cp access control register (CACR) into r1
  163. orr r1, r1, #0xf00000 ; enable full access for p10 & p11
  164. mcr p15, 0, r1, c1, c0, 2 ; write back into CACR
  165. isb
  166. END EnableCoprocessors;
  167. (*PROCEDURE FlushDCacheRange*( adr:ADDRESS; len:LONGINT );
  168. CONST
  169. cacheline = 32;
  170. L2CCBBase = 0F8F02000H; (*XPS_L2CC_BASEADDR*)
  171. L2CCCacheSync = L2CCBBase + 00730H; (* Cache Sync *)(*XPS_L2CC_CACHE_SYNC_OFFSET *)
  172. L2CCCacheInvClnPAOfs= 007F0H; (* Cache Invalidate and Clean by PA *)(*XPS_L2CC_CACHE_INV_CLN_PA_OFFSET*)
  173. VAR
  174. end:ADDRESS;
  175. L2CCOffset:ADDRESS;
  176. BEGIN
  177. L2CCOffset := L2CCBBase + L2CCCacheInvClnPAOfs;
  178. IF len # 0 THEN
  179. (* Back the starting address up to the start of a cache line
  180. perform cache operations until adr+len *)
  181. end := adr + len;
  182. adr := SYSTEM.VAL(ADDRESS,SYSTEM.VAL(SET,adr) * (-SYSTEM.VAL(SET,cacheline - 1)));
  183. (* Select cache L0 Data cache in CSSR *)
  184. CODE
  185. mcr p15, 2, r0, c0, c0, 0 (* mtcp(XREG_CP15_CACHE_SIZE_SEL, 0);*)
  186. END;
  187. WHILE adr < end DO
  188. (* Flush L1 Data cache line *)
  189. CODE
  190. ldr r3, [fp, #adr] (* load*)
  191. mcr p15, 0, r3, c7, c14, 1; MCR XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC :: "r" (adr));
  192. END;
  193. (* Flush L2 cache line *)
  194. SYSTEM.PUT(L2CCOffset, adr);
  195. CODE
  196. DSB
  197. END;
  198. adr := adr+cacheline;
  199. END;
  200. END;
  201. (* Wait for L1 and L2 flush to complete *)
  202. CODE
  203. DSB
  204. END;
  205. REPEAT UNTIL SYSTEM.GET32(L2CCCacheSync) = 0;
  206. END FlushDCacheRange;
  207. PROCEDURE DisableCache*();
  208. VAR
  209. cr1: SET;
  210. BEGIN
  211. (* disable caching & buffering globally *)
  212. cr1 := GetControlRegister();
  213. SetControlRegister(cr1 - {DCache, ICache});
  214. InvalidateDCache(dCacheBase);
  215. InvalidateICache;
  216. DrainWriteBuffer;
  217. END DisableCache;
  218. PROCEDURE CleanCache*();
  219. BEGIN
  220. InvalidateDCache(dCacheBase);
  221. InvalidateICache;
  222. DrainWriteBuffer;
  223. END CleanCache;
  224. PROCEDURE FlushDCache*( addr : ADDRESS );
  225. BEGIN
  226. FlushDCacheRange( addr, M );
  227. END FlushDCache;
  228. PROCEDURE InvalidateDCache*( dCacheBase: LONGINT );
  229. CODE
  230. LDR R1, [FP, #dCacheBase] ; R1 contains the virtual address of a region of cacheable memory
  231. LDR R1, [R1, #0]
  232. MOV R0, #1024 ; R0 is the loop count
  233. .loop1
  234. MCR p15, 0, R1, c7, c2, 5 ; allocate line in data cache
  235. ADD R1, R1, #32 ; increment the address in R1 to the next cache line
  236. SUBS R0, R0, #1
  237. BNE loop1
  238. ; clean the mini-data cache
  239. MOV R0, #64
  240. .loop2
  241. LDR R3, [R1], #32 ; load and increment to next cache line
  242. SUBS R0, R0, #1
  243. BNE loop2
  244. B invalidate
  245. DCD dCacheBase
  246. .invalidate
  247. ; invalidate data cache and mini-data cache
  248. MCR p15, 0, R0, c7, c6, 0
  249. ; cpwait
  250. MRC p15, 0, R0, c2, c0, 0
  251. MOV R0, R0
  252. SUB PC, PC, #4
  253. MOV R0, R0
  254. MOV R0, R0
  255. MOV R0, R0
  256. MOV R0, R0
  257. END InvalidateDCache;
  258. (* InvalidateICache - invalidates the ICache. Works only in a priviledged mode. *)
  259. PROCEDURE InvalidateICache*;
  260. CODE
  261. MCR p15, 0, R0, c7, c5, 0 ; invalidate ICache & BTB
  262. ; cpwait
  263. MRC p15, 0, R0, c2, c0, 0
  264. MOV R0, R0
  265. SUB PC, PC, #4
  266. MOV R0, R0
  267. MOV R0, R0
  268. MOV R0, R0
  269. MOV R0, R0
  270. END InvalidateICache;
  271. (* InvalidateTLB: data and instruction TLBs - Works only in a priviledged mode *)
  272. PROCEDURE InvalidateTLB;
  273. CODE
  274. MCR p15, 0, R0, c8, c7, 0 ; invalidate I+D TLB
  275. ; cpwait
  276. MRC p15, 0, R0, c2, c0, 0
  277. MOV R0, R0
  278. SUB PC, PC, #4
  279. MOV R0, R0
  280. MOV R0, R0
  281. MOV R0, R0
  282. MOV R0, R0
  283. END InvalidateTLB;
  284. (* InvalidateTLBEntry - invalidates the TLB for a given virtual address. Works only in a priviledged mode *)
  285. PROCEDURE InvalidateTLBEntry(address: LONGINT);
  286. CODE
  287. LDR R0, [FP, #address]
  288. ADD SP, SP, #4 ; remove parameter
  289. MCR p15, 0, R0, c8, c6, 1 ; invalidate address
  290. ; cpwait
  291. MRC p15, 0, R0, c2, c0, 0
  292. MOV R0, R0
  293. SUB PC, PC, #4
  294. MOV R0, R0
  295. MOV R0, R0
  296. MOV R0, R0
  297. MOV R0, R0
  298. END InvalidateTLBEntry;*)
  299. (* GetControlRegister - returns the control register of coprocessor 15 *)
  300. PROCEDURE -GetControlRegister(): SET;
  301. CODE
  302. MRC p15, 0, R0, c1, c0, 0
  303. END GetControlRegister;
  304. (* SetControlRegister - sets the control register of coprocessor 15. Works only in a priviledged mode *)
  305. PROCEDURE -SetControlRegister(cr: SET);
  306. CODE
  307. LDR R0, [SP, #cr]
  308. ADD SP, SP, #4 ; remove parameter
  309. MCR p15, 0, R0, c1, c0, 0
  310. ; cpwait
  311. MRC p15, 0, R0, c2, c0, 0
  312. MOV R0, R0
  313. SUB PC, PC, #4
  314. MOV R0, R0
  315. MOV R0, R0
  316. MOV R0, R0
  317. MOV R0, R0
  318. END SetControlRegister;
  319. PROCEDURE CurrentBP*(): ADDRESS;
  320. CODE
  321. MOV R0, FP
  322. END CurrentBP;
  323. PROCEDURE CurrentSP*(): ADDRESS;
  324. CODE
  325. MOV R0, SP
  326. END CurrentSP;
  327. PROCEDURE CurrentPC*(): ADDRESS;
  328. CODE
  329. MOV R0, PC
  330. END CurrentPC;
  331. PROCEDURE CurrentLR*(): ADDRESS;
  332. CODE
  333. MOV R0, LR
  334. END CurrentLR;
  335. PROCEDURE ShowStack*();
  336. BEGIN
  337. Trace.Memory( CurrentSP() - 512, 1024 );
  338. END ShowStack;
  339. (** SHR - logical shift right *)
  340. PROCEDURE SHR(value, shift: ADDRESS): LONGINT;
  341. CODE
  342. LDR R0, [FP, #value]
  343. LDR R1, [FP, #shift]
  344. MOV R0, R0, LSR R1
  345. END SHR;
  346. (** SHRL - shift right and left. Mask out 'shift' lowest bits *)
  347. PROCEDURE SHRL(value, shift: LONGINT): LONGINT;
  348. (*CODE
  349. LDR R0, [FP, #value]
  350. LDR R1, [FP, #shift]
  351. MOV R0, R0, LSR R1
  352. MOV R0, R0, LSL R1*)
  353. BEGIN
  354. value := LSH(value, -shift);
  355. value := LSH(value, shift);
  356. RETURN value
  357. END SHRL;
  358. (** Fills 'size' bytes with 'filler', from 'destAdr' on. size must be multiple of 4 *)
  359. PROCEDURE Fill32*(destAdr: ADDRESS; size: SIZE; filler: LONGINT);
  360. CODE
  361. LDR R0, [FP, #filler]
  362. LDR R1, [FP, #size]
  363. LDR R3, [FP, #destAdr]
  364. MOV R4, #0; counter
  365. (* Check size MOD 4 = 0 *)
  366. LSR R5, R1, #2
  367. LSL R5, R5, #2
  368. CMP R5, R1
  369. BEQ Loop
  370. SWI #8
  371. Loop:
  372. CMP R4, R1
  373. BGE Exit
  374. ADD R5, R3, R4
  375. STR R0, [R5, #0]; put(destAdr + counter, filler)
  376. ADD R4, R4, #4; INC(counter, 4)
  377. B Loop
  378. Exit:
  379. END Fill32;
  380. (** Fills 'size' bytes with 'filler', from 'destAdr' on. No restrictions on size *)
  381. PROCEDURE Fill8 * (destAdr: ADDRESS; size: SIZE; filler: CHAR);
  382. CODE
  383. LDRB R0, [FP, #filler]
  384. LDR R1, [FP, #size]
  385. LDR R3, [FP, #destAdr]
  386. MOV R4, #0; counter
  387. Loop:
  388. CMP R4, R1
  389. BGE Exit
  390. ADD R5, R3, R4
  391. STRB R0, [R5, #0]; put(destAdr + counter, filler)
  392. ADD R4, R4, #1; INC(counter, 4)
  393. B Loop
  394. Exit:
  395. END Fill8;
  396. (* AllocateHeap - allocates and maps [physicalAddress...physicalAddress+size] to [virtualAddress...virtualAddress+size] *)
  397. PROCEDURE AllocateMmu*(virtualAddress, physicalAddress, size: ADDRESS; accessPermissions, flags: LONGINT);
  398. VAR i, index, entry: LONGINT;
  399. BEGIN
  400. ASSERT(size MOD M = 0);
  401. index := SHR(virtualAddress, LogM - 2);
  402. FOR i := 0 TO SHR(size, LogM)-1 DO
  403. (* Trace.String("AllocateMmu: page entry address: "); Trace.Address( virtualPageTable + index ); Trace.Ln; *)
  404. entry := SYSTEM.GET32( virtualPageTable + index );
  405. ASSERT(entry MOD 4 = 0); (* entry must be free *)
  406. entry := physicalAddress + accessPermissions*400H + flags + flSection;
  407. SYSTEM.PUT32( virtualPageTable + index, entry);
  408. INC(index, 4); INC(physicalAddress, M);
  409. END
  410. END AllocateMmu;
  411. (** Enable Memory Management and virtual memory. *)
  412. PROCEDURE EnableMM(translationBase, flags: ADDRESS);
  413. CODE
  414. ; Disable AFE (special permission mode) and TRE (special memory mode)
  415. ldr r0, [pc, #pattern-$-8]
  416. mrc p15, 0, r1, c1, c0, 0
  417. and r1, r0, r1
  418. mcr p15, 0, r1, c1, c0, 0
  419. isb
  420. ldr r0, [FP, #translationBase]
  421. orr r0, r0, #07BH
  422. mcr p15, 0, r0, c2, c0, 0
  423. isb
  424. ;mvn r0, #0 ; mmu domains: 16 x 11 = manager on all domains
  425. ldr r0, [pc, #domains-$-8]
  426. mcr p15, 0, r0, c3, c0, 0
  427. isb
  428. ldr r0, [FP, #flags]
  429. ldr r1, [FP, #sctlr-$-8]
  430. orr r0, r0, r1 ; 1 bits in SCTLR
  431. mcr p15, 0, r0, c1, c0, 0
  432. isb
  433. ;dsb
  434. ;isb
  435. b exit
  436. domains: d32 55555555H ; Client on each domain
  437. pattern: d32 0CFFFFFFFH ; NOT(AFE+TRE)
  438. sctlr: d32 0C50078H
  439. exit:
  440. END EnableMM;
  441. PROCEDURE InitMemory *;
  442. VAR
  443. cr1: SET;
  444. i, k, n: LONGINT;
  445. base, adr: ADDRESS;
  446. BEGIN
  447. Caches.CleanDCacheRange(virtualPageTable, PageTableLength * 4);
  448. (* disable caching & buffering globally *)
  449. cr1 := GetControlRegister();
  450. SetControlRegister(cr1 - {DCache, ICache});
  451. (* flush all caches & the write buffer and invalidate both TLBs *)
  452. (*InvalidateDCache(dCacheBase);
  453. InvalidateICache;*)
  454. Caches.InvalidateDCache(dCacheBase);
  455. Caches.InvalidateICache;
  456. Caches.DrainWriteBuffer;
  457. Caches.InvalidateTLB;
  458. EnableMM( virtualPageTable, 1007H );
  459. END InitMemory;
  460. BEGIN
  461. (* no call before this, stack is invalidated. *)
  462. SYSTEM.PUT32(ADDRESSOF(lnk), SYSTEM.LNK());
  463. SYSTEM.LDPSR( 0, Platform.SVCMode + Platform.FIQDisabled + Platform.IRQDisabled ); (* Disable interrupts, init SP, FP *)
  464. SYSTEM.SETSP(Board.SVCSP); (* configure memory *)
  465. SYSTEM.SETFP(Board.SVCSP);
  466. SYSTEM.LDPSR( 0, Platform.IRQMode + Platform.FIQDisabled + Platform.IRQDisabled );
  467. SYSTEM.SETSP(Board.IRQSP);
  468. SYSTEM.LDPSR( 0, Platform.UndefMode + Platform.FIQDisabled + Platform.IRQDisabled );
  469. SYSTEM.SETSP(Board.UNDSP);
  470. SYSTEM.LDPSR( 0, Platform.AbortMode + Platform.FIQDisabled + Platform.IRQDisabled );
  471. SYSTEM.SETSP(Board.ABORTSP);
  472. SYSTEM.LDPSR( 0, Platform.SVCMode + Platform.FIQDisabled + Platform.IRQDisabled ); (* Disable interrupts, init SP, FP *)
  473. Trace.Init;
  474. (*IF InitTrace THEN TraceDevice.Install; END;*)
  475. Trace.StringLn("Memory Setup Completed.");
  476. dCacheBase := 100000H;
  477. virtualPageTable := Board.PageTableBase;
  478. SetAmpMode();
  479. EnableSCU;
  480. (*InvalidateTLB;
  481. InvalidateICache;
  482. InvalidateDCache( dCacheBase );*)
  483. Caches.InvalidateTLB;
  484. Caches.InvalidateICache;
  485. Caches.InvalidateDCache(dCacheBase);
  486. Caches.EnableL1Cache;
  487. Caches.EnableL2Cache;
  488. EnableCoprocessors;
  489. InitFPU;
  490. lnk;
  491. END Memory.
  492. PROCEDURE InitProcessor*;
  493. BEGIN
  494. timer := DummyEvent;
  495. Timeslice := DummyTimeslice;
  496. SetSmpMode;
  497. EnableSCU;
  498. EnableL1Cache;
  499. (*InvalidateTLB;
  500. InvalidateICache;
  501. InvalidateDCache(dCacheBase);*)
  502. Caches.InvalidateTLB;
  503. Caches.InvalidateICache;
  504. Caches.InvalidateDCache;
  505. (* SCU and L2 caches are enabled in the initialization sequence *)
  506. EnableL2Cache;
  507. EnableCoprocessors;
  508. InitFPU;
  509. allProcessors := {0}
  510. END InitProcessor;