1#ifndef _LINUX_HIGHMEM_H
2#define _LINUX_HIGHMEM_H
3
4#include <linux/config.h>
5#include <linux/fs.h>
6#include <linux/mm.h>
7
8#include <asm/cacheflush.h>
9
10#ifdef CONFIG_HIGHMEM
11
12extern struct page *highmem_start_page;
13
14#include <asm/highmem.h>
15
16
17unsigned int nr_free_highpages(void);
18
19#else
20
21static inline unsigned int nr_free_highpages(void) { return 0; }
22
23static inline void *kmap(struct page *page)
24{
25 might_sleep();
26 return page_address(page);
27}
28
29#define kunmap(page) do { (void) (page); } while (0)
30
31#define kmap_atomic(page, idx) page_address(page)
32#define kunmap_atomic(addr, idx) do { } while (0)
33#define kmap_atomic_to_page(ptr) virt_to_page(ptr)
34
35#endif
36
37
38static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
39{
40 void *addr = kmap_atomic(page, KM_USER0);
41 clear_user_page(addr, vaddr, page);
42 kunmap_atomic(addr, KM_USER0);
43}
44
45static inline void clear_highpage(struct page *page)
46{
47 void *kaddr = kmap_atomic(page, KM_USER0);
48 clear_page(kaddr);
49 kunmap_atomic(kaddr, KM_USER0);
50}
51
52
53
54
55static inline void memclear_highpage_flush(struct page *page, unsigned int offset, unsigned int size)
56{
57 void *kaddr;
58
59 BUG_ON(offset + size > PAGE_SIZE);
60
61 kaddr = kmap_atomic(page, KM_USER0);
62 memset((char *)kaddr + offset, 0, size);
63 flush_dcache_page(page);
64 kunmap_atomic(kaddr, KM_USER0);
65}
66
67static inline void copy_user_highpage(struct page *to, struct page *from, unsigned long vaddr)
68{
69 char *vfrom, *vto;
70
71 vfrom = kmap_atomic(from, KM_USER0);
72 vto = kmap_atomic(to, KM_USER1);
73 copy_user_page(vto, vfrom, vaddr, to);
74 kunmap_atomic(vfrom, KM_USER0);
75 kunmap_atomic(vto, KM_USER1);
76}
77
78static inline void copy_highpage(struct page *to, struct page *from)
79{
80 char *vfrom, *vto;
81
82 vfrom = kmap_atomic(from, KM_USER0);
83 vto = kmap_atomic(to, KM_USER1);
84 copy_page(vto, vfrom);
85 kunmap_atomic(vfrom, KM_USER0);
86 kunmap_atomic(vto, KM_USER1);
87}
88
89#endif
90