blob: a15ead72a6eacc1b5eece30c0f266f4863e4a802 [file] [log] [blame]
Brian Carlstrom4a289ed2011-08-16 17:17:49 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#ifndef ART_SRC_IMAGE_H_
4#define ART_SRC_IMAGE_H_
5
6#include <string.h>
7
8#include "globals.h"
Brian Carlstroma663ea52011-08-19 23:33:41 -07009#include "object.h"
Brian Carlstrom4a289ed2011-08-16 17:17:49 -070010
11namespace art {
12
13// header of image files written by ImageWriter, read and validated by Space.
Brian Carlstrome24fa612011-09-29 00:53:55 -070014class PACKED ImageHeader {
Brian Carlstrom4a289ed2011-08-16 17:17:49 -070015 public:
16 ImageHeader() {}
17
Brian Carlstrome24fa612011-09-29 00:53:55 -070018 ImageHeader(uint32_t image_base_addr,
19 uint32_t image_roots,
20 uint32_t oat_checksum,
21 uint32_t oat_base_addr,
22 uint32_t oat_limit_addr)
23 : image_base_addr_(image_base_addr),
24 oat_checksum_(oat_checksum),
25 oat_base_addr_(oat_base_addr),
26 oat_limit_addr_(oat_limit_addr),
27 image_roots_(image_roots) {
28 CHECK_EQ(image_base_addr, RoundUp(image_base_addr, kPageSize));
29 CHECK_EQ(oat_base_addr, RoundUp(oat_base_addr, kPageSize));
30 CHECK_LT(image_base_addr, image_roots);
31 CHECK_LT(image_roots, oat_base_addr);
32 CHECK_LT(oat_base_addr, oat_limit_addr);
Brian Carlstrom4a289ed2011-08-16 17:17:49 -070033 memcpy(magic_, kImageMagic, sizeof(kImageMagic));
34 memcpy(version_, kImageVersion, sizeof(kImageVersion));
35 }
36
Brian Carlstrom78128a62011-09-15 17:21:19 -070037 bool IsValid() const {
Brian Carlstrom4a289ed2011-08-16 17:17:49 -070038 if (memcmp(magic_, kImageMagic, sizeof(kImageMagic) != 0)) {
39 return false;
40 }
41 if (memcmp(version_, kImageVersion, sizeof(kImageVersion) != 0)) {
42 return false;
43 }
44 return true;
45 }
46
Brian Carlstrom78128a62011-09-15 17:21:19 -070047 const char* GetMagic() const {
48 CHECK(IsValid());
49 return reinterpret_cast<const char*>(magic_);
50 }
51
Brian Carlstrome24fa612011-09-29 00:53:55 -070052 byte* GetImageBaseAddr() const {
53 return reinterpret_cast<byte*>(image_base_addr_);
54 }
55
56 uint32_t GetOatChecksum() const {
57 return oat_checksum_;
58 }
59
60 byte* GetOatBaseAddr() const {
61 return reinterpret_cast<byte*>(oat_base_addr_);
62 }
63
64 byte* GetOatLimitAddr() const {
65 return reinterpret_cast<byte*>(oat_limit_addr_);
Brian Carlstrom4a289ed2011-08-16 17:17:49 -070066 }
67
Brian Carlstrom16192862011-09-12 17:50:06 -070068 enum ImageRoot {
69 kJniStubArray,
Brian Carlstrome24fa612011-09-29 00:53:55 -070070 kAbstractMethodErrorStubArray,
Ian Rogersff1ed472011-09-20 13:46:24 -070071 kCalleeSaveMethod,
Brian Carlstrome24fa612011-09-29 00:53:55 -070072 kOatLocation,
Brian Carlstrom58ae9412011-10-04 00:56:06 -070073 kDexCaches,
Brian Carlstrom34f426c2011-10-04 12:58:02 -070074 kClassRoots,
Brian Carlstrom16192862011-09-12 17:50:06 -070075 kImageRootsMax,
76 };
77
78 Object* GetImageRoot(ImageRoot image_root) const {
79 return reinterpret_cast<ObjectArray<Object>*>(image_roots_)->Get(image_root);
80 }
81
Brian Carlstrom4a289ed2011-08-16 17:17:49 -070082 private:
83 static const byte kImageMagic[4];
84 static const byte kImageVersion[4];
85
86 byte magic_[4];
87 byte version_[4];
Brian Carlstroma663ea52011-08-19 23:33:41 -070088
89 // required base address for mapping the image.
Brian Carlstrome24fa612011-09-29 00:53:55 -070090 uint32_t image_base_addr_;
91
92 // checksum of the oat file we link to for load time sanity check
93 uint32_t oat_checksum_;
94
95 // required oat address expected by image Method::GetCode() pointers.
96 uint32_t oat_base_addr_;
97
98 // end of oat address range for this image file, used for positioning a following image
99 uint32_t oat_limit_addr_;
Brian Carlstrom16192862011-09-12 17:50:06 -0700100
101 // absolute address of an Object[] of objects needed to reinitialize from an image
102 uint32_t image_roots_;
103
104 friend class ImageWriter;
Brian Carlstrom4a289ed2011-08-16 17:17:49 -0700105};
106
107} // namespace art
108
109#endif // ART_SRC_IMAGE_H_