diff options
Diffstat (limited to 'arch/um/os-Linux')
-rw-r--r-- | arch/um/os-Linux/file.c | 2 | ||||
-rw-r--r-- | arch/um/os-Linux/irq.c | 47 | ||||
-rw-r--r-- | arch/um/os-Linux/main.c | 30 | ||||
-rw-r--r-- | arch/um/os-Linux/process.c | 17 | ||||
-rw-r--r-- | arch/um/os-Linux/skas/process.c | 6 | ||||
-rw-r--r-- | arch/um/os-Linux/sys-i386/registers.c | 4 | ||||
-rw-r--r-- | arch/um/os-Linux/sys-x86_64/registers.c | 4 | ||||
-rw-r--r-- | arch/um/os-Linux/umid.c | 4 | ||||
-rw-r--r-- | arch/um/os-Linux/user_syms.c | 7 |
9 files changed, 81 insertions, 40 deletions
diff --git a/arch/um/os-Linux/file.c b/arch/um/os-Linux/file.c index 3bd10deea280..09251338d99e 100644 --- a/arch/um/os-Linux/file.c +++ b/arch/um/os-Linux/file.c | |||
@@ -171,7 +171,7 @@ int os_sigio_async(int master, int slave) | |||
171 | 171 | ||
172 | flags = fcntl(master, F_GETFL); | 172 | flags = fcntl(master, F_GETFL); |
173 | if(flags < 0) | 173 | if(flags < 0) |
174 | return errno; | 174 | return -errno; |
175 | 175 | ||
176 | if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) || | 176 | if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) || |
177 | (fcntl(master, F_SETOWN, os_getpid()) < 0)) | 177 | (fcntl(master, F_SETOWN, os_getpid()) < 0)) |
diff --git a/arch/um/os-Linux/irq.c b/arch/um/os-Linux/irq.c index e599be423da1..3788d4568d33 100644 --- a/arch/um/os-Linux/irq.c +++ b/arch/um/os-Linux/irq.c | |||
@@ -29,21 +29,21 @@ int os_waiting_for_events(struct irq_fd *active_fds) | |||
29 | int i, n, err; | 29 | int i, n, err; |
30 | 30 | ||
31 | n = poll(pollfds, pollfds_num, 0); | 31 | n = poll(pollfds, pollfds_num, 0); |
32 | if(n < 0){ | 32 | if (n < 0) { |
33 | err = -errno; | 33 | err = -errno; |
34 | if(errno != EINTR) | 34 | if (errno != EINTR) |
35 | printk("sigio_handler: os_waiting_for_events:" | 35 | printk("sigio_handler: os_waiting_for_events:" |
36 | " poll returned %d, errno = %d\n", n, errno); | 36 | " poll returned %d, errno = %d\n", n, errno); |
37 | return err; | 37 | return err; |
38 | } | 38 | } |
39 | 39 | ||
40 | if(n == 0) | 40 | if (n == 0) |
41 | return 0; | 41 | return 0; |
42 | 42 | ||
43 | irq_fd = active_fds; | 43 | irq_fd = active_fds; |
44 | 44 | ||
45 | for(i = 0; i < pollfds_num; i++){ | 45 | for (i = 0; i < pollfds_num; i++) { |
46 | if(pollfds[i].revents != 0){ | 46 | if (pollfds[i].revents != 0) { |
47 | irq_fd->current_events = pollfds[i].revents; | 47 | irq_fd->current_events = pollfds[i].revents; |
48 | pollfds[i].fd = -1; | 48 | pollfds[i].fd = -1; |
49 | } | 49 | } |
@@ -54,7 +54,7 @@ int os_waiting_for_events(struct irq_fd *active_fds) | |||
54 | 54 | ||
55 | int os_isatty(int fd) | 55 | int os_isatty(int fd) |
56 | { | 56 | { |
57 | return(isatty(fd)); | 57 | return isatty(fd); |
58 | } | 58 | } |
59 | 59 | ||
60 | int os_create_pollfd(int fd, int events, void *tmp_pfd, int size_tmpfds) | 60 | int os_create_pollfd(int fd, int events, void *tmp_pfd, int size_tmpfds) |
@@ -65,7 +65,7 @@ int os_create_pollfd(int fd, int events, void *tmp_pfd, int size_tmpfds) | |||
65 | return((pollfds_size + 1) * sizeof(pollfds[0])); | 65 | return((pollfds_size + 1) * sizeof(pollfds[0])); |
66 | } | 66 | } |
67 | 67 | ||
68 | if(pollfds != NULL){ | 68 | if (pollfds != NULL) { |
69 | memcpy(tmp_pfd, pollfds, | 69 | memcpy(tmp_pfd, pollfds, |
70 | sizeof(pollfds[0]) * pollfds_size); | 70 | sizeof(pollfds[0]) * pollfds_size); |
71 | /* remove old pollfds */ | 71 | /* remove old pollfds */ |
@@ -73,18 +73,15 @@ int os_create_pollfd(int fd, int events, void *tmp_pfd, int size_tmpfds) | |||
73 | } | 73 | } |
74 | pollfds = tmp_pfd; | 74 | pollfds = tmp_pfd; |
75 | pollfds_size++; | 75 | pollfds_size++; |
76 | } else { | 76 | } else |
77 | /* remove not used tmp_pfd */ | 77 | kfree(tmp_pfd); /* remove not used tmp_pfd */ |
78 | if (tmp_pfd != NULL) | ||
79 | kfree(tmp_pfd); | ||
80 | } | ||
81 | 78 | ||
82 | pollfds[pollfds_num] = ((struct pollfd) { .fd = fd, | 79 | pollfds[pollfds_num] = ((struct pollfd) { .fd = fd, |
83 | .events = events, | 80 | .events = events, |
84 | .revents = 0 }); | 81 | .revents = 0 }); |
85 | pollfds_num++; | 82 | pollfds_num++; |
86 | 83 | ||
87 | return(0); | 84 | return 0; |
88 | } | 85 | } |
89 | 86 | ||
90 | void os_free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg, | 87 | void os_free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg, |
@@ -94,11 +91,11 @@ void os_free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg, | |||
94 | int i = 0; | 91 | int i = 0; |
95 | 92 | ||
96 | prev = &active_fds; | 93 | prev = &active_fds; |
97 | while(*prev != NULL){ | 94 | while (*prev != NULL) { |
98 | if((*test)(*prev, arg)){ | 95 | if ((*test)(*prev, arg)) { |
99 | struct irq_fd *old_fd = *prev; | 96 | struct irq_fd *old_fd = *prev; |
100 | if((pollfds[i].fd != -1) && | 97 | if ((pollfds[i].fd != -1) && |
101 | (pollfds[i].fd != (*prev)->fd)){ | 98 | (pollfds[i].fd != (*prev)->fd)) { |
102 | printk("os_free_irq_by_cb - mismatch between " | 99 | printk("os_free_irq_by_cb - mismatch between " |
103 | "active_fds and pollfds, fd %d vs %d\n", | 100 | "active_fds and pollfds, fd %d vs %d\n", |
104 | (*prev)->fd, pollfds[i].fd); | 101 | (*prev)->fd, pollfds[i].fd); |
@@ -110,7 +107,6 @@ void os_free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg, | |||
110 | /* This moves the *whole* array after pollfds[i] | 107 | /* This moves the *whole* array after pollfds[i] |
111 | * (though it doesn't spot as such)! | 108 | * (though it doesn't spot as such)! |
112 | */ | 109 | */ |
113 | |||
114 | memmove(&pollfds[i], &pollfds[i + 1], | 110 | memmove(&pollfds[i], &pollfds[i + 1], |
115 | (pollfds_num - i) * sizeof(pollfds[0])); | 111 | (pollfds_num - i) * sizeof(pollfds[0])); |
116 | if(*last_irq_ptr2 == &old_fd->next) | 112 | if(*last_irq_ptr2 == &old_fd->next) |
@@ -129,10 +125,9 @@ void os_free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg, | |||
129 | return; | 125 | return; |
130 | } | 126 | } |
131 | 127 | ||
132 | |||
133 | int os_get_pollfd(int i) | 128 | int os_get_pollfd(int i) |
134 | { | 129 | { |
135 | return(pollfds[i].fd); | 130 | return pollfds[i].fd; |
136 | } | 131 | } |
137 | 132 | ||
138 | void os_set_pollfd(int i, int fd) | 133 | void os_set_pollfd(int i, int fd) |
@@ -151,8 +146,10 @@ void init_irq_signals(int on_sigstack) | |||
151 | int flags; | 146 | int flags; |
152 | 147 | ||
153 | flags = on_sigstack ? SA_ONSTACK : 0; | 148 | flags = on_sigstack ? SA_ONSTACK : 0; |
154 | if(timer_irq_inited) h = (__sighandler_t) alarm_handler; | 149 | if (timer_irq_inited) |
155 | else h = boot_timer_handler; | 150 | h = (__sighandler_t)alarm_handler; |
151 | else | ||
152 | h = boot_timer_handler; | ||
156 | 153 | ||
157 | set_handler(SIGVTALRM, h, flags | SA_RESTART, | 154 | set_handler(SIGVTALRM, h, flags | SA_RESTART, |
158 | SIGUSR1, SIGIO, SIGWINCH, SIGALRM, -1); | 155 | SIGUSR1, SIGIO, SIGWINCH, SIGALRM, -1); |
diff --git a/arch/um/os-Linux/main.c b/arch/um/os-Linux/main.c index 2878e89a674f..3a0ac38e978b 100644 --- a/arch/um/os-Linux/main.c +++ b/arch/um/os-Linux/main.c | |||
@@ -74,6 +74,34 @@ static void last_ditch_exit(int sig) | |||
74 | exit(1); | 74 | exit(1); |
75 | } | 75 | } |
76 | 76 | ||
77 | #define UML_LIB_PATH ":/usr/lib/uml" | ||
78 | |||
79 | static void setup_env_path(void) | ||
80 | { | ||
81 | char *new_path = NULL; | ||
82 | char *old_path = NULL; | ||
83 | int path_len = 0; | ||
84 | |||
85 | old_path = getenv("PATH"); | ||
86 | /* if no PATH variable is set or it has an empty value | ||
87 | * just use the default + /usr/lib/uml | ||
88 | */ | ||
89 | if (!old_path || (path_len = strlen(old_path)) == 0) { | ||
90 | putenv("PATH=:/bin:/usr/bin/" UML_LIB_PATH); | ||
91 | return; | ||
92 | } | ||
93 | |||
94 | /* append /usr/lib/uml to the existing path */ | ||
95 | path_len += strlen("PATH=" UML_LIB_PATH) + 1; | ||
96 | new_path = malloc(path_len); | ||
97 | if (!new_path) { | ||
98 | perror("coudn't malloc to set a new PATH"); | ||
99 | return; | ||
100 | } | ||
101 | snprintf(new_path, path_len, "PATH=%s" UML_LIB_PATH, old_path); | ||
102 | putenv(new_path); | ||
103 | } | ||
104 | |||
77 | extern int uml_exitcode; | 105 | extern int uml_exitcode; |
78 | 106 | ||
79 | extern void scan_elf_aux( char **envp); | 107 | extern void scan_elf_aux( char **envp); |
@@ -114,6 +142,8 @@ int main(int argc, char **argv, char **envp) | |||
114 | 142 | ||
115 | set_stklim(); | 143 | set_stklim(); |
116 | 144 | ||
145 | setup_env_path(); | ||
146 | |||
117 | new_argv = malloc((argc + 1) * sizeof(char *)); | 147 | new_argv = malloc((argc + 1) * sizeof(char *)); |
118 | if(new_argv == NULL){ | 148 | if(new_argv == NULL){ |
119 | perror("Mallocing argv"); | 149 | perror("Mallocing argv"); |
diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index 3505f44f8a25..233be2f4f8cb 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c | |||
@@ -206,29 +206,36 @@ int os_drop_memory(void *addr, int length) | |||
206 | int can_drop_memory(void) | 206 | int can_drop_memory(void) |
207 | { | 207 | { |
208 | void *addr; | 208 | void *addr; |
209 | int fd; | 209 | int fd, ok = 0; |
210 | 210 | ||
211 | printk("Checking host MADV_REMOVE support..."); | 211 | printk("Checking host MADV_REMOVE support..."); |
212 | fd = create_mem_file(UM_KERN_PAGE_SIZE); | 212 | fd = create_mem_file(UM_KERN_PAGE_SIZE); |
213 | if(fd < 0){ | 213 | if(fd < 0){ |
214 | printk("Creating test memory file failed, err = %d\n", -fd); | 214 | printk("Creating test memory file failed, err = %d\n", -fd); |
215 | return 0; | 215 | goto out; |
216 | } | 216 | } |
217 | 217 | ||
218 | addr = mmap64(NULL, UM_KERN_PAGE_SIZE, PROT_READ | PROT_WRITE, | 218 | addr = mmap64(NULL, UM_KERN_PAGE_SIZE, PROT_READ | PROT_WRITE, |
219 | MAP_SHARED, fd, 0); | 219 | MAP_SHARED, fd, 0); |
220 | if(addr == MAP_FAILED){ | 220 | if(addr == MAP_FAILED){ |
221 | printk("Mapping test memory file failed, err = %d\n", -errno); | 221 | printk("Mapping test memory file failed, err = %d\n", -errno); |
222 | return 0; | 222 | goto out_close; |
223 | } | 223 | } |
224 | 224 | ||
225 | if(madvise(addr, UM_KERN_PAGE_SIZE, MADV_REMOVE) != 0){ | 225 | if(madvise(addr, UM_KERN_PAGE_SIZE, MADV_REMOVE) != 0){ |
226 | printk("MADV_REMOVE failed, err = %d\n", -errno); | 226 | printk("MADV_REMOVE failed, err = %d\n", -errno); |
227 | return 0; | 227 | goto out_unmap; |
228 | } | 228 | } |
229 | 229 | ||
230 | printk("OK\n"); | 230 | printk("OK\n"); |
231 | return 1; | 231 | ok = 1; |
232 | |||
233 | out_unmap: | ||
234 | munmap(addr, UM_KERN_PAGE_SIZE); | ||
235 | out_close: | ||
236 | close(fd); | ||
237 | out: | ||
238 | return ok; | ||
232 | } | 239 | } |
233 | 240 | ||
234 | void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int)) | 241 | void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int)) |
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index 0776bc18ca85..bd89c6b99d5d 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c | |||
@@ -344,12 +344,12 @@ int copy_context_skas0(unsigned long new_stack, int pid) | |||
344 | err = ptrace_setregs(pid, regs); | 344 | err = ptrace_setregs(pid, regs); |
345 | if(err < 0) | 345 | if(err < 0) |
346 | panic("copy_context_skas0 : PTRACE_SETREGS failed, " | 346 | panic("copy_context_skas0 : PTRACE_SETREGS failed, " |
347 | "pid = %d, errno = %d\n", pid, errno); | 347 | "pid = %d, errno = %d\n", pid, -err); |
348 | 348 | ||
349 | err = ptrace_setfpregs(pid, fp_regs); | 349 | err = ptrace_setfpregs(pid, fp_regs); |
350 | if(err < 0) | 350 | if(err < 0) |
351 | panic("copy_context_skas0 : PTRACE_SETFPREGS failed, " | 351 | panic("copy_context_skas0 : PTRACE_SETFPREGS failed, " |
352 | "pid = %d, errno = %d\n", pid, errno); | 352 | "pid = %d, errno = %d\n", pid, -err); |
353 | 353 | ||
354 | /* 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 */ |
355 | child_data->err = 12345678; | 355 | child_data->err = 12345678; |
@@ -362,7 +362,7 @@ int copy_context_skas0(unsigned long new_stack, int pid) | |||
362 | pid = data->err; | 362 | pid = data->err; |
363 | if(pid < 0) | 363 | if(pid < 0) |
364 | panic("copy_context_skas0 - stub-parent reports error %d\n", | 364 | panic("copy_context_skas0 - stub-parent reports error %d\n", |
365 | pid); | 365 | -pid); |
366 | 366 | ||
367 | /* Wait, until child has finished too: read child's result from | 367 | /* Wait, until child has finished too: read child's result from |
368 | * child's stack and check it. | 368 | * child's stack and check it. |
diff --git a/arch/um/os-Linux/sys-i386/registers.c b/arch/um/os-Linux/sys-i386/registers.c index 7a6f6b99ceff..516f66dd87e3 100644 --- a/arch/um/os-Linux/sys-i386/registers.c +++ b/arch/um/os-Linux/sys-i386/registers.c | |||
@@ -104,7 +104,7 @@ void init_registers(int pid) | |||
104 | err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs); | 104 | err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs); |
105 | if(err) | 105 | if(err) |
106 | panic("check_ptrace : PTRACE_GETREGS failed, errno = %d", | 106 | panic("check_ptrace : PTRACE_GETREGS failed, errno = %d", |
107 | err); | 107 | errno); |
108 | 108 | ||
109 | errno = 0; | 109 | errno = 0; |
110 | err = ptrace(PTRACE_GETFPXREGS, pid, 0, exec_fpx_regs); | 110 | err = ptrace(PTRACE_GETFPXREGS, pid, 0, exec_fpx_regs); |
@@ -119,7 +119,7 @@ void init_registers(int pid) | |||
119 | err = ptrace(PTRACE_GETFPREGS, pid, 0, exec_fp_regs); | 119 | err = ptrace(PTRACE_GETFPREGS, pid, 0, exec_fp_regs); |
120 | if(err) | 120 | if(err) |
121 | panic("check_ptrace : PTRACE_GETFPREGS failed, errno = %d", | 121 | panic("check_ptrace : PTRACE_GETFPREGS failed, errno = %d", |
122 | err); | 122 | errno); |
123 | } | 123 | } |
124 | 124 | ||
125 | void get_safe_registers(unsigned long *regs, unsigned long *fp_regs) | 125 | void get_safe_registers(unsigned long *regs, unsigned long *fp_regs) |
diff --git a/arch/um/os-Linux/sys-x86_64/registers.c b/arch/um/os-Linux/sys-x86_64/registers.c index 001941fa1a1e..becd898d9398 100644 --- a/arch/um/os-Linux/sys-x86_64/registers.c +++ b/arch/um/os-Linux/sys-x86_64/registers.c | |||
@@ -62,12 +62,12 @@ void init_registers(int pid) | |||
62 | err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs); | 62 | err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs); |
63 | if(err) | 63 | if(err) |
64 | panic("check_ptrace : PTRACE_GETREGS failed, errno = %d", | 64 | panic("check_ptrace : PTRACE_GETREGS failed, errno = %d", |
65 | err); | 65 | errno); |
66 | 66 | ||
67 | err = ptrace(PTRACE_GETFPREGS, pid, 0, exec_fp_regs); | 67 | err = ptrace(PTRACE_GETFPREGS, pid, 0, exec_fp_regs); |
68 | if(err) | 68 | if(err) |
69 | panic("check_ptrace : PTRACE_GETFPREGS failed, errno = %d", | 69 | panic("check_ptrace : PTRACE_GETFPREGS failed, errno = %d", |
70 | err); | 70 | errno); |
71 | } | 71 | } |
72 | 72 | ||
73 | void get_safe_registers(unsigned long *regs, unsigned long *fp_regs) | 73 | void get_safe_registers(unsigned long *regs, unsigned long *fp_regs) |
diff --git a/arch/um/os-Linux/umid.c b/arch/um/os-Linux/umid.c index 34bfc1bb9e38..362db059fe30 100644 --- a/arch/um/os-Linux/umid.c +++ b/arch/um/os-Linux/umid.c | |||
@@ -178,14 +178,14 @@ static void __init create_pid_file(void) | |||
178 | fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0644); | 178 | fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0644); |
179 | if(fd < 0){ | 179 | if(fd < 0){ |
180 | printk("Open of machine pid file \"%s\" failed: %s\n", | 180 | printk("Open of machine pid file \"%s\" failed: %s\n", |
181 | file, strerror(-fd)); | 181 | file, strerror(errno)); |
182 | return; | 182 | return; |
183 | } | 183 | } |
184 | 184 | ||
185 | snprintf(pid, sizeof(pid), "%d\n", getpid()); | 185 | snprintf(pid, sizeof(pid), "%d\n", getpid()); |
186 | n = write(fd, pid, strlen(pid)); | 186 | n = write(fd, pid, strlen(pid)); |
187 | if(n != strlen(pid)) | 187 | if(n != strlen(pid)) |
188 | printk("Write of pid file failed - err = %d\n", -n); | 188 | printk("Write of pid file failed - err = %d\n", errno); |
189 | 189 | ||
190 | close(fd); | 190 | close(fd); |
191 | } | 191 | } |
diff --git a/arch/um/os-Linux/user_syms.c b/arch/um/os-Linux/user_syms.c index 2598158e1f53..3f33165ada68 100644 --- a/arch/um/os-Linux/user_syms.c +++ b/arch/um/os-Linux/user_syms.c | |||
@@ -96,6 +96,13 @@ EXPORT_SYMBOL_PROTO(getuid); | |||
96 | EXPORT_SYMBOL_PROTO(fsync); | 96 | EXPORT_SYMBOL_PROTO(fsync); |
97 | EXPORT_SYMBOL_PROTO(fdatasync); | 97 | EXPORT_SYMBOL_PROTO(fdatasync); |
98 | 98 | ||
99 | /* Export symbols used by GCC for the stack protector. */ | ||
100 | extern void __stack_smash_handler(void *) __attribute__((weak)); | ||
101 | EXPORT_SYMBOL(__stack_smash_handler); | ||
102 | |||
103 | extern long __guard __attribute__((weak)); | ||
104 | EXPORT_SYMBOL(__guard); | ||
105 | |||
99 | /* | 106 | /* |
100 | * Overrides for Emacs so that we follow Linus's tabbing style. | 107 | * Overrides for Emacs so that we follow Linus's tabbing style. |
101 | * Emacs will notice this stuff at the end of the file and automatically | 108 | * Emacs will notice this stuff at the end of the file and automatically |