diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-24 16:54:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-24 16:54:31 -0400 |
commit | 745914df47053c758f3d7999dfa82df184c2e5af (patch) | |
tree | b48acd5940eca403910d6d8e7602028b731c4bcd /arch/alpha | |
parent | c7523a7c88db637d66841018532cb4b3ab6ab0a8 (diff) | |
parent | 25534eb7707821b796fd84f7115367e02f36aa60 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mattst88/alpha
Pull alpha updates from Matt Turner:
"This pull adds the implementations of some Tru64 syscalls which allow
some proprietary software such as the C compiler to work on Linux.
Also, it adds some big-endian ioread functions to help us get closer
to building allyesconfig."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mattst88/alpha:
alpha: add io{read,write}{16,32}be functions
alpha: implement various OSF/1 stat syscalls
alpha: implement setsysinfo(SSI_LMF) as a no-op
Diffstat (limited to 'arch/alpha')
-rw-r--r-- | arch/alpha/include/asm/io.h | 5 | ||||
-rw-r--r-- | arch/alpha/include/asm/sysinfo.h | 1 | ||||
-rw-r--r-- | arch/alpha/include/asm/unistd.h | 6 | ||||
-rw-r--r-- | arch/alpha/kernel/osf_sys.c | 166 | ||||
-rw-r--r-- | arch/alpha/kernel/systbls.S | 10 |
5 files changed, 183 insertions, 5 deletions
diff --git a/arch/alpha/include/asm/io.h b/arch/alpha/include/asm/io.h index 7a3d38d5ed6b..5ebab5895edb 100644 --- a/arch/alpha/include/asm/io.h +++ b/arch/alpha/include/asm/io.h | |||
@@ -489,6 +489,11 @@ extern inline void writeq(u64 b, volatile void __iomem *addr) | |||
489 | } | 489 | } |
490 | #endif | 490 | #endif |
491 | 491 | ||
492 | #define ioread16be(p) be16_to_cpu(ioread16(p)) | ||
493 | #define ioread32be(p) be32_to_cpu(ioread32(p)) | ||
494 | #define iowrite16be(v,p) iowrite16(cpu_to_be16(v), (p)) | ||
495 | #define iowrite32be(v,p) iowrite32(cpu_to_be32(v), (p)) | ||
496 | |||
492 | #define inb_p inb | 497 | #define inb_p inb |
493 | #define inw_p inw | 498 | #define inw_p inw |
494 | #define inl_p inl | 499 | #define inl_p inl |
diff --git a/arch/alpha/include/asm/sysinfo.h b/arch/alpha/include/asm/sysinfo.h index e77d77cd07b8..0b80e79d75e5 100644 --- a/arch/alpha/include/asm/sysinfo.h +++ b/arch/alpha/include/asm/sysinfo.h | |||
@@ -15,6 +15,7 @@ | |||
15 | #define GSI_GET_HWRPB 101 | 15 | #define GSI_GET_HWRPB 101 |
16 | 16 | ||
17 | #define SSI_NVPAIRS 1 | 17 | #define SSI_NVPAIRS 1 |
18 | #define SSI_LMF 7 | ||
18 | #define SSI_IEEE_FP_CONTROL 14 | 19 | #define SSI_IEEE_FP_CONTROL 14 |
19 | #define SSI_IEEE_STATE_AT_SIGNAL 15 | 20 | #define SSI_IEEE_STATE_AT_SIGNAL 15 |
20 | #define SSI_IEEE_IGNORE_STATE_AT_SIGNAL 16 | 21 | #define SSI_IEEE_IGNORE_STATE_AT_SIGNAL 16 |
diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h index 2207fc61665d..d1f23b722df4 100644 --- a/arch/alpha/include/asm/unistd.h +++ b/arch/alpha/include/asm/unistd.h | |||
@@ -203,6 +203,12 @@ | |||
203 | #define __NR_osf_security 222 /* not implemented */ | 203 | #define __NR_osf_security 222 /* not implemented */ |
204 | #define __NR_osf_kloadcall 223 /* not implemented */ | 204 | #define __NR_osf_kloadcall 223 /* not implemented */ |
205 | 205 | ||
206 | #define __NR_osf_stat 224 | ||
207 | #define __NR_osf_lstat 225 | ||
208 | #define __NR_osf_fstat 226 | ||
209 | #define __NR_osf_statfs64 227 | ||
210 | #define __NR_osf_fstatfs64 228 | ||
211 | |||
206 | #define __NR_getpgid 233 | 212 | #define __NR_getpgid 233 |
207 | #define __NR_getsid 234 | 213 | #define __NR_getsid 234 |
208 | #define __NR_sigaltstack 235 | 214 | #define __NR_sigaltstack 235 |
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 49ee3193477a..98a103621af6 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c | |||
@@ -191,6 +191,39 @@ SYSCALL_DEFINE6(osf_mmap, unsigned long, addr, unsigned long, len, | |||
191 | return ret; | 191 | return ret; |
192 | } | 192 | } |
193 | 193 | ||
194 | struct osf_stat { | ||
195 | int st_dev; | ||
196 | int st_pad1; | ||
197 | unsigned st_mode; | ||
198 | unsigned short st_nlink; | ||
199 | short st_nlink_reserved; | ||
200 | unsigned st_uid; | ||
201 | unsigned st_gid; | ||
202 | int st_rdev; | ||
203 | int st_ldev; | ||
204 | long st_size; | ||
205 | int st_pad2; | ||
206 | int st_uatime; | ||
207 | int st_pad3; | ||
208 | int st_umtime; | ||
209 | int st_pad4; | ||
210 | int st_uctime; | ||
211 | int st_pad5; | ||
212 | int st_pad6; | ||
213 | unsigned st_flags; | ||
214 | unsigned st_gen; | ||
215 | long st_spare[4]; | ||
216 | unsigned st_ino; | ||
217 | int st_ino_reserved; | ||
218 | int st_atime; | ||
219 | int st_atime_reserved; | ||
220 | int st_mtime; | ||
221 | int st_mtime_reserved; | ||
222 | int st_ctime; | ||
223 | int st_ctime_reserved; | ||
224 | long st_blksize; | ||
225 | long st_blocks; | ||
226 | }; | ||
194 | 227 | ||
195 | /* | 228 | /* |
196 | * The OSF/1 statfs structure is much larger, but this should | 229 | * The OSF/1 statfs structure is much larger, but this should |
@@ -209,6 +242,60 @@ struct osf_statfs { | |||
209 | __kernel_fsid_t f_fsid; | 242 | __kernel_fsid_t f_fsid; |
210 | }; | 243 | }; |
211 | 244 | ||
245 | struct osf_statfs64 { | ||
246 | short f_type; | ||
247 | short f_flags; | ||
248 | int f_pad1; | ||
249 | int f_pad2; | ||
250 | int f_pad3; | ||
251 | int f_pad4; | ||
252 | int f_pad5; | ||
253 | int f_pad6; | ||
254 | int f_pad7; | ||
255 | __kernel_fsid_t f_fsid; | ||
256 | u_short f_namemax; | ||
257 | short f_reserved1; | ||
258 | int f_spare[8]; | ||
259 | char f_pad8[90]; | ||
260 | char f_pad9[90]; | ||
261 | long mount_info[10]; | ||
262 | u_long f_flags2; | ||
263 | long f_spare2[14]; | ||
264 | long f_fsize; | ||
265 | long f_bsize; | ||
266 | long f_blocks; | ||
267 | long f_bfree; | ||
268 | long f_bavail; | ||
269 | long f_files; | ||
270 | long f_ffree; | ||
271 | }; | ||
272 | |||
273 | static int | ||
274 | linux_to_osf_stat(struct kstat *lstat, struct osf_stat __user *osf_stat) | ||
275 | { | ||
276 | struct osf_stat tmp = { 0 }; | ||
277 | |||
278 | tmp.st_dev = lstat->dev; | ||
279 | tmp.st_mode = lstat->mode; | ||
280 | tmp.st_nlink = lstat->nlink; | ||
281 | tmp.st_uid = lstat->uid; | ||
282 | tmp.st_gid = lstat->gid; | ||
283 | tmp.st_rdev = lstat->rdev; | ||
284 | tmp.st_ldev = lstat->rdev; | ||
285 | tmp.st_size = lstat->size; | ||
286 | tmp.st_uatime = lstat->atime.tv_nsec / 1000; | ||
287 | tmp.st_umtime = lstat->mtime.tv_nsec / 1000; | ||
288 | tmp.st_uctime = lstat->ctime.tv_nsec / 1000; | ||
289 | tmp.st_ino = lstat->ino; | ||
290 | tmp.st_atime = lstat->atime.tv_sec; | ||
291 | tmp.st_mtime = lstat->mtime.tv_sec; | ||
292 | tmp.st_ctime = lstat->ctime.tv_sec; | ||
293 | tmp.st_blksize = lstat->blksize; | ||
294 | tmp.st_blocks = lstat->blocks; | ||
295 | |||
296 | return copy_to_user(osf_stat, &tmp, sizeof(tmp)) ? -EFAULT : 0; | ||
297 | } | ||
298 | |||
212 | static int | 299 | static int |
213 | linux_to_osf_statfs(struct kstatfs *linux_stat, struct osf_statfs __user *osf_stat, | 300 | linux_to_osf_statfs(struct kstatfs *linux_stat, struct osf_statfs __user *osf_stat, |
214 | unsigned long bufsiz) | 301 | unsigned long bufsiz) |
@@ -230,6 +317,26 @@ linux_to_osf_statfs(struct kstatfs *linux_stat, struct osf_statfs __user *osf_st | |||
230 | return copy_to_user(osf_stat, &tmp_stat, bufsiz) ? -EFAULT : 0; | 317 | return copy_to_user(osf_stat, &tmp_stat, bufsiz) ? -EFAULT : 0; |
231 | } | 318 | } |
232 | 319 | ||
320 | static int | ||
321 | linux_to_osf_statfs64(struct kstatfs *linux_stat, struct osf_statfs64 __user *osf_stat, | ||
322 | unsigned long bufsiz) | ||
323 | { | ||
324 | struct osf_statfs64 tmp_stat = { 0 }; | ||
325 | |||
326 | tmp_stat.f_type = linux_stat->f_type; | ||
327 | tmp_stat.f_fsize = linux_stat->f_frsize; | ||
328 | tmp_stat.f_bsize = linux_stat->f_bsize; | ||
329 | tmp_stat.f_blocks = linux_stat->f_blocks; | ||
330 | tmp_stat.f_bfree = linux_stat->f_bfree; | ||
331 | tmp_stat.f_bavail = linux_stat->f_bavail; | ||
332 | tmp_stat.f_files = linux_stat->f_files; | ||
333 | tmp_stat.f_ffree = linux_stat->f_ffree; | ||
334 | tmp_stat.f_fsid = linux_stat->f_fsid; | ||
335 | if (bufsiz > sizeof(tmp_stat)) | ||
336 | bufsiz = sizeof(tmp_stat); | ||
337 | return copy_to_user(osf_stat, &tmp_stat, bufsiz) ? -EFAULT : 0; | ||
338 | } | ||
339 | |||
233 | SYSCALL_DEFINE3(osf_statfs, const char __user *, pathname, | 340 | SYSCALL_DEFINE3(osf_statfs, const char __user *, pathname, |
234 | struct osf_statfs __user *, buffer, unsigned long, bufsiz) | 341 | struct osf_statfs __user *, buffer, unsigned long, bufsiz) |
235 | { | 342 | { |
@@ -240,6 +347,42 @@ SYSCALL_DEFINE3(osf_statfs, const char __user *, pathname, | |||
240 | return error; | 347 | return error; |
241 | } | 348 | } |
242 | 349 | ||
350 | SYSCALL_DEFINE2(osf_stat, char __user *, name, struct osf_stat __user *, buf) | ||
351 | { | ||
352 | struct kstat stat; | ||
353 | int error; | ||
354 | |||
355 | error = vfs_stat(name, &stat); | ||
356 | if (error) | ||
357 | return error; | ||
358 | |||
359 | return linux_to_osf_stat(&stat, buf); | ||
360 | } | ||
361 | |||
362 | SYSCALL_DEFINE2(osf_lstat, char __user *, name, struct osf_stat __user *, buf) | ||
363 | { | ||
364 | struct kstat stat; | ||
365 | int error; | ||
366 | |||
367 | error = vfs_lstat(name, &stat); | ||
368 | if (error) | ||
369 | return error; | ||
370 | |||
371 | return linux_to_osf_stat(&stat, buf); | ||
372 | } | ||
373 | |||
374 | SYSCALL_DEFINE2(osf_fstat, int, fd, struct osf_stat __user *, buf) | ||
375 | { | ||
376 | struct kstat stat; | ||
377 | int error; | ||
378 | |||
379 | error = vfs_fstat(fd, &stat); | ||
380 | if (error) | ||
381 | return error; | ||
382 | |||
383 | return linux_to_osf_stat(&stat, buf); | ||
384 | } | ||
385 | |||
243 | SYSCALL_DEFINE3(osf_fstatfs, unsigned long, fd, | 386 | SYSCALL_DEFINE3(osf_fstatfs, unsigned long, fd, |
244 | struct osf_statfs __user *, buffer, unsigned long, bufsiz) | 387 | struct osf_statfs __user *, buffer, unsigned long, bufsiz) |
245 | { | 388 | { |
@@ -250,6 +393,26 @@ SYSCALL_DEFINE3(osf_fstatfs, unsigned long, fd, | |||
250 | return error; | 393 | return error; |
251 | } | 394 | } |
252 | 395 | ||
396 | SYSCALL_DEFINE3(osf_statfs64, char __user *, pathname, | ||
397 | struct osf_statfs64 __user *, buffer, unsigned long, bufsiz) | ||
398 | { | ||
399 | struct kstatfs linux_stat; | ||
400 | int error = user_statfs(pathname, &linux_stat); | ||
401 | if (!error) | ||
402 | error = linux_to_osf_statfs64(&linux_stat, buffer, bufsiz); | ||
403 | return error; | ||
404 | } | ||
405 | |||
406 | SYSCALL_DEFINE3(osf_fstatfs64, unsigned long, fd, | ||
407 | struct osf_statfs64 __user *, buffer, unsigned long, bufsiz) | ||
408 | { | ||
409 | struct kstatfs linux_stat; | ||
410 | int error = fd_statfs(fd, &linux_stat); | ||
411 | if (!error) | ||
412 | error = linux_to_osf_statfs64(&linux_stat, buffer, bufsiz); | ||
413 | return error; | ||
414 | } | ||
415 | |||
253 | /* | 416 | /* |
254 | * Uhh.. OSF/1 mount parameters aren't exactly obvious.. | 417 | * Uhh.. OSF/1 mount parameters aren't exactly obvious.. |
255 | * | 418 | * |
@@ -771,6 +934,9 @@ SYSCALL_DEFINE5(osf_setsysinfo, unsigned long, op, void __user *, buffer, | |||
771 | return 0; | 934 | return 0; |
772 | } | 935 | } |
773 | 936 | ||
937 | case SSI_LMF: | ||
938 | return 0; | ||
939 | |||
774 | default: | 940 | default: |
775 | break; | 941 | break; |
776 | } | 942 | } |
diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S index e534e1c5bc11..87835235f114 100644 --- a/arch/alpha/kernel/systbls.S +++ b/arch/alpha/kernel/systbls.S | |||
@@ -241,11 +241,11 @@ sys_call_table: | |||
241 | .quad alpha_ni_syscall | 241 | .quad alpha_ni_syscall |
242 | .quad alpha_ni_syscall | 242 | .quad alpha_ni_syscall |
243 | .quad alpha_ni_syscall | 243 | .quad alpha_ni_syscall |
244 | .quad alpha_ni_syscall | 244 | .quad sys_osf_stat |
245 | .quad alpha_ni_syscall /* 225 */ | 245 | .quad sys_osf_lstat /* 225 */ |
246 | .quad alpha_ni_syscall | 246 | .quad sys_osf_fstat |
247 | .quad alpha_ni_syscall | 247 | .quad sys_osf_statfs64 |
248 | .quad alpha_ni_syscall | 248 | .quad sys_osf_fstatfs64 |
249 | .quad alpha_ni_syscall | 249 | .quad alpha_ni_syscall |
250 | .quad alpha_ni_syscall /* 230 */ | 250 | .quad alpha_ni_syscall /* 230 */ |
251 | .quad alpha_ni_syscall | 251 | .quad alpha_ni_syscall |