1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <sys/mman.h> 18 19 #include <gtest/gtest.h> 20 21 #include <ion/ion.h> 22 23 #include "ion_test_fixture.h" 24 25 class Map : public IonAllHeapsTest { 26 }; 27 28 TEST_F(Map, MapHandle) 29 { 30 static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024}; 31 for (unsigned int heapMask : m_allHeaps) { 32 for (size_t size : allocationSizes) { 33 SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 34 SCOPED_TRACE(::testing::Message() << "size " << size); 35 ion_user_handle_t handle = 0; 36 37 ASSERT_EQ(0, ion_alloc(m_ionFd, size, 0, heapMask, 0, &handle)); 38 ASSERT_TRUE(handle != 0); 39 40 int map_fd = -1; 41 unsigned char *ptr = NULL; 42 ASSERT_EQ(0, ion_map(m_ionFd, handle, size, PROT_READ | PROT_WRITE, MAP_SHARED, 0, &ptr, &map_fd)); 43 ASSERT_TRUE(ptr != NULL); 44 ASSERT_GE(map_fd, 0); 45 46 ASSERT_EQ(0, close(map_fd)); 47 48 ASSERT_EQ(0, ion_free(m_ionFd, handle)); 49 50 memset(ptr, 0xaa, size); 51 52 ASSERT_EQ(0, munmap(ptr, size)); 53 } 54 } 55 } 56 57 TEST_F(Map, MapFd) 58 { 59 static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024}; 60 for (unsigned int heapMask : m_allHeaps) { 61 for (size_t size : allocationSizes) { 62 SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 63 SCOPED_TRACE(::testing::Message() << "size " << size); 64 int map_fd = -1; 65 66 ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, 0, &map_fd)); 67 ASSERT_GE(map_fd, 0); 68 69 void *ptr; 70 ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); 71 ASSERT_TRUE(ptr != NULL); 72 73 ASSERT_EQ(0, close(map_fd)); 74 75 memset(ptr, 0xaa, size); 76 77 ASSERT_EQ(0, munmap(ptr, size)); 78 } 79 } 80 } 81 82 TEST_F(Map, MapOffset) 83 { 84 for (unsigned int heapMask : m_allHeaps) { 85 SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 86 int map_fd = -1; 87 88 ASSERT_EQ(0, ion_alloc_fd(m_ionFd, PAGE_SIZE * 2, 0, heapMask, 0, &map_fd)); 89 ASSERT_GE(map_fd, 0); 90 91 unsigned char *ptr; 92 ptr = (unsigned char *)mmap(NULL, PAGE_SIZE * 2, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); 93 ASSERT_TRUE(ptr != NULL); 94 95 memset(ptr, 0, PAGE_SIZE); 96 memset(ptr + PAGE_SIZE, 0xaa, PAGE_SIZE); 97 98 ASSERT_EQ(0, munmap(ptr, PAGE_SIZE * 2)); 99 100 ptr = (unsigned char *)mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, PAGE_SIZE); 101 ASSERT_TRUE(ptr != NULL); 102 103 ASSERT_EQ(ptr[0], 0xaa); 104 ASSERT_EQ(ptr[PAGE_SIZE - 1], 0xaa); 105 106 ASSERT_EQ(0, munmap(ptr, PAGE_SIZE)); 107 108 ASSERT_EQ(0, close(map_fd)); 109 } 110 } 111 112 TEST_F(Map, MapCached) 113 { 114 static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024}; 115 for (unsigned int heapMask : m_allHeaps) { 116 for (size_t size : allocationSizes) { 117 SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 118 SCOPED_TRACE(::testing::Message() << "size " << size); 119 int map_fd = -1; 120 unsigned int flags = ION_FLAG_CACHED; 121 122 ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, flags, &map_fd)); 123 ASSERT_GE(map_fd, 0); 124 125 void *ptr; 126 ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); 127 ASSERT_TRUE(ptr != NULL); 128 129 ASSERT_EQ(0, close(map_fd)); 130 131 memset(ptr, 0xaa, size); 132 133 ASSERT_EQ(0, munmap(ptr, size)); 134 } 135 } 136 } 137 138 TEST_F(Map, MapCachedNeedsSync) 139 { 140 static const size_t allocationSizes[] = {4*1024, 64*1024, 1024*1024, 2*1024*1024}; 141 for (unsigned int heapMask : m_allHeaps) { 142 for (size_t size : allocationSizes) { 143 SCOPED_TRACE(::testing::Message() << "heap " << heapMask); 144 SCOPED_TRACE(::testing::Message() << "size " << size); 145 int map_fd = -1; 146 unsigned int flags = ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC; 147 148 ASSERT_EQ(0, ion_alloc_fd(m_ionFd, size, 0, heapMask, flags, &map_fd)); 149 ASSERT_GE(map_fd, 0); 150 151 void *ptr; 152 ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, 0); 153 ASSERT_TRUE(ptr != NULL); 154 155 ASSERT_EQ(0, close(map_fd)); 156 157 memset(ptr, 0xaa, size); 158 159 ASSERT_EQ(0, munmap(ptr, size)); 160 } 161 } 162 } 163