SKAS4 - Host get_mm and switch_mm
Subsystems (8)
RFC PATCH 7/11 SKAS4 - Host get_mm and switch_mm
This is the new_mm, switch_mm, and /proc/<pid>/mm implementation for 32- and 64-bit x86 and UML, plus 32-bit support on 64-bit x86.
arch/um/include/skas_ptrace.h +3 -1
@@ -7,7 +7,9 @@#define __SKAS_PTRACE_H#define PTRACE_FAULTINFO 52 -#define PTRACE_SWITCH_MM 55 +#ifndef OLD_PTRACE_SWITCH_MM +#define OLD_PTRACE_SWITCH_MM 55 +#endif #include "sysdep/skas_ptrace.h"
arch/um/kernel/ptrace.c +12 -1
@@ -192,7 +192,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) }#endif #ifdef CONFIG_PROC_MM -case PTRACE_SWITCH_MM : { +case OLD_PTRACE_SWITCH_MM : {struct mm_struct *old = child->mm;struct mm_struct *new =proc_mm_get_mm (data);
@@ -292,3 +292,14 @@ void syscall_trace(struct uml_pt_regs *regs, int entryexit) current->exit_code =0 ; } } + +int ptrace_to_pt_regs (struct pt_regs *to,struct user_regs __user *from) +{ +memcpy (to, &from->regs,sizeof (from->regs)); +return 0 ; +} + +int pt_regs_to_ptrace (struct user_regs __user *to,struct pt_regs *from) +{ +return copy_to_user (&to->regs, &from->regs.gp,sizeof (from->regs.gp)); +}
arch/um/kernel/syscall.c +10 -0
@@ -151,3 +151,13 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[])return ret; } + +extern long do_switch_mm (int fd,long __user *save,long __user *new, +unsigned long ip,unsigned long sp, +struct pt_regs *regs); + +long sys_switch_mm (int fd,long __user *save,long __user *new, +unsigned long ip,unsigned long sp) +{ +return do_switch_mm (fd, save, new, ip, sp, ¤t->thread.regs); +}
arch/um/os-Linux/skas/process.c +1 -1
@@ -627,7 +627,7 @@ void __switch_mm(struct mm_id *mm_idp)/* FIXME: need cpu pid in __switch_mm */ if (proc_mm) { - err =ptrace (PTRACE_SWITCH_MM , userspace_pid[0 ],0 , + err =ptrace (OLD_PTRACE_SWITCH_MM , userspace_pid[0 ],0 , mm_idp->u.mm_fd);if (err) panic("__switch_mm - PTRACE_SWITCH_MM failed, "
arch/um/sys-x86_64/syscall_table.c +1 -0
@@ -33,6 +33,7 @@#define stub_rt_sigsuspend sys_rt_sigsuspend#define stub_sigaltstack sys_sigaltstack#define stub_rt_sigreturn sys_rt_sigreturn +#define stub_switch_mm sys_switch_mm#define __SYSCALL (nr, sym) extern asmlinkage void sym(void) ;#undef _ASM_X86_64_UNISTD_H_
arch/x86/ia32/ia32entry.S +3 -0
@@ -374,6 +374,7 @@ quiet_ni_syscall: PTREGSCALL stub32_vfork, sys_vfork, %rdi PTREGSCALL stub32_iopl, sys_iopl, %rsi PTREGSCALL stub32_rt_sigsuspend, sys_rt_sigsuspend, %rdx + PTREGSCALL stub32_switch_mm, sys_switch_mm, %r9 ENTRY(ia32_ptregs_common) popq %r11
@@ -726,4 +727,6 @@ ia32_sys_call_table: .quad compat_sys_timerfd .quad sys_eventfd .quad sys32_fallocate + .quad sys_new_mm /* 325 */ + .quad stub32_switch_mm ia32_syscall_end:
arch/x86/ia32/ptrace32.c +3 -2
@@ -38,7 +38,7 @@#define R32 (l,q) \ case offsetof(struct user32, regs.l): stack[offsetof(struct pt_regs, q)/8] = val; break -static int putreg32 (struct task_struct *child,unsigned regno,u32 val) +int putreg32 (struct task_struct *child,unsigned regno,u32 val) {int i;__u64 *stack = (__u64 *)task_pt_regs (child);
@@ -139,7 +139,7 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)#define R32 (l,q) \ case offsetof(struct user32, regs.l): *val = stack[offsetof(struct pt_regs, q)/8]; break -static int getreg32 (struct task_struct *child,unsigned regno,u32 *val) +int getreg32 (struct task_struct *child,unsigned regno,u32 *val) {__u64 *stack = (__u64 *)task_pt_regs (child);
@@ -248,6 +248,7 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)case PTRACE_SETOPTIONS :case PTRACE_SET_THREAD_AREA :case PTRACE_GET_THREAD_AREA : +case PTRACE_SWITCH_MM :return sys_ptrace (request, pid, addr, data);default :
arch/x86/kernel/entry_64.S +1 -0
@@ -412,6 +412,7 @@ END(\label) PTREGSCALL stub_rt_sigsuspend, sys_rt_sigsuspend, %rdx PTREGSCALL stub_sigaltstack, sys_sigaltstack, %rdx PTREGSCALL stub_iopl, sys_iopl, %rsi + PTREGSCALL stub_switch_mm, sys_switch_mm, %r9 ENTRY(ptregscall_common) popq %r11
arch/x86/kernel/ptrace_32.c +37 -4
56 lines not on this page · raw message
arch/x86/kernel/ptrace_64.c +90 -3
108 lines not on this page · raw message
arch/x86/kernel/sys_i386_32.c +11 -0
@@ -261,3 +261,14 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[]) : "0" (__NR_execve),"ri" (filename),"c" (argv), "d" (envp) : "memory");return __res; } + +extern long do_switch_mm (int fd,struct __user user_regs *save, +struct __user user_regs *new,unsigned long ip, +unsigned long sp,struct pt_regs *regs); + +asmlinkage long sys_switch_mm (struct pt_regs regs) +{ +return do_switch_mm (regs.ebx, (struct __user user_regs *) regs.ecx, + (struct __user user_regs *) regs.edx, regs.esi, + regs.edi, ®s); +}
arch/x86/kernel/sys_x86_64.c +11 -0
@@ -153,3 +153,14 @@ asmlinkage long sys_uname(struct new_utsname __user * name) err |=copy_to_user (&name->machine,"i686" ,5 );return err ? -EFAULT :0 ; } + +extern long do_switch_mm (int fd,struct __user user_regs *save, +struct __user user_regs *new,unsigned long ip, +unsigned long sp,struct pt_regs *regs); + +asmlinkage long sys_switch_mm (int fd,struct __user user_regs *save, +struct __user user_regs *new,unsigned long ip, +unsigned long sp,struct pt_regs *regs) +{ +return do_switch_mm (fd, save, new, ip, sp, regs); +}
arch/x86/kernel/syscall_table_32.S +2 -0
@@ -324,3 +324,5 @@ ENTRY(sys_call_table) .long sys_timerfd .long sys_eventfd .long sys_fallocate + .long sys_new_mm + .long sys_switch_mm
fs/proc/base.c +29 -0
@@ -2187,6 +2187,34 @@ static int proc_pid_io_accounting(struct task_struct *task, char *buffer) }#endif +static int proc_pid_mm_open (struct inode *inode,struct file *file) +{ +struct task_struct *task =pid_task (proc_pid (inode),PIDTYPE_PID ); + +if (task ==NULL ) +return -ENOENT ; + +if (task->mm !=NULL ) +atomic_inc (&task->mm->mm_users); + file->private_data = task->mm; +return 0 ; +} + +static int proc_pid_mm_release (struct inode *inode,struct file *file) +{ +struct mm_struct *mm = file->private_data; + +if (mm !=NULL ) +mmput (mm); + +return 0 ; +} + +const struct file_operations proc_pid_mm_operations = { + .open = proc_pid_mm_open, + .release = proc_pid_mm_release, +}; +/* * Thread groups */
@@ -2250,6 +2278,7 @@ static const struct pid_entry tgid_base_stuff[] = {#ifdef CONFIG_TASK_IO_ACCOUNTING INF ("io" ,S_IRUGO , pid_io_accounting), #endif + REG("mm", S_IRUSR | S_IWUSR, pid_mm), }; static int proc_tgid_base_readdir(struct file * filp,
include/asm-um/ptrace-generic.h +8 -0
@@ -34,6 +34,14 @@ struct pt_regs {#define instruction_pointer (regs) PT_REGS_IP(regs) +struct user_regs { +unsigned long regs[MAX_REG_NR ]; +}; + +extern int copyin_user_regs (struct user_regs *to,unsigned long __user *from); +extern int ptrace_to_pt_regs (struct pt_regs *to,struct user_regs __user *from); +extern int pt_regs_to_ptrace (struct user_regs __user *to,struct pt_regs *from); +struct task_struct ; extern long subarch_ptrace(struct task_struct *child, long request, long addr,
include/asm-um/ptrace-i386.h +6 -0
@@ -40,6 +40,12 @@#define user_mode (r) UPT_IS_USER(&(r)->regs) +#define pt_regs_ip (r) (r).regs.gp[EIP] +#define pt_regs_sp (r) (r).regs.gp[UESP] + +#define ptrace_ip (r) (r)->regs[EIP] +#define ptrace_sp (r) (r)->regs[UESP] +/* * Forward declaration to avoid including sysdep/tls.h, which causes a * circular include, and compilation failures.
include/asm-um/ptrace-x86_64.h +6 -0
@@ -62,6 +62,12 @@#define PT_FIX_EXEC_STACK (sp) do ; while(0) +#define pt_regs_ip (r) (r).regs.gp[RIP / sizeof(long)] +#define pt_regs_sp (r) (r).regs.gp[RSP / sizeof(long)] + +#define ptrace_ip (r) (r)->regs[RIP / sizeof(long)] +#define ptrace_sp (r) (r)->regs[RSP / sizeof(long)] +#define profile_pc (regs) PT_REGS_IP(regs) static inline int ptrace_get_thread_area(struct task_struct *child, int idx,
include/asm-x86/ptrace.h +49 -0
67 lines not on this page · raw message
include/asm-x86/unistd_32.h +2 -0
@@ -330,6 +330,8 @@#define __NR_timerfd 322#define __NR_eventfd 323#define __NR_fallocate 324 +#define __NR_new_mm 325 +#define __NR_switch_mm 326#ifdef __KERNEL__
include/asm-x86/unistd_64.h +4 -0
@@ -635,6 +635,10 @@ __SYSCALL(__NR_timerfd, sys_timerfd) __SYSCALL(__NR_eventfd, sys_eventfd)#define __NR_fallocate 285 __SYSCALL(__NR_fallocate, sys_fallocate) +#define __NR_new_mm 286 +__SYSCALL(__NR_new_mm, sys_new_mm) +#define __NR_switch_mm 287 +__SYSCALL(__NR_switch_mm, stub_switch_mm)#ifndef __NO_STUBS#define __ARCH_WANT_OLD_READDIR
include/linux/ptrace.h +2 -0
@@ -21,6 +21,8 @@#define PTRACE_SYSCALL 24 +#define PTRACE_SWITCH_MM 33 +/* 0x4200-0x4300 are reserved for architecture-independent additions. */ #define PTRACE_SETOPTIONS 0x4200#define PTRACE_GETEVENTMSG 0x4201
include/linux/sched.h +1 -0
@@ -1652,6 +1652,7 @@ static inline int sas_ss_flags(unsigned long sp)* Routines for handling mm_structs */ extern struct mm_struct *mm_alloc (void ); +extern struct mm_struct *dup_mm (struct task_struct *tsk);/* mmdrop drops the mm and the page tables */ extern void FASTCALL (__mmdrop (struct mm_struct *));
kernel/fork.c +1 -1
@@ -491,7 +491,7 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)* Allocate a new mm structure and copy contents from the * mm structure of the passed in task structure. */ -static struct mm_struct *dup_mm (struct task_struct *tsk) +struct mm_struct *dup_mm (struct task_struct *tsk) {struct mm_struct *mm, *oldmm = current->mm;int err;
kernel/ptrace.c +5 -0
@@ -366,6 +366,8 @@ static int ptrace_setsiginfo(struct task_struct *child, siginfo_t __user * data)return error; } +extern int do_switch (struct task_struct *task,int fd); +int ptrace_request (struct task_struct *child,long request,long addr,long data) {
@@ -390,6 +392,9 @@ int ptrace_request(struct task_struct *child, long request,case PTRACE_DETACH :/* detach a process that was attached. */ ret =ptrace_detach (child, data);break ; +case PTRACE_SWITCH_MM : + ret =do_switch (child, data); +break ;default :break ; }
mm/Makefile +2 -2
@@ -4,8 +4,8 @@ mmu-y := nommu.o mmu-$(CONFIG_MMU) := fremap.o highmem.o madvise.o memory.o mincore.o \ - mlock.o mmap.o mprotect.o mremap.o msync.o rmap.o \ - vmalloc.o + mlock.o mmap.o mmfs.o mprotect.o mremap.o msync.o \ + rmap.o vmalloc.o obj-y := bootmem.o filemap.o mempool.o oom_kill.o fadvise.o \ page_alloc.o page-writeback.o pdflush.o \
mm/mmfs.c new file +210 -0
210 lines not on this page · raw message
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel