diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2008-07-11 09:36:25 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2008-07-11 09:36:25 -0400 |
commit | a8931ef380c92d121ae74ecfb03b2d63f72eea6f (patch) | |
tree | 980fb6b019e11e6cb1ece55b7faff184721a8053 /arch/mips/kernel | |
parent | 90574d0a4d4b73308ae54a2a57a4f3f1fa98e984 (diff) | |
parent | e5a5816f7875207cb0a0a7032e39a4686c5e10a4 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/Makefile | 3 | ||||
-rw-r--r-- | arch/mips/kernel/cevt-txx9.c | 3 | ||||
-rw-r--r-- | arch/mips/kernel/cpu-bugs64.c | 2 | ||||
-rw-r--r-- | arch/mips/kernel/init_task.c | 1 | ||||
-rw-r--r-- | arch/mips/kernel/irixelf.c | 11 | ||||
-rw-r--r-- | arch/mips/kernel/irixioctl.c | 55 | ||||
-rw-r--r-- | arch/mips/kernel/kspd.c | 6 | ||||
-rw-r--r-- | arch/mips/kernel/rtlx.c | 65 | ||||
-rw-r--r-- | arch/mips/kernel/setup.c | 1 | ||||
-rw-r--r-- | arch/mips/kernel/smp.c | 6 | ||||
-rw-r--r-- | arch/mips/kernel/traps.c | 16 | ||||
-rw-r--r-- | arch/mips/kernel/vpe.c | 29 |
12 files changed, 102 insertions, 96 deletions
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index 45545be3eb86..65e46a6d4178 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile | |||
@@ -30,7 +30,6 @@ obj-$(CONFIG_CPU_LOONGSON2) += r4k_fpu.o r4k_switch.o | |||
30 | obj-$(CONFIG_CPU_MIPS32) += r4k_fpu.o r4k_switch.o | 30 | obj-$(CONFIG_CPU_MIPS32) += r4k_fpu.o r4k_switch.o |
31 | obj-$(CONFIG_CPU_MIPS64) += r4k_fpu.o r4k_switch.o | 31 | obj-$(CONFIG_CPU_MIPS64) += r4k_fpu.o r4k_switch.o |
32 | obj-$(CONFIG_CPU_R3000) += r2300_fpu.o r2300_switch.o | 32 | obj-$(CONFIG_CPU_R3000) += r2300_fpu.o r2300_switch.o |
33 | obj-$(CONFIG_CPU_R4000) += r4k_fpu.o r4k_switch.o | ||
34 | obj-$(CONFIG_CPU_R4300) += r4k_fpu.o r4k_switch.o | 33 | obj-$(CONFIG_CPU_R4300) += r4k_fpu.o r4k_switch.o |
35 | obj-$(CONFIG_CPU_R4X00) += r4k_fpu.o r4k_switch.o | 34 | obj-$(CONFIG_CPU_R4X00) += r4k_fpu.o r4k_switch.o |
36 | obj-$(CONFIG_CPU_R5000) += r4k_fpu.o r4k_switch.o | 35 | obj-$(CONFIG_CPU_R5000) += r4k_fpu.o r4k_switch.o |
@@ -56,9 +55,9 @@ obj-$(CONFIG_MIPS_MT_SMP) += smp-mt.o | |||
56 | obj-$(CONFIG_MIPS_CMP) += smp-cmp.o | 55 | obj-$(CONFIG_MIPS_CMP) += smp-cmp.o |
57 | obj-$(CONFIG_CPU_MIPSR2) += spram.o | 56 | obj-$(CONFIG_CPU_MIPSR2) += spram.o |
58 | 57 | ||
59 | obj-$(CONFIG_MIPS_APSP_KSPD) += kspd.o | ||
60 | obj-$(CONFIG_MIPS_VPE_LOADER) += vpe.o | 58 | obj-$(CONFIG_MIPS_VPE_LOADER) += vpe.o |
61 | obj-$(CONFIG_MIPS_VPE_APSP_API) += rtlx.o | 59 | obj-$(CONFIG_MIPS_VPE_APSP_API) += rtlx.o |
60 | obj-$(CONFIG_MIPS_APSP_KSPD) += kspd.o | ||
62 | 61 | ||
63 | obj-$(CONFIG_I8259) += i8259.o | 62 | obj-$(CONFIG_I8259) += i8259.o |
64 | obj-$(CONFIG_IRQ_CPU) += irq_cpu.o | 63 | obj-$(CONFIG_IRQ_CPU) += irq_cpu.o |
diff --git a/arch/mips/kernel/cevt-txx9.c b/arch/mips/kernel/cevt-txx9.c index 795cb8fb0d74..b5fc4eb412d2 100644 --- a/arch/mips/kernel/cevt-txx9.c +++ b/arch/mips/kernel/cevt-txx9.c | |||
@@ -161,6 +161,9 @@ void __init txx9_tmr_init(unsigned long baseaddr) | |||
161 | struct txx9_tmr_reg __iomem *tmrptr; | 161 | struct txx9_tmr_reg __iomem *tmrptr; |
162 | 162 | ||
163 | tmrptr = ioremap(baseaddr, sizeof(struct txx9_tmr_reg)); | 163 | tmrptr = ioremap(baseaddr, sizeof(struct txx9_tmr_reg)); |
164 | /* Start once to make CounterResetEnable effective */ | ||
165 | __raw_writel(TXx9_TMTCR_CRE | TXx9_TMTCR_TCE, &tmrptr->tcr); | ||
166 | /* Stop and reset the counter */ | ||
164 | __raw_writel(TXx9_TMTCR_CRE, &tmrptr->tcr); | 167 | __raw_writel(TXx9_TMTCR_CRE, &tmrptr->tcr); |
165 | __raw_writel(0, &tmrptr->tisr); | 168 | __raw_writel(0, &tmrptr->tisr); |
166 | __raw_writel(0xffffffff, &tmrptr->cpra); | 169 | __raw_writel(0xffffffff, &tmrptr->cpra); |
diff --git a/arch/mips/kernel/cpu-bugs64.c b/arch/mips/kernel/cpu-bugs64.c index a1b48af0992f..02b7713cf71c 100644 --- a/arch/mips/kernel/cpu-bugs64.c +++ b/arch/mips/kernel/cpu-bugs64.c | |||
@@ -38,7 +38,7 @@ static inline void align_mod(const int align, const int mod) | |||
38 | ".endr\n\t" | 38 | ".endr\n\t" |
39 | ".set pop" | 39 | ".set pop" |
40 | : | 40 | : |
41 | : GCC_IMM_ASM(align), GCC_IMM_ASM(mod)); | 41 | : GCC_IMM_ASM() (align), GCC_IMM_ASM() (mod)); |
42 | } | 42 | } |
43 | 43 | ||
44 | static inline void mult_sh_align_mod(long *v1, long *v2, long *w, | 44 | static inline void mult_sh_align_mod(long *v1, long *v2, long *w, |
diff --git a/arch/mips/kernel/init_task.c b/arch/mips/kernel/init_task.c index aeda7f58391b..d72487ad7c15 100644 --- a/arch/mips/kernel/init_task.c +++ b/arch/mips/kernel/init_task.c | |||
@@ -10,7 +10,6 @@ | |||
10 | #include <asm/pgtable.h> | 10 | #include <asm/pgtable.h> |
11 | 11 | ||
12 | static struct fs_struct init_fs = INIT_FS; | 12 | static struct fs_struct init_fs = INIT_FS; |
13 | static struct files_struct init_files = INIT_FILES; | ||
14 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 13 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
15 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 14 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
16 | struct mm_struct init_mm = INIT_MM(init_mm); | 15 | struct mm_struct init_mm = INIT_MM(init_mm); |
diff --git a/arch/mips/kernel/irixelf.c b/arch/mips/kernel/irixelf.c index 290d8e3a664d..469c7237e5ba 100644 --- a/arch/mips/kernel/irixelf.c +++ b/arch/mips/kernel/irixelf.c | |||
@@ -578,7 +578,7 @@ static inline int map_interpreter(struct elf_phdr *epp, struct elfhdr *ihp, | |||
578 | * process and the system, here we map the page and fill the | 578 | * process and the system, here we map the page and fill the |
579 | * structure | 579 | * structure |
580 | */ | 580 | */ |
581 | static void irix_map_prda_page(void) | 581 | static int irix_map_prda_page(void) |
582 | { | 582 | { |
583 | unsigned long v; | 583 | unsigned long v; |
584 | struct prda *pp; | 584 | struct prda *pp; |
@@ -587,8 +587,8 @@ static void irix_map_prda_page(void) | |||
587 | v = do_brk(PRDA_ADDRESS, PAGE_SIZE); | 587 | v = do_brk(PRDA_ADDRESS, PAGE_SIZE); |
588 | up_write(¤t->mm->mmap_sem); | 588 | up_write(¤t->mm->mmap_sem); |
589 | 589 | ||
590 | if (v < 0) | 590 | if (v != PRDA_ADDRESS) |
591 | return; | 591 | return v; /* v must be an error code */ |
592 | 592 | ||
593 | pp = (struct prda *) v; | 593 | pp = (struct prda *) v; |
594 | pp->prda_sys.t_pid = task_pid_vnr(current); | 594 | pp->prda_sys.t_pid = task_pid_vnr(current); |
@@ -596,6 +596,8 @@ static void irix_map_prda_page(void) | |||
596 | pp->prda_sys.t_rpid = task_pid_vnr(current); | 596 | pp->prda_sys.t_rpid = task_pid_vnr(current); |
597 | 597 | ||
598 | /* We leave the rest set to zero */ | 598 | /* We leave the rest set to zero */ |
599 | |||
600 | return 0; | ||
599 | } | 601 | } |
600 | 602 | ||
601 | 603 | ||
@@ -781,7 +783,8 @@ static int load_irix_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
781 | * IRIX maps a page at 0x200000 which holds some system | 783 | * IRIX maps a page at 0x200000 which holds some system |
782 | * information. Programs depend on this. | 784 | * information. Programs depend on this. |
783 | */ | 785 | */ |
784 | irix_map_prda_page(); | 786 | if (irix_map_prda_page()) |
787 | goto out_free_dentry; | ||
785 | 788 | ||
786 | padzero(elf_bss); | 789 | padzero(elf_bss); |
787 | 790 | ||
diff --git a/arch/mips/kernel/irixioctl.c b/arch/mips/kernel/irixioctl.c index 2bde200d5ad0..b39bdba82e02 100644 --- a/arch/mips/kernel/irixioctl.c +++ b/arch/mips/kernel/irixioctl.c | |||
@@ -27,33 +27,6 @@ struct irix_termios { | |||
27 | cc_t c_cc[NCCS]; | 27 | cc_t c_cc[NCCS]; |
28 | }; | 28 | }; |
29 | 29 | ||
30 | extern void start_tty(struct tty_struct *tty); | ||
31 | static struct tty_struct *get_tty(int fd) | ||
32 | { | ||
33 | struct file *filp; | ||
34 | struct tty_struct *ttyp = NULL; | ||
35 | |||
36 | rcu_read_lock(); | ||
37 | filp = fcheck(fd); | ||
38 | if(filp && filp->private_data) { | ||
39 | ttyp = (struct tty_struct *) filp->private_data; | ||
40 | |||
41 | if(ttyp->magic != TTY_MAGIC) | ||
42 | ttyp =NULL; | ||
43 | } | ||
44 | rcu_read_unlock(); | ||
45 | return ttyp; | ||
46 | } | ||
47 | |||
48 | static struct tty_struct *get_real_tty(struct tty_struct *tp) | ||
49 | { | ||
50 | if (tp->driver->type == TTY_DRIVER_TYPE_PTY && | ||
51 | tp->driver->subtype == PTY_TYPE_MASTER) | ||
52 | return tp->link; | ||
53 | else | ||
54 | return tp; | ||
55 | } | ||
56 | |||
57 | asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg) | 30 | asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg) |
58 | { | 31 | { |
59 | struct tty_struct *tp, *rtp; | 32 | struct tty_struct *tp, *rtp; |
@@ -146,34 +119,24 @@ asmlinkage int irix_ioctl(int fd, unsigned long cmd, unsigned long arg) | |||
146 | error = sys_ioctl(fd, TIOCNOTTY, arg); | 119 | error = sys_ioctl(fd, TIOCNOTTY, arg); |
147 | break; | 120 | break; |
148 | 121 | ||
149 | case 0x00007416: | 122 | case 0x00007416: { |
123 | pid_t pid; | ||
150 | #ifdef DEBUG_IOCTLS | 124 | #ifdef DEBUG_IOCTLS |
151 | printk("TIOCGSID, %08lx) ", arg); | 125 | printk("TIOCGSID, %08lx) ", arg); |
152 | #endif | 126 | #endif |
153 | tp = get_tty(fd); | 127 | old_fs = get_fs(); set_fs(get_ds()); |
154 | if(!tp) { | 128 | error = sys_ioctl(fd, TIOCGSID, (unsigned long)&pid); |
155 | error = -EINVAL; | 129 | set_fs(old_fs); |
156 | break; | 130 | if (!error) |
157 | } | 131 | error = put_user(pid, (unsigned long __user *) arg); |
158 | rtp = get_real_tty(tp); | ||
159 | #ifdef DEBUG_IOCTLS | ||
160 | printk("rtp->session=%d ", rtp->session); | ||
161 | #endif | ||
162 | error = put_user(rtp->session, (unsigned long __user *) arg); | ||
163 | break; | 132 | break; |
164 | 133 | } | |
165 | case 0x746e: | 134 | case 0x746e: |
166 | /* TIOCSTART, same effect as hitting ^Q */ | 135 | /* TIOCSTART, same effect as hitting ^Q */ |
167 | #ifdef DEBUG_IOCTLS | 136 | #ifdef DEBUG_IOCTLS |
168 | printk("TIOCSTART, %08lx) ", arg); | 137 | printk("TIOCSTART, %08lx) ", arg); |
169 | #endif | 138 | #endif |
170 | tp = get_tty(fd); | 139 | error = sys_ioctl(fd, TCXONC, TCOON); |
171 | if(!tp) { | ||
172 | error = -EINVAL; | ||
173 | break; | ||
174 | } | ||
175 | rtp = get_real_tty(tp); | ||
176 | start_tty(rtp); | ||
177 | break; | 140 | break; |
178 | 141 | ||
179 | case 0x20006968: | 142 | case 0x20006968: |
diff --git a/arch/mips/kernel/kspd.c b/arch/mips/kernel/kspd.c index 998c4efcce88..b0591ae0ce56 100644 --- a/arch/mips/kernel/kspd.c +++ b/arch/mips/kernel/kspd.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
21 | #include <linux/unistd.h> | 21 | #include <linux/unistd.h> |
22 | #include <linux/file.h> | 22 | #include <linux/file.h> |
23 | #include <linux/fdtable.h> | ||
23 | #include <linux/fs.h> | 24 | #include <linux/fs.h> |
24 | #include <linux/syscalls.h> | 25 | #include <linux/syscalls.h> |
25 | #include <linux/workqueue.h> | 26 | #include <linux/workqueue.h> |
@@ -256,7 +257,7 @@ void sp_work_handle_request(void) | |||
256 | 257 | ||
257 | vcwd = vpe_getcwd(tclimit); | 258 | vcwd = vpe_getcwd(tclimit); |
258 | 259 | ||
259 | /* change to the cwd of the process that loaded the SP program */ | 260 | /* change to cwd of the process that loaded the SP program */ |
260 | old_fs = get_fs(); | 261 | old_fs = get_fs(); |
261 | set_fs(KERNEL_DS); | 262 | set_fs(KERNEL_DS); |
262 | sys_chdir(vcwd); | 263 | sys_chdir(vcwd); |
@@ -322,6 +323,9 @@ static void sp_cleanup(void) | |||
322 | set >>= 1; | 323 | set >>= 1; |
323 | } | 324 | } |
324 | } | 325 | } |
326 | |||
327 | /* Put daemon cwd back to root to avoid umount problems */ | ||
328 | sys_chdir("/"); | ||
325 | } | 329 | } |
326 | 330 | ||
327 | static int channel_open = 0; | 331 | static int channel_open = 0; |
diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c index 0233798f7155..b88f1c18ff4d 100644 --- a/arch/mips/kernel/rtlx.c +++ b/arch/mips/kernel/rtlx.c | |||
@@ -72,6 +72,15 @@ static void rtlx_dispatch(void) | |||
72 | static irqreturn_t rtlx_interrupt(int irq, void *dev_id) | 72 | static irqreturn_t rtlx_interrupt(int irq, void *dev_id) |
73 | { | 73 | { |
74 | int i; | 74 | int i; |
75 | unsigned int flags, vpeflags; | ||
76 | |||
77 | /* Ought not to be strictly necessary for SMTC builds */ | ||
78 | local_irq_save(flags); | ||
79 | vpeflags = dvpe(); | ||
80 | set_c0_status(0x100 << MIPS_CPU_RTLX_IRQ); | ||
81 | irq_enable_hazard(); | ||
82 | evpe(vpeflags); | ||
83 | local_irq_restore(flags); | ||
75 | 84 | ||
76 | for (i = 0; i < RTLX_CHANNELS; i++) { | 85 | for (i = 0; i < RTLX_CHANNELS; i++) { |
77 | wake_up(&channel_wqs[i].lx_queue); | 86 | wake_up(&channel_wqs[i].lx_queue); |
@@ -108,7 +117,8 @@ static void __used dump_rtlx(void) | |||
108 | static int rtlx_init(struct rtlx_info *rtlxi) | 117 | static int rtlx_init(struct rtlx_info *rtlxi) |
109 | { | 118 | { |
110 | if (rtlxi->id != RTLX_ID) { | 119 | if (rtlxi->id != RTLX_ID) { |
111 | printk(KERN_ERR "no valid RTLX id at 0x%p 0x%lx\n", rtlxi, rtlxi->id); | 120 | printk(KERN_ERR "no valid RTLX id at 0x%p 0x%lx\n", |
121 | rtlxi, rtlxi->id); | ||
112 | return -ENOEXEC; | 122 | return -ENOEXEC; |
113 | } | 123 | } |
114 | 124 | ||
@@ -162,18 +172,17 @@ int rtlx_open(int index, int can_sleep) | |||
162 | 172 | ||
163 | if (rtlx == NULL) { | 173 | if (rtlx == NULL) { |
164 | if( (p = vpe_get_shared(tclimit)) == NULL) { | 174 | if( (p = vpe_get_shared(tclimit)) == NULL) { |
165 | if (can_sleep) { | 175 | if (can_sleep) { |
166 | __wait_event_interruptible(channel_wqs[index].lx_queue, | 176 | __wait_event_interruptible(channel_wqs[index].lx_queue, |
167 | (p = vpe_get_shared(tclimit)), | 177 | (p = vpe_get_shared(tclimit)), ret); |
168 | ret); | 178 | if (ret) |
169 | if (ret) | ||
170 | goto out_fail; | ||
171 | } else { | ||
172 | printk(KERN_DEBUG "No SP program loaded, and device " | ||
173 | "opened with O_NONBLOCK\n"); | ||
174 | ret = -ENOSYS; | ||
175 | goto out_fail; | 179 | goto out_fail; |
176 | } | 180 | } else { |
181 | printk(KERN_DEBUG "No SP program loaded, and device " | ||
182 | "opened with O_NONBLOCK\n"); | ||
183 | ret = -ENOSYS; | ||
184 | goto out_fail; | ||
185 | } | ||
177 | } | 186 | } |
178 | 187 | ||
179 | smp_rmb(); | 188 | smp_rmb(); |
@@ -182,7 +191,9 @@ int rtlx_open(int index, int can_sleep) | |||
182 | DEFINE_WAIT(wait); | 191 | DEFINE_WAIT(wait); |
183 | 192 | ||
184 | for (;;) { | 193 | for (;;) { |
185 | prepare_to_wait(&channel_wqs[index].lx_queue, &wait, TASK_INTERRUPTIBLE); | 194 | prepare_to_wait( |
195 | &channel_wqs[index].lx_queue, | ||
196 | &wait, TASK_INTERRUPTIBLE); | ||
186 | smp_rmb(); | 197 | smp_rmb(); |
187 | if (*p != NULL) | 198 | if (*p != NULL) |
188 | break; | 199 | break; |
@@ -195,7 +206,7 @@ int rtlx_open(int index, int can_sleep) | |||
195 | } | 206 | } |
196 | finish_wait(&channel_wqs[index].lx_queue, &wait); | 207 | finish_wait(&channel_wqs[index].lx_queue, &wait); |
197 | } else { | 208 | } else { |
198 | printk(" *vpe_get_shared is NULL. " | 209 | pr_err(" *vpe_get_shared is NULL. " |
199 | "Has an SP program been loaded?\n"); | 210 | "Has an SP program been loaded?\n"); |
200 | ret = -ENOSYS; | 211 | ret = -ENOSYS; |
201 | goto out_fail; | 212 | goto out_fail; |
@@ -203,8 +214,9 @@ int rtlx_open(int index, int can_sleep) | |||
203 | } | 214 | } |
204 | 215 | ||
205 | if ((unsigned int)*p < KSEG0) { | 216 | if ((unsigned int)*p < KSEG0) { |
206 | printk(KERN_WARNING "vpe_get_shared returned an invalid pointer " | 217 | printk(KERN_WARNING "vpe_get_shared returned an " |
207 | "maybe an error code %d\n", (int)*p); | 218 | "invalid pointer maybe an error code %d\n", |
219 | (int)*p); | ||
208 | ret = -ENOSYS; | 220 | ret = -ENOSYS; |
209 | goto out_fail; | 221 | goto out_fail; |
210 | } | 222 | } |
@@ -232,6 +244,10 @@ out_ret: | |||
232 | 244 | ||
233 | int rtlx_release(int index) | 245 | int rtlx_release(int index) |
234 | { | 246 | { |
247 | if (rtlx == NULL) { | ||
248 | pr_err("rtlx_release() with null rtlx\n"); | ||
249 | return 0; | ||
250 | } | ||
235 | rtlx->channel[index].lx_state = RTLX_STATE_UNUSED; | 251 | rtlx->channel[index].lx_state = RTLX_STATE_UNUSED; |
236 | return 0; | 252 | return 0; |
237 | } | 253 | } |
@@ -251,8 +267,8 @@ unsigned int rtlx_read_poll(int index, int can_sleep) | |||
251 | int ret = 0; | 267 | int ret = 0; |
252 | 268 | ||
253 | __wait_event_interruptible(channel_wqs[index].lx_queue, | 269 | __wait_event_interruptible(channel_wqs[index].lx_queue, |
254 | chan->lx_read != chan->lx_write || sp_stopping, | 270 | (chan->lx_read != chan->lx_write) || |
255 | ret); | 271 | sp_stopping, ret); |
256 | if (ret) | 272 | if (ret) |
257 | return ret; | 273 | return ret; |
258 | 274 | ||
@@ -282,7 +298,9 @@ static inline int write_spacefree(int read, int write, int size) | |||
282 | unsigned int rtlx_write_poll(int index) | 298 | unsigned int rtlx_write_poll(int index) |
283 | { | 299 | { |
284 | struct rtlx_channel *chan = &rtlx->channel[index]; | 300 | struct rtlx_channel *chan = &rtlx->channel[index]; |
285 | return write_spacefree(chan->rt_read, chan->rt_write, chan->buffer_size); | 301 | |
302 | return write_spacefree(chan->rt_read, chan->rt_write, | ||
303 | chan->buffer_size); | ||
286 | } | 304 | } |
287 | 305 | ||
288 | ssize_t rtlx_read(int index, void __user *buff, size_t count) | 306 | ssize_t rtlx_read(int index, void __user *buff, size_t count) |
@@ -344,8 +362,8 @@ ssize_t rtlx_write(int index, const void __user *buffer, size_t count) | |||
344 | rt_read = rt->rt_read; | 362 | rt_read = rt->rt_read; |
345 | 363 | ||
346 | /* total number of bytes to copy */ | 364 | /* total number of bytes to copy */ |
347 | count = min(count, | 365 | count = min(count, (size_t)write_spacefree(rt_read, rt->rt_write, |
348 | (size_t)write_spacefree(rt_read, rt->rt_write, rt->buffer_size)); | 366 | rt->buffer_size)); |
349 | 367 | ||
350 | /* first bit from write pointer to the end of the buffer, or count */ | 368 | /* first bit from write pointer to the end of the buffer, or count */ |
351 | fl = min(count, (size_t) rt->buffer_size - rt->rt_write); | 369 | fl = min(count, (size_t) rt->buffer_size - rt->rt_write); |
@@ -514,6 +532,11 @@ static int __init rtlx_module_init(void) | |||
514 | 532 | ||
515 | if (cpu_has_vint) | 533 | if (cpu_has_vint) |
516 | set_vi_handler(MIPS_CPU_RTLX_IRQ, rtlx_dispatch); | 534 | set_vi_handler(MIPS_CPU_RTLX_IRQ, rtlx_dispatch); |
535 | else { | ||
536 | pr_err("APRP RTLX init on non-vectored-interrupt processor\n"); | ||
537 | err = -ENODEV; | ||
538 | goto out_chrdev; | ||
539 | } | ||
517 | 540 | ||
518 | rtlx_irq.dev_id = rtlx; | 541 | rtlx_irq.dev_id = rtlx; |
519 | setup_irq(rtlx_irq_num, &rtlx_irq); | 542 | setup_irq(rtlx_irq_num, &rtlx_irq); |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 39f3dfe134fb..c6a063b2a0d9 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
@@ -331,6 +331,7 @@ static void __init bootmem_init(void) | |||
331 | /* | 331 | /* |
332 | * Determine low and high memory ranges | 332 | * Determine low and high memory ranges |
333 | */ | 333 | */ |
334 | max_pfn = max_low_pfn; | ||
334 | if (max_low_pfn > PFN_DOWN(HIGHMEM_START)) { | 335 | if (max_low_pfn > PFN_DOWN(HIGHMEM_START)) { |
335 | #ifdef CONFIG_HIGHMEM | 336 | #ifdef CONFIG_HIGHMEM |
336 | highstart_pfn = PFN_DOWN(HIGHMEM_START); | 337 | highstart_pfn = PFN_DOWN(HIGHMEM_START); |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index 33780cc61ce9..cdf87a9dd4ba 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
@@ -87,8 +87,8 @@ struct plat_smp_ops *mp_ops; | |||
87 | 87 | ||
88 | __cpuinit void register_smp_ops(struct plat_smp_ops *ops) | 88 | __cpuinit void register_smp_ops(struct plat_smp_ops *ops) |
89 | { | 89 | { |
90 | if (ops) | 90 | if (mp_ops) |
91 | printk(KERN_WARNING "Overriding previous set SMP ops\n"); | 91 | printk(KERN_WARNING "Overriding previously set SMP ops\n"); |
92 | 92 | ||
93 | mp_ops = ops; | 93 | mp_ops = ops; |
94 | } | 94 | } |
@@ -216,6 +216,7 @@ int smp_call_function(void (*func) (void *info), void *info, int retry, | |||
216 | { | 216 | { |
217 | return smp_call_function_mask(cpu_online_map, func, info, retry, wait); | 217 | return smp_call_function_mask(cpu_online_map, func, info, retry, wait); |
218 | } | 218 | } |
219 | EXPORT_SYMBOL(smp_call_function); | ||
219 | 220 | ||
220 | void smp_call_function_interrupt(void) | 221 | void smp_call_function_interrupt(void) |
221 | { | 222 | { |
@@ -271,6 +272,7 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info, | |||
271 | put_cpu(); | 272 | put_cpu(); |
272 | return 0; | 273 | return 0; |
273 | } | 274 | } |
275 | EXPORT_SYMBOL(smp_call_function_single); | ||
274 | 276 | ||
275 | static void stop_this_cpu(void *dummy) | 277 | static void stop_this_cpu(void *dummy) |
276 | { | 278 | { |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index cb8b0e2c7954..f9165d1a17bf 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -88,15 +88,17 @@ static void show_raw_backtrace(unsigned long reg29) | |||
88 | #ifdef CONFIG_KALLSYMS | 88 | #ifdef CONFIG_KALLSYMS |
89 | printk("\n"); | 89 | printk("\n"); |
90 | #endif | 90 | #endif |
91 | #define IS_KVA01(a) ((((unsigned int)a) & 0xc0000000) == 0x80000000) | 91 | while (!kstack_end(sp)) { |
92 | if (IS_KVA01(sp)) { | 92 | unsigned long __user *p = |
93 | while (!kstack_end(sp)) { | 93 | (unsigned long __user *)(unsigned long)sp++; |
94 | addr = *sp++; | 94 | if (__get_user(addr, p)) { |
95 | if (__kernel_text_address(addr)) | 95 | printk(" (Bad stack address)"); |
96 | print_ip_sym(addr); | 96 | break; |
97 | } | 97 | } |
98 | printk("\n"); | 98 | if (__kernel_text_address(addr)) |
99 | print_ip_sym(addr); | ||
99 | } | 100 | } |
101 | printk("\n"); | ||
100 | } | 102 | } |
101 | 103 | ||
102 | #ifdef CONFIG_KALLSYMS | 104 | #ifdef CONFIG_KALLSYMS |
diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c index 39804c584edd..2794501ff302 100644 --- a/arch/mips/kernel/vpe.c +++ b/arch/mips/kernel/vpe.c | |||
@@ -269,7 +269,7 @@ static void *alloc_progmem(unsigned long len) | |||
269 | * This means you must tell Linux to use less memory than you | 269 | * This means you must tell Linux to use less memory than you |
270 | * physically have, for example by passing a mem= boot argument. | 270 | * physically have, for example by passing a mem= boot argument. |
271 | */ | 271 | */ |
272 | addr = pfn_to_kaddr(max_pfn); | 272 | addr = pfn_to_kaddr(max_low_pfn); |
273 | memset(addr, 0, len); | 273 | memset(addr, 0, len); |
274 | #else | 274 | #else |
275 | /* simple grab some mem for now */ | 275 | /* simple grab some mem for now */ |
@@ -781,10 +781,15 @@ static int vpe_run(struct vpe * v) | |||
781 | /* take system out of configuration state */ | 781 | /* take system out of configuration state */ |
782 | clear_c0_mvpcontrol(MVPCONTROL_VPC); | 782 | clear_c0_mvpcontrol(MVPCONTROL_VPC); |
783 | 783 | ||
784 | /* | ||
785 | * SMTC/SMVP kernels manage VPE enable independently, | ||
786 | * but uniprocessor kernels need to turn it on, even | ||
787 | * if that wasn't the pre-dvpe() state. | ||
788 | */ | ||
784 | #ifdef CONFIG_SMP | 789 | #ifdef CONFIG_SMP |
785 | evpe(EVPE_ENABLE); | ||
786 | #else | ||
787 | evpe(vpeflags); | 790 | evpe(vpeflags); |
791 | #else | ||
792 | evpe(EVPE_ENABLE); | ||
788 | #endif | 793 | #endif |
789 | emt(dmt_flag); | 794 | emt(dmt_flag); |
790 | local_irq_restore(flags); | 795 | local_irq_restore(flags); |
@@ -840,7 +845,7 @@ static int vpe_elfload(struct vpe * v) | |||
840 | 845 | ||
841 | /* Sanity checks against insmoding binaries or wrong arch, | 846 | /* Sanity checks against insmoding binaries or wrong arch, |
842 | weird elf version */ | 847 | weird elf version */ |
843 | if (memcmp(hdr->e_ident, ELFMAG, 4) != 0 | 848 | if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0 |
844 | || (hdr->e_type != ET_REL && hdr->e_type != ET_EXEC) | 849 | || (hdr->e_type != ET_REL && hdr->e_type != ET_EXEC) |
845 | || !elf_check_arch(hdr) | 850 | || !elf_check_arch(hdr) |
846 | || hdr->e_shentsize != sizeof(*sechdrs)) { | 851 | || hdr->e_shentsize != sizeof(*sechdrs)) { |
@@ -947,12 +952,14 @@ static int vpe_elfload(struct vpe * v) | |||
947 | struct elf_phdr *phdr = (struct elf_phdr *) ((char *)hdr + hdr->e_phoff); | 952 | struct elf_phdr *phdr = (struct elf_phdr *) ((char *)hdr + hdr->e_phoff); |
948 | 953 | ||
949 | for (i = 0; i < hdr->e_phnum; i++) { | 954 | for (i = 0; i < hdr->e_phnum; i++) { |
950 | if (phdr->p_type != PT_LOAD) | 955 | if (phdr->p_type == PT_LOAD) { |
951 | continue; | 956 | memcpy((void *)phdr->p_paddr, |
952 | 957 | (char *)hdr + phdr->p_offset, | |
953 | memcpy((void *)phdr->p_paddr, (char *)hdr + phdr->p_offset, phdr->p_filesz); | 958 | phdr->p_filesz); |
954 | memset((void *)phdr->p_paddr + phdr->p_filesz, 0, phdr->p_memsz - phdr->p_filesz); | 959 | memset((void *)phdr->p_paddr + phdr->p_filesz, |
955 | phdr++; | 960 | 0, phdr->p_memsz - phdr->p_filesz); |
961 | } | ||
962 | phdr++; | ||
956 | } | 963 | } |
957 | 964 | ||
958 | for (i = 0; i < hdr->e_shnum; i++) { | 965 | for (i = 0; i < hdr->e_shnum; i++) { |
@@ -1107,7 +1114,7 @@ static int vpe_release(struct inode *inode, struct file *filp) | |||
1107 | return -ENODEV; | 1114 | return -ENODEV; |
1108 | 1115 | ||
1109 | hdr = (Elf_Ehdr *) v->pbuffer; | 1116 | hdr = (Elf_Ehdr *) v->pbuffer; |
1110 | if (memcmp(hdr->e_ident, ELFMAG, 4) == 0) { | 1117 | if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) == 0) { |
1111 | if (vpe_elfload(v) >= 0) { | 1118 | if (vpe_elfload(v) >= 0) { |
1112 | vpe_run(v); | 1119 | vpe_run(v); |
1113 | } else { | 1120 | } else { |