diff options
Diffstat (limited to 'arch/xtensa/kernel/entry.S')
-rw-r--r-- | arch/xtensa/kernel/entry.S | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S index ef7f4990722b..82bbfa5a05b3 100644 --- a/arch/xtensa/kernel/entry.S +++ b/arch/xtensa/kernel/entry.S | |||
@@ -986,6 +986,8 @@ ENDPROC(fast_syscall_unrecoverable) | |||
986 | * j done | 986 | * j done |
987 | */ | 987 | */ |
988 | 988 | ||
989 | #ifdef CONFIG_FAST_SYSCALL_XTENSA | ||
990 | |||
989 | #define TRY \ | 991 | #define TRY \ |
990 | .section __ex_table, "a"; \ | 992 | .section __ex_table, "a"; \ |
991 | .word 66f, 67f; \ | 993 | .word 66f, 67f; \ |
@@ -1001,9 +1003,8 @@ ENTRY(fast_syscall_xtensa) | |||
1001 | movi a7, 4 # sizeof(unsigned int) | 1003 | movi a7, 4 # sizeof(unsigned int) |
1002 | access_ok a3, a7, a0, a2, .Leac # a0: scratch reg, a2: sp | 1004 | access_ok a3, a7, a0, a2, .Leac # a0: scratch reg, a2: sp |
1003 | 1005 | ||
1004 | addi a6, a6, -1 # assuming SYS_XTENSA_ATOMIC_SET = 1 | 1006 | _bgeui a6, SYS_XTENSA_COUNT, .Lill |
1005 | _bgeui a6, SYS_XTENSA_COUNT - 1, .Lill | 1007 | _bnei a6, SYS_XTENSA_ATOMIC_CMP_SWP, .Lnswp |
1006 | _bnei a6, SYS_XTENSA_ATOMIC_CMP_SWP - 1, .Lnswp | ||
1007 | 1008 | ||
1008 | /* Fall through for ATOMIC_CMP_SWP. */ | 1009 | /* Fall through for ATOMIC_CMP_SWP. */ |
1009 | 1010 | ||
@@ -1015,27 +1016,26 @@ TRY s32i a5, a3, 0 # different, modify value | |||
1015 | l32i a7, a2, PT_AREG7 # restore a7 | 1016 | l32i a7, a2, PT_AREG7 # restore a7 |
1016 | l32i a0, a2, PT_AREG0 # restore a0 | 1017 | l32i a0, a2, PT_AREG0 # restore a0 |
1017 | movi a2, 1 # and return 1 | 1018 | movi a2, 1 # and return 1 |
1018 | addi a6, a6, 1 # restore a6 (really necessary?) | ||
1019 | rfe | 1019 | rfe |
1020 | 1020 | ||
1021 | 1: l32i a7, a2, PT_AREG7 # restore a7 | 1021 | 1: l32i a7, a2, PT_AREG7 # restore a7 |
1022 | l32i a0, a2, PT_AREG0 # restore a0 | 1022 | l32i a0, a2, PT_AREG0 # restore a0 |
1023 | movi a2, 0 # return 0 (note that we cannot set | 1023 | movi a2, 0 # return 0 (note that we cannot set |
1024 | addi a6, a6, 1 # restore a6 (really necessary?) | ||
1025 | rfe | 1024 | rfe |
1026 | 1025 | ||
1027 | .Lnswp: /* Atomic set, add, and exg_add. */ | 1026 | .Lnswp: /* Atomic set, add, and exg_add. */ |
1028 | 1027 | ||
1029 | TRY l32i a7, a3, 0 # orig | 1028 | TRY l32i a7, a3, 0 # orig |
1029 | addi a6, a6, -SYS_XTENSA_ATOMIC_SET | ||
1030 | add a0, a4, a7 # + arg | 1030 | add a0, a4, a7 # + arg |
1031 | moveqz a0, a4, a6 # set | 1031 | moveqz a0, a4, a6 # set |
1032 | addi a6, a6, SYS_XTENSA_ATOMIC_SET | ||
1032 | TRY s32i a0, a3, 0 # write new value | 1033 | TRY s32i a0, a3, 0 # write new value |
1033 | 1034 | ||
1034 | mov a0, a2 | 1035 | mov a0, a2 |
1035 | mov a2, a7 | 1036 | mov a2, a7 |
1036 | l32i a7, a0, PT_AREG7 # restore a7 | 1037 | l32i a7, a0, PT_AREG7 # restore a7 |
1037 | l32i a0, a0, PT_AREG0 # restore a0 | 1038 | l32i a0, a0, PT_AREG0 # restore a0 |
1038 | addi a6, a6, 1 # restore a6 (really necessary?) | ||
1039 | rfe | 1039 | rfe |
1040 | 1040 | ||
1041 | CATCH | 1041 | CATCH |
@@ -1044,13 +1044,25 @@ CATCH | |||
1044 | movi a2, -EFAULT | 1044 | movi a2, -EFAULT |
1045 | rfe | 1045 | rfe |
1046 | 1046 | ||
1047 | .Lill: l32i a7, a2, PT_AREG0 # restore a7 | 1047 | .Lill: l32i a7, a2, PT_AREG7 # restore a7 |
1048 | l32i a0, a2, PT_AREG0 # restore a0 | 1048 | l32i a0, a2, PT_AREG0 # restore a0 |
1049 | movi a2, -EINVAL | 1049 | movi a2, -EINVAL |
1050 | rfe | 1050 | rfe |
1051 | 1051 | ||
1052 | ENDPROC(fast_syscall_xtensa) | 1052 | ENDPROC(fast_syscall_xtensa) |
1053 | 1053 | ||
1054 | #else /* CONFIG_FAST_SYSCALL_XTENSA */ | ||
1055 | |||
1056 | ENTRY(fast_syscall_xtensa) | ||
1057 | |||
1058 | l32i a0, a2, PT_AREG0 # restore a0 | ||
1059 | movi a2, -ENOSYS | ||
1060 | rfe | ||
1061 | |||
1062 | ENDPROC(fast_syscall_xtensa) | ||
1063 | |||
1064 | #endif /* CONFIG_FAST_SYSCALL_XTENSA */ | ||
1065 | |||
1054 | 1066 | ||
1055 | /* fast_syscall_spill_registers. | 1067 | /* fast_syscall_spill_registers. |
1056 | * | 1068 | * |
@@ -1066,6 +1078,8 @@ ENDPROC(fast_syscall_xtensa) | |||
1066 | * Note: We assume the stack pointer is EXC_TABLE_KSTK in the fixup handler. | 1078 | * Note: We assume the stack pointer is EXC_TABLE_KSTK in the fixup handler. |
1067 | */ | 1079 | */ |
1068 | 1080 | ||
1081 | #ifdef CONFIG_FAST_SYSCALL_SPILL_REGISTERS | ||
1082 | |||
1069 | ENTRY(fast_syscall_spill_registers) | 1083 | ENTRY(fast_syscall_spill_registers) |
1070 | 1084 | ||
1071 | /* Register a FIXUP handler (pass current wb as a parameter) */ | 1085 | /* Register a FIXUP handler (pass current wb as a parameter) */ |
@@ -1400,6 +1414,18 @@ ENTRY(fast_syscall_spill_registers_fixup_return) | |||
1400 | 1414 | ||
1401 | ENDPROC(fast_syscall_spill_registers_fixup_return) | 1415 | ENDPROC(fast_syscall_spill_registers_fixup_return) |
1402 | 1416 | ||
1417 | #else /* CONFIG_FAST_SYSCALL_SPILL_REGISTERS */ | ||
1418 | |||
1419 | ENTRY(fast_syscall_spill_registers) | ||
1420 | |||
1421 | l32i a0, a2, PT_AREG0 # restore a0 | ||
1422 | movi a2, -ENOSYS | ||
1423 | rfe | ||
1424 | |||
1425 | ENDPROC(fast_syscall_spill_registers) | ||
1426 | |||
1427 | #endif /* CONFIG_FAST_SYSCALL_SPILL_REGISTERS */ | ||
1428 | |||
1403 | #ifdef CONFIG_MMU | 1429 | #ifdef CONFIG_MMU |
1404 | /* | 1430 | /* |
1405 | * We should never get here. Bail out! | 1431 | * We should never get here. Bail out! |
@@ -1565,7 +1591,7 @@ ENTRY(fast_second_level_miss) | |||
1565 | rsr a0, excvaddr | 1591 | rsr a0, excvaddr |
1566 | bltu a0, a3, 2f | 1592 | bltu a0, a3, 2f |
1567 | 1593 | ||
1568 | addi a1, a0, -(2 << (DCACHE_ALIAS_ORDER + PAGE_SHIFT)) | 1594 | addi a1, a0, -TLBTEMP_SIZE |
1569 | bgeu a1, a3, 2f | 1595 | bgeu a1, a3, 2f |
1570 | 1596 | ||
1571 | /* Check if we have to restore an ITLB mapping. */ | 1597 | /* Check if we have to restore an ITLB mapping. */ |
@@ -1820,7 +1846,6 @@ ENTRY(_switch_to) | |||
1820 | 1846 | ||
1821 | entry a1, 16 | 1847 | entry a1, 16 |
1822 | 1848 | ||
1823 | mov a10, a2 # preserve 'prev' (a2) | ||
1824 | mov a11, a3 # and 'next' (a3) | 1849 | mov a11, a3 # and 'next' (a3) |
1825 | 1850 | ||
1826 | l32i a4, a2, TASK_THREAD_INFO | 1851 | l32i a4, a2, TASK_THREAD_INFO |
@@ -1828,8 +1853,14 @@ ENTRY(_switch_to) | |||
1828 | 1853 | ||
1829 | save_xtregs_user a4 a6 a8 a9 a12 a13 THREAD_XTREGS_USER | 1854 | save_xtregs_user a4 a6 a8 a9 a12 a13 THREAD_XTREGS_USER |
1830 | 1855 | ||
1831 | s32i a0, a10, THREAD_RA # save return address | 1856 | #if THREAD_RA > 1020 || THREAD_SP > 1020 |
1832 | s32i a1, a10, THREAD_SP # save stack pointer | 1857 | addi a10, a2, TASK_THREAD |
1858 | s32i a0, a10, THREAD_RA - TASK_THREAD # save return address | ||
1859 | s32i a1, a10, THREAD_SP - TASK_THREAD # save stack pointer | ||
1860 | #else | ||
1861 | s32i a0, a2, THREAD_RA # save return address | ||
1862 | s32i a1, a2, THREAD_SP # save stack pointer | ||
1863 | #endif | ||
1833 | 1864 | ||
1834 | /* Disable ints while we manipulate the stack pointer. */ | 1865 | /* Disable ints while we manipulate the stack pointer. */ |
1835 | 1866 | ||
@@ -1870,7 +1901,6 @@ ENTRY(_switch_to) | |||
1870 | load_xtregs_user a5 a6 a8 a9 a12 a13 THREAD_XTREGS_USER | 1901 | load_xtregs_user a5 a6 a8 a9 a12 a13 THREAD_XTREGS_USER |
1871 | 1902 | ||
1872 | wsr a14, ps | 1903 | wsr a14, ps |
1873 | mov a2, a10 # return 'prev' | ||
1874 | rsync | 1904 | rsync |
1875 | 1905 | ||
1876 | retw | 1906 | retw |