/* * Dummy load and store pages to be used when the real metadata is unavailable. * There are separate pages for loads and stores, so that every load returns a * zero, and every store doesn't affect other loads.
*/ staticchar dummy_load_page[PAGE_SIZE] __aligned(PAGE_SIZE); staticchar dummy_store_page[PAGE_SIZE] __aligned(PAGE_SIZE);
return_dummy: if (store) { /* Ignore this store. */
ret.shadow = dummy_store_page;
ret.origin = dummy_store_page;
} else { /* This load will return zero. */
ret.shadow = dummy_load_page;
ret.origin = dummy_load_page;
} return ret;
}
/* * Obtain the shadow or origin pointer for the given address, or NULL if there's * none. The caller must check the return value for being non-NULL if needed. * The return value of this function should not depend on whether we're in the * runtime or not.
*/ void *kmsan_get_metadata(void *address, bool is_origin)
{
u64 addr = (u64)address, off; struct page *page; void *ret;
if (is_origin)
addr = ALIGN_DOWN(addr, KMSAN_ORIGIN_SIZE);
address = (void *)addr; if (kmsan_internal_is_vmalloc_addr(address) ||
kmsan_internal_is_module_addr(address)) return (void *)vmalloc_meta(address, is_origin);
ret = arch_kmsan_get_meta_or_null(address, is_origin); if (ret) return ret;
page = virt_to_page_or_null(address); if (!page) return NULL; if (!page_has_metadata(page)) return NULL;
off = offset_in_page(addr);
/* Zero pages allocated by the runtime should also be initialized. */ if (kmsan_in_runtime()) return;
__memset(page_address(shadow), -1, PAGE_SIZE * pages);
kmsan_enter_runtime();
handle = kmsan_save_stack_with_flags(flags, /*extra_bits*/ 0);
kmsan_leave_runtime(); /* * Addresses are page-aligned, pages are contiguous, so it's ok * to just fill the origin pages with @handle.
*/ for (int i = 0; i < PAGE_SIZE * pages / sizeof(handle); i++)
((depot_stack_handle_t *)page_address(origin))[i] = handle;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.