diff options
| author | <jgarzik@pretzel.yyz.us> | 2005-06-04 00:40:40 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-06-04 00:40:40 -0400 |
| commit | ae20ea8525a80a863f70d332cf47b71bd9f54c1f (patch) | |
| tree | 9d3cedeb65db521a8436b545bd91641549a18d24 /arch/um/kernel | |
| parent | f497ba735fc9ff4e35a19641143708b3be1c7061 (diff) | |
| parent | 8be3de3fd8469154a2b3e18a4712032dac5b4a53 (diff) | |
Automatic merge of /spare/repo/linux-2.6/.git branch HEAD
Diffstat (limited to 'arch/um/kernel')
| -rw-r--r-- | arch/um/kernel/Makefile | 2 | ||||
| -rw-r--r-- | arch/um/kernel/checksum.c | 0 | ||||
| -rw-r--r-- | arch/um/kernel/exec_kern.c | 1 | ||||
| -rw-r--r-- | arch/um/kernel/initrd.c (renamed from arch/um/kernel/initrd_kern.c) | 21 | ||||
| -rw-r--r-- | arch/um/kernel/initrd_user.c | 46 | ||||
| -rw-r--r-- | arch/um/kernel/irq_user.c | 10 | ||||
| -rw-r--r-- | arch/um/kernel/ksyms.c | 1 | ||||
| -rw-r--r-- | arch/um/kernel/main.c | 40 | ||||
| -rw-r--r-- | arch/um/kernel/mem.c | 40 | ||||
| -rw-r--r-- | arch/um/kernel/process_kern.c | 36 | ||||
| -rw-r--r-- | arch/um/kernel/ptrace.c | 25 | ||||
| -rw-r--r-- | arch/um/kernel/sysrq.c | 21 | ||||
| -rw-r--r-- | arch/um/kernel/trap_kern.c | 37 | ||||
| -rw-r--r-- | arch/um/kernel/tt/ksyms.c | 1 | ||||
| -rw-r--r-- | arch/um/kernel/tt/process_kern.c | 8 | ||||
| -rw-r--r-- | arch/um/kernel/um_arch.c | 6 | ||||
| -rw-r--r-- | arch/um/kernel/uml.lds.S | 2 |
17 files changed, 110 insertions, 187 deletions
diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile index 9736ca27c5f0..a8918e80df96 100644 --- a/arch/um/kernel/Makefile +++ b/arch/um/kernel/Makefile | |||
| @@ -14,7 +14,7 @@ obj-y = config.o exec_kern.o exitcode.o \ | |||
| 14 | tlb.o trap_kern.o trap_user.o uaccess_user.o um_arch.o umid.o \ | 14 | tlb.o trap_kern.o trap_user.o uaccess_user.o um_arch.o umid.o \ |
| 15 | user_util.o | 15 | user_util.o |
| 16 | 16 | ||
| 17 | obj-$(CONFIG_BLK_DEV_INITRD) += initrd_kern.o initrd_user.o | 17 | obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o |
| 18 | obj-$(CONFIG_GPROF) += gprof_syms.o | 18 | obj-$(CONFIG_GPROF) += gprof_syms.o |
| 19 | obj-$(CONFIG_GCOV) += gmon_syms.o | 19 | obj-$(CONFIG_GCOV) += gmon_syms.o |
| 20 | obj-$(CONFIG_TTY_LOG) += tty_log.o | 20 | obj-$(CONFIG_TTY_LOG) += tty_log.o |
diff --git a/arch/um/kernel/checksum.c b/arch/um/kernel/checksum.c deleted file mode 100644 index e69de29bb2d1..000000000000 --- a/arch/um/kernel/checksum.c +++ /dev/null | |||
diff --git a/arch/um/kernel/exec_kern.c b/arch/um/kernel/exec_kern.c index 49ddabe69be7..efd222ffe20e 100644 --- a/arch/um/kernel/exec_kern.c +++ b/arch/um/kernel/exec_kern.c | |||
| @@ -16,7 +16,6 @@ | |||
| 16 | #include "kern.h" | 16 | #include "kern.h" |
| 17 | #include "irq_user.h" | 17 | #include "irq_user.h" |
| 18 | #include "tlb.h" | 18 | #include "tlb.h" |
| 19 | #include "2_5compat.h" | ||
| 20 | #include "os.h" | 19 | #include "os.h" |
| 21 | #include "time_user.h" | 20 | #include "time_user.h" |
| 22 | #include "choose-mode.h" | 21 | #include "choose-mode.h" |
diff --git a/arch/um/kernel/initrd_kern.c b/arch/um/kernel/initrd.c index fc568af468b9..82ecf904b09c 100644 --- a/arch/um/kernel/initrd_kern.c +++ b/arch/um/kernel/initrd.c | |||
| @@ -41,12 +41,31 @@ static int __init uml_initrd_setup(char *line, int *add) | |||
| 41 | return 0; | 41 | return 0; |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | __uml_setup("initrd=", uml_initrd_setup, | 44 | __uml_setup("initrd=", uml_initrd_setup, |
| 45 | "initrd=<initrd image>\n" | 45 | "initrd=<initrd image>\n" |
| 46 | " This is used to boot UML from an initrd image. The argument is the\n" | 46 | " This is used to boot UML from an initrd image. The argument is the\n" |
| 47 | " name of the file containing the image.\n\n" | 47 | " name of the file containing the image.\n\n" |
| 48 | ); | 48 | ); |
| 49 | 49 | ||
| 50 | int load_initrd(char *filename, void *buf, int size) | ||
| 51 | { | ||
| 52 | int fd, n; | ||
| 53 | |||
| 54 | fd = os_open_file(filename, of_read(OPENFLAGS()), 0); | ||
| 55 | if(fd < 0){ | ||
| 56 | printk("Opening '%s' failed - err = %d\n", filename, -fd); | ||
| 57 | return(-1); | ||
| 58 | } | ||
| 59 | n = os_read_file(fd, buf, size); | ||
| 60 | if(n != size){ | ||
| 61 | printk("Read of %d bytes from '%s' failed, err = %d\n", size, | ||
| 62 | filename, -n); | ||
| 63 | return(-1); | ||
| 64 | } | ||
| 65 | |||
| 66 | os_close_file(fd); | ||
| 67 | return(0); | ||
| 68 | } | ||
| 50 | /* | 69 | /* |
| 51 | * Overrides for Emacs so that we follow Linus's tabbing style. | 70 | * Overrides for Emacs so that we follow Linus's tabbing style. |
| 52 | * Emacs will notice this stuff at the end of the file and automatically | 71 | * Emacs will notice this stuff at the end of the file and automatically |
diff --git a/arch/um/kernel/initrd_user.c b/arch/um/kernel/initrd_user.c deleted file mode 100644 index cb90681e151c..000000000000 --- a/arch/um/kernel/initrd_user.c +++ /dev/null | |||
| @@ -1,46 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) | ||
| 3 | * Licensed under the GPL | ||
| 4 | */ | ||
| 5 | |||
| 6 | #include <unistd.h> | ||
| 7 | #include <sys/types.h> | ||
| 8 | #include <sys/stat.h> | ||
| 9 | #include <errno.h> | ||
| 10 | |||
| 11 | #include "user_util.h" | ||
| 12 | #include "kern_util.h" | ||
| 13 | #include "user.h" | ||
| 14 | #include "initrd.h" | ||
| 15 | #include "os.h" | ||
| 16 | |||
| 17 | int load_initrd(char *filename, void *buf, int size) | ||
| 18 | { | ||
| 19 | int fd, n; | ||
| 20 | |||
| 21 | fd = os_open_file(filename, of_read(OPENFLAGS()), 0); | ||
| 22 | if(fd < 0){ | ||
| 23 | printk("Opening '%s' failed - err = %d\n", filename, -fd); | ||
| 24 | return(-1); | ||
| 25 | } | ||
| 26 | n = os_read_file(fd, buf, size); | ||
| 27 | if(n != size){ | ||
| 28 | printk("Read of %d bytes from '%s' failed, err = %d\n", size, | ||
| 29 | filename, -n); | ||
| 30 | return(-1); | ||
| 31 | } | ||
| 32 | |||
| 33 | os_close_file(fd); | ||
| 34 | return(0); | ||
| 35 | } | ||
| 36 | |||
| 37 | /* | ||
| 38 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 39 | * Emacs will notice this stuff at the end of the file and automatically | ||
| 40 | * adjust the settings for this buffer only. This must remain at the end | ||
| 41 | * of the file. | ||
| 42 | * --------------------------------------------------------------------------- | ||
| 43 | * Local variables: | ||
| 44 | * c-file-style: "linux" | ||
| 45 | * End: | ||
| 46 | */ | ||
diff --git a/arch/um/kernel/irq_user.c b/arch/um/kernel/irq_user.c index 6d6f9484b884..b3074cbaa479 100644 --- a/arch/um/kernel/irq_user.c +++ b/arch/um/kernel/irq_user.c | |||
| @@ -236,9 +236,15 @@ static void free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg) | |||
| 236 | (*prev)->fd, pollfds[i].fd); | 236 | (*prev)->fd, pollfds[i].fd); |
| 237 | goto out; | 237 | goto out; |
| 238 | } | 238 | } |
| 239 | memcpy(&pollfds[i], &pollfds[i + 1], | 239 | |
| 240 | (pollfds_num - i - 1) * sizeof(pollfds[0])); | ||
| 241 | pollfds_num--; | 240 | pollfds_num--; |
| 241 | |||
| 242 | /* This moves the *whole* array after pollfds[i] (though | ||
| 243 | * it doesn't spot as such)! */ | ||
| 244 | |||
| 245 | memmove(&pollfds[i], &pollfds[i + 1], | ||
| 246 | (pollfds_num - i) * sizeof(pollfds[0])); | ||
| 247 | |||
| 242 | if(last_irq_ptr == &old_fd->next) | 248 | if(last_irq_ptr == &old_fd->next) |
| 243 | last_irq_ptr = prev; | 249 | last_irq_ptr = prev; |
| 244 | *prev = (*prev)->next; | 250 | *prev = (*prev)->next; |
diff --git a/arch/um/kernel/ksyms.c b/arch/um/kernel/ksyms.c index 78d69dc74b26..99439fa15ef4 100644 --- a/arch/um/kernel/ksyms.c +++ b/arch/um/kernel/ksyms.c | |||
| @@ -57,6 +57,7 @@ EXPORT_SYMBOL(copy_to_user_tt); | |||
| 57 | EXPORT_SYMBOL(strncpy_from_user_skas); | 57 | EXPORT_SYMBOL(strncpy_from_user_skas); |
| 58 | EXPORT_SYMBOL(copy_to_user_skas); | 58 | EXPORT_SYMBOL(copy_to_user_skas); |
| 59 | EXPORT_SYMBOL(copy_from_user_skas); | 59 | EXPORT_SYMBOL(copy_from_user_skas); |
| 60 | EXPORT_SYMBOL(clear_user_skas); | ||
| 60 | #endif | 61 | #endif |
| 61 | EXPORT_SYMBOL(uml_strdup); | 62 | EXPORT_SYMBOL(uml_strdup); |
| 62 | 63 | ||
diff --git a/arch/um/kernel/main.c b/arch/um/kernel/main.c index a17c49703f9b..e42e6364ca13 100644 --- a/arch/um/kernel/main.c +++ b/arch/um/kernel/main.c | |||
| @@ -71,7 +71,7 @@ static __init void do_uml_initcalls(void) | |||
| 71 | 71 | ||
| 72 | static void last_ditch_exit(int sig) | 72 | static void last_ditch_exit(int sig) |
| 73 | { | 73 | { |
| 74 | CHOOSE_MODE(kmalloc_ok = 0, (void) 0); | 74 | kmalloc_ok = 0; |
| 75 | signal(SIGINT, SIG_DFL); | 75 | signal(SIGINT, SIG_DFL); |
| 76 | signal(SIGTERM, SIG_DFL); | 76 | signal(SIGTERM, SIG_DFL); |
| 77 | signal(SIGHUP, SIG_DFL); | 77 | signal(SIGHUP, SIG_DFL); |
| @@ -87,7 +87,7 @@ int main(int argc, char **argv, char **envp) | |||
| 87 | { | 87 | { |
| 88 | char **new_argv; | 88 | char **new_argv; |
| 89 | sigset_t mask; | 89 | sigset_t mask; |
| 90 | int ret, i; | 90 | int ret, i, err; |
| 91 | 91 | ||
| 92 | /* Enable all signals except SIGIO - in some environments, we can | 92 | /* Enable all signals except SIGIO - in some environments, we can |
| 93 | * enter with some signals blocked | 93 | * enter with some signals blocked |
| @@ -160,27 +160,29 @@ int main(int argc, char **argv, char **envp) | |||
| 160 | */ | 160 | */ |
| 161 | change_sig(SIGPROF, 0); | 161 | change_sig(SIGPROF, 0); |
| 162 | 162 | ||
| 163 | /* Reboot */ | 163 | /* This signal stuff used to be in the reboot case. However, |
| 164 | if(ret){ | 164 | * sometimes a SIGVTALRM can come in when we're halting (reproducably |
| 165 | int err; | 165 | * when writing out gcov information, presumably because that takes |
| 166 | 166 | * some time) and cause a segfault. | |
| 167 | printf("\n"); | 167 | */ |
| 168 | 168 | ||
| 169 | /* stop timers and set SIG*ALRM to be ignored */ | 169 | /* stop timers and set SIG*ALRM to be ignored */ |
| 170 | disable_timer(); | 170 | disable_timer(); |
| 171 | 171 | ||
| 172 | /* disable SIGIO for the fds and set SIGIO to be ignored */ | 172 | /* disable SIGIO for the fds and set SIGIO to be ignored */ |
| 173 | err = deactivate_all_fds(); | 173 | err = deactivate_all_fds(); |
| 174 | if(err) | 174 | if(err) |
| 175 | printf("deactivate_all_fds failed, errno = %d\n", | 175 | printf("deactivate_all_fds failed, errno = %d\n", -err); |
| 176 | -err); | ||
| 177 | 176 | ||
| 178 | /* Let any pending signals fire now. This ensures | 177 | /* Let any pending signals fire now. This ensures |
| 179 | * that they won't be delivered after the exec, when | 178 | * that they won't be delivered after the exec, when |
| 180 | * they are definitely not expected. | 179 | * they are definitely not expected. |
| 181 | */ | 180 | */ |
| 182 | unblock_signals(); | 181 | unblock_signals(); |
| 183 | 182 | ||
| 183 | /* Reboot */ | ||
| 184 | if(ret){ | ||
| 185 | printf("\n"); | ||
| 184 | execvp(new_argv[0], new_argv); | 186 | execvp(new_argv[0], new_argv); |
| 185 | perror("Failed to exec kernel"); | 187 | perror("Failed to exec kernel"); |
| 186 | ret = 1; | 188 | ret = 1; |
diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c index f156661781cb..c22825f13e40 100644 --- a/arch/um/kernel/mem.c +++ b/arch/um/kernel/mem.c | |||
| @@ -100,12 +100,37 @@ void mem_init(void) | |||
| 100 | #endif | 100 | #endif |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | /* | ||
| 104 | * Create a page table and place a pointer to it in a middle page | ||
| 105 | * directory entry. | ||
| 106 | */ | ||
| 107 | static void __init one_page_table_init(pmd_t *pmd) | ||
| 108 | { | ||
| 109 | if (pmd_none(*pmd)) { | ||
| 110 | pte_t *pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); | ||
| 111 | set_pmd(pmd, __pmd(_KERNPG_TABLE + | ||
| 112 | (unsigned long) __pa(pte))); | ||
| 113 | if (pte != pte_offset_kernel(pmd, 0)) | ||
| 114 | BUG(); | ||
| 115 | } | ||
| 116 | } | ||
| 117 | |||
| 118 | static void __init one_md_table_init(pud_t *pud) | ||
| 119 | { | ||
| 120 | #ifdef CONFIG_3_LEVEL_PGTABLES | ||
| 121 | pmd_t *pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE); | ||
| 122 | set_pud(pud, __pud(_KERNPG_TABLE + (unsigned long) __pa(pmd_table))); | ||
| 123 | if (pmd_table != pmd_offset(pud, 0)) | ||
| 124 | BUG(); | ||
| 125 | #endif | ||
| 126 | } | ||
| 127 | |||
| 103 | static void __init fixrange_init(unsigned long start, unsigned long end, | 128 | static void __init fixrange_init(unsigned long start, unsigned long end, |
| 104 | pgd_t *pgd_base) | 129 | pgd_t *pgd_base) |
| 105 | { | 130 | { |
| 106 | pgd_t *pgd; | 131 | pgd_t *pgd; |
| 132 | pud_t *pud; | ||
| 107 | pmd_t *pmd; | 133 | pmd_t *pmd; |
| 108 | pte_t *pte; | ||
| 109 | int i, j; | 134 | int i, j; |
| 110 | unsigned long vaddr; | 135 | unsigned long vaddr; |
| 111 | 136 | ||
| @@ -115,15 +140,12 @@ static void __init fixrange_init(unsigned long start, unsigned long end, | |||
| 115 | pgd = pgd_base + i; | 140 | pgd = pgd_base + i; |
| 116 | 141 | ||
| 117 | for ( ; (i < PTRS_PER_PGD) && (vaddr < end); pgd++, i++) { | 142 | for ( ; (i < PTRS_PER_PGD) && (vaddr < end); pgd++, i++) { |
| 118 | pmd = (pmd_t *)pgd; | 143 | pud = pud_offset(pgd, vaddr); |
| 144 | if (pud_none(*pud)) | ||
| 145 | one_md_table_init(pud); | ||
| 146 | pmd = pmd_offset(pud, vaddr); | ||
| 119 | for (; (j < PTRS_PER_PMD) && (vaddr != end); pmd++, j++) { | 147 | for (; (j < PTRS_PER_PMD) && (vaddr != end); pmd++, j++) { |
| 120 | if (pmd_none(*pmd)) { | 148 | one_page_table_init(pmd); |
| 121 | pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); | ||
| 122 | set_pmd(pmd, __pmd(_KERNPG_TABLE + | ||
| 123 | (unsigned long) __pa(pte))); | ||
| 124 | if (pte != pte_offset_kernel(pmd, 0)) | ||
| 125 | BUG(); | ||
| 126 | } | ||
| 127 | vaddr += PMD_SIZE; | 149 | vaddr += PMD_SIZE; |
| 128 | } | 150 | } |
| 129 | j = 0; | 151 | j = 0; |
diff --git a/arch/um/kernel/process_kern.c b/arch/um/kernel/process_kern.c index c1adf7ba3fd1..804c6bbdf67c 100644 --- a/arch/um/kernel/process_kern.c +++ b/arch/um/kernel/process_kern.c | |||
| @@ -43,7 +43,6 @@ | |||
| 43 | #include "tlb.h" | 43 | #include "tlb.h" |
| 44 | #include "frame_kern.h" | 44 | #include "frame_kern.h" |
| 45 | #include "sigcontext.h" | 45 | #include "sigcontext.h" |
| 46 | #include "2_5compat.h" | ||
| 47 | #include "os.h" | 46 | #include "os.h" |
| 48 | #include "mode.h" | 47 | #include "mode.h" |
| 49 | #include "mode_kern.h" | 48 | #include "mode_kern.h" |
| @@ -55,18 +54,6 @@ | |||
| 55 | */ | 54 | */ |
| 56 | struct cpu_task cpu_tasks[NR_CPUS] = { [0 ... NR_CPUS - 1] = { -1, NULL } }; | 55 | struct cpu_task cpu_tasks[NR_CPUS] = { [0 ... NR_CPUS - 1] = { -1, NULL } }; |
| 57 | 56 | ||
| 58 | struct task_struct *get_task(int pid, int require) | ||
| 59 | { | ||
| 60 | struct task_struct *ret; | ||
| 61 | |||
| 62 | read_lock(&tasklist_lock); | ||
| 63 | ret = find_task_by_pid(pid); | ||
| 64 | read_unlock(&tasklist_lock); | ||
| 65 | |||
| 66 | if(require && (ret == NULL)) panic("get_task couldn't find a task\n"); | ||
| 67 | return(ret); | ||
| 68 | } | ||
| 69 | |||
| 70 | int external_pid(void *t) | 57 | int external_pid(void *t) |
| 71 | { | 58 | { |
| 72 | struct task_struct *task = t ? t : current; | 59 | struct task_struct *task = t ? t : current; |
| @@ -189,7 +176,6 @@ void default_idle(void) | |||
| 189 | 176 | ||
| 190 | while(1){ | 177 | while(1){ |
| 191 | /* endless idle loop with no priority at all */ | 178 | /* endless idle loop with no priority at all */ |
| 192 | SET_PRI(current); | ||
| 193 | 179 | ||
| 194 | /* | 180 | /* |
| 195 | * although we are an idle CPU, we do not want to | 181 | * although we are an idle CPU, we do not want to |
| @@ -212,11 +198,6 @@ int page_size(void) | |||
| 212 | return(PAGE_SIZE); | 198 | return(PAGE_SIZE); |
| 213 | } | 199 | } |
| 214 | 200 | ||
| 215 | unsigned long page_mask(void) | ||
| 216 | { | ||
| 217 | return(PAGE_MASK); | ||
| 218 | } | ||
| 219 | |||
| 220 | void *um_virt_to_phys(struct task_struct *task, unsigned long addr, | 201 | void *um_virt_to_phys(struct task_struct *task, unsigned long addr, |
| 221 | pte_t *pte_out) | 202 | pte_t *pte_out) |
| 222 | { | 203 | { |
| @@ -349,11 +330,6 @@ char *uml_strdup(char *string) | |||
| 349 | return(new); | 330 | return(new); |
| 350 | } | 331 | } |
| 351 | 332 | ||
| 352 | void *get_init_task(void) | ||
| 353 | { | ||
| 354 | return(&init_thread_union.thread_info.task); | ||
| 355 | } | ||
| 356 | |||
| 357 | int copy_to_user_proc(void __user *to, void *from, int size) | 333 | int copy_to_user_proc(void __user *to, void *from, int size) |
| 358 | { | 334 | { |
| 359 | return(copy_to_user(to, from, size)); | 335 | return(copy_to_user(to, from, size)); |
| @@ -480,15 +456,3 @@ unsigned long arch_align_stack(unsigned long sp) | |||
| 480 | return sp & ~0xf; | 456 | return sp & ~0xf; |
| 481 | } | 457 | } |
| 482 | #endif | 458 | #endif |
| 483 | |||
| 484 | |||
| 485 | /* | ||
| 486 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 487 | * Emacs will notice this stuff at the end of the file and automatically | ||
| 488 | * adjust the settings for this buffer only. This must remain at the end | ||
| 489 | * of the file. | ||
| 490 | * --------------------------------------------------------------------------- | ||
| 491 | * Local variables: | ||
| 492 | * c-file-style: "linux" | ||
| 493 | * End: | ||
| 494 | */ | ||
diff --git a/arch/um/kernel/ptrace.c b/arch/um/kernel/ptrace.c index 2b75d8d9ba73..71af4d503899 100644 --- a/arch/um/kernel/ptrace.c +++ b/arch/um/kernel/ptrace.c | |||
| @@ -28,9 +28,9 @@ static inline void set_singlestepping(struct task_struct *child, int on) | |||
| 28 | child->thread.singlestep_syscall = 0; | 28 | child->thread.singlestep_syscall = 0; |
| 29 | 29 | ||
| 30 | #ifdef SUBARCH_SET_SINGLESTEPPING | 30 | #ifdef SUBARCH_SET_SINGLESTEPPING |
| 31 | SUBARCH_SET_SINGLESTEPPING(child, on) | 31 | SUBARCH_SET_SINGLESTEPPING(child, on); |
| 32 | #endif | 32 | #endif |
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | /* | 35 | /* |
| 36 | * Called by kernel/ptrace.c when detaching.. | 36 | * Called by kernel/ptrace.c when detaching.. |
| @@ -83,7 +83,7 @@ long sys_ptrace(long request, long pid, long addr, long data) | |||
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | #ifdef SUBACH_PTRACE_SPECIAL | 85 | #ifdef SUBACH_PTRACE_SPECIAL |
| 86 | SUBARCH_PTRACE_SPECIAL(child,request,addr,data) | 86 | SUBARCH_PTRACE_SPECIAL(child,request,addr,data); |
| 87 | #endif | 87 | #endif |
| 88 | 88 | ||
| 89 | ret = ptrace_check_attach(child, request == PTRACE_KILL); | 89 | ret = ptrace_check_attach(child, request == PTRACE_KILL); |
| @@ -322,11 +322,9 @@ void syscall_trace(union uml_pt_regs *regs, int entryexit) | |||
| 322 | UPT_SYSCALL_ARG2(regs), | 322 | UPT_SYSCALL_ARG2(regs), |
| 323 | UPT_SYSCALL_ARG3(regs), | 323 | UPT_SYSCALL_ARG3(regs), |
| 324 | UPT_SYSCALL_ARG4(regs)); | 324 | UPT_SYSCALL_ARG4(regs)); |
| 325 | else { | 325 | else audit_syscall_exit(current, |
| 326 | int res = UPT_SYSCALL_RET(regs); | 326 | AUDITSC_RESULT(UPT_SYSCALL_RET(regs)), |
| 327 | audit_syscall_exit(current, AUDITSC_RESULT(res), | 327 | UPT_SYSCALL_RET(regs)); |
| 328 | res); | ||
| 329 | } | ||
| 330 | } | 328 | } |
| 331 | 329 | ||
| 332 | /* Fake a debug trap */ | 330 | /* Fake a debug trap */ |
| @@ -356,14 +354,3 @@ void syscall_trace(union uml_pt_regs *regs, int entryexit) | |||
| 356 | current->exit_code = 0; | 354 | current->exit_code = 0; |
| 357 | } | 355 | } |
| 358 | } | 356 | } |
| 359 | |||
| 360 | /* | ||
| 361 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 362 | * Emacs will notice this stuff at the end of the file and automatically | ||
| 363 | * adjust the settings for this buffer only. This must remain at the end | ||
| 364 | * of the file. | ||
| 365 | * --------------------------------------------------------------------------- | ||
| 366 | * Local variables: | ||
| 367 | * c-file-style: "linux" | ||
| 368 | * End: | ||
| 369 | */ | ||
diff --git a/arch/um/kernel/sysrq.c b/arch/um/kernel/sysrq.c index e630438f9e73..f80850091e79 100644 --- a/arch/um/kernel/sysrq.c +++ b/arch/um/kernel/sysrq.c | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | * Licensed under the GPL | 3 | * Licensed under the GPL |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | #include "linux/config.h" | ||
| 6 | #include "linux/sched.h" | 7 | #include "linux/sched.h" |
| 7 | #include "linux/kernel.h" | 8 | #include "linux/kernel.h" |
| 8 | #include "linux/module.h" | 9 | #include "linux/module.h" |
| @@ -12,14 +13,14 @@ | |||
| 12 | #include "sysrq.h" | 13 | #include "sysrq.h" |
| 13 | #include "user_util.h" | 14 | #include "user_util.h" |
| 14 | 15 | ||
| 15 | void show_trace(unsigned long * stack) | 16 | /* Catch non-i386 SUBARCH's. */ |
| 17 | #if !defined(CONFIG_UML_X86) || defined(CONFIG_64BIT) | ||
| 18 | void show_trace(struct task_struct *task, unsigned long * stack) | ||
| 16 | { | 19 | { |
| 17 | /* XXX: Copy the CONFIG_FRAME_POINTER stack-walking backtrace from | ||
| 18 | * arch/i386/kernel/traps.c, and then move this to sys-i386/sysrq.c.*/ | ||
| 19 | unsigned long addr; | 20 | unsigned long addr; |
| 20 | 21 | ||
| 21 | if (!stack) { | 22 | if (!stack) { |
| 22 | stack = (unsigned long*) &stack; | 23 | stack = (unsigned long*) &stack; |
| 23 | WARN_ON(1); | 24 | WARN_ON(1); |
| 24 | } | 25 | } |
| 25 | 26 | ||
| @@ -35,6 +36,7 @@ void show_trace(unsigned long * stack) | |||
| 35 | } | 36 | } |
| 36 | printk("\n"); | 37 | printk("\n"); |
| 37 | } | 38 | } |
| 39 | #endif | ||
| 38 | 40 | ||
| 39 | /* | 41 | /* |
| 40 | * stack dumps generator - this is used by arch-independent code. | 42 | * stack dumps generator - this is used by arch-independent code. |
| @@ -44,7 +46,7 @@ void dump_stack(void) | |||
| 44 | { | 46 | { |
| 45 | unsigned long stack; | 47 | unsigned long stack; |
| 46 | 48 | ||
| 47 | show_trace(&stack); | 49 | show_trace(current, &stack); |
| 48 | } | 50 | } |
| 49 | EXPORT_SYMBOL(dump_stack); | 51 | EXPORT_SYMBOL(dump_stack); |
| 50 | 52 | ||
| @@ -59,7 +61,11 @@ void show_stack(struct task_struct *task, unsigned long *esp) | |||
| 59 | int i; | 61 | int i; |
| 60 | 62 | ||
| 61 | if (esp == NULL) { | 63 | if (esp == NULL) { |
| 62 | if (task != current) { | 64 | if (task != current && task != NULL) { |
| 65 | /* XXX: Isn't this bogus? I.e. isn't this the | ||
| 66 | * *userspace* stack of this task? If not so, use this | ||
| 67 | * even when task == current (as in i386). | ||
| 68 | */ | ||
| 63 | esp = (unsigned long *) KSTK_ESP(task); | 69 | esp = (unsigned long *) KSTK_ESP(task); |
| 64 | /* Which one? No actual difference - just coding style.*/ | 70 | /* Which one? No actual difference - just coding style.*/ |
| 65 | //esp = (unsigned long *) PT_REGS_IP(&task->thread.regs); | 71 | //esp = (unsigned long *) PT_REGS_IP(&task->thread.regs); |
| @@ -77,5 +83,6 @@ void show_stack(struct task_struct *task, unsigned long *esp) | |||
| 77 | printk("%08lx ", *stack++); | 83 | printk("%08lx ", *stack++); |
| 78 | } | 84 | } |
| 79 | 85 | ||
| 80 | show_trace(esp); | 86 | printk("Call Trace: \n"); |
| 87 | show_trace(current, esp); | ||
| 81 | } | 88 | } |
diff --git a/arch/um/kernel/trap_kern.c b/arch/um/kernel/trap_kern.c index 5fca2c61eb98..c20aef120598 100644 --- a/arch/um/kernel/trap_kern.c +++ b/arch/um/kernel/trap_kern.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | #include "kern.h" | 23 | #include "kern.h" |
| 24 | #include "chan_kern.h" | 24 | #include "chan_kern.h" |
| 25 | #include "mconsole_kern.h" | 25 | #include "mconsole_kern.h" |
| 26 | #include "2_5compat.h" | ||
| 27 | #include "mem.h" | 26 | #include "mem.h" |
| 28 | #include "mem_kern.h" | 27 | #include "mem_kern.h" |
| 29 | 28 | ||
| @@ -57,10 +56,11 @@ int handle_page_fault(unsigned long address, unsigned long ip, | |||
| 57 | *code_out = SEGV_ACCERR; | 56 | *code_out = SEGV_ACCERR; |
| 58 | if(is_write && !(vma->vm_flags & VM_WRITE)) | 57 | if(is_write && !(vma->vm_flags & VM_WRITE)) |
| 59 | goto out; | 58 | goto out; |
| 59 | |||
| 60 | if(!(vma->vm_flags & (VM_READ | VM_EXEC))) | ||
| 61 | goto out; | ||
| 62 | |||
| 60 | page = address & PAGE_MASK; | 63 | page = address & PAGE_MASK; |
| 61 | pgd = pgd_offset(mm, page); | ||
| 62 | pud = pud_offset(pgd, page); | ||
| 63 | pmd = pmd_offset(pud, page); | ||
| 64 | do { | 64 | do { |
| 65 | survive: | 65 | survive: |
| 66 | switch (handle_mm_fault(mm, vma, address, is_write)){ | 66 | switch (handle_mm_fault(mm, vma, address, is_write)){ |
| @@ -106,33 +106,6 @@ out_of_memory: | |||
| 106 | goto out; | 106 | goto out; |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | LIST_HEAD(physmem_remappers); | ||
| 110 | |||
| 111 | void register_remapper(struct remapper *info) | ||
| 112 | { | ||
| 113 | list_add(&info->list, &physmem_remappers); | ||
| 114 | } | ||
| 115 | |||
| 116 | static int check_remapped_addr(unsigned long address, int is_write) | ||
| 117 | { | ||
| 118 | struct remapper *remapper; | ||
| 119 | struct list_head *ele; | ||
| 120 | __u64 offset; | ||
| 121 | int fd; | ||
| 122 | |||
| 123 | fd = phys_mapping(__pa(address), &offset); | ||
| 124 | if(fd == -1) | ||
| 125 | return(0); | ||
| 126 | |||
| 127 | list_for_each(ele, &physmem_remappers){ | ||
| 128 | remapper = list_entry(ele, struct remapper, list); | ||
| 129 | if((*remapper->proc)(fd, address, is_write, offset)) | ||
| 130 | return(1); | ||
| 131 | } | ||
| 132 | |||
| 133 | return(0); | ||
| 134 | } | ||
| 135 | |||
| 136 | /* | 109 | /* |
| 137 | * We give a *copy* of the faultinfo in the regs to segv. | 110 | * We give a *copy* of the faultinfo in the regs to segv. |
| 138 | * This must be done, since nesting SEGVs could overwrite | 111 | * This must be done, since nesting SEGVs could overwrite |
| @@ -151,8 +124,6 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc) | |||
| 151 | flush_tlb_kernel_vm(); | 124 | flush_tlb_kernel_vm(); |
| 152 | return(0); | 125 | return(0); |
| 153 | } | 126 | } |
| 154 | else if(check_remapped_addr(address & PAGE_MASK, is_write)) | ||
| 155 | return(0); | ||
| 156 | else if(current->mm == NULL) | 127 | else if(current->mm == NULL) |
| 157 | panic("Segfault with no mm"); | 128 | panic("Segfault with no mm"); |
| 158 | err = handle_page_fault(address, ip, is_write, is_user, &si.si_code); | 129 | err = handle_page_fault(address, ip, is_write, is_user, &si.si_code); |
diff --git a/arch/um/kernel/tt/ksyms.c b/arch/um/kernel/tt/ksyms.c index 92ec85d67c7c..84a9385a8fef 100644 --- a/arch/um/kernel/tt/ksyms.c +++ b/arch/um/kernel/tt/ksyms.c | |||
| @@ -12,6 +12,7 @@ EXPORT_SYMBOL(__do_copy_to_user); | |||
| 12 | EXPORT_SYMBOL(__do_strncpy_from_user); | 12 | EXPORT_SYMBOL(__do_strncpy_from_user); |
| 13 | EXPORT_SYMBOL(__do_strnlen_user); | 13 | EXPORT_SYMBOL(__do_strnlen_user); |
| 14 | EXPORT_SYMBOL(__do_clear_user); | 14 | EXPORT_SYMBOL(__do_clear_user); |
| 15 | EXPORT_SYMBOL(clear_user_tt); | ||
| 15 | 16 | ||
| 16 | EXPORT_SYMBOL(tracing_pid); | 17 | EXPORT_SYMBOL(tracing_pid); |
| 17 | EXPORT_SYMBOL(honeypot); | 18 | EXPORT_SYMBOL(honeypot); |
diff --git a/arch/um/kernel/tt/process_kern.c b/arch/um/kernel/tt/process_kern.c index df810ca8fc12..776310fd5b8b 100644 --- a/arch/um/kernel/tt/process_kern.c +++ b/arch/um/kernel/tt/process_kern.c | |||
| @@ -32,10 +32,6 @@ void *switch_to_tt(void *prev, void *next, void *last) | |||
| 32 | unsigned long flags; | 32 | unsigned long flags; |
| 33 | int err, vtalrm, alrm, prof, cpu; | 33 | int err, vtalrm, alrm, prof, cpu; |
| 34 | char c; | 34 | char c; |
| 35 | /* jailing and SMP are incompatible, so this doesn't need to be | ||
| 36 | * made per-cpu | ||
| 37 | */ | ||
| 38 | static int reading; | ||
| 39 | 35 | ||
| 40 | from = prev; | 36 | from = prev; |
| 41 | to = next; | 37 | to = next; |
| @@ -59,13 +55,11 @@ void *switch_to_tt(void *prev, void *next, void *last) | |||
| 59 | c = 0; | 55 | c = 0; |
| 60 | set_current(to); | 56 | set_current(to); |
| 61 | 57 | ||
| 62 | reading = 0; | ||
| 63 | err = os_write_file(to->thread.mode.tt.switch_pipe[1], &c, sizeof(c)); | 58 | err = os_write_file(to->thread.mode.tt.switch_pipe[1], &c, sizeof(c)); |
| 64 | if(err != sizeof(c)) | 59 | if(err != sizeof(c)) |
| 65 | panic("write of switch_pipe failed, err = %d", -err); | 60 | panic("write of switch_pipe failed, err = %d", -err); |
| 66 | 61 | ||
| 67 | reading = 1; | 62 | if(from->thread.mode.tt.switch_pipe[0] == -1) |
| 68 | if(from->thread.mode.tt.switch_pipe[0] == -1) | ||
| 69 | os_kill_process(os_getpid(), 0); | 63 | os_kill_process(os_getpid(), 0); |
| 70 | 64 | ||
| 71 | err = os_read_file(from->thread.mode.tt.switch_pipe[0], &c, sizeof(c)); | 65 | err = os_read_file(from->thread.mode.tt.switch_pipe[0], &c, sizeof(c)); |
diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c index 4d10ec372a67..418427107b29 100644 --- a/arch/um/kernel/um_arch.c +++ b/arch/um/kernel/um_arch.c | |||
| @@ -111,12 +111,6 @@ struct seq_operations cpuinfo_op = { | |||
| 111 | .show = show_cpuinfo, | 111 | .show = show_cpuinfo, |
| 112 | }; | 112 | }; |
| 113 | 113 | ||
| 114 | pte_t * __bad_pagetable(void) | ||
| 115 | { | ||
| 116 | panic("Someone should implement __bad_pagetable"); | ||
| 117 | return(NULL); | ||
| 118 | } | ||
| 119 | |||
| 120 | /* Set in linux_main */ | 114 | /* Set in linux_main */ |
| 121 | unsigned long host_task_size; | 115 | unsigned long host_task_size; |
| 122 | unsigned long task_size; | 116 | unsigned long task_size; |
diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S index 76eadb309189..dd5355500bdc 100644 --- a/arch/um/kernel/uml.lds.S +++ b/arch/um/kernel/uml.lds.S | |||
| @@ -73,6 +73,8 @@ SECTIONS | |||
| 73 | 73 | ||
| 74 | .got : { *(.got.plt) *(.got) } | 74 | .got : { *(.got.plt) *(.got) } |
| 75 | .dynamic : { *(.dynamic) } | 75 | .dynamic : { *(.dynamic) } |
| 76 | .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } | ||
| 77 | .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } | ||
| 76 | /* We want the small data sections together, so single-instruction offsets | 78 | /* We want the small data sections together, so single-instruction offsets |
| 77 | can access them all, and initialized data all before uninitialized, so | 79 | can access them all, and initialized data all before uninitialized, so |
| 78 | we can shorten the on-disk segment size. */ | 80 | we can shorten the on-disk segment size. */ |
