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