📄 uml-2.6.10-fc3.patch
字号:
++ fixrange_init( FIXADDR_USER_START, FIXADDR_USER_END, swapper_pg_dir);+ paddr = (unsigned long)alloc_bootmem_low_pages( size);+ memcpy( (void *)paddr, (void *)FIXADDR_USER_START, size);+ paddr = __pa(paddr);+ for ( ; size > 0; size-=PAGE_SIZE, vaddr+=PAGE_SIZE, paddr+=PAGE_SIZE) {+ pgd = swapper_pg_dir + pgd_index(vaddr);+ pmd = pmd_offset(pgd, vaddr);+ pte = pte_offset_kernel(pmd, vaddr);+ /*pte_set_val( (*pte), paddr, PAGE_READONLY);*/+ pte_val(*pte) = paddr | pgprot_val(PAGE_READONLY);+ }+}+ void paging_init(void) { unsigned long zones_size[MAX_NR_ZONES], vaddr;@@ -195,6 +219,8 @@ vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; fixrange_init(vaddr, FIXADDR_TOP, swapper_pg_dir); + fixaddr_user_init();+ #ifdef CONFIG_HIGHMEM init_highmem(); #endifIndex: linux-2.6.10/arch/um/kernel/skas/process.c===================================================================--- linux-2.6.10.orig/arch/um/kernel/skas/process.c 2004-12-25 05:35:39.000000000 +0800+++ linux-2.6.10/arch/um/kernel/skas/process.c 2005-04-07 22:05:29.483759976 +0800@@ -11,6 +11,7 @@ #include <sched.h> #include <sys/wait.h> #include <sys/ptrace.h>+#include <linux/ptrace.h> #include <sys/mman.h> #include <sys/user.h> #include <asm/unistd.h>@@ -60,15 +61,10 @@ /*To use the same value of using_sysemu as the caller, ask it that value (in local_using_sysemu)*/ static void handle_trap(int pid, union uml_pt_regs *regs, int local_using_sysemu) {- int err, syscall_nr, status;-- syscall_nr = PT_SYSCALL_NR(regs->skas.regs);- UPT_SYSCALL_NR(regs) = syscall_nr;- if(syscall_nr < 0){- relay_signal(SIGTRAP, regs);- return;- } + int err, status;+ + UPT_SYSCALL_NR(regs) = PT_SYSCALL_NR(regs->skas.regs); /* Mark this as a syscall */ if (!local_using_sysemu) { err = ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, __NR_getpid);@@ -82,7 +78,8 @@ "errno = %d\n", errno); CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED));- if((err < 0) || !WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP))+ if((err < 0) || !WIFSTOPPED(status) ||+ (WSTOPSIG(status) != (SIGTRAP|SYSCALL_TRAP))) panic("handle_trap - failed to wait at end of syscall, " "errno = %d, status = %d\n", errno, status); }@@ -131,6 +128,10 @@ panic("start_userspace : expected SIGSTOP, got status = %d", status); + if (ptrace(PTRACE_OLDSETOPTIONS, pid, NULL, (void *)PTRACE_O_TRACESYSGOOD) < 0)+ panic("start_userspace : PTRACE_SETOPTIONS failed, errno=%d\n",+ errno);+ if(munmap(stack, PAGE_SIZE) < 0) panic("start_userspace : munmap failed, errno = %d\n", errno); @@ -160,15 +161,19 @@ regs->skas.is_user = 1; save_registers(regs);+ UPT_SYSCALL_NR(regs) = -1; /* Assume: It's not a syscall */ if(WIFSTOPPED(status)){ switch(WSTOPSIG(status)){ case SIGSEGV: handle_segv(pid); break;- case SIGTRAP:+ case (SIGTRAP|SYSCALL_TRAP): handle_trap(pid, regs, local_using_sysemu); break;+ case SIGTRAP:+ relay_signal(SIGTRAP, regs);+ break; case SIGIO: case SIGVTALRM: case SIGILL:@@ -222,9 +227,10 @@ block_signals(); if(sigsetjmp(fork_buf, 1) == 0) new_thread_proc(stack, handler);- set_signals(flags); remove_sigstack();++ set_signals(flags); } void thread_wait(void *sw, void *fb)Index: linux-2.6.10/arch/um/kernel/skas/sys-i386/Makefile===================================================================--- linux-2.6.10.orig/arch/um/kernel/skas/sys-i386/Makefile 2004-12-25 05:35:27.000000000 +0800+++ linux-2.6.10/arch/um/kernel/skas/sys-i386/Makefile 2005-04-07 19:34:21.197950744 +0800@@ -1,12 +0,0 @@-# -# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)-# Licensed under the GPL-#--obj-y = sigcontext.o--USER_OBJS = sigcontext.o-USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))--$(USER_OBJS) : %.o: %.c- $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $<Index: linux-2.6.10/arch/um/kernel/skas/sys-i386/sigcontext.c===================================================================--- linux-2.6.10.orig/arch/um/kernel/skas/sys-i386/sigcontext.c 2004-12-25 05:33:51.000000000 +0800+++ linux-2.6.10/arch/um/kernel/skas/sys-i386/sigcontext.c 2005-04-07 19:34:21.197950744 +0800@@ -1,114 +0,0 @@-/* - * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)- * Licensed under the GPL- */--#include <errno.h>-#include <asm/sigcontext.h>-#include <sys/ptrace.h>-#include <linux/ptrace.h>-#include "sysdep/ptrace.h"-#include "sysdep/ptrace_user.h"-#include "kern_util.h"-#include "user.h"-#include "sigcontext.h"-#include "mode.h"--int copy_sc_from_user_skas(int pid, union uml_pt_regs *regs, void *from_ptr)-{- struct sigcontext sc, *from = from_ptr;- unsigned long fpregs[FP_FRAME_SIZE];- int err;-- err = copy_from_user_proc(&sc, from, sizeof(sc));- err |= copy_from_user_proc(fpregs, sc.fpstate, sizeof(fpregs));- if(err)- return(err);-- regs->skas.regs[GS] = sc.gs;- regs->skas.regs[FS] = sc.fs;- regs->skas.regs[ES] = sc.es;- regs->skas.regs[DS] = sc.ds;- regs->skas.regs[EDI] = sc.edi;- regs->skas.regs[ESI] = sc.esi;- regs->skas.regs[EBP] = sc.ebp;- regs->skas.regs[UESP] = sc.esp;- regs->skas.regs[EBX] = sc.ebx;- regs->skas.regs[EDX] = sc.edx;- regs->skas.regs[ECX] = sc.ecx;- regs->skas.regs[EAX] = sc.eax;- regs->skas.regs[EIP] = sc.eip;- regs->skas.regs[CS] = sc.cs;- regs->skas.regs[EFL] = sc.eflags;- regs->skas.regs[SS] = sc.ss;- regs->skas.fault_addr = sc.cr2;- regs->skas.fault_type = FAULT_WRITE(sc.err);- regs->skas.trap_type = sc.trapno;-- err = ptrace(PTRACE_SETFPREGS, pid, 0, fpregs);- if(err < 0){- printk("copy_sc_to_user - PTRACE_SETFPREGS failed, "- "errno = %d\n", errno);- return(1);- }-- return(0);-}--int copy_sc_to_user_skas(int pid, void *to_ptr, void *fp,- union uml_pt_regs *regs, unsigned long fault_addr,- int fault_type)-{- struct sigcontext sc, *to = to_ptr;- struct _fpstate *to_fp;- unsigned long fpregs[FP_FRAME_SIZE];- int err;-- sc.gs = regs->skas.regs[GS];- sc.fs = regs->skas.regs[FS];- sc.es = regs->skas.regs[ES];- sc.ds = regs->skas.regs[DS];- sc.edi = regs->skas.regs[EDI];- sc.esi = regs->skas.regs[ESI];- sc.ebp = regs->skas.regs[EBP];- sc.esp = regs->skas.regs[UESP];- sc.ebx = regs->skas.regs[EBX];- sc.edx = regs->skas.regs[EDX];- sc.ecx = regs->skas.regs[ECX];- sc.eax = regs->skas.regs[EAX];- sc.eip = regs->skas.regs[EIP];- sc.cs = regs->skas.regs[CS];- sc.eflags = regs->skas.regs[EFL];- sc.esp_at_signal = regs->skas.regs[UESP];- sc.ss = regs->skas.regs[SS];- sc.cr2 = fault_addr;- sc.err = TO_SC_ERR(fault_type);- sc.trapno = regs->skas.trap_type;-- err = ptrace(PTRACE_GETFPREGS, pid, 0, fpregs);- if(err < 0){- printk("copy_sc_to_user - PTRACE_GETFPREGS failed, "- "errno = %d\n", errno);- return(1);- }- to_fp = (struct _fpstate *) - (fp ? (unsigned long) fp : ((unsigned long) to + sizeof(*to)));- sc.fpstate = to_fp;-- if(err)- return(err);-- return(copy_to_user_proc(to, &sc, sizeof(sc)) ||- copy_to_user_proc(to_fp, fpregs, sizeof(fpregs)));-}--/*- * Overrides for Emacs so that we follow Linus's tabbing style.- * Emacs will notice this stuff at the end of the file and automatically- * adjust the settings for this buffer only. This must remain at the end- * of the file.- * ---------------------------------------------------------------------------- * Local variables:- * c-file-style: "linux"- * End:- */Index: linux-2.6.10/arch/um/kernel/skas/process_kern.c===================================================================--- linux-2.6.10.orig/arch/um/kernel/skas/process_kern.c 2004-12-25 05:35:50.000000000 +0800+++ linux-2.6.10/arch/um/kernel/skas/process_kern.c 2005-04-07 22:05:29.488759216 +0800@@ -19,7 +19,6 @@ #include "os.h" #include "user_util.h" #include "tlb.h"-#include "frame.h" #include "kern.h" #include "mode.h" #include "proc_mm.h"@@ -183,7 +182,6 @@ int start_uml_skas(void) { start_userspace(0);- capture_signal_stack(); init_new_thread_signals(1); uml_idle_timer();Index: linux-2.6.10/arch/um/kernel/skas/trap_user.c===================================================================--- linux-2.6.10.orig/arch/um/kernel/skas/trap_user.c 2004-12-25 05:34:32.000000000 +0800+++ linux-2.6.10/arch/um/kernel/skas/trap_user.c 2005-04-07 22:05:29.488759216 +0800@@ -21,6 +21,14 @@ int save_errno = errno; int save_user; + /* This is done because to allow SIGSEGV to be delivered inside a SEGV+ * handler. This can happen in copy_user, and if SEGV is disabled,+ * the process will die.+ * XXX Figure out why this is better than SA_NODEFER+ */+ if(sig == SIGSEGV)+ change_sig(SIGSEGV, 1);+ r = &TASK_REGS(get_current())->skas; save_user = r->is_user; r->is_user = 0;Index: linux-2.6.10/arch/um/kernel/skas/syscall_kern.c===================================================================--- linux-2.6.10.orig/arch/um/kernel/skas/syscall_kern.c 2004-12-25 05:35:00.000000000 +0800+++ linux-2.6.10/arch/um/kernel/skas/syscall_kern.c 2005-04-07 22:05:29.488759216 +0800@@ -6,6 +6,7 @@ #include "linux/sys.h" #include "linux/ptrace.h" #include "asm/errno.h"+#include "linux/ptrace.h" #include "asm/unistd.h" #include "asm/ptrace.h" #include "asm/current.h"Index: linux-2.6.10/arch/um/kernel/skas/Makefile===================================================================--- linux-2.6.10.orig/arch/um/kernel/skas/Makefile 2004-12-25 05:34:30.000000000 +0800+++ linux-2.6.10/arch/um/kernel/skas/Makefile 2005-04-07 22:05:29.488759216 +0800@@ -4,8 +4,7 @@ # obj-y := exec_kern.o mem.o mem_user.o mmu.o process.o process_kern.o \- syscall_kern.o syscall_user.o time.o tlb.o trap_user.o uaccess.o \- sys-$(SUBARCH)/+ syscall_kern.o syscall_user.o time.o tlb.o trap_user.o uaccess.o subdir-y := util Index: linux-2.6.10/arch/um/kernel/skas/include/mmu-skas.h===================================================================--- linux-2.6.10.orig/arch/um/kernel/skas/include/mmu-skas.h 2004-12-25 05:35:24.000000000 +0800+++ linux-2.6.10/arch/um/kernel/skas/include/mmu-skas.h 2005-04-07 22:05:29.488759216 +0800@@ -22,3 +22,27 @@ * c-file-style: "linux" * End: */+/*+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)+ * Licensed under the GPL+ */++#ifndef __SKAS_MMU_H+#define __SKAS_MMU_H++struct mmu_context_skas {+ int mm_fd;+};++#endif++/*+ * Overrides for Emacs so that we follow Linus's tabbing style.+ * Emacs will notice this stuff at the end of the file and automatically+ * adjust the settings for this buffer only. This must remain at the end+ * of the file.+ * ---------------------------------------------------------------------------+ * Local variables:+ * c-file-style: "linux"+ * End:+ */Index: linux-2.6.10/arch/um/kernel/skas/include/mode-skas.h===================================================================--- linux-2.6.10.orig/arch/um/kernel/skas/include/mode-skas.h 2004-12-25 05:34:58.000000000 +0800+++ linux-2.6.10/arch/um/kernel/skas/include/mode-skas.h 2005-04-07 22:05:29.489759064 +0800@@ -14,6 +14,40 @@ extern int have_fpx_regs; extern void user_time_init_skas(void);+extern void sig_handler_common_skas(int sig, void *sc_ptr);+extern void halt_skas(void);+extern void reboot_skas(void);+extern void kill_off_processes_skas(void);+extern int is_skas_winch(int pid, int fd, void *data);++#endif++/*+ * Overrides for Emacs so that we follow Linus's tabbing style.+ * Emacs will notice this stuff at the end of the file and automatically+ * adjust the settings for this buffer only. This must remain at the end+ * of the file.+ * ---------------------------------------------------------------------------+ * Local variables:+ * c-file-style: "linux"+ * End:+ */+/*+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)+ * Licensed under the GPL+ */++#ifndef __MODE_SKAS_H__+#define __MODE_SKAS_H__++#include <sysdep/ptrace.h>++extern unsigned long exec_regs[];+extern unsigned long exec_fp_regs[];+extern unsigned long exec_fpx_regs[];+extern int have_fpx_regs;++extern void user_time_init_skas(void); extern int copy_sc_from_user_skas(int pid, union uml_pt_regs *regs, void *from_ptr); extern int copy_sc_to_user_skas(int pid, void *to_ptr, void *fp,Index: linux-2.6.10/arch/um/kernel/skas/include/uaccess-skas.h===================================================================--- linux-2.6.10.orig/arch/um/kernel/skas/include/uaccess-skas.h 2004-12-25 05:34:32.000000000 +0800+++ linux-2.6.10/arch/um/kernel/skas/include/uaccess-skas.h 2005-04-07 22:05:29.489759064 +0800@@ -7,6 +7,51 @@ #define __SKAS_UACCESS_H #include "asm/errno.h"+#include "asm/fixmap.h"++#define access_ok_skas(type, addr, size) \+ ((segment_eq(get_fs(), KERNEL_DS)) || \+ (((unsigned long) (addr) < TASK_SIZE) && \+ ((unsigned long) (addr) + (size) <= TASK_SIZE)) || \+ ((type == VERIFY_READ ) && \+ ((unsigned long) (addr) >= FIXADDR_USER_START) && \+ ((unsigned long) (addr) + (size) <= FIXADDR_USER_END) && \+ ((unsigned long) (addr) + (size) >= (unsigned long)(addr))))++static inline int verify_area_skas(int type, const void * addr,+ unsigned long size)+{+ return(access_ok_skas(type, addr, size) ? 0 : -EFAULT);+}++extern int copy_from_user_skas(void *to, const void *from, int n);+extern int copy_to_user_skas(void *to, const void *from, int n);+extern int strncpy_from_user_skas(char *dst, const char *src, int count);+extern int __clear_user_skas(void *mem, int len);+extern int clear_user_skas(void *mem, int len);+extern int strnlen_user_skas(const void *str, int len);++#endif++/*+ * Overrides for Emacs so that we follow Linus's tabbing style.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -