blob: 86b71e1517918da76117272bc2a65c7fecde8a85 [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 Rogersad25ac52011-10-04 19:13:33 -070071 kInstanceResolutionStubArray,
72 kStaticResolutionStubArray,
Ian Rogers1cb0a1d2011-10-06 15:24:35 -070073 kUnknownMethodResolutionStubArray,
Ian Rogersff1ed472011-09-20 13:46:24 -070074 kCalleeSaveMethod,
Ian Rogers4f0d07c2011-10-06 23:38:47 -070075 kRefsOnlySaveMethod,
76 kRefsAndArgsSaveMethod,
Brian Carlstrome24fa612011-09-29 00:53:55 -070077 kOatLocation,
Brian Carlstrom58ae9412011-10-04 00:56:06 -070078 kDexCaches,
Brian Carlstrom34f426c2011-10-04 12:58:02 -070079 kClassRoots,
Brian Carlstrom16192862011-09-12 17:50:06 -070080 kImageRootsMax,
81 };
82
83 Object* GetImageRoot(ImageRoot image_root) const {
84 return reinterpret_cast<ObjectArray<Object>*>(image_roots_)->Get(image_root);
85 }
86
Brian Carlstrom4a289ed2011-08-16 17:17:49 -070087 private:
88 static const byte kImageMagic[4];
89 static const byte kImageVersion[4];
90
91 byte magic_[4];
92 byte version_[4];
Brian Carlstroma663ea52011-08-19 23:33:41 -070093
94 // required base address for mapping the image.
Brian Carlstrome24fa612011-09-29 00:53:55 -070095 uint32_t image_base_addr_;
96
97 // checksum of the oat file we link to for load time sanity check
98 uint32_t oat_checksum_;
99
100 // required oat address expected by image Method::GetCode() pointers.
101 uint32_t oat_base_addr_;
102
103 // end of oat address range for this image file, used for positioning a following image
104 uint32_t oat_limit_addr_;
Brian Carlstrom16192862011-09-12 17:50:06 -0700105
106 // absolute address of an Object[] of objects needed to reinitialize from an image
107 uint32_t image_roots_;
108
109 friend class ImageWriter;
Brian Carlstrom4a289ed2011-08-16 17:17:49 -0700110};
111
112} // namespace art
113
114#endif // ART_SRC_IMAGE_H_