1/*
2 * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
3 * Copyright (c) 2012, 2015 SAP SE. All rights reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 *
24 */
25
26#ifndef CPU_PPC_VM_FRAME_PPC_HPP
27#define CPU_PPC_VM_FRAME_PPC_HPP
28
29#include "runtime/synchronizer.hpp"
30
31  //  C frame layout on PPC-64.
32  //
33  //  In this figure the stack grows upwards, while memory grows
34  //  downwards. See "64-bit PowerPC ELF ABI Supplement Version 1.7",
35  //  IBM Corp. (2003-10-29)
36  //  (http://math-atlas.sourceforge.net/devel/assembly/PPC-elf64abi-1.7.pdf).
37  //
38  //  Square brackets denote stack regions possibly larger
39  //  than a single 64 bit slot.
40  //
41  //  STACK:
42  //    0       [C_FRAME]               <-- SP after prolog (mod 16 = 0)
43  //            [C_FRAME]               <-- SP before prolog
44  //            ...
45  //            [C_FRAME]
46  //
47  //  C_FRAME:
48  //    0       [ABI_REG_ARGS]
49  //    112     CARG_9: outgoing arg 9 (arg_1 ... arg_8 via gpr_3 ... gpr_{10})
50  //            ...
51  //    40+M*8  CARG_M: outgoing arg M (M is the maximum of outgoing args taken over all call sites in the procedure)
52  //            local 1
53  //            ...
54  //            local N
55  //            spill slot for vector reg (16 bytes aligned)
56  //            ...
57  //            spill slot for vector reg
58  //            alignment       (4 or 12 bytes)
59  //    V       SR_VRSAVE
60  //    V+4     spill slot for GR
61  //    ...     ...
62  //            spill slot for GR
63  //            spill slot for FR
64  //            ...
65  //            spill slot for FR
66  //
67  //  ABI_48:
68  //    0       caller's SP
69  //    8       space for condition register (CR) for next call
70  //    16      space for link register (LR) for next call
71  //    24      reserved
72  //    32      reserved
73  //    40      space for TOC (=R2) register for next call
74  //
75  //  ABI_REG_ARGS:
76  //    0       [ABI_48]
77  //    48      CARG_1: spill slot for outgoing arg 1. used by next callee.
78  //    ...     ...
79  //    104     CARG_8: spill slot for outgoing arg 8. used by next callee.
80  //
81
82 public:
83
84  // C frame layout
85
86  enum {
87    // stack alignment
88    alignment_in_bytes = 16,
89    // log_2(16*8 bits) = 7.
90    log_2_of_alignment_in_bits = 7
91  };
92
93  // ABI_MINFRAME:
94  struct abi_minframe {
95    uint64_t callers_sp;
96    uint64_t cr;                                  //_16
97    uint64_t lr;
98#if !defined(ABI_ELFv2)
99    uint64_t reserved1;                           //_16
100    uint64_t reserved2;
101#endif
102    uint64_t toc;                                 //_16
103    // nothing to add here!
104    // aligned to frame::alignment_in_bytes (16)
105  };
106
107  enum {
108    abi_minframe_size = sizeof(abi_minframe)
109  };
110
111  struct abi_reg_args : abi_minframe {
112    uint64_t carg_1;
113    uint64_t carg_2;                              //_16
114    uint64_t carg_3;
115    uint64_t carg_4;                              //_16
116    uint64_t carg_5;
117    uint64_t carg_6;                              //_16
118    uint64_t carg_7;
119    uint64_t carg_8;                              //_16
120    // aligned to frame::alignment_in_bytes (16)
121  };
122
123  enum {
124    abi_reg_args_size = sizeof(abi_reg_args)
125  };
126
127  #define _abi(_component) \
128          (offset_of(frame::abi_reg_args, _component))
129
130  struct abi_reg_args_spill : abi_reg_args {
131    // additional spill slots
132    uint64_t spill_ret;
133    uint64_t spill_fret;                          //_16
134    // aligned to frame::alignment_in_bytes (16)
135  };
136
137  enum {
138    abi_reg_args_spill_size = sizeof(abi_reg_args_spill)
139  };
140
141  #define _abi_reg_args_spill(_component) \
142          (offset_of(frame::abi_reg_args_spill, _component))
143
144  // non-volatile GPRs:
145
146  struct spill_nonvolatiles {
147    uint64_t r14;
148    uint64_t r15;                                 //_16
149    uint64_t r16;
150    uint64_t r17;                                 //_16
151    uint64_t r18;
152    uint64_t r19;                                 //_16
153    uint64_t r20;
154    uint64_t r21;                                 //_16
155    uint64_t r22;
156    uint64_t r23;                                 //_16
157    uint64_t r24;
158    uint64_t r25;                                 //_16
159    uint64_t r26;
160    uint64_t r27;                                 //_16
161    uint64_t r28;
162    uint64_t r29;                                 //_16
163    uint64_t r30;
164    uint64_t r31;                                 //_16
165
166    double f14;
167    double f15;
168    double f16;
169    double f17;
170    double f18;
171    double f19;
172    double f20;
173    double f21;
174    double f22;
175    double f23;
176    double f24;
177    double f25;
178    double f26;
179    double f27;
180    double f28;
181    double f29;
182    double f30;
183    double f31;
184
185    // aligned to frame::alignment_in_bytes (16)
186  };
187
188  enum {
189    spill_nonvolatiles_size = sizeof(spill_nonvolatiles)
190  };
191
192  #define _spill_nonvolatiles_neg(_component) \
193     (int)(-frame::spill_nonvolatiles_size + offset_of(frame::spill_nonvolatiles, _component))
194
195  // Frame layout for the Java template interpreter on PPC64.
196  //
197  // In these figures the stack grows upwards, while memory grows
198  // downwards. Square brackets denote regions possibly larger than
199  // single 64 bit slots.
200  //
201  //  STACK (interpreter is active):
202  //    0       [TOP_IJAVA_FRAME]
203  //            [PARENT_IJAVA_FRAME]
204  //            ...
205  //            [PARENT_IJAVA_FRAME]
206  //            [ENTRY_FRAME]
207  //            [C_FRAME]
208  //            ...
209  //            [C_FRAME]
210  //
211  //  With the following frame layouts:
212  //  TOP_IJAVA_FRAME:
213  //    0       [TOP_IJAVA_FRAME_ABI]
214  //            alignment (optional)
215  //            [operand stack]
216  //            [monitors] (optional)
217  //            [IJAVA_STATE]
218  //            note: own locals are located in the caller frame.
219  //
220  //  PARENT_IJAVA_FRAME:
221  //    0       [PARENT_IJAVA_FRAME_ABI]
222  //            alignment (optional)
223  //            [callee's Java result]
224  //            [callee's locals w/o arguments]
225  //            [outgoing arguments]
226  //            [used part of operand stack w/o arguments]
227  //            [monitors] (optional)
228  //            [IJAVA_STATE]
229  //
230  //  ENTRY_FRAME:
231  //    0       [PARENT_IJAVA_FRAME_ABI]
232  //            alignment (optional)
233  //            [callee's Java result]
234  //            [callee's locals w/o arguments]
235  //            [outgoing arguments]
236  //            [ENTRY_FRAME_LOCALS]
237
238  struct parent_ijava_frame_abi : abi_minframe {
239  };
240
241  enum {
242    parent_ijava_frame_abi_size = sizeof(parent_ijava_frame_abi)
243  };
244
245#define _parent_ijava_frame_abi(_component) \
246        (offset_of(frame::parent_ijava_frame_abi, _component))
247
248  struct top_ijava_frame_abi : abi_reg_args {
249  };
250
251  enum {
252    top_ijava_frame_abi_size = sizeof(top_ijava_frame_abi)
253  };
254
255#define _top_ijava_frame_abi(_component) \
256        (offset_of(frame::top_ijava_frame_abi, _component))
257
258  struct ijava_state {
259#ifdef ASSERT
260    uint64_t ijava_reserved; // Used for assertion.
261#endif
262    uint64_t method;
263    uint64_t mirror;
264    uint64_t locals;
265    uint64_t monitors;
266    uint64_t cpoolCache;
267    uint64_t bcp;
268    uint64_t esp;
269    uint64_t mdx;
270    uint64_t top_frame_sp; // Maybe define parent_frame_abi and move there.
271    uint64_t sender_sp;
272    // Slots only needed for native calls. Maybe better to move elsewhere.
273    uint64_t oop_tmp;
274    uint64_t lresult;
275    uint64_t fresult;
276  };
277
278  enum {
279    ijava_state_size = sizeof(ijava_state)
280  };
281
282#define _ijava_state_neg(_component) \
283        (int) (-frame::ijava_state_size + offset_of(frame::ijava_state, _component))
284
285  // ENTRY_FRAME
286
287  struct entry_frame_locals {
288    uint64_t call_wrapper_address;
289    uint64_t result_address;                      //_16
290    uint64_t result_type;
291    uint64_t arguments_tos_address;               //_16
292    // aligned to frame::alignment_in_bytes (16)
293    uint64_t r[spill_nonvolatiles_size/sizeof(uint64_t)];
294  };
295
296  enum {
297    entry_frame_locals_size = sizeof(entry_frame_locals)
298  };
299
300  #define _entry_frame_locals_neg(_component) \
301    (int)(-frame::entry_frame_locals_size + offset_of(frame::entry_frame_locals, _component))
302
303
304  //  Frame layout for JIT generated methods
305  //
306  //  In these figures the stack grows upwards, while memory grows
307  //  downwards. Square brackets denote regions possibly larger than single
308  //  64 bit slots.
309  //
310  //  STACK (interpreted Java calls JIT generated Java):
311  //          [JIT_FRAME]                                <-- SP (mod 16 = 0)
312  //          [TOP_IJAVA_FRAME]
313  //         ...
314  //
315  //  JIT_FRAME (is a C frame according to PPC-64 ABI):
316  //          [out_preserve]
317  //          [out_args]
318  //          [spills]
319  //          [pad_1]
320  //          [monitor] (optional)
321  //       ...
322  //          [monitor] (optional)
323  //          [pad_2]
324  //          [in_preserve] added / removed by prolog / epilog
325  //
326
327  // JIT_ABI (TOP and PARENT)
328
329  struct jit_abi {
330    uint64_t callers_sp;
331    uint64_t cr;
332    uint64_t lr;
333    uint64_t toc;
334    // Nothing to add here!
335    // NOT ALIGNED to frame::alignment_in_bytes (16).
336  };
337
338  struct jit_out_preserve : jit_abi {
339    // Nothing to add here!
340  };
341
342  struct jit_in_preserve {
343    // Nothing to add here!
344  };
345
346  enum {
347    jit_out_preserve_size = sizeof(jit_out_preserve),
348    jit_in_preserve_size  = sizeof(jit_in_preserve)
349  };
350
351  struct jit_monitor {
352    uint64_t monitor[1];
353  };
354
355  enum {
356    jit_monitor_size = sizeof(jit_monitor),
357  };
358
359 private:
360
361  //  STACK:
362  //            ...
363  //            [THIS_FRAME]             <-- this._sp (stack pointer for this frame)
364  //            [CALLER_FRAME]           <-- this.fp() (_sp of caller's frame)
365  //            ...
366  //
367
368  // frame pointer for this frame
369  intptr_t* _fp;
370
371  // The frame's stack pointer before it has been extended by a c2i adapter;
372  // needed by deoptimization
373  intptr_t* _unextended_sp;
374
375 public:
376
377  // Accessors for fields
378  intptr_t* fp() const { return _fp; }
379
380  // Accessors for ABIs
381  inline abi_minframe* own_abi()     const { return (abi_minframe*) _sp; }
382  inline abi_minframe* callers_abi() const { return (abi_minframe*) _fp; }
383
384 private:
385
386  // Find codeblob and set deopt_state.
387  inline void find_codeblob_and_set_pc_and_deopt_state(address pc);
388
389 public:
390
391  // Constructors
392  inline frame(intptr_t* sp);
393  frame(intptr_t* sp, address pc);
394  inline frame(intptr_t* sp, address pc, intptr_t* unextended_sp);
395
396 private:
397
398  intptr_t* compiled_sender_sp(CodeBlob* cb) const;
399  address*  compiled_sender_pc_addr(CodeBlob* cb) const;
400  address*  sender_pc_addr(void) const;
401
402 public:
403
404  inline ijava_state* get_ijava_state() const;
405  // Some convenient register frame setters/getters for deoptimization.
406  inline intptr_t* interpreter_frame_esp() const;
407  inline void interpreter_frame_set_cpcache(ConstantPoolCache* cp);
408  inline void interpreter_frame_set_esp(intptr_t* esp);
409  inline void interpreter_frame_set_top_frame_sp(intptr_t* top_frame_sp);
410  inline void interpreter_frame_set_sender_sp(intptr_t* sender_sp);
411
412  // Size of a monitor in bytes.
413  static int interpreter_frame_monitor_size_in_bytes();
414
415  // The size of a cInterpreter object.
416  static inline int interpreter_frame_cinterpreterstate_size_in_bytes();
417
418 private:
419
420  ConstantPoolCache** interpreter_frame_cpoolcache_addr() const;
421
422 public:
423
424  // Additional interface for entry frames:
425  inline entry_frame_locals* get_entry_frame_locals() const {
426    return (entry_frame_locals*) (((address) fp()) - entry_frame_locals_size);
427  }
428
429  enum {
430    // normal return address is 1 bundle past PC
431    pc_return_offset = 0
432  };
433
434#endif // CPU_PPC_VM_FRAME_PPC_HPP
435