lsq.cc (12748:ae5ce8e42de7) lsq.cc (12749:223c83ed9979)
1/*
2 * Copyright (c) 2013-2014,2017 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 69 unchanged lines hidden (view full) ---

78 data(data_),
79 packet(NULL),
80 request(),
81 fault(NoFault),
82 res(res_),
83 skipped(false),
84 issuedToMemory(false),
85 state(NotIssued)
1/*
2 * Copyright (c) 2013-2014,2017 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 69 unchanged lines hidden (view full) ---

78 data(data_),
79 packet(NULL),
80 request(),
81 fault(NoFault),
82 res(res_),
83 skipped(false),
84 issuedToMemory(false),
85 state(NotIssued)
86{ }
86{
87 request = std::make_shared<Request>();
88}
87
88LSQ::AddrRangeCoverage
89LSQ::LSQRequest::containsAddrRangeOf(
90 Addr req1_addr, unsigned int req1_size,
91 Addr req2_addr, unsigned int req2_size)
92{
93 /* 'end' here means the address of the byte just past the request
94 * blocks */

--- 10 unchanged lines hidden (view full) ---

105 ret = PartialAddrRangeCoverage;
106
107 return ret;
108}
109
110LSQ::AddrRangeCoverage
111LSQ::LSQRequest::containsAddrRangeOf(LSQRequestPtr other_request)
112{
89
90LSQ::AddrRangeCoverage
91LSQ::LSQRequest::containsAddrRangeOf(
92 Addr req1_addr, unsigned int req1_size,
93 Addr req2_addr, unsigned int req2_size)
94{
95 /* 'end' here means the address of the byte just past the request
96 * blocks */

--- 10 unchanged lines hidden (view full) ---

107 ret = PartialAddrRangeCoverage;
108
109 return ret;
110}
111
112LSQ::AddrRangeCoverage
113LSQ::LSQRequest::containsAddrRangeOf(LSQRequestPtr other_request)
114{
113 return containsAddrRangeOf(request.getPaddr(), request.getSize(),
114 other_request->request.getPaddr(), other_request->request.getSize());
115 return containsAddrRangeOf(request->getPaddr(), request->getSize(),
116 other_request->request->getPaddr(), other_request->request->getSize());
115}
116
117bool
118LSQ::LSQRequest::isBarrier()
119{
120 return inst->isInst() && inst->staticInst->isMemBarrier();
121}
122

--- 100 unchanged lines hidden (view full) ---

223 DPRINTF(MinorMem, "Moving %s barrier out of store buffer inst: %s\n",
224 (is_last_barrier ? "last" : "a"), *inst);
225
226 if (is_last_barrier)
227 lastMemBarrier[inst->id.threadId] = 0;
228}
229
230void
117}
118
119bool
120LSQ::LSQRequest::isBarrier()
121{
122 return inst->isInst() && inst->staticInst->isMemBarrier();
123}
124

--- 100 unchanged lines hidden (view full) ---

