1#ifndef _LINUX_HIGHMEM_H
2#define _LINUX_HIGHMEM_H
3
4#include <linux/config.h>
5#include <asm/pgalloc.h>
6
7#ifdef CONFIG_HIGHMEM
8
9extern struct page *highmem_start_page;
10
11#include <asm/highmem.h>
12
13
14FASTCALL(unsigned int nr_free_highpages(void));
15
16extern struct buffer_head * create_bounce(int rw, struct buffer_head * bh_orig);
17
18
19static inline char *bh_kmap(struct buffer_head *bh)
20{
21 return kmap(bh->b_page) + bh_offset(bh);
22}
23
24static inline void bh_kunmap(struct buffer_head *bh)
25{
26 kunmap(bh->b_page);
27}
28
29#else
30
31static inline unsigned int nr_free_highpages(void) { return 0; }
32
33static inline void *kmap(struct page *page) { return page_address(page); }
34
35#define kunmap(page) do { } while (0)
36
37#define kmap_atomic(page,idx) kmap(page)
38#define kunmap_atomic(page,idx) kunmap(page)
39
40#define bh_kmap(bh) ((bh)->b_data)
41#define bh_kunmap(bh) do { } while (0);
42
43#endif
44
45
46static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
47{
48 clear_user_page(kmap(page), vaddr);
49 kunmap(page);
50}
51
52static inline void clear_highpage(struct page *page)
53{
54 clear_page(kmap(page));
55 kunmap(page);
56}
57
58static inline void memclear_highpage(struct page *page, unsigned int offset, unsigned int size)
59{
60 char *kaddr;
61
62 if (offset + size > PAGE_SIZE)
63 BUG();
64 kaddr = kmap(page);
65 memset(kaddr + offset, 0, size);
66 kunmap(page);
67}
68
69
70
71
72static inline void memclear_highpage_flush(struct page *page, unsigned int offset, unsigned int size)
73{
74 char *kaddr;
75
76 if (offset + size > PAGE_SIZE)
77 BUG();
78 kaddr = kmap(page);
79 memset(kaddr + offset, 0, size);
80 flush_page_to_ram(page);
81 kunmap(page);
82}
83
84static inline void copy_user_highpage(struct page *to, struct page *from, unsigned long vaddr)
85{
86 char *vfrom, *vto;
87
88 vfrom = kmap(from);
89 vto = kmap(to);
90 copy_user_page(vto, vfrom, vaddr);
91 kunmap(from);
92 kunmap(to);
93}
94
95static inline void copy_highpage(struct page *to, struct page *from)
96{
97 char *vfrom, *vto;
98
99 vfrom = kmap(from);
100 vto = kmap(to);
101 copy_page(vto, vfrom);
102 kunmap(from);
103 kunmap(to);
104}
105
106#endif
107