isa_fake.cc (11793:ef606668d247) isa_fake.cc (13342:1ddb43f47325)
1/*
2 * Copyright (c) 2004-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;

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

64 pkt->getAddr(), pkt->getSize());
65 pkt->setBadAddress();
66 } else {
67 assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
68 DPRINTF(IsaFake, "read va=%#x size=%d\n",
69 pkt->getAddr(), pkt->getSize());
70 switch (pkt->getSize()) {
71 case sizeof(uint64_t):
1/*
2 * Copyright (c) 2004-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;

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

64 pkt->getAddr(), pkt->getSize());
65 pkt->setBadAddress();
66 } else {
67 assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
68 DPRINTF(IsaFake, "read va=%#x size=%d\n",
69 pkt->getAddr(), pkt->getSize());
70 switch (pkt->getSize()) {
71 case sizeof(uint64_t):
72 pkt->set(retData64);
72 pkt->setLE(retData64);
73 break;
74 case sizeof(uint32_t):
73 break;
74 case sizeof(uint32_t):
75 pkt->set(retData32);
75 pkt->setLE(retData32);
76 break;
77 case sizeof(uint16_t):
76 break;
77 case sizeof(uint16_t):
78 pkt->set(retData16);
78 pkt->setLE(retData16);
79 break;
80 case sizeof(uint8_t):
79 break;
80 case sizeof(uint8_t):
81 pkt->set(retData8);
81 pkt->setLE(retData8);
82 break;
83 default:
84 if (params()->fake_mem)
85 std::memset(pkt->getPtr<uint8_t>(), 0, pkt->getSize());
86 else
87 panic("invalid access size! Device being accessed by cache?\n");
88 }
89 }
90 return pioDelay;
91}
92
93Tick
94IsaFake::write(PacketPtr pkt)
95{
96 pkt->makeAtomicResponse();
97 if (params()->warn_access != "") {
98 uint64_t data;
99 switch (pkt->getSize()) {
100 case sizeof(uint64_t):
82 break;
83 default:
84 if (params()->fake_mem)
85 std::memset(pkt->getPtr<uint8_t>(), 0, pkt->getSize());
86 else
87 panic("invalid access size! Device being accessed by cache?\n");
88 }
89 }
90 return pioDelay;
91}
92
93Tick
94IsaFake::write(PacketPtr pkt)
95{
96 pkt->makeAtomicResponse();
97 if (params()->warn_access != "") {
98 uint64_t data;
99 switch (pkt->getSize()) {
100 case sizeof(uint64_t):
101 data = pkt->get();
101 data = pkt->getLE<uint64_t>();
102 break;
103 case sizeof(uint32_t):
102 break;
103 case sizeof(uint32_t):
104 data = pkt->get();
104 data = pkt->getLE<uint32_t>();
105 break;
106 case sizeof(uint16_t):
105 break;
106 case sizeof(uint16_t):
107 data = pkt->get();
107 data = pkt->getLE<uint16_t>();
108 break;
109 case sizeof(uint8_t):
108 break;
109 case sizeof(uint8_t):
110 data = pkt->get();
110 data = pkt->getLE<uint8_t>();
111 break;
112 default:
113 panic("invalid access size: %u\n", pkt->getSize());
114 }
115 warn("Device %s accessed by write to address %#x size=%d data=%#x\n",
116 name(), pkt->getAddr(), pkt->getSize(), data);
117 }
118 if (params()->ret_bad_addr) {
119 DPRINTF(IsaFake, "write to bad address va=%#x size=%d \n",
120 pkt->getAddr(), pkt->getSize());
121 pkt->setBadAddress();
122 } else {
123 DPRINTF(IsaFake, "write - va=%#x size=%d \n",
124 pkt->getAddr(), pkt->getSize());
125
126 if (params()->update_data) {
127 switch (pkt->getSize()) {
128 case sizeof(uint64_t):
111 break;
112 default:
113 panic("invalid access size: %u\n", pkt->getSize());
114 }
115 warn("Device %s accessed by write to address %#x size=%d data=%#x\n",
116 name(), pkt->getAddr(), pkt->getSize(), data);
117 }
118 if (params()->ret_bad_addr) {
119 DPRINTF(IsaFake, "write to bad address va=%#x size=%d \n",
120 pkt->getAddr(), pkt->getSize());
121 pkt->setBadAddress();
122 } else {
123 DPRINTF(IsaFake, "write - va=%#x size=%d \n",
124 pkt->getAddr(), pkt->getSize());
125
126 if (params()->update_data) {
127 switch (pkt->getSize()) {
128 case sizeof(uint64_t):
129 retData64 = pkt->get();
129 retData64 = pkt->getLE<uint64_t>();
130 break;
131 case sizeof(uint32_t):
130 break;
131 case sizeof(uint32_t):
132 retData32 = pkt->get();
132 retData32 = pkt->getLE<uint32_t>();
133 break;
134 case sizeof(uint16_t):
133 break;
134 case sizeof(uint16_t):
135 retData16 = pkt->get();
135 retData16 = pkt->getLE<uint16_t>();
136 break;
137 case sizeof(uint8_t):
136 break;
137 case sizeof(uint8_t):
138 retData8 = pkt->get();
138 retData8 = pkt->getLE<uint8_t>();
139 break;
140 default:
141 panic("invalid access size!\n");
142 }
143 }
144 }
145 return pioDelay;
146}
147
148IsaFake *
149IsaFakeParams::create()
150{
151 return new IsaFake(this);
152}
139 break;
140 default:
141 panic("invalid access size!\n");
142 }
143 }
144 }
145 return pioDelay;
146}
147
148IsaFake *
149IsaFakeParams::create()
150{
151 return new IsaFake(this);
152}