hotspot/src/share/vm/runtime/icache.hpp
author coleenp
Wed, 20 Mar 2013 08:04:54 -0400
changeset 16430 882cddc35bec
parent 8921 14bfe81f2a9d
child 29180 50369728b00e
permissions -rw-r--r--
8008217: CDS: Class data sharing limits the malloc heap on Solaris Summary: In 64bit VM move CDS archive address to 32G on all platforms using new flag SharedBaseAddress. In 32bit VM set CDS archive address to 3Gb on Linux and let other OSs pick the address. Reviewed-by: kvn, dcubed, zgu, hseigel
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
8921
14bfe81f2a9d 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 8107
diff changeset
     2
 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#ifndef SHARE_VM_RUNTIME_ICACHE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#define SHARE_VM_RUNTIME_ICACHE_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "runtime/stubCodeGenerator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// Interface for updating the instruction cache.  Whenever the VM modifies
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
// code, part of the processor instruction cache potentially has to be flushed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// Default implementation is in icache.cpp, and can be hidden per-platform.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
// Most platforms must provide only ICacheStubGenerator::generate_icache_flush().
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
// Platforms that don't require icache flushing can just nullify the public
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// members of AbstractICache in their ICache class.  AbstractICache should never
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// be referenced other than by deriving the ICache class from it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
// The code for the ICache class and for generate_icache_flush() must be in
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// architecture-specific files, i.e., icache_<arch>.hpp/.cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
class AbstractICache : AllStatic {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  // The flush stub signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  typedef int (*flush_icache_stub_t)(address addr, int lines, int magic);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  // The flush stub function address
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  static flush_icache_stub_t _flush_icache_stub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  // Call the flush stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  static void call_flush_stub(address start, int lines);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
    stub_size      = 0, // Size of the icache flush stub in bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
    line_size      = 0, // Icache line size in bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
    log2_line_size = 0  // log2(line_size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  static void initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  static void invalidate_word(address addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  static void invalidate_range(address start, int nbytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
// Must be included before the definition of ICacheStubGenerator
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
// because ICacheStubGenerator uses ICache definitions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    71
#ifdef TARGET_ARCH_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    72
# include "icache_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    73
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    74
#ifdef TARGET_ARCH_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    75
# include "icache_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    76
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    77
#ifdef TARGET_ARCH_zero
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    78
# include "icache_zero.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    79
#endif
8107
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    80
#ifdef TARGET_ARCH_arm
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    81
# include "icache_arm.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    82
#endif
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    83
#ifdef TARGET_ARCH_ppc
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    84
# include "icache_ppc.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    85
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    86
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
class ICacheStubGenerator : public StubCodeGenerator {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  ICacheStubGenerator(CodeBuffer *c) : StubCodeGenerator(c) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  // Generate the icache flush stub.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  // Since we cannot flush the cache when this stub is generated,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  // it must be generated first, and just to be sure, we do extra
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  // work to allow a check that these instructions got executed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  // The flush stub has three parameters (see flush_icache_stub_t).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  //   addr  - Start address, must be aligned at log2_line_size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  //   lines - Number of line_size icache lines to flush
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  //   magic - Magic number copied to result register to make sure
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  //           the stub executed properly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // A template for generate_icache_flush is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  //    #define __ _masm->
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  //    void ICacheStubGenerator::generate_icache_flush(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  //      ICache::flush_icache_stub_t* flush_icache_stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  //    ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  //      StubCodeMark mark(this, "ICache", "flush_icache_stub");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  //      address start = __ pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  //      // emit flush stub asm code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  //      // Must be set here so StubCodeMark destructor can call the flush stub.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  //      *flush_icache_stub = (ICache::flush_icache_stub_t)start;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  //    };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  //    #undef __
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  // The first use of flush_icache_stub must apply it to itself.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  // StubCodeMark destructor in generate_icache_flush will call Assembler::flush,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  // which in turn will call invalidate_range (see asm/assembler.cpp), which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  // in turn will call the flush stub *before* generate_icache_flush returns.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  // The usual method of having generate_icache_flush return the address of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  // stub to its caller, which would then, e.g., store that address in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  // flush_icache_stub, won't work.  generate_icache_flush must itself set
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  // flush_icache_stub to the address of the stub it generates before
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  // the StubCodeMark destructor is invoked.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  void generate_icache_flush(ICache::flush_icache_stub_t* flush_icache_stub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   137
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   138
#endif // SHARE_VM_RUNTIME_ICACHE_HPP