diff options
author | jdike <jdike> | 2003-12-16 16:22:07 +0000 |
---|---|---|
committer | jdike <jdike> | 2003-12-16 16:22:07 +0000 |
commit | 8ed1642cc3ec81fe2eab4a41f472bb1fdcc6c17a (patch) | |
tree | dbfde0e648f145a64889b5be659132e9be8775c4 | |
parent | 7d462f7850e534d789a6b4d1c1f58d99a95d64a7 (diff) | |
download | uml-history-8ed1642cc3ec81fe2eab4a41f472bb1fdcc6c17a.tar.gz |
Started adding smp support for skas mode.
-rw-r--r-- | arch/um/kernel/frame_kern.c | 5 | ||||
-rw-r--r-- | arch/um/kernel/signal_kern.c | 5 | ||||
-rw-r--r-- | arch/um/kernel/skas/include/skas.h | 4 | ||||
-rw-r--r-- | arch/um/kernel/skas/process.c | 42 | ||||
-rw-r--r-- | arch/um/kernel/skas/process_kern.c | 10 | ||||
-rw-r--r-- | arch/um/kernel/skas/sys-i386/sigcontext.c | 14 | ||||
-rw-r--r-- | arch/um/kernel/smp.c | 14 | ||||
-rw-r--r-- | drivers/char/mem.c | 6 |
8 files changed, 54 insertions, 46 deletions
diff --git a/arch/um/kernel/frame_kern.c b/arch/um/kernel/frame_kern.c index 35837bc..0e8f008 100644 --- a/arch/um/kernel/frame_kern.c +++ b/arch/um/kernel/frame_kern.c @@ -63,12 +63,15 @@ static int copy_restorer(void (*restorer)(void), unsigned long start, sizeof(restorer))); } +extern int userspace_pid[]; + static int copy_sc_to_user(void *to, void *fp, struct pt_regs *from, struct arch_frame_data *arch) { return(CHOOSE_MODE(copy_sc_to_user_tt(to, fp, UPT_SC(&from->regs), arch), - copy_sc_to_user_skas(to, fp, &from->regs, + copy_sc_to_user_skas(userspace_pid[0], to, fp, + &from->regs, current->thread.cr2, current->thread.err))); } diff --git a/arch/um/kernel/signal_kern.c b/arch/um/kernel/signal_kern.c index deff1aa..bf353c3 100644 --- a/arch/um/kernel/signal_kern.c +++ b/arch/um/kernel/signal_kern.c @@ -311,13 +311,16 @@ int sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize) } } +extern int userspace_pid[]; + static int copy_sc_from_user(struct pt_regs *to, void *from, struct arch_frame_data *arch) { int ret; ret = CHOOSE_MODE(copy_sc_from_user_tt(UPT_SC(&to->regs), from, arch), - copy_sc_from_user_skas(&to->regs, from)); + copy_sc_from_user_skas(userspace_pid[0], + &to->regs, from)); return(ret); } diff --git a/arch/um/kernel/skas/include/skas.h b/arch/um/kernel/skas/include/skas.h index d9614f6..0bbc975 100644 --- a/arch/um/kernel/skas/include/skas.h +++ b/arch/um/kernel/skas/include/skas.h @@ -8,7 +8,7 @@ #include "sysdep/ptrace.h" -extern int userspace_pid; +extern int userspace_pid[]; extern void switch_threads(void *me, void *next); extern void thread_wait(void *sw, void *fb); @@ -32,7 +32,7 @@ extern int singlestepping_skas(void); extern int new_mm(int from); extern void save_registers(union uml_pt_regs *regs); extern void restore_registers(union uml_pt_regs *regs); -extern void start_userspace(void); +extern void start_userspace(int cpu); extern void init_registers(int pid); #endif diff --git a/arch/um/kernel/skas/process.c b/arch/um/kernel/skas/process.c index a364467..886862a 100644 --- a/arch/um/kernel/skas/process.c +++ b/arch/um/kernel/skas/process.c @@ -36,6 +36,8 @@ int is_skas_winch(int pid, int fd, void *data) return(1); } +/* These are set once at boot time and not changed thereafter */ + unsigned long exec_regs[FRAME_SIZE]; unsigned long exec_fp_regs[HOST_FP_SIZE]; unsigned long exec_fpx_regs[HOST_XFP_SIZE]; @@ -92,9 +94,11 @@ static int userspace_tramp(void *arg) return(0); } -int userspace_pid; +/* Each element set once, and only accessed by a single processor anyway */ +#define NR_CPUS 1 +int userspace_pid[NR_CPUS]; -void start_userspace(void) +void start_userspace(int cpu) { void *stack; unsigned long sp; @@ -125,21 +129,21 @@ void start_userspace(void) if(munmap(stack, PAGE_SIZE) < 0) panic("start_userspace : munmap failed, errno = %d\n", errno); - userspace_pid = pid; + userspace_pid[cpu] = pid; } void userspace(union uml_pt_regs *regs) { - int err, status, op; + int err, status, op, pid = userspace_pid[0]; restore_registers(regs); - err = ptrace(PTRACE_SYSCALL, userspace_pid, 0, 0); + err = ptrace(PTRACE_SYSCALL, pid, 0, 0); if(err) panic("userspace - PTRACE_SYSCALL failed, errno = %d\n", errno); while(1){ - err = waitpid(userspace_pid, &status, WUNTRACED); + err = waitpid(pid, &status, WUNTRACED); if(err < 0) panic("userspace - waitpid failed, errno = %d\n", errno); @@ -150,10 +154,10 @@ void userspace(union uml_pt_regs *regs) if(WIFSTOPPED(status)){ switch(WSTOPSIG(status)){ case SIGSEGV: - handle_segv(userspace_pid); + handle_segv(pid); break; case SIGTRAP: - handle_trap(userspace_pid, regs); + handle_trap(pid, regs); break; case SIGIO: case SIGVTALRM: @@ -174,7 +178,7 @@ void userspace(union uml_pt_regs *regs) op = singlestepping_skas() ? PTRACE_SINGLESTEP : PTRACE_SYSCALL; - err = ptrace(op, userspace_pid, 0, 0); + err = ptrace(op, pid, 0, 0); if(err) panic("userspace - PTRACE_SYSCALL failed, " "errno = %d\n", errno); @@ -205,12 +209,12 @@ void thread_wait(void *sw, void *fb) siglongjmp(*fork_buf, 1); } -static int move_registers(int int_op, int fp_op, union uml_pt_regs *regs, - unsigned long *fp_regs) +static int move_registers(int pid, int int_op, int fp_op, + union uml_pt_regs *regs, unsigned long *fp_regs) { - if(ptrace(int_op, userspace_pid, 0, regs->skas.regs) < 0) + if(ptrace(int_op, pid, 0, regs->skas.regs) < 0) return(-errno); - if(ptrace(fp_op, userspace_pid, 0, fp_regs) < 0) + if(ptrace(fp_op, pid, 0, fp_regs) < 0) return(-errno); return(0); } @@ -229,7 +233,8 @@ void save_registers(union uml_pt_regs *regs) fp_regs = regs->skas.fp; } - err = move_registers(PTRACE_GETREGS, fp_op, regs, fp_regs); + err = move_registers(userspace_pid[0], PTRACE_GETREGS, fp_op, regs, + fp_regs); if(err) panic("save_registers - saving registers failed, errno = %d\n", -err); @@ -249,7 +254,8 @@ void restore_registers(union uml_pt_regs *regs) fp_regs = regs->skas.fp; } - err = move_registers(PTRACE_SETREGS, fp_op, regs, fp_regs); + err = move_registers(userspace_pid[0], PTRACE_SETREGS, fp_op, regs, + fp_regs); if(err) panic("restore_registers - saving registers failed, " "errno = %d\n", -err); @@ -363,7 +369,8 @@ void switch_mm_skas(int mm_fd) { int err; - err = ptrace(PTRACE_SWITCH_MM, userspace_pid, 0, mm_fd); +#warning need cpu pid in switch_mm_skas + err = ptrace(PTRACE_SWITCH_MM, userspace_pid[0], 0, mm_fd); if(err) panic("switch_mm_skas - PTRACE_SWITCH_MM failed, errno = %d\n", errno); @@ -371,7 +378,8 @@ void switch_mm_skas(int mm_fd) void kill_off_processes_skas(void) { - os_kill_process(userspace_pid, 1); +#warning need to loop over userspace_pids in kill_off_processes_skas + os_kill_process(userspace_pid[0], 1); } void init_registers(int pid) diff --git a/arch/um/kernel/skas/process_kern.c b/arch/um/kernel/skas/process_kern.c index cd62264..54eefa3 100644 --- a/arch/um/kernel/skas/process_kern.c +++ b/arch/um/kernel/skas/process_kern.c @@ -159,11 +159,11 @@ static int start_kernel_proc(void *unused) int start_uml_skas(void) { - start_userspace(); + start_userspace(0); capture_signal_stack(); + idle_timer(); init_new_thread_signals(1); - idle_timer(); init_task.thread.request.u.thread.proc = start_kernel_proc; init_task.thread.request.u.thread.arg = NULL; @@ -174,12 +174,14 @@ int start_uml_skas(void) int external_pid_skas(struct task_struct *task) { - return(userspace_pid); +#warning Need to look up userspace_pid by cpu + return(userspace_pid[0]); } int thread_pid_skas(struct thread_struct *thread) { - return(userspace_pid); +#warning Need to look up userspace_pid by cpu + return(userspace_pid[0]); } /* diff --git a/arch/um/kernel/skas/sys-i386/sigcontext.c b/arch/um/kernel/skas/sys-i386/sigcontext.c index 3b4296b..895d34c 100644 --- a/arch/um/kernel/skas/sys-i386/sigcontext.c +++ b/arch/um/kernel/skas/sys-i386/sigcontext.c @@ -12,10 +12,9 @@ #include "kern_util.h" #include "user.h" #include "sigcontext.h" +#include "mode.h" -extern int userspace_pid; - -int copy_sc_from_user_skas(union uml_pt_regs *regs, void *from_ptr) +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]; @@ -46,7 +45,7 @@ int copy_sc_from_user_skas(union uml_pt_regs *regs, void *from_ptr) regs->skas.fault_type = FAULT_WRITE(sc.err); regs->skas.trap_type = sc.trapno; - err = ptrace(PTRACE_SETFPREGS, userspace_pid, 0, fpregs); + err = ptrace(PTRACE_SETFPREGS, pid, 0, fpregs); if(err < 0){ printk("copy_sc_to_user - PTRACE_SETFPREGS failed, " "errno = %d\n", errno); @@ -56,8 +55,9 @@ int copy_sc_from_user_skas(union uml_pt_regs *regs, void *from_ptr) return(0); } -int copy_sc_to_user_skas(void *to_ptr, void *fp, union uml_pt_regs *regs, - unsigned long fault_addr, int fault_type) +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; @@ -85,7 +85,7 @@ int copy_sc_to_user_skas(void *to_ptr, void *fp, union uml_pt_regs *regs, sc.err = TO_SC_ERR(fault_type); sc.trapno = regs->skas.trap_type; - err = ptrace(PTRACE_GETFPREGS, userspace_pid, 0, fpregs); + err = ptrace(PTRACE_GETFPREGS, pid, 0, fpregs); if(err < 0){ printk("copy_sc_to_user - PTRACE_GETFPREGS failed, " "errno = %d\n", errno); diff --git a/arch/um/kernel/smp.c b/arch/um/kernel/smp.c index 6a95394..b3eaaaa 100644 --- a/arch/um/kernel/smp.c +++ b/arch/um/kernel/smp.c @@ -1,11 +1,10 @@ /* - * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) + * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) * Licensed under the GPL */ #include "linux/config.h" - #ifdef CONFIG_SMP #include "linux/sched.h" @@ -16,6 +15,7 @@ #include "asm/spinlock.h" #include "asm/softirq.h" #include "asm/hardirq.h" +#include "asm/tlb.h" #include "user_util.h" #include "kern_util.h" #include "irq_user.h" @@ -50,6 +50,8 @@ unsigned volatile long global_irq_lock; /* A statistic, can be a little off */ static int num_reschedules_sent = 0; +mmu_gather_t mmu_gathers[NR_CPUS]; + void smp_send_reschedule(int cpu) { os_write_file(cpu_data[cpu].ipi_pipe[1], "R", 1); @@ -118,7 +120,6 @@ void smp_commence(void) static int idle_proc(void *unused) { -#ifndef CONFIG_MODE_SKAS int cpu, err; set_current(current); @@ -144,13 +145,11 @@ static int idle_proc(void *unused) init_idle(); cpu_idle(); -#endif return(0); } static int idle_thread(int (*fn)(void *), int cpu) { -#ifndef CONFIG_MODE_SKAS struct task_struct *new_task; int pid; unsigned char c; @@ -173,14 +172,10 @@ static int idle_thread(int (*fn)(void *), int cpu) sizeof(c)), ({ panic("skas mode doesn't support SMP"); })); return(new_task->thread.mode.tt.extern_pid); -#else - panic("idle_thread called with skas mode enabled"); -#endif } void smp_boot_cpus(void) { -#ifndef CONFIG_MODE_SKAS int err; set_bit(0, &cpu_online_map); @@ -232,7 +227,6 @@ void smp_boot_cpus(void) } } } -#endif } int setup_profiling_timer(unsigned int multiplier) diff --git a/drivers/char/mem.c b/drivers/char/mem.c index 2d5d81f..79d63d4 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c @@ -209,8 +209,6 @@ static int mmap_mem(struct file * file, struct vm_area_struct * vma) return 0; } -extern unsigned long uml_physmem; - /* * This function reads the *virtual* memory as seen by the kernel. */ @@ -222,7 +220,7 @@ static ssize_t read_kmem(struct file *file, char *buf, ssize_t virtr = 0; char * kbuf; /* k-addr because vread() takes vmlist_lock rwlock */ - p += uml_physmem; + p = (unsigned long) __va(p); if (p < (unsigned long) high_memory) { read = count; if (count > (unsigned long) high_memory - p) @@ -271,7 +269,7 @@ static ssize_t read_kmem(struct file *file, char *buf, } free_page((unsigned long)kbuf); } - *ppos = p - uml_physmem; + *ppos = __pa((void *) p); return virtr + read; } |