13079100878a2595be644d866e67c12a9de620fd5Martijn Coenen/* 23079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * Copyright (C) 2016 The Android Open Source Project 33079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * 43079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * Licensed under the Apache License, Version 2.0 (the "License"); 53079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * you may not use this file except in compliance with the License. 63079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * You may obtain a copy of the License at 73079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * 83079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * http://www.apache.org/licenses/LICENSE-2.0 93079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * 103079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * Unless required by applicable law or agreed to in writing, software 113079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * distributed under the License is distributed on an "AS IS" BASIS, 123079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * See the License for the specific language governing permissions and 143079100878a2595be644d866e67c12a9de620fd5Martijn Coenen * limitations under the License. 153079100878a2595be644d866e67c12a9de620fd5Martijn Coenen */ 163079100878a2595be644d866e67c12a9de620fd5Martijn Coenen 173079100878a2595be644d866e67c12a9de620fd5Martijn Coenen#include "AshmemMapper.h" 183079100878a2595be644d866e67c12a9de620fd5Martijn Coenen 193079100878a2595be644d866e67c12a9de620fd5Martijn Coenen#include <sys/mman.h> 203079100878a2595be644d866e67c12a9de620fd5Martijn Coenen 213079100878a2595be644d866e67c12a9de620fd5Martijn Coenen#include "AshmemMemory.h" 223079100878a2595be644d866e67c12a9de620fd5Martijn Coenen 233079100878a2595be644d866e67c12a9de620fd5Martijn Coenennamespace android { 243079100878a2595be644d866e67c12a9de620fd5Martijn Coenennamespace hidl { 253079100878a2595be644d866e67c12a9de620fd5Martijn Coenennamespace memory { 263079100878a2595be644d866e67c12a9de620fd5Martijn Coenennamespace V1_0 { 273079100878a2595be644d866e67c12a9de620fd5Martijn Coenennamespace implementation { 283079100878a2595be644d866e67c12a9de620fd5Martijn Coenen 293079100878a2595be644d866e67c12a9de620fd5Martijn Coenen// Methods from ::android::hidl::memory::V1_0::IMapper follow. 30d272cb9e881c0aa23e4964f101131ab68affd85dMartijn CoenenReturn<sp<IMemory>> AshmemMapper::mapMemory(const hidl_memory& mem) { 313079100878a2595be644d866e67c12a9de620fd5Martijn Coenen if (mem.handle()->numFds == 0) { 32d272cb9e881c0aa23e4964f101131ab68affd85dMartijn Coenen return nullptr; 333079100878a2595be644d866e67c12a9de620fd5Martijn Coenen } 343079100878a2595be644d866e67c12a9de620fd5Martijn Coenen 353079100878a2595be644d866e67c12a9de620fd5Martijn Coenen int fd = mem.handle()->data[0]; 363079100878a2595be644d866e67c12a9de620fd5Martijn Coenen void* data = mmap(0, mem.size(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 373079100878a2595be644d866e67c12a9de620fd5Martijn Coenen if (data == MAP_FAILED) { 383079100878a2595be644d866e67c12a9de620fd5Martijn Coenen // mmap never maps at address zero without MAP_FIXED, so we can avoid 393079100878a2595be644d866e67c12a9de620fd5Martijn Coenen // exposing clients to MAP_FAILED. 40d272cb9e881c0aa23e4964f101131ab68affd85dMartijn Coenen return nullptr; 413079100878a2595be644d866e67c12a9de620fd5Martijn Coenen } 423079100878a2595be644d866e67c12a9de620fd5Martijn Coenen 43d272cb9e881c0aa23e4964f101131ab68affd85dMartijn Coenen return new AshmemMemory(mem, data); 443079100878a2595be644d866e67c12a9de620fd5Martijn Coenen} 453079100878a2595be644d866e67c12a9de620fd5Martijn Coenen 463079100878a2595be644d866e67c12a9de620fd5Martijn Coenen} // namespace implementation 473079100878a2595be644d866e67c12a9de620fd5Martijn Coenen} // namespace V1_0 483079100878a2595be644d866e67c12a9de620fd5Martijn Coenen} // namespace memory 493079100878a2595be644d866e67c12a9de620fd5Martijn Coenen} // namespace hidl 503079100878a2595be644d866e67c12a9de620fd5Martijn Coenen} // namespace android 51