src/hotspot/cpu/s390/frame_s390.hpp
author vlivanov
Wed, 24 Jul 2019 10:50:40 +0300
changeset 57574 6a159c6c23cc
parent 53244 9807daeb47c4
permissions -rw-r--r--
8227260: JNI upcalls should bypass class initialization barrier in c2i adapter Reviewed-by: eosterlund, dholmes, mdoerr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     1
/*
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 52055
diff changeset
     2
 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     3
 * Copyright (c) 2016 SAP SE. All rights reserved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     5
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     8
 * published by the Free Software Foundation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     9
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    14
 * accompanied this code).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    15
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    19
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    22
 * questions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    23
 *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    24
 */
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    25
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    26
// Major contributions by ML, AHa.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    27
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 52055
diff changeset
    28
#ifndef CPU_S390_FRAME_S390_HPP
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 52055
diff changeset
    29
#define CPU_S390_FRAME_S390_HPP
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    30
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    31
#include "runtime/synchronizer.hpp"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    33
  //  C frame layout on ZARCH_64.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    34
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    35
  //  In this figure the stack grows upwards, while memory grows
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    36
  //  downwards. See "Linux for zSeries: ELF Application Binary Interface Supplement",
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    37
  //  IBM Corp. (LINUX-1107-01)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    38
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    39
  //  Square brackets denote stack regions possibly larger
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    40
  //  than a single 64 bit slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    41
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    42
  //  STACK:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    43
  //    0       [C_FRAME]               <-- SP after prolog (mod 8 = 0)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    44
  //            [C_FRAME]               <-- SP before prolog
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    45
  //            ...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    46
  //            [C_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    47
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    48
  //  C_FRAME:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    49
  //    0       [ABI_160]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    50
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    51
  //  ABI_160:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    52
  //    0       [ABI_16]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    53
  //    16      CARG_1: spill slot for outgoing arg 1. used by next callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    54
  //    24      CARG_2: spill slot for outgoing arg 2. used by next callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    55
  //    32      CARG_3: spill slot for outgoing arg 3. used by next callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    56
  //    40      CARG_4: spill slot for outgoing arg 4. used by next callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    57
  //    48      GPR_6:  spill slot for GPR_6. used by next callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    58
  //    ...     ...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    59
  //    120     GPR_15:  spill slot for GPR_15. used by next callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    60
  //    128     CFARG_1: spill slot for outgoing fp arg 1. used by next callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    61
  //    136     CFARG_2: spill slot for outgoing fp arg 2. used by next callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    62
  //    144     CFARG_3: spill slot for outgoing fp arg 3. used by next callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    63
  //    152     CFARG_4: spill slot for outgoing fp arg 4. used by next callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    64
  //    160     [REMAINING CARGS]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    65
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    66
  //  ABI_16:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    67
  //    0       callers_sp
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    68
  //    8       return_pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    69
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    70
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    71
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    72
  // C frame layout
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    73
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    74
  typedef enum {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    75
     // stack alignment
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    76
     alignment_in_bytes = 8,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    77
     // log_2(8*8 bits) = 6.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    78
     log_2_of_alignment_in_bits = 6
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    79
  } frame_constants;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    80
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    81
  struct z_abi_16 {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    82
    uint64_t callers_sp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    83
    uint64_t return_pc;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    84
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    85
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    86
  enum {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    87
    z_abi_16_size = sizeof(z_abi_16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    88
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    89
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    90
  #define _z_abi16(_component) \
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    91
          (offset_of(frame::z_abi_16, _component))
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    92
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    93
  // ABI_160:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    94
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    95
  // REMARK: This structure should reflect the "minimal" ABI frame
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    96
  // layout, but it doesn't. There is an extra field at the end of the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    97
  // structure that marks the area where arguments are passed, when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    98
  // the argument registers "overflow". Thus, sizeof(z_abi_160)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    99
  // doesn't yield the expected (and desired) result. Therefore, as
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   100
  // long as we do not provide extra infrastructure, one should use
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   101
  // either z_abi_160_size, or _z_abi(remaining_cargs) instead of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   102
  // sizeof(...).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   103
  struct z_abi_160 {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   104
    uint64_t callers_sp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   105
    uint64_t return_pc;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   106
    uint64_t carg_1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   107
    uint64_t carg_2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   108
    uint64_t carg_3;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   109
    uint64_t carg_4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   110
    uint64_t gpr6;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   111
    uint64_t gpr7;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   112
    uint64_t gpr8;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   113
    uint64_t gpr9;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   114
    uint64_t gpr10;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   115
    uint64_t gpr11;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   116
    uint64_t gpr12;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   117
    uint64_t gpr13;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   118
    uint64_t gpr14;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   119
    uint64_t gpr15;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   120
    uint64_t cfarg_1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   121
    uint64_t cfarg_2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   122
    uint64_t cfarg_3;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   123
    uint64_t cfarg_4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   124
    uint64_t remaining_cargs;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   125
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   126
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   127
  enum {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   128
    z_abi_160_size = 160
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   129
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   130
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   131
  #define _z_abi(_component) \
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   132
          (offset_of(frame::z_abi_160, _component))
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   133
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   134
  struct z_abi_160_spill : z_abi_160 {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   135
   // Additional spill slots. Use as 'offset_of(z_abi_160_spill, spill[n])'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   136
    uint64_t spill[0];
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   137
    // Aligned to frame::alignment_in_bytes (16).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   138
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   139
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   140
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   141
  // non-volatile GPRs:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   142
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   143
  struct z_spill_nonvolatiles {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   144
    uint64_t r6;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   145
    uint64_t r7;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   146
    uint64_t r8;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   147
    uint64_t r9;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   148
    uint64_t r10;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   149
    uint64_t r11;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   150
    uint64_t r12;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   151
    uint64_t r13;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   152
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   153
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   154
  enum {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   155
    z_spill_nonvolatiles_size = sizeof(z_spill_nonvolatiles)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   156
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   157
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   158
  #define _z_spill_nonvolatiles_neg(_component) \
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   159
          (-frame::z_spill_nonvolatiles_size + offset_of(frame::z_spill_nonvolatiles, _component))
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   160
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   161
  // Frame layout for the Java template interpreter on z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   162
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   163
  // In these figures the stack grows upwards, while memory grows
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   164
  // downwards. Square brackets denote regions possibly larger than
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   165
  // single 64 bit slots.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   166
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   167
  // STACK (no JNI, no compiled code, no library calls, template interpreter is active):
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   168
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   169
  //   0       [TOP_IJAVA_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   170
  //           [PARENT_IJAVA_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   171
  //           [PARENT_IJAVA_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   172
  //           ...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   173
  //           [PARENT_IJAVA_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   174
  //           [ENTRY_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   175
  //           [C_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   176
  //           ...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   177
  //           [C_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   178
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   179
  // TOP_IJAVA_FRAME:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   180
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   181
  //   0       [TOP_IJAVA_FRAME_ABI]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   182
  //   16      [operand stack]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   183
  //           [monitors]      (optional)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   184
  //           [IJAVA_STATE]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   185
  //           note: Own locals are located in the caller frame.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   186
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   187
  // PARENT_IJAVA_FRAME:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   188
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   189
  //   0       [PARENT_IJAVA_FRAME_ABI]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   190
  //           [callee's locals w/o arguments]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   191
  //           [outgoing arguments]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   192
  //           [used part of operand stack w/o arguments]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   193
  //           [monitors]      (optional)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   194
  //           [IJAVA_STATE]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   195
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   196
  // ENTRY_FRAME:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   197
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   198
  //   0       [PARENT_IJAVA_FRAME_ABI]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   199
  //           [callee's locals w/o arguments]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   200
  //           [outgoing arguments]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   201
  //           [ENTRY_FRAME_LOCALS]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   202
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   203
  // TOP_IJAVA_FRAME_ABI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   204
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   205
  //   0       [ABI_160]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   206
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   207
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   208
  // PARENT_IJAVA_FRAME_ABI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   209
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   210
  //   0       [ABI_16]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   211
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   212
  // IJAVA_STATE:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   213
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   214
  //   0       method
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   215
  //   8       locals
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   216
  //           monitors               : monitor block top (i.e. lowest address)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   217
  //           cpoolCache
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   218
  //           bcp
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   219
  //           mdx
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   220
  //           esp                    : Points to first slot above operands.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   221
  //           sender_sp              : See comment in z_ijava_state.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   222
  //           top_frame_sp           : Own SP before modification by i2c adapter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   223
  //           oop_tmp
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   224
  //           lresult
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   225
  //           fresult
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   226
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   227
  // EXAMPLE:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   228
  // ---------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   229
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   230
  // 3 monitors, 5 operand stack slots max. / 3 allocated
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   231
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   232
  //    F0      callers_sp               <- Z_SP (callers_sp == Z_fp (own fp))
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   233
  //            return_pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   234
  //            [rest of ABI_160]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   235
  //           /slot 4: free
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   236
  //    oper. | slot 3: free             <- Z_esp points to first free slot
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   237
  //    stack | slot 2: ref val v2                caches IJAVA_STATE.esp
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   238
  //          | slot 1: unused
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   239
  //           \slot 0: long val v1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   240
  //           /slot 5                   <- IJAVA_STATE.monitors  = monitor block top
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   241
  //          | slot 4
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   242
  //  monitors| slot 3
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   243
  //          | slot 2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   244
  //          | slot 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   245
  //           \slot 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   246
  //            [IJAVA_STATE]            <- monitor block bot (points to first byte in IJAVA_STATE)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   247
  //    F1      [PARENT_IJAVA_FRAME_ABI] <- Z_fp (== *Z_SP, points to slot just below IJAVA_STATE)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   248
  //            [F0's locals]            <- Z_locals, locals[i] := *(Z_locals - i*BytesPerWord)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   249
  //            [F1's operand stack]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   250
  //            [F1's monitors]      (optional)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   251
  //            [IJAVA_STATE]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   252
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   253
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   254
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   255
  // PARENT_IJAVA_FRAME_ABI
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   256
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   257
  struct z_parent_ijava_frame_abi : z_abi_16 {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   258
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   259
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   260
  enum {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   261
    z_parent_ijava_frame_abi_size = sizeof(z_parent_ijava_frame_abi)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   262
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   263
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   264
  #define _z_parent_ijava_frame_abi(_component) \
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   265
          (offset_of(frame::z_parent_ijava_frame_abi, _component))
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   266
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   267
  // TOP_IJAVA_FRAME_ABI
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   268
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   269
  struct z_top_ijava_frame_abi : z_abi_160 {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   270
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   271
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   272
  enum {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   273
    z_top_ijava_frame_abi_size = sizeof(z_top_ijava_frame_abi)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   274
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   275
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   276
  #define _z_top_ijava_frame_abi(_component) \
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   277
          (offset_of(frame::z_top_ijava_frame_abi, _component))
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   278
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   279
  // IJAVA_STATE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   280
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   281
  struct z_ijava_state{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   282
    DEBUG_ONLY(uint64_t magic;) // wrong magic -> wrong state!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   283
    uint64_t method;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   284
    uint64_t mirror;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   285
    uint64_t locals;       // Z_locals
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   286
    uint64_t monitors;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   287
    uint64_t cpoolCache;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   288
    uint64_t bcp;          // Z_bcp
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   289
    uint64_t mdx;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   290
    uint64_t esp;          // Z_esp
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   291
    // Caller's original SP before modification by c2i adapter (if caller is compiled)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   292
    // and before top -> parent frame conversion by the interpreter entry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   293
    // Note: for i2i calls a correct sender_sp is required, too, because there
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   294
    // we cannot use the caller's top_frame_sp as sp when removing the callee
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   295
    // frame (caller could be compiled or entry frame). Therefore the sender_sp
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   296
    // has to be the interpreted caller's sp as TOP_IJAVA_FRAME. See also
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   297
    // AbstractInterpreter::layout_activation() used by deoptimization.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   298
    uint64_t sender_sp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   299
    // Own SP before modification by i2c adapter and top-2-parent-resize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   300
    // by interpreted callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   301
    uint64_t top_frame_sp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   302
    // Slots only needed for native calls. Maybe better to move elsewhere.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   303
    uint64_t oop_tmp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   304
    uint64_t lresult;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   305
    uint64_t fresult;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   306
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   307
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   308
  enum  {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   309
    z_ijava_state_size = sizeof(z_ijava_state)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   310
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   311
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   312
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   313
  enum  {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   314
    z_istate_magic_number = 0x900d // ~= good magic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   315
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   316
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   317
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   318
#define _z_ijava_state_neg(_component) \
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   319
         (int) (-frame::z_ijava_state_size + offset_of(frame::z_ijava_state, _component))
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   320
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   321
  // ENTRY_FRAME
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   322
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   323
  struct z_entry_frame_locals {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   324
    uint64_t call_wrapper_address;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   325
    uint64_t result_address;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   326
    uint64_t result_type;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   327
    uint64_t arguments_tos_address;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   328
    // Callee saved registers are spilled to caller frame.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   329
    // Caller must have z_abi_160.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   330
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   331
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   332
  enum {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   333
    z_entry_frame_locals_size = sizeof(z_entry_frame_locals)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   334
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   335
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   336
  #define _z_entry_frame_locals_neg(_component) \
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   337
          (int) (-frame::z_entry_frame_locals_size + offset_of(frame::z_entry_frame_locals, _component))
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   338
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   339
  //  Frame layout for JIT generated methods
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   340
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   341
  //  In these figures the stack grows upwards, while memory grows
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   342
  //  downwards. Square brackets denote regions possibly larger than single
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   343
  //  64 bit slots.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   344
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   345
  //  STACK (interpreted Java calls JIT generated Java):
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   346
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   347
  //          [JIT_FRAME]                                <-- SP (mod 16 = 0)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   348
  //          [TOP_IJAVA_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   349
  //         ...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   350
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   351
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   352
  //  JIT_FRAME (is a C frame according to z/Architecture ABI):
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   353
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   354
  //          [out_preserve]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   355
  //          [out_args]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   356
  //          [spills]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   357
  //          [monitor] (optional)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   358
  //       ...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   359
  //          [monitor] (optional)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   360
  //          [in_preserve] added / removed by prolog / epilog
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   361
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   362
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   363
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   364
   struct z_top_jit_abi_32 {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   365
     uint64_t callers_sp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   366
     uint64_t return_pc;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   367
     uint64_t toc;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   368
     uint64_t tmp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   369
   };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   370
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   371
  #define _z_top_jit_abi(_component) \
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   372
          (offset_of(frame::z_top_jit_abi_32, _component))
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   373
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   374
  struct jit_monitor {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   375
        uint64_t monitor[1];
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   376
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   377
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   378
  struct jit_in_preserve {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   379
    // Used to provide a z/Architecture ABI on top of a jit frame.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   380
    // nothing to add here!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   381
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   382
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   383
  struct jit_out_preserve : z_top_jit_abi_32 {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   384
    // Nothing to add here!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   385
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   386
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   387
  enum {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   388
    z_jit_out_preserve_size = sizeof(jit_out_preserve)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   389
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   390
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   391
  typedef enum {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   392
     jit_monitor_size_in_4_byte_units = sizeof(jit_monitor) / 4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   393
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   394
     // Stack alignment requirement. Log_2 of alignment size in bits.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   395
     // log_2(16*8 bits) = 7.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   396
     jit_log_2_of_stack_alignment_in_bits = 7,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   397
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   398
     jit_out_preserve_size_in_4_byte_units = sizeof(jit_out_preserve) / 4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   399
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   400
     jit_in_preserve_size_in_4_byte_units = sizeof(jit_in_preserve) / 4
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   401
  } jit_frame_constants;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   402
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   403
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   404
  // C2I adapter frames:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   405
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   406
  // STACK (interpreted called from compiled, on entry to frame manager):
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   407
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   408
  //       [TOP_C2I_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   409
  //       [JIT_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   410
  //       ...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   411
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   412
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   413
  // STACK (interpreted called from compiled, after interpreter has been pushed):
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   414
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   415
  //       [TOP_IJAVA_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   416
  //       [PARENT_C2I_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   417
  //       [JIT_FRAME]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   418
  //       ...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   419
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   420
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   421
  // TOP_C2I_FRAME:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   422
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   423
  //       [TOP_IJAVA_FRAME_ABI]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   424
  //       [outgoing Java arguments]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   425
  //       alignment (optional)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   426
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   427
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   428
  // PARENT_C2I_FRAME:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   429
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   430
  //       [PARENT_IJAVA_FRAME_ABI]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   431
  //       alignment (optional)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   432
  //       [callee's locals w/o arguments]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   433
  //       [outgoing Java arguments]
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   434
  //       alignment (optional)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   435
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   436
 private:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   437
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   438
  //  STACK:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   439
  //            ...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   440
  //            [THIS_FRAME]             <-- this._sp (stack pointer for this frame)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   441
  //            [CALLER_FRAME]           <-- this.fp() (_sp of caller's frame)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   442
  //            ...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   443
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   444
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   445
  // NOTE: Stack pointer is now held in the base class, so remove it from here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   446
51397
c9150700bbd0 8209433: [s390] Fix build, broken by 8208672 (Enable -Wreorder)
lucy
parents: 49622
diff changeset
   447
  // Needed by deoptimization.
c9150700bbd0 8209433: [s390] Fix build, broken by 8208672 (Enable -Wreorder)
lucy
parents: 49622
diff changeset
   448
  intptr_t* _unextended_sp;
c9150700bbd0 8209433: [s390] Fix build, broken by 8208672 (Enable -Wreorder)
lucy
parents: 49622
diff changeset
   449
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   450
  // Frame pointer for this frame.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   451
  intptr_t* _fp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   452
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   453
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   454
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   455
  // Interface for all frames:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   456
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   457
  // Accessors
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   458
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   459
  inline intptr_t* fp() const { return _fp; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   460
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   461
 private:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   462
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   463
  inline void find_codeblob_and_set_pc_and_deopt_state(address pc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   464
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   465
 // Constructors
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   466
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   467
 public:
49622
c96f6f8984f7 8200302: ppc, s390 (non-pch) build errors
stuefe
parents: 49480
diff changeset
   468
  inline frame(intptr_t* sp);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   469
  // To be used, if sp was not extended to match callee's calling convention.
49622
c96f6f8984f7 8200302: ppc, s390 (non-pch) build errors
stuefe
parents: 49480
diff changeset
   470
  inline frame(intptr_t* sp, address pc);
c96f6f8984f7 8200302: ppc, s390 (non-pch) build errors
stuefe
parents: 49480
diff changeset
   471
  inline frame(intptr_t* sp, address pc, intptr_t* unextended_sp);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   472
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   473
  // Access frame via stack pointer.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   474
  inline intptr_t* sp_addr_at(int index) const  { return &sp()[index]; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   475
  inline intptr_t  sp_at(     int index) const  { return *sp_addr_at(index); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   476
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   477
  // Access ABIs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   478
  inline z_abi_16*  own_abi()     const { return (z_abi_16*) sp(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   479
  inline z_abi_160* callers_abi() const { return (z_abi_160*) fp(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   480
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   481
 private:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   482
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   483
  intptr_t* compiled_sender_sp(CodeBlob* cb) const;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   484
  address*  compiled_sender_pc_addr(CodeBlob* cb) const;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   485
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   486
  address* sender_pc_addr(void) const;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   487
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   488
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   489
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   490
  // Additional interface for interpreter frames:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   491
  static int interpreter_frame_interpreterstate_size_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   492
  static int interpreter_frame_monitor_size_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   493
52055
9f154d0a59f6 8211768: [s390] Implement JFR profiling
ghaug
parents: 51397
diff changeset
   494
9f154d0a59f6 8211768: [s390] Implement JFR profiling
ghaug
parents: 51397
diff changeset
   495
  // template interpreter state
9f154d0a59f6 8211768: [s390] Implement JFR profiling
ghaug
parents: 51397
diff changeset
   496
  inline z_ijava_state* ijava_state_unchecked() const;
9f154d0a59f6 8211768: [s390] Implement JFR profiling
ghaug
parents: 51397
diff changeset
   497
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   498
 private:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   499
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   500
  inline z_ijava_state* ijava_state() const;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   501
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   502
  // Where z_ijava_state.monitors is saved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   503
  inline BasicObjectLock**  interpreter_frame_monitors_addr() const;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   504
  // Where z_ijava_state.esp is saved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   505
  inline intptr_t** interpreter_frame_esp_addr() const;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   506
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   507
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   508
  inline intptr_t* interpreter_frame_top_frame_sp();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   509
  inline void interpreter_frame_set_tos_address(intptr_t* x);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   510
  inline void interpreter_frame_set_top_frame_sp(intptr_t* top_frame_sp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   511
  inline void interpreter_frame_set_sender_sp(intptr_t* sender_sp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   512
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   513
  inline void interpreter_frame_set_magic();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   514
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   515
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   516
  // monitors:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   517
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   518
  // Next two functions read and write z_ijava_state.monitors.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   519
 private:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   520
  inline BasicObjectLock* interpreter_frame_monitors() const;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   521
  inline void interpreter_frame_set_monitors(BasicObjectLock* monitors);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   522
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   523
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   524
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   525
  // Additional interface for entry frames:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   526
  inline z_entry_frame_locals* entry_frame_locals() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   527
    return (z_entry_frame_locals*) (((address) fp()) - z_entry_frame_locals_size);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   528
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   529
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   530
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   531
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   532
  // Get caller pc from stack slot of gpr14.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   533
  address native_sender_pc() const;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   534
  // Get caller pc from stack slot of gpr10.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   535
  address callstub_sender_pc() const;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   536
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   537
  // Dump all frames starting at a given C stack pointer.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   538
  // max_frames: Limit number of traced frames.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   539
  //             <= 0 --> full trace
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   540
  //             > 0  --> trace the #max_frames topmost frames
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   541
  static void back_trace(outputStream* st, intptr_t* start_sp, intptr_t* top_pc,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   542
                         unsigned long flags, int max_frames = 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   543
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   544
  enum {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   545
    // This enum value specifies the offset from the pc remembered by
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   546
    // call instructions to the location where control returns to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   547
    // after a normal return. Most architectures remember the return
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   548
    // location directly, i.e. the offset is zero. This is the case
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   549
    // for z/Architecture, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   550
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   551
    // Normal return address is the instruction following the branch.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   552
    pc_return_offset =  0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   553
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   554
49480
d7df2dd501ce 8199809: Don't include frame.inline.hpp and other.inline.hpp from .hpp files
coleenp
parents: 47216
diff changeset
   555
  static jint interpreter_frame_expression_stack_direction() { return -1; }
d7df2dd501ce 8199809: Don't include frame.inline.hpp and other.inline.hpp from .hpp files
coleenp
parents: 47216
diff changeset
   556
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 52055
diff changeset
   557
#endif // CPU_S390_FRAME_S390_HPP