Author: andrew
Date: Thu Feb 21 10:11:15 2019
New Revision: 344432
URL: https://svnweb.freebsd.org/changeset/base/344432

Log:
  Allow the kcov buffer to be mmaped multiple times.
  
  After r344391 this restriction is no longer needed.
  
  Sponsored by: DARPA, AFRL

Modified:
  head/sys/kern/kern_kcov.c
  head/tests/sys/kern/kcov.c

Modified: head/sys/kern/kern_kcov.c
==============================================================================
--- head/sys/kern/kern_kcov.c   Thu Feb 21 09:54:57 2019        (r344431)
+++ head/sys/kern/kern_kcov.c   Thu Feb 21 10:11:15 2019        (r344432)
@@ -127,7 +127,6 @@ struct kcov_info {
        size_t          bufsize;        /* (o) */
        kcov_state_t    state;          /* (s) */
        int             mode;           /* (l) */
-       bool            mmap;
 };
 
 /* Prototypes */
@@ -303,7 +302,6 @@ kcov_open(struct cdev *dev, int oflags, int devtype, s
        info->state = KCOV_STATE_OPEN;
        info->thread = NULL;
        info->mode = -1;
-       info->mmap = false;
 
        if ((error = devfs_set_cdevpriv(info, kcov_mmap_cleanup)) != 0)
                kcov_mmap_cleanup(info);
@@ -344,12 +342,10 @@ kcov_mmap_single(struct cdev *dev, vm_ooffset_t *offse
        if ((error = devfs_get_cdevpriv((void **)&info)) != 0)
                return (error);
 
-       if (info->kvaddr == 0 || size / KCOV_ELEMENT_SIZE != info->entries ||
-           info->mmap != false)
+       if (info->kvaddr == 0 || size / KCOV_ELEMENT_SIZE != info->entries)
                return (EINVAL);
 
        vm_object_reference(info->bufobj);
-       info->mmap = true;
        *offset = 0;
        *object = info->bufobj;
        return (0);

Modified: head/tests/sys/kern/kcov.c
==============================================================================
--- head/tests/sys/kern/kcov.c  Thu Feb 21 09:54:57 2019        (r344431)
+++ head/tests/sys/kern/kcov.c  Thu Feb 21 10:11:15 2019        (r344432)
@@ -80,7 +80,7 @@ ATF_TC_BODY(kcov_bufsize, tc)
 ATF_TC_WITHOUT_HEAD(kcov_mmap);
 ATF_TC_BODY(kcov_mmap, tc)
 {
-       void *data;
+       void *data1, *data2;
        int fd;
 
        fd = open_kcov();
@@ -95,12 +95,18 @@ ATF_TC_BODY(kcov_mmap, tc)
            fd, 0) == MAP_FAILED);
        ATF_CHECK(mmap(NULL, 3 * PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
            fd, 0) == MAP_FAILED);
-       ATF_REQUIRE((data = mmap(NULL, 2 * PAGE_SIZE, PROT_READ | PROT_WRITE,
+       ATF_REQUIRE((data1 = mmap(NULL, 2 * PAGE_SIZE, PROT_READ | PROT_WRITE,
            MAP_SHARED, fd, 0)) != MAP_FAILED);
-       ATF_CHECK(mmap(NULL, 2 * PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
-           fd, 0) == MAP_FAILED);
+       ATF_REQUIRE((data2 = mmap(NULL, 2 * PAGE_SIZE, PROT_READ | PROT_WRITE,
+           MAP_SHARED, fd, 0)) != MAP_FAILED);
 
-       munmap(data, 2 * PAGE_SIZE);
+       *(uint64_t *)data1 = 0x123456789abcdeful;
+       ATF_REQUIRE(*(uint64_t *)data2 == 0x123456789abcdefull);
+       *(uint64_t *)data2 = 0xfedcba9876543210ul;
+       ATF_REQUIRE(*(uint64_t *)data1 == 0xfedcba9876543210ull);
+
+       munmap(data1, 2 * PAGE_SIZE);
+       munmap(data2, 2 * PAGE_SIZE);
 
        close(fd);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to