diff options
Diffstat (limited to 'arch/sparc')
68 files changed, 223 insertions, 413 deletions
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index d211fdb24584..789724e61e83 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -1,4 +1,3 @@ | |||
1 | # $Id: config.in,v 1.113 2002/01/24 22:14:44 davem Exp $ | ||
2 | # For a description of the syntax of this configuration file, | 1 | # For a description of the syntax of this configuration file, |
3 | # see Documentation/kbuild/kconfig-language.txt. | 2 | # see Documentation/kbuild/kconfig-language.txt. |
4 | # | 3 | # |
diff --git a/arch/sparc/boot/Makefile b/arch/sparc/boot/Makefile index b365084316ac..22d331e1e941 100644 --- a/arch/sparc/boot/Makefile +++ b/arch/sparc/boot/Makefile | |||
@@ -1,4 +1,3 @@ | |||
1 | # $Id: Makefile,v 1.10 2000/02/23 08:17:46 jj Exp $ | ||
2 | # Makefile for the Sparc boot stuff. | 1 | # Makefile for the Sparc boot stuff. |
3 | # | 2 | # |
4 | # Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 3 | # Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/boot/btfixupprep.c b/arch/sparc/boot/btfixupprep.c index dc7b0546e3bb..52a4208fe4f0 100644 --- a/arch/sparc/boot/btfixupprep.c +++ b/arch/sparc/boot/btfixupprep.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: btfixupprep.c,v 1.6 2001/08/22 15:27:47 davem Exp $ | 1 | /* |
2 | Simple utility to prepare vmlinux image for sparc. | 2 | Simple utility to prepare vmlinux image for sparc. |
3 | Resolves all BTFIXUP uses and settings and creates | 3 | Resolves all BTFIXUP uses and settings and creates |
4 | a special .s object to link to the image. | 4 | a special .s object to link to the image. |
diff --git a/arch/sparc/boot/piggyback.c b/arch/sparc/boot/piggyback.c index 6962cc68ed5b..c9f500c1a8b2 100644 --- a/arch/sparc/boot/piggyback.c +++ b/arch/sparc/boot/piggyback.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: piggyback.c,v 1.4 2000/12/05 00:48:57 anton Exp $ | 1 | /* |
2 | Simple utility to make a single-image install kernel with initial ramdisk | 2 | Simple utility to make a single-image install kernel with initial ramdisk |
3 | for Sparc tftpbooting without need to set up nfs. | 3 | for Sparc tftpbooting without need to set up nfs. |
4 | 4 | ||
diff --git a/arch/sparc/kernel/ebus.c b/arch/sparc/kernel/ebus.c index 96344ff2bbe1..92c6fc07e59c 100644 --- a/arch/sparc/kernel/ebus.c +++ b/arch/sparc/kernel/ebus.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: ebus.c,v 1.20 2002/01/05 01:13:43 davem Exp $ | 1 | /* |
2 | * ebus.c: PCI to EBus bridge device. | 2 | * ebus.c: PCI to EBus bridge device. |
3 | * | 3 | * |
4 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) | 4 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) |
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index 57d1bbdd0bd2..4bcfe54f878d 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S | |||
@@ -1306,6 +1306,8 @@ ret_from_fork: | |||
1306 | .align 4 | 1306 | .align 4 |
1307 | .globl linux_sparc_syscall | 1307 | .globl linux_sparc_syscall |
1308 | linux_sparc_syscall: | 1308 | linux_sparc_syscall: |
1309 | sethi %hi(PSR_SYSCALL), %l4 | ||
1310 | or %l0, %l4, %l0 | ||
1309 | /* Direct access to user regs, must faster. */ | 1311 | /* Direct access to user regs, must faster. */ |
1310 | cmp %g1, NR_SYSCALLS | 1312 | cmp %g1, NR_SYSCALLS |
1311 | bgeu linux_sparc_ni_syscall | 1313 | bgeu linux_sparc_ni_syscall |
diff --git a/arch/sparc/kernel/etrap.S b/arch/sparc/kernel/etrap.S index a8b35bed12a2..f37d961d67a6 100644 --- a/arch/sparc/kernel/etrap.S +++ b/arch/sparc/kernel/etrap.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: etrap.S,v 1.31 2000/01/08 16:38:18 anton Exp $ | 1 | /* |
2 | * etrap.S: Sparc trap window preparation for entry into the | 2 | * etrap.S: Sparc trap window preparation for entry into the |
3 | * Linux kernel. | 3 | * Linux kernel. |
4 | * | 4 | * |
diff --git a/arch/sparc/kernel/head.S b/arch/sparc/kernel/head.S index 8bec05fa5795..3bfd6085a91d 100644 --- a/arch/sparc/kernel/head.S +++ b/arch/sparc/kernel/head.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: head.S,v 1.105 2001/08/12 09:08:56 davem Exp $ | 1 | /* |
2 | * head.S: The initial boot code for the Sparc port of Linux. | 2 | * head.S: The initial boot code for the Sparc port of Linux. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/kernel/idprom.c b/arch/sparc/kernel/idprom.c index 3a5bad525394..7220562cdb34 100644 --- a/arch/sparc/kernel/idprom.c +++ b/arch/sparc/kernel/idprom.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: idprom.c,v 1.24 1999/08/31 06:54:20 davem Exp $ | 1 | /* |
2 | * idprom.c: Routines to load the idprom into kernel addresses and | 2 | * idprom.c: Routines to load the idprom into kernel addresses and |
3 | * interpret the data contained within. | 3 | * interpret the data contained within. |
4 | * | 4 | * |
diff --git a/arch/sparc/kernel/init_task.c b/arch/sparc/kernel/init_task.c index d9d4f96360c7..8e64ebc445ef 100644 --- a/arch/sparc/kernel/init_task.c +++ b/arch/sparc/kernel/init_task.c | |||
@@ -9,7 +9,6 @@ | |||
9 | #include <asm/uaccess.h> | 9 | #include <asm/uaccess.h> |
10 | 10 | ||
11 | static struct fs_struct init_fs = INIT_FS; | 11 | static struct fs_struct init_fs = INIT_FS; |
12 | static struct files_struct init_files = INIT_FILES; | ||
13 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 12 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
14 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 13 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
15 | struct mm_struct init_mm = INIT_MM(init_mm); | 14 | struct mm_struct init_mm = INIT_MM(init_mm); |
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index ad0ede24ca1d..7b17522f59bf 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: ioport.c,v 1.45 2001/10/30 04:54:21 davem Exp $ | 1 | /* |
2 | * ioport.c: Simple io mapping allocator. | 2 | * ioport.c: Simple io mapping allocator. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/kernel/irq.c b/arch/sparc/kernel/irq.c index 01a6756ba371..087390b092b0 100644 --- a/arch/sparc/kernel/irq.c +++ b/arch/sparc/kernel/irq.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: irq.c,v 1.114 2001/12/11 04:55:51 davem Exp $ | 1 | /* |
2 | * arch/sparc/kernel/irq.c: Interrupt request handling routines. On the | 2 | * arch/sparc/kernel/irq.c: Interrupt request handling routines. On the |
3 | * Sparc the IRQs are basically 'cast in stone' | 3 | * Sparc the IRQs are basically 'cast in stone' |
4 | * and you are supposed to probe the prom's device | 4 | * and you are supposed to probe the prom's device |
diff --git a/arch/sparc/kernel/led.c b/arch/sparc/kernel/led.c index 59e9344e7a0d..adaaed4ea2fb 100644 --- a/arch/sparc/kernel/led.c +++ b/arch/sparc/kernel/led.c | |||
@@ -2,6 +2,7 @@ | |||
2 | #include <linux/module.h> | 2 | #include <linux/module.h> |
3 | #include <linux/init.h> | 3 | #include <linux/init.h> |
4 | #include <linux/proc_fs.h> | 4 | #include <linux/proc_fs.h> |
5 | #include <linux/seq_file.h> | ||
5 | #include <linux/string.h> | 6 | #include <linux/string.h> |
6 | #include <linux/jiffies.h> | 7 | #include <linux/jiffies.h> |
7 | #include <linux/timer.h> | 8 | #include <linux/timer.h> |
@@ -45,21 +46,22 @@ static void led_blink(unsigned long timeout) | |||
45 | add_timer(&led_blink_timer); | 46 | add_timer(&led_blink_timer); |
46 | } | 47 | } |
47 | 48 | ||
48 | static int led_read_proc(char *buf, char **start, off_t offset, int count, | 49 | static int led_proc_show(struct seq_file *m, void *v) |
49 | int *eof, void *data) | ||
50 | { | 50 | { |
51 | int len = 0; | ||
52 | |||
53 | if (get_auxio() & AUXIO_LED) | 51 | if (get_auxio() & AUXIO_LED) |
54 | len = sprintf(buf, "on\n"); | 52 | seq_puts(m, "on\n"); |
55 | else | 53 | else |
56 | len = sprintf(buf, "off\n"); | 54 | seq_puts(m, "off\n"); |
55 | return 0; | ||
56 | } | ||
57 | 57 | ||
58 | return len; | 58 | static int led_proc_open(struct inode *inode, struct file *file) |
59 | { | ||
60 | return single_open(file, led_proc_show, NULL); | ||
59 | } | 61 | } |
60 | 62 | ||
61 | static int led_write_proc(struct file *file, const char __user *buffer, | 63 | static ssize_t led_proc_write(struct file *file, const char __user *buffer, |
62 | unsigned long count, void *data) | 64 | size_t count, loff_t *ppos) |
63 | { | 65 | { |
64 | char *buf = NULL; | 66 | char *buf = NULL; |
65 | 67 | ||
@@ -103,6 +105,15 @@ static int led_write_proc(struct file *file, const char __user *buffer, | |||
103 | return count; | 105 | return count; |
104 | } | 106 | } |
105 | 107 | ||
108 | static const struct file_operations led_proc_fops = { | ||
109 | .owner = THIS_MODULE, | ||
110 | .open = led_proc_open, | ||
111 | .read = seq_read, | ||
112 | .llseek = seq_lseek, | ||
113 | .release = single_release, | ||
114 | .write = led_proc_write, | ||
115 | }; | ||
116 | |||
106 | static struct proc_dir_entry *led; | 117 | static struct proc_dir_entry *led; |
107 | 118 | ||
108 | #define LED_VERSION "0.1" | 119 | #define LED_VERSION "0.1" |
@@ -112,12 +123,9 @@ static int __init led_init(void) | |||
112 | init_timer(&led_blink_timer); | 123 | init_timer(&led_blink_timer); |
113 | led_blink_timer.function = led_blink; | 124 | led_blink_timer.function = led_blink; |
114 | 125 | ||
115 | led = create_proc_entry("led", 0, NULL); | 126 | led = proc_create("led", 0, NULL, &led_proc_fops); |
116 | if (!led) | 127 | if (!led) |
117 | return -ENOMEM; | 128 | return -ENOMEM; |
118 | |||
119 | led->read_proc = led_read_proc; /* reader function */ | ||
120 | led->write_proc = led_write_proc; /* writer function */ | ||
121 | led->owner = THIS_MODULE; | 129 | led->owner = THIS_MODULE; |
122 | 130 | ||
123 | printk(KERN_INFO | 131 | printk(KERN_INFO |
diff --git a/arch/sparc/kernel/muldiv.c b/arch/sparc/kernel/muldiv.c index 37b9a4942232..e352239e72c8 100644 --- a/arch/sparc/kernel/muldiv.c +++ b/arch/sparc/kernel/muldiv.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: muldiv.c,v 1.5 1997/12/15 20:07:20 ecd Exp $ | 1 | /* |
2 | * muldiv.c: Hardware multiply/division illegal instruction trap | 2 | * muldiv.c: Hardware multiply/division illegal instruction trap |
3 | * for sun4c/sun4 (which do not have those instructions) | 3 | * for sun4c/sun4 (which do not have those instructions) |
4 | * | 4 | * |
diff --git a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c index e7f35198ae34..da48d248cc17 100644 --- a/arch/sparc/kernel/process.c +++ b/arch/sparc/kernel/process.c | |||
@@ -419,14 +419,26 @@ asmlinkage int sparc_do_fork(unsigned long clone_flags, | |||
419 | unsigned long stack_size) | 419 | unsigned long stack_size) |
420 | { | 420 | { |
421 | unsigned long parent_tid_ptr, child_tid_ptr; | 421 | unsigned long parent_tid_ptr, child_tid_ptr; |
422 | unsigned long orig_i1 = regs->u_regs[UREG_I1]; | ||
423 | long ret; | ||
422 | 424 | ||
423 | parent_tid_ptr = regs->u_regs[UREG_I2]; | 425 | parent_tid_ptr = regs->u_regs[UREG_I2]; |
424 | child_tid_ptr = regs->u_regs[UREG_I4]; | 426 | child_tid_ptr = regs->u_regs[UREG_I4]; |
425 | 427 | ||
426 | return do_fork(clone_flags, stack_start, | 428 | ret = do_fork(clone_flags, stack_start, |
427 | regs, stack_size, | 429 | regs, stack_size, |
428 | (int __user *) parent_tid_ptr, | 430 | (int __user *) parent_tid_ptr, |
429 | (int __user *) child_tid_ptr); | 431 | (int __user *) child_tid_ptr); |
432 | |||
433 | /* If we get an error and potentially restart the system | ||
434 | * call, we're screwed because copy_thread() clobbered | ||
435 | * the parent's %o1. So detect that case and restore it | ||
436 | * here. | ||
437 | */ | ||
438 | if ((unsigned long)ret >= -ERESTART_RESTARTBLOCK) | ||
439 | regs->u_regs[UREG_I1] = orig_i1; | ||
440 | |||
441 | return ret; | ||
430 | } | 442 | } |
431 | 443 | ||
432 | /* Copy a Sparc thread. The fork() return value conventions | 444 | /* Copy a Sparc thread. The fork() return value conventions |
@@ -626,11 +638,6 @@ asmlinkage int sparc_execve(struct pt_regs *regs) | |||
626 | (char __user * __user *)regs->u_regs[base + UREG_I2], | 638 | (char __user * __user *)regs->u_regs[base + UREG_I2], |
627 | regs); | 639 | regs); |
628 | putname(filename); | 640 | putname(filename); |
629 | if (error == 0) { | ||
630 | task_lock(current); | ||
631 | current->ptrace &= ~PT_DTRACE; | ||
632 | task_unlock(current); | ||
633 | } | ||
634 | out: | 641 | out: |
635 | return error; | 642 | return error; |
636 | } | 643 | } |
diff --git a/arch/sparc/kernel/ptrace.c b/arch/sparc/kernel/ptrace.c index 7f44ae69b29e..81f3b929743f 100644 --- a/arch/sparc/kernel/ptrace.c +++ b/arch/sparc/kernel/ptrace.c | |||
@@ -170,8 +170,8 @@ static int genregs32_set(struct task_struct *target, | |||
170 | switch (pos) { | 170 | switch (pos) { |
171 | case 32: /* PSR */ | 171 | case 32: /* PSR */ |
172 | psr = regs->psr; | 172 | psr = regs->psr; |
173 | psr &= ~PSR_ICC; | 173 | psr &= ~(PSR_ICC | PSR_SYSCALL); |
174 | psr |= (reg & PSR_ICC); | 174 | psr |= (reg & (PSR_ICC | PSR_SYSCALL)); |
175 | regs->psr = psr; | 175 | regs->psr = psr; |
176 | break; | 176 | break; |
177 | case 33: /* PC */ | 177 | case 33: /* PC */ |
@@ -441,6 +441,8 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
441 | break; | 441 | break; |
442 | 442 | ||
443 | default: | 443 | default: |
444 | if (request == PTRACE_SPARC_DETACH) | ||
445 | request = PTRACE_DETACH; | ||
444 | ret = ptrace_request(child, request, addr, data); | 446 | ret = ptrace_request(child, request, addr, data); |
445 | break; | 447 | break; |
446 | } | 448 | } |
diff --git a/arch/sparc/kernel/rtrap.S b/arch/sparc/kernel/rtrap.S index 77ca6fd81253..ce30082ab266 100644 --- a/arch/sparc/kernel/rtrap.S +++ b/arch/sparc/kernel/rtrap.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: rtrap.S,v 1.58 2002/01/31 03:30:05 davem Exp $ | 1 | /* |
2 | * rtrap.S: Return from Sparc trap low-level code. | 2 | * rtrap.S: Return from Sparc trap low-level code. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
@@ -50,8 +50,9 @@ rtrap_7win_patch5: and %g1, 0x7f, %g1 | |||
50 | ret_trap_entry: | 50 | ret_trap_entry: |
51 | ret_trap_lockless_ipi: | 51 | ret_trap_lockless_ipi: |
52 | andcc %t_psr, PSR_PS, %g0 | 52 | andcc %t_psr, PSR_PS, %g0 |
53 | sethi %hi(PSR_SYSCALL), %g1 | ||
53 | be 1f | 54 | be 1f |
54 | nop | 55 | andn %t_psr, %g1, %t_psr |
55 | 56 | ||
56 | wr %t_psr, 0x0, %psr | 57 | wr %t_psr, 0x0, %psr |
57 | b ret_trap_kernel | 58 | b ret_trap_kernel |
@@ -73,7 +74,6 @@ signal_p: | |||
73 | ld [%sp + STACKFRAME_SZ + PT_PSR], %t_psr | 74 | ld [%sp + STACKFRAME_SZ + PT_PSR], %t_psr |
74 | 75 | ||
75 | mov %l5, %o1 | 76 | mov %l5, %o1 |
76 | mov %l6, %o2 | ||
77 | call do_signal | 77 | call do_signal |
78 | add %sp, STACKFRAME_SZ, %o0 ! pt_regs ptr | 78 | add %sp, STACKFRAME_SZ, %o0 ! pt_regs ptr |
79 | 79 | ||
@@ -81,6 +81,8 @@ signal_p: | |||
81 | ld [%sp + STACKFRAME_SZ + PT_PSR], %t_psr | 81 | ld [%sp + STACKFRAME_SZ + PT_PSR], %t_psr |
82 | clr %l6 | 82 | clr %l6 |
83 | ret_trap_continue: | 83 | ret_trap_continue: |
84 | sethi %hi(PSR_SYSCALL), %g1 | ||
85 | andn %t_psr, %g1, %t_psr | ||
84 | wr %t_psr, 0x0, %psr | 86 | wr %t_psr, 0x0, %psr |
85 | WRITE_PAUSE | 87 | WRITE_PAUSE |
86 | 88 | ||
@@ -137,8 +139,9 @@ ret_trap_userwins_ok: | |||
137 | LOAD_PT_PRIV(sp, t_psr, t_pc, t_npc) | 139 | LOAD_PT_PRIV(sp, t_psr, t_pc, t_npc) |
138 | or %t_pc, %t_npc, %g2 | 140 | or %t_pc, %t_npc, %g2 |
139 | andcc %g2, 0x3, %g0 | 141 | andcc %g2, 0x3, %g0 |
142 | sethi %hi(PSR_SYSCALL), %g2 | ||
140 | be 1f | 143 | be 1f |
141 | nop | 144 | andn %t_psr, %g2, %t_psr |
142 | 145 | ||
143 | b ret_trap_unaligned_pc | 146 | b ret_trap_unaligned_pc |
144 | add %sp, STACKFRAME_SZ, %o0 | 147 | add %sp, STACKFRAME_SZ, %o0 |
@@ -201,6 +204,8 @@ rtrap_patch5: and %g1, 0xff, %g1 | |||
201 | 1: | 204 | 1: |
202 | LOAD_PT_ALL(sp, t_psr, t_pc, t_npc, g1) | 205 | LOAD_PT_ALL(sp, t_psr, t_pc, t_npc, g1) |
203 | 2: | 206 | 2: |
207 | sethi %hi(PSR_SYSCALL), %twin_tmp1 | ||
208 | andn %t_psr, %twin_tmp1, %t_psr | ||
204 | wr %t_psr, 0x0, %psr | 209 | wr %t_psr, 0x0, %psr |
205 | WRITE_PAUSE | 210 | WRITE_PAUSE |
206 | 211 | ||
diff --git a/arch/sparc/kernel/setup.c b/arch/sparc/kernel/setup.c index 3c13137685da..a0ea0bc6f471 100644 --- a/arch/sparc/kernel/setup.c +++ b/arch/sparc/kernel/setup.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: setup.c,v 1.126 2001/11/13 00:49:27 davem Exp $ | 1 | /* |
2 | * linux/arch/sparc/kernel/setup.c | 2 | * linux/arch/sparc/kernel/setup.c |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
@@ -180,11 +180,9 @@ static void __init boot_flags_init(char *commands) | |||
180 | 180 | ||
181 | /* This routine will in the future do all the nasty prom stuff | 181 | /* This routine will in the future do all the nasty prom stuff |
182 | * to probe for the mmu type and its parameters, etc. This will | 182 | * to probe for the mmu type and its parameters, etc. This will |
183 | * also be where SMP things happen plus the Sparc specific memory | 183 | * also be where SMP things happen. |
184 | * physical memory probe as on the alpha. | ||
185 | */ | 184 | */ |
186 | 185 | ||
187 | extern int prom_probe_memory(void); | ||
188 | extern void sun4c_probe_vac(void); | 186 | extern void sun4c_probe_vac(void); |
189 | extern char cputypval; | 187 | extern char cputypval; |
190 | extern unsigned long start, end; | 188 | extern unsigned long start, end; |
@@ -268,7 +266,6 @@ void __init setup_arch(char **cmdline_p) | |||
268 | if (ARCH_SUN4C_SUN4) | 266 | if (ARCH_SUN4C_SUN4) |
269 | sun4c_probe_vac(); | 267 | sun4c_probe_vac(); |
270 | load_mmu(); | 268 | load_mmu(); |
271 | (void) prom_probe_memory(); | ||
272 | 269 | ||
273 | phys_base = 0xffffffffUL; | 270 | phys_base = 0xffffffffUL; |
274 | highest_paddr = 0UL; | 271 | highest_paddr = 0UL; |
diff --git a/arch/sparc/kernel/signal.c b/arch/sparc/kernel/signal.c index 3c312290c3c2..3fd1df9f9ba7 100644 --- a/arch/sparc/kernel/signal.c +++ b/arch/sparc/kernel/signal.c | |||
@@ -145,6 +145,9 @@ asmlinkage void do_sigreturn(struct pt_regs *regs) | |||
145 | regs->psr = (up_psr & ~(PSR_ICC | PSR_EF)) | 145 | regs->psr = (up_psr & ~(PSR_ICC | PSR_EF)) |
146 | | (regs->psr & (PSR_ICC | PSR_EF)); | 146 | | (regs->psr & (PSR_ICC | PSR_EF)); |
147 | 147 | ||
148 | /* Prevent syscall restart. */ | ||
149 | pt_regs_clear_syscall(regs); | ||
150 | |||
148 | err |= __get_user(fpu_save, &sf->fpu_save); | 151 | err |= __get_user(fpu_save, &sf->fpu_save); |
149 | 152 | ||
150 | if (fpu_save) | 153 | if (fpu_save) |
@@ -199,6 +202,9 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs) | |||
199 | 202 | ||
200 | regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC); | 203 | regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC); |
201 | 204 | ||
205 | /* Prevent syscall restart. */ | ||
206 | pt_regs_clear_syscall(regs); | ||
207 | |||
202 | err |= __get_user(fpu_save, &sf->fpu_save); | 208 | err |= __get_user(fpu_save, &sf->fpu_save); |
203 | 209 | ||
204 | if (fpu_save) | 210 | if (fpu_save) |
@@ -245,15 +251,29 @@ static inline int invalid_frame_pointer(void __user *fp, int fplen) | |||
245 | 251 | ||
246 | static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) | 252 | static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) |
247 | { | 253 | { |
248 | unsigned long sp; | 254 | unsigned long sp = regs->u_regs[UREG_FP]; |
249 | 255 | ||
250 | sp = regs->u_regs[UREG_FP]; | 256 | /* |
257 | * If we are on the alternate signal stack and would overflow it, don't. | ||
258 | * Return an always-bogus address instead so we will die with SIGSEGV. | ||
259 | */ | ||
260 | if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) | ||
261 | return (void __user *) -1L; | ||
251 | 262 | ||
252 | /* This is the X/Open sanctioned signal stack switching. */ | 263 | /* This is the X/Open sanctioned signal stack switching. */ |
253 | if (sa->sa_flags & SA_ONSTACK) { | 264 | if (sa->sa_flags & SA_ONSTACK) { |
254 | if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7)) | 265 | if (sas_ss_flags(sp) == 0) |
255 | sp = current->sas_ss_sp + current->sas_ss_size; | 266 | sp = current->sas_ss_sp + current->sas_ss_size; |
256 | } | 267 | } |
268 | |||
269 | /* Always align the stack frame. This handles two cases. First, | ||
270 | * sigaltstack need not be mindful of platform specific stack | ||
271 | * alignment. Second, if we took this signal because the stack | ||
272 | * is not aligned properly, we'd like to take the signal cleanly | ||
273 | * and report that. | ||
274 | */ | ||
275 | sp &= ~7UL; | ||
276 | |||
257 | return (void __user *)(sp - framesize); | 277 | return (void __user *)(sp - framesize); |
258 | } | 278 | } |
259 | 279 | ||
@@ -493,26 +513,36 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | |||
493 | * want to handle. Thus you cannot kill init even with a SIGKILL even by | 513 | * want to handle. Thus you cannot kill init even with a SIGKILL even by |
494 | * mistake. | 514 | * mistake. |
495 | */ | 515 | */ |
496 | asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0, int restart_syscall) | 516 | asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0) |
497 | { | 517 | { |
498 | siginfo_t info; | ||
499 | struct sparc_deliver_cookie cookie; | ||
500 | struct k_sigaction ka; | 518 | struct k_sigaction ka; |
501 | int signr; | 519 | int restart_syscall; |
502 | sigset_t *oldset; | 520 | sigset_t *oldset; |
521 | siginfo_t info; | ||
522 | int signr; | ||
503 | 523 | ||
504 | cookie.restart_syscall = restart_syscall; | 524 | if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) |
505 | cookie.orig_i0 = orig_i0; | 525 | restart_syscall = 1; |
526 | else | ||
527 | restart_syscall = 0; | ||
506 | 528 | ||
507 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | 529 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
508 | oldset = ¤t->saved_sigmask; | 530 | oldset = ¤t->saved_sigmask; |
509 | else | 531 | else |
510 | oldset = ¤t->blocked; | 532 | oldset = ¤t->blocked; |
511 | 533 | ||
512 | signr = get_signal_to_deliver(&info, &ka, regs, &cookie); | 534 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
535 | |||
536 | /* If the debugger messes with the program counter, it clears | ||
537 | * the software "in syscall" bit, directing us to not perform | ||
538 | * a syscall restart. | ||
539 | */ | ||
540 | if (restart_syscall && !pt_regs_is_syscall(regs)) | ||
541 | restart_syscall = 0; | ||
542 | |||
513 | if (signr > 0) { | 543 | if (signr > 0) { |
514 | if (cookie.restart_syscall) | 544 | if (restart_syscall) |
515 | syscall_restart(cookie.orig_i0, regs, &ka.sa); | 545 | syscall_restart(orig_i0, regs, &ka.sa); |
516 | handle_signal(signr, &ka, &info, oldset, regs); | 546 | handle_signal(signr, &ka, &info, oldset, regs); |
517 | 547 | ||
518 | /* a signal was successfully delivered; the saved | 548 | /* a signal was successfully delivered; the saved |
@@ -524,16 +554,16 @@ asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0, int rest | |||
524 | clear_thread_flag(TIF_RESTORE_SIGMASK); | 554 | clear_thread_flag(TIF_RESTORE_SIGMASK); |
525 | return; | 555 | return; |
526 | } | 556 | } |
527 | if (cookie.restart_syscall && | 557 | if (restart_syscall && |
528 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || | 558 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || |
529 | regs->u_regs[UREG_I0] == ERESTARTSYS || | 559 | regs->u_regs[UREG_I0] == ERESTARTSYS || |
530 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { | 560 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { |
531 | /* replay the system call when we are done */ | 561 | /* replay the system call when we are done */ |
532 | regs->u_regs[UREG_I0] = cookie.orig_i0; | 562 | regs->u_regs[UREG_I0] = orig_i0; |
533 | regs->pc -= 4; | 563 | regs->pc -= 4; |
534 | regs->npc -= 4; | 564 | regs->npc -= 4; |
535 | } | 565 | } |
536 | if (cookie.restart_syscall && | 566 | if (restart_syscall && |
537 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 567 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { |
538 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 568 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
539 | regs->pc -= 4; | 569 | regs->pc -= 4; |
@@ -585,27 +615,3 @@ do_sys_sigstack(struct sigstack __user *ssptr, struct sigstack __user *ossptr, | |||
585 | out: | 615 | out: |
586 | return ret; | 616 | return ret; |
587 | } | 617 | } |
588 | |||
589 | void ptrace_signal_deliver(struct pt_regs *regs, void *cookie) | ||
590 | { | ||
591 | struct sparc_deliver_cookie *cp = cookie; | ||
592 | |||
593 | if (cp->restart_syscall && | ||
594 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || | ||
595 | regs->u_regs[UREG_I0] == ERESTARTSYS || | ||
596 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { | ||
597 | /* replay the system call when we are done */ | ||
598 | regs->u_regs[UREG_I0] = cp->orig_i0; | ||
599 | regs->pc -= 4; | ||
600 | regs->npc -= 4; | ||
601 | cp->restart_syscall = 0; | ||
602 | } | ||
603 | |||
604 | if (cp->restart_syscall && | ||
605 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | ||
606 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | ||
607 | regs->pc -= 4; | ||
608 | regs->npc -= 4; | ||
609 | cp->restart_syscall = 0; | ||
610 | } | ||
611 | } | ||
diff --git a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c index aa8ee06cf488..b23cea5ca5d1 100644 --- a/arch/sparc/kernel/sparc_ksyms.c +++ b/arch/sparc/kernel/sparc_ksyms.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: sparc_ksyms.c,v 1.107 2001/07/17 16:17:33 anton Exp $ | 1 | /* |
2 | * arch/sparc/kernel/ksyms.c: Sparc specific ksyms support. | 2 | * arch/sparc/kernel/ksyms.c: Sparc specific ksyms support. |
3 | * | 3 | * |
4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c index e0efab2a6bef..8ac5661cafff 100644 --- a/arch/sparc/kernel/sun4d_irq.c +++ b/arch/sparc/kernel/sun4d_irq.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: sun4d_irq.c,v 1.29 2001/12/11 04:55:51 davem Exp $ | 1 | /* |
2 | * arch/sparc/kernel/sun4d_irq.c: | 2 | * arch/sparc/kernel/sun4d_irq.c: |
3 | * SS1000/SC2000 interrupt handling. | 3 | * SS1000/SC2000 interrupt handling. |
4 | * | 4 | * |
diff --git a/arch/sparc/kernel/sys_sparc.c b/arch/sparc/kernel/sys_sparc.c index f188b5dc9fd0..3c6b49a53ae8 100644 --- a/arch/sparc/kernel/sys_sparc.c +++ b/arch/sparc/kernel/sys_sparc.c | |||
@@ -219,12 +219,11 @@ out: | |||
219 | return err; | 219 | return err; |
220 | } | 220 | } |
221 | 221 | ||
222 | int sparc_mmap_check(unsigned long addr, unsigned long len, unsigned long flags) | 222 | int sparc_mmap_check(unsigned long addr, unsigned long len) |
223 | { | 223 | { |
224 | if (ARCH_SUN4C_SUN4 && | 224 | if (ARCH_SUN4C_SUN4 && |
225 | (len > 0x20000000 || | 225 | (len > 0x20000000 || |
226 | ((flags & MAP_FIXED) && | 226 | (addr < 0xe0000000 && addr + len > 0x20000000))) |
227 | addr < 0xe0000000 && addr + len > 0x20000000))) | ||
228 | return -EINVAL; | 227 | return -EINVAL; |
229 | 228 | ||
230 | /* See asm-sparc/uaccess.h */ | 229 | /* See asm-sparc/uaccess.h */ |
@@ -296,52 +295,14 @@ asmlinkage unsigned long sparc_mremap(unsigned long addr, | |||
296 | unsigned long old_len, unsigned long new_len, | 295 | unsigned long old_len, unsigned long new_len, |
297 | unsigned long flags, unsigned long new_addr) | 296 | unsigned long flags, unsigned long new_addr) |
298 | { | 297 | { |
299 | struct vm_area_struct *vma; | ||
300 | unsigned long ret = -EINVAL; | 298 | unsigned long ret = -EINVAL; |
301 | if (ARCH_SUN4C_SUN4) { | 299 | |
302 | if (old_len > 0x20000000 || new_len > 0x20000000) | 300 | if (unlikely(sparc_mmap_check(addr, old_len))) |
303 | goto out; | 301 | goto out; |
304 | if (addr < 0xe0000000 && addr + old_len > 0x20000000) | 302 | if (unlikely(sparc_mmap_check(new_addr, new_len))) |
305 | goto out; | ||
306 | } | ||
307 | if (old_len > TASK_SIZE - PAGE_SIZE || | ||
308 | new_len > TASK_SIZE - PAGE_SIZE) | ||
309 | goto out; | 303 | goto out; |
310 | down_write(¤t->mm->mmap_sem); | 304 | down_write(¤t->mm->mmap_sem); |
311 | if (flags & MREMAP_FIXED) { | ||
312 | if (ARCH_SUN4C_SUN4 && | ||
313 | new_addr < 0xe0000000 && | ||
314 | new_addr + new_len > 0x20000000) | ||
315 | goto out_sem; | ||
316 | if (new_addr + new_len > TASK_SIZE - PAGE_SIZE) | ||
317 | goto out_sem; | ||
318 | } else if ((ARCH_SUN4C_SUN4 && addr < 0xe0000000 && | ||
319 | addr + new_len > 0x20000000) || | ||
320 | addr + new_len > TASK_SIZE - PAGE_SIZE) { | ||
321 | unsigned long map_flags = 0; | ||
322 | struct file *file = NULL; | ||
323 | |||
324 | ret = -ENOMEM; | ||
325 | if (!(flags & MREMAP_MAYMOVE)) | ||
326 | goto out_sem; | ||
327 | |||
328 | vma = find_vma(current->mm, addr); | ||
329 | if (vma) { | ||
330 | if (vma->vm_flags & VM_SHARED) | ||
331 | map_flags |= MAP_SHARED; | ||
332 | file = vma->vm_file; | ||
333 | } | ||
334 | |||
335 | new_addr = get_unmapped_area(file, addr, new_len, | ||
336 | vma ? vma->vm_pgoff : 0, | ||
337 | map_flags); | ||
338 | ret = new_addr; | ||
339 | if (new_addr & ~PAGE_MASK) | ||
340 | goto out_sem; | ||
341 | flags |= MREMAP_FIXED; | ||
342 | } | ||
343 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); | 305 | ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
344 | out_sem: | ||
345 | up_write(¤t->mm->mmap_sem); | 306 | up_write(¤t->mm->mmap_sem); |
346 | out: | 307 | out: |
347 | return ret; | 308 | return ret; |
diff --git a/arch/sparc/kernel/trampoline.S b/arch/sparc/kernel/trampoline.S index 2dcdaa1fd8cd..356c56aebc62 100644 --- a/arch/sparc/kernel/trampoline.S +++ b/arch/sparc/kernel/trampoline.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: trampoline.S,v 1.14 2002/01/11 08:45:38 davem Exp $ | 1 | /* |
2 | * trampoline.S: SMP cpu boot-up trampoline code. | 2 | * trampoline.S: SMP cpu boot-up trampoline code. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/kernel/traps.c b/arch/sparc/kernel/traps.c index d404e7994527..978e9d85949e 100644 --- a/arch/sparc/kernel/traps.c +++ b/arch/sparc/kernel/traps.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: traps.c,v 1.64 2000/09/03 15:00:49 anton Exp $ | 1 | /* |
2 | * arch/sparc/kernel/traps.c | 2 | * arch/sparc/kernel/traps.c |
3 | * | 3 | * |
4 | * Copyright 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/kernel/unaligned.c b/arch/sparc/kernel/unaligned.c index 33857be16661..c2a28c5ad650 100644 --- a/arch/sparc/kernel/unaligned.c +++ b/arch/sparc/kernel/unaligned.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: unaligned.c,v 1.23 2001/12/21 00:54:31 davem Exp $ | 1 | /* |
2 | * unaligned.c: Unaligned load/store trap handling with special | 2 | * unaligned.c: Unaligned load/store trap handling with special |
3 | * cases for the kernel to do them more quickly. | 3 | * cases for the kernel to do them more quickly. |
4 | * | 4 | * |
diff --git a/arch/sparc/kernel/wof.S b/arch/sparc/kernel/wof.S index 083b1215d515..4bce38dfe3c5 100644 --- a/arch/sparc/kernel/wof.S +++ b/arch/sparc/kernel/wof.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: wof.S,v 1.40 2000/01/08 16:38:18 anton Exp $ | 1 | /* |
2 | * wof.S: Sparc window overflow handler. | 2 | * wof.S: Sparc window overflow handler. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/kernel/wuf.S b/arch/sparc/kernel/wuf.S index d1a266bf103a..82e5145b0f77 100644 --- a/arch/sparc/kernel/wuf.S +++ b/arch/sparc/kernel/wuf.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: wuf.S,v 1.39 2000/01/08 16:38:18 anton Exp $ | 1 | /* |
2 | * wuf.S: Window underflow trap handler for the Sparc. | 2 | * wuf.S: Window underflow trap handler for the Sparc. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller | 4 | * Copyright (C) 1995 David S. Miller |
diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile index 76effdbea075..6e303e10c3b9 100644 --- a/arch/sparc/lib/Makefile +++ b/arch/sparc/lib/Makefile | |||
@@ -1,4 +1,3 @@ | |||
1 | # $Id: Makefile,v 1.35 2000/12/15 00:41:18 davem Exp $ | ||
2 | # Makefile for Sparc library files.. | 1 | # Makefile for Sparc library files.. |
3 | # | 2 | # |
4 | 3 | ||
diff --git a/arch/sparc/lib/ashldi3.S b/arch/sparc/lib/ashldi3.S index 52418a0cb3dd..17912e608716 100644 --- a/arch/sparc/lib/ashldi3.S +++ b/arch/sparc/lib/ashldi3.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: ashldi3.S,v 1.2 1999/11/19 04:11:46 davem Exp $ | 1 | /* |
2 | * ashldi3.S: GCC emits these for certain drivers playing | 2 | * ashldi3.S: GCC emits these for certain drivers playing |
3 | * with long longs. | 3 | * with long longs. |
4 | * | 4 | * |
diff --git a/arch/sparc/lib/ashrdi3.S b/arch/sparc/lib/ashrdi3.S index 2848237598a4..85398fd6dcc9 100644 --- a/arch/sparc/lib/ashrdi3.S +++ b/arch/sparc/lib/ashrdi3.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: ashrdi3.S,v 1.4 1999/11/19 04:11:49 davem Exp $ | 1 | /* |
2 | * ashrdi3.S: The filesystem code creates all kinds of references to | 2 | * ashrdi3.S: The filesystem code creates all kinds of references to |
3 | * this little routine on the sparc with gcc. | 3 | * this little routine on the sparc with gcc. |
4 | * | 4 | * |
diff --git a/arch/sparc/lib/blockops.S b/arch/sparc/lib/blockops.S index a7c7ffaa4a94..804be87f9a42 100644 --- a/arch/sparc/lib/blockops.S +++ b/arch/sparc/lib/blockops.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: blockops.S,v 1.8 1998/01/30 10:58:44 jj Exp $ | 1 | /* |
2 | * blockops.S: Common block zero optimized routines. | 2 | * blockops.S: Common block zero optimized routines. |
3 | * | 3 | * |
4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/lib/locks.S b/arch/sparc/lib/locks.S index b1df55cb2215..64f53f2b673d 100644 --- a/arch/sparc/lib/locks.S +++ b/arch/sparc/lib/locks.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: locks.S,v 1.16 2000/02/26 11:02:47 anton Exp $ | 1 | /* |
2 | * locks.S: SMP low-level lock primitives on Sparc. | 2 | * locks.S: SMP low-level lock primitives on Sparc. |
3 | * | 3 | * |
4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/lib/lshrdi3.S b/arch/sparc/lib/lshrdi3.S index 35abf5b2bd15..47a1354c1602 100644 --- a/arch/sparc/lib/lshrdi3.S +++ b/arch/sparc/lib/lshrdi3.S | |||
@@ -1,4 +1,3 @@ | |||
1 | /* $Id: lshrdi3.S,v 1.1 1999/03/21 06:37:45 davem Exp $ */ | ||
2 | 1 | ||
3 | .globl __lshrdi3 | 2 | .globl __lshrdi3 |
4 | __lshrdi3: | 3 | __lshrdi3: |
diff --git a/arch/sparc/lib/memscan.S b/arch/sparc/lib/memscan.S index 28e78ff090ac..4ff1657dfc24 100644 --- a/arch/sparc/lib/memscan.S +++ b/arch/sparc/lib/memscan.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: memscan.S,v 1.4 1996/09/08 02:01:20 davem Exp $ | 1 | /* |
2 | * memscan.S: Optimized memscan for the Sparc. | 2 | * memscan.S: Optimized memscan for the Sparc. |
3 | * | 3 | * |
4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/lib/mul.S b/arch/sparc/lib/mul.S index da693560d878..c45470d0b0ce 100644 --- a/arch/sparc/lib/mul.S +++ b/arch/sparc/lib/mul.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: mul.S,v 1.4 1996/09/30 02:22:32 davem Exp $ | 1 | /* |
2 | * mul.S: This routine was taken from glibc-1.09 and is covered | 2 | * mul.S: This routine was taken from glibc-1.09 and is covered |
3 | * by the GNU Library General Public License Version 2. | 3 | * by the GNU Library General Public License Version 2. |
4 | */ | 4 | */ |
diff --git a/arch/sparc/lib/rem.S b/arch/sparc/lib/rem.S index bf015a90d07e..42fb86252815 100644 --- a/arch/sparc/lib/rem.S +++ b/arch/sparc/lib/rem.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: rem.S,v 1.7 1996/09/30 02:22:34 davem Exp $ | 1 | /* |
2 | * rem.S: This routine was taken from glibc-1.09 and is covered | 2 | * rem.S: This routine was taken from glibc-1.09 and is covered |
3 | * by the GNU Library General Public License Version 2. | 3 | * by the GNU Library General Public License Version 2. |
4 | */ | 4 | */ |
diff --git a/arch/sparc/lib/rwsem.S b/arch/sparc/lib/rwsem.S index f406b1f22791..9675268e7fde 100644 --- a/arch/sparc/lib/rwsem.S +++ b/arch/sparc/lib/rwsem.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: rwsem.S,v 1.5 2000/05/09 17:40:13 davem Exp $ | 1 | /* |
2 | * Assembly part of rw semaphores. | 2 | * Assembly part of rw semaphores. |
3 | * | 3 | * |
4 | * Copyright (C) 1999 Jakub Jelinek (jakub@redhat.com) | 4 | * Copyright (C) 1999 Jakub Jelinek (jakub@redhat.com) |
diff --git a/arch/sparc/lib/sdiv.S b/arch/sparc/lib/sdiv.S index af9451629d0b..f0a0d4e4db78 100644 --- a/arch/sparc/lib/sdiv.S +++ b/arch/sparc/lib/sdiv.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: sdiv.S,v 1.6 1996/10/02 17:37:00 davem Exp $ | 1 | /* |
2 | * sdiv.S: This routine was taken from glibc-1.09 and is covered | 2 | * sdiv.S: This routine was taken from glibc-1.09 and is covered |
3 | * by the GNU Library General Public License Version 2. | 3 | * by the GNU Library General Public License Version 2. |
4 | */ | 4 | */ |
diff --git a/arch/sparc/lib/strncmp.S b/arch/sparc/lib/strncmp.S index 615626805d4b..494ec664537a 100644 --- a/arch/sparc/lib/strncmp.S +++ b/arch/sparc/lib/strncmp.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: strncmp.S,v 1.2 1996/09/09 02:47:20 davem Exp $ | 1 | /* |
2 | * strncmp.S: Hand optimized Sparc assembly of GCC output from GNU libc | 2 | * strncmp.S: Hand optimized Sparc assembly of GCC output from GNU libc |
3 | * generic strncmp routine. | 3 | * generic strncmp routine. |
4 | */ | 4 | */ |
diff --git a/arch/sparc/lib/udiv.S b/arch/sparc/lib/udiv.S index 169e01da6715..2101405bdfcb 100644 --- a/arch/sparc/lib/udiv.S +++ b/arch/sparc/lib/udiv.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: udiv.S,v 1.4 1996/09/30 02:22:38 davem Exp $ | 1 | /* |
2 | * udiv.S: This routine was taken from glibc-1.09 and is covered | 2 | * udiv.S: This routine was taken from glibc-1.09 and is covered |
3 | * by the GNU Library General Public License Version 2. | 3 | * by the GNU Library General Public License Version 2. |
4 | */ | 4 | */ |
diff --git a/arch/sparc/lib/umul.S b/arch/sparc/lib/umul.S index f0e5b20a2536..1f36ae682529 100644 --- a/arch/sparc/lib/umul.S +++ b/arch/sparc/lib/umul.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: umul.S,v 1.4 1996/09/30 02:22:39 davem Exp $ | 1 | /* |
2 | * umul.S: This routine was taken from glibc-1.09 and is covered | 2 | * umul.S: This routine was taken from glibc-1.09 and is covered |
3 | * by the GNU Library General Public License Version 2. | 3 | * by the GNU Library General Public License Version 2. |
4 | */ | 4 | */ |
diff --git a/arch/sparc/lib/urem.S b/arch/sparc/lib/urem.S index 6b92bdc8b04c..77123eb83c44 100644 --- a/arch/sparc/lib/urem.S +++ b/arch/sparc/lib/urem.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: urem.S,v 1.4 1996/09/30 02:22:42 davem Exp $ | 1 | /* |
2 | * urem.S: This routine was taken from glibc-1.09 and is covered | 2 | * urem.S: This routine was taken from glibc-1.09 and is covered |
3 | * by the GNU Library General Public License Version 2. | 3 | * by the GNU Library General Public License Version 2. |
4 | */ | 4 | */ |
diff --git a/arch/sparc/math-emu/ashldi3.S b/arch/sparc/math-emu/ashldi3.S index eab1d097296a..7230ff5c7aa1 100644 --- a/arch/sparc/math-emu/ashldi3.S +++ b/arch/sparc/math-emu/ashldi3.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: ashldi3.S,v 1.1 1998/04/06 16:09:28 jj Exp $ | 1 | /* |
2 | * ashldi3.S: Math-emu code creates all kinds of references to | 2 | * ashldi3.S: Math-emu code creates all kinds of references to |
3 | * this little routine on the sparc with gcc. | 3 | * this little routine on the sparc with gcc. |
4 | * | 4 | * |
diff --git a/arch/sparc/mm/Makefile b/arch/sparc/mm/Makefile index 16eeba4b991a..109c8b22cb38 100644 --- a/arch/sparc/mm/Makefile +++ b/arch/sparc/mm/Makefile | |||
@@ -1,4 +1,3 @@ | |||
1 | # $Id: Makefile,v 1.38 2000/12/15 00:41:22 davem Exp $ | ||
2 | # Makefile for the linux Sparc-specific parts of the memory manager. | 1 | # Makefile for the linux Sparc-specific parts of the memory manager. |
3 | # | 2 | # |
4 | 3 | ||
diff --git a/arch/sparc/mm/fault.c b/arch/sparc/mm/fault.c index e4d9c8e19df5..0a3cd8f6cfe4 100644 --- a/arch/sparc/mm/fault.c +++ b/arch/sparc/mm/fault.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: fault.c,v 1.122 2001/11/17 07:19:26 davem Exp $ | 1 | /* |
2 | * fault.c: Page fault handlers for the Sparc. | 2 | * fault.c: Page fault handlers for the Sparc. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
@@ -47,64 +47,15 @@ int vac_size, vac_linesize, vac_do_hw_vac_flushes; | |||
47 | int vac_entries_per_context, vac_entries_per_segment; | 47 | int vac_entries_per_context, vac_entries_per_segment; |
48 | int vac_entries_per_page; | 48 | int vac_entries_per_page; |
49 | 49 | ||
50 | /* Nice, simple, prom library does all the sweating for us. ;) */ | 50 | /* Return how much physical memory we have. */ |
51 | int prom_probe_memory (void) | 51 | unsigned long probe_memory(void) |
52 | { | ||
53 | register struct linux_mlist_v0 *mlist; | ||
54 | register unsigned long bytes, base_paddr, tally; | ||
55 | register int i; | ||
56 | |||
57 | i = 0; | ||
58 | mlist= *prom_meminfo()->v0_available; | ||
59 | bytes = tally = mlist->num_bytes; | ||
60 | base_paddr = (unsigned long) mlist->start_adr; | ||
61 | |||
62 | sp_banks[0].base_addr = base_paddr; | ||
63 | sp_banks[0].num_bytes = bytes; | ||
64 | |||
65 | while (mlist->theres_more != (void *) 0){ | ||
66 | i++; | ||
67 | mlist = mlist->theres_more; | ||
68 | bytes = mlist->num_bytes; | ||
69 | tally += bytes; | ||
70 | if (i > SPARC_PHYS_BANKS-1) { | ||
71 | printk ("The machine has more banks than " | ||
72 | "this kernel can support\n" | ||
73 | "Increase the SPARC_PHYS_BANKS " | ||
74 | "setting (currently %d)\n", | ||
75 | SPARC_PHYS_BANKS); | ||
76 | i = SPARC_PHYS_BANKS-1; | ||
77 | break; | ||
78 | } | ||
79 | |||
80 | sp_banks[i].base_addr = (unsigned long) mlist->start_adr; | ||
81 | sp_banks[i].num_bytes = mlist->num_bytes; | ||
82 | } | ||
83 | |||
84 | i++; | ||
85 | sp_banks[i].base_addr = 0xdeadbeef; | ||
86 | sp_banks[i].num_bytes = 0; | ||
87 | |||
88 | /* Now mask all bank sizes on a page boundary, it is all we can | ||
89 | * use anyways. | ||
90 | */ | ||
91 | for(i=0; sp_banks[i].num_bytes != 0; i++) | ||
92 | sp_banks[i].num_bytes &= PAGE_MASK; | ||
93 | |||
94 | return tally; | ||
95 | } | ||
96 | |||
97 | /* Traverse the memory lists in the prom to see how much physical we | ||
98 | * have. | ||
99 | */ | ||
100 | unsigned long | ||
101 | probe_memory(void) | ||
102 | { | 52 | { |
103 | int total; | 53 | unsigned long total = 0; |
54 | int i; | ||
104 | 55 | ||
105 | total = prom_probe_memory(); | 56 | for (i = 0; sp_banks[i].num_bytes; i++) |
57 | total += sp_banks[i].num_bytes; | ||
106 | 58 | ||
107 | /* Oh man, much nicer, keep the dirt in promlib. */ | ||
108 | return total; | 59 | return total; |
109 | } | 60 | } |
110 | 61 | ||
diff --git a/arch/sparc/mm/generic.c b/arch/sparc/mm/generic.c index 1ef7fa03fefe..a289261da9fd 100644 --- a/arch/sparc/mm/generic.c +++ b/arch/sparc/mm/generic.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: generic.c,v 1.14 2001/12/21 04:56:15 davem Exp $ | 1 | /* |
2 | * generic.c: Generic Sparc mm routines that are not dependent upon | 2 | * generic.c: Generic Sparc mm routines that are not dependent upon |
3 | * MMU type but are Sparc specific. | 3 | * MMU type but are Sparc specific. |
4 | * | 4 | * |
diff --git a/arch/sparc/mm/hypersparc.S b/arch/sparc/mm/hypersparc.S index d29cc24c5bba..44aad32eeb4e 100644 --- a/arch/sparc/mm/hypersparc.S +++ b/arch/sparc/mm/hypersparc.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: hypersparc.S,v 1.18 2001/12/21 04:56:15 davem Exp $ | 1 | /* |
2 | * hypersparc.S: High speed Hypersparc mmu/cache operations. | 2 | * hypersparc.S: High speed Hypersparc mmu/cache operations. |
3 | * | 3 | * |
4 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/mm/init.c b/arch/sparc/mm/init.c index b89837accc88..7794ecb896e3 100644 --- a/arch/sparc/mm/init.c +++ b/arch/sparc/mm/init.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: init.c,v 1.103 2001/11/19 19:03:08 davem Exp $ | 1 | /* |
2 | * linux/arch/sparc/mm/init.c | 2 | * linux/arch/sparc/mm/init.c |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c index b86dfce8eee4..f167835db3df 100644 --- a/arch/sparc/mm/io-unit.c +++ b/arch/sparc/mm/io-unit.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: io-unit.c,v 1.24 2001/12/17 07:05:09 davem Exp $ | 1 | /* |
2 | * io-unit.c: IO-UNIT specific routines for memory management. | 2 | * io-unit.c: IO-UNIT specific routines for memory management. |
3 | * | 3 | * |
4 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | 4 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
diff --git a/arch/sparc/mm/loadmmu.c b/arch/sparc/mm/loadmmu.c index 2d9cd65160a4..652be05acbea 100644 --- a/arch/sparc/mm/loadmmu.c +++ b/arch/sparc/mm/loadmmu.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: loadmmu.c,v 1.56 2000/02/08 20:24:21 davem Exp $ | 1 | /* |
2 | * loadmmu.c: This code loads up all the mm function pointers once the | 2 | * loadmmu.c: This code loads up all the mm function pointers once the |
3 | * machine type has been determined. It also sets the static | 3 | * machine type has been determined. It also sets the static |
4 | * mmu values such as PAGE_NONE, etc. | 4 | * mmu values such as PAGE_NONE, etc. |
diff --git a/arch/sparc/mm/nosrmmu.c b/arch/sparc/mm/nosrmmu.c index 9e215659697e..3701f70fc30a 100644 --- a/arch/sparc/mm/nosrmmu.c +++ b/arch/sparc/mm/nosrmmu.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: nosrmmu.c,v 1.5 1999/11/19 04:11:54 davem Exp $ | 1 | /* |
2 | * nosrmmu.c: This file is a bunch of dummies for sun4 compiles, | 2 | * nosrmmu.c: This file is a bunch of dummies for sun4 compiles, |
3 | * so that it does not need srmmu and avoid ifdefs. | 3 | * so that it does not need srmmu and avoid ifdefs. |
4 | * | 4 | * |
diff --git a/arch/sparc/mm/nosun4c.c b/arch/sparc/mm/nosun4c.c index ea2e2105341d..196263f895b7 100644 --- a/arch/sparc/mm/nosun4c.c +++ b/arch/sparc/mm/nosun4c.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: nosun4c.c,v 1.3 2000/02/14 04:52:36 jj Exp $ | 1 | /* |
2 | * nosun4c.c: This file is a bunch of dummies for SMP compiles, | 2 | * nosun4c.c: This file is a bunch of dummies for SMP compiles, |
3 | * so that it does not need sun4c and avoid ifdefs. | 3 | * so that it does not need sun4c and avoid ifdefs. |
4 | * | 4 | * |
diff --git a/arch/sparc/mm/swift.S b/arch/sparc/mm/swift.S index 9f4cd396a0fa..c801c3953a00 100644 --- a/arch/sparc/mm/swift.S +++ b/arch/sparc/mm/swift.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: swift.S,v 1.9 2002/01/08 11:11:59 davem Exp $ | 1 | /* |
2 | * swift.S: MicroSparc-II mmu/cache operations. | 2 | * swift.S: MicroSparc-II mmu/cache operations. |
3 | * | 3 | * |
4 | * Copyright (C) 1999 David S. Miller (davem@redhat.com) | 4 | * Copyright (C) 1999 David S. Miller (davem@redhat.com) |
diff --git a/arch/sparc/mm/tsunami.S b/arch/sparc/mm/tsunami.S index 4988e6a310bb..db0d6de33a87 100644 --- a/arch/sparc/mm/tsunami.S +++ b/arch/sparc/mm/tsunami.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: tsunami.S,v 1.7 2001/12/21 04:56:15 davem Exp $ | 1 | /* |
2 | * tsunami.S: High speed MicroSparc-I mmu/cache operations. | 2 | * tsunami.S: High speed MicroSparc-I mmu/cache operations. |
3 | * | 3 | * |
4 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/mm/viking.S b/arch/sparc/mm/viking.S index 754c622548a5..6dfcc13d3100 100644 --- a/arch/sparc/mm/viking.S +++ b/arch/sparc/mm/viking.S | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: viking.S,v 1.19 2001/12/21 04:56:15 davem Exp $ | 1 | /* |
2 | * viking.S: High speed Viking cache/mmu operations | 2 | * viking.S: High speed Viking cache/mmu operations |
3 | * | 3 | * |
4 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) | 4 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) |
diff --git a/arch/sparc/prom/Makefile b/arch/sparc/prom/Makefile index 2b217ee40703..7f5eacfcfbcf 100644 --- a/arch/sparc/prom/Makefile +++ b/arch/sparc/prom/Makefile | |||
@@ -1,4 +1,3 @@ | |||
1 | # $Id: Makefile,v 1.8 2000/12/15 00:41:22 davem Exp $ | ||
2 | # Makefile for the Sun Boot PROM interface library under | 1 | # Makefile for the Sun Boot PROM interface library under |
3 | # Linux. | 2 | # Linux. |
4 | # | 3 | # |
diff --git a/arch/sparc/prom/bootstr.c b/arch/sparc/prom/bootstr.c index cfdeac2788d1..5a35c768ff7c 100644 --- a/arch/sparc/prom/bootstr.c +++ b/arch/sparc/prom/bootstr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: bootstr.c,v 1.20 2000/02/08 20:24:23 davem Exp $ | 1 | /* |
2 | * bootstr.c: Boot string/argument acquisition from the PROM. | 2 | * bootstr.c: Boot string/argument acquisition from the PROM. |
3 | * | 3 | * |
4 | * Copyright(C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright(C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/prom/console.c b/arch/sparc/prom/console.c index 2a007a784415..790057a34616 100644 --- a/arch/sparc/prom/console.c +++ b/arch/sparc/prom/console.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: console.c,v 1.25 2001/10/30 04:54:22 davem Exp $ | 1 | /* |
2 | * console.c: Routines that deal with sending and receiving IO | 2 | * console.c: Routines that deal with sending and receiving IO |
3 | * to/from the current console device using the PROM. | 3 | * to/from the current console device using the PROM. |
4 | * | 4 | * |
diff --git a/arch/sparc/prom/devmap.c b/arch/sparc/prom/devmap.c index eb12073578ad..1e517915b0df 100644 --- a/arch/sparc/prom/devmap.c +++ b/arch/sparc/prom/devmap.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: devmap.c,v 1.7 2000/08/26 02:38:03 anton Exp $ | 1 | /* |
2 | * promdevmap.c: Map device/IO areas to virtual addresses. | 2 | * promdevmap.c: Map device/IO areas to virtual addresses. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/prom/devops.c b/arch/sparc/prom/devops.c index 61919b54f6cc..9f1a95c91ad1 100644 --- a/arch/sparc/prom/devops.c +++ b/arch/sparc/prom/devops.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: devops.c,v 1.13 2000/08/26 02:38:03 anton Exp $ | 1 | /* |
2 | * devops.c: Device operations using the PROM. | 2 | * devops.c: Device operations using the PROM. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/prom/init.c b/arch/sparc/prom/init.c index 50abfb1b880e..729f87066945 100644 --- a/arch/sparc/prom/init.c +++ b/arch/sparc/prom/init.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: init.c,v 1.14 2000/01/29 01:09:12 anton Exp $ | 1 | /* |
2 | * init.c: Initialize internal variables used by the PROM | 2 | * init.c: Initialize internal variables used by the PROM |
3 | * library functions. | 3 | * library functions. |
4 | * | 4 | * |
@@ -21,8 +21,6 @@ linux_sun4_romvec *sun4_romvec; | |||
21 | /* The root node of the prom device tree. */ | 21 | /* The root node of the prom device tree. */ |
22 | int prom_root_node; | 22 | int prom_root_node; |
23 | 23 | ||
24 | int prom_stdin, prom_stdout; | ||
25 | |||
26 | /* Pointer to the device tree operations structure. */ | 24 | /* Pointer to the device tree operations structure. */ |
27 | struct linux_nodeops *prom_nodeops; | 25 | struct linux_nodeops *prom_nodeops; |
28 | 26 | ||
@@ -74,11 +72,6 @@ void __init prom_init(struct linux_romvec *rp) | |||
74 | (((unsigned long) prom_nodeops) == -1)) | 72 | (((unsigned long) prom_nodeops) == -1)) |
75 | prom_halt(); | 73 | prom_halt(); |
76 | 74 | ||
77 | if(prom_vers == PROM_V2 || prom_vers == PROM_V3) { | ||
78 | prom_stdout = *romvec->pv_v2bootargs.fd_stdout; | ||
79 | prom_stdin = *romvec->pv_v2bootargs.fd_stdin; | ||
80 | } | ||
81 | |||
82 | prom_meminit(); | 75 | prom_meminit(); |
83 | 76 | ||
84 | prom_ranges_init(); | 77 | prom_ranges_init(); |
diff --git a/arch/sparc/prom/memory.c b/arch/sparc/prom/memory.c index b0c0f9c4fc14..947f047dc95a 100644 --- a/arch/sparc/prom/memory.c +++ b/arch/sparc/prom/memory.c | |||
@@ -1,215 +1,100 @@ | |||
1 | /* $Id: memory.c,v 1.15 2000/01/29 01:09:12 anton Exp $ | 1 | /* memory.c: Prom routine for acquiring various bits of information |
2 | * memory.c: Prom routine for acquiring various bits of information | ||
3 | * about RAM on the machine, both virtual and physical. | 2 | * about RAM on the machine, both virtual and physical. |
4 | * | 3 | * |
5 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995, 2008 David S. Miller (davem@davemloft.net) |
6 | * Copyright (C) 1997 Michael A. Griffith (grif@acm.org) | 5 | * Copyright (C) 1997 Michael A. Griffith (grif@acm.org) |
7 | */ | 6 | */ |
8 | 7 | ||
9 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
9 | #include <linux/sort.h> | ||
10 | #include <linux/init.h> | 10 | #include <linux/init.h> |
11 | 11 | ||
12 | #include <asm/openprom.h> | 12 | #include <asm/openprom.h> |
13 | #include <asm/sun4prom.h> | 13 | #include <asm/sun4prom.h> |
14 | #include <asm/oplib.h> | 14 | #include <asm/oplib.h> |
15 | #include <asm/page.h> | ||
15 | 16 | ||
16 | /* This routine, for consistency, returns the ram parameters in the | 17 | static int __init prom_meminit_v0(void) |
17 | * V0 prom memory descriptor format. I choose this format because I | 18 | { |
18 | * think it was the easiest to work with. I feel the religious | 19 | struct linux_mlist_v0 *p; |
19 | * arguments now... ;) Also, I return the linked lists sorted to | 20 | int index; |
20 | * prevent paging_init() upset stomach as I have not yet written | 21 | |
21 | * the pepto-bismol kernel module yet. | 22 | index = 0; |
22 | */ | 23 | for (p = *(romvec->pv_v0mem.v0_available); p; p = p->theres_more) { |
24 | sp_banks[index].base_addr = (unsigned long) p->start_adr; | ||
25 | sp_banks[index].num_bytes = p->num_bytes; | ||
26 | index++; | ||
27 | } | ||
23 | 28 | ||
24 | struct linux_prom_registers prom_reg_memlist[64]; | 29 | return index; |
25 | struct linux_prom_registers prom_reg_tmp[64]; | 30 | } |
26 | 31 | ||
27 | struct linux_mlist_v0 prom_phys_total[64]; | 32 | static int __init prom_meminit_v2(void) |
28 | struct linux_mlist_v0 prom_prom_taken[64]; | 33 | { |
29 | struct linux_mlist_v0 prom_phys_avail[64]; | 34 | struct linux_prom_registers reg[64]; |
35 | int node, size, num_ents, i; | ||
30 | 36 | ||
31 | struct linux_mlist_v0 *prom_ptot_ptr = prom_phys_total; | 37 | node = prom_searchsiblings(prom_getchild(prom_root_node), "memory"); |
32 | struct linux_mlist_v0 *prom_ptak_ptr = prom_prom_taken; | 38 | size = prom_getproperty(node, "available", (char *) reg, sizeof(reg)); |
33 | struct linux_mlist_v0 *prom_pavl_ptr = prom_phys_avail; | 39 | num_ents = size / sizeof(struct linux_prom_registers); |
34 | 40 | ||
35 | struct linux_mem_v0 prom_memlist; | 41 | for (i = 0; i < num_ents; i++) { |
42 | sp_banks[i].base_addr = reg[i].phys_addr; | ||
43 | sp_banks[i].num_bytes = reg[i].reg_size; | ||
44 | } | ||
36 | 45 | ||
46 | return num_ents; | ||
47 | } | ||
37 | 48 | ||
38 | /* Internal Prom library routine to sort a linux_mlist_v0 memory | 49 | static int __init prom_meminit_sun4(void) |
39 | * list. Used below in initialization. | ||
40 | */ | ||
41 | static void __init | ||
42 | prom_sortmemlist(struct linux_mlist_v0 *thislist) | ||
43 | { | 50 | { |
44 | int swapi = 0; | 51 | #ifdef CONFIG_SUN4 |
45 | int i, mitr, tmpsize; | 52 | sp_banks[0].base_addr = 0; |
46 | char *tmpaddr; | 53 | sp_banks[0].num_bytes = *(sun4_romvec->memoryavail); |
47 | char *lowest; | 54 | #endif |
48 | 55 | return 1; | |
49 | for(i=0; thislist[i].theres_more; i++) { | 56 | } |
50 | lowest = thislist[i].start_adr; | 57 | |
51 | for(mitr = i+1; thislist[mitr-1].theres_more; mitr++) | 58 | static int sp_banks_cmp(const void *a, const void *b) |
52 | if(thislist[mitr].start_adr < lowest) { | 59 | { |
53 | lowest = thislist[mitr].start_adr; | 60 | const struct sparc_phys_banks *x = a, *y = b; |
54 | swapi = mitr; | ||
55 | } | ||
56 | if(lowest == thislist[i].start_adr) continue; | ||
57 | tmpaddr = thislist[swapi].start_adr; | ||
58 | tmpsize = thislist[swapi].num_bytes; | ||
59 | for(mitr = swapi; mitr > i; mitr--) { | ||
60 | thislist[mitr].start_adr = thislist[mitr-1].start_adr; | ||
61 | thislist[mitr].num_bytes = thislist[mitr-1].num_bytes; | ||
62 | } | ||
63 | thislist[i].start_adr = tmpaddr; | ||
64 | thislist[i].num_bytes = tmpsize; | ||
65 | } | ||
66 | 61 | ||
67 | return; | 62 | if (x->base_addr > y->base_addr) |
63 | return 1; | ||
64 | if (x->base_addr < y->base_addr) | ||
65 | return -1; | ||
66 | return 0; | ||
68 | } | 67 | } |
69 | 68 | ||
70 | /* Initialize the memory lists based upon the prom version. */ | 69 | /* Initialize the memory lists based upon the prom version. */ |
71 | void __init prom_meminit(void) | 70 | void __init prom_meminit(void) |
72 | { | 71 | { |
73 | int node = 0; | 72 | int i, num_ents = 0; |
74 | unsigned int iter, num_regs; | ||
75 | struct linux_mlist_v0 *mptr; /* ptr for traversal */ | ||
76 | 73 | ||
77 | switch(prom_vers) { | 74 | switch (prom_vers) { |
78 | case PROM_V0: | 75 | case PROM_V0: |
79 | /* Nice, kind of easier to do in this case. */ | 76 | num_ents = prom_meminit_v0(); |
80 | /* First, the total physical descriptors. */ | ||
81 | for(mptr = (*(romvec->pv_v0mem.v0_totphys)), iter=0; | ||
82 | mptr; mptr=mptr->theres_more, iter++) { | ||
83 | prom_phys_total[iter].start_adr = mptr->start_adr; | ||
84 | prom_phys_total[iter].num_bytes = mptr->num_bytes; | ||
85 | prom_phys_total[iter].theres_more = &prom_phys_total[iter+1]; | ||
86 | } | ||
87 | prom_phys_total[iter-1].theres_more = NULL; | ||
88 | /* Second, the total prom taken descriptors. */ | ||
89 | for(mptr = (*(romvec->pv_v0mem.v0_prommap)), iter=0; | ||
90 | mptr; mptr=mptr->theres_more, iter++) { | ||
91 | prom_prom_taken[iter].start_adr = mptr->start_adr; | ||
92 | prom_prom_taken[iter].num_bytes = mptr->num_bytes; | ||
93 | prom_prom_taken[iter].theres_more = &prom_prom_taken[iter+1]; | ||
94 | } | ||
95 | prom_prom_taken[iter-1].theres_more = NULL; | ||
96 | /* Last, the available physical descriptors. */ | ||
97 | for(mptr = (*(romvec->pv_v0mem.v0_available)), iter=0; | ||
98 | mptr; mptr=mptr->theres_more, iter++) { | ||
99 | prom_phys_avail[iter].start_adr = mptr->start_adr; | ||
100 | prom_phys_avail[iter].num_bytes = mptr->num_bytes; | ||
101 | prom_phys_avail[iter].theres_more = &prom_phys_avail[iter+1]; | ||
102 | } | ||
103 | prom_phys_avail[iter-1].theres_more = NULL; | ||
104 | /* Sort all the lists. */ | ||
105 | prom_sortmemlist(prom_phys_total); | ||
106 | prom_sortmemlist(prom_prom_taken); | ||
107 | prom_sortmemlist(prom_phys_avail); | ||
108 | break; | 77 | break; |
78 | |||
109 | case PROM_V2: | 79 | case PROM_V2: |
110 | case PROM_V3: | 80 | case PROM_V3: |
111 | /* Grrr, have to traverse the prom device tree ;( */ | 81 | num_ents = prom_meminit_v2(); |
112 | node = prom_getchild(prom_root_node); | ||
113 | node = prom_searchsiblings(node, "memory"); | ||
114 | num_regs = prom_getproperty(node, "available", | ||
115 | (char *) prom_reg_memlist, | ||
116 | sizeof(prom_reg_memlist)); | ||
117 | num_regs = (num_regs/sizeof(struct linux_prom_registers)); | ||
118 | for(iter=0; iter<num_regs; iter++) { | ||
119 | prom_phys_avail[iter].start_adr = | ||
120 | (char *) prom_reg_memlist[iter].phys_addr; | ||
121 | prom_phys_avail[iter].num_bytes = | ||
122 | (unsigned long) prom_reg_memlist[iter].reg_size; | ||
123 | prom_phys_avail[iter].theres_more = | ||
124 | &prom_phys_avail[iter+1]; | ||
125 | } | ||
126 | prom_phys_avail[iter-1].theres_more = NULL; | ||
127 | |||
128 | num_regs = prom_getproperty(node, "reg", | ||
129 | (char *) prom_reg_memlist, | ||
130 | sizeof(prom_reg_memlist)); | ||
131 | num_regs = (num_regs/sizeof(struct linux_prom_registers)); | ||
132 | for(iter=0; iter<num_regs; iter++) { | ||
133 | prom_phys_total[iter].start_adr = | ||
134 | (char *) prom_reg_memlist[iter].phys_addr; | ||
135 | prom_phys_total[iter].num_bytes = | ||
136 | (unsigned long) prom_reg_memlist[iter].reg_size; | ||
137 | prom_phys_total[iter].theres_more = | ||
138 | &prom_phys_total[iter+1]; | ||
139 | } | ||
140 | prom_phys_total[iter-1].theres_more = NULL; | ||
141 | |||
142 | node = prom_getchild(prom_root_node); | ||
143 | node = prom_searchsiblings(node, "virtual-memory"); | ||
144 | num_regs = prom_getproperty(node, "available", | ||
145 | (char *) prom_reg_memlist, | ||
146 | sizeof(prom_reg_memlist)); | ||
147 | num_regs = (num_regs/sizeof(struct linux_prom_registers)); | ||
148 | |||
149 | /* Convert available virtual areas to taken virtual | ||
150 | * areas. First sort, then convert. | ||
151 | */ | ||
152 | for(iter=0; iter<num_regs; iter++) { | ||
153 | prom_prom_taken[iter].start_adr = | ||
154 | (char *) prom_reg_memlist[iter].phys_addr; | ||
155 | prom_prom_taken[iter].num_bytes = | ||
156 | (unsigned long) prom_reg_memlist[iter].reg_size; | ||
157 | prom_prom_taken[iter].theres_more = | ||
158 | &prom_prom_taken[iter+1]; | ||
159 | } | ||
160 | prom_prom_taken[iter-1].theres_more = NULL; | ||
161 | |||
162 | prom_sortmemlist(prom_prom_taken); | ||
163 | |||
164 | /* Finally, convert. */ | ||
165 | for(iter=0; iter<num_regs; iter++) { | ||
166 | prom_prom_taken[iter].start_adr = | ||
167 | prom_prom_taken[iter].start_adr + | ||
168 | prom_prom_taken[iter].num_bytes; | ||
169 | prom_prom_taken[iter].num_bytes = | ||
170 | prom_prom_taken[iter+1].start_adr - | ||
171 | prom_prom_taken[iter].start_adr; | ||
172 | } | ||
173 | prom_prom_taken[iter-1].num_bytes = | ||
174 | 0xffffffff - (unsigned long) prom_prom_taken[iter-1].start_adr; | ||
175 | |||
176 | /* Sort the other two lists. */ | ||
177 | prom_sortmemlist(prom_phys_total); | ||
178 | prom_sortmemlist(prom_phys_avail); | ||
179 | break; | 82 | break; |
180 | 83 | ||
181 | case PROM_SUN4: | 84 | case PROM_SUN4: |
182 | #ifdef CONFIG_SUN4 | 85 | num_ents = prom_meminit_sun4(); |
183 | /* how simple :) */ | ||
184 | prom_phys_total[0].start_adr = NULL; | ||
185 | prom_phys_total[0].num_bytes = *(sun4_romvec->memorysize); | ||
186 | prom_phys_total[0].theres_more = NULL; | ||
187 | prom_prom_taken[0].start_adr = NULL; | ||
188 | prom_prom_taken[0].num_bytes = 0x0; | ||
189 | prom_prom_taken[0].theres_more = NULL; | ||
190 | prom_phys_avail[0].start_adr = NULL; | ||
191 | prom_phys_avail[0].num_bytes = *(sun4_romvec->memoryavail); | ||
192 | prom_phys_avail[0].theres_more = NULL; | ||
193 | #endif | ||
194 | break; | 86 | break; |
195 | 87 | ||
196 | default: | 88 | default: |
197 | break; | 89 | break; |
198 | }; | 90 | } |
199 | 91 | sort(sp_banks, num_ents, sizeof(struct sparc_phys_banks), | |
200 | /* Link all the lists into the top-level descriptor. */ | 92 | sp_banks_cmp, NULL); |
201 | prom_memlist.v0_totphys=&prom_ptot_ptr; | ||
202 | prom_memlist.v0_prommap=&prom_ptak_ptr; | ||
203 | prom_memlist.v0_available=&prom_pavl_ptr; | ||
204 | 93 | ||
205 | return; | 94 | /* Sentinel. */ |
206 | } | 95 | sp_banks[num_ents].base_addr = 0xdeadbeef; |
96 | sp_banks[num_ents].num_bytes = 0; | ||
207 | 97 | ||
208 | /* This returns a pointer to our libraries internal v0 format | 98 | for (i = 0; i < num_ents; i++) |
209 | * memory descriptor. | 99 | sp_banks[i].num_bytes &= PAGE_MASK; |
210 | */ | ||
211 | struct linux_mem_v0 * | ||
212 | prom_meminfo(void) | ||
213 | { | ||
214 | return &prom_memlist; | ||
215 | } | 100 | } |
diff --git a/arch/sparc/prom/misc.c b/arch/sparc/prom/misc.c index d9fb3af41c1f..49b5057b9601 100644 --- a/arch/sparc/prom/misc.c +++ b/arch/sparc/prom/misc.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: misc.c,v 1.18 2000/08/26 02:38:03 anton Exp $ | 1 | /* |
2 | * misc.c: Miscellaneous prom functions that don't belong | 2 | * misc.c: Miscellaneous prom functions that don't belong |
3 | * anywhere else. | 3 | * anywhere else. |
4 | * | 4 | * |
diff --git a/arch/sparc/prom/mp.c b/arch/sparc/prom/mp.c index 92fe3739fdb8..4c4dc79f65af 100644 --- a/arch/sparc/prom/mp.c +++ b/arch/sparc/prom/mp.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: mp.c,v 1.12 2000/08/26 02:38:03 anton Exp $ | 1 | /* |
2 | * mp.c: OpenBoot Prom Multiprocessor support routines. Don't call | 2 | * mp.c: OpenBoot Prom Multiprocessor support routines. Don't call |
3 | * these on a UP or else you will halt and catch fire. ;) | 3 | * these on a UP or else you will halt and catch fire. ;) |
4 | * | 4 | * |
diff --git a/arch/sparc/prom/palloc.c b/arch/sparc/prom/palloc.c index 84ce8bc54473..20be339cc2ce 100644 --- a/arch/sparc/prom/palloc.c +++ b/arch/sparc/prom/palloc.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: palloc.c,v 1.4 1996/04/25 06:09:48 davem Exp $ | 1 | /* |
2 | * palloc.c: Memory allocation from the Sun PROM. | 2 | * palloc.c: Memory allocation from the Sun PROM. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/prom/ranges.c b/arch/sparc/prom/ranges.c index a2920323c900..f9b7def35f6e 100644 --- a/arch/sparc/prom/ranges.c +++ b/arch/sparc/prom/ranges.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: ranges.c,v 1.15 2001/12/19 00:29:51 davem Exp $ | 1 | /* |
2 | * ranges.c: Handle ranges in newer proms for obio/sbus. | 2 | * ranges.c: Handle ranges in newer proms for obio/sbus. |
3 | * | 3 | * |
4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) |
diff --git a/arch/sparc/prom/segment.c b/arch/sparc/prom/segment.c index 09d6460165ab..04fd03a7f926 100644 --- a/arch/sparc/prom/segment.c +++ b/arch/sparc/prom/segment.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: segment.c,v 1.7 2000/08/26 02:38:03 anton Exp $ | 1 | /* |
2 | * segment.c: Prom routine to map segments in other contexts before | 2 | * segment.c: Prom routine to map segments in other contexts before |
3 | * a standalone is completely mapped. This is for sun4 and | 3 | * a standalone is completely mapped. This is for sun4 and |
4 | * sun4c architectures only. | 4 | * sun4c architectures only. |
diff --git a/arch/sparc/prom/tree.c b/arch/sparc/prom/tree.c index 5ec246573a98..f228fe057b24 100644 --- a/arch/sparc/prom/tree.c +++ b/arch/sparc/prom/tree.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: tree.c,v 1.26 2000/08/26 02:38:03 anton Exp $ | 1 | /* |
2 | * tree.c: Basic device tree traversal/scanning for the Linux | 2 | * tree.c: Basic device tree traversal/scanning for the Linux |
3 | * prom library. | 3 | * prom library. |
4 | * | 4 | * |