src/cpu/x86/vm/c1_Runtime1_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/cpu/x86/vm/c1_Runtime1_x86.cpp	Wed Nov 27 17:07:52 2013
--- new/src/cpu/x86/vm/c1_Runtime1_x86.cpp	Wed Nov 27 17:07:52 2013

*** 1717,1730 **** --- 1717,1732 ---- // arg0: store_address Address store_addr(rbp, 2*BytesPerWord); BarrierSet* bs = Universe::heap()->barrier_set(); CardTableModRefBS* ct = (CardTableModRefBS*)bs; + assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); + Label done; Label runtime; ! // At this point we know new_value is non-NULL and the new_value crosses regsion. ! // At this point we know new_value is non-NULL and the new_value crosses regions. // Must check to see if card is already dirty const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread); Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
*** 1733,1762 **** --- 1735,1755 ---- PtrQueue::byte_offset_of_buf())); __ push(rax); __ push(rcx); NOT_LP64(__ get_thread(thread);) ExternalAddress cardtable((address)ct->byte_map_base); assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); + const Register cardtable = rax; const Register card_addr = rcx; #ifdef _LP64 const Register tmp = rscratch1; + f.load_argument(0, card_addr); ! __ shrq(card_addr, CardTableModRefBS::card_shift); __ lea(tmp, cardtable); // get the address of the card ! __ addq(card_addr, tmp); #else const Register card_index = rcx; f.load_argument(0, card_index); __ shrl(card_index, CardTableModRefBS::card_shift); Address index(noreg, card_index, Address::times_1); __ leal(card_addr, __ as_Address(ArrayAddress(cardtable, index))); #endif ! __ shrptr(card_addr, CardTableModRefBS::card_shift); + // Do not use ExternalAddress to load 'byte_map_base', since 'byte_map_base' is NOT + // a valid address and therefore is not properly handled by the relocation code. See 8028109. ! __ movptr(cardtable, (intptr_t)ct->byte_map_base); + __ addptr(card_addr, cardtable); + + NOT_LP64(__ get_thread(thread);) __ cmpb(Address(card_addr, 0), (int)G1SATBCardTableModRefBS::g1_young_card_val()); __ jcc(Assembler::equal, done); __ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));

src/cpu/x86/vm/c1_Runtime1_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File