Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 33857 Details for
Bug 54755
Please add SKAS to gentoo-dev-sources
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
SKAS-patch for gentoo-dev-sources 2.6.7
host-skas3-2.6.7-v1.patch (text/plain), 15.58 KB, created by
John Herdy
on 2004-06-22 09:24:23 UTC
(
hide
)
Description:
SKAS-patch for gentoo-dev-sources 2.6.7
Filename:
MIME Type:
Creator:
John Herdy
Created:
2004-06-22 09:24:23 UTC
Size:
15.58 KB
patch
obsolete
>--- ./arch/i386/kernel/sys_i386.c.skas 2004-03-13 17:55:23.000000000 +0100 >+++ ./arch/i386/kernel/sys_i386.c 2004-06-17 16:24:30.000000000 +0200 >@@ -41,7 +41,7 @@ > } > > /* common code for old and new mmaps */ >-static inline long do_mmap2( >+long do_mmap2(struct mm_struct *mm, > unsigned long addr, unsigned long len, > unsigned long prot, unsigned long flags, > unsigned long fd, unsigned long pgoff) >@@ -56,9 +56,9 @@ > goto out; > } > >- down_write(¤t->mm->mmap_sem); >- error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); >- up_write(¤t->mm->mmap_sem); >+ down_write(&mm->mmap_sem); >+ error = __do_mmap_pgoff(mm, file, addr, len, prot, flags, pgoff); >+ up_write(&mm->mmap_sem); > > if (file) > fput(file); >@@ -70,7 +70,7 @@ > unsigned long prot, unsigned long flags, > unsigned long fd, unsigned long pgoff) > { >- return do_mmap2(addr, len, prot, flags, fd, pgoff); >+ return do_mmap2(current->mm, addr, len, prot, flags, fd, pgoff); > } > > /* >@@ -101,7 +101,7 @@ > if (a.offset & ~PAGE_MASK) > goto out; > >- err = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); >+ err = do_mmap2(current->mm, a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); > out: > return err; > } >--- ./arch/i386/kernel/ptrace.c.skas 2004-06-16 22:25:18.000000000 +0200 >+++ ./arch/i386/kernel/ptrace.c 2004-06-17 16:24:30.000000000 +0200 >@@ -15,6 +15,7 @@ > #include <linux/user.h> > #include <linux/security.h> > #include <linux/audit.h> >+#include <linux/proc_mm.h> > > #include <asm/uaccess.h> > #include <asm/pgtable.h> >@@ -509,6 +510,56 @@ > (struct user_desc __user *) data); > break; > >+#ifdef CONFIG_PROC_MM >+ case PTRACE_FAULTINFO: { >+ struct ptrace_faultinfo fault; >+ >+ fault = ((struct ptrace_faultinfo) >+ { .is_write = child->thread.error_code, >+ .addr = child->thread.cr2 }); >+ ret = copy_to_user((unsigned long *) data, &fault, >+ sizeof(fault)); >+ if(ret) >+ break; >+ break; >+ } >+ >+ case PTRACE_SIGPENDING: >+ ret = copy_to_user((unsigned long *) data, >+ &child->pending.signal, >+ sizeof(child->pending.signal)); >+ break; >+ >+ case PTRACE_LDT: { >+ struct ptrace_ldt ldt; >+ >+ if(copy_from_user(&ldt, (unsigned long *) data, >+ sizeof(ldt))){ >+ ret = -EIO; >+ break; >+ } >+ ret = modify_ldt(child->mm, ldt.func, ldt.ptr, ldt.bytecount); >+ break; >+ } >+ >+ case PTRACE_SWITCH_MM: { >+ struct mm_struct *old = child->mm; >+ struct mm_struct *new = proc_mm_get_mm(data); >+ >+ if(IS_ERR(new)){ >+ ret = PTR_ERR(new); >+ break; >+ } >+ >+ atomic_inc(&new->mm_users); >+ child->mm = new; >+ child->active_mm = new; >+ mmput(old); >+ ret = 0; >+ break; >+ } >+#endif >+ > default: > ret = ptrace_request(child, request, addr, data); > break; >--- ./arch/i386/kernel/ldt.c.skas 2003-12-25 19:23:56.000000000 +0100 >+++ ./arch/i386/kernel/ldt.c 2004-06-17 16:24:30.000000000 +0200 >@@ -54,7 +54,7 @@ > pc->size = mincount; > wmb(); > >- if (reload) { >+ if (reload && (¤t->active_mm->context == pc)) { > #ifdef CONFIG_SMP > cpumask_t mask; > preempt_disable(); >@@ -89,14 +89,12 @@ > * we do not have to muck with descriptors here, that is > * done in switch_mm() as needed. > */ >-int init_new_context(struct task_struct *tsk, struct mm_struct *mm) >+int __init_new_context(struct mm_struct *mm, struct mm_struct *old_mm) > { >- struct mm_struct * old_mm; > int retval = 0; > > init_MUTEX(&mm->context.sem); > mm->context.size = 0; >- old_mm = current->mm; > if (old_mm && old_mm->context.size > 0) { > down(&old_mm->context.sem); > retval = copy_ldt(&mm->context, &old_mm->context); >@@ -105,6 +103,11 @@ > return retval; > } > >+int init_new_context(struct task_struct *tsk, struct mm_struct *mm) >+{ >+ return __init_new_context(mm, current->mm); >+} >+ > /* > * No need to lock the MM as we are the last user > */ >@@ -121,11 +124,11 @@ > } > } > >-static int read_ldt(void __user * ptr, unsigned long bytecount) >+static int read_ldt(struct mm_struct * mm, void __user * ptr, >+ unsigned long bytecount) > { > int err; > unsigned long size; >- struct mm_struct * mm = current->mm; > > if (!mm->context.size) > return 0; >@@ -169,9 +172,8 @@ > return err; > } > >-static int write_ldt(void __user * ptr, unsigned long bytecount, int oldmode) >+static int write_ldt(struct mm_struct * mm, void __user * ptr, unsigned long bytecount, int oldmode) > { >- struct mm_struct * mm = current->mm; > __u32 entry_1, entry_2, *lp; > int error; > struct user_desc ldt_info; >@@ -195,7 +197,7 @@ > > down(&mm->context.sem); > if (ldt_info.entry_number >= mm->context.size) { >- error = alloc_ldt(¤t->mm->context, ldt_info.entry_number+1, 1); >+ error = alloc_ldt(&mm->context, ldt_info.entry_number+1, 1); > if (error < 0) > goto out_unlock; > } >@@ -228,23 +230,29 @@ > return error; > } > >-asmlinkage int sys_modify_ldt(int func, void __user *ptr, unsigned long bytecount) >+int modify_ldt(struct mm_struct * mm, int func, void __user *ptr, >+ unsigned long bytecount) > { > int ret = -ENOSYS; > > switch (func) { > case 0: >- ret = read_ldt(ptr, bytecount); >+ ret = read_ldt(mm, ptr, bytecount); > break; > case 1: >- ret = write_ldt(ptr, bytecount, 1); >+ ret = write_ldt(mm, ptr, bytecount, 1); > break; > case 2: > ret = read_default_ldt(ptr, bytecount); > break; > case 0x11: >- ret = write_ldt(ptr, bytecount, 0); >+ ret = write_ldt(mm, ptr, bytecount, 0); > break; > } > return ret; > } >+ >+asmlinkage int sys_modify_ldt(int func, void __user *ptr, unsigned long bytecount) >+{ >+ return modify_ldt(current->mm, func, ptr, bytecount); >+} >--- ./arch/i386/Kconfig.skas 2004-06-16 22:25:18.000000000 +0200 >+++ ./arch/i386/Kconfig 2004-06-17 16:24:30.000000000 +0200 >@@ -720,6 +720,10 @@ > depends on HIGHMEM64G > default y > >+config PROC_MM >+ bool "/proc/mm support" >+ default y >+ > # Common NUMA Features > config NUMA > bool "Numa Memory Allocation and Scheduler Support" >--- ./include/linux/mm.h.skas 2004-06-16 22:27:11.000000000 +0200 >+++ ./include/linux/mm.h 2004-06-17 16:24:30.000000000 +0200 >@@ -574,6 +574,9 @@ > extern struct shrinker *set_shrinker(int, shrinker_t); > extern void remove_shrinker(struct shrinker *shrinker); > >+extern long do_mprotect(struct mm_struct *mm, unsigned long start, >+ size_t len, unsigned long prot); >+ > /* > * On a two-level page table, this ends up being trivial. Thus the > * inlining and the symmetry break with pte_alloc_map() that does all >@@ -632,9 +635,15 @@ > > extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); > >-extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, >+extern unsigned long __do_mmap_pgoff(struct mm_struct *mm, struct file *file, >+ unsigned long addr, unsigned long len, >+ unsigned long prot, unsigned long flag, >+ unsigned long pgoff); >+static inline unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, > unsigned long len, unsigned long prot, >- unsigned long flag, unsigned long pgoff); >+ unsigned long flag, unsigned long pgoff) { >+ return __do_mmap_pgoff(current->mm, file, addr, len, prot, flag, pgoff); >+} > > static inline unsigned long do_mmap(struct file *file, unsigned long addr, > unsigned long len, unsigned long prot, >--- ./include/linux/proc_mm.h.skas 2004-06-17 16:24:30.000000000 +0200 >+++ ./include/linux/proc_mm.h 2004-06-17 16:24:30.000000000 +0200 >@@ -0,0 +1,48 @@ >+/* >+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) >+ * Licensed under the GPL >+ */ >+ >+#ifndef __PROC_MM_H >+#define __PROC_MM_H >+ >+#include "linux/sched.h" >+ >+#define MM_MMAP 54 >+#define MM_MUNMAP 55 >+#define MM_MPROTECT 56 >+#define MM_COPY_SEGMENTS 57 >+ >+struct mm_mmap { >+ unsigned long addr; >+ unsigned long len; >+ unsigned long prot; >+ unsigned long flags; >+ unsigned long fd; >+ unsigned long offset; >+}; >+ >+struct mm_munmap { >+ unsigned long addr; >+ unsigned long len; >+}; >+ >+struct mm_mprotect { >+ unsigned long addr; >+ unsigned long len; >+ unsigned int prot; >+}; >+ >+struct proc_mm_op { >+ int op; >+ union { >+ struct mm_mmap mmap; >+ struct mm_munmap munmap; >+ struct mm_mprotect mprotect; >+ int copy_segments; >+ } u; >+}; >+ >+extern struct mm_struct *proc_mm_get_mm(int fd); >+ >+#endif >--- ./include/asm-i386/desc.h.skas 2003-12-20 17:44:08.000000000 +0100 >+++ ./include/asm-i386/desc.h 2004-06-17 16:24:30.000000000 +0200 >@@ -123,6 +123,9 @@ > put_cpu(); > } > >+extern int modify_ldt(struct mm_struct * mm, int func, void __user *ptr, >+ unsigned long bytecount); >+ > #endif /* !__ASSEMBLY__ */ > > #endif >--- ./include/asm-i386/processor.h.skas 2004-06-16 22:27:00.000000000 +0200 >+++ ./include/asm-i386/processor.h 2004-06-17 16:24:30.000000000 +0200 >@@ -649,6 +649,8 @@ > > extern void select_idle_routine(const struct cpuinfo_x86 *c); > >+extern int __init_new_context(struct mm_struct *mm, struct mm_struct *old_mm); >+ > #define cache_line_size() (boot_cpu_data.x86_cache_alignment) > > #ifdef CONFIG_SCHED_SMT >--- ./include/asm-i386/ptrace.h.skas 2003-12-20 17:21:33.000000000 +0100 >+++ ./include/asm-i386/ptrace.h 2004-06-17 16:24:30.000000000 +0200 >@@ -59,4 +59,26 @@ > #define instruction_pointer(regs) ((regs)->eip) > #endif > >+/*For SKAS3 support.*/ >+#ifndef _LINUX_PTRACE_STRUCT_DEF >+#define _LINUX_PTRACE_STRUCT_DEF >+ >+#define PTRACE_FAULTINFO 52 >+#define PTRACE_SIGPENDING 53 >+#define PTRACE_LDT 54 >+#define PTRACE_SWITCH_MM 55 >+ >+struct ptrace_faultinfo { >+ int is_write; >+ unsigned long addr; >+}; >+ >+struct ptrace_ldt { >+ int func; >+ void *ptr; >+ unsigned long bytecount; >+}; >+ >+#endif /*ifndef _LINUX_PTRACE_STRUCT_DEF*/ >+ > #endif >--- ./include/asm-i386/mmu_context.h.skas 2003-12-25 19:24:24.000000000 +0100 >+++ ./include/asm-i386/mmu_context.h 2004-06-17 16:24:30.000000000 +0200 >@@ -29,6 +29,10 @@ > { > int cpu = smp_processor_id(); > >+#ifdef CONFIG_SMP >+ prev = cpu_tlbstate[cpu].active_mm; >+#endif >+ > if (likely(prev != next)) { > /* stop flush ipis for the previous mm */ > cpu_clear(cpu, prev->cpu_vm_mask); >@@ -50,7 +54,6 @@ > #ifdef CONFIG_SMP > else { > cpu_tlbstate[cpu].state = TLBSTATE_OK; >- BUG_ON(cpu_tlbstate[cpu].active_mm != next); > > if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) { > /* We were in lazy tlb mode and leave_mm disabled >--- ./mm/mmap.c.skas 2004-06-16 22:27:18.000000000 +0200 >+++ ./mm/mmap.c 2004-06-17 16:24:30.000000000 +0200 >@@ -725,11 +725,11 @@ > * The caller must hold down_write(current->mm->mmap_sem). > */ > >-unsigned long do_mmap_pgoff(struct file * file, unsigned long addr, >- unsigned long len, unsigned long prot, >- unsigned long flags, unsigned long pgoff) >+unsigned long __do_mmap_pgoff(struct mm_struct *mm, struct file * file, >+ unsigned long addr, unsigned long len, >+ unsigned long prot, unsigned long flags, >+ unsigned long pgoff) > { >- struct mm_struct * mm = current->mm; > struct vm_area_struct * vma, * prev; > struct inode *inode; > unsigned int vm_flags; >@@ -988,7 +988,7 @@ > return error; > } > >-EXPORT_SYMBOL(do_mmap_pgoff); >+EXPORT_SYMBOL(__do_mmap_pgoff); > > /* Get an address range which is currently unmapped. > * For shmat() with addr=0. >--- ./mm/mprotect.c.skas 2004-06-16 22:27:18.000000000 +0200 >+++ ./mm/mprotect.c 2004-06-17 16:24:30.000000000 +0200 >@@ -185,8 +185,9 @@ > return error; > } > >-asmlinkage long >-sys_mprotect(unsigned long start, size_t len, unsigned long prot) >+long >+do_mprotect(struct mm_struct *mm, unsigned long start, size_t len, >+ unsigned long prot) > { > unsigned long vm_flags, nstart, end, tmp; > struct vm_area_struct *vma, *prev; >@@ -209,9 +210,9 @@ > > vm_flags = calc_vm_prot_bits(prot); > >- down_write(¤t->mm->mmap_sem); >+ down_write(&mm->mmap_sem); > >- vma = find_vma_prev(current->mm, start, &prev); >+ vma = find_vma_prev(mm, start, &prev); > error = -ENOMEM; > if (!vma) > goto out; >@@ -277,6 +278,11 @@ > } > } > out: >- up_write(¤t->mm->mmap_sem); >+ up_write(&mm->mmap_sem); > return error; > } >+ >+asmlinkage long sys_mprotect(unsigned long start, size_t len, unsigned long prot) >+{ >+ return(do_mprotect(current->mm, start, len, prot)); >+} >--- ./mm/proc_mm.c.skas 2004-06-17 16:24:30.000000000 +0200 >+++ ./mm/proc_mm.c 2004-06-17 16:24:30.000000000 +0200 >@@ -0,0 +1,174 @@ >+/* >+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) >+ * Licensed under the GPL >+ */ >+ >+#include "linux/mm.h" >+#include "linux/init.h" >+#include "linux/proc_fs.h" >+#include "linux/proc_mm.h" >+#include "linux/file.h" >+#include "asm/uaccess.h" >+#include "asm/mmu_context.h" >+ >+static struct file_operations proc_mm_fops; >+ >+struct mm_struct *proc_mm_get_mm(int fd) >+{ >+ struct mm_struct *ret = ERR_PTR(-EBADF); >+ struct file *file; >+ >+ file = fget(fd); >+ if (!file) >+ goto out; >+ >+ ret = ERR_PTR(-EINVAL); >+ if(file->f_op != &proc_mm_fops) >+ goto out_fput; >+ >+ ret = file->private_data; >+ out_fput: >+ fput(file); >+ out: >+ return(ret); >+} >+ >+extern long do_mmap2(struct mm_struct *mm, unsigned long addr, >+ unsigned long len, unsigned long prot, >+ unsigned long flags, unsigned long fd, >+ unsigned long pgoff); >+ >+static ssize_t write_proc_mm(struct file *file, const char *buffer, >+ size_t count, loff_t *ppos) >+{ >+ struct mm_struct *mm = file->private_data; >+ struct proc_mm_op req; >+ int n, ret; >+ >+ if(count > sizeof(req)) >+ return(-EINVAL); >+ >+ n = copy_from_user(&req, buffer, count); >+ if(n != 0) >+ return(-EFAULT); >+ >+ ret = count; >+ switch(req.op){ >+ case MM_MMAP: { >+ struct mm_mmap *map = &req.u.mmap; >+ >+ ret = do_mmap2(mm, map->addr, map->len, map->prot, >+ map->flags, map->fd, map->offset >> PAGE_SHIFT); >+ if((ret & ~PAGE_MASK) == 0) >+ ret = count; >+ >+ break; >+ } >+ case MM_MUNMAP: { >+ struct mm_munmap *unmap = &req.u.munmap; >+ >+ down_write(&mm->mmap_sem); >+ ret = do_munmap(mm, unmap->addr, unmap->len); >+ up_write(&mm->mmap_sem); >+ >+ if(ret == 0) >+ ret = count; >+ break; >+ } >+ case MM_MPROTECT: { >+ struct mm_mprotect *protect = &req.u.mprotect; >+ >+ ret = do_mprotect(mm, protect->addr, protect->len, >+ protect->prot); >+ if(ret == 0) >+ ret = count; >+ break; >+ } >+ >+ case MM_COPY_SEGMENTS: { >+ struct mm_struct *from = proc_mm_get_mm(req.u.copy_segments); >+ >+ if(IS_ERR(from)){ >+ ret = PTR_ERR(from); >+ break; >+ } >+ >+ __init_new_context(mm, from); >+ break; >+ } >+ default: >+ ret = -EINVAL; >+ break; >+ } >+ >+ return(ret); >+} >+ >+static int open_proc_mm(struct inode *inode, struct file *file) >+{ >+ struct mm_struct *mm = mm_alloc(); >+ int ret; >+ >+ ret = -ENOMEM; >+ if(mm == NULL) >+ goto out_mem; >+ >+ ret = init_new_context(current, mm); >+ if(ret) >+ goto out_free; >+ >+ spin_lock(&mmlist_lock); >+ list_add(&mm->mmlist, ¤t->mm->mmlist); >+ mmlist_nr++; >+ spin_unlock(&mmlist_lock); >+ >+ file->private_data = mm; >+ >+ return(0); >+ >+ out_free: >+ mmput(mm); >+ out_mem: >+ return(ret); >+} >+ >+static int release_proc_mm(struct inode *inode, struct file *file) >+{ >+ struct mm_struct *mm = file->private_data; >+ >+ mmput(mm); >+ return(0); >+} >+ >+static struct file_operations proc_mm_fops = { >+ .open = open_proc_mm, >+ .release = release_proc_mm, >+ .write = write_proc_mm, >+}; >+ >+static int make_proc_mm(void) >+{ >+ struct proc_dir_entry *ent; >+ >+ ent = create_proc_entry("mm", 0222, &proc_root); >+ if(ent == NULL){ >+ printk("make_proc_mm : Failed to register /proc/mm\n"); >+ return(0); >+ } >+ ent->proc_fops = &proc_mm_fops; >+ >+ return(0); >+} >+ >+__initcall(make_proc_mm); >+ >+/* >+ * 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: >+ */ >--- ./mm/Makefile.skas 2004-06-16 22:27:15.000000000 +0200 >+++ ./mm/Makefile 2004-06-17 16:24:30.000000000 +0200 >@@ -15,3 +15,4 @@ > obj-$(CONFIG_SWAP) += page_io.o swap_state.o swapfile.o > obj-$(CONFIG_HUGETLBFS) += hugetlb.o > obj-$(CONFIG_NUMA) += mempolicy.o >+obj-$(CONFIG_PROC_MM) += proc_mm.o
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 54755
: 33857