1 /* 2 * Copyright (C) 2006 Atmel Corporation 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 */ 8 #ifndef __ASM_AVR32_BUG_H 9 #define __ASM_AVR32_BUG_H 10 11 #ifdef CONFIG_BUG 12 13 /* 14 * According to our Chief Architect, this compact opcode is very 15 * unlikely to ever be implemented. 16 */ 17 #define AVR32_BUG_OPCODE 0x5df0 18 19 #ifdef CONFIG_DEBUG_BUGVERBOSE 20 21 #define _BUG_OR_WARN(flags) \ 22 asm volatile( \ 23 "1: .hword %0\n" \ 24 " .section __bug_table,\"a\",@progbits\n" \ 25 "2: .long 1b\n" \ 26 " .long %1\n" \ 27 " .short %2\n" \ 28 " .short %3\n" \ 29 " .org 2b + %4\n" \ 30 " .previous" \ 31 : \ 32 : "i"(AVR32_BUG_OPCODE), "i"(__FILE__), \ 33 "i"(__LINE__), "i"(flags), \ 34 "i"(sizeof(struct bug_entry))) 35 36 #else 37 38 #define _BUG_OR_WARN(flags) \ 39 asm volatile( \ 40 "1: .hword %0\n" \ 41 " .section __bug_table,\"a\",@progbits\n" \ 42 "2: .long 1b\n" \ 43 " .short %1\n" \ 44 " .org 2b + %2\n" \ 45 " .previous" \ 46 : \ 47 : "i"(AVR32_BUG_OPCODE), "i"(flags), \ 48 "i"(sizeof(struct bug_entry))) 49 50 #endif /* CONFIG_DEBUG_BUGVERBOSE */ 51 52 #define BUG() \ 53 do { \ 54 _BUG_OR_WARN(0); \ 55 unreachable(); \ 56 } while (0) 57 58 #define WARN_ON(condition) \ 59 ({ \ 60 int __ret_warn_on = !!(condition); \ 61 if (unlikely(__ret_warn_on)) \ 62 _BUG_OR_WARN(BUGFLAG_WARNING); \ 63 unlikely(__ret_warn_on); \ 64 }) 65 66 #define HAVE_ARCH_BUG 67 #define HAVE_ARCH_WARN_ON 68 69 #endif /* CONFIG_BUG */ 70 71 #include <asm-generic/bug.h> 72 73 struct pt_regs; 74 void die(const char *str, struct pt_regs *regs, long err); 75 void _exception(long signr, struct pt_regs *regs, int code, 76 unsigned long addr); 77 78 #endif /* __ASM_AVR32_BUG_H */ 79