@@ -1455,27 +1455,25 @@ static void __cpuinit build_r4000_tlb_refill_handler(void)
1455
1455
dump_handler ("r4000_tlb_refill" , (u32 * )ebase , 64 );
1456
1456
}
1457
1457
1458
- /*
1459
- * 128 instructions for the fastpath handler is generous and should
1460
- * never be exceeded.
1461
- */
1462
- #define FASTPATH_SIZE 128
1458
+ extern u32 handle_tlbl [], handle_tlbl_end [];
1459
+ extern u32 handle_tlbs [], handle_tlbs_end [];
1460
+ extern u32 handle_tlbm [], handle_tlbm_end [];
1463
1461
1464
- u32 handle_tlbl [FASTPATH_SIZE ] __cacheline_aligned ;
1465
- u32 handle_tlbs [FASTPATH_SIZE ] __cacheline_aligned ;
1466
- u32 handle_tlbm [FASTPATH_SIZE ] __cacheline_aligned ;
1467
1462
#ifdef CONFIG_MIPS_PGD_C0_CONTEXT
1468
- u32 tlbmiss_handler_setup_pgd_array [ 16 ] __cacheline_aligned ;
1463
+ extern u32 tlbmiss_handler_setup_pgd [], tlbmiss_handler_setup_pgd_end [] ;
1469
1464
1470
1465
static void __cpuinit build_r4000_setup_pgd (void )
1471
1466
{
1472
1467
const int a0 = 4 ;
1473
1468
const int a1 = 5 ;
1474
1469
u32 * p = tlbmiss_handler_setup_pgd_array ;
1470
+ const int tlbmiss_handler_setup_pgd_size =
1471
+ tlbmiss_handler_setup_pgd_end - tlbmiss_handler_setup_pgd ;
1475
1472
struct uasm_label * l = labels ;
1476
1473
struct uasm_reloc * r = relocs ;
1477
1474
1478
- memset (tlbmiss_handler_setup_pgd_array , 0 , sizeof (tlbmiss_handler_setup_pgd_array ));
1475
+ memset (tlbmiss_handler_setup_pgd , 0 , tlbmiss_handler_setup_pgd_size *
1476
+ sizeof (tlbmiss_handler_setup_pgd [0 ]));
1479
1477
memset (labels , 0 , sizeof (labels ));
1480
1478
memset (relocs , 0 , sizeof (relocs ));
1481
1479
@@ -1503,15 +1501,15 @@ static void __cpuinit build_r4000_setup_pgd(void)
1503
1501
uasm_i_jr (& p , 31 );
1504
1502
UASM_i_MTC0 (& p , a0 , c0_kscratch (), pgd_reg );
1505
1503
}
1506
- if (p - tlbmiss_handler_setup_pgd_array > ARRAY_SIZE (tlbmiss_handler_setup_pgd_array ))
1507
- panic ("tlbmiss_handler_setup_pgd_array space exceeded" );
1504
+ if (p >= tlbmiss_handler_setup_pgd_end )
1505
+ panic ("tlbmiss_handler_setup_pgd space exceeded" );
1506
+
1508
1507
uasm_resolve_relocs (relocs , labels );
1509
- pr_debug ("Wrote tlbmiss_handler_setup_pgd_array (%u instructions).\n" ,
1510
- (unsigned int )(p - tlbmiss_handler_setup_pgd_array ));
1508
+ pr_debug ("Wrote tlbmiss_handler_setup_pgd (%u instructions).\n" ,
1509
+ (unsigned int )(p - tlbmiss_handler_setup_pgd ));
1511
1510
1512
- dump_handler ("tlbmiss_handler" ,
1513
- tlbmiss_handler_setup_pgd_array ,
1514
- ARRAY_SIZE (tlbmiss_handler_setup_pgd_array ));
1511
+ dump_handler ("tlbmiss_handler" , tlbmiss_handler_setup_pgd ,
1512
+ tlbmiss_handler_setup_pgd_size );
1515
1513
}
1516
1514
#endif
1517
1515
@@ -1756,10 +1754,11 @@ build_r3000_tlbchange_handler_head(u32 **p, unsigned int pte,
1756
1754
static void __cpuinit build_r3000_tlb_load_handler (void )
1757
1755
{
1758
1756
u32 * p = handle_tlbl ;
1757
+ const int handle_tlbl_size = handle_tlbl_end - handle_tlbl ;
1759
1758
struct uasm_label * l = labels ;
1760
1759
struct uasm_reloc * r = relocs ;
1761
1760
1762
- memset (handle_tlbl , 0 , sizeof (handle_tlbl ));
1761
+ memset (handle_tlbl , 0 , handle_tlbl_size * sizeof (handle_tlbl [ 0 ] ));
1763
1762
memset (labels , 0 , sizeof (labels ));
1764
1763
memset (relocs , 0 , sizeof (relocs ));
1765
1764
@@ -1773,23 +1772,24 @@ static void __cpuinit build_r3000_tlb_load_handler(void)
1773
1772
uasm_i_j (& p , (unsigned long )tlb_do_page_fault_0 & 0x0fffffff );
1774
1773
uasm_i_nop (& p );
1775
1774
1776
- if (( p - handle_tlbl ) > FASTPATH_SIZE )
1775
+ if (p >= handle_tlbl_end )
1777
1776
panic ("TLB load handler fastpath space exceeded" );
1778
1777
1779
1778
uasm_resolve_relocs (relocs , labels );
1780
1779
pr_debug ("Wrote TLB load handler fastpath (%u instructions).\n" ,
1781
1780
(unsigned int )(p - handle_tlbl ));
1782
1781
1783
- dump_handler ("r3000_tlb_load" , handle_tlbl , ARRAY_SIZE ( handle_tlbl ) );
1782
+ dump_handler ("r3000_tlb_load" , handle_tlbl , handle_tlbl_size );
1784
1783
}
1785
1784
1786
1785
static void __cpuinit build_r3000_tlb_store_handler (void )
1787
1786
{
1788
1787
u32 * p = handle_tlbs ;
1788
+ const int handle_tlbs_size = handle_tlbs_end - handle_tlbs ;
1789
1789
struct uasm_label * l = labels ;
1790
1790
struct uasm_reloc * r = relocs ;
1791
1791
1792
- memset (handle_tlbs , 0 , sizeof (handle_tlbs ));
1792
+ memset (handle_tlbs , 0 , handle_tlbs_size * sizeof (handle_tlbs [ 0 ] ));
1793
1793
memset (labels , 0 , sizeof (labels ));
1794
1794
memset (relocs , 0 , sizeof (relocs ));
1795
1795
@@ -1803,23 +1803,24 @@ static void __cpuinit build_r3000_tlb_store_handler(void)
1803
1803
uasm_i_j (& p , (unsigned long )tlb_do_page_fault_1 & 0x0fffffff );
1804
1804
uasm_i_nop (& p );
1805
1805
1806
- if (( p - handle_tlbs ) > FASTPATH_SIZE )
1806
+ if (p >= handle_tlbs )
1807
1807
panic ("TLB store handler fastpath space exceeded" );
1808
1808
1809
1809
uasm_resolve_relocs (relocs , labels );
1810
1810
pr_debug ("Wrote TLB store handler fastpath (%u instructions).\n" ,
1811
1811
(unsigned int )(p - handle_tlbs ));
1812
1812
1813
- dump_handler ("r3000_tlb_store" , handle_tlbs , ARRAY_SIZE ( handle_tlbs ) );
1813
+ dump_handler ("r3000_tlb_store" , handle_tlbs , handle_tlbs_size );
1814
1814
}
1815
1815
1816
1816
static void __cpuinit build_r3000_tlb_modify_handler (void )
1817
1817
{
1818
1818
u32 * p = handle_tlbm ;
1819
+ const int handle_tlbm_size = handle_tlbm_end - handle_tlbm ;
1819
1820
struct uasm_label * l = labels ;
1820
1821
struct uasm_reloc * r = relocs ;
1821
1822
1822
- memset (handle_tlbm , 0 , sizeof (handle_tlbm ));
1823
+ memset (handle_tlbm , 0 , handle_tlbm_size * sizeof (handle_tlbm [ 0 ] ));
1823
1824
memset (labels , 0 , sizeof (labels ));
1824
1825
memset (relocs , 0 , sizeof (relocs ));
1825
1826
@@ -1833,14 +1834,14 @@ static void __cpuinit build_r3000_tlb_modify_handler(void)
1833
1834
uasm_i_j (& p , (unsigned long )tlb_do_page_fault_1 & 0x0fffffff );
1834
1835
uasm_i_nop (& p );
1835
1836
1836
- if (( p - handle_tlbm ) > FASTPATH_SIZE )
1837
+ if (p >= handle_tlbm_end )
1837
1838
panic ("TLB modify handler fastpath space exceeded" );
1838
1839
1839
1840
uasm_resolve_relocs (relocs , labels );
1840
1841
pr_debug ("Wrote TLB modify handler fastpath (%u instructions).\n" ,
1841
1842
(unsigned int )(p - handle_tlbm ));
1842
1843
1843
- dump_handler ("r3000_tlb_modify" , handle_tlbm , ARRAY_SIZE ( handle_tlbm ) );
1844
+ dump_handler ("r3000_tlb_modify" , handle_tlbm , handle_tlbm_size );
1844
1845
}
1845
1846
#endif /* CONFIG_MIPS_PGD_C0_CONTEXT */
1846
1847
@@ -1904,11 +1905,12 @@ build_r4000_tlbchange_handler_tail(u32 **p, struct uasm_label **l,
1904
1905
static void __cpuinit build_r4000_tlb_load_handler (void )
1905
1906
{
1906
1907
u32 * p = handle_tlbl ;
1908
+ const int handle_tlbl_size = handle_tlbl_end - handle_tlbl ;
1907
1909
struct uasm_label * l = labels ;
1908
1910
struct uasm_reloc * r = relocs ;
1909
1911
struct work_registers wr ;
1910
1912
1911
- memset (handle_tlbl , 0 , sizeof (handle_tlbl ));
1913
+ memset (handle_tlbl , 0 , handle_tlbl_size * sizeof (handle_tlbl [ 0 ] ));
1912
1914
memset (labels , 0 , sizeof (labels ));
1913
1915
memset (relocs , 0 , sizeof (relocs ));
1914
1916
@@ -2047,24 +2049,25 @@ static void __cpuinit build_r4000_tlb_load_handler(void)
2047
2049
uasm_i_j (& p , (unsigned long )tlb_do_page_fault_0 & 0x0fffffff );
2048
2050
uasm_i_nop (& p );
2049
2051
2050
- if (( p - handle_tlbl ) > FASTPATH_SIZE )
2052
+ if (p >= handle_tlbl_end )
2051
2053
panic ("TLB load handler fastpath space exceeded" );
2052
2054
2053
2055
uasm_resolve_relocs (relocs , labels );
2054
2056
pr_debug ("Wrote TLB load handler fastpath (%u instructions).\n" ,
2055
2057
(unsigned int )(p - handle_tlbl ));
2056
2058
2057
- dump_handler ("r4000_tlb_load" , handle_tlbl , ARRAY_SIZE ( handle_tlbl ) );
2059
+ dump_handler ("r4000_tlb_load" , handle_tlbl , handle_tlbl_size );
2058
2060
}
2059
2061
2060
2062
static void __cpuinit build_r4000_tlb_store_handler (void )
2061
2063
{
2062
2064
u32 * p = handle_tlbs ;
2065
+ const int handle_tlbs_size = handle_tlbs_end - handle_tlbs ;
2063
2066
struct uasm_label * l = labels ;
2064
2067
struct uasm_reloc * r = relocs ;
2065
2068
struct work_registers wr ;
2066
2069
2067
- memset (handle_tlbs , 0 , sizeof (handle_tlbs ));
2070
+ memset (handle_tlbs , 0 , handle_tlbs_size * sizeof (handle_tlbs [ 0 ] ));
2068
2071
memset (labels , 0 , sizeof (labels ));
2069
2072
memset (relocs , 0 , sizeof (relocs ));
2070
2073
@@ -2101,24 +2104,25 @@ static void __cpuinit build_r4000_tlb_store_handler(void)
2101
2104
uasm_i_j (& p , (unsigned long )tlb_do_page_fault_1 & 0x0fffffff );
2102
2105
uasm_i_nop (& p );
2103
2106
2104
- if (( p - handle_tlbs ) > FASTPATH_SIZE )
2107
+ if (p >= handle_tlbs_end )
2105
2108
panic ("TLB store handler fastpath space exceeded" );
2106
2109
2107
2110
uasm_resolve_relocs (relocs , labels );
2108
2111
pr_debug ("Wrote TLB store handler fastpath (%u instructions).\n" ,
2109
2112
(unsigned int )(p - handle_tlbs ));
2110
2113
2111
- dump_handler ("r4000_tlb_store" , handle_tlbs , ARRAY_SIZE ( handle_tlbs ) );
2114
+ dump_handler ("r4000_tlb_store" , handle_tlbs , handle_tlbs_size );
2112
2115
}
2113
2116
2114
2117
static void __cpuinit build_r4000_tlb_modify_handler (void )
2115
2118
{
2116
2119
u32 * p = handle_tlbm ;
2120
+ const int handle_tlbm_size = handle_tlbm_end - handle_tlbm ;
2117
2121
struct uasm_label * l = labels ;
2118
2122
struct uasm_reloc * r = relocs ;
2119
2123
struct work_registers wr ;
2120
2124
2121
- memset (handle_tlbm , 0 , sizeof (handle_tlbm ));
2125
+ memset (handle_tlbm , 0 , handle_tlbm_size * sizeof (handle_tlbm [ 0 ] ));
2122
2126
memset (labels , 0 , sizeof (labels ));
2123
2127
memset (relocs , 0 , sizeof (relocs ));
2124
2128
@@ -2156,14 +2160,14 @@ static void __cpuinit build_r4000_tlb_modify_handler(void)
2156
2160
uasm_i_j (& p , (unsigned long )tlb_do_page_fault_1 & 0x0fffffff );
2157
2161
uasm_i_nop (& p );
2158
2162
2159
- if (( p - handle_tlbm ) > FASTPATH_SIZE )
2163
+ if (p >= handle_tlbm_end )
2160
2164
panic ("TLB modify handler fastpath space exceeded" );
2161
2165
2162
2166
uasm_resolve_relocs (relocs , labels );
2163
2167
pr_debug ("Wrote TLB modify handler fastpath (%u instructions).\n" ,
2164
2168
(unsigned int )(p - handle_tlbm ));
2165
2169
2166
- dump_handler ("r4000_tlb_modify" , handle_tlbm , ARRAY_SIZE ( handle_tlbm ) );
2170
+ dump_handler ("r4000_tlb_modify" , handle_tlbm , handle_tlbm_size );
2167
2171
}
2168
2172
2169
2173
void __cpuinit build_tlb_refill_handler (void )
@@ -2235,13 +2239,13 @@ void __cpuinit build_tlb_refill_handler(void)
2235
2239
void __cpuinit flush_tlb_handlers (void )
2236
2240
{
2237
2241
local_flush_icache_range ((unsigned long )handle_tlbl ,
2238
- (unsigned long )handle_tlbl + sizeof ( handle_tlbl ) );
2242
+ (unsigned long )handle_tlbl_end );
2239
2243
local_flush_icache_range ((unsigned long )handle_tlbs ,
2240
- (unsigned long )handle_tlbs + sizeof ( handle_tlbs ) );
2244
+ (unsigned long )handle_tlbs_end );
2241
2245
local_flush_icache_range ((unsigned long )handle_tlbm ,
2242
- (unsigned long )handle_tlbm + sizeof ( handle_tlbm ) );
2246
+ (unsigned long )handle_tlbm_end );
2243
2247
#ifdef CONFIG_MIPS_PGD_C0_CONTEXT
2244
- local_flush_icache_range ((unsigned long )tlbmiss_handler_setup_pgd_array ,
2245
- (unsigned long )tlbmiss_handler_setup_pgd_array + sizeof ( handle_tlbm ) );
2248
+ local_flush_icache_range ((unsigned long )tlbmiss_handler_setup_pgd ,
2249
+ (unsigned long )tlbmiss_handler_setup_pgd_end );
2246
2250
#endif
2247
2251
}
0 commit comments