src/hotspot/share/memory/filemap.hpp
changeset 47216 71c04702a3d5
parent 46810 7dad333205cd
child 47599 0fb1d501c408
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 /*
       
     2  * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  *
       
    23  */
       
    24 
       
    25 #ifndef SHARE_VM_MEMORY_FILEMAP_HPP
       
    26 #define SHARE_VM_MEMORY_FILEMAP_HPP
       
    27 
       
    28 #include "classfile/classLoader.hpp"
       
    29 #include "memory/metaspaceShared.hpp"
       
    30 #include "memory/metaspace.hpp"
       
    31 #include "memory/universe.hpp"
       
    32 #include "utilities/align.hpp"
       
    33 
       
    34 // Layout of the file:
       
    35 //  header: dump of archive instance plus versioning info, datestamp, etc.
       
    36 //   [magic # = 0xF00BABA2]
       
    37 //  ... padding to align on page-boundary
       
    38 //  read-write space
       
    39 //  read-only space
       
    40 //  misc data (block offset table, string table, symbols, dictionary, etc.)
       
    41 //  tag(666)
       
    42 
       
    43 static const int JVM_IDENT_MAX = 256;
       
    44 
       
    45 class SharedClassPathEntry VALUE_OBJ_CLASS_SPEC {
       
    46 protected:
       
    47   bool   _is_dir;
       
    48   time_t _timestamp;          // jar/jimage timestamp,  0 if is directory or other
       
    49   long   _filesize;           // jar/jimage file size, -1 if is directory, -2 if other
       
    50   Array<char>* _name;
       
    51   Array<u1>*   _manifest;
       
    52 
       
    53 public:
       
    54   void init(const char* name, TRAPS);
       
    55   void metaspace_pointers_do(MetaspaceClosure* it);
       
    56   bool validate();
       
    57 
       
    58   // The _timestamp only gets set for jar files and "modules" jimage.
       
    59   bool is_jar_or_bootimage() {
       
    60     return _timestamp != 0;
       
    61   }
       
    62   bool is_dir() { return _is_dir; }
       
    63   bool is_jrt() { return ClassLoader::is_jrt(name()); }
       
    64   time_t timestamp() const { return _timestamp; }
       
    65   long   filesize()  const { return _filesize; }
       
    66   const char* name() const { return _name->data(); }
       
    67   const char* manifest() const {
       
    68     return (_manifest == NULL) ? NULL : (const char*)_manifest->data();
       
    69   }
       
    70   int manifest_size() const {
       
    71     return (_manifest == NULL) ? 0 : _manifest->length();
       
    72   }
       
    73 };
       
    74 
       
    75 class FileMapInfo : public CHeapObj<mtInternal> {
       
    76 private:
       
    77   friend class ManifestStream;
       
    78   enum {
       
    79     _invalid_version = -1,
       
    80     _current_version = 3
       
    81   };
       
    82 
       
    83   bool  _file_open;
       
    84   int   _fd;
       
    85   size_t  _file_offset;
       
    86 
       
    87 private:
       
    88   static Array<u8>*            _classpath_entry_table;
       
    89   static int                   _classpath_entry_table_size;
       
    90   static size_t                _classpath_entry_size;
       
    91   static bool                  _validating_classpath_entry_table;
       
    92 
       
    93   // FileMapHeader describes the shared space data in the file to be
       
    94   // mapped.  This structure gets written to a file.  It is not a class, so
       
    95   // that the compilers don't add any compiler-private data to it.
       
    96 
       
    97 public:
       
    98   struct FileMapHeaderBase : public CHeapObj<mtClass> {
       
    99     virtual bool validate() = 0;
       
   100     virtual void populate(FileMapInfo* info, size_t alignment) = 0;
       
   101   };
       
   102   struct FileMapHeader : FileMapHeaderBase {
       
   103     // Use data() and data_size() to memcopy to/from the FileMapHeader. We need to
       
   104     // avoid read/writing the C++ vtable pointer.
       
   105     static size_t data_size();
       
   106     char* data() {
       
   107       return ((char*)this) + sizeof(FileMapHeaderBase);
       
   108     }
       
   109 
       
   110     int    _magic;                    // identify file type.
       
   111     int    _crc;                      // header crc checksum.
       
   112     int    _version;                  // (from enum, above.)
       
   113     size_t _alignment;                // how shared archive should be aligned
       
   114     int    _obj_alignment;            // value of ObjectAlignmentInBytes
       
   115     int    _narrow_oop_shift;         // compressed oop encoding shift
       
   116     bool   _compact_strings;          // value of CompactStrings
       
   117     uintx  _max_heap_size;            // java max heap size during dumping
       
   118     Universe::NARROW_OOP_MODE _narrow_oop_mode; // compressed oop encoding mode
       
   119     int     _narrow_klass_shift;      // save narrow klass base and shift
       
   120     address _narrow_klass_base;
       
   121     char*   _misc_data_patching_start;
       
   122     char*   _read_only_tables_start;
       
   123     address _cds_i2i_entry_code_buffers;
       
   124     size_t  _cds_i2i_entry_code_buffers_size;
       
   125     size_t  _core_spaces_size;        // number of bytes allocated by the core spaces
       
   126                                       // (mc, md, ro, rw and od).
       
   127 
       
   128     struct space_info {
       
   129       int    _crc;           // crc checksum of the current space
       
   130       size_t _file_offset;   // sizeof(this) rounded to vm page size
       
   131       union {
       
   132         char*  _base;        // copy-on-write base address
       
   133         intx   _offset;      // offset from the compressed oop encoding base, only used
       
   134                              // by string space
       
   135       } _addr;
       
   136       size_t _used;          // for setting space top on read
       
   137       bool   _read_only;     // read only space?
       
   138       bool   _allow_exec;    // executable code in space?
       
   139     } _space[MetaspaceShared::n_regions];
       
   140 
       
   141     // The following fields are all sanity checks for whether this archive
       
   142     // will function correctly with this JVM and the bootclasspath it's
       
   143     // invoked with.
       
   144     char  _jvm_ident[JVM_IDENT_MAX];      // identifier for jvm
       
   145 
       
   146     // The _paths_misc_info is a variable-size structure that records "miscellaneous"
       
   147     // information during dumping. It is generated and validated by the
       
   148     // SharedPathsMiscInfo class. See SharedPathsMiscInfo.hpp and sharedClassUtil.hpp for
       
   149     // detailed description.
       
   150     //
       
   151     // The _paths_misc_info data is stored as a byte array in the archive file header,
       
   152     // immediately after the _header field. This information is used only when
       
   153     // checking the validity of the archive and is deallocated after the archive is loaded.
       
   154     //
       
   155     // Note that the _paths_misc_info does NOT include information for JAR files
       
   156     // that existed during dump time. Their information is stored in _classpath_entry_table.
       
   157     int _paths_misc_info_size;
       
   158 
       
   159     // The following is a table of all the class path entries that were used
       
   160     // during dumping. At run time, we require these files to exist and have the same
       
   161     // size/modification time, or else the archive will refuse to load.
       
   162     //
       
   163     // All of these entries must be JAR files. The dumping process would fail if a non-empty
       
   164     // directory was specified in the classpaths. If an empty directory was specified
       
   165     // it is checked by the _paths_misc_info as described above.
       
   166     //
       
   167     // FIXME -- if JAR files in the tail of the list were specified but not used during dumping,
       
   168     // they should be removed from this table, to save space and to avoid spurious
       
   169     // loading failures during runtime.
       
   170     int _classpath_entry_table_size;
       
   171     size_t _classpath_entry_size;
       
   172     Array<u8>* _classpath_entry_table;
       
   173 
       
   174     char* region_addr(int idx);
       
   175 
       
   176     virtual bool validate();
       
   177     virtual void populate(FileMapInfo* info, size_t alignment);
       
   178     int compute_crc();
       
   179   };
       
   180 
       
   181   FileMapHeader * _header;
       
   182 
       
   183   const char* _full_path;
       
   184   char* _paths_misc_info;
       
   185 
       
   186   static FileMapInfo* _current_info;
       
   187 
       
   188   bool  init_from_file(int fd);
       
   189   void  align_file_position();
       
   190   bool  validate_header_impl();
       
   191   static void metaspace_pointers_do(MetaspaceClosure* it);
       
   192 
       
   193 public:
       
   194   FileMapInfo();
       
   195   ~FileMapInfo();
       
   196 
       
   197   static int current_version()        { return _current_version; }
       
   198   int    compute_header_crc()         { return _header->compute_crc(); }
       
   199   void   set_header_crc(int crc)      { _header->_crc = crc; }
       
   200   void   populate_header(size_t alignment);
       
   201   bool   validate_header();
       
   202   void   invalidate();
       
   203   int    version()                    { return _header->_version; }
       
   204   size_t alignment()                  { return _header->_alignment; }
       
   205   Universe::NARROW_OOP_MODE narrow_oop_mode() { return _header->_narrow_oop_mode; }
       
   206   int    narrow_oop_shift()           { return _header->_narrow_oop_shift; }
       
   207   uintx  max_heap_size()              { return _header->_max_heap_size; }
       
   208   address narrow_klass_base() const   { return _header->_narrow_klass_base; }
       
   209   int     narrow_klass_shift() const  { return _header->_narrow_klass_shift; }
       
   210   struct FileMapHeader* header()      { return _header; }
       
   211   char* misc_data_patching_start()            { return _header->_misc_data_patching_start; }
       
   212   void set_misc_data_patching_start(char* p)  { _header->_misc_data_patching_start = p; }
       
   213   char* read_only_tables_start()              { return _header->_read_only_tables_start; }
       
   214   void set_read_only_tables_start(char* p)    { _header->_read_only_tables_start = p; }
       
   215 
       
   216   address cds_i2i_entry_code_buffers() {
       
   217     return _header->_cds_i2i_entry_code_buffers;
       
   218   }
       
   219   void set_cds_i2i_entry_code_buffers(address addr) {
       
   220     _header->_cds_i2i_entry_code_buffers = addr;
       
   221   }
       
   222   size_t cds_i2i_entry_code_buffers_size() {
       
   223     return _header->_cds_i2i_entry_code_buffers_size;
       
   224   }
       
   225   void set_cds_i2i_entry_code_buffers_size(size_t s) {
       
   226     _header->_cds_i2i_entry_code_buffers_size = s;
       
   227   }
       
   228   void set_core_spaces_size(size_t s)    {  _header->_core_spaces_size = s; }
       
   229   size_t core_spaces_size()              { return _header->_core_spaces_size; }
       
   230 
       
   231   static FileMapInfo* current_info() {
       
   232     CDS_ONLY(return _current_info;)
       
   233     NOT_CDS(return NULL;)
       
   234   }
       
   235 
       
   236   static void assert_mark(bool check);
       
   237 
       
   238   // File manipulation.
       
   239   bool  initialize() NOT_CDS_RETURN_(false);
       
   240   bool  open_for_read();
       
   241   void  open_for_write();
       
   242   void  write_header();
       
   243   void  write_region(int region, char* base, size_t size,
       
   244                      bool read_only, bool allow_exec);
       
   245   size_t write_archive_heap_regions(GrowableArray<MemRegion> *heap_mem,
       
   246                                     int first_region_id, int max_num_regions);
       
   247   void  write_bytes(const void* buffer, int count);
       
   248   void  write_bytes_aligned(const void* buffer, int count);
       
   249   char* map_region(int i);
       
   250   void  map_heap_regions() NOT_CDS_JAVA_HEAP_RETURN;
       
   251   void  fixup_mapped_heap_regions() NOT_CDS_JAVA_HEAP_RETURN;
       
   252   void  unmap_region(int i);
       
   253   bool  verify_region_checksum(int i);
       
   254   void  close();
       
   255   bool  is_open() { return _file_open; }
       
   256   ReservedSpace reserve_shared_memory();
       
   257 
       
   258   // JVM/TI RedefineClasses() support:
       
   259   // Remap the shared readonly space to shared readwrite, private.
       
   260   bool  remap_shared_readonly_as_readwrite();
       
   261 
       
   262   // Errors.
       
   263   static void fail_stop(const char *msg, ...) ATTRIBUTE_PRINTF(1, 2);
       
   264   static void fail_continue(const char *msg, ...) ATTRIBUTE_PRINTF(1, 2);
       
   265 
       
   266   // Return true if given address is in the mapped shared space.
       
   267   bool is_in_shared_space(const void* p) NOT_CDS_RETURN_(false);
       
   268   bool is_in_shared_region(const void* p, int idx) NOT_CDS_RETURN_(false);
       
   269   void print_shared_spaces() NOT_CDS_RETURN;
       
   270 
       
   271   // Stop CDS sharing and unmap CDS regions.
       
   272   static void stop_sharing_and_unmap(const char* msg);
       
   273 
       
   274   static void allocate_classpath_entry_table();
       
   275   bool validate_classpath_entry_table();
       
   276 
       
   277   static SharedClassPathEntry* shared_classpath(int index) {
       
   278     if (index < 0) {
       
   279       return NULL;
       
   280     }
       
   281     assert(index < _classpath_entry_table_size, "sanity");
       
   282     char* p = (char*)_classpath_entry_table->data();
       
   283     p += _classpath_entry_size * index;
       
   284     return (SharedClassPathEntry*)p;
       
   285   }
       
   286   static const char* shared_classpath_name(int index) {
       
   287     assert(index >= 0, "Sanity");
       
   288     return shared_classpath(index)->name();
       
   289   }
       
   290 
       
   291   static int get_number_of_share_classpaths() {
       
   292     return _classpath_entry_table_size;
       
   293   }
       
   294 
       
   295  private:
       
   296   bool  map_heap_data(MemRegion **heap_mem, int first, int max, int* num,
       
   297                       bool is_open = false) NOT_CDS_JAVA_HEAP_RETURN_(false);
       
   298   bool  verify_mapped_heap_regions(int first, int num) NOT_CDS_JAVA_HEAP_RETURN_(false);
       
   299   void  dealloc_archive_heap_regions(MemRegion* regions, int num) NOT_CDS_JAVA_HEAP_RETURN;
       
   300 };
       
   301 
       
   302 #endif // SHARE_VM_MEMORY_FILEMAP_HPP