📄 uml-2.6.10-fc3.patch
字号:
pe_data.stdout = fds[1]; pid = run_helper(change_pre_exec, &pe_data, argv, NULL); - os_close_file(fds[1]); read_output(fds[0], output, output_len);+ os_close_file(fds[0]);+ os_close_file(fds[1]); - CATCH_EINTR(err = waitpid(pid, NULL, 0));+ if (pid > 0)+ CATCH_EINTR(err = waitpid(pid, NULL, 0)); return(pid); } Index: linux-2.6.10/arch/um/os-Linux/process.c===================================================================--- linux-2.6.10.orig/arch/um/os-Linux/process.c 2004-12-25 05:34:00.000000000 +0800+++ linux-2.6.10/arch/um/os-Linux/process.c 2005-04-07 22:14:57.660384000 +0800@@ -94,10 +94,16 @@ CATCH_EINTR(waitpid(pid, NULL, 0)); }+/* Kill off a ptraced child by all means available. kill it normally first,+ * then PTRACE_KILL it, then PTRACE_CONT it in case it's in a run state from+ * which it can't exit directly.+ */ void os_kill_ptraced_process(int pid, int reap_child) {+ kill(pid, SIGKILL); ptrace(PTRACE_KILL, pid);+ ptrace(PTRACE_CONT, pid); if(reap_child) CATCH_EINTR(waitpid(pid, NULL, 0)); }Index: linux-2.6.10/arch/um/os-Linux/elf_aux.c===================================================================--- linux-2.6.10.orig/arch/um/os-Linux/elf_aux.c 2005-04-07 19:34:21.197950744 +0800+++ linux-2.6.10/arch/um/os-Linux/elf_aux.c 2005-04-07 22:05:29.478760736 +0800@@ -0,0 +1,67 @@+/*+ * arch/um/kernel/elf_aux.c+ *+ * Scan the Elf auxiliary vector provided by the host to extract+ * information about vsyscall-page, etc.+ *+ * Copyright (C) 2004 Fujitsu Siemens Computers GmbH+ * Author: Bodo Stroesser (bodo.stroesser@fujitsu-siemens.com)+ */+#include <elf.h>+#include <stddef.h>+#include "init.h"+#include "elf_user.h"++#if ELF_CLASS == ELFCLASS32+typedef Elf32_auxv_t elf_auxv_t;+#else+typedef Elf64_auxv_t elf_auxv_t;+#endif++char * elf_aux_platform;+long elf_aux_hwcap;++unsigned long vsyscall_ehdr;+unsigned long vsyscall_end;++unsigned long __kernel_vsyscall;+++__init void scan_elf_aux( char **envp)+{+ long page_size = 0;+ elf_auxv_t * auxv;++ while ( *envp++ != NULL) ;++ for ( auxv = (elf_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++) {+ switch ( auxv->a_type ) {+ case AT_SYSINFO:+ __kernel_vsyscall = auxv->a_un.a_val;+ break;+ case AT_SYSINFO_EHDR:+ vsyscall_ehdr = auxv->a_un.a_val;+ break;+ case AT_HWCAP:+ elf_aux_hwcap = auxv->a_un.a_val;+ break;+ case AT_PLATFORM:+ elf_aux_platform = auxv->a_un.a_val;+ break;+ case AT_PAGESZ:+ page_size = auxv->a_un.a_val;+ break;+ }+ }+ if ( ! __kernel_vsyscall || ! vsyscall_ehdr ||+ ! elf_aux_hwcap || ! elf_aux_platform ||+ ! page_size || (vsyscall_ehdr % page_size) ) {+ __kernel_vsyscall = 0;+ vsyscall_ehdr = 0;+ elf_aux_hwcap = 0;+ elf_aux_platform = "i586";+ }+ else {+ vsyscall_end = vsyscall_ehdr + page_size;+ }+}Index: linux-2.6.10/arch/um/os-Linux/user_syms.c===================================================================--- linux-2.6.10.orig/arch/um/os-Linux/user_syms.c 2004-12-25 05:35:23.000000000 +0800+++ linux-2.6.10/arch/um/os-Linux/user_syms.c 2005-04-07 22:05:29.478760736 +0800@@ -26,6 +26,9 @@ EXPORT_SYMBOL(strstr); +EXPORT_SYMBOL(vsyscall_ehdr);+EXPORT_SYMBOL(vsyscall_end);+ /* Here, instead, I can provide a fake prototype. Yes, someone cares: genksyms. * However, the modules will use the CRC defined *here*, no matter if it is * good; so the versions of these symbols will always matchIndex: linux-2.6.10/arch/um/os-Linux/Makefile===================================================================--- linux-2.6.10.orig/arch/um/os-Linux/Makefile 2004-12-25 05:35:00.000000000 +0800+++ linux-2.6.10/arch/um/os-Linux/Makefile 2005-04-07 22:05:29.479760584 +0800@@ -3,9 +3,9 @@ # Licensed under the GPL # -obj-y = file.o process.o time.o tty.o user_syms.o drivers/+obj-y = elf_aux.o file.o process.o time.o tty.o user_syms.o drivers/ -USER_OBJS := $(foreach file,file.o process.o time.o tty.o,$(obj)/$(file))+USER_OBJS := $(foreach file,elf_aux.o file.o process.o time.o tty.o,$(obj)/$(file)) $(USER_OBJS) : %.o: %.c $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $<Index: linux-2.6.10/arch/um/sys-i386/signal.c===================================================================--- linux-2.6.10.orig/arch/um/sys-i386/signal.c 2005-04-07 19:34:21.197950744 +0800+++ linux-2.6.10/arch/um/sys-i386/signal.c 2005-04-07 22:05:29.479760584 +0800@@ -0,0 +1,374 @@+/*+ * Copyright (C) 2004 Jeff Dike (jdike@addtoit.com)+ * Licensed under the GPL+ */++#include "linux/signal.h"+#include "linux/ptrace.h"+#include "asm/current.h"+#include "asm/ucontext.h"+#include "asm/uaccess.h"+#include "asm/unistd.h"+#include "frame_kern.h"+#include "signal_user.h"+#include "ptrace_user.h"+#include "sigcontext.h"+#include "mode.h"++#ifdef CONFIG_MODE_SKAS++#include "skas.h"++static int copy_sc_from_user_skas(struct pt_regs *regs,+ struct sigcontext *from)+{+ struct sigcontext sc;+ unsigned long fpregs[HOST_FP_SIZE];+ int err;++ err = copy_from_user(&sc, from, sizeof(sc));+ err |= copy_from_user(fpregs, sc.fpstate, sizeof(fpregs));+ if(err)+ return(err);++ REGS_GS(regs->regs.skas.regs) = sc.gs;+ REGS_FS(regs->regs.skas.regs) = sc.fs;+ REGS_ES(regs->regs.skas.regs) = sc.es;+ REGS_DS(regs->regs.skas.regs) = sc.ds;+ REGS_EDI(regs->regs.skas.regs) = sc.edi;+ REGS_ESI(regs->regs.skas.regs) = sc.esi;+ REGS_EBP(regs->regs.skas.regs) = sc.ebp;+ REGS_SP(regs->regs.skas.regs) = sc.esp;+ REGS_EBX(regs->regs.skas.regs) = sc.ebx;+ REGS_EDX(regs->regs.skas.regs) = sc.edx;+ REGS_ECX(regs->regs.skas.regs) = sc.ecx;+ REGS_EAX(regs->regs.skas.regs) = sc.eax;+ REGS_IP(regs->regs.skas.regs) = sc.eip;+ REGS_CS(regs->regs.skas.regs) = sc.cs;+ REGS_EFLAGS(regs->regs.skas.regs) = sc.eflags;+ REGS_SS(regs->regs.skas.regs) = sc.ss;+ regs->regs.skas.fault_addr = sc.cr2;+ regs->regs.skas.fault_type = FAULT_WRITE(sc.err);+ regs->regs.skas.trap_type = sc.trapno;++ err = ptrace_setfpregs(userspace_pid[0], fpregs);+ if(err < 0){+ printk("copy_sc_from_user_skas - PTRACE_SETFPREGS failed, "+ "errno = %d\n", err);+ return(1);+ }++ return(0);+}++int copy_sc_to_user_skas(struct sigcontext *to, struct _fpstate *to_fp,+ struct pt_regs *regs, unsigned long fault_addr,+ int fault_type)+{+ struct sigcontext sc;+ unsigned long fpregs[HOST_FP_SIZE];+ int err;++ sc.gs = REGS_GS(regs->regs.skas.regs);+ sc.fs = REGS_FS(regs->regs.skas.regs);+ sc.es = REGS_ES(regs->regs.skas.regs);+ sc.ds = REGS_DS(regs->regs.skas.regs);+ sc.edi = REGS_EDI(regs->regs.skas.regs);+ sc.esi = REGS_ESI(regs->regs.skas.regs);+ sc.ebp = REGS_EBP(regs->regs.skas.regs);+ sc.esp = REGS_SP(regs->regs.skas.regs);+ sc.ebx = REGS_EBX(regs->regs.skas.regs);+ sc.edx = REGS_EDX(regs->regs.skas.regs);+ sc.ecx = REGS_ECX(regs->regs.skas.regs);+ sc.eax = REGS_EAX(regs->regs.skas.regs);+ sc.eip = REGS_IP(regs->regs.skas.regs);+ sc.cs = REGS_CS(regs->regs.skas.regs);+ sc.eflags = REGS_EFLAGS(regs->regs.skas.regs);+ sc.esp_at_signal = regs->regs.skas.regs[UESP];+ sc.ss = regs->regs.skas.regs[SS];+ sc.cr2 = fault_addr;+ sc.err = TO_SC_ERR(fault_type);+ sc.trapno = regs->regs.skas.trap_type;++ err = ptrace_getfpregs(userspace_pid[0], fpregs);+ if(err < 0){+ printk("copy_sc_to_user_skas - PTRACE_GETFPREGS failed, "+ "errno = %d\n", err);+ return(1);+ }+ to_fp = (to_fp ? to_fp : (struct _fpstate *) (to + 1));+ sc.fpstate = to_fp;++ if(err)+ return(err);++ return(copy_to_user(to, &sc, sizeof(sc)) ||+ copy_to_user(to_fp, fpregs, sizeof(fpregs)));+}+#endif++#ifdef CONFIG_MODE_TT+int copy_sc_from_user_tt(struct sigcontext *to, struct sigcontext *from,+ int fpsize)+{+ struct _fpstate *to_fp, *from_fp;+ unsigned long sigs;+ int err;++ to_fp = to->fpstate;+ from_fp = from->fpstate;+ sigs = to->oldmask;+ err = copy_from_user(to, from, sizeof(*to));+ to->oldmask = sigs;+ if(to_fp != NULL){+ err |= copy_from_user(&to->fpstate, &to_fp,+ sizeof(to->fpstate));+ err |= copy_from_user(to_fp, from_fp, fpsize);+ }+ return(err);+}++int copy_sc_to_user_tt(struct sigcontext *to, struct _fpstate *fp,+ struct sigcontext *from, int fpsize)+{+ struct _fpstate *to_fp, *from_fp;+ int err;++ to_fp = (fp ? fp : (struct _fpstate *) (to + 1));+ from_fp = from->fpstate;+ err = copy_to_user(to, from, sizeof(*to));+ if(from_fp != NULL){+ err |= copy_to_user(&to->fpstate, &to_fp,+ sizeof(to->fpstate));+ err |= copy_to_user(to_fp, from_fp, fpsize);+ }+ return(err);+}+#endif++static int copy_sc_from_user(struct pt_regs *to, void *from)+{+ int ret;++ ret = CHOOSE_MODE(copy_sc_from_user_tt(UPT_SC(&to->regs), from,+ sizeof(struct _fpstate)),+ copy_sc_from_user_skas(to, from));+ return(ret);+}++static int copy_sc_to_user(struct sigcontext *to, struct _fpstate *fp,+ struct pt_regs *from)+{+ return(CHOOSE_MODE(copy_sc_to_user_tt(to, fp, UPT_SC(&from->regs),+ sizeof(*fp)),+ copy_sc_to_user_skas(to, fp, from,+ current->thread.cr2,+ current->thread.err)));+}++static int copy_ucontext_to_user(struct ucontext *uc, struct _fpstate *fp,+ sigset_t *set, unsigned long sp)+{+ int err = 0;++ err |= put_user(current->sas_ss_sp, &uc->uc_stack.ss_sp);+ err |= put_user(sas_ss_flags(sp), &uc->uc_stack.ss_flags);+ err |= put_user(current->sas_ss_size, &uc->uc_stack.ss_size);+ err |= copy_sc_to_user(&uc->uc_mcontext, fp, ¤t->thread.regs);+ err |= copy_to_user(&uc->uc_sigmask, set, sizeof(*set));+ return(err);+}++struct sigframe+{+ char *pretcode;+ int sig;+ struct sigcontext sc;+ struct _fpstate fpstate;+ unsigned long extramask[_NSIG_WORDS-1];+ char retcode[8];+};++struct rt_sigframe+{+ char *pretcode;+ int sig;+ struct siginfo *pinfo;+ void *puc;+ struct siginfo info;+ struct ucontext uc;+ struct _fpstate fpstate;+ char retcode[8];+};++int setup_signal_stack_sc(unsigned long stack_top, int sig,+ struct k_sigaction *ka, struct pt_regs *regs,+ sigset_t *mask)+{+ struct sigframe __user *frame;+ void *restorer;+ int err = 0;++ stack_top &= -8UL;+ frame = (struct sigframe *) stack_top - 1;+ if(verify_area(VERIFY_WRITE, frame, sizeof(*frame)))+ return(1);++ restorer = (void *) frame->retcode;+ if(ka->sa.sa_flags & SA_RESTORER)+ restorer = ka->sa.sa_restorer;++ err |= __put_user(restorer, &frame->pretcode);+ err |= __put_user(sig, &frame->sig);+ err |= copy_sc_to_user(&frame->sc, NULL, regs);+ err |= __put_user(mask->sig[0], &frame->sc.oldmask);+ if (_NSIG_WORDS > 1)+ err |= __copy_to_user(&frame->extramask, &mask->sig[1],+ sizeof(frame->extramask));++ /*+ * This is popl %eax ; movl $,%eax ; int $0x80+ *+ * WE DO NOT USE IT ANY MORE! It's only left here for historical+ * reasons and because gdb uses it as a signature to notice+ * signal handler stack frames.+ */+ err |= __put_user(0xb858, (short __user *)(frame->retcode+0));+ err |= __put_user(__NR_sigreturn, (int __user *)(frame->retcode+2));+ err |= __put_user(0x80cd, (short __user *)(frame->retcode+6));++ if(err)+ return(err);++ PT_REGS_SP(regs) = (unsigned long) frame;+ PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler;+ PT_REGS_EAX(regs) = (unsigned long) sig;+ PT_REGS_EDX(regs) = (unsigned long) 0;+ PT_REGS_ECX(regs) = (unsigned long) 0;++ if ((current->ptrace & PT_DTRACE) && (current->ptrace & PT_PTRACED))+ ptrace_notify(SIGTRAP);+ return(0);+}++int setup_signal_stack_si(unsigned long stack_top, int sig,+ struct k_sigaction *ka, struct pt_regs *regs,+ siginfo_t *info, sigset_t *mask)+{+ struct rt_sigframe __user *frame;+ void *restorer;+ int err = 0;++ stack_top &= -8UL;+ frame = (struct rt_sigframe *) stack_top - 1;+ if(verify_area(VERIFY_WRITE, frame, sizeof(*frame)))+ return(1);++ restorer = (void *) frame->retcode;+ if(ka->sa.sa_flags & SA_RESTORER)+ restorer = ka->sa.sa_restorer;++ err |= __put_user(restorer, &frame->pretcode);+ err |= __put_user(sig, &frame->sig);+ err |= __put_user(&frame->info, &frame->pinfo);+ err |= __put_user(&frame->uc, &frame->puc);+ err |= copy_siginfo_to_user(&frame->info, info);+ err |= copy_ucontext_to_user(&frame->uc, &frame->fpstate, mask,+ PT_REGS_SP(regs));++ /*+ * This is movl $,%eax ; int $0x80+ *+ * WE DO NOT USE IT ANY MORE! It's only left here for historical+ * reasons and because gdb uses it as a signature to notice
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -