Lines Matching refs:kcov

46 struct kcov {  struct
81 struct kcov *kcov; member
95 struct kcov *saved_kcov;
114 static struct kcov_remote *kcov_remote_add(struct kcov *kcov, u64 handle) in kcov_remote_add() argument
124 remote->kcov = kcov; in kcov_remote_add()
325 static void kcov_start(struct task_struct *t, struct kcov *kcov, in kcov_start() argument
330 t->kcov = kcov; in kcov_start()
344 t->kcov = NULL; in kcov_stop()
362 static void kcov_reset(struct kcov *kcov) in kcov_reset() argument
364 kcov->t = NULL; in kcov_reset()
365 kcov->mode = KCOV_MODE_INIT; in kcov_reset()
366 kcov->remote = false; in kcov_reset()
367 kcov->remote_size = 0; in kcov_reset()
368 kcov->sequence++; in kcov_reset()
371 static void kcov_remote_reset(struct kcov *kcov) in kcov_remote_reset() argument
380 if (remote->kcov != kcov) in kcov_remote_reset()
386 kcov_reset(kcov); in kcov_remote_reset()
390 static void kcov_disable(struct task_struct *t, struct kcov *kcov) in kcov_disable() argument
393 if (kcov->remote) in kcov_disable()
394 kcov_remote_reset(kcov); in kcov_disable()
396 kcov_reset(kcov); in kcov_disable()
399 static void kcov_get(struct kcov *kcov) in kcov_get() argument
401 refcount_inc(&kcov->refcount); in kcov_get()
404 static void kcov_put(struct kcov *kcov) in kcov_put() argument
406 if (refcount_dec_and_test(&kcov->refcount)) { in kcov_put()
407 kcov_remote_reset(kcov); in kcov_put()
408 vfree(kcov->area); in kcov_put()
409 kfree(kcov); in kcov_put()
415 struct kcov *kcov; in kcov_task_exit() local
418 kcov = t->kcov; in kcov_task_exit()
419 if (kcov == NULL) in kcov_task_exit()
422 spin_lock_irqsave(&kcov->lock, flags); in kcov_task_exit()
423 kcov_debug("t = %px, kcov->t = %px\n", t, kcov->t); in kcov_task_exit()
446 if (WARN_ON(kcov->t != t)) { in kcov_task_exit()
447 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_task_exit()
451 kcov_disable(t, kcov); in kcov_task_exit()
452 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_task_exit()
453 kcov_put(kcov); in kcov_task_exit()
460 struct kcov *kcov = vma->vm_file->private_data; in kcov_mmap() local
469 spin_lock_irqsave(&kcov->lock, flags); in kcov_mmap()
470 size = kcov->size * sizeof(unsigned long); in kcov_mmap()
471 if (kcov->mode != KCOV_MODE_INIT || vma->vm_pgoff != 0 || in kcov_mmap()
476 if (!kcov->area) { in kcov_mmap()
477 kcov->area = area; in kcov_mmap()
479 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_mmap()
481 page = vmalloc_to_page(kcov->area + off); in kcov_mmap()
488 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_mmap()
495 struct kcov *kcov; in kcov_open() local
497 kcov = kzalloc(sizeof(*kcov), GFP_KERNEL); in kcov_open()
498 if (!kcov) in kcov_open()
500 kcov->mode = KCOV_MODE_DISABLED; in kcov_open()
501 kcov->sequence = 1; in kcov_open()
502 refcount_set(&kcov->refcount, 1); in kcov_open()
503 spin_lock_init(&kcov->lock); in kcov_open()
504 filep->private_data = kcov; in kcov_open()
533 static void kcov_fault_in_area(struct kcov *kcov) in kcov_fault_in_area() argument
536 unsigned long *area = kcov->area; in kcov_fault_in_area()
539 for (offset = 0; offset < kcov->size; offset += stride) in kcov_fault_in_area()
560 static int kcov_ioctl_locked(struct kcov *kcov, unsigned int cmd, in kcov_ioctl_locked() argument
576 if (kcov->mode != KCOV_MODE_DISABLED) in kcov_ioctl_locked()
586 kcov->size = size; in kcov_ioctl_locked()
587 kcov->mode = KCOV_MODE_INIT; in kcov_ioctl_locked()
597 if (kcov->mode != KCOV_MODE_INIT || !kcov->area) in kcov_ioctl_locked()
600 if (kcov->t != NULL || t->kcov != NULL) in kcov_ioctl_locked()
605 kcov_fault_in_area(kcov); in kcov_ioctl_locked()
606 kcov->mode = mode; in kcov_ioctl_locked()
607 kcov_start(t, kcov, kcov->size, kcov->area, kcov->mode, in kcov_ioctl_locked()
608 kcov->sequence); in kcov_ioctl_locked()
609 kcov->t = t; in kcov_ioctl_locked()
611 kcov_get(kcov); in kcov_ioctl_locked()
616 if (unused != 0 || current->kcov != kcov) in kcov_ioctl_locked()
619 if (WARN_ON(kcov->t != t)) in kcov_ioctl_locked()
621 kcov_disable(t, kcov); in kcov_ioctl_locked()
622 kcov_put(kcov); in kcov_ioctl_locked()
625 if (kcov->mode != KCOV_MODE_INIT || !kcov->area) in kcov_ioctl_locked()
628 if (kcov->t != NULL || t->kcov != NULL) in kcov_ioctl_locked()
636 kcov->mode = mode; in kcov_ioctl_locked()
637 t->kcov = kcov; in kcov_ioctl_locked()
638 kcov->t = t; in kcov_ioctl_locked()
639 kcov->remote = true; in kcov_ioctl_locked()
640 kcov->remote_size = remote_arg->area_size; in kcov_ioctl_locked()
647 kcov_disable(t, kcov); in kcov_ioctl_locked()
650 remote = kcov_remote_add(kcov, remote_arg->handles[i]); in kcov_ioctl_locked()
654 kcov_disable(t, kcov); in kcov_ioctl_locked()
663 kcov_disable(t, kcov); in kcov_ioctl_locked()
666 remote = kcov_remote_add(kcov, in kcov_ioctl_locked()
671 kcov_disable(t, kcov); in kcov_ioctl_locked()
678 kcov_get(kcov); in kcov_ioctl_locked()
687 struct kcov *kcov; in kcov_ioctl() local
712 kcov = filep->private_data; in kcov_ioctl()
713 spin_lock_irqsave(&kcov->lock, flags); in kcov_ioctl()
714 res = kcov_ioctl_locked(kcov, cmd, arg); in kcov_ioctl()
715 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_ioctl()
790 data->saved_kcov = t->kcov; in kcov_remote_softirq_start()
815 struct kcov *kcov; in kcov_remote_start() local
856 kcov = remote->kcov; in kcov_remote_start()
858 kcov_get(kcov); in kcov_remote_start()
863 mode = kcov->mode; in kcov_remote_start()
864 sequence = kcov->sequence; in kcov_remote_start()
866 size = kcov->remote_size; in kcov_remote_start()
878 kcov_put(kcov); in kcov_remote_start()
892 kcov_start(t, kcov, size, area, mode, sequence); in kcov_remote_start()
958 struct kcov *kcov; in kcov_remote_stop() local
990 kcov = t->kcov; in kcov_remote_stop()
1001 spin_lock(&kcov->lock); in kcov_remote_stop()
1006 if (sequence == kcov->sequence && kcov->remote) in kcov_remote_stop()
1007 kcov_move_area(kcov->mode, kcov->area, kcov->size, area); in kcov_remote_stop()
1008 spin_unlock(&kcov->lock); in kcov_remote_stop()
1019 kcov_put(kcov); in kcov_remote_stop()