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()
346 static void kcov_start(struct task_struct *t, struct kcov *kcov, in kcov_start() argument
351 t->kcov = kcov; in kcov_start()
365 t->kcov = NULL; in kcov_stop()
383 static void kcov_reset(struct kcov *kcov) in kcov_reset() argument
385 kcov->t = NULL; in kcov_reset()
386 kcov->mode = KCOV_MODE_INIT; in kcov_reset()
387 kcov->remote = false; in kcov_reset()
388 kcov->remote_size = 0; in kcov_reset()
389 kcov->sequence++; in kcov_reset()
392 static void kcov_remote_reset(struct kcov *kcov) in kcov_remote_reset() argument
401 if (remote->kcov != kcov) in kcov_remote_reset()
407 kcov_reset(kcov); in kcov_remote_reset()
411 static void kcov_disable(struct task_struct *t, struct kcov *kcov) in kcov_disable() argument
414 if (kcov->remote) in kcov_disable()
415 kcov_remote_reset(kcov); in kcov_disable()
417 kcov_reset(kcov); in kcov_disable()
420 static void kcov_get(struct kcov *kcov) in kcov_get() argument
422 refcount_inc(&kcov->refcount); in kcov_get()
425 static void kcov_put(struct kcov *kcov) in kcov_put() argument
427 if (refcount_dec_and_test(&kcov->refcount)) { in kcov_put()
428 kcov_remote_reset(kcov); in kcov_put()
429 vfree(kcov->area); in kcov_put()
430 kfree(kcov); in kcov_put()
436 struct kcov *kcov; in kcov_task_exit() local
439 kcov = t->kcov; in kcov_task_exit()
440 if (kcov == NULL) in kcov_task_exit()
443 spin_lock_irqsave(&kcov->lock, flags); in kcov_task_exit()
444 kcov_debug("t = %px, kcov->t = %px\n", t, kcov->t); in kcov_task_exit()
467 if (WARN_ON(kcov->t != t)) { in kcov_task_exit()
468 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_task_exit()
472 kcov_disable(t, kcov); in kcov_task_exit()
473 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_task_exit()
474 kcov_put(kcov); in kcov_task_exit()
480 struct kcov *kcov = vma->vm_file->private_data; in kcov_mmap() local
485 spin_lock_irqsave(&kcov->lock, flags); in kcov_mmap()
486 size = kcov->size * sizeof(unsigned long); in kcov_mmap()
487 if (kcov->area == NULL || vma->vm_pgoff != 0 || in kcov_mmap()
492 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_mmap()
495 page = vmalloc_to_page(kcov->area + off); in kcov_mmap()
504 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_mmap()
510 struct kcov *kcov; in kcov_open() local
512 kcov = kzalloc(sizeof(*kcov), GFP_KERNEL); in kcov_open()
513 if (!kcov) in kcov_open()
515 kcov->mode = KCOV_MODE_DISABLED; in kcov_open()
516 kcov->sequence = 1; in kcov_open()
517 refcount_set(&kcov->refcount, 1); in kcov_open()
518 spin_lock_init(&kcov->lock); in kcov_open()
519 filep->private_data = kcov; in kcov_open()
548 static void kcov_fault_in_area(struct kcov *kcov) in kcov_fault_in_area() argument
551 unsigned long *area = kcov->area; in kcov_fault_in_area()
554 for (offset = 0; offset < kcov->size; offset += stride) in kcov_fault_in_area()
575 static int kcov_ioctl_locked(struct kcov *kcov, unsigned int cmd, in kcov_ioctl_locked() argument
593 if (kcov->mode != KCOV_MODE_INIT || !kcov->area) in kcov_ioctl_locked()
596 if (kcov->t != NULL || t->kcov != NULL) in kcov_ioctl_locked()
601 kcov_fault_in_area(kcov); in kcov_ioctl_locked()
602 kcov->mode = mode; in kcov_ioctl_locked()
603 kcov_start(t, kcov, kcov->size, kcov->area, kcov->mode, in kcov_ioctl_locked()
604 kcov->sequence); in kcov_ioctl_locked()
605 kcov->t = t; in kcov_ioctl_locked()
607 kcov_get(kcov); in kcov_ioctl_locked()
612 if (unused != 0 || current->kcov != kcov) in kcov_ioctl_locked()
615 if (WARN_ON(kcov->t != t)) in kcov_ioctl_locked()
617 kcov_disable(t, kcov); in kcov_ioctl_locked()
618 kcov_put(kcov); in kcov_ioctl_locked()
621 if (kcov->mode != KCOV_MODE_INIT || !kcov->area) in kcov_ioctl_locked()
624 if (kcov->t != NULL || t->kcov != NULL) in kcov_ioctl_locked()
632 kcov->mode = mode; in kcov_ioctl_locked()
633 t->kcov = kcov; in kcov_ioctl_locked()
634 kcov->t = t; in kcov_ioctl_locked()
635 kcov->remote = true; in kcov_ioctl_locked()
636 kcov->remote_size = remote_arg->area_size; in kcov_ioctl_locked()
643 kcov_disable(t, kcov); in kcov_ioctl_locked()
646 remote = kcov_remote_add(kcov, remote_arg->handles[i]); in kcov_ioctl_locked()
650 kcov_disable(t, kcov); in kcov_ioctl_locked()
659 kcov_disable(t, kcov); in kcov_ioctl_locked()
662 remote = kcov_remote_add(kcov, in kcov_ioctl_locked()
667 kcov_disable(t, kcov); in kcov_ioctl_locked()
674 kcov_get(kcov); in kcov_ioctl_locked()
683 struct kcov *kcov; in kcov_ioctl() local
691 kcov = filep->private_data; in kcov_ioctl()
707 spin_lock_irqsave(&kcov->lock, flags); in kcov_ioctl()
708 if (kcov->mode != KCOV_MODE_DISABLED) { in kcov_ioctl()
709 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_ioctl()
713 kcov->area = area; in kcov_ioctl()
714 kcov->size = size; in kcov_ioctl()
715 kcov->mode = KCOV_MODE_INIT; in kcov_ioctl()
716 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_ioctl()
740 spin_lock_irqsave(&kcov->lock, flags); in kcov_ioctl()
741 res = kcov_ioctl_locked(kcov, cmd, arg); in kcov_ioctl()
742 spin_unlock_irqrestore(&kcov->lock, flags); in kcov_ioctl()
816 data->saved_kcov = t->kcov; in kcov_remote_softirq_start()
841 struct kcov *kcov; in kcov_remote_start() local
883 kcov = remote->kcov; in kcov_remote_start()
885 kcov_get(kcov); in kcov_remote_start()
890 mode = kcov->mode; in kcov_remote_start()
891 sequence = kcov->sequence; in kcov_remote_start()
893 size = kcov->remote_size; in kcov_remote_start()
906 kcov_put(kcov); in kcov_remote_start()
919 kcov_start(t, kcov, size, area, mode, sequence); in kcov_remote_start()
985 struct kcov *kcov; in kcov_remote_stop() local
1017 kcov = t->kcov; in kcov_remote_stop()
1028 spin_lock(&kcov->lock); in kcov_remote_stop()
1033 if (sequence == kcov->sequence && kcov->remote) in kcov_remote_stop()
1034 kcov_move_area(kcov->mode, kcov->area, kcov->size, area); in kcov_remote_stop()
1035 spin_unlock(&kcov->lock); in kcov_remote_stop()
1046 kcov_put(kcov); in kcov_remote_stop()