Lines Matching refs:kcov

47 struct kcov {  struct
82 struct kcov *kcov; argument
97 struct kcov *saved_kcov;
118 static struct kcov_remote *kcov_remote_add(struct kcov *kcov, u64 handle) in kcov_remote_add() argument
128 remote->kcov = kcov; in kcov_remote_add()
345 static void kcov_start(struct task_struct *t, struct kcov *kcov, in kcov_start() argument
350 t->kcov = kcov; in kcov_start()
364 t->kcov = NULL; in kcov_stop()
382 static void kcov_reset(struct kcov *kcov) in kcov_reset() argument
384 kcov->t = NULL; in kcov_reset()
385 kcov->mode = KCOV_MODE_INIT; in kcov_reset()
386 kcov->remote = false; in kcov_reset()
387 kcov->remote_size = 0; in kcov_reset()
388 kcov->sequence++; in kcov_reset()
391 static void kcov_remote_reset(struct kcov *kcov) in kcov_remote_reset() argument
400 if (remote->kcov != kcov) in kcov_remote_reset()
406 kcov_reset(kcov); in kcov_remote_reset()
410 static void kcov_disable(struct task_struct *t, struct kcov *kcov) in kcov_disable() argument
413 if (kcov->remote) in kcov_disable()
414 kcov_remote_reset(kcov); in kcov_disable()
416 kcov_reset(kcov); in kcov_disable()
419 static void kcov_get(struct kcov *kcov) in kcov_get() argument
421 refcount_inc(&kcov->refcount); in kcov_get()
424 static void kcov_put(struct kcov *kcov) in kcov_put() argument
426 if (refcount_dec_and_test(&kcov->refcount)) { in kcov_put()
427 kcov_remote_reset(kcov); in kcov_put()
428 vfree(kcov->area); in kcov_put()
429 kfree(kcov); in kcov_put()
435 struct kcov *kcov; in kcov_task_exit() local
438 kcov = t->kcov; in kcov_task_exit()
439 if (kcov == NULL) in kcov_task_exit()
442 spin_lock_irqsave(&kcov->lock, flags); in kcov_task_exit()
443 kcov_debug("t = %px, kcov->t = %px\n", t, kcov->t); in kcov_task_exit()
466 if (WARN_ON(kcov->t != t)) { in kcov_task_exit()
467 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_task_exit()
471 kcov_disable(t, kcov); in kcov_task_exit()
472 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_task_exit()
473 kcov_put(kcov); in kcov_task_exit()
479 struct kcov *kcov = vma->vm_file->private_data; in kcov_mmap() local
484 spin_lock_irqsave(&kcov->lock, flags); in kcov_mmap()
485 size = kcov->size * sizeof(unsigned long); in kcov_mmap()
486 if (kcov->area == NULL || vma->vm_pgoff != 0 || in kcov_mmap()
491 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_mmap()
494 page = vmalloc_to_page(kcov->area + off); in kcov_mmap()
503 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_mmap()
509 struct kcov *kcov; in kcov_open() local
511 kcov = kzalloc(sizeof(*kcov), GFP_KERNEL); in kcov_open()
512 if (!kcov) in kcov_open()
514 kcov->mode = KCOV_MODE_DISABLED; in kcov_open()
515 kcov->sequence = 1; in kcov_open()
516 refcount_set(&kcov->refcount, 1); in kcov_open()
517 spin_lock_init(&kcov->lock); in kcov_open()
518 filep->private_data = kcov; in kcov_open()
547 static void kcov_fault_in_area(struct kcov *kcov) in kcov_fault_in_area() argument
550 unsigned long *area = kcov->area; in kcov_fault_in_area()
553 for (offset = 0; offset < kcov->size; offset += stride) in kcov_fault_in_area()
574 static int kcov_ioctl_locked(struct kcov *kcov, unsigned int cmd, in kcov_ioctl_locked() argument
592 if (kcov->mode != KCOV_MODE_INIT || !kcov->area) in kcov_ioctl_locked()
595 if (kcov->t != NULL || t->kcov != NULL) in kcov_ioctl_locked()
600 kcov_fault_in_area(kcov); in kcov_ioctl_locked()
601 kcov->mode = mode; in kcov_ioctl_locked()
602 kcov_start(t, kcov, kcov->size, kcov->area, kcov->mode, in kcov_ioctl_locked()
603 kcov->sequence); in kcov_ioctl_locked()
604 kcov->t = t; in kcov_ioctl_locked()
606 kcov_get(kcov); in kcov_ioctl_locked()
611 if (unused != 0 || current->kcov != kcov) in kcov_ioctl_locked()
614 if (WARN_ON(kcov->t != t)) in kcov_ioctl_locked()
616 kcov_disable(t, kcov); in kcov_ioctl_locked()
617 kcov_put(kcov); in kcov_ioctl_locked()
620 if (kcov->mode != KCOV_MODE_INIT || !kcov->area) in kcov_ioctl_locked()
623 if (kcov->t != NULL || t->kcov != NULL) in kcov_ioctl_locked()
631 kcov->mode = mode; in kcov_ioctl_locked()
632 t->kcov = kcov; in kcov_ioctl_locked()
633 kcov->t = t; in kcov_ioctl_locked()
634 kcov->remote = true; in kcov_ioctl_locked()
635 kcov->remote_size = remote_arg->area_size; in kcov_ioctl_locked()
642 kcov_disable(t, kcov); in kcov_ioctl_locked()
645 remote = kcov_remote_add(kcov, remote_arg->handles[i]); in kcov_ioctl_locked()
649 kcov_disable(t, kcov); in kcov_ioctl_locked()
658 kcov_disable(t, kcov); in kcov_ioctl_locked()
661 remote = kcov_remote_add(kcov, in kcov_ioctl_locked()
666 kcov_disable(t, kcov); in kcov_ioctl_locked()
673 kcov_get(kcov); in kcov_ioctl_locked()
682 struct kcov *kcov; in kcov_ioctl() local
690 kcov = filep->private_data; in kcov_ioctl()
706 spin_lock_irqsave(&kcov->lock, flags); in kcov_ioctl()
707 if (kcov->mode != KCOV_MODE_DISABLED) { in kcov_ioctl()
708 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_ioctl()
712 kcov->area = area; in kcov_ioctl()
713 kcov->size = size; in kcov_ioctl()
714 kcov->mode = KCOV_MODE_INIT; in kcov_ioctl()
715 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_ioctl()
739 spin_lock_irqsave(&kcov->lock, flags); in kcov_ioctl()
740 res = kcov_ioctl_locked(kcov, cmd, arg); in kcov_ioctl()
741 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_ioctl()
815 data->saved_kcov = t->kcov; in kcov_remote_softirq_start()
840 struct kcov *kcov; in kcov_remote_start() local
882 kcov = remote->kcov; in kcov_remote_start()
884 kcov_get(kcov); in kcov_remote_start()
889 mode = kcov->mode; in kcov_remote_start()
890 sequence = kcov->sequence; in kcov_remote_start()
892 size = kcov->remote_size; in kcov_remote_start()
905 kcov_put(kcov); in kcov_remote_start()
918 kcov_start(t, kcov, size, area, mode, sequence); in kcov_remote_start()
984 struct kcov *kcov; in kcov_remote_stop() local
1016 kcov = t->kcov; in kcov_remote_stop()
1027 spin_lock(&kcov->lock); in kcov_remote_stop()
1032 if (sequence == kcov->sequence && kcov->remote) in kcov_remote_stop()
1033 kcov_move_area(kcov->mode, kcov->area, kcov->size, area); in kcov_remote_stop()
1034 spin_unlock(&kcov->lock); in kcov_remote_stop()
1045 kcov_put(kcov); in kcov_remote_stop()