src/hotspot/share/memory/filemap.hpp
changeset 51477 e77d7687c831
parent 51439 0517bd2a0eda
child 51491 187c84a5efe1
equal deleted inserted replaced
51476:6c0ac4b4d761 51477:e77d7687c831
    24 
    24 
    25 #ifndef SHARE_VM_MEMORY_FILEMAP_HPP
    25 #ifndef SHARE_VM_MEMORY_FILEMAP_HPP
    26 #define SHARE_VM_MEMORY_FILEMAP_HPP
    26 #define SHARE_VM_MEMORY_FILEMAP_HPP
    27 
    27 
    28 #include "classfile/classLoader.hpp"
    28 #include "classfile/classLoader.hpp"
       
    29 #include "include/cds.h"
    29 #include "memory/metaspaceShared.hpp"
    30 #include "memory/metaspaceShared.hpp"
    30 #include "memory/metaspace.hpp"
    31 #include "memory/metaspace.hpp"
    31 #include "memory/universe.hpp"
    32 #include "memory/universe.hpp"
    32 #include "utilities/align.hpp"
    33 #include "utilities/align.hpp"
    33 
    34 
    85   void set_manifest(Array<u1>* manifest) {
    86   void set_manifest(Array<u1>* manifest) {
    86     _manifest = manifest;
    87     _manifest = manifest;
    87   }
    88   }
    88 };
    89 };
    89 
    90 
       
    91 struct FileMapHeader : public CDSFileMapHeaderBase {
       
    92   size_t _alignment;                // how shared archive should be aligned
       
    93   int    _obj_alignment;            // value of ObjectAlignmentInBytes
       
    94   address _narrow_oop_base;         // compressed oop encoding base
       
    95   int    _narrow_oop_shift;         // compressed oop encoding shift
       
    96   bool    _compact_strings;         // value of CompactStrings
       
    97   uintx  _max_heap_size;            // java max heap size during dumping
       
    98   Universe::NARROW_OOP_MODE _narrow_oop_mode; // compressed oop encoding mode
       
    99   int     _narrow_klass_shift;      // save narrow klass base and shift
       
   100   address _narrow_klass_base;
       
   101   char*   _misc_data_patching_start;
       
   102   char*   _read_only_tables_start;
       
   103   address _cds_i2i_entry_code_buffers;
       
   104   size_t  _cds_i2i_entry_code_buffers_size;
       
   105   size_t  _core_spaces_size;        // number of bytes allocated by the core spaces
       
   106                                     // (mc, md, ro, rw and od).
       
   107 
       
   108   // The following fields are all sanity checks for whether this archive
       
   109   // will function correctly with this JVM and the bootclasspath it's
       
   110   // invoked with.
       
   111   char  _jvm_ident[JVM_IDENT_MAX];      // identifier for jvm
       
   112 
       
   113   // The _paths_misc_info is a variable-size structure that records "miscellaneous"
       
   114   // information during dumping. It is generated and validated by the
       
   115   // SharedPathsMiscInfo class. See SharedPathsMiscInfo.hpp for
       
   116   // detailed description.
       
   117   //
       
   118   // The _paths_misc_info data is stored as a byte array in the archive file header,
       
   119   // immediately after the _header field. This information is used only when
       
   120   // checking the validity of the archive and is deallocated after the archive is loaded.
       
   121   //
       
   122   // Note that the _paths_misc_info does NOT include information for JAR files
       
   123   // that existed during dump time. Their information is stored in _shared_path_table.
       
   124   int _paths_misc_info_size;
       
   125 
       
   126   // The following is a table of all the class path entries that were used
       
   127   // during dumping. At run time, we require these files to exist and have the same
       
   128   // size/modification time, or else the archive will refuse to load.
       
   129   //
       
   130   // All of these entries must be JAR files. The dumping process would fail if a non-empty
       
   131   // directory was specified in the classpaths. If an empty directory was specified
       
   132   // it is checked by the _paths_misc_info as described above.
       
   133   //
       
   134   // FIXME -- if JAR files in the tail of the list were specified but not used during dumping,
       
   135   // they should be removed from this table, to save space and to avoid spurious
       
   136   // loading failures during runtime.
       
   137   int _shared_path_table_size;
       
   138   size_t _shared_path_entry_size;
       
   139   Array<u8>* _shared_path_table;
       
   140 
       
   141   jshort _app_class_paths_start_index;  // Index of first app classpath entry
       
   142   jshort _app_module_paths_start_index; // Index of first module path entry
       
   143   jshort _max_used_path_index;          // max path index referenced during CDS dump
       
   144   bool   _verify_local;                 // BytecodeVerificationLocal setting
       
   145   bool   _verify_remote;                // BytecodeVerificationRemote setting
       
   146   bool   _has_platform_or_app_classes;  // Archive contains app classes
       
   147 
       
   148   void set_has_platform_or_app_classes(bool v) {
       
   149     _has_platform_or_app_classes = v;
       
   150   }
       
   151   bool has_platform_or_app_classes() { return _has_platform_or_app_classes; }
       
   152   jshort max_used_path_index()       { return _max_used_path_index; }
       
   153   jshort app_module_paths_start_index() { return _app_module_paths_start_index; }
       
   154 
       
   155   char* region_addr(int idx);
       
   156 
       
   157   bool validate();
       
   158   void populate(FileMapInfo* info, size_t alignment);
       
   159   int compute_crc();
       
   160 };
       
   161 
       
   162 
    90 class FileMapInfo : public CHeapObj<mtInternal> {
   163 class FileMapInfo : public CHeapObj<mtInternal> {
    91 private:
   164 private:
    92   friend class ManifestStream;
   165   friend class ManifestStream;
    93   friend class VMStructs;
   166   friend class VMStructs;
    94   enum {
   167   friend struct FileMapHeader;
    95     _invalid_version = -1,
   168 
    96     _current_version = 3
   169   bool    _file_open;
    97   };
   170   int     _fd;
    98 
       
    99   bool  _file_open;
       
   100   int   _fd;
       
   101   size_t  _file_offset;
   171   size_t  _file_offset;
   102 
   172 
   103 private:
   173 private:
   104   static Array<u8>*            _shared_path_table;
   174   static Array<u8>*            _shared_path_table;
   105   static int                   _shared_path_table_size;
   175   static int                   _shared_path_table_size;
   114   struct FileMapHeaderBase : public CHeapObj<mtClass> {
   184   struct FileMapHeaderBase : public CHeapObj<mtClass> {
   115     // Need to put something here. Otherwise, in product build, because CHeapObj has no virtual
   185     // Need to put something here. Otherwise, in product build, because CHeapObj has no virtual
   116     // methods, we would get sizeof(FileMapHeaderBase) == 1 with gcc.
   186     // methods, we would get sizeof(FileMapHeaderBase) == 1 with gcc.
   117     intx _dummy;
   187     intx _dummy;
   118   };
   188   };
   119   struct FileMapHeader : FileMapHeaderBase {
   189 
   120     // Use data() and data_size() to memcopy to/from the FileMapHeader. We need to
       
   121     // avoid read/writing the C++ vtable pointer.
       
   122     static size_t data_size() {
       
   123       return sizeof(FileMapHeader) - sizeof(FileMapInfo::FileMapHeaderBase);
       
   124     }
       
   125     char* data() {
       
   126       return ((char*)this) + sizeof(FileMapHeaderBase);
       
   127     }
       
   128 
       
   129     int    _magic;                    // identify file type.
       
   130     int    _crc;                      // header crc checksum.
       
   131     int    _version;                  // (from enum, above.)
       
   132     size_t _alignment;                // how shared archive should be aligned
       
   133     int    _obj_alignment;            // value of ObjectAlignmentInBytes
       
   134     address _narrow_oop_base;         // compressed oop encoding base
       
   135     int    _narrow_oop_shift;         // compressed oop encoding shift
       
   136     bool    _compact_strings;         // value of CompactStrings
       
   137     uintx  _max_heap_size;            // java max heap size during dumping
       
   138     Universe::NARROW_OOP_MODE _narrow_oop_mode; // compressed oop encoding mode
       
   139     int     _narrow_klass_shift;      // save narrow klass base and shift
       
   140     address _narrow_klass_base;
       
   141     char*   _misc_data_patching_start;
       
   142     char*   _read_only_tables_start;
       
   143     address _cds_i2i_entry_code_buffers;
       
   144     size_t  _cds_i2i_entry_code_buffers_size;
       
   145     size_t  _core_spaces_size;        // number of bytes allocated by the core spaces
       
   146                                       // (mc, md, ro, rw and od).
       
   147     struct space_info {
       
   148       int    _crc;           // crc checksum of the current space
       
   149       size_t _file_offset;   // sizeof(this) rounded to vm page size
       
   150       union {
       
   151         char*  _base;        // copy-on-write base address
       
   152         intx   _offset;      // offset from the compressed oop encoding base, only used
       
   153                              // by archive heap space
       
   154       } _addr;
       
   155       size_t _used;          // for setting space top on read
       
   156       bool   _read_only;     // read only space?
       
   157       bool   _allow_exec;    // executable code in space?
       
   158     } _space[MetaspaceShared::n_regions];
       
   159 
       
   160     // The following fields are all sanity checks for whether this archive
       
   161     // will function correctly with this JVM and the bootclasspath it's
       
   162     // invoked with.
       
   163     char  _jvm_ident[JVM_IDENT_MAX];      // identifier for jvm
       
   164 
       
   165     // The _paths_misc_info is a variable-size structure that records "miscellaneous"
       
   166     // information during dumping. It is generated and validated by the
       
   167     // SharedPathsMiscInfo class. See SharedPathsMiscInfo.hpp for
       
   168     // detailed description.
       
   169     //
       
   170     // The _paths_misc_info data is stored as a byte array in the archive file header,
       
   171     // immediately after the _header field. This information is used only when
       
   172     // checking the validity of the archive and is deallocated after the archive is loaded.
       
   173     //
       
   174     // Note that the _paths_misc_info does NOT include information for JAR files
       
   175     // that existed during dump time. Their information is stored in _shared_path_table.
       
   176     int _paths_misc_info_size;
       
   177 
       
   178     // The following is a table of all the class path entries that were used
       
   179     // during dumping. At run time, we require these files to exist and have the same
       
   180     // size/modification time, or else the archive will refuse to load.
       
   181     //
       
   182     // All of these entries must be JAR files. The dumping process would fail if a non-empty
       
   183     // directory was specified in the classpaths. If an empty directory was specified
       
   184     // it is checked by the _paths_misc_info as described above.
       
   185     //
       
   186     // FIXME -- if JAR files in the tail of the list were specified but not used during dumping,
       
   187     // they should be removed from this table, to save space and to avoid spurious
       
   188     // loading failures during runtime.
       
   189     int _shared_path_table_size;
       
   190     size_t _shared_path_entry_size;
       
   191     Array<u8>* _shared_path_table;
       
   192 
       
   193     jshort _app_class_paths_start_index;  // Index of first app classpath entry
       
   194     jshort _app_module_paths_start_index; // Index of first module path entry
       
   195     jshort _max_used_path_index;          // max path index referenced during CDS dump
       
   196     bool   _verify_local;                 // BytecodeVerificationLocal setting
       
   197     bool   _verify_remote;                // BytecodeVerificationRemote setting
       
   198     bool   _has_platform_or_app_classes;  // Archive contains app classes
       
   199 
       
   200     void set_has_platform_or_app_classes(bool v) {
       
   201       _has_platform_or_app_classes = v;
       
   202     }
       
   203     bool has_platform_or_app_classes() { return _has_platform_or_app_classes; }
       
   204     jshort max_used_path_index()       { return _max_used_path_index; }
       
   205     jshort app_module_paths_start_index() { return _app_module_paths_start_index; }
       
   206 
       
   207     char* region_addr(int idx);
       
   208 
       
   209     bool validate();
       
   210     void populate(FileMapInfo* info, size_t alignment);
       
   211     int compute_crc();
       
   212   };
       
   213 
   190 
   214   FileMapHeader * _header;
   191   FileMapHeader * _header;
   215 
   192 
   216   const char* _full_path;
   193   const char* _full_path;
   217   char* _paths_misc_info;
   194   char* _paths_misc_info;
   225 
   202 
   226 public:
   203 public:
   227   FileMapInfo();
   204   FileMapInfo();
   228   ~FileMapInfo();
   205   ~FileMapInfo();
   229 
   206 
   230   static int current_version()        { return _current_version; }
       
   231   int    compute_header_crc()         { return _header->compute_crc(); }
   207   int    compute_header_crc()         { return _header->compute_crc(); }
   232   void   set_header_crc(int crc)      { _header->_crc = crc; }
   208   void   set_header_crc(int crc)      { _header->_crc = crc; }
   233   void   populate_header(size_t alignment);
   209   void   populate_header(size_t alignment);
   234   bool   validate_header();
   210   bool   validate_header();
   235   void   invalidate();
   211   void   invalidate();
   276   void  write_header();
   252   void  write_header();
   277   void  write_region(int region, char* base, size_t size,
   253   void  write_region(int region, char* base, size_t size,
   278                      bool read_only, bool allow_exec);
   254                      bool read_only, bool allow_exec);
   279   size_t write_archive_heap_regions(GrowableArray<MemRegion> *heap_mem,
   255   size_t write_archive_heap_regions(GrowableArray<MemRegion> *heap_mem,
   280                                     int first_region_id, int max_num_regions);
   256                                     int first_region_id, int max_num_regions);
   281   void  write_bytes(const void* buffer, int count);
   257   void  write_bytes(const void* buffer, size_t count);
   282   void  write_bytes_aligned(const void* buffer, int count);
   258   void  write_bytes_aligned(const void* buffer, size_t count);
   283   char* map_region(int i, char** top_ret);
   259   char* map_region(int i, char** top_ret);
   284   void  map_heap_regions() NOT_CDS_JAVA_HEAP_RETURN;
   260   void  map_heap_regions() NOT_CDS_JAVA_HEAP_RETURN;
   285   void  fixup_mapped_heap_regions() NOT_CDS_JAVA_HEAP_RETURN;
   261   void  fixup_mapped_heap_regions() NOT_CDS_JAVA_HEAP_RETURN;
   286   void  unmap_region(int i);
   262   void  unmap_region(int i);
   287   bool  verify_region_checksum(int i);
   263   bool  verify_region_checksum(int i);
   330  private:
   306  private:
   331   bool  map_heap_data(MemRegion **heap_mem, int first, int max, int* num,
   307   bool  map_heap_data(MemRegion **heap_mem, int first, int max, int* num,
   332                       bool is_open = false) NOT_CDS_JAVA_HEAP_RETURN_(false);
   308                       bool is_open = false) NOT_CDS_JAVA_HEAP_RETURN_(false);
   333   bool  verify_mapped_heap_regions(int first, int num) NOT_CDS_JAVA_HEAP_RETURN_(false);
   309   bool  verify_mapped_heap_regions(int first, int num) NOT_CDS_JAVA_HEAP_RETURN_(false);
   334   void  dealloc_archive_heap_regions(MemRegion* regions, int num) NOT_CDS_JAVA_HEAP_RETURN;
   310   void  dealloc_archive_heap_regions(MemRegion* regions, int num) NOT_CDS_JAVA_HEAP_RETURN;
       
   311 
       
   312   CDSFileMapRegion* space_at(int i) {
       
   313     assert(i >= 0 && i < NUM_CDS_REGIONS, "invalid region");
       
   314     return &_header->_space[i];
       
   315   }
   335 };
   316 };
   336 
   317 
   337 #endif // SHARE_VM_MEMORY_FILEMAP_HPP
   318 #endif // SHARE_VM_MEMORY_FILEMAP_HPP