| /* mb.S: Out of line memory barriers. |
| * |
| * Copyright (C) 2005 David S. Miller (davem@davemloft.net) |
| */ |
| |
| /* These are here in an effort to more fully work around |
| * Spitfire Errata #51. Essentially, if a memory barrier |
| * occurs soon after a mispredicted branch, the chip can stop |
| * executing instructions until a trap occurs. Therefore, if |
| * interrupts are disabled, the chip can hang forever. |
| * |
| * It used to be believed that the memory barrier had to be |
| * right in the delay slot, but a case has been traced |
| * recently wherein the memory barrier was one instruction |
| * after the branch delay slot and the chip still hung. The |
| * offending sequence was the following in sym_wakeup_done() |
| * of the sym53c8xx_2 driver: |
| * |
| * call sym_ccb_from_dsa, 0 |
| * movge %icc, 0, %l0 |
| * brz,pn %o0, .LL1303 |
| * mov %o0, %l2 |
| * membar #LoadLoad |
| * |
| * The branch has to be mispredicted for the bug to occur. |
| * Therefore, we put the memory barrier explicitly into a |
| * "branch always, predicted taken" delay slot to avoid the |
| * problem case. |
| */ |
| |
| .text |
| |
| 99: retl |
| nop |
| |
| .globl mb |
| mb: ba,pt %xcc, 99b |
| membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad |
| .size mb, .-mb |
| |
| .globl rmb |
| rmb: ba,pt %xcc, 99b |
| membar #LoadLoad |
| .size rmb, .-rmb |
| |
| .globl wmb |
| wmb: ba,pt %xcc, 99b |
| membar #StoreStore |
| .size wmb, .-wmb |
| |
| .globl membar_storeload |
| membar_storeload: |
| ba,pt %xcc, 99b |
| membar #StoreLoad |
| .size membar_storeload, .-membar_storeload |
| |
| .globl membar_storeload_storestore |
| membar_storeload_storestore: |
| ba,pt %xcc, 99b |
| membar #StoreLoad | #StoreStore |
| .size membar_storeload_storestore, .-membar_storeload_storestore |
| |
| .globl membar_storeload_loadload |
| membar_storeload_loadload: |
| ba,pt %xcc, 99b |
| membar #StoreLoad | #LoadLoad |
| .size membar_storeload_loadload, .-membar_storeload_loadload |
| |
| .globl membar_storestore_loadstore |
| membar_storestore_loadstore: |
| ba,pt %xcc, 99b |
| membar #StoreStore | #LoadStore |
| .size membar_storestore_loadstore, .-membar_storestore_loadstore |