⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uml-2.6.10-fc3.patch

📁 非常经典的一个分布式系统
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
 	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, &current->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 + -