diff options
Diffstat (limited to 'include/asm-s390/pgtable.h')
-rw-r--r-- | include/asm-s390/pgtable.h | 69 |
1 files changed, 35 insertions, 34 deletions
diff --git a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h index df94f89038cc..859b5e969826 100644 --- a/include/asm-s390/pgtable.h +++ b/include/asm-s390/pgtable.h | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/threads.h> | 36 | #include <linux/threads.h> |
37 | 37 | ||
38 | struct vm_area_struct; /* forward declaration (include/linux/mm.h) */ | 38 | struct vm_area_struct; /* forward declaration (include/linux/mm.h) */ |
39 | struct mm_struct; | ||
39 | 40 | ||
40 | extern pgd_t swapper_pg_dir[] __attribute__ ((aligned (4096))); | 41 | extern pgd_t swapper_pg_dir[] __attribute__ ((aligned (4096))); |
41 | extern void paging_init(void); | 42 | extern void paging_init(void); |
@@ -318,7 +319,7 @@ extern char empty_zero_page[PAGE_SIZE]; | |||
318 | * within a page table are directly modified. Thus, the following | 319 | * within a page table are directly modified. Thus, the following |
319 | * hook is made available. | 320 | * hook is made available. |
320 | */ | 321 | */ |
321 | extern inline void set_pte(pte_t *pteptr, pte_t pteval) | 322 | static inline void set_pte(pte_t *pteptr, pte_t pteval) |
322 | { | 323 | { |
323 | *pteptr = pteval; | 324 | *pteptr = pteval; |
324 | } | 325 | } |
@@ -329,63 +330,63 @@ extern inline void set_pte(pte_t *pteptr, pte_t pteval) | |||
329 | */ | 330 | */ |
330 | #ifndef __s390x__ | 331 | #ifndef __s390x__ |
331 | 332 | ||
332 | extern inline int pgd_present(pgd_t pgd) { return 1; } | 333 | static inline int pgd_present(pgd_t pgd) { return 1; } |
333 | extern inline int pgd_none(pgd_t pgd) { return 0; } | 334 | static inline int pgd_none(pgd_t pgd) { return 0; } |
334 | extern inline int pgd_bad(pgd_t pgd) { return 0; } | 335 | static inline int pgd_bad(pgd_t pgd) { return 0; } |
335 | 336 | ||
336 | extern inline int pmd_present(pmd_t pmd) { return pmd_val(pmd) & _SEG_PRESENT; } | 337 | static inline int pmd_present(pmd_t pmd) { return pmd_val(pmd) & _SEG_PRESENT; } |
337 | extern inline int pmd_none(pmd_t pmd) { return pmd_val(pmd) & _PAGE_TABLE_INV; } | 338 | static inline int pmd_none(pmd_t pmd) { return pmd_val(pmd) & _PAGE_TABLE_INV; } |
338 | extern inline int pmd_bad(pmd_t pmd) | 339 | static inline int pmd_bad(pmd_t pmd) |
339 | { | 340 | { |
340 | return (pmd_val(pmd) & (~PAGE_MASK & ~_PAGE_TABLE_INV)) != _PAGE_TABLE; | 341 | return (pmd_val(pmd) & (~PAGE_MASK & ~_PAGE_TABLE_INV)) != _PAGE_TABLE; |
341 | } | 342 | } |
342 | 343 | ||
343 | #else /* __s390x__ */ | 344 | #else /* __s390x__ */ |
344 | 345 | ||
345 | extern inline int pgd_present(pgd_t pgd) | 346 | static inline int pgd_present(pgd_t pgd) |
346 | { | 347 | { |
347 | return (pgd_val(pgd) & ~PAGE_MASK) == _PGD_ENTRY; | 348 | return (pgd_val(pgd) & ~PAGE_MASK) == _PGD_ENTRY; |
348 | } | 349 | } |
349 | 350 | ||
350 | extern inline int pgd_none(pgd_t pgd) | 351 | static inline int pgd_none(pgd_t pgd) |
351 | { | 352 | { |
352 | return pgd_val(pgd) & _PGD_ENTRY_INV; | 353 | return pgd_val(pgd) & _PGD_ENTRY_INV; |
353 | } | 354 | } |
354 | 355 | ||
355 | extern inline int pgd_bad(pgd_t pgd) | 356 | static inline int pgd_bad(pgd_t pgd) |
356 | { | 357 | { |
357 | return (pgd_val(pgd) & (~PAGE_MASK & ~_PGD_ENTRY_INV)) != _PGD_ENTRY; | 358 | return (pgd_val(pgd) & (~PAGE_MASK & ~_PGD_ENTRY_INV)) != _PGD_ENTRY; |
358 | } | 359 | } |
359 | 360 | ||
360 | extern inline int pmd_present(pmd_t pmd) | 361 | static inline int pmd_present(pmd_t pmd) |
361 | { | 362 | { |
362 | return (pmd_val(pmd) & ~PAGE_MASK) == _PMD_ENTRY; | 363 | return (pmd_val(pmd) & ~PAGE_MASK) == _PMD_ENTRY; |
363 | } | 364 | } |
364 | 365 | ||
365 | extern inline int pmd_none(pmd_t pmd) | 366 | static inline int pmd_none(pmd_t pmd) |
366 | { | 367 | { |
367 | return pmd_val(pmd) & _PMD_ENTRY_INV; | 368 | return pmd_val(pmd) & _PMD_ENTRY_INV; |
368 | } | 369 | } |
369 | 370 | ||
370 | extern inline int pmd_bad(pmd_t pmd) | 371 | static inline int pmd_bad(pmd_t pmd) |
371 | { | 372 | { |
372 | return (pmd_val(pmd) & (~PAGE_MASK & ~_PMD_ENTRY_INV)) != _PMD_ENTRY; | 373 | return (pmd_val(pmd) & (~PAGE_MASK & ~_PMD_ENTRY_INV)) != _PMD_ENTRY; |
373 | } | 374 | } |
374 | 375 | ||
375 | #endif /* __s390x__ */ | 376 | #endif /* __s390x__ */ |
376 | 377 | ||
377 | extern inline int pte_none(pte_t pte) | 378 | static inline int pte_none(pte_t pte) |
378 | { | 379 | { |
379 | return (pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_EMPTY; | 380 | return (pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_EMPTY; |
380 | } | 381 | } |
381 | 382 | ||
382 | extern inline int pte_present(pte_t pte) | 383 | static inline int pte_present(pte_t pte) |
383 | { | 384 | { |
384 | return !(pte_val(pte) & _PAGE_INVALID) || | 385 | return !(pte_val(pte) & _PAGE_INVALID) || |
385 | (pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_NONE; | 386 | (pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_NONE; |
386 | } | 387 | } |
387 | 388 | ||
388 | extern inline int pte_file(pte_t pte) | 389 | static inline int pte_file(pte_t pte) |
389 | { | 390 | { |
390 | return (pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_FILE; | 391 | return (pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_FILE; |
391 | } | 392 | } |
@@ -396,12 +397,12 @@ extern inline int pte_file(pte_t pte) | |||
396 | * query functions pte_write/pte_dirty/pte_young only work if | 397 | * query functions pte_write/pte_dirty/pte_young only work if |
397 | * pte_present() is true. Undefined behaviour if not.. | 398 | * pte_present() is true. Undefined behaviour if not.. |
398 | */ | 399 | */ |
399 | extern inline int pte_write(pte_t pte) | 400 | static inline int pte_write(pte_t pte) |
400 | { | 401 | { |
401 | return (pte_val(pte) & _PAGE_RO) == 0; | 402 | return (pte_val(pte) & _PAGE_RO) == 0; |
402 | } | 403 | } |
403 | 404 | ||
404 | extern inline int pte_dirty(pte_t pte) | 405 | static inline int pte_dirty(pte_t pte) |
405 | { | 406 | { |
406 | /* A pte is neither clean nor dirty on s/390. The dirty bit | 407 | /* A pte is neither clean nor dirty on s/390. The dirty bit |
407 | * is in the storage key. See page_test_and_clear_dirty for | 408 | * is in the storage key. See page_test_and_clear_dirty for |
@@ -410,7 +411,7 @@ extern inline int pte_dirty(pte_t pte) | |||
410 | return 0; | 411 | return 0; |
411 | } | 412 | } |
412 | 413 | ||
413 | extern inline int pte_young(pte_t pte) | 414 | static inline int pte_young(pte_t pte) |
414 | { | 415 | { |
415 | /* A pte is neither young nor old on s/390. The young bit | 416 | /* A pte is neither young nor old on s/390. The young bit |
416 | * is in the storage key. See page_test_and_clear_young for | 417 | * is in the storage key. See page_test_and_clear_young for |
@@ -419,7 +420,7 @@ extern inline int pte_young(pte_t pte) | |||
419 | return 0; | 420 | return 0; |
420 | } | 421 | } |
421 | 422 | ||
422 | extern inline int pte_read(pte_t pte) | 423 | static inline int pte_read(pte_t pte) |
423 | { | 424 | { |
424 | /* All pages are readable since we don't use the fetch | 425 | /* All pages are readable since we don't use the fetch |
425 | * protection bit in the storage key. | 426 | * protection bit in the storage key. |
@@ -433,9 +434,9 @@ extern inline int pte_read(pte_t pte) | |||
433 | 434 | ||
434 | #ifndef __s390x__ | 435 | #ifndef __s390x__ |
435 | 436 | ||
436 | extern inline void pgd_clear(pgd_t * pgdp) { } | 437 | static inline void pgd_clear(pgd_t * pgdp) { } |
437 | 438 | ||
438 | extern inline void pmd_clear(pmd_t * pmdp) | 439 | static inline void pmd_clear(pmd_t * pmdp) |
439 | { | 440 | { |
440 | pmd_val(pmdp[0]) = _PAGE_TABLE_INV; | 441 | pmd_val(pmdp[0]) = _PAGE_TABLE_INV; |
441 | pmd_val(pmdp[1]) = _PAGE_TABLE_INV; | 442 | pmd_val(pmdp[1]) = _PAGE_TABLE_INV; |
@@ -445,12 +446,12 @@ extern inline void pmd_clear(pmd_t * pmdp) | |||
445 | 446 | ||
446 | #else /* __s390x__ */ | 447 | #else /* __s390x__ */ |
447 | 448 | ||
448 | extern inline void pgd_clear(pgd_t * pgdp) | 449 | static inline void pgd_clear(pgd_t * pgdp) |
449 | { | 450 | { |
450 | pgd_val(*pgdp) = _PGD_ENTRY_INV | _PGD_ENTRY; | 451 | pgd_val(*pgdp) = _PGD_ENTRY_INV | _PGD_ENTRY; |
451 | } | 452 | } |
452 | 453 | ||
453 | extern inline void pmd_clear(pmd_t * pmdp) | 454 | static inline void pmd_clear(pmd_t * pmdp) |
454 | { | 455 | { |
455 | pmd_val(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY; | 456 | pmd_val(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY; |
456 | pmd_val1(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY; | 457 | pmd_val1(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY; |
@@ -458,7 +459,7 @@ extern inline void pmd_clear(pmd_t * pmdp) | |||
458 | 459 | ||
459 | #endif /* __s390x__ */ | 460 | #endif /* __s390x__ */ |
460 | 461 | ||
461 | extern inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) | 462 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) |
462 | { | 463 | { |
463 | pte_val(*ptep) = _PAGE_INVALID_EMPTY; | 464 | pte_val(*ptep) = _PAGE_INVALID_EMPTY; |
464 | } | 465 | } |
@@ -467,14 +468,14 @@ extern inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *pt | |||
467 | * The following pte modification functions only work if | 468 | * The following pte modification functions only work if |
468 | * pte_present() is true. Undefined behaviour if not.. | 469 | * pte_present() is true. Undefined behaviour if not.. |
469 | */ | 470 | */ |
470 | extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | 471 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) |
471 | { | 472 | { |
472 | pte_val(pte) &= PAGE_MASK; | 473 | pte_val(pte) &= PAGE_MASK; |
473 | pte_val(pte) |= pgprot_val(newprot); | 474 | pte_val(pte) |= pgprot_val(newprot); |
474 | return pte; | 475 | return pte; |
475 | } | 476 | } |
476 | 477 | ||
477 | extern inline pte_t pte_wrprotect(pte_t pte) | 478 | static inline pte_t pte_wrprotect(pte_t pte) |
478 | { | 479 | { |
479 | /* Do not clobber _PAGE_INVALID_NONE pages! */ | 480 | /* Do not clobber _PAGE_INVALID_NONE pages! */ |
480 | if (!(pte_val(pte) & _PAGE_INVALID)) | 481 | if (!(pte_val(pte) & _PAGE_INVALID)) |
@@ -482,13 +483,13 @@ extern inline pte_t pte_wrprotect(pte_t pte) | |||
482 | return pte; | 483 | return pte; |
483 | } | 484 | } |
484 | 485 | ||
485 | extern inline pte_t pte_mkwrite(pte_t pte) | 486 | static inline pte_t pte_mkwrite(pte_t pte) |
486 | { | 487 | { |
487 | pte_val(pte) &= ~_PAGE_RO; | 488 | pte_val(pte) &= ~_PAGE_RO; |
488 | return pte; | 489 | return pte; |
489 | } | 490 | } |
490 | 491 | ||
491 | extern inline pte_t pte_mkclean(pte_t pte) | 492 | static inline pte_t pte_mkclean(pte_t pte) |
492 | { | 493 | { |
493 | /* The only user of pte_mkclean is the fork() code. | 494 | /* The only user of pte_mkclean is the fork() code. |
494 | We must *not* clear the *physical* page dirty bit | 495 | We must *not* clear the *physical* page dirty bit |
@@ -497,7 +498,7 @@ extern inline pte_t pte_mkclean(pte_t pte) | |||
497 | return pte; | 498 | return pte; |
498 | } | 499 | } |
499 | 500 | ||
500 | extern inline pte_t pte_mkdirty(pte_t pte) | 501 | static inline pte_t pte_mkdirty(pte_t pte) |
501 | { | 502 | { |
502 | /* We do not explicitly set the dirty bit because the | 503 | /* We do not explicitly set the dirty bit because the |
503 | * sske instruction is slow. It is faster to let the | 504 | * sske instruction is slow. It is faster to let the |
@@ -506,7 +507,7 @@ extern inline pte_t pte_mkdirty(pte_t pte) | |||
506 | return pte; | 507 | return pte; |
507 | } | 508 | } |
508 | 509 | ||
509 | extern inline pte_t pte_mkold(pte_t pte) | 510 | static inline pte_t pte_mkold(pte_t pte) |
510 | { | 511 | { |
511 | /* S/390 doesn't keep its dirty/referenced bit in the pte. | 512 | /* S/390 doesn't keep its dirty/referenced bit in the pte. |
512 | * There is no point in clearing the real referenced bit. | 513 | * There is no point in clearing the real referenced bit. |
@@ -514,7 +515,7 @@ extern inline pte_t pte_mkold(pte_t pte) | |||
514 | return pte; | 515 | return pte; |
515 | } | 516 | } |
516 | 517 | ||
517 | extern inline pte_t pte_mkyoung(pte_t pte) | 518 | static inline pte_t pte_mkyoung(pte_t pte) |
518 | { | 519 | { |
519 | /* S/390 doesn't keep its dirty/referenced bit in the pte. | 520 | /* S/390 doesn't keep its dirty/referenced bit in the pte. |
520 | * There is no point in setting the real referenced bit. | 521 | * There is no point in setting the real referenced bit. |
@@ -694,7 +695,7 @@ static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot) | |||
694 | #ifndef __s390x__ | 695 | #ifndef __s390x__ |
695 | 696 | ||
696 | /* Find an entry in the second-level page table.. */ | 697 | /* Find an entry in the second-level page table.. */ |
697 | extern inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address) | 698 | static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address) |
698 | { | 699 | { |
699 | return (pmd_t *) dir; | 700 | return (pmd_t *) dir; |
700 | } | 701 | } |
@@ -757,7 +758,7 @@ extern inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address) | |||
757 | #else | 758 | #else |
758 | #define __SWP_OFFSET_MASK (~0UL >> 11) | 759 | #define __SWP_OFFSET_MASK (~0UL >> 11) |
759 | #endif | 760 | #endif |
760 | extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) | 761 | static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) |
761 | { | 762 | { |
762 | pte_t pte; | 763 | pte_t pte; |
763 | offset &= __SWP_OFFSET_MASK; | 764 | offset &= __SWP_OFFSET_MASK; |