📄 sim-main.c
字号:
/* For little endian target, byte (pAddr&LOADDRMASK == 0) is already in the correct postition. */ MemElem >>= ((pAddr & LOADDRMASK) * 8); } #ifdef DEBUG printf("DBG: StoreMemory: shift = %d MemElem = 0x%s%s\n",shift,pr_uword64(MemElem1),pr_uword64(MemElem));#endif /* DEBUG */ switch (AccessLength) { case AccessLength_QUADWORD: { unsigned_16 val = U16_8 (MemElem1, MemElem); sim_core_write_aligned_16 (CPU, cia, write_map, pAddr, val); break; } case AccessLength_DOUBLEWORD: sim_core_write_aligned_8 (CPU, cia, write_map, pAddr, MemElem); break; case AccessLength_SEPTIBYTE: sim_core_write_misaligned_7 (CPU, cia, write_map, pAddr, MemElem); break; case AccessLength_SEXTIBYTE: sim_core_write_misaligned_6 (CPU, cia, write_map, pAddr, MemElem); break; case AccessLength_QUINTIBYTE: sim_core_write_misaligned_5 (CPU, cia, write_map, pAddr, MemElem); break; case AccessLength_WORD: sim_core_write_aligned_4 (CPU, cia, write_map, pAddr, MemElem); break; case AccessLength_TRIPLEBYTE: sim_core_write_misaligned_3 (CPU, cia, write_map, pAddr, MemElem); break; case AccessLength_HALFWORD: sim_core_write_aligned_2 (CPU, cia, write_map, pAddr, MemElem); break; case AccessLength_BYTE: sim_core_write_aligned_1 (CPU, cia, write_map, pAddr, MemElem); break; default: abort (); } return;}INLINE_SIM_MAIN (unsigned32)ifetch32 (SIM_DESC SD, sim_cpu *CPU, address_word cia, address_word vaddr){ /* Copy the action of the LW instruction */ address_word mask = LOADDRMASK; address_word access = AccessLength_WORD; address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0); address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0); unsigned int byte; address_word paddr; int uncached; unsigned64 memval; if ((vaddr & access) != 0) SignalExceptionInstructionFetch (); AddressTranslation (vaddr, isINSTRUCTION, isLOAD, &paddr, &uncached, isTARGET, isREAL); paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian)); LoadMemory (&memval, NULL, uncached, access, paddr, vaddr, isINSTRUCTION, isREAL); byte = ((vaddr & mask) ^ bigendiancpu); return (memval >> (8 * byte));}INLINE_SIM_MAIN (unsigned16)ifetch16 (SIM_DESC SD, sim_cpu *CPU, address_word cia, address_word vaddr){ /* Copy the action of the LH instruction */ address_word mask = LOADDRMASK; address_word access = AccessLength_HALFWORD; address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0); address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0); unsigned int byte; address_word paddr; int uncached; unsigned64 memval; if ((vaddr & access) != 0) SignalExceptionInstructionFetch (); AddressTranslation (vaddr, isINSTRUCTION, isLOAD, &paddr, &uncached, isTARGET, isREAL); paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian)); LoadMemory (&memval, NULL, uncached, access, paddr, vaddr, isINSTRUCTION, isREAL); byte = ((vaddr & mask) ^ bigendiancpu); return (memval >> (8 * byte));}/* Description from page A-26 of the "MIPS IV Instruction Set" manual (revision 3.1) *//* Order loads and stores to synchronise shared memory. Perform the action necessary to make the effects of groups of synchronizable loads and stores indicated by stype occur in the same order for all processors. */INLINE_SIM_MAIN (void)sync_operation (SIM_DESC sd, sim_cpu *cpu, address_word cia, int stype){#ifdef DEBUG sim_io_printf(sd,"SyncOperation(%d) : TODO\n",stype);#endif /* DEBUG */ return;}INLINE_SIM_MAIN (void)cache_op (SIM_DESC SD, sim_cpu *CPU, address_word cia, int op, address_word pAddr, address_word vAddr, unsigned int instruction){#if 1 /* stop warning message being displayed (we should really just remove the code) */ static int icache_warning = 1; static int dcache_warning = 1;#else static int icache_warning = 0; static int dcache_warning = 0;#endif /* If CP0 is not useable (User or Supervisor mode) and the CP0 enable bit in the Status Register is clear - a coprocessor unusable exception is taken. */#if 0 sim_io_printf(SD,"TODO: Cache availability checking (PC = 0x%s)\n",pr_addr(cia));#endif switch (op & 0x3) { case 0: /* instruction cache */ switch (op >> 2) { case 0: /* Index Invalidate */ case 1: /* Index Load Tag */ case 2: /* Index Store Tag */ case 4: /* Hit Invalidate */ case 5: /* Fill */ case 6: /* Hit Writeback */ if (!icache_warning) { sim_io_eprintf(SD,"Instruction CACHE operation %d to be coded\n",(op >> 2)); icache_warning = 1; } break; default: SignalException(ReservedInstruction,instruction); break; } break; case 1: /* data cache */ case 3: /* secondary data cache */ switch (op >> 2) { case 0: /* Index Writeback Invalidate */ case 1: /* Index Load Tag */ case 2: /* Index Store Tag */ case 3: /* Create Dirty */ case 4: /* Hit Invalidate */ case 5: /* Hit Writeback Invalidate */ case 6: /* Hit Writeback */ if (!dcache_warning) { sim_io_eprintf(SD,"Data CACHE operation %d to be coded\n",(op >> 2)); dcache_warning = 1; } break; default: SignalException(ReservedInstruction,instruction); break; } break; default: /* unrecognised cache ID */ SignalException(ReservedInstruction,instruction); break; } return;}INLINE_SIM_MAIN (void)pending_tick (SIM_DESC SD, sim_cpu *CPU, address_word cia){ if (PENDING_TRACE) sim_io_eprintf (SD, "PENDING_DRAIN - 0x%lx - pending_in = %d, pending_out = %d, pending_total = %d\n", (unsigned long) cia, PENDING_IN, PENDING_OUT, PENDING_TOTAL); if (PENDING_OUT != PENDING_IN) { int loop; int index = PENDING_OUT; int total = PENDING_TOTAL; if (PENDING_TOTAL == 0) sim_engine_abort (SD, CPU, cia, "PENDING_DRAIN - Mis-match on pending update pointers\n"); for (loop = 0, index = PENDING_OUT; (loop < total); loop++, index = (index + 1) % PSLOTS) { if (PENDING_SLOT_DEST[index] != NULL) { PENDING_SLOT_DELAY[index] -= 1; if (PENDING_SLOT_DELAY[index] == 0) { if (PENDING_TRACE) sim_io_eprintf (SD, "PENDING_DRAIN - drained - index %d, dest 0x%lx, bit %d, val 0x%lx, size %d\n", index, (unsigned long) PENDING_SLOT_DEST[index], PENDING_SLOT_BIT[index], (unsigned long) PENDING_SLOT_VALUE[index], PENDING_SLOT_SIZE[index]); if (PENDING_SLOT_BIT[index] >= 0) switch (PENDING_SLOT_SIZE[index]) { case 4: if (PENDING_SLOT_VALUE[index]) *(unsigned32*)PENDING_SLOT_DEST[index] |= BIT32 (PENDING_SLOT_BIT[index]); else *(unsigned32*)PENDING_SLOT_DEST[index] &= BIT32 (PENDING_SLOT_BIT[index]); break; case 8: if (PENDING_SLOT_VALUE[index]) *(unsigned64*)PENDING_SLOT_DEST[index] |= BIT64 (PENDING_SLOT_BIT[index]); else *(unsigned64*)PENDING_SLOT_DEST[index] &= BIT64 (PENDING_SLOT_BIT[index]); break; } else switch (PENDING_SLOT_SIZE[index]) { case 4: *(unsigned32*)PENDING_SLOT_DEST[index] = PENDING_SLOT_VALUE[index]; break; case 8: *(unsigned64*)PENDING_SLOT_DEST[index] = PENDING_SLOT_VALUE[index]; break; } if (PENDING_OUT == index) { PENDING_SLOT_DEST[index] = NULL; PENDING_OUT = (PENDING_OUT + 1) % PSLOTS; PENDING_TOTAL--; } } else if (PENDING_TRACE && PENDING_SLOT_DELAY[index] > 0) sim_io_eprintf (SD, "PENDING_DRAIN - queued - index %d, delay %d, dest 0x%lx, bit %d, val 0x%lx, size %d\n", index, PENDING_SLOT_DELAY[index], (unsigned long) PENDING_SLOT_DEST[index], PENDING_SLOT_BIT[index], (unsigned long) PENDING_SLOT_VALUE[index], PENDING_SLOT_SIZE[index]); } } } }#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -