Lines Matching +full:page +full:- +full:size
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2017-2022 Google LLC
22 #define shadow_page_for(page) ((page)->kmsan_shadow)
24 #define origin_page_for(page) ((page)->kmsan_origin)
26 static void *shadow_ptr_for(struct page *page)
28 return page_address(shadow_page_for(page));
31 static void *origin_ptr_for(struct page *page)
33 return page_address(origin_page_for(page));
36 static bool page_has_metadata(struct page *page)
38 return shadow_page_for(page) && origin_page_for(page);
41 static void set_no_shadow_origin_page(struct page *page)
43 shadow_page_for(page) = NULL;
44 origin_page_for(page) = NULL;
61 off = addr64 - VMALLOC_START;
66 off = addr64 - MODULES_VADDR;
73 static struct page *virt_to_page_or_null(void *vaddr)
81 struct shadow_origin_ptr kmsan_get_shadow_origin_ptr(void *address, u64 size,
88 * Even if we redirect this memory access to the dummy page, it will
91 KMSAN_WARN_ON(size > PAGE_SIZE);
96 KMSAN_WARN_ON(!kmsan_metadata_is_contiguous(address, size));
120 * none. The caller must check the return value for being non-NULL if needed.
127 struct page *page;
141 page = virt_to_page_or_null(address);
142 if (!page)
144 if (!page_has_metadata(page))
148 return (is_origin ? origin_ptr_for(page) : shadow_ptr_for(page)) + off;
151 void kmsan_copy_page_meta(struct page *dst, struct page *src)
170 void kmsan_alloc_page(struct page *page, unsigned int order, gfp_t flags)
173 struct page *shadow, *origin;
177 if (!page)
180 shadow = shadow_page_for(page);
181 origin = origin_page_for(page);
193 __memset(page_address(shadow), -1, PAGE_SIZE * pages);
198 * Addresses are page-aligned, pages are contiguous, so it's ok
205 void kmsan_free_page(struct page *page, unsigned int order)
210 kmsan_internal_poison_memory(page_address(page),
211 page_size(page),
218 pgprot_t prot, struct page **pages,
222 struct page **s_pages, **o_pages;
233 nr = (end - start) / PAGE_SIZE;
237 err = -ENOMEM;
276 struct page *shadow_p, *origin_p;
278 struct page *page;
279 u64 size;
282 size = PAGE_ALIGN((u64)end - (u64)start);
283 shadow = memblock_alloc_or_panic(size, PAGE_SIZE);
284 origin = memblock_alloc_or_panic(size, PAGE_SIZE);
286 for (u64 addr = 0; addr < size; addr += PAGE_SIZE) {
287 page = virt_to_page_or_null((char *)start + addr);
290 shadow_page_for(page) = shadow_p;
293 origin_page_for(page) = origin_p;
297 void kmsan_setup_meta(struct page *page, struct page *shadow,
298 struct page *origin, int order)
303 shadow_page_for(&page[i]) = &shadow[i];
304 origin_page_for(&page[i]) = &origin[i];