Rev 3392 | Rev 3586 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3392 | Rev 3393 | ||
|---|---|---|---|
| Line 285... | Line 285... | ||
| 285 | panic("unexpected pfrc (%d)\n", pfrc); |
285 | panic("unexpected pfrc (%d)\n", pfrc); |
| 286 | } |
286 | } |
| 287 | } |
287 | } |
| 288 | 288 | ||
| 289 | /* |
289 | /* |
| 290 | * Fail if the page is not writable. |
- | |
| 291 | */ |
- | |
| 292 | if (!pte->w) |
- | |
| 293 | goto fail; |
- | |
| 294 | - | ||
| 295 | /* |
- | |
| 296 | * Read the faulting TLB entry. |
290 | * Read the faulting TLB entry. |
| 297 | */ |
291 | */ |
| 298 | tlbr(); |
292 | tlbr(); |
| 299 | 293 | ||
| 300 | /* |
294 | /* |
| Line 400... | Line 394... | ||
| 400 | 394 | ||
| 401 | /* |
395 | /* |
| 402 | * Check if the mapping exists in page tables. |
396 | * Check if the mapping exists in page tables. |
| 403 | */ |
397 | */ |
| 404 | pte = page_mapping_find(AS, badvaddr); |
398 | pte = page_mapping_find(AS, badvaddr); |
| 405 | if (pte && pte->p) { |
399 | if (pte && pte->p && (pte->w || access != PF_ACCESS_WRITE)) { |
| 406 | /* |
400 | /* |
| 407 | * Mapping found in page tables. |
401 | * Mapping found in page tables. |
| 408 | * Immediately succeed. |
402 | * Immediately succeed. |
| 409 | */ |
403 | */ |
| 410 | return pte; |
404 | return pte; |
| Line 423... | Line 417... | ||
| 423 | * The mapping ought to be in place. |
417 | * The mapping ought to be in place. |
| 424 | */ |
418 | */ |
| 425 | page_table_lock(AS, true); |
419 | page_table_lock(AS, true); |
| 426 | pte = page_mapping_find(AS, badvaddr); |
420 | pte = page_mapping_find(AS, badvaddr); |
| 427 | ASSERT(pte && pte->p); |
421 | ASSERT(pte && pte->p); |
| - | 422 | ASSERT(pte->w || access != PF_ACCESS_WRITE); |
|
| 428 | return pte; |
423 | return pte; |
| 429 | break; |
424 | break; |
| 430 | case AS_PF_DEFER: |
425 | case AS_PF_DEFER: |
| 431 | page_table_lock(AS, true); |
426 | page_table_lock(AS, true); |
| 432 | *pfrc = AS_PF_DEFER; |
427 | *pfrc = AS_PF_DEFER; |