Deleted Added
sdiff udiff text old ( 5897:29cecf4fe602 ) new ( 5904:5c61233cbd53 )
full compact
1/*
2 * Copyright (c) 2007 The Hewlett-Packard Development Company
3 * All rights reserved.
4 *
5 * Redistribution and use of this software in source and binary forms,
6 * with or without modification, are permitted provided that the
7 * following conditions are met:
8 *

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

96 pte = read->get<uint32_t>();
97 VAddr vaddr = entry.vaddr;
98 bool uncacheable = pte.pcd;
99 Addr nextRead = 0;
100 bool doWrite = false;
101 bool badNX = pte.nx && (!tlb->allowNX() || !enableNX);
102 switch(state) {
103 case LongPML4:
104 nextRead = ((uint64_t)pte & (mask(40) << 12)) + vaddr.longl3 * size;
105 doWrite = !pte.a;
106 pte.a = 1;
107 entry.writable = pte.w;
108 entry.user = pte.u;
109 if (badNX || !pte.p) {
110 stop();
111 return pageFault(pte.p);
112 }
113 entry.noExec = pte.nx;
114 nextState = LongPDP;
115 break;
116 case LongPDP:
117 nextRead = ((uint64_t)pte & (mask(40) << 12)) + vaddr.longl2 * size;
118 doWrite = !pte.a;
119 pte.a = 1;
120 entry.writable = entry.writable && pte.w;
121 entry.user = entry.user && pte.u;
122 if (badNX || !pte.p) {
123 stop();
124 return pageFault(pte.p);
125 }
126 nextState = LongPD;
127 break;
128 case LongPD:
129 doWrite = !pte.a;
130 pte.a = 1;
131 entry.writable = entry.writable && pte.w;
132 entry.user = entry.user && pte.u;
133 if (badNX || !pte.p) {
134 stop();
135 return pageFault(pte.p);
136 }

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

149 entry.global = pte.g;
150 entry.patBit = bits(pte, 12);
151 entry.vaddr = entry.vaddr & ~((2 * (1 << 20)) - 1);
152 tlb->insert(entry.vaddr, entry);
153 stop();
154 return NoFault;
155 }
156 case LongPTE:
157 doWrite = !pte.a;
158 pte.a = 1;
159 entry.writable = entry.writable && pte.w;
160 entry.user = entry.user && pte.u;
161 if (badNX || !pte.p) {
162 stop();
163 return pageFault(pte.p);
164 }
165 entry.paddr = (uint64_t)pte & (mask(40) << 12);
166 entry.uncacheable = uncacheable;
167 entry.global = pte.g;
168 entry.patBit = bits(pte, 12);
169 entry.vaddr = entry.vaddr & ~((4 * (1 << 10)) - 1);
170 tlb->insert(entry.vaddr, entry);
171 stop();
172 return NoFault;
173 case PAEPDP:
174 nextRead = ((uint64_t)pte & (mask(40) << 12)) + vaddr.pael2 * size;
175 if (!pte.p) {
176 stop();
177 return pageFault(pte.p);
178 }
179 nextState = PAEPD;
180 break;
181 case PAEPD:
182 doWrite = !pte.a;
183 pte.a = 1;
184 entry.writable = pte.w;
185 entry.user = pte.u;
186 if (badNX || !pte.p) {
187 stop();
188 return pageFault(pte.p);
189 }

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

201 entry.global = pte.g;
202 entry.patBit = bits(pte, 12);
203 entry.vaddr = entry.vaddr & ~((2 * (1 << 20)) - 1);
204 tlb->insert(entry.vaddr, entry);
205 stop();
206 return NoFault;
207 }
208 case PAEPTE:
209 doWrite = !pte.a;
210 pte.a = 1;
211 entry.writable = entry.writable && pte.w;
212 entry.user = entry.user && pte.u;
213 if (badNX || !pte.p) {
214 stop();
215 return pageFault(pte.p);
216 }
217 entry.paddr = (uint64_t)pte & (mask(40) << 12);
218 entry.uncacheable = uncacheable;
219 entry.global = pte.g;
220 entry.patBit = bits(pte, 7);
221 entry.vaddr = entry.vaddr & ~((4 * (1 << 10)) - 1);
222 tlb->insert(entry.vaddr, entry);
223 stop();
224 return NoFault;
225 case PSEPD:
226 doWrite = !pte.a;
227 pte.a = 1;
228 entry.writable = pte.w;
229 entry.user = pte.u;
230 if (!pte.p) {
231 stop();
232 return pageFault(pte.p);
233 }

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

246 entry.global = pte.g;
247 entry.patBit = bits(pte, 12);
248 entry.vaddr = entry.vaddr & ~((4 * (1 << 20)) - 1);
249 tlb->insert(entry.vaddr, entry);
250 stop();
251 return NoFault;
252 }
253 case PD:
254 doWrite = !pte.a;
255 pte.a = 1;
256 entry.writable = pte.w;
257 entry.user = pte.u;
258 if (!pte.p) {
259 stop();
260 return pageFault(pte.p);
261 }
262 // 4 KB page
263 entry.size = 4 * (1 << 10);
264 nextRead = ((uint64_t)pte & (mask(20) << 12)) + vaddr.norml2 * size;
265 nextState = PTE;
266 break;
267 case PTE:
268 doWrite = !pte.a;
269 pte.a = 1;
270 entry.writable = pte.w;
271 entry.user = pte.u;
272 if (!pte.p) {
273 stop();
274 return pageFault(pte.p);
275 }

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

536 return &port;
537 else
538 panic("No page table walker port named %s!\n", if_name);
539}
540
541Fault
542Walker::pageFault(bool present)
543{
544 HandyM5Reg m5reg = tc->readMiscRegNoEffect(MISCREG_M5_REG);
545 return new PageFault(entry.vaddr, present, write,
546 m5reg.cpl == 3, false, execute && enableNX);
547}
548
549}
550
551X86ISA::Walker *
552X86PagetableWalkerParams::create()
553{
554 return new X86ISA::Walker(this);
555}