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