diff -rc elilo/ia64/gzip.c elilo.new/ia64/gzip.c *** elilo/ia64/gzip.c 2003-08-19 18:46:28.000000000 +0200 --- elilo.new/ia64/gzip.c 2005-09-15 16:17:31.000000000 +0200 *************** *** 68,73 **** --- 68,74 ---- #define CHUNK_FL_VALID 0x1 #define CHUNK_FL_LOAD 0x2 + #define CHUNK_FL_X 0x4 #define CHUNK_CAN_LOAD(n) chunks[(n)].flags |= CHUNK_FL_LOAD #define CHUNK_NO_LOAD(n) chunks[(n)].flags &= ~CHUNK_FL_LOAD *************** *** 391,396 **** --- 392,400 ---- continue; } + if (bswap32(phdrs[i].p_flags) & PF_X) + chunks[i].flags |= CHUNK_FL_X; + CHUNK_CAN_LOAD(i); /* mark no load chunk */ VERB_PRT(3, *************** *** 566,571 **** --- 570,577 ---- if (cnt > outcnt) cnt = outcnt; Memcpy(dst, src, cnt); + if (cp->flags & CHUNK_FL_X) + flush_dcache (dst, cnt); file_offset += cnt; outcnt -= cnt; Only in elilo.new/ia64: gzip.c~ Only in elilo.new/ia64: gzip_loader.o Only in elilo.new/ia64: gzip.o Only in elilo.new/ia64: longjmp.o Only in elilo.new/ia64: memcpy.o Only in elilo.new/ia64: memset.o diff -rc elilo/ia64/plain_loader.c elilo.new/ia64/plain_loader.c *** elilo/ia64/plain_loader.c 2003-08-19 18:46:45.000000000 +0200 --- elilo.new/ia64/plain_loader.c 2005-09-15 16:10:17.000000000 +0200 *************** *** 387,392 **** --- 387,394 ---- ret = read_file(fd, filesz, (CHAR8 *)phdrs[i].p_paddr); if (ret == ELILO_LOAD_ABORTED) goto load_abort; if (ret == ELILO_LOAD_ERROR) goto out; + if (bswap32(phdrs[i].p_flags) & PF_X) + flush_dcache ((CHAR8 *)phdrs[i].p_paddr, filesz); /* * update file position Only in elilo.new/ia64: plain_loader.c~ Only in elilo.new/ia64: plain_loader.o diff -rc elilo/ia64/private.h elilo.new/ia64/private.h *** elilo/ia64/private.h 2003-08-19 18:47:02.000000000 +0200 --- elilo.new/ia64/private.h 2005-09-15 16:10:47.000000000 +0200 *************** *** 31,35 **** --- 31,37 ---- extern INTN ia64_can_relocate(); + extern void flush_dcache (CHAR8 *addr, UINT64 len); + #endif /* __ELILO_PRIVATE_IA64_H__ */ Only in elilo.new/ia64: private.h~ Only in elilo.new/ia64: setjmp.o Only in elilo.new/ia64: sysdeps.h~ Only in elilo.new/ia64: sysdeps.o diff -rc elilo/ia64/system.c elilo.new/ia64/system.c *** elilo/ia64/system.c 2003-08-19 18:46:49.000000000 +0200 --- elilo.new/ia64/system.c 2005-09-15 16:19:14.000000000 +0200 *************** *** 135,137 **** --- 135,154 ---- return 0; } + /* Flush data cache [addr; addr + len], and sync with icache. */ + void + flush_dcache (CHAR8 *addr, UINT64 len) + { + /* Cache line length is at least 32. */ + UINT64 a = (UINT64)addr & ~0x1f; + + VERB_PRT(3, Print(L"Flush 0x%lx-", a)); + + /* Flush data. */ + for (len = (len + 31) & ~0x1f; len > 0; len -= 0x20, a += 0x20) + asm volatile ("fc %0" : : "r" (a)); + /* Sync and serialize. Maybe extra. */ + asm volatile (";; sync.i;; srlz.i;;"); + + VERB_PRT(3, Print(L"0x%lx\n", a)); + }