SKAS4 - Guest get_mm and switch_mm support
RFC PATCH 10/10 SKAS4 - Guest get_mm and switch_mm support
arch/um/include/as-layout.h +2 -0
@@ -17,6 +17,7 @@#define ASM_STUB_CODE (UML_CONFIG_TOP_ADDR - 2 * UM_KERN_PAGE_SIZE)#define ASM_STUB_DATA (UML_CONFIG_TOP_ADDR - UM_KERN_PAGE_SIZE)#define ASM_STUB_START ASM_STUB_CODE +#define ASM_STUB_END UML_CONFIG_TOP_ADDR/* * This file is included by the assembly stubs, which just want the
@@ -27,6 +28,7 @@#define STUB_CODE ((unsigned long) ASM_STUB_CODE)#define STUB_DATA ((unsigned long) ASM_STUB_DATA)#define STUB_START ((unsigned long) ASM_STUB_START) +#define STUB_END ((unsigned long) ASM_STUB_END)#include "sysdep/ptrace.h"
arch/um/include/skas/mm_id.h +1 -1
@@ -7,7 +7,7 @@#define __MM_ID_Hstruct mm_id { -union { +struct {int mm_fd;int pid; } u;
arch/um/include/skas/skas.h +44 -2
62 lines not on this page · raw message
arch/um/kernel/reboot.c +1 -1
@@ -11,7 +11,7 @@ void (*pm_power_off)(void);static void kill_off_processes (void ) { -if (proc_mm) +if (proc_mm || have_switch_mm)/* * FIXME: need to loop over userspace_pids */
arch/um/kernel/skas/mmu.c +23 -2
@@ -65,6 +65,9 @@ static int init_stub_pte(struct mm_struct *mm, unsigned long proc,return -ENOMEM ; } +extern int copy_context_skas4 (struct mm_id *id); +extern int get_new_mm (void ); +int init_new_context (struct task_struct *task,struct mm_struct *mm) {struct mm_context *from_mm =NULL ;
@@ -109,6 +112,20 @@ int init_new_context(struct task_struct *task, struct mm_struct *mm) } to_mm->id.u.mm_fd = ret; } +else if (have_switch_mm) { + to_mm->id.u.mm_fd =get_new_mm (); +if (to_mm->id.u.mm_fd <0 ) { + ret = to_mm->id.u.mm_fd; + goto out_free; + } + + ret =copy_context_skas4 (&to_mm->id); +if (ret <0 ) { +os_close_file (to_mm->id.u.mm_fd); + to_mm->id.u.mm_fd =-1 ; + goto out_free; + } + }else {if (from_mm) to_mm->id.u.pid = copy_context_skas0(stack,
@@ -136,11 +153,15 @@ void destroy_context(struct mm_struct *mm) {struct mm_context *mmu = &mm->context; -if (proc_mm) +if (proc_mm || have_switch_mm)os_close_file (mmu->id.u.mm_fd); -else +else {os_kill_ptraced_process (mmu->id.u.pid,1 ); +if (have_switch_mm) +os_close_file (mmu->id.u.mm_fd); + } +if (!proc_mm || !ptrace_faultinfo) {free_page (mmu->id.stack);pte_lock_deinit (virt_to_page (mmu->last_page_table));
arch/um/kernel/skas/process.c +1 -1
@@ -49,7 +49,7 @@ int __init start_uml(void) {stack_protections ((unsigned long ) &cpu0_irqstack);set_sigstack (cpu0_irqstack,THREAD_SIZE ); -if (proc_mm) +if (proc_mm || have_switch_mm) userspace_pid[0 ] =start_userspace (0 );init_new_thread_signals ();
arch/um/kernel/um_arch.c +3 -1
@@ -271,7 +271,9 @@ int __init linux_main(int argc, char **argv)can_do_skas (); -if (proc_mm && ptrace_faultinfo) +if (have_switch_mm) + mode ="SKAS4" ; +else if (proc_mm && ptrace_faultinfo) mode ="SKAS3" ;else mode ="SKAS0" ;
arch/um/os-Linux/skas/mem.c +45 -5
89 lines not on this page · raw message
arch/um/os-Linux/skas/process.c +80 -4
116 lines not on this page · raw message
arch/um/os-Linux/start_up.c +214 -7
251 lines not on this page · raw message
arch/um/sys-i386/stub.S +16 -0
@@ -1,5 +1,8 @@ #include "uml-config.h" #include "as-layout.h" +#include "skas/skas.h" + +#define MAX_REG_NR 17 #define PROCESS_LIST \ /* load pointer to first operation */ \
@@ -43,3 +46,16 @@ batch_syscall_stub: PROCESS_LIST /* stop */ int3 + + .globl switch_mm_stub +switch_mm_stub: + PROCESS_LIST + + mov $__NR_switch_mm, %eax + mov ASM_STUB_DATA + UM_KERN_PAGE_SIZE - MAX_REG_NR * 4 - 4, %ebx + mov $MM_ALL_REGS, %ecx + mov $(ASM_STUB_DATA + UM_KERN_PAGE_SIZE - MAX_REG_NR * 4), %edx + xor %esi, %esi + int $0x80 + + int3
arch/um/sys-x86_64/stub.S +21 -0
@@ -1,5 +1,8 @@ #include "uml-config.h" #include "as-layout.h" +#include "skas/skas.h" + +#define MAX_REG_NR 27 #define PROCESS_LIST \ mov $(ASM_STUB_DATA >> 32), %rbx; \
@@ -46,3 +49,21 @@ batch_syscall_stub: PROCESS_LIST /* stop */ int3 + + .globl switch_mm_stub +switch_mm_stub: + PROCESS_LIST + + mov $__NR_switch_mm, %rax + mov $(ASM_STUB_DATA >> 32), %rdi + sal $32, %rdi + mov $(ASM_STUB_DATA & 0xffffffff), %rsi + add %rsi, %rdi + add $(UM_KERN_PAGE_SIZE - MAX_REG_NR * 8 - 8), %rdi + mov (%rdi), %rdi + mov $MM_ALL_REGS, %rsi + mov $(ASM_STUB_DATA + UM_KERN_PAGE_SIZE - MAX_REG_NR * 8), %rdx + xor %r10, %r10 + syscall + + int3
arch/um/sys-x86_64/syscalls.c +1 -1
@@ -30,7 +30,7 @@ long arch_prctl(struct task_struct *task, int code, unsigned long __user *addr) {unsigned long *ptr = addr, tmp;long ret; -int pid = task->mm->context.id.u.pid; +int pid = userspace_pid[0 ];/* * With ARCH_SET_FS (and ARCH_SET_GS is treated similarly to
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
User-mode-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel