Revision f6b868fc target-ppc/helper.c
b/target-ppc/helper.c | ||
---|---|---|
821 | 821 |
return rt; |
822 | 822 |
} |
823 | 823 |
|
824 |
void ppc_store_slb (CPUPPCState *env, int slb_nr, target_ulong rs)
|
|
824 |
void ppc_store_slb (CPUPPCState *env, target_ulong rb, target_ulong rs)
|
|
825 | 825 |
{ |
826 | 826 |
target_phys_addr_t sr_base; |
827 | 827 |
uint64_t tmp64; |
828 | 828 |
uint32_t tmp; |
829 | 829 |
|
830 |
uint64_t vsid; |
|
831 |
uint64_t esid; |
|
832 |
int flags, valid, slb_nr; |
|
833 |
|
|
834 |
vsid = rs >> 12; |
|
835 |
flags = ((rs >> 8) & 0xf); |
|
836 |
|
|
837 |
esid = rb >> 28; |
|
838 |
valid = (rb & (1 << 27)); |
|
839 |
slb_nr = rb & 0xfff; |
|
840 |
|
|
841 |
tmp64 = (esid << 28) | valid | (vsid >> 24); |
|
842 |
tmp = (vsid << 8) | (flags << 3); |
|
843 |
|
|
844 |
/* Write SLB entry to memory */ |
|
830 | 845 |
sr_base = env->spr[SPR_ASR]; |
831 | 846 |
sr_base += 12 * slb_nr; |
832 |
/* Copy Rs bits 37:63 to SLB 62:88 */ |
|
833 |
tmp = rs << 8; |
|
834 |
tmp64 = (rs >> 24) & 0x7; |
|
835 |
/* Copy Rs bits 33:36 to SLB 89:92 */ |
|
836 |
tmp |= ((rs >> 27) & 0xF) << 4; |
|
837 |
/* Set the valid bit */ |
|
838 |
tmp64 |= 1 << 27; |
|
839 |
/* Set ESID */ |
|
840 |
tmp64 |= (uint32_t)slb_nr << 28; |
|
841 |
LOG_SLB("%s: %d " ADDRX " => " PADDRX " %016" PRIx64 |
|
847 |
|
|
848 |
LOG_SLB("%s: %d " ADDRX " - " ADDRX " => " PADDRX " %016" PRIx64 |
|
842 | 849 |
" %08" PRIx32 "\n", __func__, |
843 |
slb_nr, rs, sr_base, tmp64, tmp); |
|
844 |
/* Write SLB entry to memory */ |
|
850 |
slb_nr, rb, rs, sr_base, tmp64, tmp);
|
|
851 |
|
|
845 | 852 |
stq_phys(sr_base, tmp64); |
846 | 853 |
stl_phys(sr_base + 8, tmp); |
847 | 854 |
} |
... | ... | |
1945 | 1952 |
} |
1946 | 1953 |
} |
1947 | 1954 |
|
1955 |
#if defined(TARGET_PPC64) |
|
1956 |
target_ulong ppc_load_sr (CPUPPCState *env, int slb_nr) |
|
1957 |
{ |
|
1958 |
// XXX |
|
1959 |
return 0; |
|
1960 |
} |
|
1961 |
#endif |
|
1962 |
|
|
1948 | 1963 |
void ppc_store_sr (CPUPPCState *env, int srnum, target_ulong value) |
1949 | 1964 |
{ |
1950 | 1965 |
LOG_MMU("%s: reg=%d " ADDRX " " ADDRX "\n", |
1951 | 1966 |
__func__, srnum, value, env->sr[srnum]); |
1967 |
#if defined(TARGET_PPC64) |
|
1968 |
if (env->mmu_model & POWERPC_MMU_64) { |
|
1969 |
uint64_t rb = 0, rs = 0; |
|
1970 |
|
|
1971 |
/* ESID = srnum */ |
|
1972 |
rb |= ((uint32_t)srnum & 0xf) << 28; |
|
1973 |
/* Set the valid bit */ |
|
1974 |
rb |= 1 << 27; |
|
1975 |
/* Index = ESID */ |
|
1976 |
rb |= (uint32_t)srnum; |
|
1977 |
|
|
1978 |
/* VSID = VSID */ |
|
1979 |
rs |= (value & 0xfffffff) << 12; |
|
1980 |
/* flags = flags */ |
|
1981 |
rs |= ((value >> 27) & 0xf) << 9; |
|
1982 |
|
|
1983 |
ppc_store_slb(env, rb, rs); |
|
1984 |
} else |
|
1985 |
#endif |
|
1952 | 1986 |
if (env->sr[srnum] != value) { |
1953 | 1987 |
env->sr[srnum] = value; |
1954 | 1988 |
#if !defined(FLUSH_ALL_TLBS) && 0 |
Also available in: Unified diff