physical.cc (4040:eb894f3fc168) | physical.cc (4052:895ad21ffbf3) |
---|---|
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; --- 251 unchanged lines hidden (view full) --- 260 } else if (pkt->isInvalidate()) { 261 //upgrade or invalidate 262 pkt->flags |= SATISFIED; 263 } else if (pkt->isReadWrite()) { 264 IntReg overwrite_val; 265 bool overwrite_mem; 266 uint64_t condition_val64; 267 uint32_t condition_val32; | 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; --- 251 unchanged lines hidden (view full) --- 260 } else if (pkt->isInvalidate()) { 261 //upgrade or invalidate 262 pkt->flags |= SATISFIED; 263 } else if (pkt->isReadWrite()) { 264 IntReg overwrite_val; 265 bool overwrite_mem; 266 uint64_t condition_val64; 267 uint32_t condition_val32; |
268 uint64_t test_val64; 269 uint32_t test_val32; | |
270 271 assert(sizeof(IntReg) >= pkt->getSize()); 272 273 overwrite_mem = true; 274 // keep a copy of our possible write value, and copy what is at the 275 // memory address into the packet | 268 269 assert(sizeof(IntReg) >= pkt->getSize()); 270 271 overwrite_mem = true; 272 // keep a copy of our possible write value, and copy what is at the 273 // memory address into the packet |
276 memcpy(&overwrite_val, pkt->getPtr 277 memcpy(pkt->getPtr | 274 std::memcpy(&overwrite_val, pkt->getPtr<uint8_t>(), pkt->getSize()); 275 std::memcpy(pkt->getPtr<uint8_t>(), pmemAddr + pkt->getAddr() - start(), |
278 pkt->getSize()); 279 280 if (pkt->req->isCondSwap()) { 281 if (pkt->getSize() == sizeof(uint64_t)) { | 276 pkt->getSize()); 277 278 if (pkt->req->isCondSwap()) { 279 if (pkt->getSize() == sizeof(uint64_t)) { |
282 condition_val64 = htog(pkt->req->getExtraData()); 283 memcpy(&test_val64, pmemAddr + pkt->getAddr() - start(), sizeof(uint64_t)); 284 overwrite_mem = test_val64 == condition_val64; | 280 condition_val64 = pkt->req->getExtraData(); 281 overwrite_mem = !std::memcmp(&condition_val64, pmemAddr + 282 pkt->getAddr() - start(), sizeof(uint64_t)); |
285 } else if (pkt->getSize() == sizeof(uint32_t)) { | 283 } else if (pkt->getSize() == sizeof(uint32_t)) { |
286 condition_val32 = htog((uint32_t)pkt->req->getExtraData()); 287 memcpy(&test_val32, pmemAddr + pkt->getAddr() - start(), sizeof(uint32_t)); 288 overwrite_mem = test_val32 == condition_val32; | 284 condition_val32 = (uint32_t)pkt->req->getExtraData(); 285 overwrite_mem = !std::memcmp(&condition_val32, pmemAddr + 286 pkt->getAddr() - start(), sizeof(uint32_t)); |
289 } else 290 panic("Invalid size for conditional read/write\n"); 291 } 292 293 if (overwrite_mem) | 287 } else 288 panic("Invalid size for conditional read/write\n"); 289 } 290 291 if (overwrite_mem) |
294 memcpy(pmemAddr + pkt->getAddr() - start(), | 292 std::memcpy(pmemAddr + pkt->getAddr() - start(), |
295 &overwrite_val, pkt->getSize()); 296 297#if TRACING_ON 298 switch (pkt->getSize()) { 299 case sizeof(uint64_t): 300 DPRINTF(MemoryAccess, "Read/Write of size %i on address 0x%x old data 0x%x\n", 301 pkt->getSize(), pkt->getAddr(),pkt->get<uint64_t>()); 302 DPRINTF(MemoryAccess, "New Data 0x%x %s conditional (0x%x) and %s \n", --- 266 unchanged lines hidden --- | 293 &overwrite_val, pkt->getSize()); 294 295#if TRACING_ON 296 switch (pkt->getSize()) { 297 case sizeof(uint64_t): 298 DPRINTF(MemoryAccess, "Read/Write of size %i on address 0x%x old data 0x%x\n", 299 pkt->getSize(), pkt->getAddr(),pkt->get<uint64_t>()); 300 DPRINTF(MemoryAccess, "New Data 0x%x %s conditional (0x%x) and %s \n", --- 266 unchanged lines hidden --- |