aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/kernel')
-rw-r--r--arch/um/kernel/Makefile2
-rw-r--r--arch/um/kernel/exec.c2
-rw-r--r--arch/um/kernel/irq.c7
-rw-r--r--arch/um/kernel/mem.c90
-rw-r--r--arch/um/kernel/physmem.c74
-rw-r--r--arch/um/kernel/ptrace.c7
-rw-r--r--arch/um/kernel/resource.c23
-rw-r--r--arch/um/kernel/sigio.c7
-rw-r--r--arch/um/kernel/skas/mem.c6
-rw-r--r--arch/um/kernel/syscall.c16
-rw-r--r--arch/um/kernel/sysrq.c2
-rw-r--r--arch/um/kernel/time.c24
-rw-r--r--arch/um/kernel/trap.c28
-rw-r--r--arch/um/kernel/tt/gdb.c4
-rw-r--r--arch/um/kernel/tt/gdb_kern.c5
-rw-r--r--arch/um/kernel/um_arch.c9
-rw-r--r--arch/um/kernel/umid.c4
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
7clean-files := 7clean-files :=
8 8
9obj-y = config.o exec.o exitcode.o init_task.o irq.o ksyms.o mem.o \ 9obj-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
82struct irq_fd *active_fds = NULL; 82static struct irq_fd *active_fds = NULL;
83static struct irq_fd **last_irq_ptr = &active_fds; 83static struct irq_fd **last_irq_ptr = &active_fds;
84 84
85extern void free_irqs(void); 85extern 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 */
28unsigned long *empty_zero_page = NULL; 28unsigned long *empty_zero_page = NULL;
29/* allocated in paging_init and unchanged thereafter */
29unsigned long *empty_bad_page = NULL; 30unsigned long *empty_bad_page = NULL;
30pgd_t swapper_pg_dir[PTRS_PER_PGD]; 31pgd_t swapper_pg_dir[PTRS_PER_PGD];
31unsigned long long highmem; 32unsigned 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 &current->thread.fault_addr, 267 &current->thread.fault_addr,
265 &current->thread.fault_catcher)){ 268 &current->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
287void free_initrd_mem(unsigned long start, unsigned long end) 291void 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
302void show_mem(void) 305void 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)
362struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) 365struct 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
370struct iomem_region *iomem_regions = NULL;
371int iomem_size = 0;
372
373extern 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
54static struct phys_desc *find_phys_mapping(void *virt) 54static 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
64static void insert_phys_mapping(struct phys_desc *desc) 64static 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
98static struct desc_mapping *descriptor_mapping(int fd) 98static 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
119int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w) 119int 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
161static int physmem_fd = -1; 161static 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
191void physmem_forget_descriptor(int fd) 191void physmem_forget_descriptor(int fd)
@@ -239,9 +239,9 @@ void arch_free_page(struct page *page, int order)
239 239
240int is_remapped(void *virt) 240int 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
302void map_memory(unsigned long virt, unsigned long phys, unsigned long len, 302void 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
385static int __init uml_mem_setup(char *line, int *add) 385static 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
401extern 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 */
413struct iomem_region *iomem_regions = NULL;
414
415/* Initialized in parse_iomem */
416int iomem_size = 0;
417
401unsigned long find_iomem(char *driver, unsigned long *len_out) 418unsigned 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
417int setup_iomem(void) 434int 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
22static inline void set_singlestepping(struct task_struct *child, int on) 23static 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
8unsigned 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
29int write_sigio_irq(int fd) 29int 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. */
45static DEFINE_SPINLOCK(sigio_spinlock); 46static DEFINE_SPINLOCK(sigio_spinlock);
46 47
47void sigio_lock(void) 48void 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
152DEFINE_SPINLOCK(syscall_lock);
153
154static int syscall_index = 0;
155
156int 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
168int kernel_execve(const char *filename, char *const argv[], char *const envp[]) 152int 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)
50EXPORT_SYMBOL(dump_stack); 50EXPORT_SYMBOL(dump_stack);
51 51
52/*Stolen from arch/i386/kernel/traps.c */ 52/*Stolen from arch/i386/kernel/traps.c */
53static int kstack_depth_to_print = 24; 53static 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
38static unsigned long long prev_nsecs; 38static unsigned long long prev_nsecs[NR_CPUS];
39#ifdef CONFIG_UML_REAL_TIME_CLOCK 39#ifdef CONFIG_UML_REAL_TIME_CLOCK
40static long long delta; /* Deviation per interval */ 40static long long delta[NR_CPUS]; /* Deviation per interval */
41#endif 41#endif
42 42
43void timer_irq(union uml_pt_regs *regs) 43void 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 */
72static DEFINE_SPINLOCK(timer_spinlock); 73static DEFINE_SPINLOCK(timer_spinlock);
73
74static unsigned long long local_offset = 0; 74static unsigned long long local_offset = 0;
75 75
76static inline unsigned long long get_time(void) 76static 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
131void segv_handler(int sig, union uml_pt_regs *regs) 131static 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
142static 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
208void 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
219void relay_signal(int sig, union uml_pt_regs *regs) 219void 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
235void bus_handler(int sig, union uml_pt_regs *regs) 235static 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
242void winch(int sig, union uml_pt_regs *regs) 242static 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
142int gdb_config(char *str) 142int 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
157int gdb_remove(int unused) 157int 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
11extern int gdb_config(char *str); 11extern int gdb_config(char *str, char **error_out);
12extern int gdb_remove(int n); 12extern int gdb_remove(int n, char **error_out);
13 13
14static struct mc_device gdb_mc = { 14static 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 */
47static char command_line[COMMAND_LINE_SIZE] = { 0 }; 46static char __initdata command_line[COMMAND_LINE_SIZE] = { 0 };
48 47
49static void add_arg(char *arg) 48static 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
332extern char __binary_start; 331extern char __binary_start;
333 332
334int linux_main(int argc, char **argv) 333int __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);