Lines Matching refs:kcov

46 struct kcov {  struct
81 struct kcov *kcov; member
96 struct kcov *saved_kcov;
117 static struct kcov_remote *kcov_remote_add(struct kcov *kcov, u64 handle) in kcov_remote_add() argument
127 remote->kcov = kcov; in kcov_remote_add()
328 static void kcov_start(struct task_struct *t, struct kcov *kcov, in kcov_start() argument
333 t->kcov = kcov; in kcov_start()
347 t->kcov = NULL; in kcov_stop()
365 static void kcov_reset(struct kcov *kcov) in kcov_reset() argument
367 kcov->t = NULL; in kcov_reset()
368 kcov->mode = KCOV_MODE_INIT; in kcov_reset()
369 kcov->remote = false; in kcov_reset()
370 kcov->remote_size = 0; in kcov_reset()
371 kcov->sequence++; in kcov_reset()
374 static void kcov_remote_reset(struct kcov *kcov) in kcov_remote_reset() argument
383 if (remote->kcov != kcov) in kcov_remote_reset()
389 kcov_reset(kcov); in kcov_remote_reset()
393 static void kcov_disable(struct task_struct *t, struct kcov *kcov) in kcov_disable() argument
396 if (kcov->remote) in kcov_disable()
397 kcov_remote_reset(kcov); in kcov_disable()
399 kcov_reset(kcov); in kcov_disable()
402 static void kcov_get(struct kcov *kcov) in kcov_get() argument
404 refcount_inc(&kcov->refcount); in kcov_get()
407 static void kcov_put(struct kcov *kcov) in kcov_put() argument
409 if (refcount_dec_and_test(&kcov->refcount)) { in kcov_put()
410 kcov_remote_reset(kcov); in kcov_put()
411 vfree(kcov->area); in kcov_put()
412 kfree(kcov); in kcov_put()
418 struct kcov *kcov; in kcov_task_exit() local
421 kcov = t->kcov; in kcov_task_exit()
422 if (kcov == NULL) in kcov_task_exit()
425 spin_lock_irqsave(&kcov->lock, flags); in kcov_task_exit()
426 kcov_debug("t = %px, kcov->t = %px\n", t, kcov->t); in kcov_task_exit()
449 if (WARN_ON(kcov->t != t)) { in kcov_task_exit()
450 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_task_exit()
454 kcov_disable(t, kcov); in kcov_task_exit()
455 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_task_exit()
456 kcov_put(kcov); in kcov_task_exit()
463 struct kcov *kcov = vma->vm_file->private_data; in kcov_mmap() local
472 spin_lock_irqsave(&kcov->lock, flags); in kcov_mmap()
473 size = kcov->size * sizeof(unsigned long); in kcov_mmap()
474 if (kcov->mode != KCOV_MODE_INIT || vma->vm_pgoff != 0 || in kcov_mmap()
479 if (!kcov->area) { in kcov_mmap()
480 kcov->area = area; in kcov_mmap()
482 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_mmap()
484 page = vmalloc_to_page(kcov->area + off); in kcov_mmap()
491 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_mmap()
498 struct kcov *kcov; in kcov_open() local
500 kcov = kzalloc(sizeof(*kcov), GFP_KERNEL); in kcov_open()
501 if (!kcov) in kcov_open()
503 kcov->mode = KCOV_MODE_DISABLED; in kcov_open()
504 kcov->sequence = 1; in kcov_open()
505 refcount_set(&kcov->refcount, 1); in kcov_open()
506 spin_lock_init(&kcov->lock); in kcov_open()
507 filep->private_data = kcov; in kcov_open()
536 static void kcov_fault_in_area(struct kcov *kcov) in kcov_fault_in_area() argument
539 unsigned long *area = kcov->area; in kcov_fault_in_area()
542 for (offset = 0; offset < kcov->size; offset += stride) in kcov_fault_in_area()
563 static int kcov_ioctl_locked(struct kcov *kcov, unsigned int cmd, in kcov_ioctl_locked() argument
579 if (kcov->mode != KCOV_MODE_DISABLED) in kcov_ioctl_locked()
589 kcov->size = size; in kcov_ioctl_locked()
590 kcov->mode = KCOV_MODE_INIT; in kcov_ioctl_locked()
600 if (kcov->mode != KCOV_MODE_INIT || !kcov->area) in kcov_ioctl_locked()
603 if (kcov->t != NULL || t->kcov != NULL) in kcov_ioctl_locked()
608 kcov_fault_in_area(kcov); in kcov_ioctl_locked()
609 kcov->mode = mode; in kcov_ioctl_locked()
610 kcov_start(t, kcov, kcov->size, kcov->area, kcov->mode, in kcov_ioctl_locked()
611 kcov->sequence); in kcov_ioctl_locked()
612 kcov->t = t; in kcov_ioctl_locked()
614 kcov_get(kcov); in kcov_ioctl_locked()
619 if (unused != 0 || current->kcov != kcov) in kcov_ioctl_locked()
622 if (WARN_ON(kcov->t != t)) in kcov_ioctl_locked()
624 kcov_disable(t, kcov); in kcov_ioctl_locked()
625 kcov_put(kcov); in kcov_ioctl_locked()
628 if (kcov->mode != KCOV_MODE_INIT || !kcov->area) in kcov_ioctl_locked()
631 if (kcov->t != NULL || t->kcov != NULL) in kcov_ioctl_locked()
639 kcov->mode = mode; in kcov_ioctl_locked()
640 t->kcov = kcov; in kcov_ioctl_locked()
641 kcov->t = t; in kcov_ioctl_locked()
642 kcov->remote = true; in kcov_ioctl_locked()
643 kcov->remote_size = remote_arg->area_size; in kcov_ioctl_locked()
650 kcov_disable(t, kcov); in kcov_ioctl_locked()
653 remote = kcov_remote_add(kcov, remote_arg->handles[i]); in kcov_ioctl_locked()
657 kcov_disable(t, kcov); in kcov_ioctl_locked()
666 kcov_disable(t, kcov); in kcov_ioctl_locked()
669 remote = kcov_remote_add(kcov, in kcov_ioctl_locked()
674 kcov_disable(t, kcov); in kcov_ioctl_locked()
681 kcov_get(kcov); in kcov_ioctl_locked()
690 struct kcov *kcov; in kcov_ioctl() local
715 kcov = filep->private_data; in kcov_ioctl()
716 spin_lock_irqsave(&kcov->lock, flags); in kcov_ioctl()
717 res = kcov_ioctl_locked(kcov, cmd, arg); in kcov_ioctl()
718 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_ioctl()
793 data->saved_kcov = t->kcov; in kcov_remote_softirq_start()
818 struct kcov *kcov; in kcov_remote_start() local
860 kcov = remote->kcov; in kcov_remote_start()
862 kcov_get(kcov); in kcov_remote_start()
867 mode = kcov->mode; in kcov_remote_start()
868 sequence = kcov->sequence; in kcov_remote_start()
870 size = kcov->remote_size; in kcov_remote_start()
883 kcov_put(kcov); in kcov_remote_start()
896 kcov_start(t, kcov, size, area, mode, sequence); in kcov_remote_start()
962 struct kcov *kcov; in kcov_remote_stop() local
994 kcov = t->kcov; in kcov_remote_stop()
1005 spin_lock(&kcov->lock); in kcov_remote_stop()
1010 if (sequence == kcov->sequence && kcov->remote) in kcov_remote_stop()
1011 kcov_move_area(kcov->mode, kcov->area, kcov->size, area); in kcov_remote_stop()
1012 spin_unlock(&kcov->lock); in kcov_remote_stop()
1023 kcov_put(kcov); in kcov_remote_stop()