Lines Matching refs:kcov

41 struct kcov {  struct
229 static void kcov_get(struct kcov *kcov) in kcov_get() argument
231 atomic_inc(&kcov->refcount); in kcov_get()
234 static void kcov_put(struct kcov *kcov) in kcov_put() argument
236 if (atomic_dec_and_test(&kcov->refcount)) { in kcov_put()
237 vfree(kcov->area); in kcov_put()
238 kfree(kcov); in kcov_put()
248 t->kcov = NULL; in kcov_task_init()
253 struct kcov *kcov; in kcov_task_exit() local
255 kcov = t->kcov; in kcov_task_exit()
256 if (kcov == NULL) in kcov_task_exit()
258 spin_lock(&kcov->lock); in kcov_task_exit()
259 if (WARN_ON(kcov->t != t)) { in kcov_task_exit()
260 spin_unlock(&kcov->lock); in kcov_task_exit()
265 kcov->t = NULL; in kcov_task_exit()
266 kcov->mode = KCOV_MODE_INIT; in kcov_task_exit()
267 spin_unlock(&kcov->lock); in kcov_task_exit()
268 kcov_put(kcov); in kcov_task_exit()
275 struct kcov *kcov = vma->vm_file->private_data; in kcov_mmap() local
283 spin_lock(&kcov->lock); in kcov_mmap()
284 size = kcov->size * sizeof(unsigned long); in kcov_mmap()
285 if (kcov->mode != KCOV_MODE_INIT || vma->vm_pgoff != 0 || in kcov_mmap()
290 if (!kcov->area) { in kcov_mmap()
291 kcov->area = area; in kcov_mmap()
293 spin_unlock(&kcov->lock); in kcov_mmap()
295 page = vmalloc_to_page(kcov->area + off); in kcov_mmap()
302 spin_unlock(&kcov->lock); in kcov_mmap()
309 struct kcov *kcov; in kcov_open() local
311 kcov = kzalloc(sizeof(*kcov), GFP_KERNEL); in kcov_open()
312 if (!kcov) in kcov_open()
314 kcov->mode = KCOV_MODE_DISABLED; in kcov_open()
315 atomic_set(&kcov->refcount, 1); in kcov_open()
316 spin_lock_init(&kcov->lock); in kcov_open()
317 filep->private_data = kcov; in kcov_open()
332 static void kcov_fault_in_area(struct kcov *kcov) in kcov_fault_in_area() argument
335 unsigned long *area = kcov->area; in kcov_fault_in_area()
338 for (offset = 0; offset < kcov->size; offset += stride) in kcov_fault_in_area()
342 static int kcov_ioctl_locked(struct kcov *kcov, unsigned int cmd, in kcov_ioctl_locked() argument
354 if (kcov->mode != KCOV_MODE_DISABLED) in kcov_ioctl_locked()
364 kcov->size = size; in kcov_ioctl_locked()
365 kcov->mode = KCOV_MODE_INIT; in kcov_ioctl_locked()
375 if (kcov->mode != KCOV_MODE_INIT || !kcov->area) in kcov_ioctl_locked()
378 if (kcov->t != NULL || t->kcov != NULL) in kcov_ioctl_locked()
381 kcov->mode = KCOV_MODE_TRACE_PC; in kcov_ioctl_locked()
384 kcov->mode = KCOV_MODE_TRACE_CMP; in kcov_ioctl_locked()
390 kcov_fault_in_area(kcov); in kcov_ioctl_locked()
392 t->kcov_size = kcov->size; in kcov_ioctl_locked()
393 t->kcov_area = kcov->area; in kcov_ioctl_locked()
396 WRITE_ONCE(t->kcov_mode, kcov->mode); in kcov_ioctl_locked()
397 t->kcov = kcov; in kcov_ioctl_locked()
398 kcov->t = t; in kcov_ioctl_locked()
400 kcov_get(kcov); in kcov_ioctl_locked()
405 if (unused != 0 || current->kcov != kcov) in kcov_ioctl_locked()
408 if (WARN_ON(kcov->t != t)) in kcov_ioctl_locked()
411 kcov->t = NULL; in kcov_ioctl_locked()
412 kcov->mode = KCOV_MODE_INIT; in kcov_ioctl_locked()
413 kcov_put(kcov); in kcov_ioctl_locked()
422 struct kcov *kcov; in kcov_ioctl() local
425 kcov = filep->private_data; in kcov_ioctl()
426 spin_lock(&kcov->lock); in kcov_ioctl()
427 res = kcov_ioctl_locked(kcov, cmd, arg); in kcov_ioctl()
428 spin_unlock(&kcov->lock); in kcov_ioctl()