File: /usr/include/linux/highmem.h

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     
9     extern struct page *highmem_start_page;
10     
11     #include <asm/highmem.h>
12     
13     /* declarations for linux/mm/highmem.c */
14     FASTCALL(unsigned int nr_free_highpages(void));
15     
16     extern struct buffer_head * create_bounce(int rw, struct buffer_head * bh_orig);
17     
18     
19     static inline char *bh_kmap(struct buffer_head *bh)
20     {
21     	return kmap(bh->b_page) + bh_offset(bh);
22     }
23     
24     static inline void bh_kunmap(struct buffer_head *bh)
25     {
26     	kunmap(bh->b_page);
27     }
28     
29     #else /* CONFIG_HIGHMEM */
30     
31     static inline unsigned int nr_free_highpages(void) { return 0; }
32     
33     static 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 /* CONFIG_HIGHMEM */
44     
45     /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */
46     static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
47     {
48     	clear_user_page(kmap(page), vaddr);
49     	kunmap(page);
50     }
51     
52     static inline void clear_highpage(struct page *page)
53     {
54     	clear_page(kmap(page));
55     	kunmap(page);
56     }
57     
58     static 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      * Same but also flushes aliased cache contents to RAM.
71      */
72     static 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     
84     static 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     
95     static 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 /* _LINUX_HIGHMEM_H */
107