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) {
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		char buf[ASHMEM_NAME_LEN];
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