1/*
2 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
3 * Copyright (c) 2012, 2016 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// no precompiled headers
27#include "asm/assembler.inline.hpp"
28#include "classfile/classLoader.hpp"
29#include "classfile/systemDictionary.hpp"
30#include "classfile/vmSymbols.hpp"
31#include "code/codeCache.hpp"
32#include "code/icBuffer.hpp"
33#include "code/vtableStubs.hpp"
34#include "interpreter/interpreter.hpp"
35#include "jvm_linux.h"
36#include "memory/allocation.inline.hpp"
37#include "nativeInst_ppc.hpp"
38#include "os_share_linux.hpp"
39#include "prims/jniFastGetField.hpp"
40#include "prims/jvm.h"
41#include "prims/jvm_misc.hpp"
42#include "runtime/arguments.hpp"
43#include "runtime/extendedPC.hpp"
44#include "runtime/frame.inline.hpp"
45#include "runtime/interfaceSupport.hpp"
46#include "runtime/java.hpp"
47#include "runtime/javaCalls.hpp"
48#include "runtime/mutexLocker.hpp"
49#include "runtime/osThread.hpp"
50#include "runtime/sharedRuntime.hpp"
51#include "runtime/stubRoutines.hpp"
52#include "runtime/thread.inline.hpp"
53#include "runtime/timer.hpp"
54#include "utilities/events.hpp"
55#include "utilities/vmError.hpp"
56
57// put OS-includes here
58# include <sys/types.h>
59# include <sys/mman.h>
60# include <pthread.h>
61# include <signal.h>
62# include <errno.h>
63# include <dlfcn.h>
64# include <stdlib.h>
65# include <stdio.h>
66# include <unistd.h>
67# include <sys/resource.h>
68# include <pthread.h>
69# include <sys/stat.h>
70# include <sys/time.h>
71# include <sys/utsname.h>
72# include <sys/socket.h>
73# include <sys/wait.h>
74# include <pwd.h>
75# include <poll.h>
76# include <ucontext.h>
77
78
79address os::current_stack_pointer() {
80  intptr_t* csp;
81
82  // inline assembly `mr regno(csp), R1_SP':
83  __asm__ __volatile__ ("mr %0, 1":"=r"(csp):);
84
85  return (address) csp;
86}
87
88char* os::non_memory_address_word() {
89  // Must never look like an address returned by reserve_memory,
90  // even in its subfields (as defined by the CPU immediate fields,
91  // if the CPU splits constants across multiple instructions).
92
93  return (char*) -1;
94}
95
96void os::initialize_thread(Thread *thread) { }
97
98// Frame information (pc, sp, fp) retrieved via ucontext
99// always looks like a C-frame according to the frame
100// conventions in frame_ppc64.hpp.
101address os::Linux::ucontext_get_pc(const ucontext_t * uc) {
102  // On powerpc64, ucontext_t is not selfcontained but contains
103  // a pointer to an optional substructure (mcontext_t.regs) containing the volatile
104  // registers - NIP, among others.
105  // This substructure may or may not be there depending where uc came from:
106  // - if uc was handed over as the argument to a sigaction handler, a pointer to the
107  //   substructure was provided by the kernel when calling the signal handler, and
108  //   regs->nip can be accessed.
109  // - if uc was filled by getcontext(), it is undefined - getcontext() does not fill
110  //   it because the volatile registers are not needed to make setcontext() work.
111  //   Hopefully it was zero'd out beforehand.
112  guarantee(uc->uc_mcontext.regs != NULL, "only use ucontext_get_pc in sigaction context");
113  return (address)uc->uc_mcontext.regs->nip;
114}
115
116// modify PC in ucontext.
117// Note: Only use this for an ucontext handed down to a signal handler. See comment
118// in ucontext_get_pc.
119void os::Linux::ucontext_set_pc(ucontext_t * uc, address pc) {
120  guarantee(uc->uc_mcontext.regs != NULL, "only use ucontext_set_pc in sigaction context");
121  uc->uc_mcontext.regs->nip = (unsigned long)pc;
122}
123
124intptr_t* os::Linux::ucontext_get_sp(const ucontext_t * uc) {
125  return (intptr_t*)uc->uc_mcontext.regs->gpr[1/*REG_SP*/];
126}
127
128intptr_t* os::Linux::ucontext_get_fp(const ucontext_t * uc) {
129  return NULL;
130}
131
132ExtendedPC os::fetch_frame_from_context(const void* ucVoid,
133                    intptr_t** ret_sp, intptr_t** ret_fp) {
134
135  ExtendedPC  epc;
136  const ucontext_t* uc = (const ucontext_t*)ucVoid;
137
138  if (uc != NULL) {
139    epc = ExtendedPC(os::Linux::ucontext_get_pc(uc));
140    if (ret_sp) *ret_sp = os::Linux::ucontext_get_sp(uc);
141    if (ret_fp) *ret_fp = os::Linux::ucontext_get_fp(uc);
142  } else {
143    // construct empty ExtendedPC for return value checking
144    epc = ExtendedPC(NULL);
145    if (ret_sp) *ret_sp = (intptr_t *)NULL;
146    if (ret_fp) *ret_fp = (intptr_t *)NULL;
147  }
148
149  return epc;
150}
151
152frame os::fetch_frame_from_context(const void* ucVoid) {
153  intptr_t* sp;
154  intptr_t* fp;
155  ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp);
156  return frame(sp, epc.pc());
157}
158
159bool os::Linux::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_t* uc, frame* fr) {
160  address pc = (address) os::Linux::ucontext_get_pc(uc);
161  if (Interpreter::contains(pc)) {
162    // Interpreter performs stack banging after the fixed frame header has
163    // been generated while the compilers perform it before. To maintain
164    // semantic consistency between interpreted and compiled frames, the
165    // method returns the Java sender of the current frame.
166    *fr = os::fetch_frame_from_context(uc);
167    if (!fr->is_first_java_frame()) {
168      assert(fr->safe_for_sender(thread), "Safety check");
169      *fr = fr->java_sender();
170    }
171  } else {
172    // More complex code with compiled code.
173    assert(!Interpreter::contains(pc), "Interpreted methods should have been handled above");
174    CodeBlob* cb = CodeCache::find_blob(pc);
175    if (cb == NULL || !cb->is_nmethod() || cb->is_frame_complete_at(pc)) {
176      // Not sure where the pc points to, fallback to default
177      // stack overflow handling. In compiled code, we bang before
178      // the frame is complete.
179      return false;
180    } else {
181      intptr_t* fp = os::Linux::ucontext_get_fp(uc);
182      intptr_t* sp = os::Linux::ucontext_get_sp(uc);
183      *fr = frame(sp, (address)*sp);
184      if (!fr->is_java_frame()) {
185        assert(fr->safe_for_sender(thread), "Safety check");
186        assert(!fr->is_first_frame(), "Safety check");
187        *fr = fr->java_sender();
188      }
189    }
190  }
191  assert(fr->is_java_frame(), "Safety check");
192  return true;
193}
194
195frame os::get_sender_for_C_frame(frame* fr) {
196  if (*fr->sp() == 0) {
197    // fr is the last C frame
198    return frame(NULL, NULL);
199  }
200  return frame(fr->sender_sp(), fr->sender_pc());
201}
202
203
204frame os::current_frame() {
205  intptr_t* csp = (intptr_t*) *((intptr_t*) os::current_stack_pointer());
206  // hack.
207  frame topframe(csp, (address)0x8);
208  // Return sender of sender of current topframe which hopefully
209  // both have pc != NULL.
210  frame tmp = os::get_sender_for_C_frame(&topframe);
211  return os::get_sender_for_C_frame(&tmp);
212}
213
214// Utility functions
215
216extern "C" JNIEXPORT int
217JVM_handle_linux_signal(int sig,
218                        siginfo_t* info,
219                        void* ucVoid,
220                        int abort_if_unrecognized) {
221  ucontext_t* uc = (ucontext_t*) ucVoid;
222
223  Thread* t = Thread::current_or_null_safe();
224
225  SignalHandlerMark shm(t);
226
227  // Note: it's not uncommon that JNI code uses signal/sigset to install
228  // then restore certain signal handler (e.g. to temporarily block SIGPIPE,
229  // or have a SIGILL handler when detecting CPU type). When that happens,
230  // JVM_handle_linux_signal() might be invoked with junk info/ucVoid. To
231  // avoid unnecessary crash when libjsig is not preloaded, try handle signals
232  // that do not require siginfo/ucontext first.
233
234  if (sig == SIGPIPE) {
235    if (os::Linux::chained_handler(sig, info, ucVoid)) {
236      return true;
237    } else {
238      // Ignoring SIGPIPE - see bugs 4229104
239      return true;
240    }
241  }
242
243  // Make the signal handler transaction-aware by checking the existence of a
244  // second (transactional) context with MSR TS bits active. If the signal is
245  // caught during a transaction, then just return to the HTM abort handler.
246  // Please refer to Linux kernel document powerpc/transactional_memory.txt,
247  // section "Signals".
248  if (uc && uc->uc_link) {
249    ucontext_t* second_uc = uc->uc_link;
250
251    // MSR TS bits are 29 and 30 (Power ISA, v2.07B, Book III-S, pp. 857-858,
252    // 3.2.1 "Machine State Register"), however note that ISA notation for bit
253    // numbering is MSB 0, so for normal bit numbering (LSB 0) they come to be
254    // bits 33 and 34. It's not related to endianness, just a notation matter.
255    if (second_uc->uc_mcontext.regs->msr & 0x600000000) {
256      if (TraceTraps) {
257        tty->print_cr("caught signal in transaction, "
258                        "ignoring to jump to abort handler");
259      }
260      // Return control to the HTM abort handler.
261      return true;
262    }
263  }
264
265  JavaThread* thread = NULL;
266  VMThread* vmthread = NULL;
267  if (os::Linux::signal_handlers_are_installed) {
268    if (t != NULL) {
269      if(t->is_Java_thread()) {
270        thread = (JavaThread*)t;
271      } else if(t->is_VM_thread()) {
272        vmthread = (VMThread *)t;
273      }
274    }
275  }
276
277  // Moved SafeFetch32 handling outside thread!=NULL conditional block to make
278  // it work if no associated JavaThread object exists.
279  if (uc) {
280    address const pc = os::Linux::ucontext_get_pc(uc);
281    if (pc && StubRoutines::is_safefetch_fault(pc)) {
282      os::Linux::ucontext_set_pc(uc, StubRoutines::continuation_for_safefetch_fault(pc));
283      return true;
284    }
285  }
286
287  // decide if this trap can be handled by a stub
288  address stub = NULL;
289  address pc   = NULL;
290
291  //%note os_trap_1
292  if (info != NULL && uc != NULL && thread != NULL) {
293    pc = (address) os::Linux::ucontext_get_pc(uc);
294
295    // Handle ALL stack overflow variations here
296    if (sig == SIGSEGV) {
297      // Si_addr may not be valid due to a bug in the linux-ppc64 kernel (see
298      // comment below). Use get_stack_bang_address instead of si_addr.
299      address addr = ((NativeInstruction*)pc)->get_stack_bang_address(uc);
300
301      // Check if fault address is within thread stack.
302      if (thread->on_local_stack(addr)) {
303        // stack overflow
304        if (thread->in_stack_yellow_reserved_zone(addr)) {
305          if (thread->thread_state() == _thread_in_Java) {
306            if (thread->in_stack_reserved_zone(addr)) {
307              frame fr;
308              if (os::Linux::get_frame_at_stack_banging_point(thread, uc, &fr)) {
309                assert(fr.is_java_frame(), "Must be a Javac frame");
310                frame activation =
311                  SharedRuntime::look_for_reserved_stack_annotated_method(thread, fr);
312                if (activation.sp() != NULL) {
313                  thread->disable_stack_reserved_zone();
314                  if (activation.is_interpreted_frame()) {
315                    thread->set_reserved_stack_activation((address)activation.fp());
316                  } else {
317                    thread->set_reserved_stack_activation((address)activation.unextended_sp());
318                  }
319                  return 1;
320                }
321              }
322            }
323            // Throw a stack overflow exception.
324            // Guard pages will be reenabled while unwinding the stack.
325            thread->disable_stack_yellow_reserved_zone();
326            stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW);
327          } else {
328            // Thread was in the vm or native code. Return and try to finish.
329            thread->disable_stack_yellow_reserved_zone();
330            return 1;
331          }
332        } else if (thread->in_stack_red_zone(addr)) {
333          // Fatal red zone violation.  Disable the guard pages and fall through
334          // to handle_unexpected_exception way down below.
335          thread->disable_stack_red_zone();
336          tty->print_raw_cr("An irrecoverable stack overflow has occurred.");
337
338          // This is a likely cause, but hard to verify. Let's just print
339          // it as a hint.
340          tty->print_raw_cr("Please check if any of your loaded .so files has "
341                            "enabled executable stack (see man page execstack(8))");
342        } else {
343          // Accessing stack address below sp may cause SEGV if current
344          // thread has MAP_GROWSDOWN stack. This should only happen when
345          // current thread was created by user code with MAP_GROWSDOWN flag
346          // and then attached to VM. See notes in os_linux.cpp.
347          if (thread->osthread()->expanding_stack() == 0) {
348             thread->osthread()->set_expanding_stack();
349             if (os::Linux::manually_expand_stack(thread, addr)) {
350               thread->osthread()->clear_expanding_stack();
351               return 1;
352             }
353             thread->osthread()->clear_expanding_stack();
354          } else {
355             fatal("recursive segv. expanding stack.");
356          }
357        }
358      }
359    }
360
361    if (thread->thread_state() == _thread_in_Java) {
362      // Java thread running in Java code => find exception handler if any
363      // a fault inside compiled code, the interpreter, or a stub
364
365      // A VM-related SIGILL may only occur if we are not in the zero page.
366      // On AIX, we get a SIGILL if we jump to 0x0 or to somewhere else
367      // in the zero page, because it is filled with 0x0. We ignore
368      // explicit SIGILLs in the zero page.
369      if (sig == SIGILL && (pc < (address) 0x200)) {
370        if (TraceTraps) {
371          tty->print_raw_cr("SIGILL happened inside zero page.");
372        }
373        goto report_and_die;
374      }
375
376      CodeBlob *cb = NULL;
377      // Handle signal from NativeJump::patch_verified_entry().
378      if (( TrapBasedNotEntrantChecks && sig == SIGTRAP && nativeInstruction_at(pc)->is_sigtrap_zombie_not_entrant()) ||
379          (!TrapBasedNotEntrantChecks && sig == SIGILL  && nativeInstruction_at(pc)->is_sigill_zombie_not_entrant())) {
380        if (TraceTraps) {
381          tty->print_cr("trap: zombie_not_entrant (%s)", (sig == SIGTRAP) ? "SIGTRAP" : "SIGILL");
382        }
383        stub = SharedRuntime::get_handle_wrong_method_stub();
384      }
385
386      else if (sig == SIGSEGV &&
387               // A linux-ppc64 kernel before 2.6.6 doesn't set si_addr on some segfaults
388               // in 64bit mode (cf. http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.6),
389               // especially when we try to read from the safepoint polling page. So the check
390               //   (address)info->si_addr == os::get_standard_polling_page()
391               // doesn't work for us. We use:
392               ((NativeInstruction*)pc)->is_safepoint_poll() &&
393               CodeCache::contains((void*) pc) &&
394               ((cb = CodeCache::find_blob(pc)) != NULL) &&
395               cb->is_compiled()) {
396        if (TraceTraps) {
397          tty->print_cr("trap: safepoint_poll at " INTPTR_FORMAT " (SIGSEGV)", p2i(pc));
398        }
399        stub = SharedRuntime::get_poll_stub(pc);
400      }
401
402      // SIGTRAP-based ic miss check in compiled code.
403      else if (sig == SIGTRAP && TrapBasedICMissChecks &&
404               nativeInstruction_at(pc)->is_sigtrap_ic_miss_check()) {
405        if (TraceTraps) {
406          tty->print_cr("trap: ic_miss_check at " INTPTR_FORMAT " (SIGTRAP)", p2i(pc));
407        }
408        stub = SharedRuntime::get_ic_miss_stub();
409      }
410
411      // SIGTRAP-based implicit null check in compiled code.
412      else if (sig == SIGTRAP && TrapBasedNullChecks &&
413               nativeInstruction_at(pc)->is_sigtrap_null_check()) {
414        if (TraceTraps) {
415          tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGTRAP)", p2i(pc));
416        }
417        stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
418      }
419
420      // SIGSEGV-based implicit null check in compiled code.
421      else if (sig == SIGSEGV && ImplicitNullChecks &&
422               CodeCache::contains((void*) pc) &&
423               !MacroAssembler::needs_explicit_null_check((intptr_t) info->si_addr)) {
424        if (TraceTraps) {
425          tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", p2i(pc));
426        }
427        stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
428      }
429
430#ifdef COMPILER2
431      // SIGTRAP-based implicit range check in compiled code.
432      else if (sig == SIGTRAP && TrapBasedRangeChecks &&
433               nativeInstruction_at(pc)->is_sigtrap_range_check()) {
434        if (TraceTraps) {
435          tty->print_cr("trap: range_check at " INTPTR_FORMAT " (SIGTRAP)", p2i(pc));
436        }
437        stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
438      }
439#endif
440      else if (sig == SIGBUS) {
441        // BugId 4454115: A read from a MappedByteBuffer can fault here if the
442        // underlying file has been truncated. Do not crash the VM in such a case.
443        CodeBlob* cb = CodeCache::find_blob_unsafe(pc);
444        CompiledMethod* nm = (cb != NULL) ? cb->as_compiled_method_or_null() : NULL;
445        if (nm != NULL && nm->has_unsafe_access()) {
446          address next_pc = pc + 4;
447          next_pc = SharedRuntime::handle_unsafe_access(thread, next_pc);
448          os::Linux::ucontext_set_pc(uc, next_pc);
449          return true;
450        }
451      }
452    }
453
454    else { // thread->thread_state() != _thread_in_Java
455      if (sig == SIGILL && VM_Version::is_determine_features_test_running()) {
456        // SIGILL must be caused by VM_Version::determine_features().
457        *(int *)pc = 0; // patch instruction to 0 to indicate that it causes a SIGILL,
458                        // flushing of icache is not necessary.
459        stub = pc + 4;  // continue with next instruction.
460      }
461      else if (thread->thread_state() == _thread_in_vm &&
462               sig == SIGBUS && thread->doing_unsafe_access()) {
463        address next_pc = pc + 4;
464        next_pc = SharedRuntime::handle_unsafe_access(thread, next_pc);
465        os::Linux::ucontext_set_pc(uc, pc + 4);
466        return true;
467      }
468    }
469
470    // Check to see if we caught the safepoint code in the
471    // process of write protecting the memory serialization page.
472    // It write enables the page immediately after protecting it
473    // so we can just return to retry the write.
474    if ((sig == SIGSEGV) &&
475        // Si_addr may not be valid due to a bug in the linux-ppc64 kernel (see comment above).
476        // Use is_memory_serialization instead of si_addr.
477        ((NativeInstruction*)pc)->is_memory_serialization(thread, ucVoid)) {
478      // Synchronization problem in the pseudo memory barrier code (bug id 6546278)
479      // Block current thread until the memory serialize page permission restored.
480      os::block_on_serialize_page_trap();
481      return true;
482    }
483  }
484
485  if (stub != NULL) {
486    // Save all thread context in case we need to restore it.
487    if (thread != NULL) thread->set_saved_exception_pc(pc);
488    os::Linux::ucontext_set_pc(uc, stub);
489    return true;
490  }
491
492  // signal-chaining
493  if (os::Linux::chained_handler(sig, info, ucVoid)) {
494    return true;
495  }
496
497  if (!abort_if_unrecognized) {
498    // caller wants another chance, so give it to him
499    return false;
500  }
501
502  if (pc == NULL && uc != NULL) {
503    pc = os::Linux::ucontext_get_pc(uc);
504  }
505
506report_and_die:
507  // unmask current signal
508  sigset_t newset;
509  sigemptyset(&newset);
510  sigaddset(&newset, sig);
511  sigprocmask(SIG_UNBLOCK, &newset, NULL);
512
513  VMError::report_and_die(t, sig, pc, info, ucVoid);
514
515  ShouldNotReachHere();
516  return false;
517}
518
519void os::Linux::init_thread_fpu_state(void) {
520  // Disable FP exceptions.
521  __asm__ __volatile__ ("mtfsfi 6,0");
522}
523
524int os::Linux::get_fpu_control_word(void) {
525  // x86 has problems with FPU precision after pthread_cond_timedwait().
526  // nothing to do on ppc64.
527  return 0;
528}
529
530void os::Linux::set_fpu_control_word(int fpu_control) {
531  // x86 has problems with FPU precision after pthread_cond_timedwait().
532  // nothing to do on ppc64.
533}
534
535////////////////////////////////////////////////////////////////////////////////
536// thread stack
537
538// Minimum usable stack sizes required to get to user code. Space for
539// HotSpot guard pages is added later.
540size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
541size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
542size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
543
544// Return default stack size for thr_type.
545size_t os::Posix::default_stack_size(os::ThreadType thr_type) {
546  // Default stack size (compiler thread needs larger stack).
547  size_t s = (thr_type == os::compiler_thread ? 4 * M : 1024 * K);
548  return s;
549}
550
551/////////////////////////////////////////////////////////////////////////////
552// helper functions for fatal error handler
553
554void os::print_context(outputStream *st, const void *context) {
555  if (context == NULL) return;
556
557  const ucontext_t* uc = (const ucontext_t*)context;
558
559  st->print_cr("Registers:");
560  st->print("pc =" INTPTR_FORMAT "  ", uc->uc_mcontext.regs->nip);
561  st->print("lr =" INTPTR_FORMAT "  ", uc->uc_mcontext.regs->link);
562  st->print("ctr=" INTPTR_FORMAT "  ", uc->uc_mcontext.regs->ctr);
563  st->cr();
564  for (int i = 0; i < 32; i++) {
565    st->print("r%-2d=" INTPTR_FORMAT "  ", i, uc->uc_mcontext.regs->gpr[i]);
566    if (i % 3 == 2) st->cr();
567  }
568  st->cr();
569  st->cr();
570
571  intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc);
572  st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", p2i(sp));
573  print_hex_dump(st, (address)sp, (address)(sp + 128), sizeof(intptr_t));
574  st->cr();
575
576  // Note: it may be unsafe to inspect memory near pc. For example, pc may
577  // point to garbage if entry point in an nmethod is corrupted. Leave
578  // this at the end, and hope for the best.
579  address pc = os::Linux::ucontext_get_pc(uc);
580  st->print_cr("Instructions: (pc=" PTR_FORMAT ")", p2i(pc));
581  print_hex_dump(st, pc - 64, pc + 64, /*instrsize=*/4);
582  st->cr();
583}
584
585void os::print_register_info(outputStream *st, const void *context) {
586  if (context == NULL) return;
587
588  const ucontext_t *uc = (const ucontext_t*)context;
589
590  st->print_cr("Register to memory mapping:");
591  st->cr();
592
593  // this is only for the "general purpose" registers
594  for (int i = 0; i < 32; i++) {
595    st->print("r%-2d=", i);
596    print_location(st, uc->uc_mcontext.regs->gpr[i]);
597  }
598  st->cr();
599}
600
601extern "C" {
602  int SpinPause() {
603    return 0;
604  }
605}
606
607#ifndef PRODUCT
608void os::verify_stack_alignment() {
609  assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment");
610}
611#endif
612
613int os::extra_bang_size_in_bytes() {
614  // PPC does not require the additional stack bang.
615  return 0;
616}
617