1 #pragma once 2 3 /* 4 * Copyright (C) 2017 The Android Open Source Project 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 #include "common/vsoc/lib/typed_region_view.h" 20 21 namespace vsoc { 22 23 /** 24 * Adds methods to create file descriptor scoped permissions. Just like 25 * TypedRegionView it can be directly constructed or subclassed. 26 * 27 * The Layout type must (in addition to requirements for TypedRegionView) also 28 * provide a nested type for the layout of the managed region. 29 */ 30 template <typename View, typename Layout> 31 class ManagerRegionView : public TypedRegionView<View, Layout> { 32 public: 33 ManagerRegionView() = default; 34 /** 35 * Creates a fd scoped permission on the managed region. 36 * 37 * The managed_region_fd is in/out parameter that can be a not yet open file 38 * descriptor. If the fd is not open yet it will open the managed region 39 * device and then create the permission. If the function returns EBUSY 40 * (meaning that we lost the race to acquire the memory) the same fd can (and 41 * is expected to) be used in a subsequent call to create a permission on 42 * another memory location. 43 * 44 * On success returns an open fd with the requested permission asociated to 45 * it. If another thread/process acquired ownership of *owner_ptr before this 46 * one returns -EBUSY, returns a different negative number otherwise. 47 */ CreateFdScopedPermission(uint32_t * owner_ptr,uint32_t owned_val,uint32_t begin_offset,uint32_t end_offset)48 int CreateFdScopedPermission(uint32_t* owner_ptr, uint32_t owned_val, 49 uint32_t begin_offset, 50 uint32_t end_offset) { 51 return this->control_->CreateFdScopedPermission( 52 Layout::ManagedRegion::region_name, 53 this->pointer_to_region_offset(owner_ptr), owned_val, begin_offset, 54 end_offset); 55 } 56 }; 57 58 } // namespace vsoc 59