patch-2.4.18 linux/fs/binfmt_elf.c
Next file: linux/fs/block_dev.c
Previous file: linux/fs/bfs/inode.c
Back to the patch index
Back to the overall index
- Lines: 137
- Date:
Mon Feb 4 19:11:16 2002
- Orig file:
linux.orig/fs/binfmt_elf.c
- Orig date:
Mon Feb 18 20:18:40 2002
diff -Naur -X /home/marcelo/lib/dontdiff linux.orig/fs/binfmt_elf.c linux/fs/binfmt_elf.c
@@ -138,6 +138,22 @@
} else
u_platform = p;
+#if defined(__i386__) && defined(CONFIG_SMP)
+ /*
+ * In some cases (e.g. Hyper-Threading), we want to avoid L1 evictions
+ * by the processes running on the same package. One thing we can do
+ * is to shuffle the initial stack for them.
+ *
+ * The conditionals here are unneeded, but kept in to make the
+ * code behaviour the same as pre change unless we have hyperthreaded
+ * processors. This keeps Mr Marcelo Person happier but should be
+ * removed for 2.5
+ */
+
+ if(smp_num_siblings > 1)
+ u_platform = u_platform - ((current->pid % 64) << 7);
+#endif
+
/*
* Force 16 byte _final_ alignment here for generality.
*/
@@ -505,30 +521,10 @@
#if 0
printk("Using ELF interpreter %s\n", elf_interpreter);
#endif
-#ifdef __sparc__
- if (ibcs2_interpreter) {
- unsigned long old_pers = current->personality;
- struct exec_domain *old_domain = current->exec_domain;
- struct exec_domain *new_domain;
- struct fs_struct *old_fs = current->fs, *new_fs;
- get_exec_domain(old_domain);
- atomic_inc(&old_fs->count);
-
- set_personality(PER_SVR4);
- interpreter = open_exec(elf_interpreter);
-
- new_domain = current->exec_domain;
- new_fs = current->fs;
- current->personality = old_pers;
- current->exec_domain = old_domain;
- current->fs = old_fs;
- put_exec_domain(new_domain);
- put_fs_struct(new_fs);
- } else
-#endif
- {
- interpreter = open_exec(elf_interpreter);
- }
+
+ SET_PERSONALITY(elf_ex, ibcs2_interpreter);
+
+ interpreter = open_exec(elf_interpreter);
retval = PTR_ERR(interpreter);
if (IS_ERR(interpreter))
goto out_free_interp;
@@ -602,10 +598,6 @@
current->flags &= ~PF_FORKNOEXEC;
elf_entry = (unsigned long) elf_ex.e_entry;
- /* Do this immediately, since STACK_TOP as used in setup_arg_pages
- may depend on the personality. */
- SET_PERSONALITY(elf_ex, ibcs2_interpreter);
-
/* Do this so that we can load the interpreter, if need be. We will
change some of these later */
current->mm->rss = 0;
@@ -1049,6 +1041,23 @@
}
+ memset(&prstatus, 0, sizeof(prstatus));
+ /*
+ * This transfers the registers from regs into the standard
+ * coredump arrangement, whatever that is.
+ */
+#ifdef ELF_CORE_COPY_REGS
+ ELF_CORE_COPY_REGS(prstatus.pr_reg, regs)
+#else
+ if (sizeof(elf_gregset_t) != sizeof(struct pt_regs))
+ {
+ printk("sizeof(elf_gregset_t) (%ld) != sizeof(struct pt_regs) (%ld)\n",
+ (long)sizeof(elf_gregset_t), (long)sizeof(struct pt_regs));
+ }
+ else
+ *(struct pt_regs *)&prstatus.pr_reg = *regs;
+#endif
+
/* now stop all vm operations */
down_write(¤t->mm->mmap_sem);
segs = current->mm->map_count;
@@ -1092,7 +1101,6 @@
* Set up the notes in similar form to SVR4 core dumps made
* with info from their /proc.
*/
- memset(&prstatus, 0, sizeof(prstatus));
notes[0].name = "CORE";
notes[0].type = NT_PRSTATUS;
@@ -1114,22 +1122,6 @@
prstatus.pr_cstime.tv_sec = CT_TO_SECS(current->times.tms_cstime);
prstatus.pr_cstime.tv_usec = CT_TO_USECS(current->times.tms_cstime);
- /*
- * This transfers the registers from regs into the standard
- * coredump arrangement, whatever that is.
- */
-#ifdef ELF_CORE_COPY_REGS
- ELF_CORE_COPY_REGS(prstatus.pr_reg, regs)
-#else
- if (sizeof(elf_gregset_t) != sizeof(struct pt_regs))
- {
- printk("sizeof(elf_gregset_t) (%ld) != sizeof(struct pt_regs) (%ld)\n",
- (long)sizeof(elf_gregset_t), (long)sizeof(struct pt_regs));
- }
- else
- *(struct pt_regs *)&prstatus.pr_reg = *regs;
-#endif
-
#ifdef DEBUG
dump_regs("Passed in regs", (elf_greg_t *)regs);
dump_regs("prstatus regs", (elf_greg_t *)&prstatus.pr_reg);
@@ -1225,9 +1217,11 @@
if (!maydump(vma))
continue;
+
#ifdef DEBUG
- printk("elf_core_dump: writing %08lx %lx\n", addr, len);
+ printk("elf_core_dump: writing %08lx-%08lx\n", vma->vm_start, vma->vm_end);
#endif
+
for (addr = vma->vm_start;
addr < vma->vm_end;
addr += PAGE_SIZE) {
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)