hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp
changeset 7108 4f87b92f3060
parent 6176 4d9030fe341f
child 7397 5b173b4ca846
equal deleted inserted replaced
7107:db4e07fb94ed 7108:4f87b92f3060
     1 /*
     1 /*
     2  * Copyright (c) 1999, 2009, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
   716 void os::print_context(outputStream *st, void *context) {
   716 void os::print_context(outputStream *st, void *context) {
   717   if (context == NULL) return;
   717   if (context == NULL) return;
   718 
   718 
   719   ucontext_t *uc = (ucontext_t*)context;
   719   ucontext_t *uc = (ucontext_t*)context;
   720   st->print_cr("Registers:");
   720   st->print_cr("Registers:");
   721 
       
   722   // this is horrendously verbose but the layout of the registers in the
       
   723   // context does not match how we defined our abstract Register set, so
       
   724   // we can't just iterate through the gregs area
       
   725 
       
   726 #ifdef AMD64
   721 #ifdef AMD64
   727   st->print(  "RAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RAX]);
   722   st->print(  "RAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RAX]);
   728   st->print(", RBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBX]);
   723   st->print(", RBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBX]);
   729   st->print(", RCX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RCX]);
   724   st->print(", RCX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RCX]);
   730   st->print(", RDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDX]);
   725   st->print(", RDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDX]);
   743   st->print(", R13=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R13]);
   738   st->print(", R13=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R13]);
   744   st->print(", R14=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R14]);
   739   st->print(", R14=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R14]);
   745   st->print(", R15=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R15]);
   740   st->print(", R15=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R15]);
   746   st->cr();
   741   st->cr();
   747   st->print(  "RIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RIP]);
   742   st->print(  "RIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RIP]);
   748   st->print(", EFL=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]);
   743   st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]);
   749   st->print(", CSGSFS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_CSGSFS]);
   744   st->print(", CSGSFS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_CSGSFS]);
   750   st->print(", ERR=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ERR]);
   745   st->print(", ERR=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ERR]);
   751   st->cr();
   746   st->cr();
   752   st->print("  TRAPNO=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_TRAPNO]);
   747   st->print("  TRAPNO=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_TRAPNO]);
   753 
       
   754   st->cr();
       
   755   st->cr();
       
   756 
       
   757   st->print_cr("Register to memory mapping:");
       
   758   st->cr();
       
   759 
       
   760   // this is only for the "general purpose" registers
       
   761 
       
   762   st->print_cr("RAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RAX]);
       
   763   print_location(st, uc->uc_mcontext.gregs[REG_RAX]);
       
   764   st->cr();
       
   765   st->print_cr("RBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBX]);
       
   766   print_location(st, uc->uc_mcontext.gregs[REG_RBX]);
       
   767   st->cr();
       
   768   st->print_cr("RCX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RCX]);
       
   769   print_location(st, uc->uc_mcontext.gregs[REG_RCX]);
       
   770   st->cr();
       
   771   st->print_cr("RDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDX]);
       
   772   print_location(st, uc->uc_mcontext.gregs[REG_RDX]);
       
   773   st->cr();
       
   774   st->print_cr("RSP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RSP]);
       
   775   print_location(st, uc->uc_mcontext.gregs[REG_RSP]);
       
   776   st->cr();
       
   777   st->print_cr("RBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RBP]);
       
   778   print_location(st, uc->uc_mcontext.gregs[REG_RBP]);
       
   779   st->cr();
       
   780   st->print_cr("RSI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RSI]);
       
   781   print_location(st, uc->uc_mcontext.gregs[REG_RSI]);
       
   782   st->cr();
       
   783   st->print_cr("RDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDI]);
       
   784   print_location(st, uc->uc_mcontext.gregs[REG_RDI]);
       
   785   st->cr();
       
   786   st->print_cr("R8 =" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R8]);
       
   787   print_location(st, uc->uc_mcontext.gregs[REG_R8]);
       
   788   st->cr();
       
   789   st->print_cr("R9 =" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R9]);
       
   790   print_location(st, uc->uc_mcontext.gregs[REG_R9]);
       
   791   st->cr();
       
   792   st->print_cr("R10=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R10]);
       
   793   print_location(st, uc->uc_mcontext.gregs[REG_R10]);
       
   794   st->cr();
       
   795   st->print_cr("R11=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R11]);
       
   796   print_location(st, uc->uc_mcontext.gregs[REG_R11]);
       
   797   st->cr();
       
   798   st->print_cr("R12=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R12]);
       
   799   print_location(st, uc->uc_mcontext.gregs[REG_R12]);
       
   800   st->cr();
       
   801   st->print_cr("R13=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R13]);
       
   802   print_location(st, uc->uc_mcontext.gregs[REG_R13]);
       
   803   st->cr();
       
   804   st->print_cr("R14=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R14]);
       
   805   print_location(st, uc->uc_mcontext.gregs[REG_R14]);
       
   806   st->cr();
       
   807   st->print_cr("R15=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R15]);
       
   808   print_location(st, uc->uc_mcontext.gregs[REG_R15]);
       
   809 
       
   810 #else
   748 #else
   811   st->print(  "EAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EAX]);
   749   st->print(  "EAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EAX]);
   812   st->print(", EBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBX]);
   750   st->print(", EBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBX]);
   813   st->print(", ECX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ECX]);
   751   st->print(", ECX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ECX]);
   814   st->print(", EDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDX]);
   752   st->print(", EDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDX]);
   817   st->print(", EBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBP]);
   755   st->print(", EBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBP]);
   818   st->print(", ESI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ESI]);
   756   st->print(", ESI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ESI]);
   819   st->print(", EDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDI]);
   757   st->print(", EDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDI]);
   820   st->cr();
   758   st->cr();
   821   st->print(  "EIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EIP]);
   759   st->print(  "EIP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EIP]);
       
   760   st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]);
   822   st->print(", CR2=" INTPTR_FORMAT, uc->uc_mcontext.cr2);
   761   st->print(", CR2=" INTPTR_FORMAT, uc->uc_mcontext.cr2);
   823   st->print(", EFLAGS=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EFL]);
       
   824 
       
   825   st->cr();
       
   826   st->cr();
       
   827 
       
   828   st->print_cr("Register to memory mapping:");
       
   829   st->cr();
       
   830 
       
   831   // this is only for the "general purpose" registers
       
   832 
       
   833   st->print_cr("EAX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EAX]);
       
   834   print_location(st, uc->uc_mcontext.gregs[REG_EAX]);
       
   835   st->cr();
       
   836   st->print_cr("EBX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBX]);
       
   837   print_location(st, uc->uc_mcontext.gregs[REG_EBX]);
       
   838   st->cr();
       
   839   st->print_cr("ECX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ECX]);
       
   840   print_location(st, uc->uc_mcontext.gregs[REG_ECX]);
       
   841   st->cr();
       
   842   st->print_cr("EDX=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDX]);
       
   843   print_location(st, uc->uc_mcontext.gregs[REG_EDX]);
       
   844   st->cr();
       
   845   st->print_cr("ESP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ESP]);
       
   846   print_location(st, uc->uc_mcontext.gregs[REG_ESP]);
       
   847   st->cr();
       
   848   st->print_cr("EBP=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EBP]);
       
   849   print_location(st, uc->uc_mcontext.gregs[REG_EBP]);
       
   850   st->cr();
       
   851   st->print_cr("ESI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_ESI]);
       
   852   print_location(st, uc->uc_mcontext.gregs[REG_ESI]);
       
   853   st->cr();
       
   854   st->print_cr("EDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_EDI]);
       
   855   print_location(st, uc->uc_mcontext.gregs[REG_EDI]);
       
   856 
       
   857 #endif // AMD64
   762 #endif // AMD64
   858   st->cr();
   763   st->cr();
   859   st->cr();
   764   st->cr();
   860 
   765 
   861   intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc);
   766   intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc);
   866   // Note: it may be unsafe to inspect memory near pc. For example, pc may
   771   // Note: it may be unsafe to inspect memory near pc. For example, pc may
   867   // point to garbage if entry point in an nmethod is corrupted. Leave
   772   // point to garbage if entry point in an nmethod is corrupted. Leave
   868   // this at the end, and hope for the best.
   773   // this at the end, and hope for the best.
   869   address pc = os::Linux::ucontext_get_pc(uc);
   774   address pc = os::Linux::ucontext_get_pc(uc);
   870   st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc);
   775   st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc);
   871   print_hex_dump(st, pc - 16, pc + 16, sizeof(char));
   776   print_hex_dump(st, pc - 32, pc + 32, sizeof(char));
       
   777 }
       
   778 
       
   779 void os::print_register_info(outputStream *st, void *context) {
       
   780   if (context == NULL) return;
       
   781 
       
   782   ucontext_t *uc = (ucontext_t*)context;
       
   783 
       
   784   st->print_cr("Register to memory mapping:");
       
   785   st->cr();
       
   786 
       
   787   // this is horrendously verbose but the layout of the registers in the
       
   788   // context does not match how we defined our abstract Register set, so
       
   789   // we can't just iterate through the gregs area
       
   790 
       
   791   // this is only for the "general purpose" registers
       
   792 
       
   793 #ifdef AMD64
       
   794   st->print("RAX="); print_location(st, uc->uc_mcontext.gregs[REG_RAX]);
       
   795   st->print("RBX="); print_location(st, uc->uc_mcontext.gregs[REG_RBX]);
       
   796   st->print("RCX="); print_location(st, uc->uc_mcontext.gregs[REG_RCX]);
       
   797   st->print("RDX="); print_location(st, uc->uc_mcontext.gregs[REG_RDX]);
       
   798   st->print("RSP="); print_location(st, uc->uc_mcontext.gregs[REG_RSP]);
       
   799   st->print("RBP="); print_location(st, uc->uc_mcontext.gregs[REG_RBP]);
       
   800   st->print("RSI="); print_location(st, uc->uc_mcontext.gregs[REG_RSI]);
       
   801   st->print("RDI="); print_location(st, uc->uc_mcontext.gregs[REG_RDI]);
       
   802   st->print("R8 ="); print_location(st, uc->uc_mcontext.gregs[REG_R8]);
       
   803   st->print("R9 ="); print_location(st, uc->uc_mcontext.gregs[REG_R9]);
       
   804   st->print("R10="); print_location(st, uc->uc_mcontext.gregs[REG_R10]);
       
   805   st->print("R11="); print_location(st, uc->uc_mcontext.gregs[REG_R11]);
       
   806   st->print("R12="); print_location(st, uc->uc_mcontext.gregs[REG_R12]);
       
   807   st->print("R13="); print_location(st, uc->uc_mcontext.gregs[REG_R13]);
       
   808   st->print("R14="); print_location(st, uc->uc_mcontext.gregs[REG_R14]);
       
   809   st->print("R15="); print_location(st, uc->uc_mcontext.gregs[REG_R15]);
       
   810 #else
       
   811   st->print("EAX="); print_location(st, uc->uc_mcontext.gregs[REG_EAX]);
       
   812   st->print("EBX="); print_location(st, uc->uc_mcontext.gregs[REG_EBX]);
       
   813   st->print("ECX="); print_location(st, uc->uc_mcontext.gregs[REG_ECX]);
       
   814   st->print("EDX="); print_location(st, uc->uc_mcontext.gregs[REG_EDX]);
       
   815   st->print("ESP="); print_location(st, uc->uc_mcontext.gregs[REG_ESP]);
       
   816   st->print("EBP="); print_location(st, uc->uc_mcontext.gregs[REG_EBP]);
       
   817   st->print("ESI="); print_location(st, uc->uc_mcontext.gregs[REG_ESI]);
       
   818   st->print("EDI="); print_location(st, uc->uc_mcontext.gregs[REG_EDI]);
       
   819 #endif // AMD64
       
   820 
       
   821   st->cr();
   872 }
   822 }
   873 
   823 
   874 void os::setup_fpu() {
   824 void os::setup_fpu() {
   875 #ifndef AMD64
   825 #ifndef AMD64
   876   address fpu_cntrl = StubRoutines::addr_fpu_cntrl_wrd_std();
   826   address fpu_cntrl = StubRoutines::addr_fpu_cntrl_wrd_std();