ASoC: soc-compress: Send correct stream event for capture start
[firefly-linux-kernel-4.4.55.git] / tools / testing / selftests / soft-dirty / soft-dirty.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <sys/mman.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6 #include <sys/types.h>
7
8 typedef unsigned long long u64;
9
10 #define PME_PRESENT     (1ULL << 63)
11 #define PME_SOFT_DIRTY  (1Ull << 55)
12
13 #define PAGES_TO_TEST   3
14 #ifndef PAGE_SIZE
15 #define PAGE_SIZE       4096
16 #endif
17
18 static void get_pagemap2(char *mem, u64 *map)
19 {
20         int fd;
21
22         fd = open("/proc/self/pagemap2", O_RDONLY);
23         if (fd < 0) {
24                 perror("Can't open pagemap2");
25                 exit(1);
26         }
27
28         lseek(fd, (unsigned long)mem / PAGE_SIZE * sizeof(u64), SEEK_SET);
29         read(fd, map, sizeof(u64) * PAGES_TO_TEST);
30         close(fd);
31 }
32
33 static inline char map_p(u64 map)
34 {
35         return map & PME_PRESENT ? 'p' : '-';
36 }
37
38 static inline char map_sd(u64 map)
39 {
40         return map & PME_SOFT_DIRTY ? 'd' : '-';
41 }
42
43 static int check_pte(int step, int page, u64 *map, u64 want)
44 {
45         if ((map[page] & want) != want) {
46                 printf("Step %d Page %d has %c%c, want %c%c\n",
47                                 step, page,
48                                 map_p(map[page]), map_sd(map[page]),
49                                 map_p(want), map_sd(want));
50                 return 1;
51         }
52
53         return 0;
54 }
55
56 static void clear_refs(void)
57 {
58         int fd;
59         char *v = "4";
60
61         fd = open("/proc/self/clear_refs", O_WRONLY);
62         if (write(fd, v, 3) < 3) {
63                 perror("Can't clear soft-dirty bit");
64                 exit(1);
65         }
66         close(fd);
67 }
68
69 int main(void)
70 {
71         char *mem, x;
72         u64 map[PAGES_TO_TEST];
73
74         mem = mmap(NULL, PAGES_TO_TEST * PAGE_SIZE,
75                         PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, 0, 0);
76
77         x = mem[0];
78         mem[2 * PAGE_SIZE] = 'c';
79         get_pagemap2(mem, map);
80
81         if (check_pte(1, 0, map, PME_PRESENT))
82                 return 1;
83         if (check_pte(1, 1, map, 0))
84                 return 1;
85         if (check_pte(1, 2, map, PME_PRESENT | PME_SOFT_DIRTY))
86                 return 1;
87
88         clear_refs();
89         get_pagemap2(mem, map);
90
91         if (check_pte(2, 0, map, PME_PRESENT))
92                 return 1;
93         if (check_pte(2, 1, map, 0))
94                 return 1;
95         if (check_pte(2, 2, map, PME_PRESENT))
96                 return 1;
97
98         mem[0] = 'a';
99         mem[PAGE_SIZE] = 'b';
100         x = mem[2 * PAGE_SIZE];
101         get_pagemap2(mem, map);
102
103         if (check_pte(3, 0, map, PME_PRESENT | PME_SOFT_DIRTY))
104                 return 1;
105         if (check_pte(3, 1, map, PME_PRESENT | PME_SOFT_DIRTY))
106                 return 1;
107         if (check_pte(3, 2, map, PME_PRESENT))
108                 return 1;
109
110         (void)x; /* gcc warn */
111
112         printf("PASS\n");
113         return 0;
114 }