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