Revision 8c0fdd85 target-mips/op.c

b/target-mips/op.c
852 852
    RETURN();
853 853
}
854 854

  
855
void op_mtc0 (void)
855
void op_mtc0_index (void)
856 856
{
857
    CALL_FROM_TB2(do_mtc0, PARAM1, PARAM2);
857
    env->CP0_index = (env->CP0_index & 0x80000000) | (T0 & 0x0000000F);
858
    RETURN();
859
}
860

  
861
void op_mtc0_entrylo0 (void)
862
{
863
    env->CP0_EntryLo0 = T0 & 0x3FFFFFFF;
864
    RETURN();
865
}
866

  
867
void op_mtc0_entrylo1 (void)
868
{
869
    env->CP0_EntryLo1 = T0 & 0x3FFFFFFF;
870
    RETURN();
871
}
872

  
873
void op_mtc0_context (void)
874
{
875
    env->CP0_Context = (env->CP0_Context & 0xFF800000) | (T0 & 0x007FFFF0);
876
    RETURN();
877
}
878

  
879
void op_mtc0_pagemask (void)
880
{
881
    env->CP0_PageMask = T0 & 0x01FFE000;
882
    RETURN();
883
}
884

  
885
void op_mtc0_wired (void)
886
{
887
    env->CP0_Wired = T0 & 0x0000000F;
888
    RETURN();
889
}
890

  
891
void op_mtc0_count (void)
892
{
893
    CALL_FROM_TB2(cpu_mips_store_count, env, T0);
894
    RETURN();
895
}
896

  
897
void op_mtc0_entryhi (void)
898
{
899
    uint32_t old, val;
900

  
901
    val = T0 & 0xFFFFE0FF;
902
    old = env->CP0_EntryHi;
903
    env->CP0_EntryHi = val;
904
    /* If the ASID changes, flush qemu's TLB.  */
905
    if ((old & 0xFF) != (val & 0xFF))
906
        CALL_FROM_TB2(cpu_mips_tlb_flush, env, 1);
907
    RETURN();
908
}
909

  
910
void op_mtc0_compare (void)
911
{
912
    CALL_FROM_TB2(cpu_mips_store_compare, env, T0);
913
    RETURN();
914
}
915

  
916
void op_mtc0_status (void)
917
{
918
    uint32_t val, old, mask;
919

  
920
    val = T0 & 0xFA78FF01;
921
    old = env->CP0_Status;
922
    if (T0 & (1 << CP0St_UM))
923
        env->hflags |= MIPS_HFLAG_UM;
924
    else
925
        env->hflags &= ~MIPS_HFLAG_UM;
926
    if (T0 & (1 << CP0St_ERL))
927
        env->hflags |= MIPS_HFLAG_ERL;
928
    else
929
        env->hflags &= ~MIPS_HFLAG_ERL;
930
    if (T0 & (1 << CP0St_EXL))
931
        env->hflags |= MIPS_HFLAG_EXL;
932
    else
933
        env->hflags &= ~MIPS_HFLAG_EXL;
934
    env->CP0_Status = val;
935
    /* If we unmasked an asserted IRQ, raise it */
936
    mask = 0x0000FF00;
937
    if (loglevel & CPU_LOG_TB_IN_ASM)
938
       CALL_FROM_TB2(do_mtc0_status_debug, old, val);
939
    if ((val & (1 << CP0St_IE)) && !(old & (1 << CP0St_IE)) &&
940
        !(env->hflags & MIPS_HFLAG_EXL) &&
941
        !(env->hflags & MIPS_HFLAG_ERL) &&
942
        !(env->hflags & MIPS_HFLAG_DM) &&
943
        (env->CP0_Status & env->CP0_Cause & mask)) {
944
        env->interrupt_request |= CPU_INTERRUPT_HARD;
945
       if (logfile)
946
           CALL_FROM_TB0(do_mtc0_status_irqraise_debug);
947
    } else if (!(val & (1 << CP0St_IE)) && (old & (1 << CP0St_IE))) {
948
        env->interrupt_request &= ~CPU_INTERRUPT_HARD;
949
    }
950
    RETURN();
951
}
952

  
953
void op_mtc0_cause (void)
954
{
955
    uint32_t val, old;
956

  
957
    val = (env->CP0_Cause & 0xB000F87C) | (T0 & 0x000C00300);
958
    old = env->CP0_Cause;
959
    env->CP0_Cause = val;
960
#if 0
961
    {
962
        int i, mask;
963

  
964
       /* Check if we ever asserted a software IRQ */
965
        for (i = 0; i < 2; i++) {
966
            mask = 0x100 << i;
967
            if ((val & mask) & !(old & mask))
968
                CALL_FROM_TB1(mips_set_irq, i);
969
        }
970
    }
971
#endif
972
    RETURN();
973
}
974

  
975
void op_mtc0_epc (void)
976
{
977
    env->CP0_EPC = T0;
978
    RETURN();
979
}
980

  
981
void op_mtc0_config0 (void)
982
{
983
#if defined(MIPS_USES_R4K_TLB)
984
    env->CP0_Config0 = (env->CP0_Config0 & 0x8017FF80) | (T0 & 0x7E000001);
985
#else
986
    env->CP0_Config0 = (env->CP0_Config0 & 0xFE17FF80) | (T0 & 0x00000001);
987
#endif
988
    RETURN();
989
}
990

  
991
void op_mtc0_watchlo (void)
992
{
993
    env->CP0_WatchLo = T0;
994
    RETURN();
995
}
996

  
997
void op_mtc0_watchhi (void)
998
{
999
    env->CP0_WatchHi = T0 & 0x40FF0FF8;
1000
    RETURN();
1001
}
1002

  
1003
void op_mtc0_debug (void)
1004
{
1005
    env->CP0_Debug = (env->CP0_Debug & 0x8C03FC1F) | (T0 & 0x13300120);
1006
    if (T0 & (1 << CP0DB_DM))
1007
        env->hflags |= MIPS_HFLAG_DM;
1008
    else
1009
        env->hflags &= ~MIPS_HFLAG_DM;
1010
    RETURN();
1011
}
1012

  
1013
void op_mtc0_depc (void)
1014
{
1015
    env->CP0_DEPC = T0;
1016
    RETURN();
1017
}
1018

  
1019
void op_mtc0_taglo (void)
1020
{
1021
    env->CP0_TagLo = T0 & 0xFFFFFCF6;
1022
    RETURN();
1023
}
1024

  
1025
void op_mtc0_errorepc (void)
1026
{
1027
    env->CP0_ErrorEPC = T0;
1028
    RETURN();
1029
}
1030

  
1031
void op_mtc0_desave (void)
1032
{
1033
    env->CP0_DESAVE = T0;
858 1034
    RETURN();
859 1035
}
860 1036

  

Also available in: Unified diff