[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#303461: xserver-xfree86: elfloader requires extra cache flush for ia64



Package: xserver-xfree86
Version: 4.3.0.dfsg.1-10
Severity: important
Tags: patch

ia64 needs an extra cache flush to ensure module text is coherent in
memory when loaded through the elfloader.  The mprotect alignment is
backported from existing upstream code.  The patch below brings this
section of code in line w/ current CVS HEAD for X.org.

	Alex

-- 
Alex Williamson                             HP Linux & Open Source Lab

--- xc/programs/Xserver/hw/xfree86/common/compiler.h	2005-03-31 21:34:04.000000000 -0700
+++ xc/programs/Xserver/hw/xfree86/common/compiler.h	2005-03-31 21:14:44.000000000 -0700
@@ -436,7 +436,7 @@
  */
 #    define ia64_flush_cache(Addr) \
 	__asm__ __volatile__ ( \
-		"fc %0;;;" \
+		"fc.i %0;;;" \
 		"sync.i;;;" \
 		"mf;;;" \
 		"srlz.i;;;" \
--- xc/programs/Xserver/hw/xfree86/loader/elfloader.c	2005-03-31 21:34:05.000000000 -0700
+++ xc/programs/Xserver/hw/xfree86/loader/elfloader.c	2005-03-31 22:22:46.000000000 -0700
@@ -2738,8 +2738,23 @@
 	switch (SecType(i)) {
 #if defined(linux) || defined(__OpenBSD__)
 	case SHT_PROGBITS:
-	    mprotect(elffile->lsection[j].saddr, SecSize(i), 
-		     PROT_READ|PROT_WRITE|PROT_EXEC);
+            {
+		unsigned long page_size = getpagesize();
+		unsigned long round;
+
+		round = (unsigned long)(elffile->lsection[j].saddr) & (page_size-1);
+		mprotect(elffile->lsection[j].saddr - round,
+		    (SecSize(i)+round+page_size-1) & ~(page_size-1),
+		    PROT_READ|PROT_WRITE|PROT_EXEC);
+	   }
+#ifdef __ia64__
+	   {
+		int k;
+		for (k = 0; k < SecSize(i); k += 32)
+		    ia64_flush_cache(elffile->lsection[j].saddr+k);
+		ia64_flush_cache(elffile->lsection[j].saddr+SecSize(i)-1);
+	   }
+#endif
 	    break;
 #endif
 	case SHT_SYMTAB:





Reply to: