filemap.cpp revision 9727:f944761a3ce3
1/*
2 * Copyright (c) 2003, 2015, 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#include "precompiled.hpp"
26#include "classfile/classLoader.hpp"
27#include "classfile/compactHashtable.inline.hpp"
28#include "classfile/sharedClassUtil.hpp"
29#include "classfile/symbolTable.hpp"
30#include "classfile/systemDictionaryShared.hpp"
31#include "classfile/altHashing.hpp"
32#if INCLUDE_ALL_GCS
33#include "gc/g1/g1CollectedHeap.hpp"
34#endif
35#include "memory/filemap.hpp"
36#include "memory/metadataFactory.hpp"
37#include "memory/oopFactory.hpp"
38#include "oops/objArrayOop.hpp"
39#include "prims/jvmtiExport.hpp"
40#include "runtime/arguments.hpp"
41#include "runtime/java.hpp"
42#include "runtime/os.hpp"
43#include "runtime/vm_version.hpp"
44#include "services/memTracker.hpp"
45#include "utilities/defaultStream.hpp"
46
47# include <sys/stat.h>
48# include <errno.h>
49
50#ifndef O_BINARY       // if defined (Win32) use binary files.
51#define O_BINARY 0     // otherwise do nothing.
52#endif
53
54extern address JVM_FunctionAtStart();
55extern address JVM_FunctionAtEnd();
56
57// Complain and stop. All error conditions occurring during the writing of
58// an archive file should stop the process.  Unrecoverable errors during
59// the reading of the archive file should stop the process.
60
61static void fail(const char *msg, va_list ap) {
62  // This occurs very early during initialization: tty is not initialized.
63  jio_fprintf(defaultStream::error_stream(),
64              "An error has occurred while processing the"
65              " shared archive file.\n");
66  jio_vfprintf(defaultStream::error_stream(), msg, ap);
67  jio_fprintf(defaultStream::error_stream(), "\n");
68  // Do not change the text of the below message because some tests check for it.
69  vm_exit_during_initialization("Unable to use shared archive.", NULL);
70}
71
72
73void FileMapInfo::fail_stop(const char *msg, ...) {
74        va_list ap;
75  va_start(ap, msg);
76  fail(msg, ap);        // Never returns.
77  va_end(ap);           // for completeness.
78}
79
80
81// Complain and continue.  Recoverable errors during the reading of the
82// archive file may continue (with sharing disabled).
83//
84// If we continue, then disable shared spaces and close the file.
85
86void FileMapInfo::fail_continue(const char *msg, ...) {
87  va_list ap;
88  va_start(ap, msg);
89  MetaspaceShared::set_archive_loading_failed();
90  if (PrintSharedArchiveAndExit && _validating_classpath_entry_table) {
91    // If we are doing PrintSharedArchiveAndExit and some of the classpath entries
92    // do not validate, we can still continue "limping" to validate the remaining
93    // entries. No need to quit.
94    tty->print("[");
95    tty->vprint(msg, ap);
96    tty->print_cr("]");
97  } else {
98    if (RequireSharedSpaces) {
99      fail(msg, ap);
100    } else {
101      if (PrintSharedSpaces) {
102        tty->print_cr("UseSharedSpaces: %s", msg);
103      }
104    }
105    UseSharedSpaces = false;
106    assert(current_info() != NULL, "singleton must be registered");
107    current_info()->close();
108  }
109  va_end(ap);
110}
111
112// Fill in the fileMapInfo structure with data about this VM instance.
113
114// This method copies the vm version info into header_version.  If the version is too
115// long then a truncated version, which has a hash code appended to it, is copied.
116//
117// Using a template enables this method to verify that header_version is an array of
118// length JVM_IDENT_MAX.  This ensures that the code that writes to the CDS file and
119// the code that reads the CDS file will both use the same size buffer.  Hence, will
120// use identical truncation.  This is necessary for matching of truncated versions.
121template <int N> static void get_header_version(char (&header_version) [N]) {
122  assert(N == JVM_IDENT_MAX, "Bad header_version size");
123
124  const char *vm_version = VM_Version::internal_vm_info_string();
125  const int version_len = (int)strlen(vm_version);
126
127  if (version_len < (JVM_IDENT_MAX-1)) {
128    strcpy(header_version, vm_version);
129
130  } else {
131    // Get the hash value.  Use a static seed because the hash needs to return the same
132    // value over multiple jvm invocations.
133    unsigned int hash = AltHashing::murmur3_32(8191, (const jbyte*)vm_version, version_len);
134
135    // Truncate the ident, saving room for the 8 hex character hash value.
136    strncpy(header_version, vm_version, JVM_IDENT_MAX-9);
137
138    // Append the hash code as eight hex digits.
139    sprintf(&header_version[JVM_IDENT_MAX-9], "%08x", hash);
140    header_version[JVM_IDENT_MAX-1] = 0;  // Null terminate.
141  }
142}
143
144FileMapInfo::FileMapInfo() {
145  assert(_current_info == NULL, "must be singleton"); // not thread safe
146  _current_info = this;
147  memset(this, 0, sizeof(FileMapInfo));
148  _file_offset = 0;
149  _file_open = false;
150  _header = SharedClassUtil::allocate_file_map_header();
151  _header->_version = _invalid_version;
152}
153
154FileMapInfo::~FileMapInfo() {
155  assert(_current_info == this, "must be singleton"); // not thread safe
156  _current_info = NULL;
157}
158
159void FileMapInfo::populate_header(size_t alignment) {
160  _header->populate(this, alignment);
161}
162
163size_t FileMapInfo::FileMapHeader::data_size() {
164  return SharedClassUtil::file_map_header_size() - sizeof(FileMapInfo::FileMapHeaderBase);
165}
166
167void FileMapInfo::FileMapHeader::populate(FileMapInfo* mapinfo, size_t alignment) {
168  _magic = 0xf00baba2;
169  _version = _current_version;
170  _alignment = alignment;
171  _obj_alignment = ObjectAlignmentInBytes;
172  _compact_strings = CompactStrings;
173  _narrow_oop_mode = Universe::narrow_oop_mode();
174  _narrow_oop_shift = Universe::narrow_oop_shift();
175  _max_heap_size = MaxHeapSize;
176  _narrow_klass_base = Universe::narrow_klass_base();
177  _narrow_klass_shift = Universe::narrow_klass_shift();
178  _classpath_entry_table_size = mapinfo->_classpath_entry_table_size;
179  _classpath_entry_table = mapinfo->_classpath_entry_table;
180  _classpath_entry_size = mapinfo->_classpath_entry_size;
181
182  // The following fields are for sanity checks for whether this archive
183  // will function correctly with this JVM and the bootclasspath it's
184  // invoked with.
185
186  // JVM version string ... changes on each build.
187  get_header_version(_jvm_ident);
188}
189
190void FileMapInfo::allocate_classpath_entry_table() {
191  int bytes = 0;
192  int count = 0;
193  char* strptr = NULL;
194  char* strptr_max = NULL;
195  Thread* THREAD = Thread::current();
196
197  ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data();
198  size_t entry_size = SharedClassUtil::shared_class_path_entry_size();
199
200  for (int pass=0; pass<2; pass++) {
201    ClassPathEntry *cpe = ClassLoader::classpath_entry(0);
202
203    for (int cur_entry = 0 ; cpe != NULL; cpe = cpe->next(), cur_entry++) {
204      const char *name = cpe->name();
205      int name_bytes = (int)(strlen(name) + 1);
206
207      if (pass == 0) {
208        count ++;
209        bytes += (int)entry_size;
210        bytes += name_bytes;
211        if (TraceClassPaths || (TraceClassLoading && Verbose)) {
212          tty->print_cr("[Add main shared path (%s) %s]", (cpe->is_jar_file() ? "jar" : "dir"), name);
213        }
214      } else {
215        SharedClassPathEntry* ent = shared_classpath(cur_entry);
216        if (cpe->is_jar_file()) {
217          struct stat st;
218          if (os::stat(name, &st) != 0) {
219            // The file/dir must exist, or it would not have been added
220            // into ClassLoader::classpath_entry().
221            //
222            // If we can't access a jar file in the boot path, then we can't
223            // make assumptions about where classes get loaded from.
224            FileMapInfo::fail_stop("Unable to open jar file %s.", name);
225          }
226
227          EXCEPTION_MARK; // The following call should never throw, but would exit VM on error.
228          SharedClassUtil::update_shared_classpath(cpe, ent, st.st_mtime, st.st_size, THREAD);
229        } else {
230          struct stat st;
231          if ((os::stat(name, &st) == 0) && ((st.st_mode & S_IFDIR) == S_IFDIR)) {
232            if (!os::dir_is_empty(name)) {
233              ClassLoader::exit_with_path_failure("Cannot have non-empty directory in archived classpaths", name);
234            }
235            ent->_filesize = -1;
236          } else {
237            ent->_filesize = -2;
238          }
239        }
240        ent->_name = strptr;
241        if (strptr + name_bytes <= strptr_max) {
242          strncpy(strptr, name, (size_t)name_bytes); // name_bytes includes trailing 0.
243          strptr += name_bytes;
244        } else {
245          assert(0, "miscalculated buffer size");
246        }
247      }
248    }
249
250    if (pass == 0) {
251      EXCEPTION_MARK; // The following call should never throw, but would exit VM on error.
252      Array<u8>* arr = MetadataFactory::new_array<u8>(loader_data, (bytes + 7)/8, THREAD);
253      strptr = (char*)(arr->data());
254      strptr_max = strptr + bytes;
255      SharedClassPathEntry* table = (SharedClassPathEntry*)strptr;
256      strptr += entry_size * count;
257
258      _classpath_entry_table_size = count;
259      _classpath_entry_table = table;
260      _classpath_entry_size = entry_size;
261    }
262  }
263}
264
265bool FileMapInfo::validate_classpath_entry_table() {
266  _validating_classpath_entry_table = true;
267
268  int count = _header->_classpath_entry_table_size;
269
270  _classpath_entry_table = _header->_classpath_entry_table;
271  _classpath_entry_size = _header->_classpath_entry_size;
272
273  for (int i=0; i<count; i++) {
274    SharedClassPathEntry* ent = shared_classpath(i);
275    struct stat st;
276    const char* name = ent->_name;
277    bool ok = true;
278    if (TraceClassPaths || (TraceClassLoading && Verbose)) {
279      tty->print_cr("[Checking shared classpath entry: %s]", name);
280    }
281    if (os::stat(name, &st) != 0) {
282      fail_continue("Required classpath entry does not exist: %s", name);
283      ok = false;
284    } else if (ent->is_dir()) {
285      if (!os::dir_is_empty(name)) {
286        fail_continue("directory is not empty: %s", name);
287        ok = false;
288      }
289    } else if (ent->is_jar()) {
290      if (ent->_timestamp != st.st_mtime ||
291          ent->_filesize != st.st_size) {
292        ok = false;
293        if (PrintSharedArchiveAndExit) {
294          fail_continue(ent->_timestamp != st.st_mtime ?
295                        "Timestamp mismatch" :
296                        "File size mismatch");
297        } else {
298          fail_continue("A jar file is not the one used while building"
299                        " the shared archive file: %s", name);
300        }
301      }
302    }
303    if (ok) {
304      if (TraceClassPaths || (TraceClassLoading && Verbose)) {
305        tty->print_cr("[ok]");
306      }
307    } else if (!PrintSharedArchiveAndExit) {
308      _validating_classpath_entry_table = false;
309      return false;
310    }
311  }
312
313  _classpath_entry_table_size = _header->_classpath_entry_table_size;
314  _validating_classpath_entry_table = false;
315  return true;
316}
317
318
319// Read the FileMapInfo information from the file.
320
321bool FileMapInfo::init_from_file(int fd) {
322  size_t sz = _header->data_size();
323  char* addr = _header->data();
324  size_t n = os::read(fd, addr, (unsigned int)sz);
325  if (n != sz) {
326    fail_continue("Unable to read the file header.");
327    return false;
328  }
329  if (_header->_version != current_version()) {
330    fail_continue("The shared archive file has the wrong version.");
331    return false;
332  }
333  _file_offset = (long)n;
334
335  size_t info_size = _header->_paths_misc_info_size;
336  _paths_misc_info = NEW_C_HEAP_ARRAY_RETURN_NULL(char, info_size, mtClass);
337  if (_paths_misc_info == NULL) {
338    fail_continue("Unable to read the file header.");
339    return false;
340  }
341  n = os::read(fd, _paths_misc_info, (unsigned int)info_size);
342  if (n != info_size) {
343    fail_continue("Unable to read the shared path info header.");
344    FREE_C_HEAP_ARRAY(char, _paths_misc_info);
345    _paths_misc_info = NULL;
346    return false;
347  }
348
349  size_t len = lseek(fd, 0, SEEK_END);
350  struct FileMapInfo::FileMapHeader::space_info* si =
351    &_header->_space[MetaspaceShared::mc];
352  if (si->_file_offset >= len || len - si->_file_offset < si->_used) {
353    fail_continue("The shared archive file has been truncated.");
354    return false;
355  }
356
357  _file_offset += (long)n;
358  return true;
359}
360
361
362// Read the FileMapInfo information from the file.
363bool FileMapInfo::open_for_read() {
364  _full_path = Arguments::GetSharedArchivePath();
365  int fd = open(_full_path, O_RDONLY | O_BINARY, 0);
366  if (fd < 0) {
367    if (errno == ENOENT) {
368      // Not locating the shared archive is ok.
369      fail_continue("Specified shared archive not found.");
370    } else {
371      fail_continue("Failed to open shared archive file (%s).",
372                    strerror(errno));
373    }
374    return false;
375  }
376
377  _fd = fd;
378  _file_open = true;
379  return true;
380}
381
382
383// Write the FileMapInfo information to the file.
384
385void FileMapInfo::open_for_write() {
386 _full_path = Arguments::GetSharedArchivePath();
387  if (PrintSharedSpaces) {
388    tty->print_cr("Dumping shared data to file: ");
389    tty->print_cr("   %s", _full_path);
390  }
391
392#ifdef _WINDOWS  // On Windows, need WRITE permission to remove the file.
393  chmod(_full_path, _S_IREAD | _S_IWRITE);
394#endif
395
396  // Use remove() to delete the existing file because, on Unix, this will
397  // allow processes that have it open continued access to the file.
398  remove(_full_path);
399  int fd = open(_full_path, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0444);
400  if (fd < 0) {
401    fail_stop("Unable to create shared archive file %s: (%s).", _full_path,
402              strerror(errno));
403  }
404  _fd = fd;
405  _file_offset = 0;
406  _file_open = true;
407}
408
409
410// Write the header to the file, seek to the next allocation boundary.
411
412void FileMapInfo::write_header() {
413  int info_size = ClassLoader::get_shared_paths_misc_info_size();
414
415  _header->_paths_misc_info_size = info_size;
416
417  align_file_position();
418  size_t sz = _header->data_size();
419  char* addr = _header->data();
420  write_bytes(addr, (int)sz); // skip the C++ vtable
421  write_bytes(ClassLoader::get_shared_paths_misc_info(), info_size);
422  align_file_position();
423}
424
425
426// Dump shared spaces to file.
427
428void FileMapInfo::write_space(int i, Metaspace* space, bool read_only) {
429  align_file_position();
430  size_t used = space->used_bytes_slow(Metaspace::NonClassType);
431  size_t capacity = space->capacity_bytes_slow(Metaspace::NonClassType);
432  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
433  write_region(i, (char*)space->bottom(), used, capacity, read_only, false);
434}
435
436
437// Dump region to file.
438
439void FileMapInfo::write_region(int region, char* base, size_t size,
440                               size_t capacity, bool read_only,
441                               bool allow_exec) {
442  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[region];
443
444  if (_file_open) {
445    guarantee(si->_file_offset == _file_offset, "file offset mismatch.");
446    if (PrintSharedSpaces) {
447      tty->print_cr("Shared file region %d: " SIZE_FORMAT_HEX_W(6) " bytes, addr " INTPTR_FORMAT
448                    " file offset " SIZE_FORMAT_HEX_W(6), region, size, p2i(base), _file_offset);
449    }
450  } else {
451    si->_file_offset = _file_offset;
452  }
453  if (MetaspaceShared::is_string_region(region)) {
454    assert((base - (char*)Universe::narrow_oop_base()) % HeapWordSize == 0, "Sanity");
455    if (base != NULL) {
456      si->_addr._offset = (intx)oopDesc::encode_heap_oop_not_null((oop)base);
457    } else {
458      si->_addr._offset = 0;
459    }
460  } else {
461    si->_addr._base = base;
462  }
463  si->_used = size;
464  si->_capacity = capacity;
465  si->_read_only = read_only;
466  si->_allow_exec = allow_exec;
467  si->_crc = ClassLoader::crc32(0, base, (jint)size);
468  write_bytes_aligned(base, (int)size);
469}
470
471// Write the string space. The string space contains one or multiple GC(G1) regions.
472// When the total string space size is smaller than one GC region of the dump time,
473// only one string region is used for shared strings.
474//
475// If the total string space size is bigger than one GC region, there would be more
476// than one GC regions allocated for shared strings. The first/bottom GC region might
477// be a partial GC region with the empty portion at the higher address within that region.
478// The non-empty portion of the first region is written into the archive as one string
479// region. The rest are consecutive full GC regions if they exist, which can be written
480// out in one chunk as another string region.
481void FileMapInfo::write_string_regions(GrowableArray<MemRegion> *regions) {
482  for (int i = MetaspaceShared::first_string;
483           i < MetaspaceShared::first_string + MetaspaceShared::max_strings; i++) {
484    char* start = NULL;
485    size_t size = 0;
486    if (regions->is_nonempty()) {
487      if (i == MetaspaceShared::first_string) {
488        MemRegion first = regions->first();
489        start = (char*)first.start();
490        size = first.byte_size();
491      } else {
492        int len = regions->length();
493        if (len > 1) {
494          start = (char*)regions->at(1).start();
495          size = (char*)regions->at(len - 1).end() - start;
496        }
497      }
498    }
499    write_region(i, start, size, size, false, false);
500  }
501}
502
503
504// Dump bytes to file -- at the current file position.
505
506void FileMapInfo::write_bytes(const void* buffer, int nbytes) {
507  if (_file_open) {
508    int n = ::write(_fd, buffer, nbytes);
509    if (n != nbytes) {
510      // It is dangerous to leave the corrupted shared archive file around,
511      // close and remove the file. See bug 6372906.
512      close();
513      remove(_full_path);
514      fail_stop("Unable to write to shared archive file.");
515    }
516  }
517  _file_offset += nbytes;
518}
519
520
521// Align file position to an allocation unit boundary.
522
523void FileMapInfo::align_file_position() {
524  size_t new_file_offset = align_size_up(_file_offset,
525                                         os::vm_allocation_granularity());
526  if (new_file_offset != _file_offset) {
527    _file_offset = new_file_offset;
528    if (_file_open) {
529      // Seek one byte back from the target and write a byte to insure
530      // that the written file is the correct length.
531      _file_offset -= 1;
532      if (lseek(_fd, (long)_file_offset, SEEK_SET) < 0) {
533        fail_stop("Unable to seek.");
534      }
535      char zero = 0;
536      write_bytes(&zero, 1);
537    }
538  }
539}
540
541
542// Dump bytes to file -- at the current file position.
543
544void FileMapInfo::write_bytes_aligned(const void* buffer, int nbytes) {
545  align_file_position();
546  write_bytes(buffer, nbytes);
547  align_file_position();
548}
549
550
551// Close the shared archive file.  This does NOT unmap mapped regions.
552
553void FileMapInfo::close() {
554  if (_file_open) {
555    if (::close(_fd) < 0) {
556      fail_stop("Unable to close the shared archive file.");
557    }
558    _file_open = false;
559    _fd = -1;
560  }
561}
562
563
564// JVM/TI RedefineClasses() support:
565// Remap the shared readonly space to shared readwrite, private.
566bool FileMapInfo::remap_shared_readonly_as_readwrite() {
567  int idx = 0;
568  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[idx];
569  if (!si->_read_only) {
570    // the space is already readwrite so we are done
571    return true;
572  }
573  size_t used = si->_used;
574  size_t size = align_size_up(used, os::vm_allocation_granularity());
575  if (!open_for_read()) {
576    return false;
577  }
578  char *addr = _header->region_addr(idx);
579  char *base = os::remap_memory(_fd, _full_path, si->_file_offset,
580                                addr, size, false /* !read_only */,
581                                si->_allow_exec);
582  close();
583  if (base == NULL) {
584    fail_continue("Unable to remap shared readonly space (errno=%d).", errno);
585    return false;
586  }
587  if (base != addr) {
588    fail_continue("Unable to remap shared readonly space at required address.");
589    return false;
590  }
591  si->_read_only = false;
592  return true;
593}
594
595// Map the whole region at once, assumed to be allocated contiguously.
596ReservedSpace FileMapInfo::reserve_shared_memory() {
597  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[0];
598  char* requested_addr = _header->region_addr(0);
599
600  size_t size = FileMapInfo::shared_spaces_size();
601
602  // Reserve the space first, then map otherwise map will go right over some
603  // other reserved memory (like the code cache).
604  ReservedSpace rs(size, os::vm_allocation_granularity(), false, requested_addr);
605  if (!rs.is_reserved()) {
606    fail_continue("Unable to reserve shared space at required address "
607                  INTPTR_FORMAT, p2i(requested_addr));
608    return rs;
609  }
610  // the reserved virtual memory is for mapping class data sharing archive
611  MemTracker::record_virtual_memory_type((address)rs.base(), mtClassShared);
612
613  return rs;
614}
615
616// Memory map a region in the address space.
617static const char* shared_region_name[] = { "ReadOnly", "ReadWrite", "MiscData", "MiscCode",
618                                            "String1", "String2" };
619
620char* FileMapInfo::map_region(int i) {
621  assert(!MetaspaceShared::is_string_region(i), "sanity");
622  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
623  size_t used = si->_used;
624  size_t alignment = os::vm_allocation_granularity();
625  size_t size = align_size_up(used, alignment);
626  char *requested_addr = _header->region_addr(i);
627
628  // If a tool agent is in use (debugging enabled), we must map the address space RW
629  if (JvmtiExport::can_modify_any_class() || JvmtiExport::can_walk_any_space()) {
630    si->_read_only = false;
631  }
632
633  // map the contents of the CDS archive in this memory
634  char *base = os::map_memory(_fd, _full_path, si->_file_offset,
635                              requested_addr, size, si->_read_only,
636                              si->_allow_exec);
637  if (base == NULL || base != requested_addr) {
638    fail_continue("Unable to map %s shared space at required address.", shared_region_name[i]);
639    return NULL;
640  }
641#ifdef _WINDOWS
642  // This call is Windows-only because the memory_type gets recorded for the other platforms
643  // in method FileMapInfo::reserve_shared_memory(), which is not called on Windows.
644  MemTracker::record_virtual_memory_type((address)base, mtClassShared);
645#endif
646
647  return base;
648}
649
650static MemRegion *string_ranges = NULL;
651static int num_ranges = 0;
652bool FileMapInfo::map_string_regions() {
653#if INCLUDE_ALL_GCS
654  if (UseG1GC && UseCompressedOops && UseCompressedClassPointers) {
655    // Check that all the narrow oop and klass encodings match the archive
656    if (narrow_oop_mode() != Universe::narrow_oop_mode() ||
657        narrow_oop_shift() != Universe::narrow_oop_shift() ||
658        narrow_klass_base() != Universe::narrow_klass_base() ||
659        narrow_klass_shift() != Universe::narrow_klass_shift()) {
660      if (PrintSharedSpaces && _header->_space[MetaspaceShared::first_string]._used > 0) {
661        tty->print_cr("Shared string data from the CDS archive is being ignored. "
662                     "The current CompressedOops/CompressedClassPointers encoding differs from "
663                     "that archived due to heap size change. The archive was dumped using max heap "
664                     "size " UINTX_FORMAT "M.", max_heap_size()/M);
665      }
666    } else {
667      string_ranges = new MemRegion[MetaspaceShared::max_strings];
668      struct FileMapInfo::FileMapHeader::space_info* si;
669
670      for (int i = MetaspaceShared::first_string;
671               i < MetaspaceShared::first_string + MetaspaceShared::max_strings; i++) {
672        si = &_header->_space[i];
673        size_t used = si->_used;
674        if (used > 0) {
675          size_t size = used;
676          char* requested_addr = (char*)((void*)oopDesc::decode_heap_oop_not_null(
677                                                 (narrowOop)si->_addr._offset));
678          string_ranges[num_ranges] = MemRegion((HeapWord*)requested_addr, size / HeapWordSize);
679          num_ranges ++;
680        }
681      }
682
683      if (num_ranges == 0) {
684        StringTable::ignore_shared_strings(true);
685        return true; // no shared string data
686      }
687
688      // Check that ranges are within the java heap
689      if (!G1CollectedHeap::heap()->check_archive_addresses(string_ranges, num_ranges)) {
690        fail_continue("Unable to allocate shared string space: range is not "
691                      "within java heap.");
692        return false;
693      }
694
695      // allocate from java heap
696      if (!G1CollectedHeap::heap()->alloc_archive_regions(string_ranges, num_ranges)) {
697        fail_continue("Unable to allocate shared string space: range is "
698                      "already in use.");
699        return false;
700      }
701
702      // Map the string data. No need to call MemTracker::record_virtual_memory_type()
703      // for mapped string regions as they are part of the reserved java heap, which
704      // is already recorded.
705      for (int i = 0; i < num_ranges; i++) {
706        si = &_header->_space[MetaspaceShared::first_string + i];
707        char* addr = (char*)string_ranges[i].start();
708        char* base = os::map_memory(_fd, _full_path, si->_file_offset,
709                                    addr, string_ranges[i].byte_size(), si->_read_only,
710                                    si->_allow_exec);
711        if (base == NULL || base != addr) {
712          // dealloc the string regions from java heap
713          dealloc_string_regions();
714          fail_continue("Unable to map shared string space at required address.");
715          return false;
716        }
717      }
718
719      if (!verify_string_regions()) {
720        // dealloc the string regions from java heap
721        dealloc_string_regions();
722        fail_continue("Shared string regions are corrupt");
723        return false;
724      }
725
726      // the shared string data is mapped successfully
727      return true;
728    }
729  } else {
730    if (PrintSharedSpaces && _header->_space[MetaspaceShared::first_string]._used > 0) {
731      tty->print_cr("Shared string data from the CDS archive is being ignored. UseG1GC, "
732                    "UseCompressedOops and UseCompressedClassPointers are required.");
733    }
734  }
735
736  // if we get here, the shared string data is not mapped
737  assert(string_ranges == NULL && num_ranges == 0, "sanity");
738  StringTable::ignore_shared_strings(true);
739#endif
740  return true;
741}
742
743bool FileMapInfo::verify_string_regions() {
744  for (int i = MetaspaceShared::first_string;
745           i < MetaspaceShared::first_string + MetaspaceShared::max_strings; i++) {
746    if (!verify_region_checksum(i)) {
747      return false;
748    }
749  }
750  return true;
751}
752
753void FileMapInfo::fixup_string_regions() {
754#if INCLUDE_ALL_GCS
755  // If any string regions were found, call the fill routine to make them parseable.
756  // Note that string_ranges may be non-NULL even if no ranges were found.
757  if (num_ranges != 0) {
758    assert(string_ranges != NULL, "Null string_ranges array with non-zero count");
759    G1CollectedHeap::heap()->fill_archive_regions(string_ranges, num_ranges);
760  }
761#endif
762}
763
764bool FileMapInfo::verify_region_checksum(int i) {
765  if (!VerifySharedSpaces) {
766    return true;
767  }
768
769  size_t sz = _header->_space[i]._used;
770
771  if (sz == 0) {
772    return true; // no data
773  }
774  if (MetaspaceShared::is_string_region(i) && StringTable::shared_string_ignored()) {
775    return true; // shared string data are not mapped
776  }
777  const char* buf = _header->region_addr(i);
778  int crc = ClassLoader::crc32(0, buf, (jint)sz);
779  if (crc != _header->_space[i]._crc) {
780    fail_continue("Checksum verification failed.");
781    return false;
782  }
783  return true;
784}
785
786// Unmap a memory region in the address space.
787
788void FileMapInfo::unmap_region(int i) {
789  assert(!MetaspaceShared::is_string_region(i), "sanity");
790  struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
791  size_t used = si->_used;
792  size_t size = align_size_up(used, os::vm_allocation_granularity());
793
794  if (used == 0) {
795    return;
796  }
797
798  char* addr = _header->region_addr(i);
799  if (!os::unmap_memory(addr, size)) {
800    fail_stop("Unable to unmap shared space.");
801  }
802}
803
804// dealloc the archived string region from java heap
805void FileMapInfo::dealloc_string_regions() {
806#if INCLUDE_ALL_GCS
807  if (num_ranges > 0) {
808    assert(string_ranges != NULL, "Null string_ranges array with non-zero count");
809    G1CollectedHeap::heap()->dealloc_archive_regions(string_ranges, num_ranges);
810  }
811#endif
812}
813
814void FileMapInfo::assert_mark(bool check) {
815  if (!check) {
816    fail_stop("Mark mismatch while restoring from shared file.");
817  }
818}
819
820
821FileMapInfo* FileMapInfo::_current_info = NULL;
822SharedClassPathEntry* FileMapInfo::_classpath_entry_table = NULL;
823int FileMapInfo::_classpath_entry_table_size = 0;
824size_t FileMapInfo::_classpath_entry_size = 0x1234baad;
825bool FileMapInfo::_validating_classpath_entry_table = false;
826
827// Open the shared archive file, read and validate the header
828// information (version, boot classpath, etc.).  If initialization
829// fails, shared spaces are disabled and the file is closed. [See
830// fail_continue.]
831//
832// Validation of the archive is done in two steps:
833//
834// [1] validate_header() - done here. This checks the header, including _paths_misc_info.
835// [2] validate_classpath_entry_table - this is done later, because the table is in the RW
836//     region of the archive, which is not mapped yet.
837bool FileMapInfo::initialize() {
838  assert(UseSharedSpaces, "UseSharedSpaces expected.");
839
840  if (!open_for_read()) {
841    return false;
842  }
843
844  init_from_file(_fd);
845  if (!validate_header()) {
846    return false;
847  }
848
849  SharedReadOnlySize =  _header->_space[0]._capacity;
850  SharedReadWriteSize = _header->_space[1]._capacity;
851  SharedMiscDataSize =  _header->_space[2]._capacity;
852  SharedMiscCodeSize =  _header->_space[3]._capacity;
853  return true;
854}
855
856char* FileMapInfo::FileMapHeader::region_addr(int idx) {
857  if (MetaspaceShared::is_string_region(idx)) {
858    return (char*)((void*)oopDesc::decode_heap_oop_not_null(
859              (narrowOop)_space[idx]._addr._offset));
860  } else {
861    return _space[idx]._addr._base;
862  }
863}
864
865int FileMapInfo::FileMapHeader::compute_crc() {
866  char* header = data();
867  // start computing from the field after _crc
868  char* buf = (char*)&_crc + sizeof(int);
869  size_t sz = data_size() - (buf - header);
870  int crc = ClassLoader::crc32(0, buf, (jint)sz);
871  return crc;
872}
873
874bool FileMapInfo::FileMapHeader::validate() {
875  if (VerifySharedSpaces && compute_crc() != _crc) {
876    fail_continue("Header checksum verification failed.");
877    return false;
878  }
879
880  if (_version != current_version()) {
881    FileMapInfo::fail_continue("The shared archive file is the wrong version.");
882    return false;
883  }
884  if (_magic != (int)0xf00baba2) {
885    FileMapInfo::fail_continue("The shared archive file has a bad magic number.");
886    return false;
887  }
888  char header_version[JVM_IDENT_MAX];
889  get_header_version(header_version);
890  if (strncmp(_jvm_ident, header_version, JVM_IDENT_MAX-1) != 0) {
891    if (TraceClassPaths) {
892      tty->print_cr("Expected: %s", header_version);
893      tty->print_cr("Actual:   %s", _jvm_ident);
894    }
895    FileMapInfo::fail_continue("The shared archive file was created by a different"
896                  " version or build of HotSpot");
897    return false;
898  }
899  if (_obj_alignment != ObjectAlignmentInBytes) {
900    FileMapInfo::fail_continue("The shared archive file's ObjectAlignmentInBytes of %d"
901                  " does not equal the current ObjectAlignmentInBytes of " INTX_FORMAT ".",
902                  _obj_alignment, ObjectAlignmentInBytes);
903    return false;
904  }
905  if (_compact_strings != CompactStrings) {
906    FileMapInfo::fail_continue("The shared archive file's CompactStrings setting (%s)"
907                  " does not equal the current CompactStrings setting (%s).",
908                  _compact_strings ? "enabled" : "disabled",
909                  CompactStrings   ? "enabled" : "disabled");
910    return false;
911  }
912
913  return true;
914}
915
916bool FileMapInfo::validate_header() {
917  bool status = _header->validate();
918
919  if (status) {
920    if (!ClassLoader::check_shared_paths_misc_info(_paths_misc_info, _header->_paths_misc_info_size)) {
921      if (!PrintSharedArchiveAndExit) {
922        fail_continue("shared class paths mismatch (hint: enable -XX:+TraceClassPaths to diagnose the failure)");
923        status = false;
924      }
925    }
926  }
927
928  if (_paths_misc_info != NULL) {
929    FREE_C_HEAP_ARRAY(char, _paths_misc_info);
930    _paths_misc_info = NULL;
931  }
932  return status;
933}
934
935// The following method is provided to see whether a given pointer
936// falls in the mapped shared space.
937// Param:
938// p, The given pointer
939// Return:
940// True if the p is within the mapped shared space, otherwise, false.
941bool FileMapInfo::is_in_shared_space(const void* p) {
942  for (int i = 0; i < MetaspaceShared::n_regions; i++) {
943    char *base;
944    if (MetaspaceShared::is_string_region(i) && _header->_space[i]._used == 0) {
945      continue;
946    }
947    base = _header->region_addr(i);
948    if (p >= base && p < base + _header->_space[i]._used) {
949      return true;
950    }
951  }
952
953  return false;
954}
955
956void FileMapInfo::print_shared_spaces() {
957  tty->print_cr("Shared Spaces:");
958  for (int i = 0; i < MetaspaceShared::n_regions; i++) {
959    struct FileMapInfo::FileMapHeader::space_info* si = &_header->_space[i];
960    char *base = _header->region_addr(i);
961    tty->print("  %s " INTPTR_FORMAT "-" INTPTR_FORMAT,
962                        shared_region_name[i],
963                        p2i(base), p2i(base + si->_used));
964  }
965}
966
967// Unmap mapped regions of shared space.
968void FileMapInfo::stop_sharing_and_unmap(const char* msg) {
969  FileMapInfo *map_info = FileMapInfo::current_info();
970  if (map_info) {
971    map_info->fail_continue("%s", msg);
972    for (int i = 0; i < MetaspaceShared::num_non_strings; i++) {
973      char *addr = map_info->_header->region_addr(i);
974      if (addr != NULL && !MetaspaceShared::is_string_region(i)) {
975        map_info->unmap_region(i);
976        map_info->_header->_space[i]._addr._base = NULL;
977      }
978    }
979    // Dealloc the string regions only without unmapping. The string regions are part
980    // of the java heap. Unmapping of the heap regions are managed by GC.
981    map_info->dealloc_string_regions();
982  } else if (DumpSharedSpaces) {
983    fail_stop("%s", msg);
984  }
985}
986