diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-19 20:38:33 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-19 20:38:33 -0500 |
| commit | 1ca949299260aa49eeba34ff912e2321c8b1f647 (patch) | |
| tree | bb23ca6055b30a43c6c6c51c869c66f23180bb48 /include | |
| parent | c9ce228306fda4448f5f495b4f36c07956f45acd (diff) | |
| parent | 0cfd5267476ce8051c4447988d2b0377d09188e8 (diff) | |
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus:
[MIPS] Cobalt: Fix UART I/O type
[MIPS] Fixup copy_from_user_inatomic
[MIPS] Fix struct sigcontext for N32 userland
[MIPS] Make some __setup functions static
[MIPS] Declare highstart_pfn, highend_pfn only if CONFIG_HIGHMEM=y
[MIPS] Allow selection of KGDB only on platforms where it's supported.
Diffstat (limited to 'include')
| -rw-r--r-- | include/asm-mips/sigcontext.h | 33 | ||||
| -rw-r--r-- | include/asm-mips/uaccess.h | 51 |
2 files changed, 65 insertions, 19 deletions
diff --git a/include/asm-mips/sigcontext.h b/include/asm-mips/sigcontext.h index 3c175a7e4345..972947474eb7 100644 --- a/include/asm-mips/sigcontext.h +++ b/include/asm-mips/sigcontext.h | |||
| @@ -42,6 +42,7 @@ struct sigcontext { | |||
| 42 | 42 | ||
| 43 | #if _MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32 | 43 | #if _MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32 |
| 44 | 44 | ||
| 45 | #include <linux/posix_types.h> | ||
| 45 | /* | 46 | /* |
| 46 | * Keep this struct definition in sync with the sigcontext fragment | 47 | * Keep this struct definition in sync with the sigcontext fragment |
| 47 | * in arch/mips/tools/offset.c | 48 | * in arch/mips/tools/offset.c |
| @@ -53,27 +54,25 @@ struct sigcontext { | |||
| 53 | * entries, add sc_dsp and sc_reserved for padding. No prisoners. | 54 | * entries, add sc_dsp and sc_reserved for padding. No prisoners. |
| 54 | */ | 55 | */ |
| 55 | struct sigcontext { | 56 | struct sigcontext { |
| 56 | unsigned long sc_regs[32]; | 57 | __u64 sc_regs[32]; |
| 57 | unsigned long sc_fpregs[32]; | 58 | __u64 sc_fpregs[32]; |
| 58 | unsigned long sc_mdhi; | 59 | __u64 sc_mdhi; |
| 59 | unsigned long sc_hi1; | 60 | __u64 sc_hi1; |
| 60 | unsigned long sc_hi2; | 61 | __u64 sc_hi2; |
| 61 | unsigned long sc_hi3; | 62 | __u64 sc_hi3; |
| 62 | unsigned long sc_mdlo; | 63 | __u64 sc_mdlo; |
| 63 | unsigned long sc_lo1; | 64 | __u64 sc_lo1; |
| 64 | unsigned long sc_lo2; | 65 | __u64 sc_lo2; |
| 65 | unsigned long sc_lo3; | 66 | __u64 sc_lo3; |
| 66 | unsigned long sc_pc; | 67 | __u64 sc_pc; |
| 67 | unsigned int sc_fpc_csr; | 68 | __u32 sc_fpc_csr; |
| 68 | unsigned int sc_used_math; | 69 | __u32 sc_used_math; |
| 69 | unsigned int sc_dsp; | 70 | __u32 sc_dsp; |
| 70 | unsigned int sc_reserved; | 71 | __u32 sc_reserved; |
| 71 | }; | 72 | }; |
| 72 | 73 | ||
| 73 | #ifdef __KERNEL__ | 74 | #ifdef __KERNEL__ |
| 74 | 75 | ||
| 75 | #include <linux/posix_types.h> | ||
| 76 | |||
| 77 | struct sigcontext32 { | 76 | struct sigcontext32 { |
| 78 | __u32 sc_regmask; /* Unused */ | 77 | __u32 sc_regmask; /* Unused */ |
| 79 | __u32 sc_status; /* Unused */ | 78 | __u32 sc_status; /* Unused */ |
diff --git a/include/asm-mips/uaccess.h b/include/asm-mips/uaccess.h index 3eff8d8fe28a..c62c20e7b5c6 100644 --- a/include/asm-mips/uaccess.h +++ b/include/asm-mips/uaccess.h | |||
| @@ -435,8 +435,32 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n); | |||
| 435 | __cu_len; \ | 435 | __cu_len; \ |
| 436 | }) | 436 | }) |
| 437 | 437 | ||
| 438 | #define __copy_to_user_inatomic __copy_to_user | 438 | #define __copy_to_user_inatomic(to,from,n) \ |
| 439 | #define __copy_from_user_inatomic __copy_from_user | 439 | ({ \ |
| 440 | void __user *__cu_to; \ | ||
| 441 | const void *__cu_from; \ | ||
| 442 | long __cu_len; \ | ||
| 443 | \ | ||
| 444 | __cu_to = (to); \ | ||
| 445 | __cu_from = (from); \ | ||
| 446 | __cu_len = (n); \ | ||
| 447 | __cu_len = __invoke_copy_to_user(__cu_to, __cu_from, __cu_len); \ | ||
| 448 | __cu_len; \ | ||
| 449 | }) | ||
| 450 | |||
| 451 | #define __copy_from_user_inatomic(to,from,n) \ | ||
| 452 | ({ \ | ||
| 453 | void *__cu_to; \ | ||
| 454 | const void __user *__cu_from; \ | ||
| 455 | long __cu_len; \ | ||
| 456 | \ | ||
| 457 | __cu_to = (to); \ | ||
| 458 | __cu_from = (from); \ | ||
| 459 | __cu_len = (n); \ | ||
| 460 | __cu_len = __invoke_copy_from_user_inatomic(__cu_to, __cu_from, \ | ||
| 461 | __cu_len); \ | ||
| 462 | __cu_len; \ | ||
| 463 | }) | ||
| 440 | 464 | ||
| 441 | /* | 465 | /* |
| 442 | * copy_to_user: - Copy a block of data into user space. | 466 | * copy_to_user: - Copy a block of data into user space. |
| @@ -490,6 +514,29 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n); | |||
| 490 | __cu_len_r; \ | 514 | __cu_len_r; \ |
| 491 | }) | 515 | }) |
| 492 | 516 | ||
| 517 | #define __invoke_copy_from_user_inatomic(to,from,n) \ | ||
| 518 | ({ \ | ||
| 519 | register void *__cu_to_r __asm__ ("$4"); \ | ||
| 520 | register const void __user *__cu_from_r __asm__ ("$5"); \ | ||
| 521 | register long __cu_len_r __asm__ ("$6"); \ | ||
| 522 | \ | ||
| 523 | __cu_to_r = (to); \ | ||
| 524 | __cu_from_r = (from); \ | ||
| 525 | __cu_len_r = (n); \ | ||
| 526 | __asm__ __volatile__( \ | ||
| 527 | ".set\tnoreorder\n\t" \ | ||
| 528 | __MODULE_JAL(__copy_user_inatomic) \ | ||
| 529 | ".set\tnoat\n\t" \ | ||
| 530 | __UA_ADDU "\t$1, %1, %2\n\t" \ | ||
| 531 | ".set\tat\n\t" \ | ||
| 532 | ".set\treorder" \ | ||
| 533 | : "+r" (__cu_to_r), "+r" (__cu_from_r), "+r" (__cu_len_r) \ | ||
| 534 | : \ | ||
| 535 | : "$8", "$9", "$10", "$11", "$12", "$15", "$24", "$31", \ | ||
| 536 | "memory"); \ | ||
| 537 | __cu_len_r; \ | ||
| 538 | }) | ||
| 539 | |||
| 493 | /* | 540 | /* |
| 494 | * __copy_from_user: - Copy a block of data from user space, with less checking. | 541 | * __copy_from_user: - Copy a block of data from user space, with less checking. |
| 495 | * @to: Destination address, in kernel space. | 542 | * @to: Destination address, in kernel space. |
