diff options
Diffstat (limited to 'include/asm-mips/stackframe.h')
-rw-r--r-- | include/asm-mips/stackframe.h | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/include/asm-mips/stackframe.h b/include/asm-mips/stackframe.h index 7b5e64600bc8..a8919dcc93c8 100644 --- a/include/asm-mips/stackframe.h +++ b/include/asm-mips/stackframe.h | |||
@@ -60,7 +60,6 @@ | |||
60 | mfc0 k0, CP0_CONTEXT | 60 | mfc0 k0, CP0_CONTEXT |
61 | lui k1, %hi(kernelsp) | 61 | lui k1, %hi(kernelsp) |
62 | srl k0, k0, 23 | 62 | srl k0, k0, 23 |
63 | sll k0, k0, 2 | ||
64 | addu k1, k0 | 63 | addu k1, k0 |
65 | LONG_L k1, %lo(kernelsp)(k1) | 64 | LONG_L k1, %lo(kernelsp)(k1) |
66 | #endif | 65 | #endif |
@@ -76,9 +75,14 @@ | |||
76 | #endif | 75 | #endif |
77 | #if defined(CONFIG_64BIT) && defined(CONFIG_BUILD_ELF64) | 76 | #if defined(CONFIG_64BIT) && defined(CONFIG_BUILD_ELF64) |
78 | MFC0 k1, CP0_CONTEXT | 77 | MFC0 k1, CP0_CONTEXT |
78 | lui k0, %highest(kernelsp) | ||
79 | dsrl k1, 23 | 79 | dsrl k1, 23 |
80 | dsll k1, k1, 3 | 80 | daddiu k0, %higher(kernelsp) |
81 | LONG_L k1, kernelsp(k1) | 81 | dsll k0, k0, 16 |
82 | daddiu k0, %hi(kernelsp) | ||
83 | dsll k0, k0, 16 | ||
84 | daddu k1, k1, k0 | ||
85 | LONG_L k1, %lo(kernelsp)(k1) | ||
82 | #endif | 86 | #endif |
83 | .endm | 87 | .endm |
84 | 88 | ||
@@ -86,25 +90,28 @@ | |||
86 | #ifdef CONFIG_32BIT | 90 | #ifdef CONFIG_32BIT |
87 | mfc0 \temp, CP0_CONTEXT | 91 | mfc0 \temp, CP0_CONTEXT |
88 | srl \temp, 23 | 92 | srl \temp, 23 |
89 | sll \temp, 2 | ||
90 | LONG_S \stackp, kernelsp(\temp) | ||
91 | #endif | 93 | #endif |
92 | #if defined(CONFIG_64BIT) && !defined(CONFIG_BUILD_ELF64) | 94 | #if defined(CONFIG_64BIT) && !defined(CONFIG_BUILD_ELF64) |
93 | lw \temp, TI_CPU(gp) | 95 | lw \temp, TI_CPU(gp) |
94 | dsll \temp, 3 | 96 | dsll \temp, 3 |
95 | lui \temp2, %hi(kernelsp) | ||
96 | daddu \temp, \temp2 | ||
97 | LONG_S \stackp, %lo(kernelsp)(\temp) | ||
98 | #endif | 97 | #endif |
99 | #if defined(CONFIG_64BIT) && defined(CONFIG_BUILD_ELF64) | 98 | #if defined(CONFIG_64BIT) && defined(CONFIG_BUILD_ELF64) |
100 | lw \temp, TI_CPU(gp) | 99 | MFC0 \temp, CP0_CONTEXT |
101 | dsll \temp, 3 | 100 | dsrl \temp, 23 |
102 | LONG_S \stackp, kernelsp(\temp) | ||
103 | #endif | 101 | #endif |
102 | LONG_S \stackp, kernelsp(\temp) | ||
104 | .endm | 103 | .endm |
105 | #else | 104 | #else |
106 | .macro get_saved_sp /* Uniprocessor variation */ | 105 | .macro get_saved_sp /* Uniprocessor variation */ |
106 | #if defined(CONFIG_64BIT) && defined(CONFIG_BUILD_ELF64) | ||
107 | lui k1, %highest(kernelsp) | ||
108 | daddiu k1, %higher(kernelsp) | ||
109 | dsll k1, k1, 16 | ||
110 | daddiu k1, %hi(kernelsp) | ||
111 | dsll k1, k1, 16 | ||
112 | #else | ||
107 | lui k1, %hi(kernelsp) | 113 | lui k1, %hi(kernelsp) |
114 | #endif | ||
108 | LONG_L k1, %lo(kernelsp)(k1) | 115 | LONG_L k1, %lo(kernelsp)(k1) |
109 | .endm | 116 | .endm |
110 | 117 | ||