Request for reviews (S): 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29

Vladimir Kozlov vladimir.kozlov at oracle.com
Tue Feb 14 09:28:12 PST 2012


I found that we have already such function fat_nop() but I am not sure it is 
correct. I am worried that it is 2 nops in 64-bit VM:

   emit_byte(0x66);
   emit_byte(0x66);
   emit_byte(0x90);
   emit_byte(0x66);
   emit_byte(0x90);

Thanks,
Vladimir

Vladimir Kozlov wrote:
> Christian Thalinger wrote:
>> On Feb 14, 2012, at 4:56 PM, Vladimir Kozlov wrote:
>>
>>> Thank you, Christian
>>>
>>> We can't use address nop on old cpus (amd before ss2 and intel before 
>>> p6, see vm_version_x86.cpp).
>>
>> Right, I missed that.  It would be a good idea to have an assert or 
>> guarantee checking UseAddressNop in these methods.
> 
> I'm thinking now to add new asm function nop_for_patching() which will 
> generated either addr_nop_5 or stack_bang based on UseAddressNop flag.
> 
> I will add asserts into addr_nop_*().
> 
> Thanks,
> Vladimir
> 
>>
>> -- Chris
>>
>>> I will look on masm definition in MachProlog.
>>>
>>> Thanks,
>>> Vladimir
>>>
>>> On 2/14/12 1:08 AM, Christian Thalinger wrote:
>>>> On Feb 14, 2012, at 5:02 AM, Vladimir Kozlov wrote:
>>>>
>>>>> http://cr.openjdk.java.net/~kvn/7125136/webrev
>>>>>
>>>>> 7125136: SIGILL on linux amd64 in gc/ArrayJuggle/Juggle29
>>>>>
>>>>> Saving RBP register on nmethod's entry broke nmethod's verified 
>>>>> entry patching when it become non-entrant. There is big comment in 
>>>>> MachPrologNode::emit() about first instruction which should be at 
>>>>> lest 5 bytes long. And push(rbp) is one byte instruction. VerifyFPU 
>>>>> code also broken (first instruction is pushf). The same with C1 
>>>>> generated code with VerifyFPU and C1Breakpoint.
>>>>>
>>>>> The only reason we did not noticed this until now is stack bang 
>>>>> instruction is usually generated first and it is big (store to 
>>>>> stack with big offset). But C2 does not generated it if compiled 
>>>>> stack frame is small and no calls in compiled method.
>>>>>
>>>>> For C2 moved saving EBP after ESP adjustment. And other cleanup in 
>>>>> prolog code.
>>>>> For C1 generated stack bang with small offset (-256) first if needed.
>>>> Why are we using bang_stack_with_offset in this case?  How about 
>>>> addr_nop_5?
>>>>
>>>> It would be better if you would define masm at the beginning of 
>>>> MachPrologNode::emit instead of doing it multiple times in if clauses.
>>>>
>>>> Otherwise this looks good.
>>>>
>>>> -- Chris
>>>>
>>>>> Verified by examining generated code.
>>>>>
>>>>> SPARC code is safe since we generate 1 instruction (load from 0) 
>>>>> for patching and use signal handler.
>>>>>
>>>>> Thanks,
>>>>> Vladimir
>>


More information about the hotspot-compiler-dev mailing list