summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjdike <jdike>2003-12-16 16:22:07 +0000
committerjdike <jdike>2003-12-16 16:22:07 +0000
commit8ed1642cc3ec81fe2eab4a41f472bb1fdcc6c17a (patch)
treedbfde0e648f145a64889b5be659132e9be8775c4
parent7d462f7850e534d789a6b4d1c1f58d99a95d64a7 (diff)
downloaduml-history-8ed1642cc3ec81fe2eab4a41f472bb1fdcc6c17a.tar.gz
Started adding smp support for skas mode.
-rw-r--r--arch/um/kernel/frame_kern.c5
-rw-r--r--arch/um/kernel/signal_kern.c5
-rw-r--r--arch/um/kernel/skas/include/skas.h4
-rw-r--r--arch/um/kernel/skas/process.c42
-rw-r--r--arch/um/kernel/skas/process_kern.c10
-rw-r--r--arch/um/kernel/skas/sys-i386/sigcontext.c14
-rw-r--r--arch/um/kernel/smp.c14
-rw-r--r--drivers/char/mem.c6
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;
}