| /* | |
| * Copyright 2004-2009 Analog Devices Inc. | |
| * | |
| * Licensed under the GPL-2 or later. | |
| */ | |
| #ifndef _BLACKFIN_BUG_H | |
| #define _BLACKFIN_BUG_H | |
| #ifdef CONFIG_BUG | |
| /* | |
| * This can be any undefined 16-bit opcode, meaning | |
| * ((opcode & 0xc000) != 0xc000) | |
| * Anything from 0x0001 to 0x000A (inclusive) will work | |
| */ | |
| #define BFIN_BUG_OPCODE 0x0001 | |
| #ifdef CONFIG_DEBUG_BUGVERBOSE | |
| #define _BUG_OR_WARN(flags) \ | |
| asm volatile( \ | |
| "1: .hword %0\n" \ | |
| " .section __bug_table,\"aw\",@progbits\n" \ | |
| "2: .long 1b\n" \ | |
| " .long %1\n" \ | |
| " .short %2\n" \ | |
| " .short %3\n" \ | |
| " .org 2b + %4\n" \ | |
| " .previous" \ | |
| : \ | |
| : "i"(BFIN_BUG_OPCODE), "i"(__FILE__), \ | |
| "i"(__LINE__), "i"(flags), \ | |
| "i"(sizeof(struct bug_entry))) | |
| #else | |
| #define _BUG_OR_WARN(flags) \ | |
| asm volatile( \ | |
| "1: .hword %0\n" \ | |
| " .section __bug_table,\"aw\",@progbits\n" \ | |
| "2: .long 1b\n" \ | |
| " .short %1\n" \ | |
| " .org 2b + %2\n" \ | |
| " .previous" \ | |
| : \ | |
| : "i"(BFIN_BUG_OPCODE), "i"(flags), \ | |
| "i"(sizeof(struct bug_entry))) | |
| #endif /* CONFIG_DEBUG_BUGVERBOSE */ | |
| #define BUG() \ | |
| do { \ | |
| _BUG_OR_WARN(0); \ | |
| unreachable(); \ | |
| } while (0) | |
| #define WARN_ON(condition) \ | |
| ({ \ | |
| int __ret_warn_on = !!(condition); \ | |
| if (unlikely(__ret_warn_on)) \ | |
| _BUG_OR_WARN(BUGFLAG_WARNING); \ | |
| unlikely(__ret_warn_on); \ | |
| }) | |
| #define HAVE_ARCH_BUG | |
| #define HAVE_ARCH_WARN_ON | |
| #endif | |
| #include <asm-generic/bug.h> | |
| #endif |