225 DPRINTF(MinorMem, "Moving %s barrier out of store buffer inst: %s\n",
226 (is_last_barrier ? "last" : "a"), *inst);
227
228 if (is_last_barrier)
229 lastMemBarrier[inst->id.threadId] = 0;
230}
231
232void
231LSQ::SingleDataRequest::finish(const Fault &fault_, RequestPtr request_,
233LSQ::SingleDataRequest::finish(const Fault &fault_, const RequestPtr &request_,
232 ThreadContext *tc, BaseTLB::Mode mode)
233{
234 fault = fault_;
235
236 port.numAccessesInDTLB--;
237
238 DPRINTFS(MinorMem, (&port), "Received translation response for"
239 " request: %s\n", *inst);

--- 17 unchanged lines hidden (view full) ---

257
258 setState(LSQ::LSQRequest::InTranslation);
259
260 DPRINTFS(MinorMem, (&port), "Submitting DTLB request\n");
261 /* Submit the translation request. The response will come through
262 * finish/markDelayed on the LSQRequest as it bears the Translation
263 * interface */
264 thread->getDTBPtr()->translateTiming(
234 ThreadContext *tc, BaseTLB::Mode mode)
235{
236 fault = fault_;
237
238 port.numAccessesInDTLB--;
239
240 DPRINTFS(MinorMem, (&port), "Received translation response for"
241 " request: %s\n", *inst);

--- 17 unchanged lines hidden (view full) ---

259
260 setState(LSQ::LSQRequest::InTranslation);
261
262 DPRINTFS(MinorMem, (&port), "Submitting DTLB request\n");
263 /* Submit the translation request. The response will come through
264 * finish/markDelayed on the LSQRequest as it bears the Translation
265 * interface */
266 thread->getDTBPtr()->translateTiming(
265 &request, thread, this, (isLoad ? BaseTLB::Read : BaseTLB::Write));
267 request, thread, this, (isLoad ? BaseTLB::Read : BaseTLB::Write));
266}
267
268void
269LSQ::SingleDataRequest::retireResponse(PacketPtr packet_)
270{
271 DPRINTFS(MinorMem, (&port), "Retiring packet\n");
272 packet = packet_;
273 packetInFlight = false;
274 setState(Complete);
275}
276
277void
268}
269
270void
271LSQ::SingleDataRequest::retireResponse(PacketPtr packet_)
272{
273 DPRINTFS(MinorMem, (&port), "Retiring packet\n");
274 packet = packet_;
275 packetInFlight = false;
276 setState(Complete);
277}
278
279void
278LSQ::SplitDataRequest::finish(const Fault &fault_, RequestPtr request_,
280LSQ::SplitDataRequest::finish(const Fault &fault_, const RequestPtr &request_,
279 ThreadContext *tc, BaseTLB::Mode mode)
280{
281 fault = fault_;
282
283 port.numAccessesInDTLB--;
284
285 unsigned int M5_VAR_USED expected_fragment_index =
286 numTranslatedFragments;

--- 45 unchanged lines hidden (view full) ---

332 fragmentPackets()
333{
334 /* Don't know how many elements are needed until the request is
335 * populated by the caller. */
336}
337
338LSQ::SplitDataRequest::~SplitDataRequest()
339{
281 ThreadContext *tc, BaseTLB::Mode mode)
282{
283 fault = fault_;
284
285 port.numAccessesInDTLB--;
286
287 unsigned int M5_VAR_USED expected_fragment_index =
288 numTranslatedFragments;

--- 45 unchanged lines hidden (view full) ---

334 fragmentPackets()
335{
336 /* Don't know how many elements are needed until the request is
337 * populated by the caller. */
338}
339
340LSQ::SplitDataRequest::~SplitDataRequest()
341{
340 for (auto i = fragmentRequests.begin();
341 i != fragmentRequests.end(); i++)
342 {
343 delete *i;
344 }
345
346 for (auto i = fragmentPackets.begin();
347 i != fragmentPackets.end(); i++)
348 {
349 delete *i;
350 }
351}
352
353void
354LSQ::SplitDataRequest::makeFragmentRequests()
355{
342 for (auto i = fragmentPackets.begin();
343 i != fragmentPackets.end(); i++)
344 {
345 delete *i;
346 }
347}
348
349void
350LSQ::SplitDataRequest::makeFragmentRequests()
351{
356 Addr base_addr = request.getVaddr();
357 unsigned int whole_size = request.getSize();
352 Addr base_addr = request->getVaddr();
353 unsigned int whole_size = request->getSize();
358 unsigned int line_width = port.lineWidth;
359
360 unsigned int fragment_size;
361 Addr fragment_addr;
362
363 /* Assume that this transfer is across potentially many block snap
364 * boundaries:
365 *

--- 52 unchanged lines hidden (view full) ---

418 fragment_size = end_addr - fragment_addr;
419 is_last_fragment = true;
420 } else {
421 /* Middle fragments */
422 fragment_size = line_width;
423 }
424 }
425
354 unsigned int line_width = port.lineWidth;
355
356 unsigned int fragment_size;
357 Addr fragment_addr;
358
359 /* Assume that this transfer is across potentially many block snap
360 * boundaries:
361 *

--- 52 unchanged lines hidden (view full) ---

414 fragment_size = end_addr - fragment_addr;
415 is_last_fragment = true;
416 } else {
417 /* Middle fragments */
418 fragment_size = line_width;
419 }
420 }
421
426 RequestPtr fragment = new Request();
422 RequestPtr fragment = std::make_shared<Request>();
427
423
428 fragment->setContext(request.contextId());
424 fragment->setContext(request->contextId());
429 fragment->setVirt(0 /* asid */,
425 fragment->setVirt(0 /* asid */,
430 fragment_addr, fragment_size, request.getFlags(),
431 request.masterId(),
432 request.getPC());
426 fragment_addr, fragment_size, request->getFlags(),
427 request->masterId(),
428 request->getPC());
433
434 DPRINTFS(MinorMem, (&port), "Generating fragment addr: 0x%x size: %d"
435 " (whole request addr: 0x%x size: %d) %s\n",
436 fragment_addr, fragment_size, base_addr, whole_size,
437 (is_last_fragment ? "last fragment" : ""));
438
439 fragment_addr += fragment_size;
440
441 fragmentRequests.push_back(fragment);
442 }
443}
444
445void
446LSQ::SplitDataRequest::makeFragmentPackets()
447{
429
430 DPRINTFS(MinorMem, (&port), "Generating fragment addr: 0x%x size: %d"
431 " (whole request addr: 0x%x size: %d) %s\n",
432 fragment_addr, fragment_size, base_addr, whole_size,
433 (is_last_fragment ? "last fragment" : ""));
434
435 fragment_addr += fragment_size;
436
437 fragmentRequests.push_back(fragment);
438 }
439}
440
441void
442LSQ::SplitDataRequest::makeFragmentPackets()
443{
448 Addr base_addr = request.getVaddr();
444 Addr base_addr = request->getVaddr();
449
450 DPRINTFS(MinorMem, (&port), "Making packets for request: %s\n", *inst);
451
452 for (unsigned int fragment_index = 0; fragment_index < numFragments;
453 fragment_index++)
454 {
455 RequestPtr fragment = fragmentRequests[fragment_index];
456

--- 14 unchanged lines hidden (view full) ---

471 request_data = new uint8_t[fragment_size];
472 std::memcpy(request_data, data + (fragment_addr - base_addr),
473 fragment_size);
474 }
475
476 assert(fragment->hasPaddr());
477
478 PacketPtr fragment_packet =
445
446 DPRINTFS(MinorMem, (&port), "Making packets for request: %s\n", *inst);
447
448 for (unsigned int fragment_index = 0; fragment_index < numFragments;
449 fragment_index++)
450 {
451 RequestPtr fragment = fragmentRequests[fragment_index];
452

--- 14 unchanged lines hidden (view full) ---

467 request_data = new uint8_t[fragment_size];
468 std::memcpy(request_data, data + (fragment_addr - base_addr),
469 fragment_size);
470 }
471
472 assert(fragment->hasPaddr());
473
474 PacketPtr fragment_packet =
479 makePacketForRequest(*fragment, isLoad, this, request_data);
475 makePacketForRequest(fragment, isLoad, this, request_data);
480
481 fragmentPackets.push_back(fragment_packet);
482 /* Accumulate flags in parent request */
476
477 fragmentPackets.push_back(fragment_packet);
478 /* Accumulate flags in parent request */
483 request.setFlags(fragment->getFlags());
479 request->setFlags(fragment->getFlags());
484 }
485
486 /* Might as well make the overall/response packet here */
487 /* Get the physical address for the whole request/packet from the first
488 * fragment */
480 }
481
482 /* Might as well make the overall/response packet here */
483 /* Get the physical address for the whole request/packet from the first
484 * fragment */
489 request.setPaddr(fragmentRequests[0]->getPaddr());
485 request->setPaddr(fragmentRequests[0]->getPaddr());
490 makePacket();
491}
492
493void
494LSQ::SplitDataRequest::startAddrTranslation()
495{
496 setState(LSQ::LSQRequest::InTranslation);
497

--- 32 unchanged lines hidden (view full) ---

530void
531LSQ::SplitDataRequest::retireResponse(PacketPtr response)
532{
533 assert(numRetiredFragments < numFragments);
534
535 DPRINTFS(MinorMem, (&port), "Retiring fragment addr: 0x%x size: %d"
536 " offset: 0x%x (retired fragment num: %d) %s\n",
537 response->req->getVaddr(), response->req->getSize(),
486 makePacket();
487}
488
489void
490LSQ::SplitDataRequest::startAddrTranslation()
491{
492 setState(LSQ::LSQRequest::InTranslation);
493

--- 32 unchanged lines hidden (view full) ---

526void
527LSQ::SplitDataRequest::retireResponse(PacketPtr response)
528{
529 assert(numRetiredFragments < numFragments);
530
531 DPRINTFS(MinorMem, (&port), "Retiring fragment addr: 0x%x size: %d"
532 " offset: 0x%x (retired fragment num: %d) %s\n",
533 response->req->getVaddr(), response->req->getSize(),
538 request.getVaddr() - response->req->getVaddr(),
534 request->getVaddr() - response->req->getVaddr(),
539 numRetiredFragments,
540 (fault == NoFault ? "" : fault->name()));
541
542 numRetiredFragments++;
543
544 if (skipped) {
545 /* Skip because we already knew the request had faulted or been
546 * skipped */

--- 4 unchanged lines hidden (view full) ---

551 setSkipped();
552 packet->copyError(response);
553 } else {
554 if (isLoad) {
555 if (!data) {
556 /* For a split transfer, a Packet must be constructed
557 * to contain all returning data. This is that packet's
558 * data */
535 numRetiredFragments,
536 (fault == NoFault ? "" : fault->name()));
537
538 numRetiredFragments++;
539
540 if (skipped) {
541 /* Skip because we already knew the request had faulted or been
542 * skipped */

--- 4 unchanged lines hidden (view full) ---

547 setSkipped();
548 packet->copyError(response);
549 } else {
550 if (isLoad) {
551 if (!data) {
552 /* For a split transfer, a Packet must be constructed
553 * to contain all returning data. This is that packet's
554 * data */
559 data = new uint8_t[request.getSize()];
555 data = new uint8_t[request->getSize()];
560 }
561
562 /* Populate the portion of the overall response data represented
563 * by the response fragment */
564 std::memcpy(
556 }
557
558 /* Populate the portion of the overall response data represented
559 * by the response fragment */
560 std::memcpy(
565 data + (response->req->getVaddr() - request.getVaddr()),
561 data + (response->req->getVaddr() - request->getVaddr()),
566 response->getConstPtr<uint8_t>(),
567 response->req->getSize());
568 }
569 }
570
571 /* Complete early if we're skipping are no more in-flight accesses */
572 if (skipped && !hasPacketsInMemSystem()) {
573 DPRINTFS(MinorMem, (&port), "Completed skipped burst\n");

--- 6 unchanged lines hidden (view full) ---

580 setState(Complete);
581
582 if (!skipped && isComplete()) {
583 DPRINTFS(MinorMem, (&port), "Completed burst %d\n", packet != NULL);
584
585 DPRINTFS(MinorMem, (&port), "Retired packet isRead: %d isWrite: %d"
586 " needsResponse: %d packetSize: %s requestSize: %s responseSize:"
587 " %s\n", packet->isRead(), packet->isWrite(),
562 response->getConstPtr<uint8_t>(),
563 response->req->getSize());
564 }
565 }
566
567 /* Complete early if we're skipping are no more in-flight accesses */
568 if (skipped && !hasPacketsInMemSystem()) {
569 DPRINTFS(MinorMem, (&port), "Completed skipped burst\n");

--- 6 unchanged lines hidden (view full) ---

576 setState(Complete);
577
578 if (!skipped && isComplete()) {
579 DPRINTFS(MinorMem, (&port), "Completed burst %d\n", packet != NULL);
580
581 DPRINTFS(MinorMem, (&port), "Retired packet isRead: %d isWrite: %d"
582 " needsResponse: %d packetSize: %s requestSize: %s responseSize:"
583 " %s\n", packet->isRead(), packet->isWrite(),
588 packet->needsResponse(), packet->getSize(), request.getSize(),
584 packet->needsResponse(), packet->getSize(), request->getSize(),
589 response->getSize());
590
591 /* A request can become complete by several paths, this is a sanity
592 * check to make sure the packet's data is created */
593 if (!data) {
585 response->getSize());
586
587 /* A request can become complete by several paths, this is a sanity
588 * check to make sure the packet's data is created */
589 if (!data) {
594 data = new uint8_t[request.getSize()];
590 data = new uint8_t[request->getSize()];
595 }
596
597 if (isLoad) {
598 DPRINTFS(MinorMem, (&port), "Copying read data\n");
591 }
592
593 if (isLoad) {
594 DPRINTFS(MinorMem, (&port), "Copying read data\n");
599 std::memcpy(packet->getPtr<uint8_t>(), data, request.getSize());
595 std::memcpy(packet->getPtr<uint8_t>(), data, request->getSize());
600 }
601 packet->makeResponse();
602 }
603
604 /* Packets are all deallocated together in ~SplitLSQRequest */
605}
606
607void

--- 78 unchanged lines hidden (view full) ---

686 slot->inst->id.threadId == request->inst->id.threadId &&
687 !slot->packet->req->isCacheMaintenance()) {
688 AddrRangeCoverage coverage = slot->containsAddrRangeOf(request);
689
690 if (coverage != NoAddrRangeCoverage) {
691 DPRINTF(MinorMem, "Forwarding: slot: %d result: %s thisAddr:"
692 " 0x%x thisSize: %d slotAddr: 0x%x slotSize: %d\n",
693 slot_index, coverage,
596 }
597 packet->makeResponse();
598 }
599
600 /* Packets are all deallocated together in ~SplitLSQRequest */
601}
602
603void

--- 78 unchanged lines hidden (view full) ---

682 slot->inst->id.threadId == request->inst->id.threadId &&
683 !slot->packet->req->isCacheMaintenance()) {
684 AddrRangeCoverage coverage = slot->containsAddrRangeOf(request);
685
686 if (coverage != NoAddrRangeCoverage) {
687 DPRINTF(MinorMem, "Forwarding: slot: %d result: %s thisAddr:"
688 " 0x%x thisSize: %d slotAddr: 0x%x slotSize: %d\n",
689 slot_index, coverage,
694 request->request.getPaddr(), request->request.getSize(),
695 slot->request.getPaddr(), slot->request.getSize());
690 request->request->getPaddr(), request->request->getSize(),
691 slot->request->getPaddr(), slot->request->getSize());
696
697 found_slot = slot_index;
698 ret = coverage;
699 }
700 }
701
702 i++;
703 slot_index--;

--- 11 unchanged lines hidden (view full) ---

715 assert(load->packet);
716 assert(load->isLoad);
717
718 LSQRequestPtr store = slots[slot_number];
719
720 assert(store->packet);
721 assert(store->containsAddrRangeOf(load) == FullAddrRangeCoverage);
722
692
693 found_slot = slot_index;
694 ret = coverage;
695 }
696 }
697
698 i++;
699 slot_index--;

--- 11 unchanged lines hidden (view full) ---

711 assert(load->packet);
712 assert(load->isLoad);
713
714 LSQRequestPtr store = slots[slot_number];
715
716 assert(store->packet);
717 assert(store->containsAddrRangeOf(load) == FullAddrRangeCoverage);
718
723 Addr load_addr = load->request.getPaddr();
724 Addr store_addr = store->request.getPaddr();
719 Addr load_addr = load->request->getPaddr();
720 Addr store_addr = store->request->getPaddr();
725 Addr addr_offset = load_addr - store_addr;
726
721 Addr addr_offset = load_addr - store_addr;
722
727 unsigned int load_size = load->request.getSize();
723 unsigned int load_size = load->request->getSize();
728
729 DPRINTF(MinorMem, "Forwarding %d bytes for addr: 0x%x from store buffer"
730 " slot: %d addr: 0x%x addressOffset: 0x%x\n",
731 load_size, load_addr, slot_number,
732 store_addr, addr_offset);
733
734 void *load_packet_data = load->packet->getPtr<void>();
735 void *store_packet_data = store->packet->getPtr<uint8_t>() + addr_offset;

--- 191 unchanged lines hidden (view full) ---

927 " queue\n");
928 request->setState(LSQRequest::Complete);
929 request->setSkipped();
930 moveFromRequestsToTransfers(request);
931 return;
932 }
933
934 bool is_load = request->isLoad;
724
725 DPRINTF(MinorMem, "Forwarding %d bytes for addr: 0x%x from store buffer"
726 " slot: %d addr: 0x%x addressOffset: 0x%x\n",
727 load_size, load_addr, slot_number,
728 store_addr, addr_offset);
729
730 void *load_packet_data = load->packet->getPtr<void>();
731 void *store_packet_data = store->packet->getPtr<uint8_t>() + addr_offset;

