highmem.c 1.9 KB

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