Changeset View
Standalone View
sys/amd64/include/asan.h
- This file was added.
/*- | |||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD | |||||
* | |||||
* Copyright (c) 2020 The FreeBSD Foundation | |||||
* | |||||
* This software was developed by Mark Johnston under sponsorship from the | |||||
* FreeBSD Foundation. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions are | |||||
* met: | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in | |||||
* the documentation and/or other materials provided with the distribution. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | |||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | |||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
* SUCH DAMAGE. | |||||
*/ | |||||
#ifndef _MACHINE_ASAN_H_ | |||||
#define _MACHINE_ASAN_H_ | |||||
#ifdef KASAN | |||||
#include <vm/vm.h> | |||||
#include <vm/pmap.h> | |||||
#include <vm/vm_page.h> | |||||
#include <machine/vmparam.h> | |||||
alc: This is already included by vm/pmap.h. | |||||
static inline vm_offset_t | |||||
kasan_md_addr_to_shad(vm_offset_t addr) | |||||
{ | |||||
return (((addr - VM_MIN_KERNEL_ADDRESS) >> KASAN_SHADOW_SCALE_SHIFT) + | |||||
KASAN_MIN_ADDRESS); | |||||
} | |||||
static inline bool | |||||
kasan_md_unsupported(vm_offset_t addr) | |||||
{ | |||||
vm_offset_t kernmin; | |||||
/* | |||||
* The vm_page array is mapped at the beginning of the kernel map. For | |||||
* now simply permit all accesses. We must handle the fact that KASAN | |||||
* is initialized before the vm_page array is mapped. | |||||
*/ | |||||
kernmin = (vm_offset_t)vm_page_array + | |||||
vm_page_array_size * sizeof(struct vm_page); | |||||
return (addr < kernmin || addr < VM_MIN_KERNEL_ADDRESS || | |||||
kibUnsubmitted Not Done Inline ActionsWhy the check for < VM_MIN_KERNEL_ADDRESS is needed? From my understanding of current layout, (vm_offset_t)vm_page_array == VM_MIN_KERNEL_ADDRESS. kib: Why the check for < VM_MIN_KERNEL_ADDRESS is needed? From my understanding of current layout… | |||||
markjAuthorUnsubmitted Done Inline Actionsvm_page_array is not set until SI_SUB_VM, but we enable KASAN before starting sysinits. I tried to explain it with the comment, I'll try to make it more clear. BTW, another solution is to create a shadow map of the vm_page array in pmap_page_array_startup(). Because we do not validate accesses to vm_pages, we can use a single 4KB or 2MB physical page for the entire shadow. In fact I did it this way originally but it added some complexity, and maybe a shadow map for vm_pages could become useful some day. markj: vm_page_array is not set until SI_SUB_VM, but we enable KASAN before starting sysinits. I tried… | |||||
kibUnsubmitted Done Inline ActionsI see what you mean. It would be enough, IMO, to note that vm_page_array is initialized after first use of kasan_md_unsupported(). kib: I see what you mean. It would be enough, IMO, to note that vm_page_array is initialized after… | |||||
addr >= VM_MAX_KERNEL_ADDRESS); | |||||
} | |||||
static inline void | |||||
kasan_md_init(void) | |||||
{ | |||||
} | |||||
#endif /* KASAN */ | |||||
#endif /* !_MACHINE_ASAN_H_ */ |
This is already included by vm/pmap.h.