1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * you may not use this file except in compliance with the License. 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * You may obtain a copy of the License at 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * See the License for the specific language governing permissions and 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * limitations under the License. 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Implementation of the user-space ashmem API for devices, which have our 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ashmem-enabled kernel. See ashmem-sim.c for the "fake" tmp-based version, 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * used by the simulator. 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h> 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/ioctl.h> 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h> 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <linux/ashmem.h> 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/ashmem.h> 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ASHMEM_DEVICE "/dev/ashmem" 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ashmem_create_region - creates a new ashmem region and returns the file 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * descriptor, or <0 on error 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * `name' is an optional label to give the region (visible in /proc/pid/maps) 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * `size' is the size of the region, in page-aligned bytes 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ashmem_create_region(const char *name, size_t size) 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd, ret; 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = open(ASHMEM_DEVICE, O_RDWR); 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fd < 0) 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return fd; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (name) { 51b81570124713939e33ff15ada36704c3409e7fe3Jin Wei char buf[ASHMEM_NAME_LEN] = {0}; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strlcpy(buf, name, sizeof(buf)); 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = ioctl(fd, ASHMEM_SET_NAME, buf); 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret < 0) 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto error; 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = ioctl(fd, ASHMEM_SET_SIZE, size); 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret < 0) 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto error; 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return fd; 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecterror: 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(fd); 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ret; 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ashmem_set_prot_region(int fd, int prot) 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ioctl(fd, ASHMEM_SET_PROT_MASK, prot); 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ashmem_pin_region(int fd, size_t offset, size_t len) 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct ashmem_pin pin = { offset, len }; 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ioctl(fd, ASHMEM_PIN, &pin); 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ashmem_unpin_region(int fd, size_t offset, size_t len) 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct ashmem_pin pin = { offset, len }; 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return ioctl(fd, ASHMEM_UNPIN, &pin); 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 867be52b1a0e052635b361f9d8c186adbbcc981b7eBjorn Bringert 877be52b1a0e052635b361f9d8c186adbbcc981b7eBjorn Bringertint ashmem_get_size_region(int fd) 887be52b1a0e052635b361f9d8c186adbbcc981b7eBjorn Bringert{ 897be52b1a0e052635b361f9d8c186adbbcc981b7eBjorn Bringert return ioctl(fd, ASHMEM_GET_SIZE, NULL); 907be52b1a0e052635b361f9d8c186adbbcc981b7eBjorn Bringert} 91