diff options
| -rw-r--r-- | recipes-devtools/clang/clang/CVE-2024-7883.patch | 519 | ||||
| -rw-r--r-- | recipes-devtools/clang/common.inc | 1 |
2 files changed, 520 insertions, 0 deletions
diff --git a/recipes-devtools/clang/clang/CVE-2024-7883.patch b/recipes-devtools/clang/clang/CVE-2024-7883.patch new file mode 100644 index 0000000..bc06bf1 --- /dev/null +++ b/recipes-devtools/clang/clang/CVE-2024-7883.patch | |||
| @@ -0,0 +1,519 @@ | |||
| 1 | From de90874bca7e85ea13bbb2167fde6177cf7ee00c Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Oliver Stannard <oliver.stannard@arm.com> | ||
| 3 | Date: Fri, 1 Nov 2024 10:36:13 +0100 | ||
| 4 | Subject: [PATCH] [ARM] Fix CMSE S->NS calls when CONTROL_S.SFPA==0 | ||
| 5 | (CVE-2024-7883) (#114433) | ||
| 6 | |||
| 7 | When doing a call from CMSE secure state to non-secure state for | ||
| 8 | v8-M.main, we use the VLLDM and VLSTM instructions to save, clear and | ||
| 9 | restore the FP registers around the call. These instructions both check | ||
| 10 | the CONTROL_S.SFPA bit, and if it is clear (meaning the current contents | ||
| 11 | of the FP registers are not secret) they execute as no-ops. | ||
| 12 | |||
| 13 | This causes a problem when CONTROL_S.SFPA==0 before the call, which | ||
| 14 | happens if there are no floating-point instructions executed between | ||
| 15 | entry to secure state and the call. If this is the case, then the VLSTM | ||
| 16 | instruction will do nothing, leaving the save area in the stack | ||
| 17 | uninitialised. If the called function returns a value in floating-point | ||
| 18 | registers, the call sequence includes an instruction to copy the return | ||
| 19 | value from a floating-point register to a GPR, which must be before the | ||
| 20 | VLLDM instruction. This copy sets CONTROL_S.SFPA, meaning that the VLLDM | ||
| 21 | will fully execute, and load the uninitialised stack memory into the FP | ||
| 22 | registers. | ||
| 23 | |||
| 24 | This causes two problems: | ||
| 25 | * The FP register file is clobbered, including all of the callee-saved | ||
| 26 | registers, which might contain live values. | ||
| 27 | * The stack region might contain secret values, which will be leaked to | ||
| 28 | non-secure state through the floating-point registers if/when we | ||
| 29 | return to non-secure state. | ||
| 30 | |||
| 31 | The fix is to insert a `vmov s0, s0` instruction before the VLSTM | ||
| 32 | instruction, to ensure that CONTROL_S.SFPA is set for both the VLLDM and | ||
| 33 | VLSTM instruction. | ||
| 34 | |||
| 35 | CVE: https://www.cve.org/cverecord?id=CVE-2024-7883 | ||
| 36 | Security bulletin: | ||
| 37 | https://developer.arm.com/Arm%20Security%20Center/Cortex-M%20Security%20Extensions%20Vulnerability | ||
| 38 | |||
| 39 | CVE: CVE-2024-7883 | ||
| 40 | Upstream-Status: Backport [https://github.com/llvm/llvm-project/commit/33411d520783189c31e9936a67371198d6da5f25] | ||
| 41 | |||
| 42 | (cherry picked from commit 33411d520783189c31e9936a67371198d6da5f25) | ||
| 43 | Signed-off-by: Sudhir Dumbhare <sudumbha@cisco.com> | ||
| 44 | --- | ||
| 45 | llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp | 44 ++++- | ||
| 46 | .../test/CodeGen/ARM/cmse-clear-float-hard.ll | 160 ++++++++++++++---- | ||
| 47 | .../CodeGen/ARM/cmse-vlldm-no-reorder.mir | 1 + | ||
| 48 | 3 files changed, 172 insertions(+), 33 deletions(-) | ||
| 49 | |||
| 50 | diff --git a/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp b/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp | ||
| 51 | index 2f9236bb977f..1db4d410a467 100644 | ||
| 52 | --- a/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp | ||
| 53 | +++ b/llvm/lib/Target/ARM/ARMExpandPseudoInsts.cpp | ||
| 54 | @@ -1429,6 +1429,7 @@ void ARMExpandPseudo::CMSESaveClearFPRegsV8( | ||
| 55 | // Use ScratchRegs to store the fp regs | ||
| 56 | std::vector<std::tuple<unsigned, unsigned, unsigned>> ClearedFPRegs; | ||
| 57 | std::vector<unsigned> NonclearedFPRegs; | ||
| 58 | + bool ReturnsFPReg = false; | ||
| 59 | for (const MachineOperand &Op : MBBI->operands()) { | ||
| 60 | if (Op.isReg() && Op.isUse()) { | ||
| 61 | Register Reg = Op.getReg(); | ||
| 62 | @@ -1463,14 +1464,51 @@ void ARMExpandPseudo::CMSESaveClearFPRegsV8( | ||
| 63 | NonclearedFPRegs.push_back(Reg); | ||
| 64 | } | ||
| 65 | } | ||
| 66 | + } else if (Op.isReg() && Op.isDef()) { | ||
| 67 | + Register Reg = Op.getReg(); | ||
| 68 | + if (ARM::SPRRegClass.contains(Reg) || ARM::DPRRegClass.contains(Reg) || | ||
| 69 | + ARM::QPRRegClass.contains(Reg)) | ||
| 70 | + ReturnsFPReg = true; | ||
| 71 | } | ||
| 72 | } | ||
| 73 | |||
| 74 | - bool passesFPReg = (!NonclearedFPRegs.empty() || !ClearedFPRegs.empty()); | ||
| 75 | + bool PassesFPReg = (!NonclearedFPRegs.empty() || !ClearedFPRegs.empty()); | ||
| 76 | |||
| 77 | - if (passesFPReg) | ||
| 78 | + if (PassesFPReg || ReturnsFPReg) | ||
| 79 | assert(STI->hasFPRegs() && "Subtarget needs fpregs"); | ||
| 80 | |||
| 81 | + // CVE-2024-7883 | ||
| 82 | + // | ||
| 83 | + // The VLLDM/VLSTM instructions set up lazy state preservation, but they | ||
| 84 | + // execute as NOPs if the FP register file is not considered to contain | ||
| 85 | + // secure data, represented by the CONTROL_S.SFPA bit. This means that the | ||
| 86 | + // state of CONTROL_S.SFPA must be the same when these two instructions are | ||
| 87 | + // executed. That might not be the case if we haven't used any FP | ||
| 88 | + // instructions before the VLSTM, so CONTROL_S.SFPA is clear, but do have one | ||
| 89 | + // before the VLLDM, which sets it.. | ||
| 90 | + // | ||
| 91 | + // If we can't prove that SFPA will be the same for the VLSTM and VLLDM, we | ||
| 92 | + // execute a "vmov s0, s0" instruction before the VLSTM to ensure that | ||
| 93 | + // CONTROL_S.SFPA is set for both. | ||
| 94 | + // | ||
| 95 | + // That can only happen for callees which take no FP arguments (or we'd have | ||
| 96 | + // inserted a VMOV above) and which return values in FP regs (so that we need | ||
| 97 | + // to use a VMOV to back-up the return value before the VLLDM). It also can't | ||
| 98 | + // happen if the call is dominated by other existing floating-point | ||
| 99 | + // instructions, but we don't currently check for that case. | ||
| 100 | + // | ||
| 101 | + // These conditions mean that we only emit this instruction when using the | ||
| 102 | + // hard-float ABI, which means we can assume that FP instructions are | ||
| 103 | + // available, and don't need to make it conditional like we do for the | ||
| 104 | + // CVE-2021-35465 workaround. | ||
| 105 | + if (ReturnsFPReg && !PassesFPReg) { | ||
| 106 | + bool S0Dead = !LiveRegs.contains(ARM::S0); | ||
| 107 | + BuildMI(MBB, MBBI, DL, TII->get(ARM::VMOVS)) | ||
| 108 | + .addReg(ARM::S0, RegState::Define | getDeadRegState(S0Dead)) | ||
| 109 | + .addReg(ARM::S0, getUndefRegState(S0Dead)) | ||
| 110 | + .add(predOps(ARMCC::AL)); | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | // Lazy store all fp registers to the stack. | ||
| 114 | // This executes as NOP in the absence of floating-point support. | ||
| 115 | MachineInstrBuilder VLSTM = BuildMI(MBB, MBBI, DL, TII->get(ARM::VLSTM)) | ||
| 116 | @@ -1525,7 +1563,7 @@ void ARMExpandPseudo::CMSESaveClearFPRegsV8( | ||
| 117 | } | ||
| 118 | // restore FPSCR from stack and clear bits 0-4, 7, 28-31 | ||
| 119 | // The other bits are program global according to the AAPCS | ||
| 120 | - if (passesFPReg) { | ||
| 121 | + if (PassesFPReg) { | ||
| 122 | BuildMI(MBB, MBBI, DL, TII->get(ARM::tLDRspi), SpareReg) | ||
| 123 | .addReg(ARM::SP) | ||
| 124 | .addImm(0x10) | ||
| 125 | diff --git a/llvm/test/CodeGen/ARM/cmse-clear-float-hard.ll b/llvm/test/CodeGen/ARM/cmse-clear-float-hard.ll | ||
| 126 | index 606859db0a0e..f97fc51a0c45 100644 | ||
| 127 | --- a/llvm/test/CodeGen/ARM/cmse-clear-float-hard.ll | ||
| 128 | +++ b/llvm/test/CodeGen/ARM/cmse-clear-float-hard.ll | ||
| 129 | @@ -187,7 +187,7 @@ define float @f2(ptr nocapture %fptr) #2 { | ||
| 130 | ; CHECK-8M-NEXT: bic r0, r0, #1 | ||
| 131 | ; CHECK-8M-NEXT: sub sp, #136 | ||
| 132 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 133 | -; CHECK-8M-NEXT: vlstm sp | ||
| 134 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 135 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 136 | ; CHECK-8M-NEXT: ldr r1, [sp, #64] | ||
| 137 | ; CHECK-8M-NEXT: bic r1, r1, #159 | ||
| 138 | @@ -207,7 +207,7 @@ define float @f2(ptr nocapture %fptr) #2 { | ||
| 139 | ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 140 | ; CHECK-8M-NEXT: blxns r0 | ||
| 141 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 142 | -; CHECK-8M-NEXT: vlldm sp | ||
| 143 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 144 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 145 | ; CHECK-8M-NEXT: add sp, #136 | ||
| 146 | ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 147 | @@ -245,7 +245,7 @@ define double @d2(ptr nocapture %fptr) #2 { | ||
| 148 | ; CHECK-8M-LE-NEXT: bic r0, r0, #1 | ||
| 149 | ; CHECK-8M-LE-NEXT: sub sp, #136 | ||
| 150 | ; CHECK-8M-LE-NEXT: vmov r11, r12, d0 | ||
| 151 | -; CHECK-8M-LE-NEXT: vlstm sp | ||
| 152 | +; CHECK-8M-LE-NEXT: vlstm sp, {d0 - d15} | ||
| 153 | ; CHECK-8M-LE-NEXT: vmov d0, r11, r12 | ||
| 154 | ; CHECK-8M-LE-NEXT: ldr r1, [sp, #64] | ||
| 155 | ; CHECK-8M-LE-NEXT: bic r1, r1, #159 | ||
| 156 | @@ -264,7 +264,7 @@ define double @d2(ptr nocapture %fptr) #2 { | ||
| 157 | ; CHECK-8M-LE-NEXT: msr apsr_nzcvqg, r0 | ||
| 158 | ; CHECK-8M-LE-NEXT: blxns r0 | ||
| 159 | ; CHECK-8M-LE-NEXT: vmov r11, r12, d0 | ||
| 160 | -; CHECK-8M-LE-NEXT: vlldm sp | ||
| 161 | +; CHECK-8M-LE-NEXT: vlldm sp, {d0 - d15} | ||
| 162 | ; CHECK-8M-LE-NEXT: vmov d0, r11, r12 | ||
| 163 | ; CHECK-8M-LE-NEXT: add sp, #136 | ||
| 164 | ; CHECK-8M-LE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 165 | @@ -283,7 +283,7 @@ define double @d2(ptr nocapture %fptr) #2 { | ||
| 166 | ; CHECK-8M-BE-NEXT: bic r0, r0, #1 | ||
| 167 | ; CHECK-8M-BE-NEXT: sub sp, #136 | ||
| 168 | ; CHECK-8M-BE-NEXT: vmov r11, r12, d0 | ||
| 169 | -; CHECK-8M-BE-NEXT: vlstm sp | ||
| 170 | +; CHECK-8M-BE-NEXT: vlstm sp, {d0 - d15} | ||
| 171 | ; CHECK-8M-BE-NEXT: vmov d0, r11, r12 | ||
| 172 | ; CHECK-8M-BE-NEXT: ldr r1, [sp, #64] | ||
| 173 | ; CHECK-8M-BE-NEXT: bic r1, r1, #159 | ||
| 174 | @@ -302,7 +302,7 @@ define double @d2(ptr nocapture %fptr) #2 { | ||
| 175 | ; CHECK-8M-BE-NEXT: msr apsr_nzcvqg, r0 | ||
| 176 | ; CHECK-8M-BE-NEXT: blxns r0 | ||
| 177 | ; CHECK-8M-BE-NEXT: vmov r11, r12, d0 | ||
| 178 | -; CHECK-8M-BE-NEXT: vlldm sp | ||
| 179 | +; CHECK-8M-BE-NEXT: vlldm sp, {d0 - d15} | ||
| 180 | ; CHECK-8M-BE-NEXT: vmov d0, r11, r12 | ||
| 181 | ; CHECK-8M-BE-NEXT: add sp, #136 | ||
| 182 | ; CHECK-8M-BE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 183 | @@ -368,7 +368,7 @@ define float @f3(ptr nocapture %fptr) #4 { | ||
| 184 | ; CHECK-8M-NEXT: bic r0, r0, #1 | ||
| 185 | ; CHECK-8M-NEXT: sub sp, #136 | ||
| 186 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 187 | -; CHECK-8M-NEXT: vlstm sp | ||
| 188 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 189 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 190 | ; CHECK-8M-NEXT: ldr r1, [sp, #64] | ||
| 191 | ; CHECK-8M-NEXT: bic r1, r1, #159 | ||
| 192 | @@ -388,7 +388,7 @@ define float @f3(ptr nocapture %fptr) #4 { | ||
| 193 | ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 194 | ; CHECK-8M-NEXT: blxns r0 | ||
| 195 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 196 | -; CHECK-8M-NEXT: vlldm sp | ||
| 197 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 198 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 199 | ; CHECK-8M-NEXT: add sp, #136 | ||
| 200 | ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 201 | @@ -426,7 +426,7 @@ define double @d3(ptr nocapture %fptr) #4 { | ||
| 202 | ; CHECK-8M-LE-NEXT: bic r0, r0, #1 | ||
| 203 | ; CHECK-8M-LE-NEXT: sub sp, #136 | ||
| 204 | ; CHECK-8M-LE-NEXT: vmov r11, r12, d0 | ||
| 205 | -; CHECK-8M-LE-NEXT: vlstm sp | ||
| 206 | +; CHECK-8M-LE-NEXT: vlstm sp, {d0 - d15} | ||
| 207 | ; CHECK-8M-LE-NEXT: vmov d0, r11, r12 | ||
| 208 | ; CHECK-8M-LE-NEXT: ldr r1, [sp, #64] | ||
| 209 | ; CHECK-8M-LE-NEXT: bic r1, r1, #159 | ||
| 210 | @@ -445,7 +445,7 @@ define double @d3(ptr nocapture %fptr) #4 { | ||
| 211 | ; CHECK-8M-LE-NEXT: msr apsr_nzcvqg, r0 | ||
| 212 | ; CHECK-8M-LE-NEXT: blxns r0 | ||
| 213 | ; CHECK-8M-LE-NEXT: vmov r11, r12, d0 | ||
| 214 | -; CHECK-8M-LE-NEXT: vlldm sp | ||
| 215 | +; CHECK-8M-LE-NEXT: vlldm sp, {d0 - d15} | ||
| 216 | ; CHECK-8M-LE-NEXT: vmov d0, r11, r12 | ||
| 217 | ; CHECK-8M-LE-NEXT: add sp, #136 | ||
| 218 | ; CHECK-8M-LE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 219 | @@ -464,7 +464,7 @@ define double @d3(ptr nocapture %fptr) #4 { | ||
| 220 | ; CHECK-8M-BE-NEXT: bic r0, r0, #1 | ||
| 221 | ; CHECK-8M-BE-NEXT: sub sp, #136 | ||
| 222 | ; CHECK-8M-BE-NEXT: vmov r11, r12, d0 | ||
| 223 | -; CHECK-8M-BE-NEXT: vlstm sp | ||
| 224 | +; CHECK-8M-BE-NEXT: vlstm sp, {d0 - d15} | ||
| 225 | ; CHECK-8M-BE-NEXT: vmov d0, r11, r12 | ||
| 226 | ; CHECK-8M-BE-NEXT: ldr r1, [sp, #64] | ||
| 227 | ; CHECK-8M-BE-NEXT: bic r1, r1, #159 | ||
| 228 | @@ -483,7 +483,7 @@ define double @d3(ptr nocapture %fptr) #4 { | ||
| 229 | ; CHECK-8M-BE-NEXT: msr apsr_nzcvqg, r0 | ||
| 230 | ; CHECK-8M-BE-NEXT: blxns r0 | ||
| 231 | ; CHECK-8M-BE-NEXT: vmov r11, r12, d0 | ||
| 232 | -; CHECK-8M-BE-NEXT: vlldm sp | ||
| 233 | +; CHECK-8M-BE-NEXT: vlldm sp, {d0 - d15} | ||
| 234 | ; CHECK-8M-BE-NEXT: vmov d0, r11, r12 | ||
| 235 | ; CHECK-8M-BE-NEXT: add sp, #136 | ||
| 236 | ; CHECK-8M-BE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 237 | @@ -547,8 +547,9 @@ define float @f4(ptr nocapture %fptr) #6 { | ||
| 238 | ; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 239 | ; CHECK-8M-NEXT: bic r0, r0, #1 | ||
| 240 | ; CHECK-8M-NEXT: sub sp, #136 | ||
| 241 | -; CHECK-8M-NEXT: vlstm sp | ||
| 242 | +; CHECK-8M-NEXT: vmov.f32 s0, s0 | ||
| 243 | ; CHECK-8M-NEXT: mov r1, r0 | ||
| 244 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 245 | ; CHECK-8M-NEXT: mov r2, r0 | ||
| 246 | ; CHECK-8M-NEXT: mov r3, r0 | ||
| 247 | ; CHECK-8M-NEXT: mov r4, r0 | ||
| 248 | @@ -563,7 +564,7 @@ define float @f4(ptr nocapture %fptr) #6 { | ||
| 249 | ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 250 | ; CHECK-8M-NEXT: blxns r0 | ||
| 251 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 252 | -; CHECK-8M-NEXT: vlldm sp | ||
| 253 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 254 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 255 | ; CHECK-8M-NEXT: add sp, #136 | ||
| 256 | ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 257 | @@ -598,8 +599,9 @@ define double @d4(ptr nocapture %fptr) #6 { | ||
| 258 | ; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 259 | ; CHECK-8M-NEXT: bic r0, r0, #1 | ||
| 260 | ; CHECK-8M-NEXT: sub sp, #136 | ||
| 261 | -; CHECK-8M-NEXT: vlstm sp | ||
| 262 | +; CHECK-8M-NEXT: vmov.f32 s0, s0 | ||
| 263 | ; CHECK-8M-NEXT: mov r1, r0 | ||
| 264 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 265 | ; CHECK-8M-NEXT: mov r2, r0 | ||
| 266 | ; CHECK-8M-NEXT: mov r3, r0 | ||
| 267 | ; CHECK-8M-NEXT: mov r4, r0 | ||
| 268 | @@ -614,7 +616,7 @@ define double @d4(ptr nocapture %fptr) #6 { | ||
| 269 | ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 270 | ; CHECK-8M-NEXT: blxns r0 | ||
| 271 | ; CHECK-8M-NEXT: vmov r11, r12, d0 | ||
| 272 | -; CHECK-8M-NEXT: vlldm sp | ||
| 273 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 274 | ; CHECK-8M-NEXT: vmov d0, r11, r12 | ||
| 275 | ; CHECK-8M-NEXT: add sp, #136 | ||
| 276 | ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 277 | @@ -649,7 +651,7 @@ define void @fd(ptr %f, float %a, double %b) #8 { | ||
| 278 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 279 | ; CHECK-8M-NEXT: mov r2, r0 | ||
| 280 | ; CHECK-8M-NEXT: vmov r10, r11, d1 | ||
| 281 | -; CHECK-8M-NEXT: vlstm sp | ||
| 282 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 283 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 284 | ; CHECK-8M-NEXT: vmov d1, r10, r11 | ||
| 285 | ; CHECK-8M-NEXT: ldr r1, [sp, #64] | ||
| 286 | @@ -666,7 +668,7 @@ define void @fd(ptr %f, float %a, double %b) #8 { | ||
| 287 | ; CHECK-8M-NEXT: mov r9, r0 | ||
| 288 | ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 289 | ; CHECK-8M-NEXT: blxns r0 | ||
| 290 | -; CHECK-8M-NEXT: vlldm sp | ||
| 291 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 292 | ; CHECK-8M-NEXT: add sp, #136 | ||
| 293 | ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 294 | ; CHECK-8M-NEXT: pop {r7, pc} | ||
| 295 | @@ -708,7 +710,7 @@ define void @fdff(ptr %f, float %a, double %b, float %c, float %d) #8 { | ||
| 296 | ; CHECK-8M-NEXT: vmov r9, s1 | ||
| 297 | ; CHECK-8M-NEXT: mov r4, r0 | ||
| 298 | ; CHECK-8M-NEXT: vmov r8, s4 | ||
| 299 | -; CHECK-8M-NEXT: vlstm sp | ||
| 300 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 301 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 302 | ; CHECK-8M-NEXT: vmov d1, r10, r11 | ||
| 303 | ; CHECK-8M-NEXT: vmov s1, r9 | ||
| 304 | @@ -723,7 +725,7 @@ define void @fdff(ptr %f, float %a, double %b, float %c, float %d) #8 { | ||
| 305 | ; CHECK-8M-NEXT: mov r7, r0 | ||
| 306 | ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 307 | ; CHECK-8M-NEXT: blxns r0 | ||
| 308 | -; CHECK-8M-NEXT: vlldm sp | ||
| 309 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 310 | ; CHECK-8M-NEXT: add sp, #136 | ||
| 311 | ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 312 | ; CHECK-8M-NEXT: pop {r7, pc} | ||
| 313 | @@ -765,7 +767,7 @@ define void @fidififid(ptr %fu, float %a, i32 %b, double %c, i32 %d, float %e, i | ||
| 314 | ; CHECK-8M-NEXT: vmov r8, s1 | ||
| 315 | ; CHECK-8M-NEXT: vmov r7, s4 | ||
| 316 | ; CHECK-8M-NEXT: vmov r5, r6, d3 | ||
| 317 | -; CHECK-8M-NEXT: vlstm sp | ||
| 318 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 319 | ; CHECK-8M-NEXT: vmov s0, r11 | ||
| 320 | ; CHECK-8M-NEXT: vmov d1, r9, r10 | ||
| 321 | ; CHECK-8M-NEXT: vmov s1, r8 | ||
| 322 | @@ -778,7 +780,7 @@ define void @fidififid(ptr %fu, float %a, i32 %b, double %c, i32 %d, float %e, i | ||
| 323 | ; CHECK-8M-NEXT: mov r4, r12 | ||
| 324 | ; CHECK-8M-NEXT: msr apsr_nzcvqg, r12 | ||
| 325 | ; CHECK-8M-NEXT: blxns r12 | ||
| 326 | -; CHECK-8M-NEXT: vlldm sp | ||
| 327 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 328 | ; CHECK-8M-NEXT: add sp, #136 | ||
| 329 | ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 330 | ; CHECK-8M-NEXT: pop {r7, pc} | ||
| 331 | @@ -897,7 +899,7 @@ define half @h2(ptr nocapture %hptr) nounwind { | ||
| 332 | ; CHECK-8M-NEXT: bic r0, r0, #1 | ||
| 333 | ; CHECK-8M-NEXT: sub sp, #136 | ||
| 334 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 335 | -; CHECK-8M-NEXT: vlstm sp | ||
| 336 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 337 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 338 | ; CHECK-8M-NEXT: ldr r1, [sp, #64] | ||
| 339 | ; CHECK-8M-NEXT: bic r1, r1, #159 | ||
| 340 | @@ -917,7 +919,7 @@ define half @h2(ptr nocapture %hptr) nounwind { | ||
| 341 | ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 342 | ; CHECK-8M-NEXT: blxns r0 | ||
| 343 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 344 | -; CHECK-8M-NEXT: vlldm sp | ||
| 345 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 346 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 347 | ; CHECK-8M-NEXT: add sp, #136 | ||
| 348 | ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 349 | @@ -976,7 +978,7 @@ define half @h3(ptr nocapture %hptr) nounwind { | ||
| 350 | ; CHECK-8M-NEXT: bic r0, r0, #1 | ||
| 351 | ; CHECK-8M-NEXT: sub sp, #136 | ||
| 352 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 353 | -; CHECK-8M-NEXT: vlstm sp | ||
| 354 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 355 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 356 | ; CHECK-8M-NEXT: ldr r1, [sp, #64] | ||
| 357 | ; CHECK-8M-NEXT: bic r1, r1, #159 | ||
| 358 | @@ -996,7 +998,7 @@ define half @h3(ptr nocapture %hptr) nounwind { | ||
| 359 | ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 360 | ; CHECK-8M-NEXT: blxns r0 | ||
| 361 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 362 | -; CHECK-8M-NEXT: vlldm sp | ||
| 363 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 364 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 365 | ; CHECK-8M-NEXT: add sp, #136 | ||
| 366 | ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 367 | @@ -1053,8 +1055,9 @@ define half @h4(ptr nocapture %hptr) nounwind { | ||
| 368 | ; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 369 | ; CHECK-8M-NEXT: bic r0, r0, #1 | ||
| 370 | ; CHECK-8M-NEXT: sub sp, #136 | ||
| 371 | -; CHECK-8M-NEXT: vlstm sp | ||
| 372 | +; CHECK-8M-NEXT: vmov.f32 s0, s0 | ||
| 373 | ; CHECK-8M-NEXT: mov r1, r0 | ||
| 374 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 375 | ; CHECK-8M-NEXT: mov r2, r0 | ||
| 376 | ; CHECK-8M-NEXT: mov r3, r0 | ||
| 377 | ; CHECK-8M-NEXT: mov r4, r0 | ||
| 378 | @@ -1069,7 +1072,7 @@ define half @h4(ptr nocapture %hptr) nounwind { | ||
| 379 | ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 380 | ; CHECK-8M-NEXT: blxns r0 | ||
| 381 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 382 | -; CHECK-8M-NEXT: vlldm sp | ||
| 383 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 384 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 385 | ; CHECK-8M-NEXT: add sp, #136 | ||
| 386 | ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 387 | @@ -1176,7 +1179,7 @@ define half @h1_arg(ptr nocapture %hptr, half %harg) nounwind { | ||
| 388 | ; CHECK-8M-NEXT: bic r0, r0, #1 | ||
| 389 | ; CHECK-8M-NEXT: sub sp, #136 | ||
| 390 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 391 | -; CHECK-8M-NEXT: vlstm sp | ||
| 392 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 393 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 394 | ; CHECK-8M-NEXT: ldr r1, [sp, #64] | ||
| 395 | ; CHECK-8M-NEXT: bic r1, r1, #159 | ||
| 396 | @@ -1196,7 +1199,7 @@ define half @h1_arg(ptr nocapture %hptr, half %harg) nounwind { | ||
| 397 | ; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 398 | ; CHECK-8M-NEXT: blxns r0 | ||
| 399 | ; CHECK-8M-NEXT: vmov r12, s0 | ||
| 400 | -; CHECK-8M-NEXT: vlldm sp | ||
| 401 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 402 | ; CHECK-8M-NEXT: vmov s0, r12 | ||
| 403 | ; CHECK-8M-NEXT: add sp, #136 | ||
| 404 | ; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 405 | @@ -1241,3 +1244,100 @@ entry: | ||
| 406 | ret half %call | ||
| 407 | } | ||
| 408 | |||
| 409 | +define float @float_return_undef_arg(ptr nocapture %fptr) #6 { | ||
| 410 | +; CHECK-8M-LABEL: float_return_undef_arg: | ||
| 411 | +; CHECK-8M: @ %bb.0: @ %entry | ||
| 412 | +; CHECK-8M-NEXT: push {r7, lr} | ||
| 413 | +; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 414 | +; CHECK-8M-NEXT: bic r0, r0, #1 | ||
| 415 | +; CHECK-8M-NEXT: sub sp, #136 | ||
| 416 | +; CHECK-8M-NEXT: vmov.f32 s0, s0 | ||
| 417 | +; CHECK-8M-NEXT: mov r1, r0 | ||
| 418 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 419 | +; CHECK-8M-NEXT: mov r2, r0 | ||
| 420 | +; CHECK-8M-NEXT: mov r3, r0 | ||
| 421 | +; CHECK-8M-NEXT: mov r4, r0 | ||
| 422 | +; CHECK-8M-NEXT: mov r5, r0 | ||
| 423 | +; CHECK-8M-NEXT: mov r6, r0 | ||
| 424 | +; CHECK-8M-NEXT: mov r7, r0 | ||
| 425 | +; CHECK-8M-NEXT: mov r8, r0 | ||
| 426 | +; CHECK-8M-NEXT: mov r9, r0 | ||
| 427 | +; CHECK-8M-NEXT: mov r10, r0 | ||
| 428 | +; CHECK-8M-NEXT: mov r11, r0 | ||
| 429 | +; CHECK-8M-NEXT: mov r12, r0 | ||
| 430 | +; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 431 | +; CHECK-8M-NEXT: blxns r0 | ||
| 432 | +; CHECK-8M-NEXT: vmov r12, s0 | ||
| 433 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 434 | +; CHECK-8M-NEXT: vmov s0, r12 | ||
| 435 | +; CHECK-8M-NEXT: add sp, #136 | ||
| 436 | +; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 437 | +; CHECK-8M-NEXT: pop {r7, pc} | ||
| 438 | +; | ||
| 439 | +; CHECK-81M-LABEL: float_return_undef_arg: | ||
| 440 | +; CHECK-81M: @ %bb.0: @ %entry | ||
| 441 | +; CHECK-81M-NEXT: push {r7, lr} | ||
| 442 | +; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 443 | +; CHECK-81M-NEXT: bic r0, r0, #1 | ||
| 444 | +; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} | ||
| 445 | +; CHECK-81M-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr} | ||
| 446 | +; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! | ||
| 447 | +; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} | ||
| 448 | +; CHECK-81M-NEXT: blxns r0 | ||
| 449 | +; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 | ||
| 450 | +; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} | ||
| 451 | +; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 452 | +; CHECK-81M-NEXT: pop {r7, pc} | ||
| 453 | +entry: | ||
| 454 | + %call = call float %fptr(i32 undef) #7 | ||
| 455 | + ret float %call | ||
| 456 | +} | ||
| 457 | + | ||
| 458 | +define float @float_return_poison_arg(ptr nocapture %fptr) #6 { | ||
| 459 | +; CHECK-8M-LABEL: float_return_poison_arg: | ||
| 460 | +; CHECK-8M: @ %bb.0: @ %entry | ||
| 461 | +; CHECK-8M-NEXT: push {r7, lr} | ||
| 462 | +; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 463 | +; CHECK-8M-NEXT: bic r0, r0, #1 | ||
| 464 | +; CHECK-8M-NEXT: sub sp, #136 | ||
| 465 | +; CHECK-8M-NEXT: vmov.f32 s0, s0 | ||
| 466 | +; CHECK-8M-NEXT: mov r1, r0 | ||
| 467 | +; CHECK-8M-NEXT: vlstm sp, {d0 - d15} | ||
| 468 | +; CHECK-8M-NEXT: mov r2, r0 | ||
| 469 | +; CHECK-8M-NEXT: mov r3, r0 | ||
| 470 | +; CHECK-8M-NEXT: mov r4, r0 | ||
| 471 | +; CHECK-8M-NEXT: mov r5, r0 | ||
| 472 | +; CHECK-8M-NEXT: mov r6, r0 | ||
| 473 | +; CHECK-8M-NEXT: mov r7, r0 | ||
| 474 | +; CHECK-8M-NEXT: mov r8, r0 | ||
| 475 | +; CHECK-8M-NEXT: mov r9, r0 | ||
| 476 | +; CHECK-8M-NEXT: mov r10, r0 | ||
| 477 | +; CHECK-8M-NEXT: mov r11, r0 | ||
| 478 | +; CHECK-8M-NEXT: mov r12, r0 | ||
| 479 | +; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 | ||
| 480 | +; CHECK-8M-NEXT: blxns r0 | ||
| 481 | +; CHECK-8M-NEXT: vmov r12, s0 | ||
| 482 | +; CHECK-8M-NEXT: vlldm sp, {d0 - d15} | ||
| 483 | +; CHECK-8M-NEXT: vmov s0, r12 | ||
| 484 | +; CHECK-8M-NEXT: add sp, #136 | ||
| 485 | +; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 486 | +; CHECK-8M-NEXT: pop {r7, pc} | ||
| 487 | +; | ||
| 488 | +; CHECK-81M-LABEL: float_return_poison_arg: | ||
| 489 | +; CHECK-81M: @ %bb.0: @ %entry | ||
| 490 | +; CHECK-81M-NEXT: push {r7, lr} | ||
| 491 | +; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 492 | +; CHECK-81M-NEXT: bic r0, r0, #1 | ||
| 493 | +; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} | ||
| 494 | +; CHECK-81M-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr} | ||
| 495 | +; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! | ||
| 496 | +; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} | ||
| 497 | +; CHECK-81M-NEXT: blxns r0 | ||
| 498 | +; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 | ||
| 499 | +; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} | ||
| 500 | +; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} | ||
| 501 | +; CHECK-81M-NEXT: pop {r7, pc} | ||
| 502 | +entry: | ||
| 503 | + %call = call float %fptr(i32 poison) #7 | ||
| 504 | + ret float %call | ||
| 505 | +} | ||
| 506 | diff --git a/llvm/test/CodeGen/ARM/cmse-vlldm-no-reorder.mir b/llvm/test/CodeGen/ARM/cmse-vlldm-no-reorder.mir | ||
| 507 | index 2bc4288884f1..416cf3a53c9b 100644 | ||
| 508 | --- a/llvm/test/CodeGen/ARM/cmse-vlldm-no-reorder.mir | ||
| 509 | +++ b/llvm/test/CodeGen/ARM/cmse-vlldm-no-reorder.mir | ||
| 510 | @@ -89,6 +89,7 @@ body: | | ||
| 511 | # CHECK: $sp = t2STMDB_UPD $sp, 14 /* CC::al */, $noreg, $r4, $r5, $r6, undef $r7, $r8, $r9, $r10, $r11 | ||
| 512 | # CHECK-NEXT: $r0 = t2BICri $r0, 1, 14 /* CC::al */, $noreg, $noreg | ||
| 513 | # CHECK-NEXT: $sp = tSUBspi $sp, 34, 14 /* CC::al */, $noreg | ||
| 514 | +# CHECK-NEXT: dead $s0 = VMOVS undef $s0, 14 /* CC::al */, $noreg | ||
| 515 | # CHECK-NEXT: VLSTM $sp, 14 /* CC::al */, $noreg, implicit undef $vpr, implicit undef $fpscr, implicit undef $fpscr_nzcv, implicit undef $q0, implicit undef $q1, implicit undef $q2, implicit undef $q3, implicit undef $q4, implicit undef $q5, implicit undef $q6, implicit undef $q7 | ||
| 516 | # CHECK-NEXT: $r1 = tMOVr $r0, 14 /* CC::al */, $noreg | ||
| 517 | # CHECK-NEXT: $r2 = tMOVr $r0, 14 /* CC::al */, $noreg | ||
| 518 | -- | ||
| 519 | 2.43.7 | ||
diff --git a/recipes-devtools/clang/common.inc b/recipes-devtools/clang/common.inc index f48be06..660b999 100644 --- a/recipes-devtools/clang/common.inc +++ b/recipes-devtools/clang/common.inc | |||
| @@ -50,6 +50,7 @@ SRC_URI = "\ | |||
| 50 | file://0037-Include-cstdint-in-AMDGPUMCTargetDesc-101766.patch \ | 50 | file://0037-Include-cstdint-in-AMDGPUMCTargetDesc-101766.patch \ |
| 51 | file://0038-Add-missing-include-to-X86MCTargetDesc.h-123320.patch \ | 51 | file://0038-Add-missing-include-to-X86MCTargetDesc.h-123320.patch \ |
| 52 | file://0039-Add-cstdint-to-AddressableBits-102110.patch \ | 52 | file://0039-Add-cstdint-to-AddressableBits-102110.patch \ |
| 53 | file://CVE-2024-7883.patch \ | ||
| 53 | " | 54 | " |
| 54 | # Fallback to no-PIE if not set | 55 | # Fallback to no-PIE if not set |
| 55 | GCCPIE ??= "" | 56 | GCCPIE ??= "" |
