mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 19:14:38 +02:00
8246377: [PPC64] Further improvements for assembler stop function
Reviewed-by: goetz, xliu
This commit is contained in:
parent
6c3bc71079
commit
5f0f4d75e0
5 changed files with 47 additions and 33 deletions
|
@ -192,7 +192,10 @@ void Disassembler::annotate(address here, outputStream* st) {
|
||||||
st->fill_to(aligned_pos + tabspacing);
|
st->fill_to(aligned_pos + tabspacing);
|
||||||
st->print(";trap: ic miss check");
|
st->print(";trap: ic miss check");
|
||||||
} else if ((stop_type = MacroAssembler::tdi_get_si16(instruction, Assembler::traptoUnconditional, 0)) != -1) {
|
} else if ((stop_type = MacroAssembler::tdi_get_si16(instruction, Assembler::traptoUnconditional, 0)) != -1) {
|
||||||
|
bool msg_present = (stop_type & MacroAssembler::stop_msg_present);
|
||||||
|
stop_type = (stop_type &~ MacroAssembler::stop_msg_present);
|
||||||
|
const char **detail_msg_ptr = (const char**)(here + 4);
|
||||||
st->fill_to(aligned_pos + tabspacing);
|
st->fill_to(aligned_pos + tabspacing);
|
||||||
st->print(";trap: stop type %d", stop_type);
|
st->print(";trap: stop type %d: %s", stop_type, msg_present ? *detail_msg_ptr : "no details provided");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4432,17 +4432,21 @@ void MacroAssembler::verify_oop_addr(RegisterOrConstant offs, Register base, con
|
||||||
|
|
||||||
// Call a C-function that prints output.
|
// Call a C-function that prints output.
|
||||||
void MacroAssembler::stop(int type, const char* msg) {
|
void MacroAssembler::stop(int type, const char* msg) {
|
||||||
|
bool msg_present = (msg != NULL);
|
||||||
|
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
block_comment(err_msg("stop(type %d): %s {", type, msg));
|
block_comment(err_msg("stop(type %d): %s {", type, msg_present ? msg : "null"));
|
||||||
#else
|
#else
|
||||||
block_comment("stop {");
|
block_comment("stop {");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (type != stop_shouldnotreachhere) {
|
if (msg_present) {
|
||||||
// Use R0 to pass msg. "shouldnotreachhere" preserves R0.
|
type |= stop_msg_present;
|
||||||
load_const_optimized(R0, (void*)msg);
|
|
||||||
}
|
}
|
||||||
tdi_unchecked(traptoUnconditional, 0/*reg 0*/, type);
|
tdi_unchecked(traptoUnconditional, 0/*reg 0*/, type);
|
||||||
|
if (msg_present) {
|
||||||
|
emit_int64((uintptr_t)msg);
|
||||||
|
}
|
||||||
|
|
||||||
block_comment("} stop;");
|
block_comment("} stop;");
|
||||||
}
|
}
|
||||||
|
|
|
@ -901,17 +901,18 @@ class MacroAssembler: public Assembler {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum {
|
enum {
|
||||||
stop_stop = 0,
|
stop_stop = 0,
|
||||||
stop_untested = 1,
|
stop_untested = 1,
|
||||||
stop_unimplemented = 2,
|
stop_unimplemented = 2,
|
||||||
stop_shouldnotreachhere = 3
|
stop_shouldnotreachhere = 3,
|
||||||
|
stop_msg_present = -0x8000
|
||||||
};
|
};
|
||||||
|
|
||||||
// Prints msg, dumps registers and stops execution.
|
// Prints msg, dumps registers and stops execution.
|
||||||
void stop (const char* msg = NULL) { stop(stop_stop, msg ); }
|
void stop (const char* msg = NULL) { stop(stop_stop, msg); }
|
||||||
void untested (const char* msg = NULL) { stop(stop_untested, msg ); }
|
void untested (const char* msg = NULL) { stop(stop_untested, msg); }
|
||||||
void unimplemented(const char* msg = NULL) { stop(stop_unimplemented, msg ); }
|
void unimplemented (const char* msg = NULL) { stop(stop_unimplemented, msg); }
|
||||||
void should_not_reach_here() { stop(stop_shouldnotreachhere, NULL); }
|
void should_not_reach_here(const char* msg = NULL) { stop(stop_shouldnotreachhere, msg); }
|
||||||
|
|
||||||
void zap_from_to(Register low, int before, Register high, int after, Register val, Register addr) PRODUCT_RETURN;
|
void zap_from_to(Register low, int before, Register high, int after, Register val, Register addr) PRODUCT_RETURN;
|
||||||
};
|
};
|
||||||
|
|
|
@ -438,25 +438,28 @@ JVM_handle_aix_signal(int sig, siginfo_t* info, void* ucVoid, int abort_if_unrec
|
||||||
|
|
||||||
// stop on request
|
// stop on request
|
||||||
else if (sig == SIGTRAP && (stop_type = nativeInstruction_at(pc)->get_stop_type()) != -1) {
|
else if (sig == SIGTRAP && (stop_type = nativeInstruction_at(pc)->get_stop_type()) != -1) {
|
||||||
const char *msg = NULL,
|
bool msg_present = (stop_type & MacroAssembler::stop_msg_present);
|
||||||
*detail_msg = (const char*)(uc->uc_mcontext.jmp_context.gpr[0]);
|
stop_type = (stop_type &~ MacroAssembler::stop_msg_present);
|
||||||
|
|
||||||
|
const char *msg = NULL;
|
||||||
switch (stop_type) {
|
switch (stop_type) {
|
||||||
case MacroAssembler::stop_stop : msg = "stop"; break;
|
case MacroAssembler::stop_stop : msg = "stop"; break;
|
||||||
case MacroAssembler::stop_untested : msg = "untested"; break;
|
case MacroAssembler::stop_untested : msg = "untested"; break;
|
||||||
case MacroAssembler::stop_unimplemented : msg = "unimplemented"; break;
|
case MacroAssembler::stop_unimplemented : msg = "unimplemented"; break;
|
||||||
case MacroAssembler::stop_shouldnotreachhere: msg = "shouldnotreachhere"; detail_msg = NULL; break;
|
case MacroAssembler::stop_shouldnotreachhere: msg = "shouldnotreachhere"; break;
|
||||||
default: msg = "unknown"; break;
|
default: msg = "unknown"; break;
|
||||||
}
|
}
|
||||||
if (detail_msg == NULL) {
|
|
||||||
detail_msg = "no details provided";
|
const char **detail_msg_ptr = (const char**)(pc + 4);
|
||||||
}
|
const char *detail_msg = msg_present ? *detail_msg_ptr : "no details provided";
|
||||||
|
|
||||||
if (TraceTraps) {
|
if (TraceTraps) {
|
||||||
tty->print_cr("trap: %s: %s (SIGTRAP, stop type %d)", msg, detail_msg, stop_type);
|
tty->print_cr("trap: %s: %s (SIGTRAP, stop type %d)", msg, detail_msg, stop_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_list detail_args;
|
va_list detail_args;
|
||||||
VMError::report_and_die(t, ucVoid, NULL, 0, msg, detail_msg, detail_args);
|
VMError::report_and_die(INTERNAL_ERROR, msg, detail_msg, detail_args, thread,
|
||||||
|
pc, info, ucVoid, NULL, 0, 0);
|
||||||
va_end(detail_args);
|
va_end(detail_args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -468,25 +468,28 @@ JVM_handle_linux_signal(int sig,
|
||||||
|
|
||||||
// stop on request
|
// stop on request
|
||||||
else if (sig == SIGTRAP && (stop_type = nativeInstruction_at(pc)->get_stop_type()) != -1) {
|
else if (sig == SIGTRAP && (stop_type = nativeInstruction_at(pc)->get_stop_type()) != -1) {
|
||||||
const char *msg = NULL,
|
bool msg_present = (stop_type & MacroAssembler::stop_msg_present);
|
||||||
*detail_msg = (const char*)(uc->uc_mcontext.regs->gpr[0]);
|
stop_type = (stop_type &~ MacroAssembler::stop_msg_present);
|
||||||
|
|
||||||
|
const char *msg = NULL;
|
||||||
switch (stop_type) {
|
switch (stop_type) {
|
||||||
case MacroAssembler::stop_stop : msg = "stop"; break;
|
case MacroAssembler::stop_stop : msg = "stop"; break;
|
||||||
case MacroAssembler::stop_untested : msg = "untested"; break;
|
case MacroAssembler::stop_untested : msg = "untested"; break;
|
||||||
case MacroAssembler::stop_unimplemented : msg = "unimplemented"; break;
|
case MacroAssembler::stop_unimplemented : msg = "unimplemented"; break;
|
||||||
case MacroAssembler::stop_shouldnotreachhere: msg = "shouldnotreachhere"; detail_msg = NULL; break;
|
case MacroAssembler::stop_shouldnotreachhere: msg = "shouldnotreachhere"; break;
|
||||||
default: msg = "unknown"; break;
|
default: msg = "unknown"; break;
|
||||||
}
|
}
|
||||||
if (detail_msg == NULL) {
|
|
||||||
detail_msg = "no details provided";
|
const char **detail_msg_ptr = (const char**)(pc + 4);
|
||||||
}
|
const char *detail_msg = msg_present ? *detail_msg_ptr : "no details provided";
|
||||||
|
|
||||||
if (TraceTraps) {
|
if (TraceTraps) {
|
||||||
tty->print_cr("trap: %s: %s (SIGTRAP, stop type %d)", msg, detail_msg, stop_type);
|
tty->print_cr("trap: %s: %s (SIGTRAP, stop type %d)", msg, detail_msg, stop_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_list detail_args;
|
va_list detail_args;
|
||||||
VMError::report_and_die(t, ucVoid, NULL, 0, msg, detail_msg, detail_args);
|
VMError::report_and_die(INTERNAL_ERROR, msg, detail_msg, detail_args, thread,
|
||||||
|
pc, info, ucVoid, NULL, 0, 0);
|
||||||
va_end(detail_args);
|
va_end(detail_args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue