highmem.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /* highmem.c: arch-specific highmem stuff
  2. *
  3. * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
  4. * Written by David Howells (dhowells@redhat.com)
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. #include <linux/highmem.h>
  12. #include <linux/module.h>
  13. void *kmap(struct page *page)
  14. {
  15. might_sleep();
  16. if (!PageHighMem(page))
  17. return page_address(page);
  18. return kmap_high(page);
  19. }
  20. EXPORT_SYMBOL(kmap);
  21. void kunmap(struct page *page)
  22. {
  23. if (in_interrupt())
  24. BUG();
  25. if (!PageHighMem(page))
  26. return;
  27. kunmap_high(page);
  28. }
  29. EXPORT_SYMBOL(kunmap);
  30. struct page *kmap_atomic_to_page(void *ptr)
  31. {
  32. return virt_to_page(ptr);
  33. }
  34. void *__kmap_atomic(struct page *page)
  35. {
  36. unsigned long paddr;
  37. int type;
  38. pagefault_disable();
  39. type = kmap_atomic_idx_push();
  40. paddr = page_to_phys(page);
  41. switch (type) {
  42. /*
  43. * The first 4 primary maps are reserved for architecture code
  44. */
  45. case 0: return __kmap_atomic_primary(4, paddr, 6);
  46. case 1: return __kmap_atomic_primary(5, paddr, 7);
  47. case 2: return __kmap_atomic_primary(6, paddr, 8);
  48. case 3: return __kmap_atomic_primary(7, paddr, 9);
  49. case 4: return __kmap_atomic_primary(8, paddr, 10);
  50. case 5 ... 5 + NR_TLB_LINES - 1:
  51. return __kmap_atomic_secondary(type - 5, paddr);
  52. default:
  53. BUG();
  54. return NULL;
  55. }
  56. }
  57. EXPORT_SYMBOL(__kmap_atomic);
  58. void __kunmap_atomic(void *kvaddr)
  59. {
  60. int type = kmap_atomic_idx();
  61. switch (type) {
  62. case 0: __kunmap_atomic_primary(4, 6); break;
  63. case 1: __kunmap_atomic_primary(5, 7); break;
  64. case 2: __kunmap_atomic_primary(6, 8); break;
  65. case 3: __kunmap_atomic_primary(7, 9); break;
  66. case 4: __kunmap_atomic_primary(8, 10); break;
  67. case 5 ... 5 + NR_TLB_LINES - 1:
  68. __kunmap_atomic_secondary(type - 5, kvaddr);
  69. break;
  70. default:
  71. BUG();
  72. }
  73. kmap_atomic_idx_pop();
  74. pagefault_enable();
  75. }
  76. EXPORT_SYMBOL(__kunmap_atomic);