comparison src/os_cpu/solaris_x86/vm/solaris_x86_64.ad @ 4950:9b8ce46870df

7145346: VerifyStackAtCalls is broken Summary: Replace call_epilog() encoding with macroassembler use. Moved duplicated code to x86.ad. Fixed return_addr() definition. Reviewed-by: never
author kvn
date Thu, 16 Feb 2012 17:12:49 -0800
parents 95134e034042
children e961c11b85fe
comparison
equal deleted inserted replaced
4949:ad3b47344802 4950:9b8ce46870df
1 // 1 //
2 // Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. 2 // Copyright (c) 2004, 2012, 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.
53 // code in the enc_class source block. Emit functions will live in the 53 // code in the enc_class source block. Emit functions will live in the
54 // main source block for now. In future, we can generalize this by 54 // main source block for now. In future, we can generalize this by
55 // adding a syntax that specifies the sizes of fields in an order, 55 // adding a syntax that specifies the sizes of fields in an order,
56 // so that the adlc can build the emit functions automagically 56 // so that the adlc can build the emit functions automagically
57 57
58 enc_class Java_To_Runtime(method meth) 58 enc_class Java_To_Runtime(method meth) %{
59 %{
60 // No relocation needed 59 // No relocation needed
61 60
62 // movq r10, <meth> 61 // movq r10, <meth>
63 emit_opcode(cbuf, Assembler::REX_WB); 62 emit_opcode(cbuf, Assembler::REX_WB);
64 emit_opcode(cbuf, 0xB8 | (R10_enc - 8)); 63 emit_opcode(cbuf, 0xB8 | (R10_enc - 8));
68 emit_opcode(cbuf, Assembler::REX_B); 67 emit_opcode(cbuf, Assembler::REX_B);
69 emit_opcode(cbuf, 0xFF); 68 emit_opcode(cbuf, 0xFF);
70 emit_opcode(cbuf, 0xD0 | (R10_enc - 8)); 69 emit_opcode(cbuf, 0xD0 | (R10_enc - 8));
71 %} 70 %}
72 71
73 enc_class solaris_breakpoint 72 enc_class post_call_verify_mxcsr %{
74 %{ 73 MacroAssembler _masm(&cbuf);
75 MacroAssembler* masm = new MacroAssembler(&cbuf); 74 if (RestoreMXCSROnJNICalls) {
76 masm->call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint))); 75 __ ldmxcsr(ExternalAddress(StubRoutines::amd64::mxcsr_std()));
77 %} 76 }
78 77 else if (CheckJNICalls) {
79 enc_class call_epilog 78 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::amd64::verify_mxcsr_entry())));
80 %{
81 if (VerifyStackAtCalls) {
82 // Check that stack depth is unchanged: find majik cookie on stack
83 int framesize =
84 ra_->reg2offset_unchecked(OptoReg::add(ra_->_matcher._old_SP, -3*VMRegImpl::slots_per_word));
85 if (framesize) {
86 if (framesize < 0x80) {
87 emit_opcode(cbuf, Assembler::REX_W);
88 emit_opcode(cbuf, 0x81); // cmpq [rsp+0],0xbadb1ood
89 emit_d8(cbuf, 0x7C);
90 emit_d8(cbuf, 0x24);
91 emit_d8(cbuf, framesize); // Find majik cookie from ESP
92 emit_d32(cbuf, 0xbadb100d);
93 } else {
94 emit_opcode(cbuf, Assembler::REX_W);
95 emit_opcode(cbuf, 0x81); // cmpq [rsp+0],0xbadb1ood
96 emit_d8(cbuf, 0xBC);
97 emit_d8(cbuf, 0x24);
98 emit_d32(cbuf, framesize); // Find majik cookie from ESP
99 emit_d32(cbuf, 0xbadb100d);
100 }
101 }
102 // jmp EQ around INT3
103 // QQQ TODO
104 const int jump_around = 5; // size of call to breakpoint, 1 for CC
105 emit_opcode(cbuf, 0x74);
106 emit_d8(cbuf, jump_around);
107 // QQQ temporary
108 emit_break(cbuf);
109 // Die if stack mismatch
110 // emit_opcode(cbuf,0xCC);
111 } 79 }
112 %} 80 %}
113
114 enc_class post_call_verify_mxcsr %{
115 MacroAssembler masm(&cbuf);
116 if (RestoreMXCSROnJNICalls) {
117 masm.ldmxcsr(ExternalAddress(StubRoutines::amd64::mxcsr_std()));
118 }
119 else if (CheckJNICalls) {
120 masm.call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::amd64::verify_mxcsr_entry())));
121 }
122 %}
123 %}
124
125 // INSTRUCTIONS -- Platform dependent
126
127 //----------OS and Locking Instructions----------------------------------------
128
129 // This name is KNOWN by the ADLC and cannot be changed.
130 // The ADLC forces a 'TypeRawPtr::BOTTOM' output type
131 // for this guy.
132 instruct tlsLoadP(r15_RegP dst)
133 %{
134 match(Set dst (ThreadLocal));
135 effect(DEF dst);
136
137 size(0);
138 format %{ "# TLS is in R15" %}
139 ins_encode( /*empty encoding*/ );
140 ins_pipe(ialu_reg_reg);
141 %}
142
143 // Die now
144 instruct ShouldNotReachHere()
145 %{
146 match(Halt);
147
148 // Use the following format syntax
149 format %{ "int3\t# ShouldNotReachHere" %}
150 // QQQ TODO for now call breakpoint
151 // opcode(0xCC);
152 // ins_encode(Opc);
153 ins_encode(solaris_breakpoint);
154 ins_pipe(pipe_slow);
155 %} 81 %}
156 82
157 83
158 // Platform dependent source 84 // Platform dependent source
159 85
160 source 86 source %{
161 %{
162 87
163 int MachCallRuntimeNode::ret_addr_offset() 88 int MachCallRuntimeNode::ret_addr_offset() {
164 {
165 return 13; // movq r10,#addr; callq (r10) 89 return 13; // movq r10,#addr; callq (r10)
166 } 90 }
167 91
168 // emit an interrupt that is caught by the debugger
169 void emit_break(CodeBuffer& cbuf)
170 {
171 // Debugger doesn't really catch this but best we can do so far QQQ
172 MacroAssembler* masm = new MacroAssembler(&cbuf);
173 masm->call(RuntimeAddress(CAST_FROM_FN_PTR(address, os::breakpoint)));
174 }
175
176 void MachBreakpointNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const
177 {
178 emit_break(cbuf);
179 }
180
181 uint MachBreakpointNode::size(PhaseRegAlloc* ra_) const
182 {
183 // distance could be far and requires load and call through register
184 return MachNode::size(ra_);
185 }
186
187 %} 92 %}