Refactor memory management functions
authorCafe <cafe@not.applicable>
Thu, 6 Jul 2017 00:00:00 +0000 (00:00 +0000)
committerCafe <cafe@not.applicable>
Thu, 6 Jul 2017 19:12:22 +0000 (19:12 +0000)
fuzz.c

diff --git a/fuzz.c b/fuzz.c
index 5fb21a0571f7e6bbb2bfb1e7742c07aea252e23a..1e08e8dd2977d5ac0576422791814ab28038e1c0 100644 (file)
--- a/fuzz.c
+++ b/fuzz.c
@@ -13,7 +13,7 @@
        data.header.id = no; \
        if(ioctl(fd, _IOC(_IOC_READ, 0, 0, sizeof(data)), &data)) { \
                printf("Bad ioctl %d (%s)\n", no, strerror(errno)); \
-               return 1; \
+               exit(1); \
        }
 
 void hexdump(uint8_t* buffer, int size) {
@@ -49,6 +49,52 @@ uint32_t fuzz_rand32() {
        return ((uint32_t*) words)[0];
 }
 
+uint64_t alloc_gpu_pages(int fd, int pages) {
+       struct kbase_uk_mem_alloc alloc = {
+               .va_pages = pages,
+               .commit_pages = pages,
+               .extent = 0,
+               .flags = BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_CPU_WR 
+                      | BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR
+       };
+
+       m_ioctl(fd, alloc, KBASE_FUNC_MEM_ALLOC);
+
+       return alloc.gpu_va;
+}
+
+uint8_t* mmap_gpu(int fd, uint64_t addr, int page_count) {
+       uint8_t* buffer = mmap(NULL, page_count << PAGE_SHIFT,
+                               PROT_READ | PROT_WRITE, MAP_SHARED,
+                               fd, addr);
+
+       if(buffer == MAP_FAILED) {
+               printf("Buffer map failed (%s)\n", strerror(errno));
+               exit(1);
+       }
+
+       return buffer;
+}
+
+void sync_gpu(int fd, uint8_t* cpu, uint64_t gpu, int pages) {
+       struct basep_syncset base_sset = {
+               .mem_handle = { .basep = { .handle = gpu } },
+               .user_addr = (u32) cpu,
+               .size = pages << PAGE_SHIFT,
+               .type = BASE_SYNCSET_OP_MSYNC
+       };
+
+       struct base_syncset sset = {
+               .basep_sset = base_sset
+       };
+
+       struct kbase_uk_sync_now sync = {
+               .sset = sset
+       };
+
+       m_ioctl(fd, sync, KBASE_FUNC_SYNC);
+}
+
 int atom_count = 0;
 
 struct job_chain_frag_header {
@@ -64,29 +110,10 @@ struct job_chain_frag_header {
 }__attribute__((packed));
 
 int job_chain(int fd) {
-       /* Allocate GPU memory */
-
-       struct kbase_uk_mem_alloc alloc = {
-               .va_pages = 1,
-               .commit_pages = 1,
-               .extent = 0,
-               .flags = BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_CPU_WR 
-                      | BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR
-       };
+       uint64_t descriptor = alloc_gpu_pages(fd, 1);
+       uint8_t* buffer = mmap_gpu(fd, descriptor, 1);
 
-       m_ioctl(fd, alloc, KBASE_FUNC_MEM_ALLOC);
-
-       /* Map some data there */
-       uint8_t* buffer = mmap(NULL, alloc.va_pages << PAGE_SHIFT,
-                               PROT_READ | PROT_WRITE, MAP_SHARED,
-                               fd, alloc.gpu_va);
-
-       if(buffer == MAP_FAILED) {
-               printf("Buffer map failed (%s)\n", strerror(errno));
-               return -1;
-       }
-
-       memset(buffer, 0, alloc.va_pages << PAGE_SHIFT);
+       memset(buffer, 0, 1 << PAGE_SHIFT);
 
        struct job_chain_frag_header header = {
                .status_code = BASE_JD_EVENT_STOPPED,
@@ -102,24 +129,7 @@ int job_chain(int fd) {
 
        memcpy(buffer, &header, sizeof(header));
 
-       /* Sync the buffer before sending it off */
-
-       struct basep_syncset base_sset = {
-               .mem_handle = { .basep = { .handle = alloc.gpu_va } },
-               .user_addr = (u32) buffer,
-               .size = PAGE_SIZE,
-               .type = BASE_SYNCSET_OP_MSYNC
-       };
-
-       struct base_syncset sset = {
-               .basep_sset = base_sset
-       };
-
-       struct kbase_uk_sync_now sync = {
-               .sset = sset
-       };
-
-       m_ioctl(fd, sync, KBASE_FUNC_SYNC);
+       sync_gpu(fd, buffer, descriptor, 1);
 
        /* Send a test job */
 
@@ -129,7 +139,7 @@ int job_chain(int fd) {
        };
 
        struct base_jd_atom_v2 job = {
-               .jc = alloc.gpu_va,
+               .jc = descriptor,
                .extres_list = NULL,
                .nr_extres = 0,
                .core_req = BASE_JD_REQ_FS,
@@ -161,7 +171,7 @@ int job_chain(int fd) {
 
        /* Free GPU memory */
 
-       struct kbase_uk_mem_free gfree = { .gpu_addr = alloc.gpu_va };
+       struct kbase_uk_mem_free gfree = { .gpu_addr = descriptor };
        m_ioctl(fd, gfree, KBASE_FUNC_MEM_FREE);
 
        return 0;