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(), pkt->getSize());
277 memcpy(pkt->getPtr(), pmemAddr + pkt->getAddr() - start(),
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 ---