tlb.cc (12749:223c83ed9979) | tlb.cc (13231:c6c133f9e007) |
---|---|
1/* 2 * Copyright (c) 2001-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 857 unchanged lines hidden (view full) --- 866 DPRINTF(IPR, "Memory Mapped IPR Read: asi=%#X a=%#x\n", 867 (uint32_t)pkt->req->getArchFlags(), pkt->getAddr()); 868 869 TLB *itb = dynamic_cast<TLB *>(tc->getITBPtr()); 870 871 switch (asi) { 872 case ASI_LSU_CONTROL_REG: 873 assert(va == 0); | 1/* 2 * Copyright (c) 2001-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 857 unchanged lines hidden (view full) --- 866 DPRINTF(IPR, "Memory Mapped IPR Read: asi=%#X a=%#x\n", 867 (uint32_t)pkt->req->getArchFlags(), pkt->getAddr()); 868 869 TLB *itb = dynamic_cast<TLB *>(tc->getITBPtr()); 870 871 switch (asi) { 872 case ASI_LSU_CONTROL_REG: 873 assert(va == 0); |
874 pkt->set(tc->readMiscReg(MISCREG_MMU_LSU_CTRL)); | 874 pkt->setBE(tc->readMiscReg(MISCREG_MMU_LSU_CTRL)); |
875 break; 876 case ASI_MMU: 877 switch (va) { 878 case 0x8: | 875 break; 876 case ASI_MMU: 877 switch (va) { 878 case 0x8: |
879 pkt->set(tc->readMiscReg(MISCREG_MMU_P_CONTEXT)); | 879 pkt->setBE(tc->readMiscReg(MISCREG_MMU_P_CONTEXT)); |
880 break; 881 case 0x10: | 880 break; 881 case 0x10: |
882 pkt->set(tc->readMiscReg(MISCREG_MMU_S_CONTEXT)); | 882 pkt->setBE(tc->readMiscReg(MISCREG_MMU_S_CONTEXT)); |
883 break; 884 default: 885 goto doMmuReadError; 886 } 887 break; 888 case ASI_QUEUE: | 883 break; 884 default: 885 goto doMmuReadError; 886 } 887 break; 888 case ASI_QUEUE: |
889 pkt->set(tc->readMiscReg(MISCREG_QUEUE_CPU_MONDO_HEAD + | 889 pkt->setBE(tc->readMiscReg(MISCREG_QUEUE_CPU_MONDO_HEAD + |
890 (va >> 4) - 0x3c)); 891 break; 892 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS0: 893 assert(va == 0); | 890 (va >> 4) - 0x3c)); 891 break; 892 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS0: 893 assert(va == 0); |
894 pkt->set(c0_tsb_ps0); | 894 pkt->setBE(c0_tsb_ps0); |
895 break; 896 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS1: 897 assert(va == 0); | 895 break; 896 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS1: 897 assert(va == 0); |
898 pkt->set(c0_tsb_ps1); | 898 pkt->setBE(c0_tsb_ps1); |
899 break; 900 case ASI_DMMU_CTXT_ZERO_CONFIG: 901 assert(va == 0); | 899 break; 900 case ASI_DMMU_CTXT_ZERO_CONFIG: 901 assert(va == 0); |
902 pkt->set(c0_config); | 902 pkt->setBE(c0_config); |
903 break; 904 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS0: 905 assert(va == 0); | 903 break; 904 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS0: 905 assert(va == 0); |
906 pkt->set(itb->c0_tsb_ps0); | 906 pkt->setBE(itb->c0_tsb_ps0); |
907 break; 908 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS1: 909 assert(va == 0); | 907 break; 908 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS1: 909 assert(va == 0); |
910 pkt->set(itb->c0_tsb_ps1); | 910 pkt->setBE(itb->c0_tsb_ps1); |
911 break; 912 case ASI_IMMU_CTXT_ZERO_CONFIG: 913 assert(va == 0); | 911 break; 912 case ASI_IMMU_CTXT_ZERO_CONFIG: 913 assert(va == 0); |
914 pkt->set(itb->c0_config); | 914 pkt->setBE(itb->c0_config); |
915 break; 916 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS0: 917 assert(va == 0); | 915 break; 916 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS0: 917 assert(va == 0); |
918 pkt->set(cx_tsb_ps0); | 918 pkt->setBE(cx_tsb_ps0); |
919 break; 920 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS1: 921 assert(va == 0); | 919 break; 920 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS1: 921 assert(va == 0); |
922 pkt->set(cx_tsb_ps1); | 922 pkt->setBE(cx_tsb_ps1); |
923 break; 924 case ASI_DMMU_CTXT_NONZERO_CONFIG: 925 assert(va == 0); | 923 break; 924 case ASI_DMMU_CTXT_NONZERO_CONFIG: 925 assert(va == 0); |
926 pkt->set(cx_config); | 926 pkt->setBE(cx_config); |
927 break; 928 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS0: 929 assert(va == 0); | 927 break; 928 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS0: 929 assert(va == 0); |
930 pkt->set(itb->cx_tsb_ps0); | 930 pkt->setBE(itb->cx_tsb_ps0); |
931 break; 932 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS1: 933 assert(va == 0); | 931 break; 932 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS1: 933 assert(va == 0); |
934 pkt->set(itb->cx_tsb_ps1); | 934 pkt->setBE(itb->cx_tsb_ps1); |
935 break; 936 case ASI_IMMU_CTXT_NONZERO_CONFIG: 937 assert(va == 0); | 935 break; 936 case ASI_IMMU_CTXT_NONZERO_CONFIG: 937 assert(va == 0); |
938 pkt->set(itb->cx_config); | 938 pkt->setBE(itb->cx_config); |
939 break; 940 case ASI_SPARC_ERROR_STATUS_REG: | 939 break; 940 case ASI_SPARC_ERROR_STATUS_REG: |
941 pkt->set((uint64_t)0); | 941 pkt->setBE((uint64_t)0); |
942 break; 943 case ASI_HYP_SCRATCHPAD: 944 case ASI_SCRATCHPAD: | 942 break; 943 case ASI_HYP_SCRATCHPAD: 944 case ASI_SCRATCHPAD: |
945 pkt->set(tc->readMiscReg(MISCREG_SCRATCHPAD_R0 + (va >> 3))); | 945 pkt->setBE(tc->readMiscReg(MISCREG_SCRATCHPAD_R0 + (va >> 3))); |
946 break; 947 case ASI_IMMU: 948 switch (va) { 949 case 0x0: 950 temp = itb->tag_access; | 946 break; 947 case ASI_IMMU: 948 switch (va) { 949 case 0x0: 950 temp = itb->tag_access; |
951 pkt->set(bits(temp,63,22) | bits(temp,12,0) << 48); | 951 pkt->setBE(bits(temp,63,22) | bits(temp,12,0) << 48); |
952 break; 953 case 0x18: | 952 break; 953 case 0x18: |
954 pkt->set(itb->sfsr); | 954 pkt->setBE(itb->sfsr); |
955 break; 956 case 0x30: | 955 break; 956 case 0x30: |
957 pkt->set(itb->tag_access); | 957 pkt->setBE(itb->tag_access); |
958 break; 959 default: 960 goto doMmuReadError; 961 } 962 break; 963 case ASI_DMMU: 964 switch (va) { 965 case 0x0: 966 temp = tag_access; | 958 break; 959 default: 960 goto doMmuReadError; 961 } 962 break; 963 case ASI_DMMU: 964 switch (va) { 965 case 0x0: 966 temp = tag_access; |
967 pkt->set(bits(temp,63,22) | bits(temp,12,0) << 48); | 967 pkt->setBE(bits(temp,63,22) | bits(temp,12,0) << 48); |
968 break; 969 case 0x18: | 968 break; 969 case 0x18: |
970 pkt->set(sfsr); | 970 pkt->setBE(sfsr); |
971 break; 972 case 0x20: | 971 break; 972 case 0x20: |
973 pkt->set(sfar); | 973 pkt->setBE(sfar); |
974 break; 975 case 0x30: | 974 break; 975 case 0x30: |
976 pkt->set(tag_access); | 976 pkt->setBE(tag_access); |
977 break; 978 case 0x80: | 977 break; 978 case 0x80: |
979 pkt->set(tc->readMiscReg(MISCREG_MMU_PART_ID)); | 979 pkt->setBE(tc->readMiscReg(MISCREG_MMU_PART_ID)); |
980 break; 981 default: 982 goto doMmuReadError; 983 } 984 break; 985 case ASI_DMMU_TSB_PS0_PTR_REG: | 980 break; 981 default: 982 goto doMmuReadError; 983 } 984 break; 985 case ASI_DMMU_TSB_PS0_PTR_REG: |
986 pkt->set(MakeTsbPtr(Ps0, | 986 pkt->setBE(MakeTsbPtr(Ps0, |
987 tag_access, 988 c0_tsb_ps0, 989 c0_config, 990 cx_tsb_ps0, 991 cx_config)); 992 break; 993 case ASI_DMMU_TSB_PS1_PTR_REG: | 987 tag_access, 988 c0_tsb_ps0, 989 c0_config, 990 cx_tsb_ps0, 991 cx_config)); 992 break; 993 case ASI_DMMU_TSB_PS1_PTR_REG: |
994 pkt->set(MakeTsbPtr(Ps1, | 994 pkt->setBE(MakeTsbPtr(Ps1, |
995 tag_access, 996 c0_tsb_ps1, 997 c0_config, 998 cx_tsb_ps1, 999 cx_config)); 1000 break; 1001 case ASI_IMMU_TSB_PS0_PTR_REG: | 995 tag_access, 996 c0_tsb_ps1, 997 c0_config, 998 cx_tsb_ps1, 999 cx_config)); 1000 break; 1001 case ASI_IMMU_TSB_PS0_PTR_REG: |
1002 pkt->set(MakeTsbPtr(Ps0, | 1002 pkt->setBE(MakeTsbPtr(Ps0, |
1003 itb->tag_access, 1004 itb->c0_tsb_ps0, 1005 itb->c0_config, 1006 itb->cx_tsb_ps0, 1007 itb->cx_config)); 1008 break; 1009 case ASI_IMMU_TSB_PS1_PTR_REG: | 1003 itb->tag_access, 1004 itb->c0_tsb_ps0, 1005 itb->c0_config, 1006 itb->cx_tsb_ps0, 1007 itb->cx_config)); 1008 break; 1009 case ASI_IMMU_TSB_PS1_PTR_REG: |
1010 pkt->set(MakeTsbPtr(Ps1, | 1010 pkt->setBE(MakeTsbPtr(Ps1, |
1011 itb->tag_access, 1012 itb->c0_tsb_ps1, 1013 itb->c0_config, 1014 itb->cx_tsb_ps1, 1015 itb->cx_config)); 1016 break; 1017 case ASI_SWVR_INTR_RECEIVE: 1018 { 1019 SparcISA::Interrupts * interrupts = 1020 dynamic_cast<SparcISA::Interrupts *>( 1021 tc->getCpuPtr()->getInterruptController(0)); | 1011 itb->tag_access, 1012 itb->c0_tsb_ps1, 1013 itb->c0_config, 1014 itb->cx_tsb_ps1, 1015 itb->cx_config)); 1016 break; 1017 case ASI_SWVR_INTR_RECEIVE: 1018 { 1019 SparcISA::Interrupts * interrupts = 1020 dynamic_cast<SparcISA::Interrupts *>( 1021 tc->getCpuPtr()->getInterruptController(0)); |
1022 pkt->set(interrupts->get_vec(IT_INT_VEC)); | 1022 pkt->setBE(interrupts->get_vec(IT_INT_VEC)); |
1023 } 1024 break; 1025 case ASI_SWVR_UDB_INTR_R: 1026 { 1027 SparcISA::Interrupts * interrupts = 1028 dynamic_cast<SparcISA::Interrupts *>( 1029 tc->getCpuPtr()->getInterruptController(0)); 1030 temp = findMsbSet(interrupts->get_vec(IT_INT_VEC)); 1031 tc->getCpuPtr()->clearInterrupt(0, IT_INT_VEC, temp); | 1023 } 1024 break; 1025 case ASI_SWVR_UDB_INTR_R: 1026 { 1027 SparcISA::Interrupts * interrupts = 1028 dynamic_cast<SparcISA::Interrupts *>( 1029 tc->getCpuPtr()->getInterruptController(0)); 1030 temp = findMsbSet(interrupts->get_vec(IT_INT_VEC)); 1031 tc->getCpuPtr()->clearInterrupt(0, IT_INT_VEC, temp); |
1032 pkt->set(temp); | 1032 pkt->setBE(temp); |
1033 } 1034 break; 1035 default: 1036doMmuReadError: 1037 panic("need to impl DTB::doMmuRegRead() got asi=%#x, va=%#x\n", 1038 (uint32_t)asi, va); 1039 } 1040 pkt->makeAtomicResponse(); 1041 return Cycles(1); 1042} 1043 1044Cycles 1045TLB::doMmuRegWrite(ThreadContext *tc, Packet *pkt) 1046{ | 1033 } 1034 break; 1035 default: 1036doMmuReadError: 1037 panic("need to impl DTB::doMmuRegRead() got asi=%#x, va=%#x\n", 1038 (uint32_t)asi, va); 1039 } 1040 pkt->makeAtomicResponse(); 1041 return Cycles(1); 1042} 1043 1044Cycles 1045TLB::doMmuRegWrite(ThreadContext *tc, Packet *pkt) 1046{ |
1047 uint64_t data = pkt->get | 1047 uint64_t data = pkt->getBE<uint64_t>(); |
1048 Addr va = pkt->getAddr(); 1049 ASI asi = (ASI)pkt->req->getArchFlags(); 1050 1051 Addr ta_insert; 1052 Addr va_insert; 1053 Addr ct_insert; 1054 int part_insert; 1055 int entry_insert = -1; --- 370 unchanged lines hidden --- | 1048 Addr va = pkt->getAddr(); 1049 ASI asi = (ASI)pkt->req->getArchFlags(); 1050 1051 Addr ta_insert; 1052 Addr va_insert; 1053 Addr ct_insert; 1054 int part_insert; 1055 int entry_insert = -1; --- 370 unchanged lines hidden --- |