Loading arch/x86/mm/kmemcheck/kmemcheck.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -337,7 +337,7 @@ bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size) if (!shadow) if (!shadow) return true; return true; status = kmemcheck_shadow_test(shadow, size); status = kmemcheck_shadow_test_all(shadow, size); return status == KMEMCHECK_SHADOW_INITIALIZED; return status == KMEMCHECK_SHADOW_INITIALIZED; } } Loading arch/x86/mm/kmemcheck/shadow.c +14 −2 Original line number Original line Diff line number Diff line Loading @@ -125,12 +125,12 @@ void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n) enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size) enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size) { { #ifdef CONFIG_KMEMCHECK_PARTIAL_OK uint8_t *x; uint8_t *x; unsigned int i; unsigned int i; x = shadow; x = shadow; #ifdef CONFIG_KMEMCHECK_PARTIAL_OK /* /* * Make sure _some_ bytes are initialized. Gcc frequently generates * Make sure _some_ bytes are initialized. Gcc frequently generates * code to access neighboring bytes. * code to access neighboring bytes. Loading @@ -139,13 +139,25 @@ enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size) if (x[i] == KMEMCHECK_SHADOW_INITIALIZED) if (x[i] == KMEMCHECK_SHADOW_INITIALIZED) return x[i]; return x[i]; } } return x[0]; #else #else return kmemcheck_shadow_test_all(shadow, size); #endif } enum kmemcheck_shadow kmemcheck_shadow_test_all(void *shadow, unsigned int size) { uint8_t *x; unsigned int i; x = shadow; /* All bytes must be initialized. */ /* All bytes must be initialized. */ for (i = 0; i < size; ++i) { for (i = 0; i < size; ++i) { if (x[i] != KMEMCHECK_SHADOW_INITIALIZED) if (x[i] != KMEMCHECK_SHADOW_INITIALIZED) return x[i]; return x[i]; } } #endif return x[0]; return x[0]; } } Loading arch/x86/mm/kmemcheck/shadow.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -11,6 +11,8 @@ enum kmemcheck_shadow { void *kmemcheck_shadow_lookup(unsigned long address); void *kmemcheck_shadow_lookup(unsigned long address); enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size); enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size); enum kmemcheck_shadow kmemcheck_shadow_test_all(void *shadow, unsigned int size); void kmemcheck_shadow_set(void *shadow, unsigned int size); void kmemcheck_shadow_set(void *shadow, unsigned int size); #endif #endif Loading
arch/x86/mm/kmemcheck/kmemcheck.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -337,7 +337,7 @@ bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size) if (!shadow) if (!shadow) return true; return true; status = kmemcheck_shadow_test(shadow, size); status = kmemcheck_shadow_test_all(shadow, size); return status == KMEMCHECK_SHADOW_INITIALIZED; return status == KMEMCHECK_SHADOW_INITIALIZED; } } Loading
arch/x86/mm/kmemcheck/shadow.c +14 −2 Original line number Original line Diff line number Diff line Loading @@ -125,12 +125,12 @@ void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n) enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size) enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size) { { #ifdef CONFIG_KMEMCHECK_PARTIAL_OK uint8_t *x; uint8_t *x; unsigned int i; unsigned int i; x = shadow; x = shadow; #ifdef CONFIG_KMEMCHECK_PARTIAL_OK /* /* * Make sure _some_ bytes are initialized. Gcc frequently generates * Make sure _some_ bytes are initialized. Gcc frequently generates * code to access neighboring bytes. * code to access neighboring bytes. Loading @@ -139,13 +139,25 @@ enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size) if (x[i] == KMEMCHECK_SHADOW_INITIALIZED) if (x[i] == KMEMCHECK_SHADOW_INITIALIZED) return x[i]; return x[i]; } } return x[0]; #else #else return kmemcheck_shadow_test_all(shadow, size); #endif } enum kmemcheck_shadow kmemcheck_shadow_test_all(void *shadow, unsigned int size) { uint8_t *x; unsigned int i; x = shadow; /* All bytes must be initialized. */ /* All bytes must be initialized. */ for (i = 0; i < size; ++i) { for (i = 0; i < size; ++i) { if (x[i] != KMEMCHECK_SHADOW_INITIALIZED) if (x[i] != KMEMCHECK_SHADOW_INITIALIZED) return x[i]; return x[i]; } } #endif return x[0]; return x[0]; } } Loading
arch/x86/mm/kmemcheck/shadow.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -11,6 +11,8 @@ enum kmemcheck_shadow { void *kmemcheck_shadow_lookup(unsigned long address); void *kmemcheck_shadow_lookup(unsigned long address); enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size); enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size); enum kmemcheck_shadow kmemcheck_shadow_test_all(void *shadow, unsigned int size); void kmemcheck_shadow_set(void *shadow, unsigned int size); void kmemcheck_shadow_set(void *shadow, unsigned int size); #endif #endif