--- 191 unchanged lines hidden (view full) ---

923 " queue\n");
924 request->setState(LSQRequest::Complete);
925 request->setSkipped();
926 moveFromRequestsToTransfers(request);
927 return;
928 }
929
930 bool is_load = request->isLoad;
935 bool is_llsc = request->request.isLLSC();
936 bool is_swap = request->request.isSwap();
937 bool bufferable = !(request->request.isStrictlyOrdered() ||
931 bool is_llsc = request->request->isLLSC();
932 bool is_swap = request->request->isSwap();
933 bool bufferable = !(request->request->isStrictlyOrdered() ||
938 is_llsc || is_swap);
939
940 if (is_load) {
941 if (numStoresInTransfers != 0) {
942 DPRINTF(MinorMem, "Load request with stores still in transfers"
943 " queue, stalling\n");
944 return;
945 }
946 } else {
947 /* Store. Can it be sent to the store buffer? */
934 is_llsc || is_swap);
935
936 if (is_load) {
937 if (numStoresInTransfers != 0) {
938 DPRINTF(MinorMem, "Load request with stores still in transfers"
939 " queue, stalling\n");
940 return;
941 }
942 } else {
943 /* Store. Can it be sent to the store buffer? */
948 if (bufferable && !request->request.isMmappedIpr()) {
944 if (bufferable && !request->request->isMmappedIpr()) {
949 request->setState(LSQRequest::StoreToStoreBuffer);
950 moveFromRequestsToTransfers(request);
951 DPRINTF(MinorMem, "Moving store into transfers queue\n");
952 return;
953 }
954 }
955
956 /* Check if this is the head instruction (and so must be executable as

--- 61 unchanged lines hidden (view full) ---

1018
1019 SimpleThread &thread = *cpu.threads[request->inst->id.threadId];
1020
1021 TheISA::PCState old_pc = thread.pcState();
1022 ExecContext context(cpu, thread, execute, request->inst);
1023
1024 /* Handle LLSC requests and tests */
1025 if (is_load) {
945 request->setState(LSQRequest::StoreToStoreBuffer);
946 moveFromRequestsToTransfers(request);
947 DPRINTF(MinorMem, "Moving store into transfers queue\n");
948 return;
949 }
950 }
951
952 /* Check if this is the head instruction (and so must be executable as

--- 61 unchanged lines hidden (view full) ---

1014
1015 SimpleThread &thread = *cpu.threads[request->inst->id.threadId];
1016
1017 TheISA::PCState old_pc = thread.pcState();
1018 ExecContext context(cpu, thread, execute, request->inst);
1019
1020 /* Handle LLSC requests and tests */
1021 if (is_load) {
1026 TheISA::handleLockedRead(&context, &request->request);
1022 TheISA::handleLockedRead(&context, request->request);
1027 } else {
1028 do_access = TheISA::handleLockedWrite(&context,
1023 } else {
1024 do_access = TheISA::handleLockedWrite(&context,
1029 &request->request, cacheBlockMask);
1025 request->request, cacheBlockMask);
1030
1031 if (!do_access) {
1032 DPRINTF(MinorMem, "Not perfoming a memory "
1033 "access for store conditional\n");
1034 }
1035 }
1036 thread.pcState(old_pc);
1037 }

