Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 17 Dec 2011 15:31:00 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r228635 - head/libexec/rtld-elf/powerpc
Message-ID:  <201112171531.pBHFV0sT065067@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Sat Dec 17 15:31:00 2011
New Revision: 228635
URL: http://svn.freebsd.org/changeset/base/228635

Log:
  Fix RTLD on PowerPC after r228435. Changing the order of init_pltgot()
  caused the icache to be invalidated at the wrong time, resulting in
  an icache full of nonsense in the PLT section.

Modified:
  head/libexec/rtld-elf/powerpc/reloc.c

Modified: head/libexec/rtld-elf/powerpc/reloc.c
==============================================================================
--- head/libexec/rtld-elf/powerpc/reloc.c	Sat Dec 17 15:26:34 2011	(r228634)
+++ head/libexec/rtld-elf/powerpc/reloc.c	Sat Dec 17 15:31:00 2011	(r228635)
@@ -366,7 +366,7 @@ reloc_plt_object(Obj_Entry *obj, const E
 		
 
 	/*
-	 * The icache will be sync'd in init_pltgot, which is called
+	 * The icache will be sync'd in reloc_plt, which is called
 	 * after all the slots have been updated
 	 */
 
@@ -382,6 +382,7 @@ reloc_plt(Obj_Entry *obj)
 {
 	const Elf_Rela *relalim;
 	const Elf_Rela *rela;
+	int N = obj->pltrelasize / sizeof(Elf_Rela);
 
 	if (obj->pltrelasize != 0) {
 
@@ -396,6 +397,13 @@ reloc_plt(Obj_Entry *obj)
 		}
 	}
 
+	/*
+	 * Sync the icache for the byte range represented by the
+	 * trampoline routines and call slots.
+	 */
+	if (obj->pltgot != NULL)
+		__syncicache(obj->pltgot, JMPTAB_BASE(N)*4);
+
 	return (0);
 }
 
@@ -595,10 +603,9 @@ init_pltgot(Obj_Entry *obj)
 	pltresolve[4] |= _ppc_la(obj);
 
 	/*
-	 * Sync the icache for the byte range represented by the
-	 * trampoline routines and call slots.
+	 * The icache will be sync'd in reloc_plt, which is called
+	 * after all the slots have been updated
 	 */
-	__syncicache(obj->pltgot, JMPTAB_BASE(N)*4);
 }
 
 void



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201112171531.pBHFV0sT065067>