highmem.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  highmem.c: virtual kernel memory mappings for high memory
  3.  *
  4.  *  Provides kernel-static versions of atomic kmap functions originally
  5.  *  found as inlines in include/asm-sparc/highmem.h.  These became
  6.  *  needed as kmap_atomic() and kunmap_atomic() started getting
  7.  *  called from within modules.
  8.  *  -- Tomas Szepe <szepe@pinerecords.com>, September 2002
  9.  */
  10. #include <linux/mm.h>
  11. #include <linux/highmem.h>
  12. #include <asm/pgalloc.h>
  13. /*
  14.  * The use of kmap_atomic/kunmap_atomic is discouraged -- kmap()/kunmap()
  15.  * gives a more generic (and caching) interface.  But kmap_atomic() can
  16.  * be used in IRQ contexts, so in some (very limited) cases we need it.
  17.  */
  18. void *kmap_atomic(struct page *page, enum km_type type)
  19. {
  20. unsigned long idx;
  21. unsigned long vaddr;
  22. if (page < highmem_start_page)
  23. return page_address(page);
  24. idx = type + KM_TYPE_NR * smp_processor_id();
  25. vaddr = fix_kmap_begin + idx * PAGE_SIZE;
  26. /* XXX Fix - Anton */
  27. #if 0
  28. __flush_cache_one(vaddr);
  29. #else
  30. flush_cache_all();
  31. #endif
  32. #if HIGHMEM_DEBUG
  33. if (!pte_none(*(kmap_pte + idx)))
  34. BUG();
  35. #endif
  36. set_pte(kmap_pte + idx, mk_pte(page, kmap_prot));
  37. /* XXX Fix - Anton */
  38. #if 0
  39. __flush_tlb_one(vaddr);
  40. #else
  41. flush_tlb_all();
  42. #endif
  43. return (void *) vaddr;
  44. }
  45. void kunmap_atomic(void *kvaddr, enum km_type type)
  46. {
  47. unsigned long vaddr = (unsigned long) kvaddr;
  48. unsigned long idx = type + KM_TYPE_NR * smp_processor_id();
  49. if (vaddr < fix_kmap_begin) /* FIXME */
  50. return;
  51. if (vaddr != fix_kmap_begin + idx * PAGE_SIZE)
  52. BUG();
  53. /* XXX Fix - Anton */
  54. #if 0
  55. __flush_cache_one(vaddr);
  56. #else
  57. flush_cache_all();
  58. #endif
  59. #ifdef HIGHMEM_DEBUG
  60. /*
  61.  *  Force other mappings to oops if they try to access
  62.  *  this pte without first remapping it.
  63.  */
  64. pte_clear(kmap_pte + idx);
  65. /* XXX Fix - Anton */
  66. #if 0
  67. __flush_tlb_one(vaddr);
  68. #else
  69. flush_tlb_all();
  70. #endif
  71. #endif
  72. }