diff options
Diffstat (limited to 'arch/mips/kernel/kspd.c')
| -rw-r--r-- | arch/mips/kernel/kspd.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/arch/mips/kernel/kspd.c b/arch/mips/kernel/kspd.c index 5929f883e46b..29eadd404fa5 100644 --- a/arch/mips/kernel/kspd.c +++ b/arch/mips/kernel/kspd.c | |||
| @@ -70,6 +70,7 @@ static int sp_stopping = 0; | |||
| 70 | #define MTSP_SYSCALL_GETTIME (MTSP_SYSCALL_BASE + 7) | 70 | #define MTSP_SYSCALL_GETTIME (MTSP_SYSCALL_BASE + 7) |
| 71 | #define MTSP_SYSCALL_PIPEFREQ (MTSP_SYSCALL_BASE + 8) | 71 | #define MTSP_SYSCALL_PIPEFREQ (MTSP_SYSCALL_BASE + 8) |
| 72 | #define MTSP_SYSCALL_GETTOD (MTSP_SYSCALL_BASE + 9) | 72 | #define MTSP_SYSCALL_GETTOD (MTSP_SYSCALL_BASE + 9) |
| 73 | #define MTSP_SYSCALL_IOCTL (MTSP_SYSCALL_BASE + 10) | ||
| 73 | 74 | ||
| 74 | #define MTSP_O_RDONLY 0x0000 | 75 | #define MTSP_O_RDONLY 0x0000 |
| 75 | #define MTSP_O_WRONLY 0x0001 | 76 | #define MTSP_O_WRONLY 0x0001 |
| @@ -110,7 +111,8 @@ struct apsp_table syscall_command_table[] = { | |||
| 110 | { MTSP_SYSCALL_CLOSE, __NR_close }, | 111 | { MTSP_SYSCALL_CLOSE, __NR_close }, |
| 111 | { MTSP_SYSCALL_READ, __NR_read }, | 112 | { MTSP_SYSCALL_READ, __NR_read }, |
| 112 | { MTSP_SYSCALL_WRITE, __NR_write }, | 113 | { MTSP_SYSCALL_WRITE, __NR_write }, |
| 113 | { MTSP_SYSCALL_LSEEK32, __NR_lseek } | 114 | { MTSP_SYSCALL_LSEEK32, __NR_lseek }, |
| 115 | { MTSP_SYSCALL_IOCTL, __NR_ioctl } | ||
| 114 | }; | 116 | }; |
| 115 | 117 | ||
| 116 | static int sp_syscall(int num, int arg0, int arg1, int arg2, int arg3) | 118 | static int sp_syscall(int num, int arg0, int arg1, int arg2, int arg3) |
| @@ -189,6 +191,8 @@ void sp_work_handle_request(void) | |||
| 189 | struct mtsp_syscall_generic generic; | 191 | struct mtsp_syscall_generic generic; |
| 190 | struct mtsp_syscall_ret ret; | 192 | struct mtsp_syscall_ret ret; |
| 191 | struct kspd_notifications *n; | 193 | struct kspd_notifications *n; |
| 194 | unsigned long written; | ||
| 195 | mm_segment_t old_fs; | ||
| 192 | struct timeval tv; | 196 | struct timeval tv; |
| 193 | struct timezone tz; | 197 | struct timezone tz; |
| 194 | int cmd; | 198 | int cmd; |
| @@ -199,7 +203,11 @@ void sp_work_handle_request(void) | |||
| 199 | 203 | ||
| 200 | ret.retval = -1; | 204 | ret.retval = -1; |
| 201 | 205 | ||
| 202 | if (!rtlx_read(RTLX_CHANNEL_SYSIO, &sc, sizeof(struct mtsp_syscall), 0)) { | 206 | old_fs = get_fs(); |
| 207 | set_fs(KERNEL_DS); | ||
| 208 | |||
| 209 | if (!rtlx_read(RTLX_CHANNEL_SYSIO, &sc, sizeof(struct mtsp_syscall))) { | ||
| 210 | set_fs(old_fs); | ||
| 203 | printk(KERN_ERR "Expected request but nothing to read\n"); | 211 | printk(KERN_ERR "Expected request but nothing to read\n"); |
| 204 | return; | 212 | return; |
| 205 | } | 213 | } |
| @@ -207,7 +215,8 @@ void sp_work_handle_request(void) | |||
| 207 | size = sc.size; | 215 | size = sc.size; |
| 208 | 216 | ||
| 209 | if (size) { | 217 | if (size) { |
| 210 | if (!rtlx_read(RTLX_CHANNEL_SYSIO, &generic, size, 0)) { | 218 | if (!rtlx_read(RTLX_CHANNEL_SYSIO, &generic, size)) { |
| 219 | set_fs(old_fs); | ||
| 211 | printk(KERN_ERR "Expected request but nothing to read\n"); | 220 | printk(KERN_ERR "Expected request but nothing to read\n"); |
| 212 | return; | 221 | return; |
| 213 | } | 222 | } |
| @@ -280,8 +289,11 @@ void sp_work_handle_request(void) | |||
| 280 | if (vpe_getuid(SP_VPE)) | 289 | if (vpe_getuid(SP_VPE)) |
| 281 | sp_setfsuidgid( 0, 0); | 290 | sp_setfsuidgid( 0, 0); |
| 282 | 291 | ||
| 283 | if ((rtlx_write(RTLX_CHANNEL_SYSIO, &ret, sizeof(struct mtsp_syscall_ret), 0)) | 292 | old_fs = get_fs(); |
| 284 | < sizeof(struct mtsp_syscall_ret)) | 293 | set_fs(KERNEL_DS); |
| 294 | written = rtlx_write(RTLX_CHANNEL_SYSIO, &ret, sizeof(ret)); | ||
| 295 | set_fs(old_fs); | ||
| 296 | if (written < sizeof(ret)) | ||
| 285 | printk("KSPD: sp_work_handle_request failed to send to SP\n"); | 297 | printk("KSPD: sp_work_handle_request failed to send to SP\n"); |
| 286 | } | 298 | } |
| 287 | 299 | ||
