Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/kern_kcov.c
Show First 20 Lines • Show All 351 Lines • ▼ Show 20 Lines | kcov_mmap_single(struct cdev *dev, vm_ooffset_t *offset, vm_size_t size, | ||||
*object = info->bufobj; | *object = info->bufobj; | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
kcov_alloc(struct kcov_info *info, size_t entries) | kcov_alloc(struct kcov_info *info, size_t entries) | ||||
{ | { | ||||
size_t n, pages; | size_t n, pages; | ||||
vm_page_t *m; | vm_page_t m; | ||||
KASSERT(info->kvaddr == 0, ("kcov_alloc: Already have a buffer")); | KASSERT(info->kvaddr == 0, ("kcov_alloc: Already have a buffer")); | ||||
KASSERT(info->state == KCOV_STATE_OPEN, | KASSERT(info->state == KCOV_STATE_OPEN, | ||||
("kcov_alloc: Not in open state (%x)", info->state)); | ("kcov_alloc: Not in open state (%x)", info->state)); | ||||
if (entries < 2 || entries > kcov_max_entries) | if (entries < 2 || entries > kcov_max_entries) | ||||
return (EINVAL); | return (EINVAL); | ||||
/* Align to page size so mmap can't access other kernel memory */ | /* Align to page size so mmap can't access other kernel memory */ | ||||
info->bufsize = roundup2(entries * KCOV_ELEMENT_SIZE, PAGE_SIZE); | info->bufsize = roundup2(entries * KCOV_ELEMENT_SIZE, PAGE_SIZE); | ||||
pages = info->bufsize / PAGE_SIZE; | pages = info->bufsize / PAGE_SIZE; | ||||
if ((info->kvaddr = kva_alloc(info->bufsize)) == 0) | if ((info->kvaddr = kva_alloc(info->bufsize)) == 0) | ||||
return (ENOMEM); | return (ENOMEM); | ||||
info->bufobj = vm_pager_allocate(OBJT_PHYS, 0, info->bufsize, | info->bufobj = vm_pager_allocate(OBJT_PHYS, 0, info->bufsize, | ||||
PROT_READ | PROT_WRITE, 0, curthread->td_ucred); | PROT_READ | PROT_WRITE, 0, curthread->td_ucred); | ||||
m = malloc(sizeof(*m) * pages, M_TEMP, M_WAITOK); | |||||
VM_OBJECT_WLOCK(info->bufobj); | VM_OBJECT_WLOCK(info->bufobj); | ||||
for (n = 0; n < pages; n++) { | for (n = 0; n < pages; n++) { | ||||
m[n] = vm_page_grab(info->bufobj, n, | m = vm_page_grab(info->bufobj, n, | ||||
VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_WIRED); | VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_WIRED); | ||||
m[n]->valid = VM_PAGE_BITS_ALL; | m->valid = VM_PAGE_BITS_ALL; | ||||
pmap_qenter(info->kvaddr + n * PAGE_SIZE, &m, 1); | |||||
} | } | ||||
VM_OBJECT_WUNLOCK(info->bufobj); | VM_OBJECT_WUNLOCK(info->bufobj); | ||||
pmap_qenter(info->kvaddr, m, pages); | |||||
free(m, M_TEMP); | |||||
info->entries = entries; | info->entries = entries; | ||||
return (0); | return (0); | ||||
} | } | ||||
static void | static void | ||||
kcov_free(struct kcov_info *info) | kcov_free(struct kcov_info *info) | ||||
▲ Show 20 Lines • Show All 170 Lines • Show Last 20 Lines |