Separate oat from image
Change-Id: If2abdb99826ead14e3465d90ba2acffd89709389
diff --git a/src/image.h b/src/image.h
index fdf6443..3d2f5f4 100644
--- a/src/image.h
+++ b/src/image.h
@@ -11,12 +11,25 @@
namespace art {
// header of image files written by ImageWriter, read and validated by Space.
-class ImageHeader {
+class PACKED ImageHeader {
public:
ImageHeader() {}
- ImageHeader(uint32_t base_addr, uint32_t image_roots)
- : base_addr_(base_addr), image_roots_(image_roots) {
+ ImageHeader(uint32_t image_base_addr,
+ uint32_t image_roots,
+ uint32_t oat_checksum,
+ uint32_t oat_base_addr,
+ uint32_t oat_limit_addr)
+ : image_base_addr_(image_base_addr),
+ oat_checksum_(oat_checksum),
+ oat_base_addr_(oat_base_addr),
+ oat_limit_addr_(oat_limit_addr),
+ image_roots_(image_roots) {
+ CHECK_EQ(image_base_addr, RoundUp(image_base_addr, kPageSize));
+ CHECK_EQ(oat_base_addr, RoundUp(oat_base_addr, kPageSize));
+ CHECK_LT(image_base_addr, image_roots);
+ CHECK_LT(image_roots, oat_base_addr);
+ CHECK_LT(oat_base_addr, oat_limit_addr);
memcpy(magic_, kImageMagic, sizeof(kImageMagic));
memcpy(version_, kImageVersion, sizeof(kImageVersion));
}
@@ -36,13 +49,27 @@
return reinterpret_cast<const char*>(magic_);
}
- byte* GetBaseAddr() const {
- return reinterpret_cast<byte*>(base_addr_);
+ byte* GetImageBaseAddr() const {
+ return reinterpret_cast<byte*>(image_base_addr_);
+ }
+
+ uint32_t GetOatChecksum() const {
+ return oat_checksum_;
+ }
+
+ byte* GetOatBaseAddr() const {
+ return reinterpret_cast<byte*>(oat_base_addr_);
+ }
+
+ byte* GetOatLimitAddr() const {
+ return reinterpret_cast<byte*>(oat_limit_addr_);
}
enum ImageRoot {
kJniStubArray,
+ kAbstractMethodErrorStubArray,
kCalleeSaveMethod,
+ kOatLocation,
kImageRootsMax,
};
@@ -58,7 +85,16 @@
byte version_[4];
// required base address for mapping the image.
- uint32_t base_addr_;
+ uint32_t image_base_addr_;
+
+ // checksum of the oat file we link to for load time sanity check
+ uint32_t oat_checksum_;
+
+ // required oat address expected by image Method::GetCode() pointers.
+ uint32_t oat_base_addr_;
+
+ // end of oat address range for this image file, used for positioning a following image
+ uint32_t oat_limit_addr_;
// absolute address of an Object[] of objects needed to reinitialize from an image
uint32_t image_roots_;