aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/mips/mm/tlbex.c159
1 files changed, 71 insertions, 88 deletions
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
index e1a8139fc8fb..375e0991505d 100644
--- a/arch/mips/mm/tlbex.c
+++ b/arch/mips/mm/tlbex.c
@@ -5,7 +5,7 @@
5 * 5 *
6 * Synthesize TLB refill handlers at runtime. 6 * Synthesize TLB refill handlers at runtime.
7 * 7 *
8 * Copyright (C) 2004,2005 by Thiemo Seufer 8 * Copyright (C) 2004,2005,2006 by Thiemo Seufer
9 * Copyright (C) 2005 Maciej W. Rozycki 9 * Copyright (C) 2005 Maciej W. Rozycki
10 * Copyright (C) 2006 Ralf Baechle (ralf@linux-mips.org) 10 * Copyright (C) 2006 Ralf Baechle (ralf@linux-mips.org)
11 * 11 *
@@ -35,8 +35,6 @@
35#include <asm/smp.h> 35#include <asm/smp.h>
36#include <asm/war.h> 36#include <asm/war.h>
37 37
38/* #define DEBUG_TLB */
39
40static __init int __attribute__((unused)) r45k_bvahwbug(void) 38static __init int __attribute__((unused)) r45k_bvahwbug(void)
41{ 39{
42 /* XXX: We should probe for the presence of this bug, but we don't. */ 40 /* XXX: We should probe for the presence of this bug, but we don't. */
@@ -728,6 +726,7 @@ static void __init build_r3000_tlb_refill_handler(void)
728{ 726{
729 long pgdc = (long)pgd_current; 727 long pgdc = (long)pgd_current;
730 u32 *p; 728 u32 *p;
729 int i;
731 730
732 memset(tlb_handler, 0, sizeof(tlb_handler)); 731 memset(tlb_handler, 0, sizeof(tlb_handler));
733 p = tlb_handler; 732 p = tlb_handler;
@@ -753,16 +752,14 @@ static void __init build_r3000_tlb_refill_handler(void)
753 if (p > tlb_handler + 32) 752 if (p > tlb_handler + 32)
754 panic("TLB refill handler space exceeded"); 753 panic("TLB refill handler space exceeded");
755 754
756 printk("Synthesized TLB refill handler (%u instructions).\n", 755 pr_info("Synthesized TLB refill handler (%u instructions).\n",
757 (unsigned int)(p - tlb_handler)); 756 (unsigned int)(p - tlb_handler));
758#ifdef DEBUG_TLB
759 {
760 int i;
761 757
762 for (i = 0; i < (p - tlb_handler); i++) 758 pr_debug("\t.set push\n");
763 printk("%08x\n", tlb_handler[i]); 759 pr_debug("\t.set noreorder\n");
764 } 760 for (i = 0; i < (p - tlb_handler); i++)
765#endif 761 pr_debug("\t.word 0x%08x\n", tlb_handler[i]);
762 pr_debug("\t.set pop\n");
766 763
767 memcpy((void *)ebase, tlb_handler, 0x80); 764 memcpy((void *)ebase, tlb_handler, 0x80);
768} 765}
@@ -1175,6 +1172,7 @@ static void __init build_r4000_tlb_refill_handler(void)
1175 struct reloc *r = relocs; 1172 struct reloc *r = relocs;
1176 u32 *f; 1173 u32 *f;
1177 unsigned int final_len; 1174 unsigned int final_len;
1175 int i;
1178 1176
1179 memset(tlb_handler, 0, sizeof(tlb_handler)); 1177 memset(tlb_handler, 0, sizeof(tlb_handler));
1180 memset(labels, 0, sizeof(labels)); 1178 memset(labels, 0, sizeof(labels));
@@ -1272,24 +1270,21 @@ static void __init build_r4000_tlb_refill_handler(void)
1272#endif /* CONFIG_64BIT */ 1270#endif /* CONFIG_64BIT */
1273 1271
1274 resolve_relocs(relocs, labels); 1272 resolve_relocs(relocs, labels);
1275 printk("Synthesized TLB refill handler (%u instructions).\n", 1273 pr_info("Synthesized TLB refill handler (%u instructions).\n",
1276 final_len); 1274 final_len);
1277
1278#ifdef DEBUG_TLB
1279 {
1280 int i;
1281 1275
1282 f = final_handler; 1276 f = final_handler;
1283#ifdef CONFIG_64BIT 1277#ifdef CONFIG_64BIT
1284 if (final_len > 32) 1278 if (final_len > 32)
1285 final_len = 64; 1279 final_len = 64;
1286 else 1280 else
1287 f = final_handler + 32; 1281 f = final_handler + 32;
1288#endif /* CONFIG_64BIT */ 1282#endif /* CONFIG_64BIT */
1289 for (i = 0; i < final_len; i++) 1283 pr_debug("\t.set push\n");
1290 printk("%08x\n", f[i]); 1284 pr_debug("\t.set noreorder\n");
1291 } 1285 for (i = 0; i < final_len; i++)
1292#endif 1286 pr_debug("\t.word 0x%08x\n", f[i]);
1287 pr_debug("\t.set pop\n");
1293 1288
1294 memcpy((void *)ebase, final_handler, 0x100); 1289 memcpy((void *)ebase, final_handler, 0x100);
1295} 1290}
@@ -1522,6 +1517,7 @@ static void __init build_r3000_tlb_load_handler(void)
1522 u32 *p = handle_tlbl; 1517 u32 *p = handle_tlbl;
1523 struct label *l = labels; 1518 struct label *l = labels;
1524 struct reloc *r = relocs; 1519 struct reloc *r = relocs;
1520 int i;
1525 1521
1526 memset(handle_tlbl, 0, sizeof(handle_tlbl)); 1522 memset(handle_tlbl, 0, sizeof(handle_tlbl));
1527 memset(labels, 0, sizeof(labels)); 1523 memset(labels, 0, sizeof(labels));
@@ -1541,17 +1537,14 @@ static void __init build_r3000_tlb_load_handler(void)
1541 panic("TLB load handler fastpath space exceeded"); 1537 panic("TLB load handler fastpath space exceeded");
1542 1538
1543 resolve_relocs(relocs, labels); 1539 resolve_relocs(relocs, labels);
1544 printk("Synthesized TLB load handler fastpath (%u instructions).\n", 1540 pr_info("Synthesized TLB load handler fastpath (%u instructions).\n",
1545 (unsigned int)(p - handle_tlbl)); 1541 (unsigned int)(p - handle_tlbl));
1546
1547#ifdef DEBUG_TLB
1548 {
1549 int i;
1550 1542
1551 for (i = 0; i < (p - handle_tlbl); i++) 1543 pr_debug("\t.set push\n");
1552 printk("%08x\n", handle_tlbl[i]); 1544 pr_debug("\t.set noreorder\n");
1553 } 1545 for (i = 0; i < (p - handle_tlbl); i++)
1554#endif 1546 pr_debug("\t.word 0x%08x\n", handle_tlbl[i]);
1547 pr_debug("\t.set pop\n");
1555} 1548}
1556 1549
1557static void __init build_r3000_tlb_store_handler(void) 1550static void __init build_r3000_tlb_store_handler(void)
@@ -1559,6 +1552,7 @@ static void __init build_r3000_tlb_store_handler(void)
1559 u32 *p = handle_tlbs; 1552 u32 *p = handle_tlbs;
1560 struct label *l = labels; 1553 struct label *l = labels;
1561 struct reloc *r = relocs; 1554 struct reloc *r = relocs;
1555 int i;
1562 1556
1563 memset(handle_tlbs, 0, sizeof(handle_tlbs)); 1557 memset(handle_tlbs, 0, sizeof(handle_tlbs));
1564 memset(labels, 0, sizeof(labels)); 1558 memset(labels, 0, sizeof(labels));
@@ -1578,17 +1572,14 @@ static void __init build_r3000_tlb_store_handler(void)
1578 panic("TLB store handler fastpath space exceeded"); 1572 panic("TLB store handler fastpath space exceeded");
1579 1573
1580 resolve_relocs(relocs, labels); 1574 resolve_relocs(relocs, labels);
1581 printk("Synthesized TLB store handler fastpath (%u instructions).\n", 1575 pr_info("Synthesized TLB store handler fastpath (%u instructions).\n",
1582 (unsigned int)(p - handle_tlbs)); 1576 (unsigned int)(p - handle_tlbs));
1583 1577
1584#ifdef DEBUG_TLB 1578 pr_debug("\t.set push\n");
1585 { 1579 pr_debug("\t.set noreorder\n");
1586 int i; 1580 for (i = 0; i < (p - handle_tlbs); i++)
1587 1581 pr_debug("\t.word 0x%08x\n", handle_tlbs[i]);
1588 for (i = 0; i < (p - handle_tlbs); i++) 1582 pr_debug("\t.set pop\n");
1589 printk("%08x\n", handle_tlbs[i]);
1590 }
1591#endif
1592} 1583}
1593 1584
1594static void __init build_r3000_tlb_modify_handler(void) 1585static void __init build_r3000_tlb_modify_handler(void)
@@ -1596,6 +1587,7 @@ static void __init build_r3000_tlb_modify_handler(void)
1596 u32 *p = handle_tlbm; 1587 u32 *p = handle_tlbm;
1597 struct label *l = labels; 1588 struct label *l = labels;
1598 struct reloc *r = relocs; 1589 struct reloc *r = relocs;
1590 int i;
1599 1591
1600 memset(handle_tlbm, 0, sizeof(handle_tlbm)); 1592 memset(handle_tlbm, 0, sizeof(handle_tlbm));
1601 memset(labels, 0, sizeof(labels)); 1593 memset(labels, 0, sizeof(labels));
@@ -1615,17 +1607,14 @@ static void __init build_r3000_tlb_modify_handler(void)
1615 panic("TLB modify handler fastpath space exceeded"); 1607 panic("TLB modify handler fastpath space exceeded");
1616 1608
1617 resolve_relocs(relocs, labels); 1609 resolve_relocs(relocs, labels);
1618 printk("Synthesized TLB modify handler fastpath (%u instructions).\n", 1610 pr_info("Synthesized TLB modify handler fastpath (%u instructions).\n",
1619 (unsigned int)(p - handle_tlbm)); 1611 (unsigned int)(p - handle_tlbm));
1620 1612
1621#ifdef DEBUG_TLB 1613 pr_debug("\t.set push\n");
1622 { 1614 pr_debug("\t.set noreorder\n");
1623 int i; 1615 for (i = 0; i < (p - handle_tlbm); i++)
1624 1616 pr_debug("\t.word 0x%08x\n", handle_tlbm[i]);
1625 for (i = 0; i < (p - handle_tlbm); i++) 1617 pr_debug("\t.set pop\n");
1626 printk("%08x\n", handle_tlbm[i]);
1627 }
1628#endif
1629} 1618}
1630 1619
1631/* 1620/*
@@ -1677,6 +1666,7 @@ static void __init build_r4000_tlb_load_handler(void)
1677 u32 *p = handle_tlbl; 1666 u32 *p = handle_tlbl;
1678 struct label *l = labels; 1667 struct label *l = labels;
1679 struct reloc *r = relocs; 1668 struct reloc *r = relocs;
1669 int i;
1680 1670
1681 memset(handle_tlbl, 0, sizeof(handle_tlbl)); 1671 memset(handle_tlbl, 0, sizeof(handle_tlbl));
1682 memset(labels, 0, sizeof(labels)); 1672 memset(labels, 0, sizeof(labels));
@@ -1704,17 +1694,14 @@ static void __init build_r4000_tlb_load_handler(void)
1704 panic("TLB load handler fastpath space exceeded"); 1694 panic("TLB load handler fastpath space exceeded");
1705 1695
1706 resolve_relocs(relocs, labels); 1696 resolve_relocs(relocs, labels);
1707 printk("Synthesized TLB load handler fastpath (%u instructions).\n", 1697 pr_info("Synthesized TLB load handler fastpath (%u instructions).\n",
1708 (unsigned int)(p - handle_tlbl)); 1698 (unsigned int)(p - handle_tlbl));
1709
1710#ifdef DEBUG_TLB
1711 {
1712 int i;
1713 1699
1714 for (i = 0; i < (p - handle_tlbl); i++) 1700 pr_debug("\t.set push\n");
1715 printk("%08x\n", handle_tlbl[i]); 1701 pr_debug("\t.set noreorder\n");
1716 } 1702 for (i = 0; i < (p - handle_tlbl); i++)
1717#endif 1703 pr_debug("\t.word 0x%08x\n", handle_tlbl[i]);
1704 pr_debug("\t.set pop\n");
1718} 1705}
1719 1706
1720static void __init build_r4000_tlb_store_handler(void) 1707static void __init build_r4000_tlb_store_handler(void)
@@ -1722,6 +1709,7 @@ static void __init build_r4000_tlb_store_handler(void)
1722 u32 *p = handle_tlbs; 1709 u32 *p = handle_tlbs;
1723 struct label *l = labels; 1710 struct label *l = labels;
1724 struct reloc *r = relocs; 1711 struct reloc *r = relocs;
1712 int i;
1725 1713
1726 memset(handle_tlbs, 0, sizeof(handle_tlbs)); 1714 memset(handle_tlbs, 0, sizeof(handle_tlbs));
1727 memset(labels, 0, sizeof(labels)); 1715 memset(labels, 0, sizeof(labels));
@@ -1740,17 +1728,14 @@ static void __init build_r4000_tlb_store_handler(void)
1740 panic("TLB store handler fastpath space exceeded"); 1728 panic("TLB store handler fastpath space exceeded");
1741 1729
1742 resolve_relocs(relocs, labels); 1730 resolve_relocs(relocs, labels);
1743 printk("Synthesized TLB store handler fastpath (%u instructions).\n", 1731 pr_info("Synthesized TLB store handler fastpath (%u instructions).\n",
1744 (unsigned int)(p - handle_tlbs)); 1732 (unsigned int)(p - handle_tlbs));
1745
1746#ifdef DEBUG_TLB
1747 {
1748 int i;
1749 1733
1750 for (i = 0; i < (p - handle_tlbs); i++) 1734 pr_debug("\t.set push\n");
1751 printk("%08x\n", handle_tlbs[i]); 1735 pr_debug("\t.set noreorder\n");
1752 } 1736 for (i = 0; i < (p - handle_tlbs); i++)
1753#endif 1737 pr_debug("\t.word 0x%08x\n", handle_tlbs[i]);
1738 pr_debug("\t.set pop\n");
1754} 1739}
1755 1740
1756static void __init build_r4000_tlb_modify_handler(void) 1741static void __init build_r4000_tlb_modify_handler(void)
@@ -1758,6 +1743,7 @@ static void __init build_r4000_tlb_modify_handler(void)
1758 u32 *p = handle_tlbm; 1743 u32 *p = handle_tlbm;
1759 struct label *l = labels; 1744 struct label *l = labels;
1760 struct reloc *r = relocs; 1745 struct reloc *r = relocs;
1746 int i;
1761 1747
1762 memset(handle_tlbm, 0, sizeof(handle_tlbm)); 1748 memset(handle_tlbm, 0, sizeof(handle_tlbm));
1763 memset(labels, 0, sizeof(labels)); 1749 memset(labels, 0, sizeof(labels));
@@ -1777,17 +1763,14 @@ static void __init build_r4000_tlb_modify_handler(void)
1777 panic("TLB modify handler fastpath space exceeded"); 1763 panic("TLB modify handler fastpath space exceeded");
1778 1764
1779 resolve_relocs(relocs, labels); 1765 resolve_relocs(relocs, labels);
1780 printk("Synthesized TLB modify handler fastpath (%u instructions).\n", 1766 pr_info("Synthesized TLB modify handler fastpath (%u instructions).\n",
1781 (unsigned int)(p - handle_tlbm)); 1767 (unsigned int)(p - handle_tlbm));
1782 1768
1783#ifdef DEBUG_TLB 1769 pr_debug("\t.set push\n");
1784 { 1770 pr_debug("\t.set noreorder\n");
1785 int i; 1771 for (i = 0; i < (p - handle_tlbm); i++)
1786 1772 pr_debug("\t.word 0x%08x\n", handle_tlbm[i]);
1787 for (i = 0; i < (p - handle_tlbm); i++) 1773 pr_debug("\t.set pop\n");
1788 printk("%08x\n", handle_tlbm[i]);
1789 }
1790#endif
1791} 1774}
1792 1775
1793void __init build_tlb_refill_handler(void) 1776void __init build_tlb_refill_handler(void)