Mercurial > hg > truffle
comparison src/cpu/x86/vm/relocInfo_x86.cpp @ 2404:b40d4fa697bf
6964776: c2 should ensure the polling page is reachable on 64 bit
Summary: Materialize the pointer to the polling page in a register instead of using rip-relative addressing when the distance from the code cache is larger than disp32.
Reviewed-by: never, kvn
author | iveresov |
---|---|
date | Sun, 27 Mar 2011 13:17:37 -0700 |
parents | d673ef06fe96 |
children | da91efe96a93 |
comparison
equal
deleted
inserted
replaced
2403:1927db75dd85 | 2404:b40d4fa697bf |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1998, 2011, 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. |
196 *(short*)ni->addr_at(0) = instrs[0]; | 196 *(short*)ni->addr_at(0) = instrs[0]; |
197 } | 197 } |
198 | 198 |
199 void poll_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) { | 199 void poll_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) { |
200 #ifdef _LP64 | 200 #ifdef _LP64 |
201 typedef Assembler::WhichOperand WhichOperand; | 201 if (!Assembler::is_polling_page_far()) { |
202 WhichOperand which = (WhichOperand) format(); | 202 typedef Assembler::WhichOperand WhichOperand; |
203 // This format is imm but it is really disp32 | 203 WhichOperand which = (WhichOperand) format(); |
204 which = Assembler::disp32_operand; | 204 // This format is imm but it is really disp32 |
205 address orig_addr = old_addr_for(addr(), src, dest); | 205 which = Assembler::disp32_operand; |
206 NativeInstruction* oni = nativeInstruction_at(orig_addr); | 206 address orig_addr = old_addr_for(addr(), src, dest); |
207 int32_t* orig_disp = (int32_t*) Assembler::locate_operand(orig_addr, which); | 207 NativeInstruction* oni = nativeInstruction_at(orig_addr); |
208 // This poll_addr is incorrect by the size of the instruction it is irrelevant | 208 int32_t* orig_disp = (int32_t*) Assembler::locate_operand(orig_addr, which); |
209 intptr_t poll_addr = (intptr_t)oni + *orig_disp; | 209 // This poll_addr is incorrect by the size of the instruction it is irrelevant |
210 | 210 intptr_t poll_addr = (intptr_t)oni + *orig_disp; |
211 NativeInstruction* ni = nativeInstruction_at(addr()); | 211 |
212 intptr_t new_disp = poll_addr - (intptr_t) ni; | 212 NativeInstruction* ni = nativeInstruction_at(addr()); |
213 | 213 intptr_t new_disp = poll_addr - (intptr_t) ni; |
214 int32_t* disp = (int32_t*) Assembler::locate_operand(addr(), which); | 214 |
215 * disp = (int32_t)new_disp; | 215 int32_t* disp = (int32_t*) Assembler::locate_operand(addr(), which); |
216 | 216 * disp = (int32_t)new_disp; |
217 } | |
217 #endif // _LP64 | 218 #endif // _LP64 |
218 } | 219 } |
219 | 220 |
220 void poll_return_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) { | 221 void poll_return_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) { |
221 #ifdef _LP64 | 222 #ifdef _LP64 |
222 typedef Assembler::WhichOperand WhichOperand; | 223 if (!Assembler::is_polling_page_far()) { |
223 WhichOperand which = (WhichOperand) format(); | 224 typedef Assembler::WhichOperand WhichOperand; |
224 // This format is imm but it is really disp32 | 225 WhichOperand which = (WhichOperand) format(); |
225 which = Assembler::disp32_operand; | 226 // This format is imm but it is really disp32 |
226 address orig_addr = old_addr_for(addr(), src, dest); | 227 which = Assembler::disp32_operand; |
227 NativeInstruction* oni = nativeInstruction_at(orig_addr); | 228 address orig_addr = old_addr_for(addr(), src, dest); |
228 int32_t* orig_disp = (int32_t*) Assembler::locate_operand(orig_addr, which); | 229 NativeInstruction* oni = nativeInstruction_at(orig_addr); |
229 // This poll_addr is incorrect by the size of the instruction it is irrelevant | 230 int32_t* orig_disp = (int32_t*) Assembler::locate_operand(orig_addr, which); |
230 intptr_t poll_addr = (intptr_t)oni + *orig_disp; | 231 // This poll_addr is incorrect by the size of the instruction it is irrelevant |
231 | 232 intptr_t poll_addr = (intptr_t)oni + *orig_disp; |
232 NativeInstruction* ni = nativeInstruction_at(addr()); | 233 |
233 intptr_t new_disp = poll_addr - (intptr_t) ni; | 234 NativeInstruction* ni = nativeInstruction_at(addr()); |
234 | 235 intptr_t new_disp = poll_addr - (intptr_t) ni; |
235 int32_t* disp = (int32_t*) Assembler::locate_operand(addr(), which); | 236 |
236 * disp = (int32_t)new_disp; | 237 int32_t* disp = (int32_t*) Assembler::locate_operand(addr(), which); |
238 * disp = (int32_t)new_disp; | |
239 } | |
237 #endif // _LP64 | 240 #endif // _LP64 |
238 } | 241 } |