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 174a289ed61242964b921434de7d375f46480472a1Brian Carlstrom#include "image.h" 184a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object_array.h" 202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object_array-inl.h" 214f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "mirror/object-inl.h" 222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "utils.h" 232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 244a289ed61242964b921434de7d375f46480472a1Brian Carlstromnamespace art { 254a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 26e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstromconst byte ImageHeader::kImageMagic[] = { 'a', 'r', 't', '\n' }; 2731e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartierconst byte ImageHeader::kImageVersion[] = { '0', '0', '5', '\0' }; 284a289ed61242964b921434de7d375f46480472a1Brian Carlstrom 292dd0e2cea360bc9206eb88ecc40d259e796c239dIan RogersImageHeader::ImageHeader(uint32_t image_begin, 3031e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier uint32_t image_size, 3131e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier uint32_t image_bitmap_offset, 3231e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier uint32_t image_bitmap_size, 332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t image_roots, 342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t oat_checksum, 352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t oat_file_begin, 362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t oat_data_begin, 372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t oat_data_end, 382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers uint32_t oat_file_end) 392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers : image_begin_(image_begin), 4031e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier image_size_(image_size), 4131e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier image_bitmap_offset_(image_bitmap_offset), 4231e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier image_bitmap_size_(image_bitmap_size), 432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers oat_checksum_(oat_checksum), 442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers oat_file_begin_(oat_file_begin), 452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers oat_data_begin_(oat_data_begin), 462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers oat_data_end_(oat_data_end), 472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers oat_file_end_(oat_file_end), 482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers image_roots_(image_roots) { 492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK_EQ(image_begin, RoundUp(image_begin, kPageSize)); 502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK_EQ(oat_file_begin, RoundUp(oat_file_begin, kPageSize)); 512dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK_EQ(oat_data_begin, RoundUp(oat_data_begin, kPageSize)); 522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK_LT(image_begin, image_roots); 532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK_LT(image_roots, oat_file_begin); 542dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK_LE(oat_file_begin, oat_data_begin); 552dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK_LT(oat_data_begin, oat_data_end); 562dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers CHECK_LE(oat_data_end, oat_file_end); 572dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers memcpy(magic_, kImageMagic, sizeof(kImageMagic)); 582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers memcpy(version_, kImageVersion, sizeof(kImageVersion)); 592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 6168708f536d11f8824d881b640f3902093075c0a6Brian Carlstrombool ImageHeader::IsValid() const { 6268708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom if (memcmp(magic_, kImageMagic, sizeof(kImageMagic)) != 0) { 6368708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom return false; 6468708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom } 6568708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom if (memcmp(version_, kImageVersion, sizeof(kImageVersion)) != 0) { 6668708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom return false; 6768708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom } 6868708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom return true; 6968708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom} 7068708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom 7168708f536d11f8824d881b640f3902093075c0a6Brian Carlstromconst char* ImageHeader::GetMagic() const { 7268708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom CHECK(IsValid()); 7368708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom return reinterpret_cast<const char*>(magic_); 7468708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom} 7568708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom 762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersmirror::Object* ImageHeader::GetImageRoot(ImageRoot image_root) const { 772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return GetImageRoots()->Get(image_root); 782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersmirror::ObjectArray<mirror::Object>* ImageHeader::GetImageRoots() const { 812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers return reinterpret_cast<mirror::ObjectArray<mirror::Object>*>(image_roots_); 822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} 832dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 844a289ed61242964b921434de7d375f46480472a1Brian Carlstrom} // namespace art 85