cplbmgr.S 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. /*
  2. * File: arch/blackfin/mach-common/cplbmgtr.S
  3. * Based on:
  4. * Author: LG Soft India
  5. *
  6. * Created: ?
  7. * Description: CPLB replacement routine for CPLB mismatch
  8. *
  9. * Modified:
  10. * Copyright 2004-2006 Analog Devices Inc.
  11. *
  12. * Bugs: Enter bugs at http://blackfin.uclinux.org/
  13. *
  14. * This program is free software; you can redistribute it and/or modify
  15. * it under the terms of the GNU General Public License as published by
  16. * the Free Software Foundation; either version 2 of the License, or
  17. * (at your option) any later version.
  18. *
  19. * This program is distributed in the hope that it will be useful,
  20. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  22. * GNU General Public License for more details.
  23. *
  24. * You should have received a copy of the GNU General Public License
  25. * along with this program; if not, see the file COPYING, or write
  26. * to the Free Software Foundation, Inc.,
  27. * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  28. */
  29. /* Usage: int _cplb_mgr(is_data_miss,int enable_cache)
  30. * is_data_miss==2 => Mark as Dirty, write to the clean data page
  31. * is_data_miss==1 => Replace a data CPLB.
  32. * is_data_miss==0 => Replace an instruction CPLB.
  33. *
  34. * Returns:
  35. * CPLB_RELOADED => Successfully updated CPLB table.
  36. * CPLB_NO_UNLOCKED => All CPLBs are locked, so cannot be evicted.
  37. * This indicates that the CPLBs in the configuration
  38. * tablei are badly configured, as this should never
  39. * occur.
  40. * CPLB_NO_ADDR_MATCH => The address being accessed, that triggered the
  41. * exception, is not covered by any of the CPLBs in
  42. * the configuration table. The application is
  43. * presumably misbehaving.
  44. * CPLB_PROT_VIOL => The address being accessed, that triggered the
  45. * exception, was not a first-write to a clean Write
  46. * Back Data page, and so presumably is a genuine
  47. * violation of the page's protection attributes.
  48. * The application is misbehaving.
  49. */
  50. #include <linux/linkage.h>
  51. #include <asm/blackfin.h>
  52. #include <asm/cplb.h>
  53. #ifdef CONFIG_EXCPT_IRQ_SYSC_L1
  54. .section .l1.text
  55. #else
  56. .text
  57. #endif
  58. .align 2;
  59. ENTRY(_cplb_mgr)
  60. [--SP]=( R7:4,P5:3 );
  61. CC = R0 == 2;
  62. IF CC JUMP .Ldcplb_write;
  63. CC = R0 == 0;
  64. IF !CC JUMP .Ldcplb_miss_compare;
  65. /* ICPLB Miss Exception. We need to choose one of the
  66. * currently-installed CPLBs, and replace it with one
  67. * from the configuration table.
  68. */
  69. /* A multi-word instruction can cross a page boundary. This means the
  70. * first part of the instruction can be in a valid page, but the
  71. * second part is not, and hence generates the instruction miss.
  72. * However, the fault address is for the start of the instruction,
  73. * not the part that's in the bad page. Therefore, we have to check
  74. * whether the fault address applies to a page that is already present
  75. * in the table.
  76. */
  77. P4.L = LO(ICPLB_FAULT_ADDR);
  78. P4.H = HI(ICPLB_FAULT_ADDR);
  79. P1 = 16;
  80. P5.L = _page_size_table;
  81. P5.H = _page_size_table;
  82. P0.L = LO(ICPLB_DATA0);
  83. P0.H = HI(ICPLB_DATA0);
  84. R4 = [P4]; /* Get faulting address*/
  85. R6 = 64; /* Advance past the fault address, which*/
  86. R6 = R6 + R4; /* we'll use if we find a match*/
  87. R3 = ((16 << 8) | 2); /* Extract mask, two bits at posn 16 */
  88. R5 = 0;
  89. .Lisearch:
  90. R1 = [P0-0x100]; /* Address for this CPLB */
  91. R0 = [P0++]; /* Info for this CPLB*/
  92. CC = BITTST(R0,0); /* Is the CPLB valid?*/
  93. IF !CC JUMP .Lnomatch; /* Skip it, if not.*/
  94. CC = R4 < R1(IU); /* If fault address less than page start*/
  95. IF CC JUMP .Lnomatch; /* then skip this one.*/
  96. R2 = EXTRACT(R0,R3.L) (Z); /* Get page size*/
  97. P1 = R2;
  98. P1 = P5 + (P1<<2); /* index into page-size table*/
  99. R2 = [P1]; /* Get the page size*/
  100. R1 = R1 + R2; /* and add to page start, to get page end*/
  101. CC = R4 < R1(IU); /* and see whether fault addr is in page.*/
  102. IF !CC R4 = R6; /* If so, advance the address and finish loop.*/
  103. IF !CC JUMP .Lisearch_done;
  104. .Lnomatch:
  105. /* Go around again*/
  106. R5 += 1;
  107. CC = BITTST(R5, 4); /* i.e CC = R5 >= 16*/
  108. IF !CC JUMP .Lisearch;
  109. .Lisearch_done:
  110. I0 = R4; /* Fault address we'll search for*/
  111. /* set up pointers */
  112. P0.L = LO(ICPLB_DATA0);
  113. P0.H = HI(ICPLB_DATA0);
  114. /* The replacement procedure for ICPLBs */
  115. P4.L = LO(IMEM_CONTROL);
  116. P4.H = HI(IMEM_CONTROL);
  117. /* Turn off CPLBs while we work, necessary according to HRM before
  118. * modifying CPLB descriptors
  119. */
  120. R5 = [P4]; /* Control Register*/
  121. BITCLR(R5,ENICPLB_P);
  122. CLI R1;
  123. SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */
  124. .align 8;
  125. [P4] = R5;
  126. SSYNC;
  127. STI R1;
  128. R1 = -1; /* end point comparison */
  129. R3 = 16; /* counter */
  130. /* Search through CPLBs for first non-locked entry */
  131. /* Overwrite it by moving everyone else up by 1 */
  132. .Licheck_lock:
  133. R0 = [P0++];
  134. R3 = R3 + R1;
  135. CC = R3 == R1;
  136. IF CC JUMP .Lall_locked;
  137. CC = BITTST(R0, 0); /* an invalid entry is good */
  138. IF !CC JUMP .Lifound_victim;
  139. CC = BITTST(R0,1); /* but a locked entry isn't */
  140. IF CC JUMP .Licheck_lock;
  141. .Lifound_victim:
  142. #ifdef CONFIG_CPLB_INFO
  143. R7 = [P0 - 0x104];
  144. P2.L = _ipdt_table;
  145. P2.H = _ipdt_table;
  146. P3.L = _ipdt_swapcount_table;
  147. P3.H = _ipdt_swapcount_table;
  148. P3 += -4;
  149. .Licount:
  150. R2 = [P2]; /* address from config table */
  151. P2 += 8;
  152. P3 += 8;
  153. CC = R2==-1;
  154. IF CC JUMP .Licount_done;
  155. CC = R7==R2;
  156. IF !CC JUMP .Licount;
  157. R7 = [P3];
  158. R7 += 1;
  159. [P3] = R7;
  160. CSYNC;
  161. .Licount_done:
  162. #endif
  163. LC0=R3;
  164. LSETUP(.Lis_move,.Lie_move) LC0;
  165. .Lis_move:
  166. R0 = [P0];
  167. [P0 - 4] = R0;
  168. R0 = [P0 - 0x100];
  169. [P0-0x104] = R0;
  170. .Lie_move:
  171. P0+=4;
  172. /* Clear ICPLB_DATA15, in case we don't find a replacement
  173. * otherwise, we would have a duplicate entry, and will crash
  174. */
  175. R0 = 0;
  176. [P0 - 4] = R0;
  177. /* We've made space in the ICPLB table, so that ICPLB15
  178. * is now free to be overwritten. Next, we have to determine
  179. * which CPLB we need to install, from the configuration
  180. * table. This is a matter of getting the start-of-page
  181. * addresses and page-lengths from the config table, and
  182. * determining whether the fault address falls within that
  183. * range.
  184. */
  185. P2.L = _ipdt_table;
  186. P2.H = _ipdt_table;
  187. #ifdef CONFIG_CPLB_INFO
  188. P3.L = _ipdt_swapcount_table;
  189. P3.H = _ipdt_swapcount_table;
  190. P3 += -8;
  191. #endif
  192. P0.L = _page_size_table;
  193. P0.H = _page_size_table;
  194. /* Retrieve our fault address (which may have been advanced
  195. * because the faulting instruction crossed a page boundary).
  196. */
  197. R0 = I0;
  198. /* An extraction pattern, to get the page-size bits from
  199. * the CPLB data entry. Bits 16-17, so two bits at posn 16.
  200. */
  201. R1 = ((16<<8)|2);
  202. .Linext: R4 = [P2++]; /* address from config table */
  203. R2 = [P2++]; /* data from config table */
  204. #ifdef CONFIG_CPLB_INFO
  205. P3 += 8;
  206. #endif
  207. CC = R4 == -1; /* End of config table*/
  208. IF CC JUMP .Lno_page_in_table;
  209. /* See if failed address > start address */
  210. CC = R4 <= R0(IU);
  211. IF !CC JUMP .Linext;
  212. /* extract page size (17:16)*/
  213. R3 = EXTRACT(R2, R1.L) (Z);
  214. /* add page size to addr to get range */
  215. P5 = R3;
  216. P5 = P0 + (P5 << 2); /* scaled, for int access*/
  217. R3 = [P5];
  218. R3 = R3 + R4;
  219. /* See if failed address < (start address + page size) */
  220. CC = R0 < R3(IU);
  221. IF !CC JUMP .Linext;
  222. /* We've found a CPLB in the config table that covers
  223. * the faulting address, so install this CPLB into the
  224. * last entry of the table.
  225. */
  226. P1.L = LO(ICPLB_DATA15); /* ICPLB_DATA15 */
  227. P1.H = HI(ICPLB_DATA15);
  228. [P1] = R2;
  229. [P1-0x100] = R4;
  230. #ifdef CONFIG_CPLB_INFO
  231. R3 = [P3];
  232. R3 += 1;
  233. [P3] = R3;
  234. #endif
  235. /* P4 points to IMEM_CONTROL, and R5 contains its old
  236. * value, after we disabled ICPLBS. Re-enable them.
  237. */
  238. BITSET(R5,ENICPLB_P);
  239. CLI R2;
  240. SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */
  241. .align 8;
  242. [P4] = R5;
  243. SSYNC;
  244. STI R2;
  245. ( R7:4,P5:3 ) = [SP++];
  246. R0 = CPLB_RELOADED;
  247. RTS;
  248. /* FAILED CASES*/
  249. .Lno_page_in_table:
  250. R0 = CPLB_NO_ADDR_MATCH;
  251. JUMP .Lfail_ret;
  252. .Lall_locked:
  253. R0 = CPLB_NO_UNLOCKED;
  254. JUMP .Lfail_ret;
  255. .Lprot_violation:
  256. R0 = CPLB_PROT_VIOL;
  257. .Lfail_ret:
  258. /* Make sure we turn protection/cache back on, even in the failing case */
  259. BITSET(R5,ENICPLB_P);
  260. CLI R2;
  261. SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */
  262. .align 8;
  263. [P4] = R5;
  264. SSYNC;
  265. STI R2;
  266. ( R7:4,P5:3 ) = [SP++];
  267. RTS;
  268. .Ldcplb_write:
  269. /* if a DCPLB is marked as write-back (CPLB_WT==0), and
  270. * it is clean (CPLB_DIRTY==0), then a write to the
  271. * CPLB's page triggers a protection violation. We have to
  272. * mark the CPLB as dirty, to indicate that there are
  273. * pending writes associated with the CPLB.
  274. */
  275. P4.L = LO(DCPLB_STATUS);
  276. P4.H = HI(DCPLB_STATUS);
  277. P3.L = LO(DCPLB_DATA0);
  278. P3.H = HI(DCPLB_DATA0);
  279. R5 = [P4];
  280. /* A protection violation can be caused by more than just writes
  281. * to a clean WB page, so we have to ensure that:
  282. * - It's a write
  283. * - to a clean WB page
  284. * - and is allowed in the mode the access occurred.
  285. */
  286. CC = BITTST(R5, 16); /* ensure it was a write*/
  287. IF !CC JUMP .Lprot_violation;
  288. /* to check the rest, we have to retrieve the DCPLB.*/
  289. /* The low half of DCPLB_STATUS is a bit mask*/
  290. R2 = R5.L (Z); /* indicating which CPLB triggered the event.*/
  291. R3 = 30; /* so we can use this to determine the offset*/
  292. R2.L = SIGNBITS R2;
  293. R2 = R2.L (Z); /* into the DCPLB table.*/
  294. R3 = R3 - R2;
  295. P4 = R3;
  296. P3 = P3 + (P4<<2);
  297. R3 = [P3]; /* Retrieve the CPLB*/
  298. /* Now we can check whether it's a clean WB page*/
  299. CC = BITTST(R3, 14); /* 0==WB, 1==WT*/
  300. IF CC JUMP .Lprot_violation;
  301. CC = BITTST(R3, 7); /* 0 == clean, 1 == dirty*/
  302. IF CC JUMP .Lprot_violation;
  303. /* Check whether the write is allowed in the mode that was active.*/
  304. R2 = 1<<3; /* checking write in user mode*/
  305. CC = BITTST(R5, 17); /* 0==was user, 1==was super*/
  306. R5 = CC;
  307. R2 <<= R5; /* if was super, check write in super mode*/
  308. R2 = R3 & R2;
  309. CC = R2 == 0;
  310. IF CC JUMP .Lprot_violation;
  311. /* It's a genuine write-to-clean-page.*/
  312. BITSET(R3, 7); /* mark as dirty*/
  313. [P3] = R3; /* and write back.*/
  314. NOP;
  315. CSYNC;
  316. ( R7:4,P5:3 ) = [SP++];
  317. R0 = CPLB_RELOADED;
  318. RTS;
  319. .Ldcplb_miss_compare:
  320. /* Data CPLB Miss event. We need to choose a CPLB to
  321. * evict, and then locate a new CPLB to install from the
  322. * config table, that covers the faulting address.
  323. */
  324. P1.L = LO(DCPLB_DATA15);
  325. P1.H = HI(DCPLB_DATA15);
  326. P4.L = LO(DCPLB_FAULT_ADDR);
  327. P4.H = HI(DCPLB_FAULT_ADDR);
  328. R4 = [P4];
  329. I0 = R4;
  330. /* The replacement procedure for DCPLBs*/
  331. R6 = R1; /* Save for later*/
  332. /* Turn off CPLBs while we work.*/
  333. P4.L = LO(DMEM_CONTROL);
  334. P4.H = HI(DMEM_CONTROL);
  335. R5 = [P4];
  336. BITCLR(R5,ENDCPLB_P);
  337. CLI R0;
  338. SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */
  339. .align 8;
  340. [P4] = R5;
  341. SSYNC;
  342. STI R0;
  343. /* Start looking for a CPLB to evict. Our order of preference
  344. * is: invalid CPLBs, clean CPLBs, dirty CPLBs. Locked CPLBs
  345. * are no good.
  346. */
  347. I1.L = LO(DCPLB_DATA0);
  348. I1.H = HI(DCPLB_DATA0);
  349. P1 = 2;
  350. P2 = 16;
  351. I2.L = _dcplb_preference;
  352. I2.H = _dcplb_preference;
  353. LSETUP(.Lsdsearch1, .Ledsearch1) LC0 = P1;
  354. .Lsdsearch1:
  355. R0 = [I2++]; /* Get the bits we're interested in*/
  356. P0 = I1; /* Go back to start of table*/
  357. LSETUP (.Lsdsearch2, .Ledsearch2) LC1 = P2;
  358. .Lsdsearch2:
  359. R1 = [P0++]; /* Fetch each installed CPLB in turn*/
  360. R2 = R1 & R0; /* and test for interesting bits.*/
  361. CC = R2 == 0; /* If none are set, it'll do.*/
  362. IF !CC JUMP .Lskip_stack_check;
  363. R2 = [P0 - 0x104]; /* R2 - PageStart */
  364. P3.L = _page_size_table; /* retrieve end address */
  365. P3.H = _page_size_table; /* retrieve end address */
  366. R3 = 0x1002; /* 16th - position, 2 bits -length */
  367. #if ANOMALY_05000209
  368. nop; /* Anomaly 05000209 */
  369. #endif
  370. R7 = EXTRACT(R1,R3.l);
  371. R7 = R7 << 2; /* Page size index offset */
  372. P5 = R7;
  373. P3 = P3 + P5;
  374. R7 = [P3]; /* page size in bytes */
  375. R7 = R2 + R7; /* R7 - PageEnd */
  376. R4 = SP; /* Test SP is in range */
  377. CC = R7 < R4; /* if PageEnd < SP */
  378. IF CC JUMP .Ldfound_victim;
  379. R3 = 0x284; /* stack length from start of trap till
  380. * the point.
  381. * 20 stack locations for future modifications
  382. */
  383. R4 = R4 + R3;
  384. CC = R4 < R2; /* if SP + stacklen < PageStart */
  385. IF CC JUMP .Ldfound_victim;
  386. .Lskip_stack_check:
  387. .Ledsearch2: NOP;
  388. .Ledsearch1: NOP;
  389. /* If we got here, we didn't find a DCPLB we considered
  390. * replacable, which means all of them were locked.
  391. */
  392. JUMP .Lall_locked;
  393. .Ldfound_victim:
  394. #ifdef CONFIG_CPLB_INFO
  395. R7 = [P0 - 0x104];
  396. P2.L = _dpdt_table;
  397. P2.H = _dpdt_table;
  398. P3.L = _dpdt_swapcount_table;
  399. P3.H = _dpdt_swapcount_table;
  400. P3 += -4;
  401. .Ldicount:
  402. R2 = [P2];
  403. P2 += 8;
  404. P3 += 8;
  405. CC = R2==-1;
  406. IF CC JUMP .Ldicount_done;
  407. CC = R7==R2;
  408. IF !CC JUMP .Ldicount;
  409. R7 = [P3];
  410. R7 += 1;
  411. [P3] = R7;
  412. .Ldicount_done:
  413. #endif
  414. /* Clean down the hardware loops*/
  415. R2 = 0;
  416. LC1 = R2;
  417. LC0 = R2;
  418. /* There's a suitable victim in [P0-4] (because we've
  419. * advanced already).
  420. */
  421. .LDdoverwrite:
  422. /* [P0-4] is a suitable victim CPLB, so we want to
  423. * overwrite it by moving all the following CPLBs
  424. * one space closer to the start.
  425. */
  426. R1.L = LO(DCPLB_DATA16); /* DCPLB_DATA15 + 4 */
  427. R1.H = HI(DCPLB_DATA16);
  428. R0 = P0;
  429. /* If the victim happens to be in DCPLB15,
  430. * we don't need to move anything.
  431. */
  432. CC = R1 == R0;
  433. IF CC JUMP .Lde_moved;
  434. R1 = R1 - R0;
  435. R1 >>= 2;
  436. P1 = R1;
  437. LSETUP(.Lds_move, .Lde_move) LC0=P1;
  438. .Lds_move:
  439. R0 = [P0++]; /* move data */
  440. [P0 - 8] = R0;
  441. R0 = [P0-0x104] /* move address */
  442. .Lde_move:
  443. [P0-0x108] = R0;
  444. .Lde_moved:
  445. NOP;
  446. /* Clear DCPLB_DATA15, in case we don't find a replacement
  447. * otherwise, we would have a duplicate entry, and will crash
  448. */
  449. R0 = 0;
  450. [P0 - 0x4] = R0;
  451. /* We've now made space in DCPLB15 for the new CPLB to be
  452. * installed. The next stage is to locate a CPLB in the
  453. * config table that covers the faulting address.
  454. */
  455. R0 = I0; /* Our faulting address */
  456. P2.L = _dpdt_table;
  457. P2.H = _dpdt_table;
  458. #ifdef CONFIG_CPLB_INFO
  459. P3.L = _dpdt_swapcount_table;
  460. P3.H = _dpdt_swapcount_table;
  461. P3 += -8;
  462. #endif
  463. P1.L = _page_size_table;
  464. P1.H = _page_size_table;
  465. /* An extraction pattern, to retrieve bits 17:16.*/
  466. R1 = (16<<8)|2;
  467. .Ldnext: R4 = [P2++]; /* address */
  468. R2 = [P2++]; /* data */
  469. #ifdef CONFIG_CPLB_INFO
  470. P3 += 8;
  471. #endif
  472. CC = R4 == -1;
  473. IF CC JUMP .Lno_page_in_table;
  474. /* See if failed address > start address */
  475. CC = R4 <= R0(IU);
  476. IF !CC JUMP .Ldnext;
  477. /* extract page size (17:16)*/
  478. R3 = EXTRACT(R2, R1.L) (Z);
  479. /* add page size to addr to get range */
  480. P5 = R3;
  481. P5 = P1 + (P5 << 2);
  482. R3 = [P5];
  483. R3 = R3 + R4;
  484. /* See if failed address < (start address + page size) */
  485. CC = R0 < R3(IU);
  486. IF !CC JUMP .Ldnext;
  487. /* We've found the CPLB that should be installed, so
  488. * write it into CPLB15, masking off any caching bits
  489. * if necessary.
  490. */
  491. P1.L = LO(DCPLB_DATA15);
  492. P1.H = HI(DCPLB_DATA15);
  493. /* If the DCPLB has cache bits set, but caching hasn't
  494. * been enabled, then we want to mask off the cache-in-L1
  495. * bit before installing. Moreover, if caching is off, we
  496. * also want to ensure that the DCPLB has WT mode set, rather
  497. * than WB, since WB pages still trigger first-write exceptions
  498. * even when not caching is off, and the page isn't marked as
  499. * cachable. Finally, we could mark the page as clean, not dirty,
  500. * but we choose to leave that decision to the user; if the user
  501. * chooses to have a CPLB pre-defined as dirty, then they always
  502. * pay the cost of flushing during eviction, but don't pay the
  503. * cost of first-write exceptions to mark the page as dirty.
  504. */
  505. #ifdef CONFIG_BFIN_WT
  506. BITSET(R6, 14); /* Set WT*/
  507. #endif
  508. [P1] = R2;
  509. [P1-0x100] = R4;
  510. #ifdef CONFIG_CPLB_INFO
  511. R3 = [P3];
  512. R3 += 1;
  513. [P3] = R3;
  514. #endif
  515. /* We've installed the CPLB, so re-enable CPLBs. P4
  516. * points to DMEM_CONTROL, and R5 is the value we
  517. * last wrote to it, when we were disabling CPLBs.
  518. */
  519. BITSET(R5,ENDCPLB_P);
  520. CLI R2;
  521. .align 8;
  522. [P4] = R5;
  523. SSYNC;
  524. STI R2;
  525. ( R7:4,P5:3 ) = [SP++];
  526. R0 = CPLB_RELOADED;
  527. RTS;
  528. ENDPROC(_cplb_mgr)
  529. .data
  530. .align 4;
  531. _page_size_table:
  532. .byte4 0x00000400; /* 1K */
  533. .byte4 0x00001000; /* 4K */
  534. .byte4 0x00100000; /* 1M */
  535. .byte4 0x00400000; /* 4M */
  536. .align 4;
  537. _dcplb_preference:
  538. .byte4 0x00000001; /* valid bit */
  539. .byte4 0x00000002; /* lock bit */