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