highmem.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _LINUX_HIGHMEM_H
  2. #define _LINUX_HIGHMEM_H
  3. #include <linux/config.h>
  4. #include <asm/pgalloc.h>
  5. #ifdef CONFIG_HIGHMEM
  6. extern struct page *highmem_start_page;
  7. #include <asm/highmem.h>
  8. /* declarations for linux/mm/highmem.c */
  9. unsigned int nr_free_highpages(void);
  10. extern struct buffer_head * create_bounce(int rw, struct buffer_head * bh_orig);
  11. static inline char *bh_kmap(struct buffer_head *bh)
  12. {
  13. return kmap(bh->b_page) + bh_offset(bh);
  14. }
  15. static inline void bh_kunmap(struct buffer_head *bh)
  16. {
  17. kunmap(bh->b_page);
  18. }
  19. #else /* CONFIG_HIGHMEM */
  20. static inline unsigned int nr_free_highpages(void) { return 0; }
  21. static inline void *kmap(struct page *page) { return page_address(page); }
  22. #define kunmap(page) do { } while (0)
  23. #define kmap_atomic(page,idx) kmap(page)
  24. #define kunmap_atomic(page,idx) kunmap(page)
  25. #define bh_kmap(bh) ((bh)->b_data)
  26. #define bh_kunmap(bh) do { } while (0)
  27. #endif /* CONFIG_HIGHMEM */
  28. /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */
  29. static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
  30. {
  31. void *addr = kmap_atomic(page, KM_USER0);
  32. clear_user_page(addr, vaddr);
  33. kunmap_atomic(addr, KM_USER0);
  34. }
  35. static inline void clear_highpage(struct page *page)
  36. {
  37. clear_page(kmap(page));
  38. kunmap(page);
  39. }
  40. /*
  41.  * Same but also flushes aliased cache contents to RAM.
  42.  */
  43. static inline void memclear_highpage_flush(struct page *page, unsigned int offset, unsigned int size)
  44. {
  45. char *kaddr;
  46. if (offset + size > PAGE_SIZE)
  47. BUG();
  48. kaddr = kmap(page);
  49. memset(kaddr + offset, 0, size);
  50. flush_dcache_page(page);
  51. flush_page_to_ram(page);
  52. kunmap(page);
  53. }
  54. static inline void copy_user_highpage(struct page *to, struct page *from, unsigned long vaddr)
  55. {
  56. char *vfrom, *vto;
  57. vfrom = kmap_atomic(from, KM_USER0);
  58. vto = kmap_atomic(to, KM_USER1);
  59. copy_user_page(vto, vfrom, vaddr);
  60. kunmap_atomic(vfrom, KM_USER0);
  61. kunmap_atomic(vto, KM_USER1);
  62. }
  63. #endif /* _LINUX_HIGHMEM_H */