diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2006-02-09 04:28:13 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2006-02-09 04:28:13 -0500 |
commit | 99b3738fbf17208ac474420fa6b7e4b0c0c2b9ed (patch) | |
tree | 6f977546112ccbd617ef40ae38a1ca558d71bce9 /arch/um/os-Linux | |
parent | 332b5a52f2f96bc2d13bbe594a430318c0ee4425 (diff) | |
parent | 8a19ac89edbe9b702c10fd2039b8cb2db4644a5f (diff) |
Merge branch 'upstream'
Diffstat (limited to 'arch/um/os-Linux')
-rw-r--r-- | arch/um/os-Linux/drivers/tuntap_user.c | 4 | ||||
-rw-r--r-- | arch/um/os-Linux/skas/mem.c | 2 | ||||
-rw-r--r-- | arch/um/os-Linux/skas/process.c | 21 | ||||
-rw-r--r-- | arch/um/os-Linux/start_up.c | 1 | ||||
-rw-r--r-- | arch/um/os-Linux/sys-i386/registers.c | 5 | ||||
-rw-r--r-- | arch/um/os-Linux/sys-x86_64/registers.c | 5 |
6 files changed, 27 insertions, 11 deletions
diff --git a/arch/um/os-Linux/drivers/tuntap_user.c b/arch/um/os-Linux/drivers/tuntap_user.c index 52945338b64d..87c3aa0252db 100644 --- a/arch/um/os-Linux/drivers/tuntap_user.c +++ b/arch/um/os-Linux/drivers/tuntap_user.c | |||
@@ -122,6 +122,7 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote, | |||
122 | return(-EINVAL); | 122 | return(-EINVAL); |
123 | } | 123 | } |
124 | *fd_out = ((int *) CMSG_DATA(cmsg))[0]; | 124 | *fd_out = ((int *) CMSG_DATA(cmsg))[0]; |
125 | os_set_exec_close(*fd_out, 1); | ||
125 | return(0); | 126 | return(0); |
126 | } | 127 | } |
127 | 128 | ||
@@ -137,7 +138,8 @@ static int tuntap_open(void *data) | |||
137 | return(err); | 138 | return(err); |
138 | 139 | ||
139 | if(pri->fixed_config){ | 140 | if(pri->fixed_config){ |
140 | pri->fd = os_open_file("/dev/net/tun", of_rdwr(OPENFLAGS()), 0); | 141 | pri->fd = os_open_file("/dev/net/tun", |
142 | of_cloexec(of_rdwr(OPENFLAGS())), 0); | ||
141 | if(pri->fd < 0){ | 143 | if(pri->fd < 0){ |
142 | printk("Failed to open /dev/net/tun, err = %d\n", | 144 | printk("Failed to open /dev/net/tun, err = %d\n", |
143 | -pri->fd); | 145 | -pri->fd); |
diff --git a/arch/um/os-Linux/skas/mem.c b/arch/um/os-Linux/skas/mem.c index 9890e9090f58..fbb080c2fc26 100644 --- a/arch/um/os-Linux/skas/mem.c +++ b/arch/um/os-Linux/skas/mem.c | |||
@@ -60,7 +60,7 @@ static inline long do_syscall_stub(struct mm_id * mm_idp, void **addr) | |||
60 | 60 | ||
61 | multi_count++; | 61 | multi_count++; |
62 | 62 | ||
63 | get_safe_registers(regs); | 63 | get_safe_registers(regs, NULL); |
64 | regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE + | 64 | regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE + |
65 | ((unsigned long) &batch_syscall_stub - | 65 | ((unsigned long) &batch_syscall_stub - |
66 | (unsigned long) &__syscall_stub_start); | 66 | (unsigned long) &__syscall_stub_start); |
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index 120a21c5883f..bbf34cb91ce1 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c | |||
@@ -310,16 +310,12 @@ void userspace(union uml_pt_regs *regs) | |||
310 | } | 310 | } |
311 | } | 311 | } |
312 | } | 312 | } |
313 | #define INIT_JMP_NEW_THREAD 0 | ||
314 | #define INIT_JMP_REMOVE_SIGSTACK 1 | ||
315 | #define INIT_JMP_CALLBACK 2 | ||
316 | #define INIT_JMP_HALT 3 | ||
317 | #define INIT_JMP_REBOOT 4 | ||
318 | 313 | ||
319 | int copy_context_skas0(unsigned long new_stack, int pid) | 314 | int copy_context_skas0(unsigned long new_stack, int pid) |
320 | { | 315 | { |
321 | int err; | 316 | int err; |
322 | unsigned long regs[MAX_REG_NR]; | 317 | unsigned long regs[HOST_FRAME_SIZE]; |
318 | unsigned long fp_regs[HOST_FP_SIZE]; | ||
323 | unsigned long current_stack = current_stub_stack(); | 319 | unsigned long current_stack = current_stub_stack(); |
324 | struct stub_data *data = (struct stub_data *) current_stack; | 320 | struct stub_data *data = (struct stub_data *) current_stack; |
325 | struct stub_data *child_data = (struct stub_data *) new_stack; | 321 | struct stub_data *child_data = (struct stub_data *) new_stack; |
@@ -334,7 +330,7 @@ int copy_context_skas0(unsigned long new_stack, int pid) | |||
334 | .timer = ((struct itimerval) | 330 | .timer = ((struct itimerval) |
335 | { { 0, 1000000 / hz() }, | 331 | { { 0, 1000000 / hz() }, |
336 | { 0, 1000000 / hz() }})}); | 332 | { 0, 1000000 / hz() }})}); |
337 | get_safe_registers(regs); | 333 | get_safe_registers(regs, fp_regs); |
338 | 334 | ||
339 | /* Set parent's instruction pointer to start of clone-stub */ | 335 | /* Set parent's instruction pointer to start of clone-stub */ |
340 | regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE + | 336 | regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE + |
@@ -350,6 +346,11 @@ int copy_context_skas0(unsigned long new_stack, int pid) | |||
350 | panic("copy_context_skas0 : PTRACE_SETREGS failed, " | 346 | panic("copy_context_skas0 : PTRACE_SETREGS failed, " |
351 | "pid = %d, errno = %d\n", pid, errno); | 347 | "pid = %d, errno = %d\n", pid, errno); |
352 | 348 | ||
349 | err = ptrace_setfpregs(pid, fp_regs); | ||
350 | if(err < 0) | ||
351 | panic("copy_context_skas0 : PTRACE_SETFPREGS failed, " | ||
352 | "pid = %d, errno = %d\n", pid, errno); | ||
353 | |||
353 | /* set a well known return code for detection of child write failure */ | 354 | /* set a well known return code for detection of child write failure */ |
354 | child_data->err = 12345678; | 355 | child_data->err = 12345678; |
355 | 356 | ||
@@ -457,6 +458,12 @@ void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, | |||
457 | set_signals(flags); | 458 | set_signals(flags); |
458 | } | 459 | } |
459 | 460 | ||
461 | #define INIT_JMP_NEW_THREAD 0 | ||
462 | #define INIT_JMP_REMOVE_SIGSTACK 1 | ||
463 | #define INIT_JMP_CALLBACK 2 | ||
464 | #define INIT_JMP_HALT 3 | ||
465 | #define INIT_JMP_REBOOT 4 | ||
466 | |||
460 | void thread_wait(void *sw, void *fb) | 467 | void thread_wait(void *sw, void *fb) |
461 | { | 468 | { |
462 | sigjmp_buf buf, **switch_buf = sw, *fork_buf; | 469 | sigjmp_buf buf, **switch_buf = sw, *fork_buf; |
diff --git a/arch/um/os-Linux/start_up.c b/arch/um/os-Linux/start_up.c index 6c5b17ed59e1..829d6b0d8b02 100644 --- a/arch/um/os-Linux/start_up.c +++ b/arch/um/os-Linux/start_up.c | |||
@@ -49,6 +49,7 @@ static int ptrace_child(void *arg) | |||
49 | int pid = os_getpid(), ppid = getppid(); | 49 | int pid = os_getpid(), ppid = getppid(); |
50 | int sc_result; | 50 | int sc_result; |
51 | 51 | ||
52 | change_sig(SIGWINCH, 0); | ||
52 | if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){ | 53 | if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){ |
53 | perror("ptrace"); | 54 | perror("ptrace"); |
54 | os_kill_process(pid, 0); | 55 | os_kill_process(pid, 0); |
diff --git a/arch/um/os-Linux/sys-i386/registers.c b/arch/um/os-Linux/sys-i386/registers.c index aee4812333c6..7a6f6b99ceff 100644 --- a/arch/um/os-Linux/sys-i386/registers.c +++ b/arch/um/os-Linux/sys-i386/registers.c | |||
@@ -122,9 +122,12 @@ void init_registers(int pid) | |||
122 | err); | 122 | err); |
123 | } | 123 | } |
124 | 124 | ||
125 | void get_safe_registers(unsigned long *regs) | 125 | void get_safe_registers(unsigned long *regs, unsigned long *fp_regs) |
126 | { | 126 | { |
127 | memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long)); | 127 | memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long)); |
128 | if(fp_regs != NULL) | ||
129 | memcpy(fp_regs, exec_fp_regs, | ||
130 | HOST_FP_SIZE * sizeof(unsigned long)); | ||
128 | } | 131 | } |
129 | 132 | ||
130 | void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer) | 133 | void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer) |
diff --git a/arch/um/os-Linux/sys-x86_64/registers.c b/arch/um/os-Linux/sys-x86_64/registers.c index 4b638dfb52b0..001941fa1a1e 100644 --- a/arch/um/os-Linux/sys-x86_64/registers.c +++ b/arch/um/os-Linux/sys-x86_64/registers.c | |||
@@ -70,9 +70,12 @@ void init_registers(int pid) | |||
70 | err); | 70 | err); |
71 | } | 71 | } |
72 | 72 | ||
73 | void get_safe_registers(unsigned long *regs) | 73 | void get_safe_registers(unsigned long *regs, unsigned long *fp_regs) |
74 | { | 74 | { |
75 | memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long)); | 75 | memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long)); |
76 | if(fp_regs != NULL) | ||
77 | memcpy(fp_regs, exec_fp_regs, | ||
78 | HOST_FP_SIZE * sizeof(unsigned long)); | ||
76 | } | 79 | } |
77 | 80 | ||
78 | void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer) | 81 | void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer) |