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: