1/* 2 * Copyright (c) 2019-2023, Arm Limited. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7#include <arch.h> 8#include <asm_macros.S> 9#include <common/bl_common.h> 10#include <neoverse_v1.h> 11#include <cpu_macros.S> 12#include <plat_macros.S> 13#include "wa_cve_2022_23960_bhb_vector.S" 14 15/* Hardware handled coherency */ 16#if HW_ASSISTED_COHERENCY == 0 17#error "Neoverse V1 must be compiled with HW_ASSISTED_COHERENCY enabled" 18#endif 19 20/* 64-bit only core */ 21#if CTX_INCLUDE_AARCH32_REGS == 1 22#error "Neoverse-V1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" 23#endif 24 25#if WORKAROUND_CVE_2022_23960 26 wa_cve_2022_23960_bhb_vector_table NEOVERSE_V1_BHB_LOOP_COUNT, neoverse_v1 27#endif /* WORKAROUND_CVE_2022_23960 */ 28 29 /* -------------------------------------------------- 30 * Errata Workaround for Neoverse V1 Errata #1618635. 31 * This applies to revision r0p0 and is fixed in 32 * r1p0. 33 * x0: variant[4:7] and revision[0:3] of current cpu. 34 * Shall clobber: x0, x17 35 * -------------------------------------------------- 36 */ 37func errata_neoverse_v1_1618635_wa 38 /* Check workaround compatibility. */ 39 mov x17, x30 40 bl check_errata_1618635 41 cbz x0, 1f 42 43 /* Inserts a DMB SY before and after MRS PAR_EL1 */ 44 ldr x0, =0x0 45 msr NEOVERSE_V1_CPUPSELR_EL3, x0 46 ldr x0, = 0xEE070F14 47 msr NEOVERSE_V1_CPUPOR_EL3, x0 48 ldr x0, = 0xFFFF0FFF 49 msr NEOVERSE_V1_CPUPMR_EL3, x0 50 ldr x0, =0x4005027FF 51 msr NEOVERSE_V1_CPUPCR_EL3, x0 52 53 /* Inserts a DMB SY before STREX imm offset */ 54 ldr x0, =0x1 55 msr NEOVERSE_V1_CPUPSELR_EL3, x0 56 ldr x0, =0x00e8400000 57 msr NEOVERSE_V1_CPUPOR_EL3, x0 58 ldr x0, =0x00fff00000 59 msr NEOVERSE_V1_CPUPMR_EL3, x0 60 ldr x0, = 0x4001027FF 61 msr NEOVERSE_V1_CPUPCR_EL3, x0 62 63 /* Inserts a DMB SY before STREX[BHD}/STLEX* */ 64 ldr x0, =0x2 65 msr NEOVERSE_V1_CPUPSELR_EL3, x0 66 ldr x0, =0x00e8c00040 67 msr NEOVERSE_V1_CPUPOR_EL3, x0 68 ldr x0, =0x00fff00040 69 msr NEOVERSE_V1_CPUPMR_EL3, x0 70 ldr x0, = 0x4001027FF 71 msr NEOVERSE_V1_CPUPCR_EL3, x0 72 73 /* Inserts a DMB SY after STREX imm offset */ 74 ldr x0, =0x3 75 msr NEOVERSE_V1_CPUPSELR_EL3, x0 76 ldr x0, =0x00e8400000 77 msr NEOVERSE_V1_CPUPOR_EL3, x0 78 ldr x0, =0x00fff00000 79 msr NEOVERSE_V1_CPUPMR_EL3, x0 80 ldr x0, = 0x4004027FF 81 msr NEOVERSE_V1_CPUPCR_EL3, x0 82 83 /* Inserts a DMB SY after STREX[BHD}/STLEX* */ 84 ldr x0, =0x4 85 msr NEOVERSE_V1_CPUPSELR_EL3, x0 86 ldr x0, =0x00e8c00040 87 msr NEOVERSE_V1_CPUPOR_EL3, x0 88 ldr x0, =0x00fff00040 89 msr NEOVERSE_V1_CPUPMR_EL3, x0 90 ldr x0, = 0x4004027FF 91 msr NEOVERSE_V1_CPUPCR_EL3, x0 92 93 /* Synchronize to enable patches */ 94 isb 951: 96 ret x17 97endfunc errata_neoverse_v1_1618635_wa 98 99func check_errata_1618635 100 /* Applies to revision r0p0. */ 101 mov x1, #0x00 102 b cpu_rev_var_ls 103endfunc check_errata_1618635 104 105 /* -------------------------------------------------- 106 * Errata Workaround for Neoverse V1 Errata #1774420. 107 * This applies to revisions r0p0 and r1p0, fixed in r1p1. 108 * x0: variant[4:7] and revision[0:3] of current cpu. 109 * Shall clobber: x0-x17 110 * -------------------------------------------------- 111 */ 112func errata_neoverse_v1_1774420_wa 113 /* Check workaround compatibility. */ 114 mov x17, x30 115 bl check_errata_1774420 116 cbz x0, 1f 117 118 /* Set bit 53 in CPUECTLR_EL1 */ 119 mrs x1, NEOVERSE_V1_CPUECTLR_EL1 120 orr x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_53 121 msr NEOVERSE_V1_CPUECTLR_EL1, x1 122 isb 1231: 124 ret x17 125endfunc errata_neoverse_v1_1774420_wa 126 127func check_errata_1774420 128 /* Applies to r0p0 and r1p0. */ 129 mov x1, #0x10 130 b cpu_rev_var_ls 131endfunc check_errata_1774420 132 133 /* -------------------------------------------------- 134 * Errata Workaround for Neoverse V1 Errata #1791573. 135 * This applies to revisions r0p0 and r1p0, fixed in r1p1. 136 * x0: variant[4:7] and revision[0:3] of current cpu. 137 * Shall clobber: x0-x17 138 * -------------------------------------------------- 139 */ 140func errata_neoverse_v1_1791573_wa 141 /* Check workaround compatibility. */ 142 mov x17, x30 143 bl check_errata_1791573 144 cbz x0, 1f 145 146 /* Set bit 2 in ACTLR2_EL1 */ 147 mrs x1, NEOVERSE_V1_ACTLR2_EL1 148 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_2 149 msr NEOVERSE_V1_ACTLR2_EL1, x1 150 isb 1511: 152 ret x17 153endfunc errata_neoverse_v1_1791573_wa 154 155func check_errata_1791573 156 /* Applies to r0p0 and r1p0. */ 157 mov x1, #0x10 158 b cpu_rev_var_ls 159endfunc check_errata_1791573 160 161 /* -------------------------------------------------- 162 * Errata Workaround for Neoverse V1 Errata #1852267. 163 * This applies to revisions r0p0 and r1p0, fixed in r1p1. 164 * x0: variant[4:7] and revision[0:3] of current cpu. 165 * Shall clobber: x0-x17 166 * -------------------------------------------------- 167 */ 168func errata_neoverse_v1_1852267_wa 169 /* Check workaround compatibility. */ 170 mov x17, x30 171 bl check_errata_1852267 172 cbz x0, 1f 173 174 /* Set bit 28 in ACTLR2_EL1 */ 175 mrs x1, NEOVERSE_V1_ACTLR2_EL1 176 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_28 177 msr NEOVERSE_V1_ACTLR2_EL1, x1 178 isb 1791: 180 ret x17 181endfunc errata_neoverse_v1_1852267_wa 182 183func check_errata_1852267 184 /* Applies to r0p0 and r1p0. */ 185 mov x1, #0x10 186 b cpu_rev_var_ls 187endfunc check_errata_1852267 188 189 /* -------------------------------------------------- 190 * Errata Workaround for Neoverse V1 Errata #1925756. 191 * This applies to revisions <= r1p1. 192 * x0: variant[4:7] and revision[0:3] of current cpu. 193 * Shall clobber: x0-x17 194 * -------------------------------------------------- 195 */ 196func errata_neoverse_v1_1925756_wa 197 /* Check workaround compatibility. */ 198 mov x17, x30 199 bl check_errata_1925756 200 cbz x0, 1f 201 202 /* Set bit 8 in CPUECTLR_EL1 */ 203 mrs x1, NEOVERSE_V1_CPUECTLR_EL1 204 orr x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_8 205 msr NEOVERSE_V1_CPUECTLR_EL1, x1 206 isb 2071: 208 ret x17 209endfunc errata_neoverse_v1_1925756_wa 210 211func check_errata_1925756 212 /* Applies to <= r1p1. */ 213 mov x1, #0x11 214 b cpu_rev_var_ls 215endfunc check_errata_1925756 216 217 /* -------------------------------------------------- 218 * Errata Workaround for Neoverse V1 Erratum #1940577 219 * This applies to revisions r1p0 - r1p1 and is open. 220 * It also exists in r0p0 but there is no fix in that 221 * revision. 222 * Inputs: 223 * x0: variant[4:7] and revision[0:3] of current cpu. 224 * Shall clobber: x0-x17 225 * -------------------------------------------------- 226 */ 227func errata_neoverse_v1_1940577_wa 228 /* Compare x0 against revisions r1p0 - r1p1 */ 229 mov x17, x30 230 bl check_errata_1940577 231 cbz x0, 1f 232 233 mov x0, #0 234 msr S3_6_C15_C8_0, x0 235 ldr x0, =0x10E3900002 236 msr S3_6_C15_C8_2, x0 237 ldr x0, =0x10FFF00083 238 msr S3_6_C15_C8_3, x0 239 ldr x0, =0x2001003FF 240 msr S3_6_C15_C8_1, x0 241 242 mov x0, #1 243 msr S3_6_C15_C8_0, x0 244 ldr x0, =0x10E3800082 245 msr S3_6_C15_C8_2, x0 246 ldr x0, =0x10FFF00083 247 msr S3_6_C15_C8_3, x0 248 ldr x0, =0x2001003FF 249 msr S3_6_C15_C8_1, x0 250 251 mov x0, #2 252 msr S3_6_C15_C8_0, x0 253 ldr x0, =0x10E3800200 254 msr S3_6_C15_C8_2, x0 255 ldr x0, =0x10FFF003E0 256 msr S3_6_C15_C8_3, x0 257 ldr x0, =0x2001003FF 258 msr S3_6_C15_C8_1, x0 259 260 isb 2611: 262 ret x17 263endfunc errata_neoverse_v1_1940577_wa 264 265func check_errata_1940577 266 /* Applies to revisions r1p0 - r1p1. */ 267 mov x1, #0x10 268 mov x2, #0x11 269 b cpu_rev_var_range 270endfunc check_errata_1940577 271 272 /* -------------------------------------------------- 273 * Errata Workaround for Neoverse V1 Errata #1966096 274 * This applies to revisions r1p0 - r1p1 and is open. 275 * It also exists in r0p0 but there is no workaround 276 * for that revision. 277 * x0: variant[4:7] and revision[0:3] of current cpu. 278 * Shall clobber: x0-x17 279 * -------------------------------------------------- 280 */ 281func errata_neoverse_v1_1966096_wa 282 /* Check workaround compatibility. */ 283 mov x17, x30 284 bl check_errata_1966096 285 cbz x0, 1f 286 287 /* Apply the workaround. */ 288 mov x0, #0x3 289 msr S3_6_C15_C8_0, x0 290 ldr x0, =0xEE010F12 291 msr S3_6_C15_C8_2, x0 292 ldr x0, =0xFFFF0FFF 293 msr S3_6_C15_C8_3, x0 294 ldr x0, =0x80000000003FF 295 msr S3_6_C15_C8_1, x0 296 isb 297 2981: 299 ret x17 300endfunc errata_neoverse_v1_1966096_wa 301 302func check_errata_1966096 303 mov x1, #0x10 304 mov x2, #0x11 305 b cpu_rev_var_range 306endfunc check_errata_1966096 307 308 /* -------------------------------------------------- 309 * Errata Workaround for Neoverse V1 Errata #2139242. 310 * This applies to revisions r0p0, r1p0, and r1p1, it 311 * is still open. 312 * x0: variant[4:7] and revision[0:3] of current cpu. 313 * Shall clobber: x0-x17 314 * -------------------------------------------------- 315 */ 316func errata_neoverse_v1_2139242_wa 317 /* Check workaround compatibility. */ 318 mov x17, x30 319 bl check_errata_2139242 320 cbz x0, 1f 321 322 /* Apply the workaround. */ 323 mov x0, #0x3 324 msr S3_6_C15_C8_0, x0 325 ldr x0, =0xEE720F14 326 msr S3_6_C15_C8_2, x0 327 ldr x0, =0xFFFF0FDF 328 msr S3_6_C15_C8_3, x0 329 ldr x0, =0x40000005003FF 330 msr S3_6_C15_C8_1, x0 331 isb 332 3331: 334 ret x17 335endfunc errata_neoverse_v1_2139242_wa 336 337func check_errata_2139242 338 /* Applies to r0p0, r1p0, r1p1 */ 339 mov x1, #0x11 340 b cpu_rev_var_ls 341endfunc check_errata_2139242 342 343 /* -------------------------------------------------- 344 * Errata Workaround for Neoverse V1 Errata #2108267. 345 * This applies to revisions r0p0, r1p0, and r1p1, it 346 * is still open. 347 * x0: variant[4:7] and revision[0:3] of current cpu. 348 * Shall clobber: x0-x1, x17 349 * -------------------------------------------------- 350 */ 351func errata_neoverse_v1_2108267_wa 352 /* Check workaround compatibility. */ 353 mov x17, x30 354 bl check_errata_2108267 355 cbz x0, 1f 356 357 /* Apply the workaround. */ 358 mrs x1, NEOVERSE_V1_CPUECTLR_EL1 359 mov x0, #NEOVERSE_V1_CPUECTLR_EL1_PF_MODE_CNSRV 360 bfi x1, x0, #CPUECTLR_EL1_PF_MODE_LSB, #CPUECTLR_EL1_PF_MODE_WIDTH 361 msr NEOVERSE_V1_CPUECTLR_EL1, x1 3621: 363 ret x17 364endfunc errata_neoverse_v1_2108267_wa 365 366func check_errata_2108267 367 /* Applies to r0p0, r1p0, r1p1 */ 368 mov x1, #0x11 369 b cpu_rev_var_ls 370endfunc check_errata_2108267 371 372 /* -------------------------------------------------- 373 * Errata Workaround for Neoverse V1 Errata #2216392. 374 * This applies to revisions r1p0 and r1p1 and is 375 * still open. 376 * This issue is also present in r0p0 but there is no 377 * workaround in that revision. 378 * x0: variant[4:7] and revision[0:3] of current cpu. 379 * Shall clobber: x0-x17 380 * -------------------------------------------------- 381 */ 382func errata_neoverse_v1_2216392_wa 383 /* Check workaround compatibility. */ 384 mov x17, x30 385 bl check_errata_2216392 386 cbz x0, 1f 387 388 ldr x0, =0x5 389 msr S3_6_c15_c8_0, x0 /* CPUPSELR_EL3 */ 390 ldr x0, =0x10F600E000 391 msr S3_6_c15_c8_2, x0 /* CPUPOR_EL3 */ 392 ldr x0, =0x10FF80E000 393 msr S3_6_c15_c8_3, x0 /* CPUPMR_EL3 */ 394 ldr x0, =0x80000000003FF 395 msr S3_6_c15_c8_1, x0 /* CPUPCR_EL3 */ 396 397 isb 3981: 399 ret x17 400endfunc errata_neoverse_v1_2216392_wa 401 402func check_errata_2216392 403 /* Applies to revisions r1p0 and r1p1. */ 404 mov x1, #CPU_REV(1, 0) 405 mov x2, #CPU_REV(1, 1) 406 b cpu_rev_var_range 407endfunc check_errata_2216392 408 409 /* ----------------------------------------------------------------- 410 * Errata Workaround for Neoverse V1 Errata #2294912. 411 * This applies to revisions r0p0, r1p0, and r1p1 and is still open. 412 * x0: variant[4:7] and revision[0:3] of current cpu. 413 * Shall clobber: x0-x17 414 * ----------------------------------------------------------------- 415 */ 416func errata_neoverse_v1_2294912_wa 417 /* Check workaround compatibility. */ 418 mov x17, x30 419 bl check_errata_2294912 420 cbz x0, 1f 421 422 /* Set bit 0 in ACTLR2_EL1 */ 423 mrs x1, NEOVERSE_V1_ACTLR2_EL1 424 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_0 425 msr NEOVERSE_V1_ACTLR2_EL1, x1 426 isb 4271: 428 ret x17 429endfunc errata_neoverse_v1_2294912_wa 430 431func check_errata_2294912 432 /* Applies to r0p0, r1p0, and r1p1 right now */ 433 mov x1, #0x11 434 b cpu_rev_var_ls 435endfunc check_errata_2294912 436 437 /* --------------------------------------------------- 438 * Errata Workaround for Neoverse V1 Errata #2372203. 439 * This applies to revisions <= r1p1 and is still open. 440 * x0: variant[4:7] and revision[0:3] of current cpu. 441 * Shall clobber: x0-x17 442 * ---------------------------------------------------- 443 */ 444func errata_neoverse_v1_2372203_wa 445 /* Check workaround compatibility. */ 446 mov x17, x30 447 bl check_errata_2372203 448 cbz x0, 1f 449 450 /* Set bit 40 in ACTLR2_EL1 */ 451 mrs x1, NEOVERSE_V1_ACTLR2_EL1 452 orr x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_40 453 msr NEOVERSE_V1_ACTLR2_EL1, x1 454 isb 4551: 456 ret x17 457endfunc errata_neoverse_v1_2372203_wa 458 459func check_errata_2372203 460 /* Applies to <= r1p1. */ 461 mov x1, #0x11 462 b cpu_rev_var_ls 463endfunc check_errata_2372203 464 465 /* ---------------------------------------------------- 466 * Errata Workaround for Neoverse V1 Errata #2743093. 467 * This applies to revisions <= r1p2 and is still open. 468 * x0: variant[4:7] and revision[0:3] of current cpu. 469 * Shall clobber: x0-x17 470 * ---------------------------------------------------- 471 */ 472func errata_neoverse_v1_2743093_wa 473 mov x17, x30 474 bl check_errata_2743093 475 cbz x0, 1f 476 477 /* dsb before isb of power down sequence */ 478 dsb sy 4791: 480 ret x17 481endfunc errata_neoverse_v1_2743093_wa 482 483func check_errata_2743093 484 /* Applies to all revisions <= r1p2 */ 485 mov x1, #0x12 486 b cpu_rev_var_ls 487endfunc check_errata_2743093 488 489 /* ---------------------------------------------------- 490 * Errata Workaround for Neoverse V1 Errata #2779461. 491 * This applies to revisions r0p0, r1p0, r1p1, and r1p2. 492 * It is still open. 493 * x0: variant[4:7] and revision[0:3] of current cpu. 494 * Shall clobber: x0-x1, x17 495 * ---------------------------------------------------- 496 */ 497func errata_neoverse_v1_2779461_wa 498 /* Check revision. */ 499 mov x17, x30 500 bl check_errata_2779461 501 cbz x0, 1f 502 503 /* Apply the workaround */ 504 mrs x1, NEOVERSE_V1_ACTLR3_EL1 505 orr x1, x1, #BIT(47) 506 msr NEOVERSE_V1_ACTLR3_EL1, x1 507 5081: 509 ret x17 510endfunc errata_neoverse_v1_2779461_wa 511 512func check_errata_2779461 513 /* Applies to r0p0, r1p0, r1p1, r1p2 */ 514 mov x1, #CPU_REV(1, 2) 515 b cpu_rev_var_ls 516endfunc check_errata_2779461 517 518func check_errata_cve_2022_23960 519#if WORKAROUND_CVE_2022_23960 520 mov x0, #ERRATA_APPLIES 521#else 522 mov x0, #ERRATA_MISSING 523#endif 524 ret 525endfunc check_errata_cve_2022_23960 526 527 /* --------------------------------------------- 528 * HW will do the cache maintenance while powering down 529 * --------------------------------------------- 530 */ 531func neoverse_v1_core_pwr_dwn 532 /* --------------------------------------------- 533 * Enable CPU power down bit in power control register 534 * --------------------------------------------- 535 */ 536 mrs x0, NEOVERSE_V1_CPUPWRCTLR_EL1 537 orr x0, x0, #NEOVERSE_V1_CPUPWRCTLR_EL1_CORE_PWRDN_BIT 538 msr NEOVERSE_V1_CPUPWRCTLR_EL1, x0 539#if ERRATA_V1_2743093 540 mov x15, x30 541 bl cpu_get_rev_var 542 bl errata_neoverse_v1_2743093_wa 543 mov x30, x15 544#endif /* ERRATA_V1_2743093 */ 545 isb 546 ret 547endfunc neoverse_v1_core_pwr_dwn 548 549 /* 550 * Errata printing function for Neoverse V1. Must follow AAPCS. 551 */ 552#if REPORT_ERRATA 553func neoverse_v1_errata_report 554 stp x8, x30, [sp, #-16]! 555 556 bl cpu_get_rev_var 557 mov x8, x0 558 559 /* 560 * Report all errata. The revision-variant information is passed to 561 * checking functions of each errata. 562 */ 563 report_errata ERRATA_V1_1618635, neoverse_v1, 1618635 564 report_errata ERRATA_V1_1774420, neoverse_v1, 1774420 565 report_errata ERRATA_V1_1791573, neoverse_v1, 1791573 566 report_errata ERRATA_V1_1852267, neoverse_v1, 1852267 567 report_errata ERRATA_V1_1925756, neoverse_v1, 1925756 568 report_errata ERRATA_V1_1940577, neoverse_v1, 1940577 569 report_errata ERRATA_V1_1966096, neoverse_v1, 1966096 570 report_errata ERRATA_V1_2108267, neoverse_v1, 2108267 571 report_errata ERRATA_V1_2139242, neoverse_v1, 2139242 572 report_errata ERRATA_V1_2216392, neoverse_v1, 2216392 573 report_errata ERRATA_V1_2294912, neoverse_v1, 2294912 574 report_errata ERRATA_V1_2372203, neoverse_v1, 2372203 575 report_errata ERRATA_V1_2743093, neoverse_v1, 2743093 576 report_errata ERRATA_V1_2779461, neoverse_v1, 2779461 577 report_errata WORKAROUND_CVE_2022_23960, neoverse_v1, cve_2022_23960 578 579 ldp x8, x30, [sp], #16 580 ret 581endfunc neoverse_v1_errata_report 582#endif 583 584func neoverse_v1_reset_func 585 mov x19, x30 586 587 /* Disable speculative loads */ 588 msr SSBS, xzr 589 isb 590 591 /* Get the CPU revision and stash it in x18. */ 592 bl cpu_get_rev_var 593 mov x18, x0 594 595#if ERRATA_V1_1618635 596 mov x0, x18 597 bl errata_neoverse_v1_1618635_wa 598#endif 599 600#if ERRATA_V1_1774420 601 mov x0, x18 602 bl errata_neoverse_v1_1774420_wa 603#endif 604 605#if ERRATA_V1_1791573 606 mov x0, x18 607 bl errata_neoverse_v1_1791573_wa 608#endif 609 610#if ERRATA_V1_1852267 611 mov x0, x18 612 bl errata_neoverse_v1_1852267_wa 613#endif 614 615#if ERRATA_V1_1925756 616 mov x0, x18 617 bl errata_neoverse_v1_1925756_wa 618#endif 619 620#if ERRATA_V1_1940577 621 mov x0, x18 622 bl errata_neoverse_v1_1940577_wa 623#endif 624 625#if ERRATA_V1_1966096 626 mov x0, x18 627 bl errata_neoverse_v1_1966096_wa 628#endif 629 630#if ERRATA_V1_2139242 631 mov x0, x18 632 bl errata_neoverse_v1_2139242_wa 633#endif 634 635#if ERRATA_V1_2108267 636 mov x0, x18 637 bl errata_neoverse_v1_2108267_wa 638#endif 639 640#if ERRATA_V1_2216392 641 mov x0, x18 642 bl errata_neoverse_v1_2216392_wa 643#endif 644 645#if ERRATA_V1_2294912 646 mov x0, x18 647 bl errata_neoverse_v1_2294912_wa 648#endif 649 650#if ERRATA_V1_2372203 651 mov x0, x18 652 bl errata_neoverse_v1_2372203_wa 653#endif 654 655#if ERRATA_V1_2779461 656 mov x0, x18 657 bl errata_neoverse_v1_2779461_wa 658#endif 659 660#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960 661 /* 662 * The Neoverse-V1 generic vectors are overridden to apply errata 663 * mitigation on exception entry from lower ELs. 664 */ 665 adr x0, wa_cve_vbar_neoverse_v1 666 msr vbar_el3, x0 667#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */ 668 669 isb 670 ret x19 671endfunc neoverse_v1_reset_func 672 673 /* --------------------------------------------- 674 * This function provides Neoverse-V1 specific 675 * register information for crash reporting. 676 * It needs to return with x6 pointing to 677 * a list of register names in ascii and 678 * x8 - x15 having values of registers to be 679 * reported. 680 * --------------------------------------------- 681 */ 682.section .rodata.neoverse_v1_regs, "aS" 683neoverse_v1_regs: /* The ascii list of register names to be reported */ 684 .asciz "cpuectlr_el1", "" 685 686func neoverse_v1_cpu_reg_dump 687 adr x6, neoverse_v1_regs 688 mrs x8, NEOVERSE_V1_CPUECTLR_EL1 689 ret 690endfunc neoverse_v1_cpu_reg_dump 691 692declare_cpu_ops neoverse_v1, NEOVERSE_V1_MIDR, \ 693 neoverse_v1_reset_func, \ 694 neoverse_v1_core_pwr_dwn 695