tlb.cc (4103:785279436bdd) | tlb.cc (4172:141705d83494) |
---|---|
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; --- 382 unchanged lines hidden (view full) --- 391 return true; 392} 393 394void 395TLB::writeSfsr(ThreadContext *tc, int reg, bool write, ContextType ct, 396 bool se, FaultTypes ft, int asi) 397{ 398 uint64_t sfsr; | 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; --- 382 unchanged lines hidden (view full) --- 391 return true; 392} 393 394void 395TLB::writeSfsr(ThreadContext *tc, int reg, bool write, ContextType ct, 396 bool se, FaultTypes ft, int asi) 397{ 398 uint64_t sfsr; |
399 sfsr = tc->readMiscReg(reg); | 399 sfsr = tc->readMiscRegNoEffect(reg); |
400 401 if (sfsr & 0x1) 402 sfsr = 0x3; 403 else 404 sfsr = 1; 405 406 if (write) 407 sfsr |= 1 << 2; 408 sfsr |= ct << 4; 409 if (se) 410 sfsr |= 1 << 6; 411 sfsr |= ft << 7; 412 sfsr |= asi << 16; | 400 401 if (sfsr & 0x1) 402 sfsr = 0x3; 403 else 404 sfsr = 1; 405 406 if (write) 407 sfsr |= 1 << 2; 408 sfsr |= ct << 4; 409 if (se) 410 sfsr |= 1 << 6; 411 sfsr |= ft << 7; 412 sfsr |= asi << 16; |
413 tc->setMiscRegWithEffect(reg, sfsr); | 413 tc->setMiscReg(reg, sfsr); |
414} 415 416void 417TLB::writeTagAccess(ThreadContext *tc, int reg, Addr va, int context) 418{ 419 DPRINTF(TLB, "TLB: Writing Tag Access: va: %#X ctx: %#X value: %#X\n", 420 va, context, mbits(va, 63,13) | mbits(context,12,0)); 421 | 414} 415 416void 417TLB::writeTagAccess(ThreadContext *tc, int reg, Addr va, int context) 418{ 419 DPRINTF(TLB, "TLB: Writing Tag Access: va: %#X ctx: %#X value: %#X\n", 420 va, context, mbits(va, 63,13) | mbits(context,12,0)); 421 |
422 tc->setMiscRegWithEffect(reg, mbits(va, 63,13) | mbits(context,12,0)); | 422 tc->setMiscReg(reg, mbits(va, 63,13) | mbits(context,12,0)); |
423} 424 425void 426ITB::writeSfsr(ThreadContext *tc, bool write, ContextType ct, 427 bool se, FaultTypes ft, int asi) 428{ 429 DPRINTF(TLB, "TLB: ITB Fault: w=%d ct=%d ft=%d asi=%d\n", 430 (int)write, ct, ft, asi); --- 8 unchanged lines hidden (view full) --- 439 440void 441DTB::writeSfr(ThreadContext *tc, Addr a, bool write, ContextType ct, 442 bool se, FaultTypes ft, int asi) 443{ 444 DPRINTF(TLB, "TLB: DTB Fault: A=%#x w=%d ct=%d ft=%d asi=%d\n", 445 a, (int)write, ct, ft, asi); 446 TLB::writeSfsr(tc, MISCREG_MMU_DTLB_SFSR, write, ct, se, ft, asi); | 423} 424 425void 426ITB::writeSfsr(ThreadContext *tc, bool write, ContextType ct, 427 bool se, FaultTypes ft, int asi) 428{ 429 DPRINTF(TLB, "TLB: ITB Fault: w=%d ct=%d ft=%d asi=%d\n", 430 (int)write, ct, ft, asi); --- 8 unchanged lines hidden (view full) --- 439 440void 441DTB::writeSfr(ThreadContext *tc, Addr a, bool write, ContextType ct, 442 bool se, FaultTypes ft, int asi) 443{ 444 DPRINTF(TLB, "TLB: DTB Fault: A=%#x w=%d ct=%d ft=%d asi=%d\n", 445 a, (int)write, ct, ft, asi); 446 TLB::writeSfsr(tc, MISCREG_MMU_DTLB_SFSR, write, ct, se, ft, asi); |
447 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_SFAR, a); | 447 tc->setMiscReg(MISCREG_MMU_DTLB_SFAR, a); |
448} 449 450void 451DTB::writeTagAccess(ThreadContext *tc, Addr va, int context) 452{ 453 TLB::writeTagAccess(tc, MISCREG_MMU_DTLB_TAG_ACCESS, va, context); 454} 455 456 457 458Fault 459ITB::translate(RequestPtr &req, ThreadContext *tc) 460{ | 448} 449 450void 451DTB::writeTagAccess(ThreadContext *tc, Addr va, int context) 452{ 453 TLB::writeTagAccess(tc, MISCREG_MMU_DTLB_TAG_ACCESS, va, context); 454} 455 456 457 458Fault 459ITB::translate(RequestPtr &req, ThreadContext *tc) 460{ |
461 uint64_t tlbdata = tc->readMiscReg(MISCREG_TLB_DATA); | 461 uint64_t tlbdata = tc->readMiscRegNoEffect(MISCREG_TLB_DATA); |
462 463 Addr vaddr = req->getVaddr(); 464 TlbEntry *e; 465 466 assert(req->getAsi() == ASI_IMPLICIT); 467 468 DPRINTF(TLB, "TLB: ITB Request to translate va=%#x size=%d\n", 469 vaddr, req->getSize()); --- 97 unchanged lines hidden (view full) --- 567} 568 569 570 571Fault 572DTB::translate(RequestPtr &req, ThreadContext *tc, bool write) 573{ 574 /* @todo this could really use some profiling and fixing to make it faster! */ | 462 463 Addr vaddr = req->getVaddr(); 464 TlbEntry *e; 465 466 assert(req->getAsi() == ASI_IMPLICIT); 467 468 DPRINTF(TLB, "TLB: ITB Request to translate va=%#x size=%d\n", 469 vaddr, req->getSize()); --- 97 unchanged lines hidden (view full) --- 567} 568 569 570 571Fault 572DTB::translate(RequestPtr &req, ThreadContext *tc, bool write) 573{ 574 /* @todo this could really use some profiling and fixing to make it faster! */ |
575 uint64_t tlbdata = tc->readMiscReg(MISCREG_TLB_DATA); | 575 uint64_t tlbdata = tc->readMiscRegNoEffect(MISCREG_TLB_DATA); |
576 Addr vaddr = req->getVaddr(); 577 Addr size = req->getSize(); 578 ASI asi; 579 asi = (ASI)req->getAsi(); 580 bool implicit = false; 581 bool hpriv = bits(tlbdata,0,0); 582 583 DPRINTF(TLB, "TLB: DTB Request to translate va=%#x size=%d asi=%#x\n", --- 275 unchanged lines hidden (view full) --- 859 uint64_t temp; 860 861 DPRINTF(IPR, "Memory Mapped IPR Read: asi=%#X a=%#x\n", 862 (uint32_t)pkt->req->getAsi(), pkt->getAddr()); 863 864 switch (asi) { 865 case ASI_LSU_CONTROL_REG: 866 assert(va == 0); | 576 Addr vaddr = req->getVaddr(); 577 Addr size = req->getSize(); 578 ASI asi; 579 asi = (ASI)req->getAsi(); 580 bool implicit = false; 581 bool hpriv = bits(tlbdata,0,0); 582 583 DPRINTF(TLB, "TLB: DTB Request to translate va=%#x size=%d asi=%#x\n", --- 275 unchanged lines hidden (view full) --- 859 uint64_t temp; 860 861 DPRINTF(IPR, "Memory Mapped IPR Read: asi=%#X a=%#x\n", 862 (uint32_t)pkt->req->getAsi(), pkt->getAddr()); 863 864 switch (asi) { 865 case ASI_LSU_CONTROL_REG: 866 assert(va == 0); |
867 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_LSU_CTRL)); | 867 pkt->set(tc->readMiscReg(MISCREG_MMU_LSU_CTRL)); |
868 break; 869 case ASI_MMU: 870 switch (va) { 871 case 0x8: | 868 break; 869 case ASI_MMU: 870 switch (va) { 871 case 0x8: |
872 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_P_CONTEXT)); | 872 pkt->set(tc->readMiscReg(MISCREG_MMU_P_CONTEXT)); |
873 break; 874 case 0x10: | 873 break; 874 case 0x10: |
875 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_S_CONTEXT)); | 875 pkt->set(tc->readMiscReg(MISCREG_MMU_S_CONTEXT)); |
876 break; 877 default: 878 goto doMmuReadError; 879 } 880 break; 881 case ASI_QUEUE: | 876 break; 877 default: 878 goto doMmuReadError; 879 } 880 break; 881 case ASI_QUEUE: |
882 pkt->set(tc->readMiscRegWithEffect(MISCREG_QUEUE_CPU_MONDO_HEAD + | 882 pkt->set(tc->readMiscReg(MISCREG_QUEUE_CPU_MONDO_HEAD + |
883 (va >> 4) - 0x3c)); 884 break; 885 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS0: 886 assert(va == 0); | 883 (va >> 4) - 0x3c)); 884 break; 885 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS0: 886 assert(va == 0); |
887 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_TSB_PS0)); | 887 pkt->set(tc->readMiscReg(MISCREG_MMU_DTLB_C0_TSB_PS0)); |
888 break; 889 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS1: 890 assert(va == 0); | 888 break; 889 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS1: 890 assert(va == 0); |
891 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_TSB_PS1)); | 891 pkt->set(tc->readMiscReg(MISCREG_MMU_DTLB_C0_TSB_PS1)); |
892 break; 893 case ASI_DMMU_CTXT_ZERO_CONFIG: 894 assert(va == 0); | 892 break; 893 case ASI_DMMU_CTXT_ZERO_CONFIG: 894 assert(va == 0); |
895 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_CONFIG)); | 895 pkt->set(tc->readMiscReg(MISCREG_MMU_DTLB_C0_CONFIG)); |
896 break; 897 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS0: 898 assert(va == 0); | 896 break; 897 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS0: 898 assert(va == 0); |
899 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_TSB_PS0)); | 899 pkt->set(tc->readMiscReg(MISCREG_MMU_ITLB_C0_TSB_PS0)); |
900 break; 901 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS1: 902 assert(va == 0); | 900 break; 901 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS1: 902 assert(va == 0); |
903 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_TSB_PS1)); | 903 pkt->set(tc->readMiscReg(MISCREG_MMU_ITLB_C0_TSB_PS1)); |
904 break; 905 case ASI_IMMU_CTXT_ZERO_CONFIG: 906 assert(va == 0); | 904 break; 905 case ASI_IMMU_CTXT_ZERO_CONFIG: 906 assert(va == 0); |
907 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG)); | 907 pkt->set(tc->readMiscReg(MISCREG_MMU_ITLB_C0_CONFIG)); |
908 break; 909 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS0: 910 assert(va == 0); | 908 break; 909 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS0: 910 assert(va == 0); |
911 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS0)); | 911 pkt->set(tc->readMiscReg(MISCREG_MMU_DTLB_CX_TSB_PS0)); |
912 break; 913 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS1: 914 assert(va == 0); | 912 break; 913 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS1: 914 assert(va == 0); |
915 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS1)); | 915 pkt->set(tc->readMiscReg(MISCREG_MMU_DTLB_CX_TSB_PS1)); |
916 break; 917 case ASI_DMMU_CTXT_NONZERO_CONFIG: 918 assert(va == 0); | 916 break; 917 case ASI_DMMU_CTXT_NONZERO_CONFIG: 918 assert(va == 0); |
919 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_CONFIG)); | 919 pkt->set(tc->readMiscReg(MISCREG_MMU_DTLB_CX_CONFIG)); |
920 break; 921 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS0: 922 assert(va == 0); | 920 break; 921 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS0: 922 assert(va == 0); |
923 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS0)); | 923 pkt->set(tc->readMiscReg(MISCREG_MMU_ITLB_CX_TSB_PS0)); |
924 break; 925 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS1: 926 assert(va == 0); | 924 break; 925 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS1: 926 assert(va == 0); |
927 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS1)); | 927 pkt->set(tc->readMiscReg(MISCREG_MMU_ITLB_CX_TSB_PS1)); |
928 break; 929 case ASI_IMMU_CTXT_NONZERO_CONFIG: 930 assert(va == 0); | 928 break; 929 case ASI_IMMU_CTXT_NONZERO_CONFIG: 930 assert(va == 0); |
931 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG)); | 931 pkt->set(tc->readMiscReg(MISCREG_MMU_ITLB_CX_CONFIG)); |
932 break; 933 case ASI_SPARC_ERROR_STATUS_REG: 934 pkt->set((uint64_t)0); 935 break; 936 case ASI_HYP_SCRATCHPAD: 937 case ASI_SCRATCHPAD: | 932 break; 933 case ASI_SPARC_ERROR_STATUS_REG: 934 pkt->set((uint64_t)0); 935 break; 936 case ASI_HYP_SCRATCHPAD: 937 case ASI_SCRATCHPAD: |
938 pkt->set(tc->readMiscRegWithEffect(MISCREG_SCRATCHPAD_R0 + (va >> 3))); | 938 pkt->set(tc->readMiscReg(MISCREG_SCRATCHPAD_R0 + (va >> 3))); |
939 break; 940 case ASI_IMMU: 941 switch (va) { 942 case 0x0: | 939 break; 940 case ASI_IMMU: 941 switch (va) { 942 case 0x0: |
943 temp = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS); | 943 temp = tc->readMiscReg(MISCREG_MMU_ITLB_TAG_ACCESS); |
944 pkt->set(bits(temp,63,22) | bits(temp,12,0) << 48); 945 break; 946 case 0x18: | 944 pkt->set(bits(temp,63,22) | bits(temp,12,0) << 48); 945 break; 946 case 0x18: |
947 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_SFSR)); | 947 pkt->set(tc->readMiscReg(MISCREG_MMU_ITLB_SFSR)); |
948 break; 949 case 0x30: | 948 break; 949 case 0x30: |
950 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS)); | 950 pkt->set(tc->readMiscReg(MISCREG_MMU_ITLB_TAG_ACCESS)); |
951 break; 952 default: 953 goto doMmuReadError; 954 } 955 break; 956 case ASI_DMMU: 957 switch (va) { 958 case 0x0: | 951 break; 952 default: 953 goto doMmuReadError; 954 } 955 break; 956 case ASI_DMMU: 957 switch (va) { 958 case 0x0: |
959 temp = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS); | 959 temp = tc->readMiscReg(MISCREG_MMU_DTLB_TAG_ACCESS); |
960 pkt->set(bits(temp,63,22) | bits(temp,12,0) << 48); 961 break; 962 case 0x18: | 960 pkt->set(bits(temp,63,22) | bits(temp,12,0) << 48); 961 break; 962 case 0x18: |
963 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_SFSR)); | 963 pkt->set(tc->readMiscReg(MISCREG_MMU_DTLB_SFSR)); |
964 break; 965 case 0x20: | 964 break; 965 case 0x20: |
966 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_SFAR)); | 966 pkt->set(tc->readMiscReg(MISCREG_MMU_DTLB_SFAR)); |
967 break; 968 case 0x30: | 967 break; 968 case 0x30: |
969 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS)); | 969 pkt->set(tc->readMiscReg(MISCREG_MMU_DTLB_TAG_ACCESS)); |
970 break; 971 case 0x80: | 970 break; 971 case 0x80: |
972 pkt->set(tc->readMiscRegWithEffect(MISCREG_MMU_PART_ID)); | 972 pkt->set(tc->readMiscReg(MISCREG_MMU_PART_ID)); |
973 break; 974 default: 975 goto doMmuReadError; 976 } 977 break; 978 case ASI_DMMU_TSB_PS0_PTR_REG: 979 pkt->set(MakeTsbPtr(Ps0, | 973 break; 974 default: 975 goto doMmuReadError; 976 } 977 break; 978 case ASI_DMMU_TSB_PS0_PTR_REG: 979 pkt->set(MakeTsbPtr(Ps0, |
980 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS), 981 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_TSB_PS0), 982 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_CONFIG), 983 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS0), 984 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_CONFIG))); | 980 tc->readMiscReg(MISCREG_MMU_DTLB_TAG_ACCESS), 981 tc->readMiscReg(MISCREG_MMU_DTLB_C0_TSB_PS0), 982 tc->readMiscReg(MISCREG_MMU_DTLB_C0_CONFIG), 983 tc->readMiscReg(MISCREG_MMU_DTLB_CX_TSB_PS0), 984 tc->readMiscReg(MISCREG_MMU_DTLB_CX_CONFIG))); |
985 break; 986 case ASI_DMMU_TSB_PS1_PTR_REG: 987 pkt->set(MakeTsbPtr(Ps1, | 985 break; 986 case ASI_DMMU_TSB_PS1_PTR_REG: 987 pkt->set(MakeTsbPtr(Ps1, |
988 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS), 989 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_TSB_PS1), 990 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_CONFIG), 991 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS1), 992 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_CONFIG))); | 988 tc->readMiscReg(MISCREG_MMU_DTLB_TAG_ACCESS), 989 tc->readMiscReg(MISCREG_MMU_DTLB_C0_TSB_PS1), 990 tc->readMiscReg(MISCREG_MMU_DTLB_C0_CONFIG), 991 tc->readMiscReg(MISCREG_MMU_DTLB_CX_TSB_PS1), 992 tc->readMiscReg(MISCREG_MMU_DTLB_CX_CONFIG))); |
993 break; 994 case ASI_IMMU_TSB_PS0_PTR_REG: 995 pkt->set(MakeTsbPtr(Ps0, | 993 break; 994 case ASI_IMMU_TSB_PS0_PTR_REG: 995 pkt->set(MakeTsbPtr(Ps0, |
996 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS), 997 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_TSB_PS0), 998 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG), 999 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS0), 1000 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG))); | 996 tc->readMiscReg(MISCREG_MMU_ITLB_TAG_ACCESS), 997 tc->readMiscReg(MISCREG_MMU_ITLB_C0_TSB_PS0), 998 tc->readMiscReg(MISCREG_MMU_ITLB_C0_CONFIG), 999 tc->readMiscReg(MISCREG_MMU_ITLB_CX_TSB_PS0), 1000 tc->readMiscReg(MISCREG_MMU_ITLB_CX_CONFIG))); |
1001 break; 1002 case ASI_IMMU_TSB_PS1_PTR_REG: 1003 pkt->set(MakeTsbPtr(Ps1, | 1001 break; 1002 case ASI_IMMU_TSB_PS1_PTR_REG: 1003 pkt->set(MakeTsbPtr(Ps1, |
1004 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS), 1005 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_TSB_PS1), 1006 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG), 1007 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS1), 1008 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG))); | 1004 tc->readMiscReg(MISCREG_MMU_ITLB_TAG_ACCESS), 1005 tc->readMiscReg(MISCREG_MMU_ITLB_C0_TSB_PS1), 1006 tc->readMiscReg(MISCREG_MMU_ITLB_C0_CONFIG), 1007 tc->readMiscReg(MISCREG_MMU_ITLB_CX_TSB_PS1), 1008 tc->readMiscReg(MISCREG_MMU_ITLB_CX_CONFIG))); |
1009 break; 1010 case ASI_SWVR_INTR_RECEIVE: 1011 pkt->set(tc->getCpuPtr()->get_interrupts(IT_INT_VEC)); 1012 break; 1013 case ASI_SWVR_UDB_INTR_R: 1014 temp = findMsbSet(tc->getCpuPtr()->get_interrupts(IT_INT_VEC)); 1015 tc->getCpuPtr()->clear_interrupt(IT_INT_VEC, temp); 1016 pkt->set(temp); --- 26 unchanged lines hidden (view full) --- 1043 PageTableEntry pte; 1044 1045 DPRINTF(IPR, "Memory Mapped IPR Write: asi=%#X a=%#x d=%#X\n", 1046 (uint32_t)asi, va, data); 1047 1048 switch (asi) { 1049 case ASI_LSU_CONTROL_REG: 1050 assert(va == 0); | 1009 break; 1010 case ASI_SWVR_INTR_RECEIVE: 1011 pkt->set(tc->getCpuPtr()->get_interrupts(IT_INT_VEC)); 1012 break; 1013 case ASI_SWVR_UDB_INTR_R: 1014 temp = findMsbSet(tc->getCpuPtr()->get_interrupts(IT_INT_VEC)); 1015 tc->getCpuPtr()->clear_interrupt(IT_INT_VEC, temp); 1016 pkt->set(temp); --- 26 unchanged lines hidden (view full) --- 1043 PageTableEntry pte; 1044 1045 DPRINTF(IPR, "Memory Mapped IPR Write: asi=%#X a=%#x d=%#X\n", 1046 (uint32_t)asi, va, data); 1047 1048 switch (asi) { 1049 case ASI_LSU_CONTROL_REG: 1050 assert(va == 0); |
1051 tc->setMiscRegWithEffect(MISCREG_MMU_LSU_CTRL, data); | 1051 tc->setMiscReg(MISCREG_MMU_LSU_CTRL, data); |
1052 break; 1053 case ASI_MMU: 1054 switch (va) { 1055 case 0x8: | 1052 break; 1053 case ASI_MMU: 1054 switch (va) { 1055 case 0x8: |
1056 tc->setMiscRegWithEffect(MISCREG_MMU_P_CONTEXT, data); | 1056 tc->setMiscReg(MISCREG_MMU_P_CONTEXT, data); |
1057 break; 1058 case 0x10: | 1057 break; 1058 case 0x10: |
1059 tc->setMiscRegWithEffect(MISCREG_MMU_S_CONTEXT, data); | 1059 tc->setMiscReg(MISCREG_MMU_S_CONTEXT, data); |
1060 break; 1061 default: 1062 goto doMmuWriteError; 1063 } 1064 break; 1065 case ASI_QUEUE: 1066 assert(mbits(data,13,6) == data); | 1060 break; 1061 default: 1062 goto doMmuWriteError; 1063 } 1064 break; 1065 case ASI_QUEUE: 1066 assert(mbits(data,13,6) == data); |
1067 tc->setMiscRegWithEffect(MISCREG_QUEUE_CPU_MONDO_HEAD + | 1067 tc->setMiscReg(MISCREG_QUEUE_CPU_MONDO_HEAD + |
1068 (va >> 4) - 0x3c, data); 1069 break; 1070 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS0: 1071 assert(va == 0); | 1068 (va >> 4) - 0x3c, data); 1069 break; 1070 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS0: 1071 assert(va == 0); |
1072 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_C0_TSB_PS0, data); | 1072 tc->setMiscReg(MISCREG_MMU_DTLB_C0_TSB_PS0, data); |
1073 break; 1074 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS1: 1075 assert(va == 0); | 1073 break; 1074 case ASI_DMMU_CTXT_ZERO_TSB_BASE_PS1: 1075 assert(va == 0); |
1076 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_C0_TSB_PS1, data); | 1076 tc->setMiscReg(MISCREG_MMU_DTLB_C0_TSB_PS1, data); |
1077 break; 1078 case ASI_DMMU_CTXT_ZERO_CONFIG: 1079 assert(va == 0); | 1077 break; 1078 case ASI_DMMU_CTXT_ZERO_CONFIG: 1079 assert(va == 0); |
1080 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_C0_CONFIG, data); | 1080 tc->setMiscReg(MISCREG_MMU_DTLB_C0_CONFIG, data); |
1081 break; 1082 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS0: 1083 assert(va == 0); | 1081 break; 1082 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS0: 1083 assert(va == 0); |
1084 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_C0_TSB_PS0, data); | 1084 tc->setMiscReg(MISCREG_MMU_ITLB_C0_TSB_PS0, data); |
1085 break; 1086 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS1: 1087 assert(va == 0); | 1085 break; 1086 case ASI_IMMU_CTXT_ZERO_TSB_BASE_PS1: 1087 assert(va == 0); |
1088 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_C0_TSB_PS1, data); | 1088 tc->setMiscReg(MISCREG_MMU_ITLB_C0_TSB_PS1, data); |
1089 break; 1090 case ASI_IMMU_CTXT_ZERO_CONFIG: 1091 assert(va == 0); | 1089 break; 1090 case ASI_IMMU_CTXT_ZERO_CONFIG: 1091 assert(va == 0); |
1092 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG, data); | 1092 tc->setMiscReg(MISCREG_MMU_ITLB_C0_CONFIG, data); |
1093 break; 1094 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS0: 1095 assert(va == 0); | 1093 break; 1094 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS0: 1095 assert(va == 0); |
1096 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS0, data); | 1096 tc->setMiscReg(MISCREG_MMU_DTLB_CX_TSB_PS0, data); |
1097 break; 1098 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS1: 1099 assert(va == 0); | 1097 break; 1098 case ASI_DMMU_CTXT_NONZERO_TSB_BASE_PS1: 1099 assert(va == 0); |
1100 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS1, data); | 1100 tc->setMiscReg(MISCREG_MMU_DTLB_CX_TSB_PS1, data); |
1101 break; 1102 case ASI_DMMU_CTXT_NONZERO_CONFIG: 1103 assert(va == 0); | 1101 break; 1102 case ASI_DMMU_CTXT_NONZERO_CONFIG: 1103 assert(va == 0); |
1104 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_CX_CONFIG, data); | 1104 tc->setMiscReg(MISCREG_MMU_DTLB_CX_CONFIG, data); |
1105 break; 1106 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS0: 1107 assert(va == 0); | 1105 break; 1106 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS0: 1107 assert(va == 0); |
1108 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS0, data); | 1108 tc->setMiscReg(MISCREG_MMU_ITLB_CX_TSB_PS0, data); |
1109 break; 1110 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS1: 1111 assert(va == 0); | 1109 break; 1110 case ASI_IMMU_CTXT_NONZERO_TSB_BASE_PS1: 1111 assert(va == 0); |
1112 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS1, data); | 1112 tc->setMiscReg(MISCREG_MMU_ITLB_CX_TSB_PS1, data); |
1113 break; 1114 case ASI_IMMU_CTXT_NONZERO_CONFIG: 1115 assert(va == 0); | 1113 break; 1114 case ASI_IMMU_CTXT_NONZERO_CONFIG: 1115 assert(va == 0); |
1116 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG, data); | 1116 tc->setMiscReg(MISCREG_MMU_ITLB_CX_CONFIG, data); |
1117 break; 1118 case ASI_SPARC_ERROR_EN_REG: 1119 case ASI_SPARC_ERROR_STATUS_REG: 1120 warn("Ignoring write to SPARC ERROR regsiter\n"); 1121 break; 1122 case ASI_HYP_SCRATCHPAD: 1123 case ASI_SCRATCHPAD: | 1117 break; 1118 case ASI_SPARC_ERROR_EN_REG: 1119 case ASI_SPARC_ERROR_STATUS_REG: 1120 warn("Ignoring write to SPARC ERROR regsiter\n"); 1121 break; 1122 case ASI_HYP_SCRATCHPAD: 1123 case ASI_SCRATCHPAD: |
1124 tc->setMiscRegWithEffect(MISCREG_SCRATCHPAD_R0 + (va >> 3), data); | 1124 tc->setMiscReg(MISCREG_SCRATCHPAD_R0 + (va >> 3), data); |
1125 break; 1126 case ASI_IMMU: 1127 switch (va) { 1128 case 0x18: | 1125 break; 1126 case ASI_IMMU: 1127 switch (va) { 1128 case 0x18: |
1129 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_SFSR, data); | 1129 tc->setMiscReg(MISCREG_MMU_ITLB_SFSR, data); |
1130 break; 1131 case 0x30: 1132 sext<59>(bits(data, 59,0)); | 1130 break; 1131 case 0x30: 1132 sext<59>(bits(data, 59,0)); |
1133 tc->setMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS, data); | 1133 tc->setMiscReg(MISCREG_MMU_ITLB_TAG_ACCESS, data); |
1134 break; 1135 default: 1136 goto doMmuWriteError; 1137 } 1138 break; 1139 case ASI_ITLB_DATA_ACCESS_REG: 1140 entry_insert = bits(va, 8,3); 1141 case ASI_ITLB_DATA_IN_REG: 1142 assert(entry_insert != -1 || mbits(va,10,9) == va); | 1134 break; 1135 default: 1136 goto doMmuWriteError; 1137 } 1138 break; 1139 case ASI_ITLB_DATA_ACCESS_REG: 1140 entry_insert = bits(va, 8,3); 1141 case ASI_ITLB_DATA_IN_REG: 1142 assert(entry_insert != -1 || mbits(va,10,9) == va); |
1143 ta_insert = tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_TAG_ACCESS); | 1143 ta_insert = tc->readMiscReg(MISCREG_MMU_ITLB_TAG_ACCESS); |
1144 va_insert = mbits(ta_insert, 63,13); 1145 ct_insert = mbits(ta_insert, 12,0); | 1144 va_insert = mbits(ta_insert, 63,13); 1145 ct_insert = mbits(ta_insert, 12,0); |
1146 part_insert = tc->readMiscRegWithEffect(MISCREG_MMU_PART_ID); | 1146 part_insert = tc->readMiscReg(MISCREG_MMU_PART_ID); |
1147 real_insert = bits(va, 9,9); 1148 pte.populate(data, bits(va,10,10) ? PageTableEntry::sun4v : 1149 PageTableEntry::sun4u); 1150 tc->getITBPtr()->insert(va_insert, part_insert, ct_insert, real_insert, 1151 pte, entry_insert); 1152 break; 1153 case ASI_DTLB_DATA_ACCESS_REG: 1154 entry_insert = bits(va, 8,3); 1155 case ASI_DTLB_DATA_IN_REG: 1156 assert(entry_insert != -1 || mbits(va,10,9) == va); | 1147 real_insert = bits(va, 9,9); 1148 pte.populate(data, bits(va,10,10) ? PageTableEntry::sun4v : 1149 PageTableEntry::sun4u); 1150 tc->getITBPtr()->insert(va_insert, part_insert, ct_insert, real_insert, 1151 pte, entry_insert); 1152 break; 1153 case ASI_DTLB_DATA_ACCESS_REG: 1154 entry_insert = bits(va, 8,3); 1155 case ASI_DTLB_DATA_IN_REG: 1156 assert(entry_insert != -1 || mbits(va,10,9) == va); |
1157 ta_insert = tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS); | 1157 ta_insert = tc->readMiscReg(MISCREG_MMU_DTLB_TAG_ACCESS); |
1158 va_insert = mbits(ta_insert, 63,13); 1159 ct_insert = mbits(ta_insert, 12,0); | 1158 va_insert = mbits(ta_insert, 63,13); 1159 ct_insert = mbits(ta_insert, 12,0); |
1160 part_insert = tc->readMiscRegWithEffect(MISCREG_MMU_PART_ID); | 1160 part_insert = tc->readMiscReg(MISCREG_MMU_PART_ID); |
1161 real_insert = bits(va, 9,9); 1162 pte.populate(data, bits(va,10,10) ? PageTableEntry::sun4v : 1163 PageTableEntry::sun4u); 1164 insert(va_insert, part_insert, ct_insert, real_insert, pte, entry_insert); 1165 break; 1166 case ASI_IMMU_DEMAP: 1167 ignore = false; 1168 ctx_id = -1; | 1161 real_insert = bits(va, 9,9); 1162 pte.populate(data, bits(va,10,10) ? PageTableEntry::sun4v : 1163 PageTableEntry::sun4u); 1164 insert(va_insert, part_insert, ct_insert, real_insert, pte, entry_insert); 1165 break; 1166 case ASI_IMMU_DEMAP: 1167 ignore = false; 1168 ctx_id = -1; |
1169 part_id = tc->readMiscRegWithEffect(MISCREG_MMU_PART_ID); | 1169 part_id = tc->readMiscReg(MISCREG_MMU_PART_ID); |
1170 switch (bits(va,5,4)) { 1171 case 0: | 1170 switch (bits(va,5,4)) { 1171 case 0: |
1172 ctx_id = tc->readMiscRegWithEffect(MISCREG_MMU_P_CONTEXT); | 1172 ctx_id = tc->readMiscReg(MISCREG_MMU_P_CONTEXT); |
1173 break; 1174 case 1: 1175 ignore = true; 1176 break; 1177 case 3: 1178 ctx_id = 0; 1179 break; 1180 default: --- 15 unchanged lines hidden (view full) --- 1196 break; 1197 default: 1198 panic("Invalid type for IMMU demap\n"); 1199 } 1200 break; 1201 case ASI_DMMU: 1202 switch (va) { 1203 case 0x18: | 1173 break; 1174 case 1: 1175 ignore = true; 1176 break; 1177 case 3: 1178 ctx_id = 0; 1179 break; 1180 default: --- 15 unchanged lines hidden (view full) --- 1196 break; 1197 default: 1198 panic("Invalid type for IMMU demap\n"); 1199 } 1200 break; 1201 case ASI_DMMU: 1202 switch (va) { 1203 case 0x18: |
1204 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_SFSR, data); | 1204 tc->setMiscReg(MISCREG_MMU_DTLB_SFSR, data); |
1205 break; 1206 case 0x30: 1207 sext<59>(bits(data, 59,0)); | 1205 break; 1206 case 0x30: 1207 sext<59>(bits(data, 59,0)); |
1208 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS, data); | 1208 tc->setMiscReg(MISCREG_MMU_DTLB_TAG_ACCESS, data); |
1209 break; 1210 case 0x80: | 1209 break; 1210 case 0x80: |
1211 tc->setMiscRegWithEffect(MISCREG_MMU_PART_ID, data); | 1211 tc->setMiscReg(MISCREG_MMU_PART_ID, data); |
1212 break; 1213 default: 1214 goto doMmuWriteError; 1215 } 1216 break; 1217 case ASI_DMMU_DEMAP: 1218 ignore = false; 1219 ctx_id = -1; | 1212 break; 1213 default: 1214 goto doMmuWriteError; 1215 } 1216 break; 1217 case ASI_DMMU_DEMAP: 1218 ignore = false; 1219 ctx_id = -1; |
1220 part_id = tc->readMiscRegWithEffect(MISCREG_MMU_PART_ID); | 1220 part_id = tc->readMiscReg(MISCREG_MMU_PART_ID); |
1221 switch (bits(va,5,4)) { 1222 case 0: | 1221 switch (bits(va,5,4)) { 1222 case 0: |
1223 ctx_id = tc->readMiscRegWithEffect(MISCREG_MMU_P_CONTEXT); | 1223 ctx_id = tc->readMiscReg(MISCREG_MMU_P_CONTEXT); |
1224 break; 1225 case 1: | 1224 break; 1225 case 1: |
1226 ctx_id = tc->readMiscRegWithEffect(MISCREG_MMU_S_CONTEXT); | 1226 ctx_id = tc->readMiscReg(MISCREG_MMU_S_CONTEXT); |
1227 break; 1228 case 3: 1229 ctx_id = 0; 1230 break; 1231 default: 1232 ignore = true; 1233 } 1234 --- 34 unchanged lines hidden (view full) --- 1269 return tc->getCpuPtr()->cycles(1); 1270} 1271 1272void 1273DTB::GetTsbPtr(ThreadContext *tc, Addr addr, int ctx, Addr *ptrs) 1274{ 1275 uint64_t tag_access = mbits(addr,63,13) | mbits(ctx,12,0); 1276 ptrs[0] = MakeTsbPtr(Ps0, tag_access, | 1227 break; 1228 case 3: 1229 ctx_id = 0; 1230 break; 1231 default: 1232 ignore = true; 1233 } 1234 --- 34 unchanged lines hidden (view full) --- 1269 return tc->getCpuPtr()->cycles(1); 1270} 1271 1272void 1273DTB::GetTsbPtr(ThreadContext *tc, Addr addr, int ctx, Addr *ptrs) 1274{ 1275 uint64_t tag_access = mbits(addr,63,13) | mbits(ctx,12,0); 1276 ptrs[0] = MakeTsbPtr(Ps0, tag_access, |
1277 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_TSB_PS0), 1278 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_CONFIG), 1279 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS0), 1280 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_CONFIG)); | 1277 tc->readMiscReg(MISCREG_MMU_DTLB_C0_TSB_PS0), 1278 tc->readMiscReg(MISCREG_MMU_DTLB_C0_CONFIG), 1279 tc->readMiscReg(MISCREG_MMU_DTLB_CX_TSB_PS0), 1280 tc->readMiscReg(MISCREG_MMU_DTLB_CX_CONFIG)); |
1281 ptrs[1] = MakeTsbPtr(Ps1, tag_access, | 1281 ptrs[1] = MakeTsbPtr(Ps1, tag_access, |
1282 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_TSB_PS1), 1283 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_C0_CONFIG), 1284 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_TSB_PS1), 1285 tc->readMiscRegWithEffect(MISCREG_MMU_DTLB_CX_CONFIG)); | 1282 tc->readMiscReg(MISCREG_MMU_DTLB_C0_TSB_PS1), 1283 tc->readMiscReg(MISCREG_MMU_DTLB_C0_CONFIG), 1284 tc->readMiscReg(MISCREG_MMU_DTLB_CX_TSB_PS1), 1285 tc->readMiscReg(MISCREG_MMU_DTLB_CX_CONFIG)); |
1286 ptrs[2] = MakeTsbPtr(Ps0, tag_access, | 1286 ptrs[2] = MakeTsbPtr(Ps0, tag_access, |
1287 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_TSB_PS0), 1288 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG), 1289 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS0), 1290 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG)); | 1287 tc->readMiscReg(MISCREG_MMU_ITLB_C0_TSB_PS0), 1288 tc->readMiscReg(MISCREG_MMU_ITLB_C0_CONFIG), 1289 tc->readMiscReg(MISCREG_MMU_ITLB_CX_TSB_PS0), 1290 tc->readMiscReg(MISCREG_MMU_ITLB_CX_CONFIG)); |
1291 ptrs[3] = MakeTsbPtr(Ps1, tag_access, | 1291 ptrs[3] = MakeTsbPtr(Ps1, tag_access, |
1292 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_TSB_PS1), 1293 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_C0_CONFIG), 1294 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_TSB_PS1), 1295 tc->readMiscRegWithEffect(MISCREG_MMU_ITLB_CX_CONFIG)); | 1292 tc->readMiscReg(MISCREG_MMU_ITLB_C0_TSB_PS1), 1293 tc->readMiscReg(MISCREG_MMU_ITLB_C0_CONFIG), 1294 tc->readMiscReg(MISCREG_MMU_ITLB_CX_TSB_PS1), 1295 tc->readMiscReg(MISCREG_MMU_ITLB_CX_CONFIG)); |
1296} 1297 1298 1299 1300 1301 1302uint64_t 1303DTB::MakeTsbPtr(TsbPageSize ps, uint64_t tag_access, uint64_t c0_tsb, --- 125 unchanged lines hidden --- | 1296} 1297 1298 1299 1300 1301 1302uint64_t 1303DTB::MakeTsbPtr(TsbPageSize ps, uint64_t tag_access, uint64_t c0_tsb, --- 125 unchanged lines hidden --- |