1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <stddef.h> 20 #include <stdint.h> 21 #include <sys/auxv.h> 22 23 // For PAGE_SIZE. 24 #include <sys/user.h> 25 page_size()26inline size_t page_size() { 27 #if defined(PAGE_SIZE) 28 return PAGE_SIZE; 29 #else 30 static const size_t page_size = getauxval(AT_PAGESZ); 31 return page_size; 32 #endif 33 } 34 35 // The maximum page size supported on any Android device. As 36 // of API level 35, this is limited by ART. max_android_page_size()37constexpr size_t max_android_page_size() { 38 #if defined(PAGE_SIZE) 39 return PAGE_SIZE; 40 #else 41 return 16384; 42 #endif 43 } 44 45 // Returns the address of the page containing address 'x'. page_start(uintptr_t x)46inline uintptr_t page_start(uintptr_t x) { 47 return x & ~(page_size() - 1); 48 } 49 50 // Returns the offset of address 'x' in its page. page_offset(uintptr_t x)51inline uintptr_t page_offset(uintptr_t x) { 52 return x & (page_size() - 1); 53 } 54 55 // Returns the address of the next page after address 'x', unless 'x' is 56 // itself at the start of a page. page_end(uintptr_t x)57inline uintptr_t page_end(uintptr_t x) { 58 return page_start(x + page_size() - 1); 59 } 60