Lines Matching refs:kcov
48 struct kcov { struct
83 struct kcov *kcov; member
98 struct kcov *saved_kcov;
119 static struct kcov_remote *kcov_remote_add(struct kcov *kcov, u64 handle) in kcov_remote_add() argument
129 remote->kcov = kcov; in kcov_remote_add()
356 static void kcov_start(struct task_struct *t, struct kcov *kcov, in kcov_start() argument
361 t->kcov = kcov; in kcov_start()
375 t->kcov = NULL; in kcov_stop()
393 static void kcov_reset(struct kcov *kcov) in kcov_reset() argument
395 kcov->t = NULL; in kcov_reset()
396 kcov->mode = KCOV_MODE_INIT; in kcov_reset()
397 kcov->remote = false; in kcov_reset()
398 kcov->remote_size = 0; in kcov_reset()
399 kcov->sequence++; in kcov_reset()
402 static void kcov_remote_reset(struct kcov *kcov) in kcov_remote_reset() argument
411 if (remote->kcov != kcov) in kcov_remote_reset()
417 kcov_reset(kcov); in kcov_remote_reset()
421 static void kcov_disable(struct task_struct *t, struct kcov *kcov) in kcov_disable() argument
424 if (kcov->remote) in kcov_disable()
425 kcov_remote_reset(kcov); in kcov_disable()
427 kcov_reset(kcov); in kcov_disable()
430 static void kcov_get(struct kcov *kcov) in kcov_get() argument
432 refcount_inc(&kcov->refcount); in kcov_get()
435 static void kcov_put(struct kcov *kcov) in kcov_put() argument
437 if (refcount_dec_and_test(&kcov->refcount)) { in kcov_put()
438 kcov_remote_reset(kcov); in kcov_put()
439 vfree(kcov->area); in kcov_put()
440 kfree(kcov); in kcov_put()
446 struct kcov *kcov; in kcov_task_exit() local
449 kcov = t->kcov; in kcov_task_exit()
450 if (kcov == NULL) in kcov_task_exit()
453 spin_lock_irqsave(&kcov->lock, flags); in kcov_task_exit()
454 kcov_debug("t = %px, kcov->t = %px\n", t, kcov->t); in kcov_task_exit()
477 if (WARN_ON(kcov->t != t)) { in kcov_task_exit()
478 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_task_exit()
482 kcov_disable(t, kcov); in kcov_task_exit()
483 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_task_exit()
484 kcov_put(kcov); in kcov_task_exit()
490 struct kcov *kcov = vma->vm_file->private_data; in kcov_mmap() local
495 spin_lock_irqsave(&kcov->lock, flags); in kcov_mmap()
496 size = kcov->size * sizeof(unsigned long); in kcov_mmap()
497 if (kcov->area == NULL || vma->vm_pgoff != 0 || in kcov_mmap()
502 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_mmap()
505 page = vmalloc_to_page(kcov->area + off); in kcov_mmap()
514 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_mmap()
520 struct kcov *kcov; in kcov_open() local
522 kcov = kzalloc(sizeof(*kcov), GFP_KERNEL); in kcov_open()
523 if (!kcov) in kcov_open()
525 kcov->mode = KCOV_MODE_DISABLED; in kcov_open()
526 kcov->sequence = 1; in kcov_open()
527 refcount_set(&kcov->refcount, 1); in kcov_open()
528 spin_lock_init(&kcov->lock); in kcov_open()
529 filep->private_data = kcov; in kcov_open()
558 static void kcov_fault_in_area(struct kcov *kcov) in kcov_fault_in_area() argument
561 unsigned long *area = kcov->area; in kcov_fault_in_area()
564 for (offset = 0; offset < kcov->size; offset += stride) in kcov_fault_in_area()
585 static int kcov_ioctl_locked(struct kcov *kcov, unsigned int cmd, in kcov_ioctl_locked() argument
603 if (kcov->mode != KCOV_MODE_INIT || !kcov->area) in kcov_ioctl_locked()
606 if (kcov->t != NULL || t->kcov != NULL) in kcov_ioctl_locked()
611 kcov_fault_in_area(kcov); in kcov_ioctl_locked()
612 kcov->mode = mode; in kcov_ioctl_locked()
613 kcov_start(t, kcov, kcov->size, kcov->area, kcov->mode, in kcov_ioctl_locked()
614 kcov->sequence); in kcov_ioctl_locked()
615 kcov->t = t; in kcov_ioctl_locked()
617 kcov_get(kcov); in kcov_ioctl_locked()
622 if (unused != 0 || current->kcov != kcov) in kcov_ioctl_locked()
625 if (WARN_ON(kcov->t != t)) in kcov_ioctl_locked()
627 kcov_disable(t, kcov); in kcov_ioctl_locked()
628 kcov_put(kcov); in kcov_ioctl_locked()
631 if (kcov->mode != KCOV_MODE_INIT || !kcov->area) in kcov_ioctl_locked()
634 if (kcov->t != NULL || t->kcov != NULL) in kcov_ioctl_locked()
643 kcov->mode = mode; in kcov_ioctl_locked()
644 t->kcov = kcov; in kcov_ioctl_locked()
646 kcov->t = t; in kcov_ioctl_locked()
647 kcov->remote = true; in kcov_ioctl_locked()
648 kcov->remote_size = remote_arg->area_size; in kcov_ioctl_locked()
655 kcov_disable(t, kcov); in kcov_ioctl_locked()
658 remote = kcov_remote_add(kcov, remote_arg->handles[i]); in kcov_ioctl_locked()
662 kcov_disable(t, kcov); in kcov_ioctl_locked()
671 kcov_disable(t, kcov); in kcov_ioctl_locked()
674 remote = kcov_remote_add(kcov, in kcov_ioctl_locked()
679 kcov_disable(t, kcov); in kcov_ioctl_locked()
686 kcov_get(kcov); in kcov_ioctl_locked()
695 struct kcov *kcov; in kcov_ioctl() local
703 kcov = filep->private_data; in kcov_ioctl()
719 spin_lock_irqsave(&kcov->lock, flags); in kcov_ioctl()
720 if (kcov->mode != KCOV_MODE_DISABLED) { in kcov_ioctl()
721 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_ioctl()
725 kcov->area = area; in kcov_ioctl()
726 kcov->size = size; in kcov_ioctl()
727 kcov->mode = KCOV_MODE_INIT; in kcov_ioctl()
728 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_ioctl()
752 spin_lock_irqsave(&kcov->lock, flags); in kcov_ioctl()
753 res = kcov_ioctl_locked(kcov, cmd, arg); in kcov_ioctl()
754 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_ioctl()
828 data->saved_kcov = t->kcov; in kcov_remote_softirq_start()
853 struct kcov *kcov; in kcov_remote_start() local
895 kcov = remote->kcov; in kcov_remote_start()
897 kcov_get(kcov); in kcov_remote_start()
902 mode = kcov->mode; in kcov_remote_start()
903 sequence = kcov->sequence; in kcov_remote_start()
905 size = kcov->remote_size; in kcov_remote_start()
918 kcov_put(kcov); in kcov_remote_start()
931 kcov_start(t, kcov, size, area, mode, sequence); in kcov_remote_start()
997 struct kcov *kcov; in kcov_remote_stop() local
1029 kcov = t->kcov; in kcov_remote_stop()
1040 spin_lock(&kcov->lock); in kcov_remote_stop()
1045 if (sequence == kcov->sequence && kcov->remote) in kcov_remote_stop()
1046 kcov_move_area(kcov->mode, kcov->area, kcov->size, area); in kcov_remote_stop()
1047 spin_unlock(&kcov->lock); in kcov_remote_stop()
1058 kcov_put(kcov); in kcov_remote_stop()