12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 164a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_IMAGE_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_IMAGE_H_ 194a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 204a289ed61242964b921434de7d375f46480472a1Brian Carlstrom#include <string.h> 214a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 224a289ed61242964b921434de7d375f46480472a1Brian Carlstrom#include "globals.h" 232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object.h" 244a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 254a289ed61242964b921434de7d375f46480472a1Brian Carlstromnamespace art { 264a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 2754d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartierclass ArtField; 2854d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartierclass ArtMethod; 2954d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier 3054d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartierclass ArtMethodVisitor { 3154d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier public: 3254d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier virtual ~ArtMethodVisitor() {} 3354d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier 3454d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier virtual void Visit(ArtMethod* method) = 0; 3554d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier}; 3654d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier 3754d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartierclass ArtFieldVisitor { 3854d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier public: 3954d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier virtual ~ArtFieldVisitor() {} 4054d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier 4154d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier virtual void Visit(ArtField* method) = 0; 4254d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier}; 4354d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier 44e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierclass PACKED(4) ImageSection { 45e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier public: 46e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ImageSection() : offset_(0), size_(0) { } 47e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ImageSection(uint32_t offset, uint32_t size) : offset_(offset), size_(size) { } 48e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ImageSection(const ImageSection& section) = default; 49e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ImageSection& operator=(const ImageSection& section) = default; 50e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 51e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier uint32_t Offset() const { 52e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier return offset_; 53e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier } 54e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 55e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier uint32_t Size() const { 56e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier return size_; 57e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier } 58e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 59e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier uint32_t End() const { 60e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier return Offset() + Size(); 61e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier } 62e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 63e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier bool Contains(uint64_t offset) const { 64e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier return offset - offset_ < size_; 65e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier } 66e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 67e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier private: 68e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier uint32_t offset_; 69e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier uint32_t size_; 70e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier}; 71e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 724a289ed61242964b921434de7d375f46480472a1Brian Carlstrom// header of image files written by ImageWriter, read and validated by Space. 73df1ce91ba97bc79a0637e5504b39318fb1c9f577Ian Rogersclass PACKED(4) ImageHeader { 744a289ed61242964b921434de7d375f46480472a1Brian Carlstrom public: 75ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier enum StorageMode : uint32_t { 76ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier kStorageModeUncompressed, 77ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier kStorageModeLZ4, 78167e638ffd46186ef4fa26d1c0b6c7e00ed51ccbMathieu Chartier kStorageModeLZ4HC, 79ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier kStorageModeCount, // Number of elements in enum. 80ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier }; 81ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier static constexpr StorageMode kDefaultStorageMode = kStorageModeUncompressed; 82ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier 83aa50d3a01a4137cd89c152be5487fed23683d0ffSebastien Hertz ImageHeader() 84ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier : image_begin_(0U), 85ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier image_size_(0U), 86ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier oat_checksum_(0U), 87ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier oat_file_begin_(0U), 88ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier oat_data_begin_(0U), 89ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier oat_data_end_(0U), 90ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier oat_file_end_(0U), 91fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier boot_image_begin_(0U), 92fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier boot_image_size_(0U), 93fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier boot_oat_begin_(0U), 94fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier boot_oat_size_(0U), 95ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier patch_delta_(0), 96ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier image_roots_(0U), 97ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier pointer_size_(0U), 98ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier compile_pic_(0), 99fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier is_pic_(0), 100ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier storage_mode_(kDefaultStorageMode), 101ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier data_size_(0) {} 1024a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 10330fab40ee5a07af6b8c3b6b0e9438071695a57f4Ian Rogers ImageHeader(uint32_t image_begin, 104763a31ed7a2bfad22a9cb07f5301a71c0f97ca49Mathieu Chartier uint32_t image_size, 105e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ImageSection* sections, 106e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom uint32_t image_roots, 107e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom uint32_t oat_checksum, 108700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom uint32_t oat_file_begin, 109700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom uint32_t oat_data_begin, 110700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom uint32_t oat_data_end, 11146774767fcf7780d1455e755729198648d08742eIgor Murashkin uint32_t oat_file_end, 112fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t boot_image_begin, 113fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t boot_image_size, 114fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t boot_oat_begin, 115fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t boot_oat_size, 116e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier uint32_t pointer_size, 117ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier bool compile_pic, 118fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier bool is_pic, 119ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier StorageMode storage_mode, 120ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier size_t data_size); 1214a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 12268708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom bool IsValid() const; 12368708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom const char* GetMagic() const; 12478128a63b2615744760b7f8ab83df9764a5d4a95Brian Carlstrom 12513735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* GetImageBegin() const { 12613735955f39b3b304c37d2b2840663c131262c18Ian Rogers return reinterpret_cast<uint8_t*>(image_begin_); 127e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom } 128e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 12931e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier size_t GetImageSize() const { 13031e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier return static_cast<uint32_t>(image_size_); 13131e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier } 13231e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier 133e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom uint32_t GetOatChecksum() const { 134e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom return oat_checksum_; 135e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom } 136e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 137a85b8376740641f13dc078aea6be94d15a800803Brian Carlstrom void SetOatChecksum(uint32_t oat_checksum) { 138a85b8376740641f13dc078aea6be94d15a800803Brian Carlstrom oat_checksum_ = oat_checksum; 139a85b8376740641f13dc078aea6be94d15a800803Brian Carlstrom } 140a85b8376740641f13dc078aea6be94d15a800803Brian Carlstrom 141df0a8275abadc96a6363b59f31c64981571d6ed9Mathieu Chartier // The location that the oat file was expected to be when the image was created. The actual 142df0a8275abadc96a6363b59f31c64981571d6ed9Mathieu Chartier // oat file may be at a different location for application images. 14313735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* GetOatFileBegin() const { 14413735955f39b3b304c37d2b2840663c131262c18Ian Rogers return reinterpret_cast<uint8_t*>(oat_file_begin_); 145e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom } 146e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 14713735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* GetOatDataBegin() const { 14813735955f39b3b304c37d2b2840663c131262c18Ian Rogers return reinterpret_cast<uint8_t*>(oat_data_begin_); 149700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom } 150700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 15113735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* GetOatDataEnd() const { 15213735955f39b3b304c37d2b2840663c131262c18Ian Rogers return reinterpret_cast<uint8_t*>(oat_data_end_); 153700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom } 154700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 15513735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t* GetOatFileEnd() const { 15613735955f39b3b304c37d2b2840663c131262c18Ian Rogers return reinterpret_cast<uint8_t*>(oat_file_end_); 1574a289ed61242964b921434de7d375f46480472a1Brian Carlstrom } 1584a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 159e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier uint32_t GetPointerSize() const { 160e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier return pointer_size_; 161e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier } 162e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 16353cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light off_t GetPatchDelta() const { 16453cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light return patch_delta_; 16553cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light } 16653cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light 1679583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray static std::string GetOatLocationFromImageLocation(const std::string& image) { 1689583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray std::string oat_filename = image; 1699583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray if (oat_filename.length() <= 3) { 170b9beb2e2efb6a204a69ca660d478b45f851e8f09Ian Rogers oat_filename += ".oat"; 1719583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray } else { 1729583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray oat_filename.replace(oat_filename.length() - 3, 3, "oat"); 1739583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray } 1749583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray return oat_filename; 1759583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray } 1769583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray 177e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier enum ImageMethod { 1781984651929744dd603fd082e23eacd877b9bc177Ian Rogers kResolutionMethod, 17988474b416eb257078e590bf9bc7957cee604a186Jeff Hao kImtConflictMethod, 1802d2621a1463d2f3f03fa73503fa42e43657cdcfcMathieu Chartier kImtUnimplementedMethod, 181ff1ed4770bf7ff024a807b9f909b1a26abb78341Ian Rogers kCalleeSaveMethod, 1824f0d07c783afef89703dce32c94440fc8621a29bIan Rogers kRefsOnlySaveMethod, 1834f0d07c783afef89703dce32c94440fc8621a29bIan Rogers kRefsAndArgsSaveMethod, 184e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kImageMethodsCount, // Number of elements in enum. 185e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier }; 186e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 187e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier enum ImageRoot { 18858ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom kDexCaches, 18934f426c49ac2de8cea70acef6b9ecdd8e62209d2Brian Carlstrom kClassRoots, 190161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom kImageRootsMax, 191161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom }; 192161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom 193e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier enum ImageSections { 194e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kSectionObjects, 195e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kSectionArtFields, 196e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kSectionArtMethods, 197cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier kSectionRuntimeMethods, 198df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko kSectionImTables, 199cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier kSectionIMTConflictTables, 20005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko kSectionDexCacheArrays, 201d39645e22b8db1767cf64dc1200a9e4b2f939ed2Mathieu Chartier kSectionInternedStrings, 202208a5cb383dd9dcd3461f89b74af5df67dc8d794Mathieu Chartier kSectionClassTable, 203e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kSectionImageBitmap, 204e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier kSectionCount, // Number of elements in enum. 205e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier }; 206e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 207e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ArtMethod* GetImageMethod(ImageMethod index) const; 208e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier void SetImageMethod(ImageMethod index, ArtMethod* method); 209e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 210e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier const ImageSection& GetImageSection(ImageSections index) const; 211cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier 212e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier const ImageSection& GetMethodsSection() const { 213e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier return GetImageSection(kSectionArtMethods); 214e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier } 215e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 216cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier const ImageSection& GetRuntimeMethodsSection() const { 217cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier return GetImageSection(kSectionRuntimeMethods); 218cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier } 219cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier 220cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier const ImageSection& GetFieldsSection() const { 221cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier return GetImageSection(ImageHeader::kSectionArtFields); 222cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier } 223cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier 2244a26f17b055cadc949c3e9fdfa637fe5656339d9Mathieu Chartier template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 2252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Object* GetImageRoot(ImageRoot image_root) const 22690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 2274a26f17b055cadc949c3e9fdfa637fe5656339d9Mathieu Chartier 2284a26f17b055cadc949c3e9fdfa637fe5656339d9Mathieu Chartier template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier> 2292cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi mirror::ObjectArray<mirror::Object>* GetImageRoots() const 23090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 231aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom 23253cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light void RelocateImage(off_t delta); 233fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier void RelocateImageMethods(off_t delta); 234fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier void RelocateImageObjects(off_t delta); 23553cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light 23646774767fcf7780d1455e755729198648d08742eIgor Murashkin bool CompilePic() const { 23746774767fcf7780d1455e755729198648d08742eIgor Murashkin return compile_pic_ != 0; 23846774767fcf7780d1455e755729198648d08742eIgor Murashkin } 23946774767fcf7780d1455e755729198648d08742eIgor Murashkin 240fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier bool IsPic() const { 241fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier return is_pic_ != 0; 242fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier } 243fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 244fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t GetBootImageBegin() const { 245fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier return boot_image_begin_; 246fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier } 247fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 248fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t GetBootImageSize() const { 249fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier return boot_image_size_; 250fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier } 251fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 252fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t GetBootOatBegin() const { 253fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier return boot_oat_begin_; 254fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier } 255fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 256fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t GetBootOatSize() const { 257fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier return boot_oat_size_; 258fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier } 259fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 260ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier StorageMode GetStorageMode() const { 261ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier return storage_mode_; 262ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier } 263ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier 264ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier uint64_t GetDataSize() const { 265ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier return data_size_; 266ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier } 267ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier 268fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier bool IsAppImage() const { 269fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier // App images currently require a boot image, if the size is non zero then it is an app image 270fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier // header. 271fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier return boot_image_size_ != 0u; 272fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier } 273fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 274cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier // Visit ArtMethods in the section starting at base. Includes runtime methods. 275cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier // TODO: Delete base parameter if it is always equal to GetImageBegin. 276cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier void VisitPackedArtMethods(ArtMethodVisitor* visitor, uint8_t* base, size_t pointer_size) const; 277cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier 278cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier // Visit ArtMethods in the section starting at base. 279cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier // TODO: Delete base parameter if it is always equal to GetImageBegin. 280cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier void VisitPackedArtFields(ArtFieldVisitor* visitor, uint8_t* base) const; 281cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier 282cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier template <typename Visitor> 283df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko void VisitPackedImTables(const Visitor& visitor, 284df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko uint8_t* base, 285df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko size_t pointer_size) const; 286df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko 287df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko template <typename Visitor> 288cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier void VisitPackedImtConflictTables(const Visitor& visitor, 289cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier uint8_t* base, 290cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier size_t pointer_size) const; 291cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier 29253cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light private: 29313735955f39b3b304c37d2b2840663c131262c18Ian Rogers static const uint8_t kImageMagic[4]; 29413735955f39b3b304c37d2b2840663c131262c18Ian Rogers static const uint8_t kImageVersion[4]; 2954a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 29613735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t magic_[4]; 29713735955f39b3b304c37d2b2840663c131262c18Ian Rogers uint8_t version_[4]; 298a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom 299700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // Required base address for mapping the image. 30030fab40ee5a07af6b8c3b6b0e9438071695a57f4Ian Rogers uint32_t image_begin_; 301e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 30231e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier // Image size, not page aligned. 30331e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier uint32_t image_size_; 30431e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier 305700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // Checksum of the oat file we link to for load time sanity check. 306e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom uint32_t oat_checksum_; 307e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 308700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // Start address for oat file. Will be before oat_data_begin_ for .so files. 309700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom uint32_t oat_file_begin_; 310700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 311700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // Required oat address expected by image Method::GetCode() pointers. 312700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom uint32_t oat_data_begin_; 313700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom 314700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // End of oat data address range for this image file. 315700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom uint32_t oat_data_end_; 316e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 317700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // End of oat file address range. will be after oat_data_end_ for 318700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // .so files. Used for positioning a following alloc spaces. 319700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom uint32_t oat_file_end_; 320161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom 321fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier // Boot image begin and end (app image headers only). 322fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t boot_image_begin_; 323fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t boot_image_size_; 324fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 325fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier // Boot oat begin and end (app image headers only). 326fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t boot_oat_begin_; 327fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier uint32_t boot_oat_size_; 328fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 329fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier // TODO: We should probably insert a boot image checksum for app images. 330fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 33153cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light // The total delta that this image has been patched. 33253cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light int32_t patch_delta_; 33353cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light 334700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom // Absolute address of an Object[] of objects needed to reinitialize from an image. 335161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom uint32_t image_roots_; 336161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom 337e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier // Pointer size, this affects the size of the ArtMethods. 338e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier uint32_t pointer_size_; 339e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 34046774767fcf7780d1455e755729198648d08742eIgor Murashkin // Boolean (0 or 1) to denote if the image was compiled with --compile-pic option 34146774767fcf7780d1455e755729198648d08742eIgor Murashkin const uint32_t compile_pic_; 34246774767fcf7780d1455e755729198648d08742eIgor Murashkin 343fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier // Boolean (0 or 1) to denote if the image can be mapped at a random address, this only refers to 344fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier // the .art file. Currently, app oat files do not depend on their app image. There are no pointers 345fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier // from the app oat code to the app image. 346fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier const uint32_t is_pic_; 347fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier 34867ad20e2834ed2b821503d0d9ab1b3a34e55b7d4Mathieu Chartier // Image section sizes/offsets correspond to the uncompressed form. 349e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ImageSection sections_[kSectionCount]; 350e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 351fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier // Image methods, may be inside of the boot image for app images. 352e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier uint64_t image_methods_[kImageMethodsCount]; 353e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 354ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier // Storage method for the image, the image may be compressed. 355ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier StorageMode storage_mode_; 356ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier 357ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier // Data size for the image data excluding the bitmap and the header. For compressed images, this 358ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier // is the compressed size in the file. 359ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier uint32_t data_size_; 360ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier 361161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom friend class ImageWriter; 3624a289ed61242964b921434de7d375f46480472a1Brian Carlstrom}; 3634a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 364e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierstd::ostream& operator<<(std::ostream& os, const ImageHeader::ImageMethod& policy); 365e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierstd::ostream& operator<<(std::ostream& os, const ImageHeader::ImageRoot& policy); 366e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierstd::ostream& operator<<(std::ostream& os, const ImageHeader::ImageSections& section); 367e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierstd::ostream& operator<<(std::ostream& os, const ImageSection& section); 368ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartierstd::ostream& operator<<(std::ostream& os, const ImageHeader::StorageMode& mode); 369e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier 3704a289ed61242964b921434de7d375f46480472a1Brian Carlstrom} // namespace art 3714a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 372fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_IMAGE_H_ 373