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