highmem.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. preempt_disable();
  39. pagefault_disable();
  40. type = kmap_atomic_idx_push();
  41. paddr = page_to_phys(page);
  42. switch (type) {
  43. /*
  44. * The first 4 primary maps are reserved for architecture code
  45. */
  46. case 0: return __kmap_atomic_primary(0, paddr, 6);
  47. case 1: return __kmap_atomic_primary(0, paddr, 7);
  48. case 2: return __kmap_atomic_primary(0, paddr, 8);
  49. case 3: return __kmap_atomic_primary(0, paddr, 9);
  50. case 4: return __kmap_atomic_primary(0, paddr, 10);
  51. case 5 ... 5 + NR_TLB_LINES - 1:
  52. return __kmap_atomic_secondary(type - 5, paddr);
  53. default:
  54. BUG();
  55. return NULL;
  56. }
  57. }
  58. EXPORT_SYMBOL(kmap_atomic);
  59. void __kunmap_atomic(void *kvaddr)
  60. {
  61. int type = kmap_atomic_idx();
  62. switch (type) {
  63. case 0: __kunmap_atomic_primary(0, 6); break;
  64. case 1: __kunmap_atomic_primary(0, 7); break;
  65. case 2: __kunmap_atomic_primary(0, 8); break;
  66. case 3: __kunmap_atomic_primary(0, 9); break;
  67. case 4: __kunmap_atomic_primary(0, 10); break;
  68. case 5 ... 5 + NR_TLB_LINES - 1:
  69. __kunmap_atomic_secondary(type - 5, kvaddr);
  70. break;
  71. default:
  72. BUG();
  73. }
  74. kmap_atomic_idx_pop();
  75. pagefault_enable();
  76. preempt_enable();
  77. }
  78. EXPORT_SYMBOL(__kunmap_atomic);