--- 34 unchanged lines hidden (view full) ---

1072
1073 DPRINTF(MinorMem, "Trying to send request: %s addr: 0x%x\n",
1074 *(request->inst), packet->req->getVaddr());
1075
1076 /* The sender state of the packet *must* be an LSQRequest
1077 * so the response can be correctly handled */
1078 assert(packet->findNextSenderState<LSQRequest>());
1079
1026
1027 if (!do_access) {
1028 DPRINTF(MinorMem, "Not perfoming a memory "
1029 "access for store conditional\n");
1030 }
1031 }
1032 thread.pcState(old_pc);
1033 }

--- 34 unchanged lines hidden (view full) ---

1068
1069 DPRINTF(MinorMem, "Trying to send request: %s addr: 0x%x\n",
1070 *(request->inst), packet->req->getVaddr());
1071
1072 /* The sender state of the packet *must* be an LSQRequest
1073 * so the response can be correctly handled */
1074 assert(packet->findNextSenderState<LSQRequest>());
1075
1080 if (request->request.isMmappedIpr()) {
1076 if (request->request->isMmappedIpr()) {
1081 ThreadContext *thread =
1082 cpu.getContext(cpu.contextToThread(
1077 ThreadContext *thread =
1078 cpu.getContext(cpu.contextToThread(
1083 request->request.contextId()));
1079 request->request->contextId()));
1084
1085 if (request->isLoad) {
1086 DPRINTF(MinorMem, "IPR read inst: %s\n", *(request->inst));
1087 TheISA::handleIprRead(thread, packet);
1088 } else {
1089 DPRINTF(MinorMem, "IPR write inst: %s\n", *(request->inst));
1090 TheISA::handleIprWrite(thread, packet);
1091 }

--- 419 unchanged lines hidden (view full) ---

1511 request = new SingleDataRequest(
1512 *this, inst, isLoad, request_data, res);
1513 }
1514
1515 if (inst->traceData)
1516 inst->traceData->setMem(addr, size, flags);
1517
1518 int cid = cpu.threads[inst->id.threadId]->getTC()->contextId();
1080
1081 if (request->isLoad) {
1082 DPRINTF(MinorMem, "IPR read inst: %s\n", *(request->inst));
1083 TheISA::handleIprRead(thread, packet);
1084 } else {
1085 DPRINTF(MinorMem, "IPR write inst: %s\n", *(request->inst));
1086 TheISA::handleIprWrite(thread, packet);
1087 }

--- 419 unchanged lines hidden (view full) ---

1507 request = new SingleDataRequest(
1508 *this, inst, isLoad, request_data, res);
1509 }
1510
1511 if (inst->traceData)
1512 inst->traceData->setMem(addr, size, flags);
1513
1514 int cid = cpu.threads[inst->id.threadId]->getTC()->contextId();
1519 request->request.setContext(cid);
1520 request->request.setVirt(0 /* asid */,
1515 request->request->setContext(cid);
1516 request->request->setVirt(0 /* asid */,
1521 addr, size, flags, cpu.dataMasterId(),
1522 /* I've no idea why we need the PC, but give it */
1523 inst->pc.instAddr());
1524
1525 requests.push(request);
1526 request->startAddrTranslation();
1527}
1528

