diff options
-rw-r--r-- | arch/parisc/kernel/entry.S | 2 | ||||
-rw-r--r-- | include/asm-parisc/assembly.h | 40 |
2 files changed, 36 insertions, 6 deletions
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index 0ca49710d95e..166df5bab769 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
@@ -863,6 +863,7 @@ __execve: | |||
863 | _switch_to: | 863 | _switch_to: |
864 | STREG %r2, -RP_OFFSET(%r30) | 864 | STREG %r2, -RP_OFFSET(%r30) |
865 | 865 | ||
866 | callee_save_float | ||
866 | callee_save | 867 | callee_save |
867 | 868 | ||
868 | load32 _switch_to_ret, %r2 | 869 | load32 _switch_to_ret, %r2 |
@@ -879,6 +880,7 @@ _switch_to: | |||
879 | _switch_to_ret: | 880 | _switch_to_ret: |
880 | mtctl %r0, %cr0 /* Needed for single stepping */ | 881 | mtctl %r0, %cr0 /* Needed for single stepping */ |
881 | callee_rest | 882 | callee_rest |
883 | callee_rest_float | ||
882 | 884 | ||
883 | LDREG -RP_OFFSET(%r30), %r2 | 885 | LDREG -RP_OFFSET(%r30), %r2 |
884 | bv %r0(%r2) | 886 | bv %r0(%r2) |
diff --git a/include/asm-parisc/assembly.h b/include/asm-parisc/assembly.h index b24a99e3ef9c..fb8bc7c16e0e 100644 --- a/include/asm-parisc/assembly.h +++ b/include/asm-parisc/assembly.h | |||
@@ -21,6 +21,7 @@ | |||
21 | #ifndef _PARISC_ASSEMBLY_H | 21 | #ifndef _PARISC_ASSEMBLY_H |
22 | #define _PARISC_ASSEMBLY_H | 22 | #define _PARISC_ASSEMBLY_H |
23 | 23 | ||
24 | #define CALLEE_FLOAT_FRAME_SIZE 80 | ||
24 | #ifdef __LP64__ | 25 | #ifdef __LP64__ |
25 | #define LDREG ldd | 26 | #define LDREG ldd |
26 | #define STREG std | 27 | #define STREG std |
@@ -30,7 +31,7 @@ | |||
30 | #define SHRREG shrd | 31 | #define SHRREG shrd |
31 | #define RP_OFFSET 16 | 32 | #define RP_OFFSET 16 |
32 | #define FRAME_SIZE 128 | 33 | #define FRAME_SIZE 128 |
33 | #define CALLEE_SAVE_FRAME_SIZE 144 | 34 | #define CALLEE_REG_FRAME_SIZE 144 |
34 | #else | 35 | #else |
35 | #define LDREG ldw | 36 | #define LDREG ldw |
36 | #define STREG stw | 37 | #define STREG stw |
@@ -40,8 +41,9 @@ | |||
40 | #define SHRREG shr | 41 | #define SHRREG shr |
41 | #define RP_OFFSET 20 | 42 | #define RP_OFFSET 20 |
42 | #define FRAME_SIZE 64 | 43 | #define FRAME_SIZE 64 |
43 | #define CALLEE_SAVE_FRAME_SIZE 128 | 44 | #define CALLEE_REG_FRAME_SIZE 128 |
44 | #endif | 45 | #endif |
46 | #define CALLEE_SAVE_FRAME_SIZE (CALLEE_REG_FRAME_SIZE + CALLEE_FLOAT_FRAME_SIZE) | ||
45 | 47 | ||
46 | #ifdef CONFIG_PA20 | 48 | #ifdef CONFIG_PA20 |
47 | #define BL b,l | 49 | #define BL b,l |
@@ -300,9 +302,35 @@ | |||
300 | fldd,mb -8(\regs), %fr0 | 302 | fldd,mb -8(\regs), %fr0 |
301 | .endm | 303 | .endm |
302 | 304 | ||
305 | .macro callee_save_float | ||
306 | fstd,ma %fr12, 8(%r30) | ||
307 | fstd,ma %fr13, 8(%r30) | ||
308 | fstd,ma %fr14, 8(%r30) | ||
309 | fstd,ma %fr15, 8(%r30) | ||
310 | fstd,ma %fr16, 8(%r30) | ||
311 | fstd,ma %fr17, 8(%r30) | ||
312 | fstd,ma %fr18, 8(%r30) | ||
313 | fstd,ma %fr19, 8(%r30) | ||
314 | fstd,ma %fr20, 8(%r30) | ||
315 | fstd,ma %fr21, 8(%r30) | ||
316 | .endm | ||
317 | |||
318 | .macro callee_rest_float | ||
319 | fldd,mb -8(%r30), %fr21 | ||
320 | fldd,mb -8(%r30), %fr20 | ||
321 | fldd,mb -8(%r30), %fr19 | ||
322 | fldd,mb -8(%r30), %fr18 | ||
323 | fldd,mb -8(%r30), %fr17 | ||
324 | fldd,mb -8(%r30), %fr16 | ||
325 | fldd,mb -8(%r30), %fr15 | ||
326 | fldd,mb -8(%r30), %fr14 | ||
327 | fldd,mb -8(%r30), %fr13 | ||
328 | fldd,mb -8(%r30), %fr12 | ||
329 | .endm | ||
330 | |||
303 | #ifdef __LP64__ | 331 | #ifdef __LP64__ |
304 | .macro callee_save | 332 | .macro callee_save |
305 | std,ma %r3, CALLEE_SAVE_FRAME_SIZE(%r30) | 333 | std,ma %r3, CALLEE_REG_FRAME_SIZE(%r30) |
306 | mfctl %cr27, %r3 | 334 | mfctl %cr27, %r3 |
307 | std %r4, -136(%r30) | 335 | std %r4, -136(%r30) |
308 | std %r5, -128(%r30) | 336 | std %r5, -128(%r30) |
@@ -340,13 +368,13 @@ | |||
340 | ldd -128(%r30), %r5 | 368 | ldd -128(%r30), %r5 |
341 | ldd -136(%r30), %r4 | 369 | ldd -136(%r30), %r4 |
342 | mtctl %r3, %cr27 | 370 | mtctl %r3, %cr27 |
343 | ldd,mb -CALLEE_SAVE_FRAME_SIZE(%r30), %r3 | 371 | ldd,mb -CALLEE_REG_FRAME_SIZE(%r30), %r3 |
344 | .endm | 372 | .endm |
345 | 373 | ||
346 | #else /* ! __LP64__ */ | 374 | #else /* ! __LP64__ */ |
347 | 375 | ||
348 | .macro callee_save | 376 | .macro callee_save |
349 | stw,ma %r3, CALLEE_SAVE_FRAME_SIZE(%r30) | 377 | stw,ma %r3, CALLEE_REG_FRAME_SIZE(%r30) |
350 | mfctl %cr27, %r3 | 378 | mfctl %cr27, %r3 |
351 | stw %r4, -124(%r30) | 379 | stw %r4, -124(%r30) |
352 | stw %r5, -120(%r30) | 380 | stw %r5, -120(%r30) |
@@ -384,7 +412,7 @@ | |||
384 | ldw -120(%r30), %r5 | 412 | ldw -120(%r30), %r5 |
385 | ldw -124(%r30), %r4 | 413 | ldw -124(%r30), %r4 |
386 | mtctl %r3, %cr27 | 414 | mtctl %r3, %cr27 |
387 | ldw,mb -CALLEE_SAVE_FRAME_SIZE(%r30), %r3 | 415 | ldw,mb -CALLEE_REG_FRAME_SIZE(%r30), %r3 |
388 | .endm | 416 | .endm |
389 | #endif /* ! __LP64__ */ | 417 | #endif /* ! __LP64__ */ |
390 | 418 | ||