2 * kmemcheck - a heavyweight memory checker for the linux kernel
3 * Copyright (C) 2007, 2008 Vegard Nossum <vegardno@ifi.uio.no>
4 * (With a lot of help from Ingo Molnar and Pekka Enberg.)
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License (version 2) as
8 * published by the Free Software Foundation.
11 #include <linux/init.h>
12 #include <linux/interrupt.h>
13 #include <linux/kallsyms.h>
14 #include <linux/kernel.h>
15 #include <linux/kmemcheck.h>
17 #include <linux/module.h>
18 #include <linux/page-flags.h>
19 #include <linux/percpu.h>
20 #include <linux/ptrace.h>
21 #include <linux/string.h>
22 #include <linux/types.h>
24 #include <asm/cacheflush.h>
25 #include <asm/kmemcheck.h>
26 #include <asm/pgtable.h>
27 #include <asm/tlbflush.h>
36 #ifdef CONFIG_KMEMCHECK_DISABLED_BY_DEFAULT
37 # define KMEMCHECK_ENABLED 0
40 #ifdef CONFIG_KMEMCHECK_ENABLED_BY_DEFAULT
41 # define KMEMCHECK_ENABLED 1
44 #ifdef CONFIG_KMEMCHECK_ONESHOT_BY_DEFAULT
45 # define KMEMCHECK_ENABLED 2
48 int kmemcheck_enabled
= KMEMCHECK_ENABLED
;
50 int __init
kmemcheck_init(void)
54 * Limit SMP to use a single CPU. We rely on the fact that this code
55 * runs before SMP is set up.
57 if (setup_max_cpus
> 1) {
59 "kmemcheck: Limiting number of CPUs to 1.\n");
64 if (!kmemcheck_selftest()) {
65 printk(KERN_INFO
"kmemcheck: self-tests failed; disabling\n");
66 kmemcheck_enabled
= 0;
70 printk(KERN_INFO
"kmemcheck: Initialized\n");
74 early_initcall(kmemcheck_init
);
77 * We need to parse the kmemcheck= option before any memory is allocated.
79 static int __init
param_kmemcheck(char *str
)
84 sscanf(str
, "%d", &kmemcheck_enabled
);
88 early_param("kmemcheck", param_kmemcheck
);
90 int kmemcheck_show_addr(unsigned long address
)
94 pte
= kmemcheck_pte_lookup(address
);
98 set_pte(pte
, __pte(pte_val(*pte
) | _PAGE_PRESENT
));
99 __flush_tlb_one(address
);
103 int kmemcheck_hide_addr(unsigned long address
)
107 pte
= kmemcheck_pte_lookup(address
);
111 set_pte(pte
, __pte(pte_val(*pte
) & ~_PAGE_PRESENT
));
112 __flush_tlb_one(address
);
116 struct kmemcheck_context
{
121 * There can be at most two memory operands to an instruction, but
122 * each address can cross a page boundary -- so we may need up to
123 * four addresses that must be hidden/revealed for each fault.
125 unsigned long addr
[4];
126 unsigned long n_addrs
;
129 /* Data size of the instruction that caused a fault. */
133 static DEFINE_PER_CPU(struct kmemcheck_context
, kmemcheck_context
);
135 bool kmemcheck_active(struct pt_regs
*regs
)
137 struct kmemcheck_context
*data
= &__get_cpu_var(kmemcheck_context
);
139 return data
->balance
> 0;
142 /* Save an address that needs to be shown/hidden */
143 static void kmemcheck_save_addr(unsigned long addr
)
145 struct kmemcheck_context
*data
= &__get_cpu_var(kmemcheck_context
);
147 BUG_ON(data
->n_addrs
>= ARRAY_SIZE(data
->addr
));
148 data
->addr
[data
->n_addrs
++] = addr
;
151 static unsigned int kmemcheck_show_all(void)
153 struct kmemcheck_context
*data
= &__get_cpu_var(kmemcheck_context
);
158 for (i
= 0; i
< data
->n_addrs
; ++i
)
159 n
+= kmemcheck_show_addr(data
->addr
[i
]);
164 static unsigned int kmemcheck_hide_all(void)
166 struct kmemcheck_context
*data
= &__get_cpu_var(kmemcheck_context
);
171 for (i
= 0; i
< data
->n_addrs
; ++i
)
172 n
+= kmemcheck_hide_addr(data
->addr
[i
]);
178 * Called from the #PF handler.
180 void kmemcheck_show(struct pt_regs
*regs
)
182 struct kmemcheck_context
*data
= &__get_cpu_var(kmemcheck_context
);
184 BUG_ON(!irqs_disabled());
186 if (unlikely(data
->balance
!= 0)) {
187 kmemcheck_show_all();
188 kmemcheck_error_save_bug(regs
);
194 * None of the addresses actually belonged to kmemcheck. Note that
195 * this is not an error.
197 if (kmemcheck_show_all() == 0)
203 * The IF needs to be cleared as well, so that the faulting
204 * instruction can run "uninterrupted". Otherwise, we might take
205 * an interrupt and start executing that before we've had a chance
206 * to hide the page again.
208 * NOTE: In the rare case of multiple faults, we must not override
209 * the original flags:
211 if (!(regs
->flags
& X86_EFLAGS_TF
))
212 data
->flags
= regs
->flags
;
214 regs
->flags
|= X86_EFLAGS_TF
;
215 regs
->flags
&= ~X86_EFLAGS_IF
;
219 * Called from the #DB handler.
221 void kmemcheck_hide(struct pt_regs
*regs
)
223 struct kmemcheck_context
*data
= &__get_cpu_var(kmemcheck_context
);
226 BUG_ON(!irqs_disabled());
228 if (data
->balance
== 0)
231 if (unlikely(data
->balance
!= 1)) {
232 kmemcheck_show_all();
233 kmemcheck_error_save_bug(regs
);
237 if (!(data
->flags
& X86_EFLAGS_TF
))
238 regs
->flags
&= ~X86_EFLAGS_TF
;
239 if (data
->flags
& X86_EFLAGS_IF
)
240 regs
->flags
|= X86_EFLAGS_IF
;
244 if (kmemcheck_enabled
)
245 n
= kmemcheck_hide_all();
247 n
= kmemcheck_show_all();
256 if (!(data
->flags
& X86_EFLAGS_TF
))
257 regs
->flags
&= ~X86_EFLAGS_TF
;
258 if (data
->flags
& X86_EFLAGS_IF
)
259 regs
->flags
|= X86_EFLAGS_IF
;
262 void kmemcheck_show_pages(struct page
*p
, unsigned int n
)
266 for (i
= 0; i
< n
; ++i
) {
267 unsigned long address
;
271 address
= (unsigned long) page_address(&p
[i
]);
272 pte
= lookup_address(address
, &level
);
274 BUG_ON(level
!= PG_LEVEL_4K
);
276 set_pte(pte
, __pte(pte_val(*pte
) | _PAGE_PRESENT
));
277 set_pte(pte
, __pte(pte_val(*pte
) & ~_PAGE_HIDDEN
));
278 __flush_tlb_one(address
);
282 bool kmemcheck_page_is_tracked(struct page
*p
)
284 /* This will also check the "hidden" flag of the PTE. */
285 return kmemcheck_pte_lookup((unsigned long) page_address(p
));
288 void kmemcheck_hide_pages(struct page
*p
, unsigned int n
)
292 for (i
= 0; i
< n
; ++i
) {
293 unsigned long address
;
297 address
= (unsigned long) page_address(&p
[i
]);
298 pte
= lookup_address(address
, &level
);
300 BUG_ON(level
!= PG_LEVEL_4K
);
302 set_pte(pte
, __pte(pte_val(*pte
) & ~_PAGE_PRESENT
));
303 set_pte(pte
, __pte(pte_val(*pte
) | _PAGE_HIDDEN
));
304 __flush_tlb_one(address
);
308 /* Access may NOT cross page boundary */
309 static void kmemcheck_read_strict(struct pt_regs
*regs
,
310 unsigned long addr
, unsigned int size
)
313 enum kmemcheck_shadow status
;
315 shadow
= kmemcheck_shadow_lookup(addr
);
319 kmemcheck_save_addr(addr
);
320 status
= kmemcheck_shadow_test(shadow
, size
);
321 if (status
== KMEMCHECK_SHADOW_INITIALIZED
)
324 if (kmemcheck_enabled
)
325 kmemcheck_error_save(status
, addr
, size
, regs
);
327 if (kmemcheck_enabled
== 2)
328 kmemcheck_enabled
= 0;
330 /* Don't warn about it again. */
331 kmemcheck_shadow_set(shadow
, size
);
334 /* Access may cross page boundary */
335 static void kmemcheck_read(struct pt_regs
*regs
,
336 unsigned long addr
, unsigned int size
)
338 unsigned long page
= addr
& PAGE_MASK
;
339 unsigned long next_addr
= addr
+ size
- 1;
340 unsigned long next_page
= next_addr
& PAGE_MASK
;
342 if (likely(page
== next_page
)) {
343 kmemcheck_read_strict(regs
, addr
, size
);
348 * What we do is basically to split the access across the
349 * two pages and handle each part separately. Yes, this means
350 * that we may now see reads that are 3 + 5 bytes, for
351 * example (and if both are uninitialized, there will be two
352 * reports), but it makes the code a lot simpler.
354 kmemcheck_read_strict(regs
, addr
, next_page
- addr
);
355 kmemcheck_read_strict(regs
, next_page
, next_addr
- next_page
);
358 static void kmemcheck_write_strict(struct pt_regs
*regs
,
359 unsigned long addr
, unsigned int size
)
363 shadow
= kmemcheck_shadow_lookup(addr
);
367 kmemcheck_save_addr(addr
);
368 kmemcheck_shadow_set(shadow
, size
);
371 static void kmemcheck_write(struct pt_regs
*regs
,
372 unsigned long addr
, unsigned int size
)
374 unsigned long page
= addr
& PAGE_MASK
;
375 unsigned long next_addr
= addr
+ size
- 1;
376 unsigned long next_page
= next_addr
& PAGE_MASK
;
378 if (likely(page
== next_page
)) {
379 kmemcheck_write_strict(regs
, addr
, size
);
383 /* See comment in kmemcheck_read(). */
384 kmemcheck_write_strict(regs
, addr
, next_page
- addr
);
385 kmemcheck_write_strict(regs
, next_page
, next_addr
- next_page
);
389 * Copying is hard. We have two addresses, each of which may be split across
390 * a page (and each page will have different shadow addresses).
392 static void kmemcheck_copy(struct pt_regs
*regs
,
393 unsigned long src_addr
, unsigned long dst_addr
, unsigned int size
)
396 enum kmemcheck_shadow status
;
399 unsigned long next_addr
;
400 unsigned long next_page
;
406 BUG_ON(size
> sizeof(shadow
));
408 page
= src_addr
& PAGE_MASK
;
409 next_addr
= src_addr
+ size
- 1;
410 next_page
= next_addr
& PAGE_MASK
;
412 if (likely(page
== next_page
)) {
414 x
= kmemcheck_shadow_lookup(src_addr
);
416 kmemcheck_save_addr(src_addr
);
417 for (i
= 0; i
< size
; ++i
)
420 for (i
= 0; i
< size
; ++i
)
421 shadow
[i
] = KMEMCHECK_SHADOW_INITIALIZED
;
424 n
= next_page
- src_addr
;
425 BUG_ON(n
> sizeof(shadow
));
428 x
= kmemcheck_shadow_lookup(src_addr
);
430 kmemcheck_save_addr(src_addr
);
431 for (i
= 0; i
< n
; ++i
)
435 for (i
= 0; i
< n
; ++i
)
436 shadow
[i
] = KMEMCHECK_SHADOW_INITIALIZED
;
440 x
= kmemcheck_shadow_lookup(next_page
);
442 kmemcheck_save_addr(next_page
);
443 for (i
= n
; i
< size
; ++i
)
444 shadow
[i
] = x
[i
- n
];
447 for (i
= n
; i
< size
; ++i
)
448 shadow
[i
] = KMEMCHECK_SHADOW_INITIALIZED
;
452 page
= dst_addr
& PAGE_MASK
;
453 next_addr
= dst_addr
+ size
- 1;
454 next_page
= next_addr
& PAGE_MASK
;
456 if (likely(page
== next_page
)) {
458 x
= kmemcheck_shadow_lookup(dst_addr
);
460 kmemcheck_save_addr(dst_addr
);
461 for (i
= 0; i
< size
; ++i
) {
463 shadow
[i
] = KMEMCHECK_SHADOW_INITIALIZED
;
467 n
= next_page
- dst_addr
;
468 BUG_ON(n
> sizeof(shadow
));
471 x
= kmemcheck_shadow_lookup(dst_addr
);
473 kmemcheck_save_addr(dst_addr
);
474 for (i
= 0; i
< n
; ++i
) {
476 shadow
[i
] = KMEMCHECK_SHADOW_INITIALIZED
;
481 x
= kmemcheck_shadow_lookup(next_page
);
483 kmemcheck_save_addr(next_page
);
484 for (i
= n
; i
< size
; ++i
) {
485 x
[i
- n
] = shadow
[i
];
486 shadow
[i
] = KMEMCHECK_SHADOW_INITIALIZED
;
491 status
= kmemcheck_shadow_test(shadow
, size
);
492 if (status
== KMEMCHECK_SHADOW_INITIALIZED
)
495 if (kmemcheck_enabled
)
496 kmemcheck_error_save(status
, src_addr
, size
, regs
);
498 if (kmemcheck_enabled
== 2)
499 kmemcheck_enabled
= 0;
502 enum kmemcheck_method
{
507 static void kmemcheck_access(struct pt_regs
*regs
,
508 unsigned long fallback_address
, enum kmemcheck_method fallback_method
)
511 const uint8_t *insn_primary
;
514 struct kmemcheck_context
*data
= &__get_cpu_var(kmemcheck_context
);
516 /* Recursive fault -- ouch. */
518 kmemcheck_show_addr(fallback_address
);
519 kmemcheck_error_save_bug(regs
);
525 insn
= (const uint8_t *) regs
->ip
;
526 insn_primary
= kmemcheck_opcode_get_primary(insn
);
528 kmemcheck_opcode_decode(insn
, &size
);
530 switch (insn_primary
[0]) {
531 #ifdef CONFIG_KMEMCHECK_BITOPS_OK
534 * Unfortunately, these instructions have to be excluded from
535 * our regular checking since they access only some (and not
536 * all) bits. This clears out "bogus" bitfield-access warnings.
542 switch ((insn_primary
[1] >> 3) & 7) {
549 kmemcheck_write(regs
, fallback_address
, size
);
567 /* MOVS, MOVSB, MOVSW, MOVSD */
571 * These instructions are special because they take two
572 * addresses, but we only get one page fault.
574 kmemcheck_copy(regs
, regs
->si
, regs
->di
, size
);
577 /* CMPS, CMPSB, CMPSW, CMPSD */
580 kmemcheck_read(regs
, regs
->si
, size
);
581 kmemcheck_read(regs
, regs
->di
, size
);
586 * If the opcode isn't special in any way, we use the data from the
587 * page fault handler to determine the address and type of memory
590 switch (fallback_method
) {
592 kmemcheck_read(regs
, fallback_address
, size
);
594 case KMEMCHECK_WRITE
:
595 kmemcheck_write(regs
, fallback_address
, size
);
603 bool kmemcheck_fault(struct pt_regs
*regs
, unsigned long address
,
604 unsigned long error_code
)
609 * XXX: Is it safe to assume that memory accesses from virtual 86
610 * mode or non-kernel code segments will _never_ access kernel
611 * memory (e.g. tracked pages)? For now, we need this to avoid
612 * invoking kmemcheck for PnP BIOS calls.
614 if (regs
->flags
& X86_VM_MASK
)
616 if (regs
->cs
!= __KERNEL_CS
)
619 pte
= kmemcheck_pte_lookup(address
);
624 kmemcheck_access(regs
, address
, KMEMCHECK_WRITE
);
626 kmemcheck_access(regs
, address
, KMEMCHECK_READ
);
628 kmemcheck_show(regs
);
632 bool kmemcheck_trap(struct pt_regs
*regs
)
634 if (!kmemcheck_active(regs
))
638 kmemcheck_hide(regs
);