diff options
Diffstat (limited to 'arch/um/kernel')
-rw-r--r-- | arch/um/kernel/Makefile | 2 | ||||
-rw-r--r-- | arch/um/kernel/exec.c | 2 | ||||
-rw-r--r-- | arch/um/kernel/irq.c | 7 | ||||
-rw-r--r-- | arch/um/kernel/mem.c | 90 | ||||
-rw-r--r-- | arch/um/kernel/physmem.c | 74 | ||||
-rw-r--r-- | arch/um/kernel/ptrace.c | 7 | ||||
-rw-r--r-- | arch/um/kernel/resource.c | 23 | ||||
-rw-r--r-- | arch/um/kernel/sigio.c | 7 | ||||
-rw-r--r-- | arch/um/kernel/skas/mem.c | 6 | ||||
-rw-r--r-- | arch/um/kernel/syscall.c | 16 | ||||
-rw-r--r-- | arch/um/kernel/sysrq.c | 2 | ||||
-rw-r--r-- | arch/um/kernel/time.c | 24 | ||||
-rw-r--r-- | arch/um/kernel/trap.c | 28 | ||||
-rw-r--r-- | arch/um/kernel/tt/gdb.c | 4 | ||||
-rw-r--r-- | arch/um/kernel/tt/gdb_kern.c | 5 | ||||
-rw-r--r-- | arch/um/kernel/um_arch.c | 9 | ||||
-rw-r--r-- | arch/um/kernel/umid.c | 4 |
17 files changed, 132 insertions, 178 deletions
diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile index 6fa63a2a89e3..c5cf4a0827b0 100644 --- a/arch/um/kernel/Makefile +++ b/arch/um/kernel/Makefile | |||
@@ -7,7 +7,7 @@ extra-y := vmlinux.lds | |||
7 | clean-files := | 7 | clean-files := |
8 | 8 | ||
9 | obj-y = config.o exec.o exitcode.o init_task.o irq.o ksyms.o mem.o \ | 9 | obj-y = config.o exec.o exitcode.o init_task.o irq.o ksyms.o mem.o \ |
10 | physmem.o process.o ptrace.o reboot.o resource.o sigio.o \ | 10 | physmem.o process.o ptrace.o reboot.o sigio.o \ |
11 | signal.o smp.o syscall.o sysrq.o time.o tlb.o trap.o uaccess.o \ | 11 | signal.o smp.o syscall.o sysrq.o time.o tlb.o trap.o uaccess.o \ |
12 | um_arch.o umid.o | 12 | um_arch.o umid.o |
13 | 13 | ||
diff --git a/arch/um/kernel/exec.c b/arch/um/kernel/exec.c index 8d56ec6cca79..121166400e25 100644 --- a/arch/um/kernel/exec.c +++ b/arch/um/kernel/exec.c | |||
@@ -39,9 +39,9 @@ static long execve1(char *file, char __user * __user *argv, | |||
39 | char __user *__user *env) | 39 | char __user *__user *env) |
40 | { | 40 | { |
41 | long error; | 41 | long error; |
42 | #ifdef CONFIG_TTY_LOG | ||
42 | struct tty_struct *tty; | 43 | struct tty_struct *tty; |
43 | 44 | ||
44 | #ifdef CONFIG_TTY_LOG | ||
45 | mutex_lock(&tty_mutex); | 45 | mutex_lock(&tty_mutex); |
46 | tty = get_current_tty(); | 46 | tty = get_current_tty(); |
47 | if (tty) | 47 | if (tty) |
diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c index 5c1e611f628d..50a288bb875a 100644 --- a/arch/um/kernel/irq.c +++ b/arch/um/kernel/irq.c | |||
@@ -79,7 +79,7 @@ skip: | |||
79 | return 0; | 79 | return 0; |
80 | } | 80 | } |
81 | 81 | ||
82 | struct irq_fd *active_fds = NULL; | 82 | static struct irq_fd *active_fds = NULL; |
83 | static struct irq_fd **last_irq_ptr = &active_fds; | 83 | static struct irq_fd **last_irq_ptr = &active_fds; |
84 | 84 | ||
85 | extern void free_irqs(void); | 85 | extern void free_irqs(void); |
@@ -124,8 +124,8 @@ int activate_fd(int irq, int fd, int type, void *dev_id) | |||
124 | if (err < 0) | 124 | if (err < 0) |
125 | goto out; | 125 | goto out; |
126 | 126 | ||
127 | new_fd = um_kmalloc(sizeof(*new_fd)); | ||
128 | err = -ENOMEM; | 127 | err = -ENOMEM; |
128 | new_fd = kmalloc(sizeof(struct irq_fd), GFP_KERNEL); | ||
129 | if (new_fd == NULL) | 129 | if (new_fd == NULL) |
130 | goto out; | 130 | goto out; |
131 | 131 | ||
@@ -176,9 +176,8 @@ int activate_fd(int irq, int fd, int type, void *dev_id) | |||
176 | */ | 176 | */ |
177 | spin_unlock_irqrestore(&irq_lock, flags); | 177 | spin_unlock_irqrestore(&irq_lock, flags); |
178 | kfree(tmp_pfd); | 178 | kfree(tmp_pfd); |
179 | tmp_pfd = NULL; | ||
180 | 179 | ||
181 | tmp_pfd = um_kmalloc(n); | 180 | tmp_pfd = kmalloc(n, GFP_KERNEL); |
182 | if (tmp_pfd == NULL) | 181 | if (tmp_pfd == NULL) |
183 | goto out_kfree; | 182 | goto out_kfree; |
184 | 183 | ||
diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c index c95855ba6ab5..e85d65deea0d 100644 --- a/arch/um/kernel/mem.c +++ b/arch/um/kernel/mem.c | |||
@@ -24,8 +24,9 @@ | |||
24 | #include "init.h" | 24 | #include "init.h" |
25 | #include "kern_constants.h" | 25 | #include "kern_constants.h" |
26 | 26 | ||
27 | /* Changed during early boot */ | 27 | /* allocated in paging_init, zeroed in mem_init, and unchanged thereafter */ |
28 | unsigned long *empty_zero_page = NULL; | 28 | unsigned long *empty_zero_page = NULL; |
29 | /* allocated in paging_init and unchanged thereafter */ | ||
29 | unsigned long *empty_bad_page = NULL; | 30 | unsigned long *empty_bad_page = NULL; |
30 | pgd_t swapper_pg_dir[PTRS_PER_PGD]; | 31 | pgd_t swapper_pg_dir[PTRS_PER_PGD]; |
31 | unsigned long long highmem; | 32 | unsigned long long highmem; |
@@ -65,8 +66,8 @@ void mem_init(void) | |||
65 | { | 66 | { |
66 | max_low_pfn = (high_physmem - uml_physmem) >> PAGE_SHIFT; | 67 | max_low_pfn = (high_physmem - uml_physmem) >> PAGE_SHIFT; |
67 | 68 | ||
68 | /* clear the zero-page */ | 69 | /* clear the zero-page */ |
69 | memset((void *) empty_zero_page, 0, PAGE_SIZE); | 70 | memset((void *) empty_zero_page, 0, PAGE_SIZE); |
70 | 71 | ||
71 | /* Map in the area just after the brk now that kmalloc is about | 72 | /* Map in the area just after the brk now that kmalloc is about |
72 | * to be turned on. | 73 | * to be turned on. |
@@ -253,8 +254,10 @@ struct page *arch_validate(struct page *page, gfp_t mask, int order) | |||
253 | int i; | 254 | int i; |
254 | 255 | ||
255 | again: | 256 | again: |
256 | if(page == NULL) return(page); | 257 | if(page == NULL) |
257 | if(PageHighMem(page)) return(page); | 258 | return page; |
259 | if(PageHighMem(page)) | ||
260 | return page; | ||
258 | 261 | ||
259 | addr = (unsigned long) page_address(page); | 262 | addr = (unsigned long) page_address(page); |
260 | for(i = 0; i < (1 << order); i++){ | 263 | for(i = 0; i < (1 << order); i++){ |
@@ -263,13 +266,15 @@ struct page *arch_validate(struct page *page, gfp_t mask, int order) | |||
263 | sizeof(zero), | 266 | sizeof(zero), |
264 | ¤t->thread.fault_addr, | 267 | ¤t->thread.fault_addr, |
265 | ¤t->thread.fault_catcher)){ | 268 | ¤t->thread.fault_catcher)){ |
266 | if(!(mask & __GFP_WAIT)) return(NULL); | 269 | if(!(mask & __GFP_WAIT)) |
270 | return NULL; | ||
267 | else break; | 271 | else break; |
268 | } | 272 | } |
269 | addr += PAGE_SIZE; | 273 | addr += PAGE_SIZE; |
270 | } | 274 | } |
271 | 275 | ||
272 | if(i == (1 << order)) return(page); | 276 | if(i == (1 << order)) |
277 | return page; | ||
273 | page = alloc_pages(mask, order); | 278 | page = alloc_pages(mask, order); |
274 | goto again; | 279 | goto again; |
275 | } | 280 | } |
@@ -283,7 +288,6 @@ void free_initmem(void) | |||
283 | } | 288 | } |
284 | 289 | ||
285 | #ifdef CONFIG_BLK_DEV_INITRD | 290 | #ifdef CONFIG_BLK_DEV_INITRD |
286 | |||
287 | void free_initrd_mem(unsigned long start, unsigned long end) | 291 | void free_initrd_mem(unsigned long start, unsigned long end) |
288 | { | 292 | { |
289 | if (start < end) | 293 | if (start < end) |
@@ -296,37 +300,36 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
296 | totalram_pages++; | 300 | totalram_pages++; |
297 | } | 301 | } |
298 | } | 302 | } |
299 | |||
300 | #endif | 303 | #endif |
301 | 304 | ||
302 | void show_mem(void) | 305 | void show_mem(void) |
303 | { | 306 | { |
304 | int pfn, total = 0, reserved = 0; | 307 | int pfn, total = 0, reserved = 0; |
305 | int shared = 0, cached = 0; | 308 | int shared = 0, cached = 0; |
306 | int highmem = 0; | 309 | int highmem = 0; |
307 | struct page *page; | 310 | struct page *page; |
308 | 311 | ||
309 | printk("Mem-info:\n"); | 312 | printk("Mem-info:\n"); |
310 | show_free_areas(); | 313 | show_free_areas(); |
311 | printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); | 314 | printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); |
312 | pfn = max_mapnr; | 315 | pfn = max_mapnr; |
313 | while(pfn-- > 0) { | 316 | while(pfn-- > 0) { |
314 | page = pfn_to_page(pfn); | 317 | page = pfn_to_page(pfn); |
315 | total++; | 318 | total++; |
316 | if(PageHighMem(page)) | 319 | if(PageHighMem(page)) |
317 | highmem++; | 320 | highmem++; |
318 | if(PageReserved(page)) | 321 | if(PageReserved(page)) |
319 | reserved++; | 322 | reserved++; |
320 | else if(PageSwapCache(page)) | 323 | else if(PageSwapCache(page)) |
321 | cached++; | 324 | cached++; |
322 | else if(page_count(page)) | 325 | else if(page_count(page)) |
323 | shared += page_count(page) - 1; | 326 | shared += page_count(page) - 1; |
324 | } | 327 | } |
325 | printk("%d pages of RAM\n", total); | 328 | printk("%d pages of RAM\n", total); |
326 | printk("%d pages of HIGHMEM\n", highmem); | 329 | printk("%d pages of HIGHMEM\n", highmem); |
327 | printk("%d reserved pages\n", reserved); | 330 | printk("%d reserved pages\n", reserved); |
328 | printk("%d pages shared\n", shared); | 331 | printk("%d pages shared\n", shared); |
329 | printk("%d pages swap cached\n", cached); | 332 | printk("%d pages swap cached\n", cached); |
330 | } | 333 | } |
331 | 334 | ||
332 | /* | 335 | /* |
@@ -362,28 +365,7 @@ pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) | |||
362 | struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) | 365 | struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) |
363 | { | 366 | { |
364 | struct page *pte; | 367 | struct page *pte; |
365 | 368 | ||
366 | pte = alloc_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO); | 369 | pte = alloc_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO); |
367 | return pte; | 370 | return pte; |
368 | } | 371 | } |
369 | |||
370 | struct iomem_region *iomem_regions = NULL; | ||
371 | int iomem_size = 0; | ||
372 | |||
373 | extern int parse_iomem(char *str, int *add) __init; | ||
374 | |||
375 | __uml_setup("iomem=", parse_iomem, | ||
376 | "iomem=<name>,<file>\n" | ||
377 | " Configure <file> as an IO memory region named <name>.\n\n" | ||
378 | ); | ||
379 | |||
380 | /* | ||
381 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
382 | * Emacs will notice this stuff at the end of the file and automatically | ||
383 | * adjust the settings for this buffer only. This must remain at the end | ||
384 | * of the file. | ||
385 | * --------------------------------------------------------------------------- | ||
386 | * Local variables: | ||
387 | * c-file-style: "linux" | ||
388 | * End: | ||
389 | */ | ||
diff --git a/arch/um/kernel/physmem.c b/arch/um/kernel/physmem.c index abafa64b8727..638f3b5f6094 100644 --- a/arch/um/kernel/physmem.c +++ b/arch/um/kernel/physmem.c | |||
@@ -40,7 +40,7 @@ static struct rb_node **find_rb(void *virt) | |||
40 | while(*n != NULL){ | 40 | while(*n != NULL){ |
41 | d = rb_entry(*n, struct phys_desc, rb); | 41 | d = rb_entry(*n, struct phys_desc, rb); |
42 | if(d->virt == virt) | 42 | if(d->virt == virt) |
43 | return(n); | 43 | return n; |
44 | 44 | ||
45 | if(d->virt > virt) | 45 | if(d->virt > virt) |
46 | n = &(*n)->rb_left; | 46 | n = &(*n)->rb_left; |
@@ -48,7 +48,7 @@ static struct rb_node **find_rb(void *virt) | |||
48 | n = &(*n)->rb_right; | 48 | n = &(*n)->rb_right; |
49 | } | 49 | } |
50 | 50 | ||
51 | return(n); | 51 | return n; |
52 | } | 52 | } |
53 | 53 | ||
54 | static struct phys_desc *find_phys_mapping(void *virt) | 54 | static struct phys_desc *find_phys_mapping(void *virt) |
@@ -56,9 +56,9 @@ static struct phys_desc *find_phys_mapping(void *virt) | |||
56 | struct rb_node **n = find_rb(virt); | 56 | struct rb_node **n = find_rb(virt); |
57 | 57 | ||
58 | if(*n == NULL) | 58 | if(*n == NULL) |
59 | return(NULL); | 59 | return NULL; |
60 | 60 | ||
61 | return(rb_entry(*n, struct phys_desc, rb)); | 61 | return rb_entry(*n, struct phys_desc, rb); |
62 | } | 62 | } |
63 | 63 | ||
64 | static void insert_phys_mapping(struct phys_desc *desc) | 64 | static void insert_phys_mapping(struct phys_desc *desc) |
@@ -89,10 +89,10 @@ static struct desc_mapping *find_mapping(int fd) | |||
89 | list_for_each(ele, &descriptor_mappings){ | 89 | list_for_each(ele, &descriptor_mappings){ |
90 | desc = list_entry(ele, struct desc_mapping, list); | 90 | desc = list_entry(ele, struct desc_mapping, list); |
91 | if(desc->fd == fd) | 91 | if(desc->fd == fd) |
92 | return(desc); | 92 | return desc; |
93 | } | 93 | } |
94 | 94 | ||
95 | return(NULL); | 95 | return NULL; |
96 | } | 96 | } |
97 | 97 | ||
98 | static struct desc_mapping *descriptor_mapping(int fd) | 98 | static struct desc_mapping *descriptor_mapping(int fd) |
@@ -101,11 +101,11 @@ static struct desc_mapping *descriptor_mapping(int fd) | |||
101 | 101 | ||
102 | desc = find_mapping(fd); | 102 | desc = find_mapping(fd); |
103 | if(desc != NULL) | 103 | if(desc != NULL) |
104 | return(desc); | 104 | return desc; |
105 | 105 | ||
106 | desc = kmalloc(sizeof(*desc), GFP_ATOMIC); | 106 | desc = kmalloc(sizeof(*desc), GFP_ATOMIC); |
107 | if(desc == NULL) | 107 | if(desc == NULL) |
108 | return(NULL); | 108 | return NULL; |
109 | 109 | ||
110 | *desc = ((struct desc_mapping) | 110 | *desc = ((struct desc_mapping) |
111 | { .fd = fd, | 111 | { .fd = fd, |
@@ -113,7 +113,7 @@ static struct desc_mapping *descriptor_mapping(int fd) | |||
113 | .pages = LIST_HEAD_INIT(desc->pages) }); | 113 | .pages = LIST_HEAD_INIT(desc->pages) }); |
114 | list_add(&desc->list, &descriptor_mappings); | 114 | list_add(&desc->list, &descriptor_mappings); |
115 | 115 | ||
116 | return(desc); | 116 | return desc; |
117 | } | 117 | } |
118 | 118 | ||
119 | int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w) | 119 | int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w) |
@@ -125,11 +125,11 @@ int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w) | |||
125 | 125 | ||
126 | fd_maps = descriptor_mapping(fd); | 126 | fd_maps = descriptor_mapping(fd); |
127 | if(fd_maps == NULL) | 127 | if(fd_maps == NULL) |
128 | return(-ENOMEM); | 128 | return -ENOMEM; |
129 | 129 | ||
130 | phys = __pa(virt); | 130 | phys = __pa(virt); |
131 | desc = find_phys_mapping(virt); | 131 | desc = find_phys_mapping(virt); |
132 | if(desc != NULL) | 132 | if(desc != NULL) |
133 | panic("Address 0x%p is already substituted\n", virt); | 133 | panic("Address 0x%p is already substituted\n", virt); |
134 | 134 | ||
135 | err = -ENOMEM; | 135 | err = -ENOMEM; |
@@ -155,7 +155,7 @@ int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w) | |||
155 | rb_erase(&desc->rb, &phys_mappings); | 155 | rb_erase(&desc->rb, &phys_mappings); |
156 | kfree(desc); | 156 | kfree(desc); |
157 | out: | 157 | out: |
158 | return(err); | 158 | return err; |
159 | } | 159 | } |
160 | 160 | ||
161 | static int physmem_fd = -1; | 161 | static int physmem_fd = -1; |
@@ -182,10 +182,10 @@ int physmem_remove_mapping(void *virt) | |||
182 | virt = (void *) ((unsigned long) virt & PAGE_MASK); | 182 | virt = (void *) ((unsigned long) virt & PAGE_MASK); |
183 | desc = find_phys_mapping(virt); | 183 | desc = find_phys_mapping(virt); |
184 | if(desc == NULL) | 184 | if(desc == NULL) |
185 | return(0); | 185 | return 0; |
186 | 186 | ||
187 | remove_mapping(desc); | 187 | remove_mapping(desc); |
188 | return(1); | 188 | return 1; |
189 | } | 189 | } |
190 | 190 | ||
191 | void physmem_forget_descriptor(int fd) | 191 | void physmem_forget_descriptor(int fd) |
@@ -239,9 +239,9 @@ void arch_free_page(struct page *page, int order) | |||
239 | 239 | ||
240 | int is_remapped(void *virt) | 240 | int is_remapped(void *virt) |
241 | { | 241 | { |
242 | struct phys_desc *desc = find_phys_mapping(virt); | 242 | struct phys_desc *desc = find_phys_mapping(virt); |
243 | 243 | ||
244 | return(desc != NULL); | 244 | return desc != NULL; |
245 | } | 245 | } |
246 | 246 | ||
247 | /* Changed during early boot */ | 247 | /* Changed during early boot */ |
@@ -276,7 +276,7 @@ int init_maps(unsigned long physmem, unsigned long iomem, unsigned long highmem) | |||
276 | else map = alloc_bootmem_low_pages(total_len); | 276 | else map = alloc_bootmem_low_pages(total_len); |
277 | 277 | ||
278 | if(map == NULL) | 278 | if(map == NULL) |
279 | return(-ENOMEM); | 279 | return -ENOMEM; |
280 | 280 | ||
281 | for(i = 0; i < total_pages; i++){ | 281 | for(i = 0; i < total_pages; i++){ |
282 | p = &map[i]; | 282 | p = &map[i]; |
@@ -286,7 +286,7 @@ int init_maps(unsigned long physmem, unsigned long iomem, unsigned long highmem) | |||
286 | } | 286 | } |
287 | 287 | ||
288 | max_mapnr = total_pages; | 288 | max_mapnr = total_pages; |
289 | return(0); | 289 | return 0; |
290 | } | 290 | } |
291 | 291 | ||
292 | /* Changed during early boot */ | 292 | /* Changed during early boot */ |
@@ -296,7 +296,7 @@ unsigned long get_kmem_end(void) | |||
296 | { | 296 | { |
297 | if(kmem_top == 0) | 297 | if(kmem_top == 0) |
298 | kmem_top = CHOOSE_MODE(kmem_end_tt, kmem_end_skas); | 298 | kmem_top = CHOOSE_MODE(kmem_end_tt, kmem_end_skas); |
299 | return(kmem_top); | 299 | return kmem_top; |
300 | } | 300 | } |
301 | 301 | ||
302 | void map_memory(unsigned long virt, unsigned long phys, unsigned long len, | 302 | void map_memory(unsigned long virt, unsigned long phys, unsigned long len, |
@@ -379,7 +379,7 @@ int phys_mapping(unsigned long phys, __u64 *offset_out) | |||
379 | *offset_out = phys - iomem_size; | 379 | *offset_out = phys - iomem_size; |
380 | } | 380 | } |
381 | 381 | ||
382 | return(fd); | 382 | return fd; |
383 | } | 383 | } |
384 | 384 | ||
385 | static int __init uml_mem_setup(char *line, int *add) | 385 | static int __init uml_mem_setup(char *line, int *add) |
@@ -398,6 +398,23 @@ __uml_setup("mem=", uml_mem_setup, | |||
398 | " Example: mem=64M\n\n" | 398 | " Example: mem=64M\n\n" |
399 | ); | 399 | ); |
400 | 400 | ||
401 | extern int __init parse_iomem(char *str, int *add); | ||
402 | |||
403 | __uml_setup("iomem=", parse_iomem, | ||
404 | "iomem=<name>,<file>\n" | ||
405 | " Configure <file> as an IO memory region named <name>.\n\n" | ||
406 | ); | ||
407 | |||
408 | /* | ||
409 | * This list is constructed in parse_iomem and addresses filled in in | ||
410 | * setup_iomem, both of which run during early boot. Afterwards, it's | ||
411 | * unchanged. | ||
412 | */ | ||
413 | struct iomem_region *iomem_regions = NULL; | ||
414 | |||
415 | /* Initialized in parse_iomem */ | ||
416 | int iomem_size = 0; | ||
417 | |||
401 | unsigned long find_iomem(char *driver, unsigned long *len_out) | 418 | unsigned long find_iomem(char *driver, unsigned long *len_out) |
402 | { | 419 | { |
403 | struct iomem_region *region = iomem_regions; | 420 | struct iomem_region *region = iomem_regions; |
@@ -405,13 +422,13 @@ unsigned long find_iomem(char *driver, unsigned long *len_out) | |||
405 | while(region != NULL){ | 422 | while(region != NULL){ |
406 | if(!strcmp(region->driver, driver)){ | 423 | if(!strcmp(region->driver, driver)){ |
407 | *len_out = region->size; | 424 | *len_out = region->size; |
408 | return(region->virt); | 425 | return region->virt; |
409 | } | 426 | } |
410 | 427 | ||
411 | region = region->next; | 428 | region = region->next; |
412 | } | 429 | } |
413 | 430 | ||
414 | return(0); | 431 | return 0; |
415 | } | 432 | } |
416 | 433 | ||
417 | int setup_iomem(void) | 434 | int setup_iomem(void) |
@@ -435,18 +452,7 @@ int setup_iomem(void) | |||
435 | region = region->next; | 452 | region = region->next; |
436 | } | 453 | } |
437 | 454 | ||
438 | return(0); | 455 | return 0; |
439 | } | 456 | } |
440 | 457 | ||
441 | __initcall(setup_iomem); | 458 | __initcall(setup_iomem); |
442 | |||
443 | /* | ||
444 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
445 | * Emacs will notice this stuff at the end of the file and automatically | ||
446 | * adjust the settings for this buffer only. This must remain at the end | ||
447 | * of the file. | ||
448 | * --------------------------------------------------------------------------- | ||
449 | * Local variables: | ||
450 | * c-file-style: "linux" | ||
451 | * End: | ||
452 | */ | ||
diff --git a/arch/um/kernel/ptrace.c b/arch/um/kernel/ptrace.c index 9a77fb3c269d..627742d89434 100644 --- a/arch/um/kernel/ptrace.c +++ b/arch/um/kernel/ptrace.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include "kern_util.h" | 18 | #include "kern_util.h" |
19 | #include "skas_ptrace.h" | 19 | #include "skas_ptrace.h" |
20 | #include "sysdep/ptrace.h" | 20 | #include "sysdep/ptrace.h" |
21 | #include "os.h" | ||
21 | 22 | ||
22 | static inline void set_singlestepping(struct task_struct *child, int on) | 23 | static inline void set_singlestepping(struct task_struct *child, int on) |
23 | { | 24 | { |
@@ -241,6 +242,12 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
241 | break; | 242 | break; |
242 | } | 243 | } |
243 | #endif | 244 | #endif |
245 | #ifdef PTRACE_ARCH_PRCTL | ||
246 | case PTRACE_ARCH_PRCTL: | ||
247 | /* XXX Calls ptrace on the host - needs some SMP thinking */ | ||
248 | ret = arch_prctl_skas(child, data, (void *) addr); | ||
249 | break; | ||
250 | #endif | ||
244 | default: | 251 | default: |
245 | ret = ptrace_request(child, request, addr, data); | 252 | ret = ptrace_request(child, request, addr, data); |
246 | break; | 253 | break; |
diff --git a/arch/um/kernel/resource.c b/arch/um/kernel/resource.c deleted file mode 100644 index 32188e12e8af..000000000000 --- a/arch/um/kernel/resource.c +++ /dev/null | |||
@@ -1,23 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) | ||
3 | * Licensed under the GPL | ||
4 | */ | ||
5 | |||
6 | #include "linux/pci.h" | ||
7 | |||
8 | unsigned long resource_fixup(struct pci_dev * dev, struct resource * res, | ||
9 | unsigned long start, unsigned long size) | ||
10 | { | ||
11 | return start; | ||
12 | } | ||
13 | |||
14 | /* | ||
15 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
16 | * Emacs will notice this stuff at the end of the file and automatically | ||
17 | * adjust the settings for this buffer only. This must remain at the end | ||
18 | * of the file. | ||
19 | * --------------------------------------------------------------------------- | ||
20 | * Local variables: | ||
21 | * c-file-style: "linux" | ||
22 | * End: | ||
23 | */ | ||
diff --git a/arch/um/kernel/sigio.c b/arch/um/kernel/sigio.c index 2b0ab438301c..89f9866a1354 100644 --- a/arch/um/kernel/sigio.c +++ b/arch/um/kernel/sigio.c | |||
@@ -23,7 +23,7 @@ static irqreturn_t sigio_interrupt(int irq, void *data) | |||
23 | 23 | ||
24 | os_read_file(sigio_irq_fd, &c, sizeof(c)); | 24 | os_read_file(sigio_irq_fd, &c, sizeof(c)); |
25 | reactivate_fd(sigio_irq_fd, SIGIO_WRITE_IRQ); | 25 | reactivate_fd(sigio_irq_fd, SIGIO_WRITE_IRQ); |
26 | return(IRQ_HANDLED); | 26 | return IRQ_HANDLED; |
27 | } | 27 | } |
28 | 28 | ||
29 | int write_sigio_irq(int fd) | 29 | int write_sigio_irq(int fd) |
@@ -36,12 +36,13 @@ int write_sigio_irq(int fd) | |||
36 | if(err){ | 36 | if(err){ |
37 | printk("write_sigio_irq : um_request_irq failed, err = %d\n", | 37 | printk("write_sigio_irq : um_request_irq failed, err = %d\n", |
38 | err); | 38 | err); |
39 | return(-1); | 39 | return -1; |
40 | } | 40 | } |
41 | sigio_irq_fd = fd; | 41 | sigio_irq_fd = fd; |
42 | return(0); | 42 | return 0; |
43 | } | 43 | } |
44 | 44 | ||
45 | /* These are called from os-Linux/sigio.c to protect its pollfds arrays. */ | ||
45 | static DEFINE_SPINLOCK(sigio_spinlock); | 46 | static DEFINE_SPINLOCK(sigio_spinlock); |
46 | 47 | ||
47 | void sigio_lock(void) | 48 | void sigio_lock(void) |
diff --git a/arch/um/kernel/skas/mem.c b/arch/um/kernel/skas/mem.c index 0d2cce621134..7c18dfcd7d8e 100644 --- a/arch/um/kernel/skas/mem.c +++ b/arch/um/kernel/skas/mem.c | |||
@@ -14,13 +14,9 @@ unsigned long set_task_sizes_skas(unsigned long *task_size_out) | |||
14 | unsigned long host_task_size = ROUND_4M((unsigned long) | 14 | unsigned long host_task_size = ROUND_4M((unsigned long) |
15 | &host_task_size); | 15 | &host_task_size); |
16 | 16 | ||
17 | #ifdef CONFIG_HOST_TASK_SIZE | ||
18 | *host_size_out = ROUND_4M(CONFIG_HOST_TASK_SIZE); | ||
19 | *task_size_out = CONFIG_HOST_TASK_SIZE; | ||
20 | #else | ||
21 | if (!skas_needs_stub) | 17 | if (!skas_needs_stub) |
22 | *task_size_out = host_task_size; | 18 | *task_size_out = host_task_size; |
23 | else *task_size_out = CONFIG_STUB_START & PGDIR_MASK; | 19 | else *task_size_out = CONFIG_STUB_START & PGDIR_MASK; |
24 | #endif | 20 | |
25 | return host_task_size; | 21 | return host_task_size; |
26 | } | 22 | } |
diff --git a/arch/um/kernel/syscall.c b/arch/um/kernel/syscall.c index f5ed8624648b..2828c5283227 100644 --- a/arch/um/kernel/syscall.c +++ b/arch/um/kernel/syscall.c | |||
@@ -149,22 +149,6 @@ long sys_olduname(struct oldold_utsname __user * name) | |||
149 | return error; | 149 | return error; |
150 | } | 150 | } |
151 | 151 | ||
152 | DEFINE_SPINLOCK(syscall_lock); | ||
153 | |||
154 | static int syscall_index = 0; | ||
155 | |||
156 | int next_syscall_index(int limit) | ||
157 | { | ||
158 | int ret; | ||
159 | |||
160 | spin_lock(&syscall_lock); | ||
161 | ret = syscall_index; | ||
162 | if(++syscall_index == limit) | ||
163 | syscall_index = 0; | ||
164 | spin_unlock(&syscall_lock); | ||
165 | return(ret); | ||
166 | } | ||
167 | |||
168 | int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | 152 | int kernel_execve(const char *filename, char *const argv[], char *const envp[]) |
169 | { | 153 | { |
170 | mm_segment_t fs; | 154 | mm_segment_t fs; |
diff --git a/arch/um/kernel/sysrq.c b/arch/um/kernel/sysrq.c index 239c98054dec..f9e02b31a97a 100644 --- a/arch/um/kernel/sysrq.c +++ b/arch/um/kernel/sysrq.c | |||
@@ -50,7 +50,7 @@ void dump_stack(void) | |||
50 | EXPORT_SYMBOL(dump_stack); | 50 | EXPORT_SYMBOL(dump_stack); |
51 | 51 | ||
52 | /*Stolen from arch/i386/kernel/traps.c */ | 52 | /*Stolen from arch/i386/kernel/traps.c */ |
53 | static int kstack_depth_to_print = 24; | 53 | static const int kstack_depth_to_print = 24; |
54 | 54 | ||
55 | /* This recently started being used in arch-independent code too, as in | 55 | /* This recently started being used in arch-independent code too, as in |
56 | * kernel/sched.c.*/ | 56 | * kernel/sched.c.*/ |
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c index 2e354b3ca060..b1f8b0752419 100644 --- a/arch/um/kernel/time.c +++ b/arch/um/kernel/time.c | |||
@@ -35,31 +35,31 @@ unsigned long long sched_clock(void) | |||
35 | return (unsigned long long)jiffies_64 * (1000000000 / HZ); | 35 | return (unsigned long long)jiffies_64 * (1000000000 / HZ); |
36 | } | 36 | } |
37 | 37 | ||
38 | static unsigned long long prev_nsecs; | 38 | static unsigned long long prev_nsecs[NR_CPUS]; |
39 | #ifdef CONFIG_UML_REAL_TIME_CLOCK | 39 | #ifdef CONFIG_UML_REAL_TIME_CLOCK |
40 | static long long delta; /* Deviation per interval */ | 40 | static long long delta[NR_CPUS]; /* Deviation per interval */ |
41 | #endif | 41 | #endif |
42 | 42 | ||
43 | void timer_irq(union uml_pt_regs *regs) | 43 | void timer_irq(union uml_pt_regs *regs) |
44 | { | 44 | { |
45 | unsigned long long ticks = 0; | 45 | unsigned long long ticks = 0; |
46 | |||
47 | #ifdef CONFIG_UML_REAL_TIME_CLOCK | 46 | #ifdef CONFIG_UML_REAL_TIME_CLOCK |
48 | if(prev_nsecs){ | 47 | int c = cpu(); |
48 | if(prev_nsecs[c]){ | ||
49 | /* We've had 1 tick */ | 49 | /* We've had 1 tick */ |
50 | unsigned long long nsecs = os_nsecs(); | 50 | unsigned long long nsecs = os_nsecs(); |
51 | 51 | ||
52 | delta += nsecs - prev_nsecs; | 52 | delta[c] += nsecs - prev_nsecs[c]; |
53 | prev_nsecs = nsecs; | 53 | prev_nsecs[c] = nsecs; |
54 | 54 | ||
55 | /* Protect against the host clock being set backwards */ | 55 | /* Protect against the host clock being set backwards */ |
56 | if(delta < 0) | 56 | if(delta[c] < 0) |
57 | delta = 0; | 57 | delta[c] = 0; |
58 | 58 | ||
59 | ticks += (delta * HZ) / BILLION; | 59 | ticks += (delta[c] * HZ) / BILLION; |
60 | delta -= (ticks * BILLION) / HZ; | 60 | delta[c] -= (ticks * BILLION) / HZ; |
61 | } | 61 | } |
62 | else prev_nsecs = os_nsecs(); | 62 | else prev_nsecs[c] = os_nsecs(); |
63 | #else | 63 | #else |
64 | ticks = 1; | 64 | ticks = 1; |
65 | #endif | 65 | #endif |
@@ -69,8 +69,8 @@ void timer_irq(union uml_pt_regs *regs) | |||
69 | } | 69 | } |
70 | } | 70 | } |
71 | 71 | ||
72 | /* Protects local_offset */ | ||
72 | static DEFINE_SPINLOCK(timer_spinlock); | 73 | static DEFINE_SPINLOCK(timer_spinlock); |
73 | |||
74 | static unsigned long long local_offset = 0; | 74 | static unsigned long long local_offset = 0; |
75 | 75 | ||
76 | static inline unsigned long long get_time(void) | 76 | static inline unsigned long long get_time(void) |
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index b5f124a2f6ae..26f15c458574 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c | |||
@@ -128,7 +128,18 @@ out_of_memory: | |||
128 | goto out; | 128 | goto out; |
129 | } | 129 | } |
130 | 130 | ||
131 | void segv_handler(int sig, union uml_pt_regs *regs) | 131 | static void bad_segv(struct faultinfo fi, unsigned long ip) |
132 | { | ||
133 | struct siginfo si; | ||
134 | |||
135 | si.si_signo = SIGSEGV; | ||
136 | si.si_code = SEGV_ACCERR; | ||
137 | si.si_addr = (void __user *) FAULT_ADDRESS(fi); | ||
138 | current->thread.arch.faultinfo = fi; | ||
139 | force_sig_info(SIGSEGV, &si, current); | ||
140 | } | ||
141 | |||
142 | static void segv_handler(int sig, union uml_pt_regs *regs) | ||
132 | { | 143 | { |
133 | struct faultinfo * fi = UPT_FAULTINFO(regs); | 144 | struct faultinfo * fi = UPT_FAULTINFO(regs); |
134 | 145 | ||
@@ -205,17 +216,6 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc) | |||
205 | return(0); | 216 | return(0); |
206 | } | 217 | } |
207 | 218 | ||
208 | void bad_segv(struct faultinfo fi, unsigned long ip) | ||
209 | { | ||
210 | struct siginfo si; | ||
211 | |||
212 | si.si_signo = SIGSEGV; | ||
213 | si.si_code = SEGV_ACCERR; | ||
214 | si.si_addr = (void __user *) FAULT_ADDRESS(fi); | ||
215 | current->thread.arch.faultinfo = fi; | ||
216 | force_sig_info(SIGSEGV, &si, current); | ||
217 | } | ||
218 | |||
219 | void relay_signal(int sig, union uml_pt_regs *regs) | 219 | void relay_signal(int sig, union uml_pt_regs *regs) |
220 | { | 220 | { |
221 | if(arch_handle_signal(sig, regs)) | 221 | if(arch_handle_signal(sig, regs)) |
@@ -232,14 +232,14 @@ void relay_signal(int sig, union uml_pt_regs *regs) | |||
232 | force_sig(sig, current); | 232 | force_sig(sig, current); |
233 | } | 233 | } |
234 | 234 | ||
235 | void bus_handler(int sig, union uml_pt_regs *regs) | 235 | static void bus_handler(int sig, union uml_pt_regs *regs) |
236 | { | 236 | { |
237 | if(current->thread.fault_catcher != NULL) | 237 | if(current->thread.fault_catcher != NULL) |
238 | do_longjmp(current->thread.fault_catcher, 1); | 238 | do_longjmp(current->thread.fault_catcher, 1); |
239 | else relay_signal(sig, regs); | 239 | else relay_signal(sig, regs); |
240 | } | 240 | } |
241 | 241 | ||
242 | void winch(int sig, union uml_pt_regs *regs) | 242 | static void winch(int sig, union uml_pt_regs *regs) |
243 | { | 243 | { |
244 | do_IRQ(WINCH_IRQ, regs); | 244 | do_IRQ(WINCH_IRQ, regs); |
245 | } | 245 | } |
diff --git a/arch/um/kernel/tt/gdb.c b/arch/um/kernel/tt/gdb.c index 786e4edd86c5..8eba8f7dca68 100644 --- a/arch/um/kernel/tt/gdb.c +++ b/arch/um/kernel/tt/gdb.c | |||
@@ -139,7 +139,7 @@ static void config_gdb_cb(void *arg) | |||
139 | init_proxy(debugger_pid, 0, 0); | 139 | init_proxy(debugger_pid, 0, 0); |
140 | } | 140 | } |
141 | 141 | ||
142 | int gdb_config(char *str) | 142 | int gdb_config(char *str, char **error_out) |
143 | { | 143 | { |
144 | struct gdb_data data; | 144 | struct gdb_data data; |
145 | 145 | ||
@@ -154,7 +154,7 @@ void remove_gdb_cb(void *unused) | |||
154 | exit_debugger_cb(NULL); | 154 | exit_debugger_cb(NULL); |
155 | } | 155 | } |
156 | 156 | ||
157 | int gdb_remove(int unused) | 157 | int gdb_remove(int unused, char **error_out) |
158 | { | 158 | { |
159 | initial_thread_cb(remove_gdb_cb, NULL); | 159 | initial_thread_cb(remove_gdb_cb, NULL); |
160 | return 0; | 160 | return 0; |
diff --git a/arch/um/kernel/tt/gdb_kern.c b/arch/um/kernel/tt/gdb_kern.c index 68e1bf63cd0a..03b06bc00771 100644 --- a/arch/um/kernel/tt/gdb_kern.c +++ b/arch/um/kernel/tt/gdb_kern.c | |||
@@ -8,10 +8,11 @@ | |||
8 | 8 | ||
9 | #ifdef CONFIG_MCONSOLE | 9 | #ifdef CONFIG_MCONSOLE |
10 | 10 | ||
11 | extern int gdb_config(char *str); | 11 | extern int gdb_config(char *str, char **error_out); |
12 | extern int gdb_remove(int n); | 12 | extern int gdb_remove(int n, char **error_out); |
13 | 13 | ||
14 | static struct mc_device gdb_mc = { | 14 | static struct mc_device gdb_mc = { |
15 | .list = INIT_LIST_HEAD(gdb_mc.list), | ||
15 | .name = "gdb", | 16 | .name = "gdb", |
16 | .config = gdb_config, | 17 | .config = gdb_config, |
17 | .remove = gdb_remove, | 18 | .remove = gdb_remove, |
diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c index 66f43c906821..89c6dba731f8 100644 --- a/arch/um/kernel/um_arch.c +++ b/arch/um/kernel/um_arch.c | |||
@@ -30,7 +30,6 @@ | |||
30 | #include "kern.h" | 30 | #include "kern.h" |
31 | #include "mem_user.h" | 31 | #include "mem_user.h" |
32 | #include "mem.h" | 32 | #include "mem.h" |
33 | #include "umid.h" | ||
34 | #include "initrd.h" | 33 | #include "initrd.h" |
35 | #include "init.h" | 34 | #include "init.h" |
36 | #include "os.h" | 35 | #include "os.h" |
@@ -44,9 +43,9 @@ | |||
44 | #define DEFAULT_COMMAND_LINE "root=98:0" | 43 | #define DEFAULT_COMMAND_LINE "root=98:0" |
45 | 44 | ||
46 | /* Changed in linux_main and setup_arch, which run before SMP is started */ | 45 | /* Changed in linux_main and setup_arch, which run before SMP is started */ |
47 | static char command_line[COMMAND_LINE_SIZE] = { 0 }; | 46 | static char __initdata command_line[COMMAND_LINE_SIZE] = { 0 }; |
48 | 47 | ||
49 | static void add_arg(char *arg) | 48 | static void __init add_arg(char *arg) |
50 | { | 49 | { |
51 | if (strlen(command_line) + strlen(arg) + 1 > COMMAND_LINE_SIZE) { | 50 | if (strlen(command_line) + strlen(arg) + 1 > COMMAND_LINE_SIZE) { |
52 | printf("add_arg: Too many command line arguments!\n"); | 51 | printf("add_arg: Too many command line arguments!\n"); |
@@ -331,7 +330,7 @@ EXPORT_SYMBOL(end_iomem); | |||
331 | 330 | ||
332 | extern char __binary_start; | 331 | extern char __binary_start; |
333 | 332 | ||
334 | int linux_main(int argc, char **argv) | 333 | int __init linux_main(int argc, char **argv) |
335 | { | 334 | { |
336 | unsigned long avail, diff; | 335 | unsigned long avail, diff; |
337 | unsigned long virtmem_size, max_physmem; | 336 | unsigned long virtmem_size, max_physmem; |
@@ -482,7 +481,7 @@ void __init setup_arch(char **cmdline_p) | |||
482 | atomic_notifier_chain_register(&panic_notifier_list, | 481 | atomic_notifier_chain_register(&panic_notifier_list, |
483 | &panic_exit_notifier); | 482 | &panic_exit_notifier); |
484 | paging_init(); | 483 | paging_init(); |
485 | strlcpy(saved_command_line, command_line, COMMAND_LINE_SIZE); | 484 | strlcpy(boot_command_line, command_line, COMMAND_LINE_SIZE); |
486 | *cmdline_p = command_line; | 485 | *cmdline_p = command_line; |
487 | setup_hostinfo(); | 486 | setup_hostinfo(); |
488 | } | 487 | } |
diff --git a/arch/um/kernel/umid.c b/arch/um/kernel/umid.c index 4eaee823bfd2..039e16efcd55 100644 --- a/arch/um/kernel/umid.c +++ b/arch/um/kernel/umid.c | |||
@@ -16,8 +16,10 @@ static int __init set_umid_arg(char *name, int *add) | |||
16 | { | 16 | { |
17 | int err; | 17 | int err; |
18 | 18 | ||
19 | if(umid_inited) | 19 | if(umid_inited){ |
20 | printf("umid already set\n"); | ||
20 | return 0; | 21 | return 0; |
22 | } | ||
21 | 23 | ||
22 | *add = 0; | 24 | *add = 0; |
23 | err = set_umid(name); | 25 | err = set_umid(name); |