Revision 056401ea target-ppc/helper.c
b/target-ppc/helper.c | ||
---|---|---|
482 | 482 |
int key, pp, valid, prot; |
483 | 483 |
|
484 | 484 |
bl = (*BATl & 0x0000003F) << 17; |
485 |
#if defined (DEBUG_BATS) |
|
485 | 486 |
if (loglevel != 0) { |
486 | 487 |
fprintf(logfile, "b %02x ==> bl %08x msk %08x\n", |
487 | 488 |
*BATl & 0x0000003F, bl, ~bl); |
488 | 489 |
} |
490 |
#endif |
|
489 | 491 |
prot = 0; |
490 | 492 |
valid = (*BATl >> 6) & 1; |
491 | 493 |
if (valid) { |
... | ... | |
1836 | 1838 |
env->DBAT[1][nr] = value; |
1837 | 1839 |
} |
1838 | 1840 |
|
1841 |
void do_store_ibatu_601 (CPUPPCState *env, int nr, target_ulong value) |
|
1842 |
{ |
|
1843 |
target_ulong mask; |
|
1844 |
int do_inval; |
|
1845 |
|
|
1846 |
dump_store_bat(env, 'I', 0, nr, value); |
|
1847 |
if (env->IBAT[0][nr] != value) { |
|
1848 |
do_inval = 0; |
|
1849 |
mask = (env->IBAT[1][nr] << 17) & 0x0FFE0000UL; |
|
1850 |
if (env->IBAT[1][nr] & 0x40) { |
|
1851 |
/* Invalidate BAT only if it is valid */ |
|
1852 |
#if !defined(FLUSH_ALL_TLBS) |
|
1853 |
do_invalidate_BAT(env, env->IBAT[0][nr], mask); |
|
1854 |
#else |
|
1855 |
do_inval = 1; |
|
1856 |
#endif |
|
1857 |
} |
|
1858 |
/* When storing valid upper BAT, mask BEPI and BRPN |
|
1859 |
* and invalidate all TLBs covered by this BAT |
|
1860 |
*/ |
|
1861 |
env->IBAT[0][nr] = (value & 0x00001FFFUL) | |
|
1862 |
(value & ~0x0001FFFFUL & ~mask); |
|
1863 |
env->DBAT[0][nr] = env->IBAT[0][nr]; |
|
1864 |
if (env->IBAT[1][nr] & 0x40) { |
|
1865 |
#if !defined(FLUSH_ALL_TLBS) |
|
1866 |
do_invalidate_BAT(env, env->IBAT[0][nr], mask); |
|
1867 |
#else |
|
1868 |
do_inval = 1; |
|
1869 |
#endif |
|
1870 |
} |
|
1871 |
#if defined(FLUSH_ALL_TLBS) |
|
1872 |
if (do_inval) |
|
1873 |
tlb_flush(env, 1); |
|
1874 |
#endif |
|
1875 |
} |
|
1876 |
} |
|
1877 |
|
|
1878 |
void do_store_ibatl_601 (CPUPPCState *env, int nr, target_ulong value) |
|
1879 |
{ |
|
1880 |
target_ulong mask; |
|
1881 |
int do_inval; |
|
1882 |
|
|
1883 |
dump_store_bat(env, 'I', 1, nr, value); |
|
1884 |
if (env->IBAT[1][nr] != value) { |
|
1885 |
do_inval = 0; |
|
1886 |
if (env->IBAT[1][nr] & 0x40) { |
|
1887 |
#if !defined(FLUSH_ALL_TLBS) |
|
1888 |
mask = (env->IBAT[1][nr] << 17) & 0x0FFE0000UL; |
|
1889 |
do_invalidate_BAT(env, env->IBAT[0][nr], mask); |
|
1890 |
#else |
|
1891 |
do_inval = 1; |
|
1892 |
#endif |
|
1893 |
} |
|
1894 |
if (value & 0x40) { |
|
1895 |
#if !defined(FLUSH_ALL_TLBS) |
|
1896 |
mask = (value << 17) & 0x0FFE0000UL; |
|
1897 |
do_invalidate_BAT(env, env->IBAT[0][nr], mask); |
|
1898 |
#else |
|
1899 |
do_inval = 1; |
|
1900 |
#endif |
|
1901 |
} |
|
1902 |
env->IBAT[1][nr] = value; |
|
1903 |
env->DBAT[1][nr] = value; |
|
1904 |
#if defined(FLUSH_ALL_TLBS) |
|
1905 |
if (do_inval) |
|
1906 |
tlb_flush(env, 1); |
|
1907 |
#endif |
|
1908 |
} |
|
1909 |
} |
|
1910 |
|
|
1839 | 1911 |
/*****************************************************************************/ |
1840 | 1912 |
/* TLB management */ |
1841 | 1913 |
void ppc_tlb_invalidate_all (CPUPPCState *env) |
... | ... | |
2684 | 2756 |
* any special case that could occur. Just store MSR and update hflags |
2685 | 2757 |
*/ |
2686 | 2758 |
env->msr = new_msr; |
2759 |
env->hflags_nmsr = 0x00000000; |
|
2687 | 2760 |
hreg_compute_hflags(env); |
2688 | 2761 |
env->nip = vector; |
2689 | 2762 |
/* Reset exception state */ |
Also available in: Unified diff