--- 23 unchanged lines hidden (view full) ---

1552 numSlots(store_buffer_size),
1553 storeLimitPerCycle(store_limit_per_cycle),
1554 slots(),
1555 numUnissuedAccesses(0)
1556{
1557}
1558
1559PacketPtr
1517 addr, size, flags, cpu.dataMasterId(),
1518 /* I've no idea why we need the PC, but give it */
1519 inst->pc.instAddr());
1520
1521 requests.push(request);
1522 request->startAddrTranslation();
1523}
1524

--- 23 unchanged lines hidden (view full) ---

1548 numSlots(store_buffer_size),
1549 storeLimitPerCycle(store_limit_per_cycle),
1550 slots(),
1551 numUnissuedAccesses(0)
1552{
1553}
1554
1555PacketPtr
1560makePacketForRequest(Request &request, bool isLoad,
1556makePacketForRequest(const RequestPtr &request, bool isLoad,
1561 Packet::SenderState *sender_state, PacketDataPtr data)
1562{
1557 Packet::SenderState *sender_state, PacketDataPtr data)
1558{
1563 PacketPtr ret = isLoad ? Packet::createRead(&request)
1564 : Packet::createWrite(&request);
1559 PacketPtr ret = isLoad ? Packet::createRead(request)
1560 : Packet::createWrite(request);
1565
1566 if (sender_state)
1567 ret->pushSenderState(sender_state);
1568
1569 if (isLoad) {
1570 ret->allocate();
1561
1562 if (sender_state)
1563 ret->pushSenderState(sender_state);
1564
1565 if (isLoad) {
1566 ret->allocate();
1571 } else if (!request.isCacheMaintenance()) {
1567 } else if (!request->isCacheMaintenance()) {
1572 // CMOs are treated as stores but they don't have data. All
1573 // stores otherwise need to allocate for data.
1574 ret->dataDynamic(data);
1575 }
1576
1577 return ret;
1578}
1579

--- 93 unchanged lines hidden ---
1568 // CMOs are treated as stores but they don't have data. All
1569 // stores otherwise need to allocate for data.
1570 ret->dataDynamic(data);
1571 }
1572
1573 return ret;
1574}
1575

--- 93 unchanged lines hidden ---