]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
mips: Make setjmp code N32-compliant.
authorVladimir Serbinenko <phcoder@gmail.com>
Sun, 11 Oct 2015 11:15:50 +0000 (13:15 +0200)
committerVladimir Serbinenko <phcoder@gmail.com>
Sun, 11 Oct 2015 11:20:26 +0000 (13:20 +0200)
grub-core/lib/mips/setjmp.S
include/grub/mips/asm.h
include/grub/mips/setjmp.h

index f0129451850c89dd13b5715bed95a3165ea9e915..895235b78d77b181771436c4772e78961ba0cd52 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <grub/symbol.h>
 #include <grub/dl.h>
+#include <grub/mips/asm.h>
 
        .file   "setjmp.S"
 
@@ -29,40 +30,42 @@ GRUB_MOD_LICENSE "GPLv3+"
  * int grub_setjmp (grub_jmp_buf env)
  */
 FUNCTION(grub_setjmp)
-       sw $s0, 0($a0)
-       sw $s1, 4($a0)
-       sw $s2, 8($a0)
-       sw $s3, 12($a0)
-       sw $s4, 16($a0)
-       sw $s5, 20($a0)
-       sw $s6, 24($a0)
-       sw $s7, 28($a0)
-       sw $s8, 32($a0)
-       sw $gp, 36($a0)
-       sw $sp, 40($a0)
-       sw $ra, 44($a0)
+       GRUB_ASM_REG_S $s0, 0($a0)
+       GRUB_ASM_REG_S $s1, 8($a0)
+       GRUB_ASM_REG_S $s2, 16($a0)
+       GRUB_ASM_REG_S $s3, 24($a0)
+       GRUB_ASM_REG_S $s4, 32($a0)
+       GRUB_ASM_REG_S $s5, 40($a0)
+       GRUB_ASM_REG_S $s6, 48($a0)
+       GRUB_ASM_REG_S $s7, 56($a0)
+       GRUB_ASM_REG_S $s8, 64($a0)
+       GRUB_ASM_REG_S $gp, 72($a0)
+       GRUB_ASM_REG_S $sp, 80($a0)
+       GRUB_ASM_REG_S $ra, 88($a0)
        move $v0, $zero
        move $v1, $zero
        jr $ra
+        nop
 /*
  * int grub_longjmp (grub_jmp_buf env, int val)
  */
 FUNCTION(grub_longjmp)
-       lw $s0, 0($a0)
-       lw $s1, 4($a0)
-       lw $s2, 8($a0)
-       lw $s3, 12($a0)
-       lw $s4, 16($a0)
-       lw $s5, 20($a0)
-       lw $s6, 24($a0)
-       lw $s7, 28($a0)
-       lw $s8, 32($a0)
-       lw $gp, 36($a0)
-       lw $sp, 40($a0)
-       lw $ra, 44($a0)
+       GRUB_ASM_REG_L $s0, 0($a0)
+       GRUB_ASM_REG_L $s1, 8($a0)
+       GRUB_ASM_REG_L $s2, 16($a0)
+       GRUB_ASM_REG_L $s3, 24($a0)
+       GRUB_ASM_REG_L $s4, 32($a0)
+       GRUB_ASM_REG_L $s5, 40($a0)
+       GRUB_ASM_REG_L $s6, 48($a0)
+       GRUB_ASM_REG_L $s7, 56($a0)
+       GRUB_ASM_REG_L $s8, 64($a0)
+       GRUB_ASM_REG_L $gp, 72($a0)
+       GRUB_ASM_REG_L $sp, 80($a0)
+       GRUB_ASM_REG_L $ra, 88($a0)
        move $v0, $a1
        bne  $v0, $zero, 1f
        addiu $v0, $v0, 1
 1:     
        move $v1, $zero
        jr $ra
+        nop
index ad2f71abeba5f5d2424e4dab0de4b24fba8aebd6..4c397f4a00c710881eea8ce72714d517f75ef6ff 100644 (file)
@@ -4,8 +4,15 @@
 #if defined(_MIPS_SIM) && defined(_ABIN32) && _MIPS_SIM == _ABIN32
 #define GRUB_ASM_T4 $a4
 #define GRUB_ASM_T5 $a5
+#define GRUB_ASM_SZREG 8
+#define GRUB_ASM_REG_S sd
+#define GRUB_ASM_REG_L ld
 #else
 #define GRUB_ASM_T4 $t4
 #define GRUB_ASM_T5 $t5
+#define GRUB_ASM_SZREG 4
+#define GRUB_ASM_REG_S sw
+#define GRUB_ASM_REG_L lw
 #endif
+
 #endif
index a99dde9efe45ff62734b6d19cb90bd51608e7dd6..f8f6517acbf0c4be08cd2de2fc961da2a1d30b25 100644 (file)
@@ -19,7 +19,7 @@
 #ifndef GRUB_SETJMP_CPU_HEADER
 #define GRUB_SETJMP_CPU_HEADER 1
 
-typedef unsigned long grub_jmp_buf[12];
+typedef grub_uint64_t grub_jmp_buf[12];
 
 int grub_setjmp (grub_jmp_buf env) RETURNS_TWICE;
 void grub_longjmp (grub_jmp_buf env, int val) __attribute__ ((noreturn));