Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 83191
b: refs/heads/master
c: 3e6f2ac
h: refs/heads/master
i:
  83189: 4670700
  83187: d569bab
  83183: bd36881
v: v3
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed Feb 5, 2008
1 parent 95a8ef4 commit 2b3c4e9
Show file tree
Hide file tree
Showing 11 changed files with 234 additions and 118 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d25f2e1235aab716c9fd6ba36c42503627a3a0e3
refs/heads/master: 3e6f2ac480ce398ade2fd6b5e02d00d1265f1e0f
1 change: 1 addition & 0 deletions trunk/arch/um/include/kern_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ extern int singlestepping(void *t);
extern void segv_handler(int sig, struct uml_pt_regs *regs);
extern void bus_handler(int sig, struct uml_pt_regs *regs);
extern void winch(int sig, struct uml_pt_regs *regs);
extern void fatal_sigsegv(void) __attribute__ ((noreturn));


#endif
8 changes: 3 additions & 5 deletions trunk/arch/um/include/os.h
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ extern int raw(int fd);
extern void setup_machinename(char *machine_out);
extern void setup_hostinfo(char *buf, int len);
extern int setjmp_wrapper(void (*proc)(void *, void *), ...);
extern void os_dump_core(void);
extern void os_dump_core(void) __attribute__ ((noreturn));

/* time.c */
extern void idle_sleep(unsigned long long nsecs);
Expand Down Expand Up @@ -267,11 +267,9 @@ extern int protect(struct mm_id * mm_idp, unsigned long addr,
extern int is_skas_winch(int pid, int fd, void *data);
extern int start_userspace(unsigned long stub_stack);
extern int copy_context_skas0(unsigned long stack, int pid);
extern void save_registers(int pid, struct uml_pt_regs *regs);
extern void restore_registers(int pid, struct uml_pt_regs *regs);
extern void userspace(struct uml_pt_regs *regs);
extern void map_stub_pages(int fd, unsigned long code,
unsigned long data, unsigned long stack);
extern int map_stub_pages(int fd, unsigned long code, unsigned long data,
unsigned long stack);
extern void new_thread(void *stack, jmp_buf *buf, void (*handler)(void));
extern void switch_threads(jmp_buf *me, jmp_buf *you);
extern int start_idle_thread(void *stack, jmp_buf *switch_buf);
Expand Down
6 changes: 3 additions & 3 deletions trunk/arch/um/include/registers.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ extern int save_fp_registers(int pid, unsigned long *fp_regs);
extern int restore_fp_registers(int pid, unsigned long *fp_regs);
extern int save_fpx_registers(int pid, unsigned long *fp_regs);
extern int restore_fpx_registers(int pid, unsigned long *fp_regs);
extern void save_registers(int pid, struct uml_pt_regs *regs);
extern void restore_registers(int pid, struct uml_pt_regs *regs);
extern void init_registers(int pid);
extern int save_registers(int pid, struct uml_pt_regs *regs);
extern int restore_registers(int pid, struct uml_pt_regs *regs);
extern int init_registers(int pid);
extern void get_safe_registers(unsigned long *regs);
extern unsigned long get_thread_reg(int reg, jmp_buf *buf);

Expand Down
5 changes: 5 additions & 0 deletions trunk/arch/um/kernel/skas/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,11 @@ int init_new_context(struct task_struct *task, struct mm_struct *mm)
to_mm->id.u.pid = copy_context_skas0(stack,
from_mm->id.u.pid);
else to_mm->id.u.pid = start_userspace(stack);

if (to_mm->id.u.pid < 0) {
ret = to_mm->id.u.pid;
goto out_free;
}
}

ret = init_new_ldt(to_mm, from_mm);
Expand Down
20 changes: 16 additions & 4 deletions trunk/arch/um/kernel/skas/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,25 @@
#include "linux/init.h"
#include "linux/sched.h"
#include "as-layout.h"
#include "kern.h"
#include "os.h"
#include "skas.h"

int new_mm(unsigned long stack)
{
int fd;
int fd, err;

fd = os_open_file("/proc/mm", of_cloexec(of_write(OPENFLAGS())), 0);
if (fd < 0)
return fd;

if (skas_needs_stub)
map_stub_pages(fd, STUB_CODE, STUB_DATA, stack);
if (skas_needs_stub) {
err = map_stub_pages(fd, STUB_CODE, STUB_DATA, stack);
if (err) {
os_close_file(fd);
return err;
}
}

return fd;
}
Expand Down Expand Up @@ -49,8 +55,14 @@ int __init start_uml(void)
{
stack_protections((unsigned long) &cpu0_irqstack);
set_sigstack(cpu0_irqstack, THREAD_SIZE);
if (proc_mm)
if (proc_mm) {
userspace_pid[0] = start_userspace(0);
if (userspace_pid[0] < 0) {
printf("start_uml - start_userspace returned %d\n",
userspace_pid[0]);
exit(1);
}
}

init_new_thread_signals();

Expand Down
12 changes: 12 additions & 0 deletions trunk/arch/um/kernel/trap.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,18 @@ static void bad_segv(struct faultinfo fi, unsigned long ip)
force_sig_info(SIGSEGV, &si, current);
}

void fatal_sigsegv(void)
{
force_sigsegv(SIGSEGV, current);
do_signal();
/*
* This is to tell gcc that we're not returning - do_signal
* can, in general, return, but in this case, it's not, since
* we just got a fatal SIGSEGV queued.
*/
os_dump_core();
}

void segv_handler(int sig, struct uml_pt_regs *regs)
{
struct faultinfo * fi = UPT_FAULTINFO(regs);
Expand Down
21 changes: 10 additions & 11 deletions trunk/arch/um/os-Linux/registers.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,42 +8,41 @@
#include <string.h>
#include <sys/ptrace.h>
#include "sysdep/ptrace.h"
#include "user.h"

void save_registers(int pid, struct uml_pt_regs *regs)
int save_registers(int pid, struct uml_pt_regs *regs)
{
int err;

err = ptrace(PTRACE_GETREGS, pid, 0, regs->gp);
if (err < 0)
panic("save_registers - saving registers failed, errno = %d\n",
errno);
return -errno;
return 0;
}

void restore_registers(int pid, struct uml_pt_regs *regs)
int restore_registers(int pid, struct uml_pt_regs *regs)
{
int err;

err = ptrace(PTRACE_SETREGS, pid, 0, regs->gp);
if (err < 0)
panic("restore_registers - saving registers failed, "
"errno = %d\n", errno);
return -errno;
return 0;
}

/* This is set once at boot time and not changed thereafter */

static unsigned long exec_regs[MAX_REG_NR];

void init_registers(int pid)
int init_registers(int pid)
{
int err;

err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs);
if (err)
panic("check_ptrace : PTRACE_GETREGS failed, errno = %d",
errno);
if (err < 0)
return -errno;

arch_init_registers(pid);
return 0;
}

void get_safe_registers(unsigned long *regs)
Expand Down
Loading

0 comments on commit 2b3c4e9

Please sign in to comment.