162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 362306a36Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 462306a36Sopenharmony_ci * for more details. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2003, 04, 07 Ralf Baechle <ralf@linux-mips.org> 762306a36Sopenharmony_ci * Copyright (C) MIPS Technologies, Inc. 862306a36Sopenharmony_ci * written by Ralf Baechle <ralf@linux-mips.org> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci#ifndef _ASM_HAZARDS_H 1162306a36Sopenharmony_ci#define _ASM_HAZARDS_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/stringify.h> 1462306a36Sopenharmony_ci#include <asm/compiler.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define ___ssnop \ 1762306a36Sopenharmony_ci sll $0, $0, 1 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define ___ehb \ 2062306a36Sopenharmony_ci sll $0, $0, 3 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* 2362306a36Sopenharmony_ci * TLB hazards 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_ci#if (defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR5) || \ 2662306a36Sopenharmony_ci defined(CONFIG_CPU_MIPSR6)) && \ 2762306a36Sopenharmony_ci !defined(CONFIG_CPU_CAVIUM_OCTEON) && !defined(CONFIG_CPU_LOONGSON64) 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* 3062306a36Sopenharmony_ci * MIPSR2 defines ehb for hazard avoidance 3162306a36Sopenharmony_ci */ 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define __mtc0_tlbw_hazard \ 3462306a36Sopenharmony_ci ___ehb 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define __mtc0_tlbr_hazard \ 3762306a36Sopenharmony_ci ___ehb 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#define __tlbw_use_hazard \ 4062306a36Sopenharmony_ci ___ehb 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define __tlb_read_hazard \ 4362306a36Sopenharmony_ci ___ehb 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define __tlb_probe_hazard \ 4662306a36Sopenharmony_ci ___ehb 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define __irq_enable_hazard \ 4962306a36Sopenharmony_ci ___ehb 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define __irq_disable_hazard \ 5262306a36Sopenharmony_ci ___ehb 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#define __back_to_back_c0_hazard \ 5562306a36Sopenharmony_ci ___ehb 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* 5862306a36Sopenharmony_ci * gcc has a tradition of misscompiling the previous construct using the 5962306a36Sopenharmony_ci * address of a label as argument to inline assembler. Gas otoh has the 6062306a36Sopenharmony_ci * annoying difference between la and dla which are only usable for 32-bit 6162306a36Sopenharmony_ci * rsp. 64-bit code, so can't be used without conditional compilation. 6262306a36Sopenharmony_ci * The alternative is switching the assembler to 64-bit code which happens 6362306a36Sopenharmony_ci * to work right even for 32-bit code... 6462306a36Sopenharmony_ci */ 6562306a36Sopenharmony_ci#define instruction_hazard() \ 6662306a36Sopenharmony_cido { \ 6762306a36Sopenharmony_ci unsigned long tmp; \ 6862306a36Sopenharmony_ci \ 6962306a36Sopenharmony_ci __asm__ __volatile__( \ 7062306a36Sopenharmony_ci " .set push \n" \ 7162306a36Sopenharmony_ci " .set "MIPS_ISA_LEVEL" \n" \ 7262306a36Sopenharmony_ci " dla %0, 1f \n" \ 7362306a36Sopenharmony_ci " jr.hb %0 \n" \ 7462306a36Sopenharmony_ci " .set pop \n" \ 7562306a36Sopenharmony_ci "1: \n" \ 7662306a36Sopenharmony_ci : "=r" (tmp)); \ 7762306a36Sopenharmony_ci} while (0) 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#elif (defined(CONFIG_CPU_MIPSR1) && !defined(CONFIG_MIPS_ALCHEMY)) || \ 8062306a36Sopenharmony_ci defined(CONFIG_CPU_BMIPS) 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/* 8362306a36Sopenharmony_ci * These are slightly complicated by the fact that we guarantee R1 kernels to 8462306a36Sopenharmony_ci * run fine on R2 processors. 8562306a36Sopenharmony_ci */ 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#define __mtc0_tlbw_hazard \ 8862306a36Sopenharmony_ci ___ssnop; \ 8962306a36Sopenharmony_ci ___ssnop; \ 9062306a36Sopenharmony_ci ___ehb 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define __mtc0_tlbr_hazard \ 9362306a36Sopenharmony_ci ___ssnop; \ 9462306a36Sopenharmony_ci ___ssnop; \ 9562306a36Sopenharmony_ci ___ehb 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci#define __tlbw_use_hazard \ 9862306a36Sopenharmony_ci ___ssnop; \ 9962306a36Sopenharmony_ci ___ssnop; \ 10062306a36Sopenharmony_ci ___ssnop; \ 10162306a36Sopenharmony_ci ___ehb 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#define __tlb_read_hazard \ 10462306a36Sopenharmony_ci ___ssnop; \ 10562306a36Sopenharmony_ci ___ssnop; \ 10662306a36Sopenharmony_ci ___ssnop; \ 10762306a36Sopenharmony_ci ___ehb 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#define __tlb_probe_hazard \ 11062306a36Sopenharmony_ci ___ssnop; \ 11162306a36Sopenharmony_ci ___ssnop; \ 11262306a36Sopenharmony_ci ___ssnop; \ 11362306a36Sopenharmony_ci ___ehb 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci#define __irq_enable_hazard \ 11662306a36Sopenharmony_ci ___ssnop; \ 11762306a36Sopenharmony_ci ___ssnop; \ 11862306a36Sopenharmony_ci ___ssnop; \ 11962306a36Sopenharmony_ci ___ehb 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci#define __irq_disable_hazard \ 12262306a36Sopenharmony_ci ___ssnop; \ 12362306a36Sopenharmony_ci ___ssnop; \ 12462306a36Sopenharmony_ci ___ssnop; \ 12562306a36Sopenharmony_ci ___ehb 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci#define __back_to_back_c0_hazard \ 12862306a36Sopenharmony_ci ___ssnop; \ 12962306a36Sopenharmony_ci ___ssnop; \ 13062306a36Sopenharmony_ci ___ssnop; \ 13162306a36Sopenharmony_ci ___ehb 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci/* 13462306a36Sopenharmony_ci * gcc has a tradition of misscompiling the previous construct using the 13562306a36Sopenharmony_ci * address of a label as argument to inline assembler. Gas otoh has the 13662306a36Sopenharmony_ci * annoying difference between la and dla which are only usable for 32-bit 13762306a36Sopenharmony_ci * rsp. 64-bit code, so can't be used without conditional compilation. 13862306a36Sopenharmony_ci * The alternative is switching the assembler to 64-bit code which happens 13962306a36Sopenharmony_ci * to work right even for 32-bit code... 14062306a36Sopenharmony_ci */ 14162306a36Sopenharmony_ci#define __instruction_hazard() \ 14262306a36Sopenharmony_cido { \ 14362306a36Sopenharmony_ci unsigned long tmp; \ 14462306a36Sopenharmony_ci \ 14562306a36Sopenharmony_ci __asm__ __volatile__( \ 14662306a36Sopenharmony_ci " .set push \n" \ 14762306a36Sopenharmony_ci " .set mips64r2 \n" \ 14862306a36Sopenharmony_ci " dla %0, 1f \n" \ 14962306a36Sopenharmony_ci " jr.hb %0 \n" \ 15062306a36Sopenharmony_ci " .set pop \n" \ 15162306a36Sopenharmony_ci "1: \n" \ 15262306a36Sopenharmony_ci : "=r" (tmp)); \ 15362306a36Sopenharmony_ci} while (0) 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci#define instruction_hazard() \ 15662306a36Sopenharmony_cido { \ 15762306a36Sopenharmony_ci if (cpu_has_mips_r2_r6) \ 15862306a36Sopenharmony_ci __instruction_hazard(); \ 15962306a36Sopenharmony_ci} while (0) 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci#elif defined(CONFIG_MIPS_ALCHEMY) || defined(CONFIG_CPU_CAVIUM_OCTEON) || \ 16262306a36Sopenharmony_ci defined(CONFIG_CPU_LOONGSON2EF) || defined(CONFIG_CPU_LOONGSON64) || \ 16362306a36Sopenharmony_ci defined(CONFIG_CPU_R10000) || defined(CONFIG_CPU_R5500) 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci/* 16662306a36Sopenharmony_ci * R10000 rocks - all hazards handled in hardware, so this becomes a nobrainer. 16762306a36Sopenharmony_ci */ 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci#define __mtc0_tlbw_hazard 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci#define __mtc0_tlbr_hazard 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci#define __tlbw_use_hazard 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci#define __tlb_read_hazard 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci#define __tlb_probe_hazard 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci#define __irq_enable_hazard 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci#define __irq_disable_hazard 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci#define __back_to_back_c0_hazard 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci#define instruction_hazard() do { } while (0) 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci#elif defined(CONFIG_CPU_SB1) 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci/* 19062306a36Sopenharmony_ci * Mostly like R4000 for historic reasons 19162306a36Sopenharmony_ci */ 19262306a36Sopenharmony_ci#define __mtc0_tlbw_hazard 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci#define __mtc0_tlbr_hazard 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci#define __tlbw_use_hazard 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci#define __tlb_read_hazard 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci#define __tlb_probe_hazard 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci#define __irq_enable_hazard 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci#define __irq_disable_hazard \ 20562306a36Sopenharmony_ci ___ssnop; \ 20662306a36Sopenharmony_ci ___ssnop; \ 20762306a36Sopenharmony_ci ___ssnop 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci#define __back_to_back_c0_hazard 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci#define instruction_hazard() do { } while (0) 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci#else 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci/* 21662306a36Sopenharmony_ci * Finally the catchall case for all other processors including R4000, R4400, 21762306a36Sopenharmony_ci * R4600, R4700, R5000, RM7000, NEC VR41xx etc. 21862306a36Sopenharmony_ci * 21962306a36Sopenharmony_ci * The taken branch will result in a two cycle penalty for the two killed 22062306a36Sopenharmony_ci * instructions on R4000 / R4400. Other processors only have a single cycle 22162306a36Sopenharmony_ci * hazard so this is nice trick to have an optimal code for a range of 22262306a36Sopenharmony_ci * processors. 22362306a36Sopenharmony_ci */ 22462306a36Sopenharmony_ci#define __mtc0_tlbw_hazard \ 22562306a36Sopenharmony_ci nop; \ 22662306a36Sopenharmony_ci nop 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci#define __mtc0_tlbr_hazard \ 22962306a36Sopenharmony_ci nop; \ 23062306a36Sopenharmony_ci nop 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci#define __tlbw_use_hazard \ 23362306a36Sopenharmony_ci nop; \ 23462306a36Sopenharmony_ci nop; \ 23562306a36Sopenharmony_ci nop 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci#define __tlb_read_hazard \ 23862306a36Sopenharmony_ci nop; \ 23962306a36Sopenharmony_ci nop; \ 24062306a36Sopenharmony_ci nop 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci#define __tlb_probe_hazard \ 24362306a36Sopenharmony_ci nop; \ 24462306a36Sopenharmony_ci nop; \ 24562306a36Sopenharmony_ci nop 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci#define __irq_enable_hazard \ 24862306a36Sopenharmony_ci ___ssnop; \ 24962306a36Sopenharmony_ci ___ssnop; \ 25062306a36Sopenharmony_ci ___ssnop 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci#define __irq_disable_hazard \ 25362306a36Sopenharmony_ci nop; \ 25462306a36Sopenharmony_ci nop; \ 25562306a36Sopenharmony_ci nop 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci#define __back_to_back_c0_hazard \ 25862306a36Sopenharmony_ci ___ssnop; \ 25962306a36Sopenharmony_ci ___ssnop; \ 26062306a36Sopenharmony_ci ___ssnop 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci#define instruction_hazard() do { } while (0) 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci#endif 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci/* FPU hazards */ 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci#if defined(CONFIG_CPU_SB1) 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci#define __enable_fpu_hazard \ 27262306a36Sopenharmony_ci .set push; \ 27362306a36Sopenharmony_ci .set mips64; \ 27462306a36Sopenharmony_ci .set noreorder; \ 27562306a36Sopenharmony_ci ___ssnop; \ 27662306a36Sopenharmony_ci bnezl $0, .+4; \ 27762306a36Sopenharmony_ci ___ssnop; \ 27862306a36Sopenharmony_ci .set pop 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci#define __disable_fpu_hazard 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci#elif defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR5) || \ 28362306a36Sopenharmony_ci defined(CONFIG_CPU_MIPSR6) 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci#define __enable_fpu_hazard \ 28662306a36Sopenharmony_ci ___ehb 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci#define __disable_fpu_hazard \ 28962306a36Sopenharmony_ci ___ehb 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci#else 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci#define __enable_fpu_hazard \ 29462306a36Sopenharmony_ci nop; \ 29562306a36Sopenharmony_ci nop; \ 29662306a36Sopenharmony_ci nop; \ 29762306a36Sopenharmony_ci nop 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci#define __disable_fpu_hazard \ 30062306a36Sopenharmony_ci ___ehb 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci#endif 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci#ifdef __ASSEMBLY__ 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci#define _ssnop ___ssnop 30762306a36Sopenharmony_ci#define _ehb ___ehb 30862306a36Sopenharmony_ci#define mtc0_tlbw_hazard __mtc0_tlbw_hazard 30962306a36Sopenharmony_ci#define mtc0_tlbr_hazard __mtc0_tlbr_hazard 31062306a36Sopenharmony_ci#define tlbw_use_hazard __tlbw_use_hazard 31162306a36Sopenharmony_ci#define tlb_read_hazard __tlb_read_hazard 31262306a36Sopenharmony_ci#define tlb_probe_hazard __tlb_probe_hazard 31362306a36Sopenharmony_ci#define irq_enable_hazard __irq_enable_hazard 31462306a36Sopenharmony_ci#define irq_disable_hazard __irq_disable_hazard 31562306a36Sopenharmony_ci#define back_to_back_c0_hazard __back_to_back_c0_hazard 31662306a36Sopenharmony_ci#define enable_fpu_hazard __enable_fpu_hazard 31762306a36Sopenharmony_ci#define disable_fpu_hazard __disable_fpu_hazard 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci#else 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci#define _ssnop() \ 32262306a36Sopenharmony_cido { \ 32362306a36Sopenharmony_ci __asm__ __volatile__( \ 32462306a36Sopenharmony_ci __stringify(___ssnop) \ 32562306a36Sopenharmony_ci ); \ 32662306a36Sopenharmony_ci} while (0) 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci#define _ehb() \ 32962306a36Sopenharmony_cido { \ 33062306a36Sopenharmony_ci __asm__ __volatile__( \ 33162306a36Sopenharmony_ci __stringify(___ehb) \ 33262306a36Sopenharmony_ci ); \ 33362306a36Sopenharmony_ci} while (0) 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci#define mtc0_tlbw_hazard() \ 33762306a36Sopenharmony_cido { \ 33862306a36Sopenharmony_ci __asm__ __volatile__( \ 33962306a36Sopenharmony_ci __stringify(__mtc0_tlbw_hazard) \ 34062306a36Sopenharmony_ci ); \ 34162306a36Sopenharmony_ci} while (0) 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci#define mtc0_tlbr_hazard() \ 34562306a36Sopenharmony_cido { \ 34662306a36Sopenharmony_ci __asm__ __volatile__( \ 34762306a36Sopenharmony_ci __stringify(__mtc0_tlbr_hazard) \ 34862306a36Sopenharmony_ci ); \ 34962306a36Sopenharmony_ci} while (0) 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci#define tlbw_use_hazard() \ 35362306a36Sopenharmony_cido { \ 35462306a36Sopenharmony_ci __asm__ __volatile__( \ 35562306a36Sopenharmony_ci __stringify(__tlbw_use_hazard) \ 35662306a36Sopenharmony_ci ); \ 35762306a36Sopenharmony_ci} while (0) 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci#define tlb_read_hazard() \ 36162306a36Sopenharmony_cido { \ 36262306a36Sopenharmony_ci __asm__ __volatile__( \ 36362306a36Sopenharmony_ci __stringify(__tlb_read_hazard) \ 36462306a36Sopenharmony_ci ); \ 36562306a36Sopenharmony_ci} while (0) 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci#define tlb_probe_hazard() \ 36962306a36Sopenharmony_cido { \ 37062306a36Sopenharmony_ci __asm__ __volatile__( \ 37162306a36Sopenharmony_ci __stringify(__tlb_probe_hazard) \ 37262306a36Sopenharmony_ci ); \ 37362306a36Sopenharmony_ci} while (0) 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci#define irq_enable_hazard() \ 37762306a36Sopenharmony_cido { \ 37862306a36Sopenharmony_ci __asm__ __volatile__( \ 37962306a36Sopenharmony_ci __stringify(__irq_enable_hazard) \ 38062306a36Sopenharmony_ci ); \ 38162306a36Sopenharmony_ci} while (0) 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci#define irq_disable_hazard() \ 38562306a36Sopenharmony_cido { \ 38662306a36Sopenharmony_ci __asm__ __volatile__( \ 38762306a36Sopenharmony_ci __stringify(__irq_disable_hazard) \ 38862306a36Sopenharmony_ci ); \ 38962306a36Sopenharmony_ci} while (0) 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci#define back_to_back_c0_hazard() \ 39362306a36Sopenharmony_cido { \ 39462306a36Sopenharmony_ci __asm__ __volatile__( \ 39562306a36Sopenharmony_ci __stringify(__back_to_back_c0_hazard) \ 39662306a36Sopenharmony_ci ); \ 39762306a36Sopenharmony_ci} while (0) 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci#define enable_fpu_hazard() \ 40162306a36Sopenharmony_cido { \ 40262306a36Sopenharmony_ci __asm__ __volatile__( \ 40362306a36Sopenharmony_ci __stringify(__enable_fpu_hazard) \ 40462306a36Sopenharmony_ci ); \ 40562306a36Sopenharmony_ci} while (0) 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci#define disable_fpu_hazard() \ 40962306a36Sopenharmony_cido { \ 41062306a36Sopenharmony_ci __asm__ __volatile__( \ 41162306a36Sopenharmony_ci __stringify(__disable_fpu_hazard) \ 41262306a36Sopenharmony_ci ); \ 41362306a36Sopenharmony_ci} while (0) 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci/* 41662306a36Sopenharmony_ci * MIPS R2 instruction hazard barrier. Needs to be called as a subroutine. 41762306a36Sopenharmony_ci */ 41862306a36Sopenharmony_ciextern void mips_ihb(void); 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci#endif /* __ASSEMBLY__ */ 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci#endif /* _ASM_HAZARDS_H */ 423