Mercurial > hg > aboriginal
annotate sources/patches/linux-fixmips.patch @ 1780:af5da3b293cb draft
Revert a broken commit that breaks mips on 4.0.
author | Rob Landley <rob@landley.net> |
---|---|
date | Thu, 23 Jul 2015 09:06:13 -0500 |
parents | |
children |
rev | line source |
---|---|
1780
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 The below commit broke mips floating point. Symptom: busybox |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 "awk '{print $2}' /proc/mounts" hangs because the $2 is NAN and |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 it loops endlessly trying to parse it. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 The later fixup patch (620b15503457) doesn't fix the problem. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 commit 46490b572544fa908be051f7872beb2941e55ede |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 Author: Markos Chandras <markos.chandras@imgtec.com> |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 Date: Thu Jan 8 09:32:25 2015 +0000 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 MIPS: kernel: elf: Improve the overall ABI and FPU mode checks |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 The previous implementation did not cover all possible FPU combinations |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 and it silently allowed ABI incompatible objects to be loaded with the |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 wrong ABI. For example, the previous logic would set the FP_64 ABI as |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 the matching ABI for an FP_XX object combined with an FP_64A object. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 This was wrong, and the matching ABI should have been FP_64A. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 The previous logic is now replaced with a new one which determines |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 the appropriate FPU mode to be used rather than the FP ABI. This has |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 the advantage that the entire logic is much simpler since it is the FPU |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 mode we are interested in rather than the FP ABI resulting to code |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 simplifications. This also removes the now obsolete FP32XX_HYBRID_FPRS |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 option. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 Cc: Matthew Fortune <Matthew.Fortune@imgtec.com> |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 Cc: Paul Burton <paul.burton@imgtec.com> |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 Signed-off-by: Markos Chandras <markos.chandras@imgtec.com> |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 diff --git b/arch/mips/Kconfig.debug a/arch/mips/Kconfig.debug |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 index 3a2b775..88a9f43 100644 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 --- b/arch/mips/Kconfig.debug |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 +++ a/arch/mips/Kconfig.debug |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 @@ -122,4 +122,17 @@ config SPINLOCK_TEST |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 help |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 Add several files to the debugfs to test spinlock speed. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 +config FP32XX_HYBRID_FPRS |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 + bool "Run FP32 & FPXX code with hybrid FPRs" |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 + depends on MIPS_O32_FP64_SUPPORT |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 + help |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 + The hybrid FPR scheme is normally used only when a program needs to |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 + execute a mix of FP32 & FP64A code, since the trapping & emulation |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 + that it entails is expensive. When enabled, this option will lead |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 + to the kernel running programs which use the FP32 & FPXX FP ABIs |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 + using the hybrid FPR scheme, which can be useful for debugging |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 + purposes. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 + |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 + If unsure, say N. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 + |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 endmenu |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 diff --git b/arch/mips/include/asm/elf.h a/arch/mips/include/asm/elf.h |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 index 535f196..eb4d95d 100644 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 --- b/arch/mips/include/asm/elf.h |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 +++ a/arch/mips/include/asm/elf.h |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 @@ -417,15 +417,13 @@ extern unsigned long arch_randomize_brk(struct mm_struct *mm); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 struct arch_elf_state { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 int fp_abi; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 int interp_fp_abi; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 - int overall_fp_mode; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 + int overall_abi; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 }; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 -#define MIPS_ABI_FP_UNKNOWN (-1) /* Unknown FP ABI (kernel internal) */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 #define INIT_ARCH_ELF_STATE { \ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 - .fp_abi = MIPS_ABI_FP_UNKNOWN, \ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 - .interp_fp_abi = MIPS_ABI_FP_UNKNOWN, \ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 - .overall_fp_mode = -1, \ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 + .fp_abi = -1, \ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 + .interp_fp_abi = -1, \ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 + .overall_abi = -1, \ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 extern int arch_elf_pt_proc(void *ehdr, void *phdr, struct file *elf, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 diff --git b/arch/mips/kernel/elf.c a/arch/mips/kernel/elf.c |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 index d2c09f6..c92b15d 100644 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 --- b/arch/mips/kernel/elf.c |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 +++ a/arch/mips/kernel/elf.c |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
79 @@ -11,112 +11,29 @@ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 #include <linux/elf.h> |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 #include <linux/sched.h> |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 -/* FPU modes */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 enum { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 - FP_FRE, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 - FP_FR0, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 - FP_FR1, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 + FP_ERROR = -1, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 + FP_DOUBLE_64A = -2, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 }; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 -/** |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 - * struct mode_req - ABI FPU mode requirements |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 - * @single: The program being loaded needs an FPU but it will only issue |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 - * single precision instructions meaning that it can execute in |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 - * either FR0 or FR1. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 - * @soft: The soft(-float) requirement means that the program being |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 - * loaded needs has no FPU dependency at all (i.e. it has no |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 - * FPU instructions). |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 - * @fr1: The program being loaded depends on FPU being in FR=1 mode. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 - * @frdefault: The program being loaded depends on the default FPU mode. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
102 - * That is FR0 for O32 and FR1 for N32/N64. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 - * @fre: The program being loaded depends on FPU with FRE=1. This mode is |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 - * a bridge which uses FR=1 whilst still being able to maintain |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 - * full compatibility with pre-existing code using the O32 FP32 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 - * ABI. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 - * |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 - * More information about the FP ABIs can be found here: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 - * |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 - * https://dmz-portal.mips.com/wiki/MIPS_O32_ABI_-_FR0_and_FR1_Interlinking#10.4.1._Basic_mode_set-up |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 - * |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 - */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 -struct mode_req { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 - bool single; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 - bool soft; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 - bool fr1; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 - bool frdefault; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 - bool fre; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 -}; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 -static const struct mode_req fpu_reqs[] = { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 - [MIPS_ABI_FP_ANY] = { true, true, true, true, true }, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 - [MIPS_ABI_FP_DOUBLE] = { false, false, false, true, true }, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 - [MIPS_ABI_FP_SINGLE] = { true, false, false, false, false }, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 - [MIPS_ABI_FP_SOFT] = { false, true, false, false, false }, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 - [MIPS_ABI_FP_OLD_64] = { false, false, false, false, false }, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 - [MIPS_ABI_FP_XX] = { false, false, true, true, true }, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
129 - [MIPS_ABI_FP_64] = { false, false, true, false, false }, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 - [MIPS_ABI_FP_64A] = { false, false, true, false, true } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 -}; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 -/* |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 - * Mode requirements when .MIPS.abiflags is not present in the ELF. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 - * Not present means that everything is acceptable except FR1. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
136 - */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 -static struct mode_req none_req = { true, true, false, true, true }; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
138 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
139 int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
140 bool is_interp, struct arch_elf_state *state) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
142 - struct elf32_hdr *ehdr32 = _ehdr; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
143 - struct elf32_phdr *phdr32 = _phdr; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 - struct elf64_phdr *phdr64 = _phdr; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
145 + struct elfhdr *ehdr = _ehdr; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 + struct elf_phdr *phdr = _phdr; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 struct mips_elf_abiflags_v0 abiflags; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 int ret; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
149 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
150 - /* Lets see if this is an O32 ELF */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
151 - if (ehdr32->e_ident[EI_CLASS] == ELFCLASS32) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
152 - /* FR = 1 for N32 */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
153 - if (ehdr32->e_flags & EF_MIPS_ABI2) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
154 - state->overall_fp_mode = FP_FR1; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
155 - else |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
156 - /* Set a good default FPU mode for O32 */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
157 - state->overall_fp_mode = cpu_has_mips_r6 ? |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
158 - FP_FRE : FP_FR0; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
159 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
160 - if (ehdr32->e_flags & EF_MIPS_FP64) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
161 - /* |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
162 - * Set MIPS_ABI_FP_OLD_64 for EF_MIPS_FP64. We will override it |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
163 - * later if needed |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
164 - */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
165 - if (is_interp) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
166 - state->interp_fp_abi = MIPS_ABI_FP_OLD_64; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 - else |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
168 - state->fp_abi = MIPS_ABI_FP_OLD_64; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
169 - } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 - if (phdr32->p_type != PT_MIPS_ABIFLAGS) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
171 - return 0; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
173 - if (phdr32->p_filesz < sizeof(abiflags)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
174 - return -EINVAL; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
176 - ret = kernel_read(elf, phdr32->p_offset, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
177 - (char *)&abiflags, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
178 - sizeof(abiflags)); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
179 - } else { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
180 - /* FR=1 is really the only option for 64-bit */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
181 - state->overall_fp_mode = FP_FR1; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 - if (phdr64->p_type != PT_MIPS_ABIFLAGS) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 - return 0; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
185 - if (phdr64->p_filesz < sizeof(abiflags)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 - return -EINVAL; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 - ret = kernel_read(elf, phdr64->p_offset, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
189 - (char *)&abiflags, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
190 - sizeof(abiflags)); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 - } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 + if (config_enabled(CONFIG_64BIT) && |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 + (ehdr->e_ident[EI_CLASS] != ELFCLASS32)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
194 + return 0; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 + if (phdr->p_type != PT_MIPS_ABIFLAGS) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
196 + return 0; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
197 + if (phdr->p_filesz < sizeof(abiflags)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
198 + return -EINVAL; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
200 + ret = kernel_read(elf, phdr->p_offset, (char *)&abiflags, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
201 + sizeof(abiflags)); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
202 if (ret < 0) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 return ret; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
204 if (ret != sizeof(abiflags)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
205 @@ -131,30 +48,35 @@ int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
206 return 0; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
207 } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
208 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 -static inline unsigned get_fp_abi(int in_abi) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
210 +static inline unsigned get_fp_abi(struct elfhdr *ehdr, int in_abi) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
211 { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
212 /* If the ABI requirement is provided, simply return that */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
213 - if (in_abi != MIPS_ABI_FP_UNKNOWN) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
214 + if (in_abi != -1) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
215 return in_abi; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
216 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
217 - /* Unknown ABI */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
218 - return MIPS_ABI_FP_UNKNOWN; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
219 + /* If the EF_MIPS_FP64 flag was set, return MIPS_ABI_FP_64 */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
220 + if (ehdr->e_flags & EF_MIPS_FP64) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
221 + return MIPS_ABI_FP_64; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 + |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 + /* Default to MIPS_ABI_FP_DOUBLE */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
224 + return MIPS_ABI_FP_DOUBLE; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
225 } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
226 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
227 int arch_check_elf(void *_ehdr, bool has_interpreter, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
228 struct arch_elf_state *state) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
229 { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
230 - struct elf32_hdr *ehdr = _ehdr; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
231 - struct mode_req prog_req, interp_req; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
232 - int fp_abi, interp_fp_abi, abi0, abi1, max_abi; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
233 + struct elfhdr *ehdr = _ehdr; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
234 + unsigned fp_abi, interp_fp_abi, abi0, abi1; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
235 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
236 - if (!config_enabled(CONFIG_MIPS_O32_FP64_SUPPORT)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
237 + /* Ignore non-O32 binaries */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
238 + if (config_enabled(CONFIG_64BIT) && |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
239 + (ehdr->e_ident[EI_CLASS] != ELFCLASS32)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 return 0; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
241 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
242 - fp_abi = get_fp_abi(state->fp_abi); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
243 + fp_abi = get_fp_abi(ehdr, state->fp_abi); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
244 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
245 if (has_interpreter) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
246 - interp_fp_abi = get_fp_abi(state->interp_fp_abi); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
247 + interp_fp_abi = get_fp_abi(ehdr, state->interp_fp_abi); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
248 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
249 abi0 = min(fp_abi, interp_fp_abi); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
250 abi1 = max(fp_abi, interp_fp_abi); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
251 @@ -162,103 +84,108 @@ int arch_check_elf(void *_ehdr, bool has_interpreter, |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
252 abi0 = abi1 = fp_abi; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
253 } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
254 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
255 - /* ABI limits. O32 = FP_64A, N32/N64 = FP_SOFT */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
256 - max_abi = ((ehdr->e_ident[EI_CLASS] == ELFCLASS32) && |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
257 - (!(ehdr->e_flags & EF_MIPS_ABI2))) ? |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
258 - MIPS_ABI_FP_64A : MIPS_ABI_FP_SOFT; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
259 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
260 - if ((abi0 > max_abi && abi0 != MIPS_ABI_FP_UNKNOWN) || |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
261 - (abi1 > max_abi && abi1 != MIPS_ABI_FP_UNKNOWN)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
262 - return -ELIBBAD; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
263 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
264 - /* It's time to determine the FPU mode requirements */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
265 - prog_req = (abi0 == MIPS_ABI_FP_UNKNOWN) ? none_req : fpu_reqs[abi0]; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
266 - interp_req = (abi1 == MIPS_ABI_FP_UNKNOWN) ? none_req : fpu_reqs[abi1]; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
267 + state->overall_abi = FP_ERROR; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
268 + |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
269 + if (abi0 == abi1) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
270 + state->overall_abi = abi0; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
271 + } else if (abi0 == MIPS_ABI_FP_ANY) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
272 + state->overall_abi = abi1; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
273 + } else if (abi0 == MIPS_ABI_FP_DOUBLE) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
274 + switch (abi1) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
275 + case MIPS_ABI_FP_XX: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
276 + state->overall_abi = MIPS_ABI_FP_DOUBLE; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
277 + break; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
278 + |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
279 + case MIPS_ABI_FP_64A: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
280 + state->overall_abi = FP_DOUBLE_64A; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
281 + break; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
282 + } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
283 + } else if (abi0 == MIPS_ABI_FP_SINGLE || |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
284 + abi0 == MIPS_ABI_FP_SOFT) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
285 + /* Cannot link with other ABIs */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
286 + } else if (abi0 == MIPS_ABI_FP_OLD_64) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
287 + switch (abi1) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
288 + case MIPS_ABI_FP_XX: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
289 + case MIPS_ABI_FP_64: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
290 + case MIPS_ABI_FP_64A: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
291 + state->overall_abi = MIPS_ABI_FP_64; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
292 + break; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
293 + } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
294 + } else if (abi0 == MIPS_ABI_FP_XX || |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
295 + abi0 == MIPS_ABI_FP_64 || |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
296 + abi0 == MIPS_ABI_FP_64A) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
297 + state->overall_abi = MIPS_ABI_FP_64; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
298 + } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
299 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
300 - /* |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
301 - * Check whether the program's and interp's ABIs have a matching FPU |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
302 - * mode requirement. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
303 - */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
304 - prog_req.single = interp_req.single && prog_req.single; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
305 - prog_req.soft = interp_req.soft && prog_req.soft; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
306 - prog_req.fr1 = interp_req.fr1 && prog_req.fr1; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
307 - prog_req.frdefault = interp_req.frdefault && prog_req.frdefault; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
308 - prog_req.fre = interp_req.fre && prog_req.fre; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
309 + switch (state->overall_abi) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
310 + case MIPS_ABI_FP_64: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
311 + case MIPS_ABI_FP_64A: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
312 + case FP_DOUBLE_64A: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
313 + if (!config_enabled(CONFIG_MIPS_O32_FP64_SUPPORT)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
314 + return -ELIBBAD; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
315 + break; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
316 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
317 - /* |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
318 - * Determine the desired FPU mode |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
319 - * |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
320 - * Decision making: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
321 - * |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
322 - * - We want FR_FRE if FRE=1 and both FR=1 and FR=0 are false. This |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 - * means that we have a combination of program and interpreter |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
324 - * that inherently require the hybrid FP mode. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
325 - * - If FR1 and FRDEFAULT is true, that means we hit the any-abi or |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 - * fpxx case. This is because, in any-ABI (or no-ABI) we have no FPU |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 - * instructions so we don't care about the mode. We will simply use |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
328 - * the one preferred by the hardware. In fpxx case, that ABI can |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
329 - * handle both FR=1 and FR=0, so, again, we simply choose the one |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
330 - * preferred by the hardware. Next, if we only use single-precision |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
331 - * FPU instructions, and the default ABI FPU mode is not good |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 - * (ie single + any ABI combination), we set again the FPU mode to the |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
333 - * one is preferred by the hardware. Next, if we know that the code |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
334 - * will only use single-precision instructions, shown by single being |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
335 - * true but frdefault being false, then we again set the FPU mode to |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
336 - * the one that is preferred by the hardware. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
337 - * - We want FP_FR1 if that's the only matching mode and the default one |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
338 - * is not good. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
339 - * - Return with -ELIBADD if we can't find a matching FPU mode. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
340 - */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
341 - if (prog_req.fre && !prog_req.frdefault && !prog_req.fr1) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
342 - state->overall_fp_mode = FP_FRE; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
343 - else if ((prog_req.fr1 && prog_req.frdefault) || |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
344 - (prog_req.single && !prog_req.frdefault)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
345 - /* Make sure 64-bit MIPS III/IV/64R1 will not pick FR1 */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
346 - state->overall_fp_mode = ((current_cpu_data.fpu_id & MIPS_FPIR_F64) && |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
347 - cpu_has_mips_r2_r6) ? |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
348 - FP_FR1 : FP_FR0; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
349 - else if (prog_req.fr1) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
350 - state->overall_fp_mode = FP_FR1; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
351 - else if (!prog_req.fre && !prog_req.frdefault && |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
352 - !prog_req.fr1 && !prog_req.single && !prog_req.soft) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
353 + case FP_ERROR: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
354 return -ELIBBAD; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
355 + } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
356 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
357 return 0; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
358 } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
359 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
360 -static inline void set_thread_fp_mode(int hybrid, int regs32) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 -{ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
362 - if (hybrid) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
363 - set_thread_flag(TIF_HYBRID_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
364 - else |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
365 - clear_thread_flag(TIF_HYBRID_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 - if (regs32) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
367 - set_thread_flag(TIF_32BIT_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
368 - else |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 - clear_thread_flag(TIF_32BIT_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
370 -} |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
371 - |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
372 void mips_set_personality_fp(struct arch_elf_state *state) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
373 { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
374 - /* |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
375 - * This function is only ever called for O32 ELFs so we should |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
376 - * not be worried about N32/N64 binaries. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
377 - */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
378 + if (config_enabled(CONFIG_FP32XX_HYBRID_FPRS)) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
379 + /* |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
380 + * Use hybrid FPRs for all code which can correctly execute |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
381 + * with that mode. |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
382 + */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
383 + switch (state->overall_abi) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
384 + case MIPS_ABI_FP_DOUBLE: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
385 + case MIPS_ABI_FP_SINGLE: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
386 + case MIPS_ABI_FP_SOFT: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
387 + case MIPS_ABI_FP_XX: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
388 + case MIPS_ABI_FP_ANY: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
389 + /* FR=1, FRE=1 */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
390 + clear_thread_flag(TIF_32BIT_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
391 + set_thread_flag(TIF_HYBRID_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
392 + return; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
393 + } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
394 + } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
395 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
396 - if (!config_enabled(CONFIG_MIPS_O32_FP64_SUPPORT)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
397 - return; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
398 + switch (state->overall_abi) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
399 + case MIPS_ABI_FP_DOUBLE: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
400 + case MIPS_ABI_FP_SINGLE: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
401 + case MIPS_ABI_FP_SOFT: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
402 + /* FR=0 */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
403 + set_thread_flag(TIF_32BIT_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
404 + clear_thread_flag(TIF_HYBRID_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
405 + break; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
406 |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
407 - switch (state->overall_fp_mode) { |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
408 - case FP_FRE: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
409 - set_thread_fp_mode(1, 0); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
410 + case FP_DOUBLE_64A: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
411 + /* FR=1, FRE=1 */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
412 + clear_thread_flag(TIF_32BIT_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
413 + set_thread_flag(TIF_HYBRID_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
414 break; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
415 - case FP_FR0: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
416 - set_thread_fp_mode(0, 1); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
417 + |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
418 + case MIPS_ABI_FP_64: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
419 + case MIPS_ABI_FP_64A: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
420 + /* FR=1, FRE=0 */ |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
421 + clear_thread_flag(TIF_32BIT_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
422 + clear_thread_flag(TIF_HYBRID_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
423 break; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
424 - case FP_FR1: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
425 - set_thread_fp_mode(0, 0); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
426 + |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
427 + case MIPS_ABI_FP_XX: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
428 + case MIPS_ABI_FP_ANY: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
429 + if (!config_enabled(CONFIG_MIPS_O32_FP64_SUPPORT)) |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
430 + set_thread_flag(TIF_32BIT_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
431 + else |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
432 + clear_thread_flag(TIF_32BIT_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
433 + |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
434 + clear_thread_flag(TIF_HYBRID_FPREGS); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
435 break; |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
436 + |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
437 default: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
438 + case FP_ERROR: |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
439 BUG(); |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
440 } |
af5da3b293cb
Revert a broken commit that breaks mips on 4.0.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
441 } |