lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sat, 12 Jul 2008 02:51:22 +0200 From: Johannes Berg <johannes@...solutions.net> To: Andrew Morton <akpm@...ux-foundation.org> Cc: Arjan van de Ven <arjan@...radead.org>, linux-kernel@...r.kernel.org, mingo@...e.hu Subject: Re: [patch 13/17] Use WARN() in drivers/base/ > #define WARN_ON(test, fmt...) \ > do { \ > if (test) { \ > warn_on_slowpath(cnt(fmt) , ## fmt); \ > printf("WARN\n"); \ > } \ > } while (0) That doesn't play well with the bugtrap stuff, obviously. This one is a bit better, but still has more overhead than the bugtrap stuff, but avoids the overhead in the no-argument case. #include <stdarg.h> #include <stdio.h> #define unlikely(x) (x) #define hasargs(...) _hasargs( , ## __VA_ARGS__) #define _hasargs(...) __hasargs(__VA_ARGS__,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0) #define __hasargs(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,n,ys...) n static void warn_slowpath(int count, ...) { va_list args; char *fmt; printf("WARNING: <<\n"); if (count) { va_start(args, count); fmt = va_arg(args, char *); vprintf(fmt, args); va_end(args); } printf(">>\n"); } /* * This is the original arch WARN_ON that just emits * a trap instruction and a bugtrap section entry for * example on powerpc. * * Obviously this isn't, but it could be. */ #define BUGTRAP_WARN_ON(test) ({ \ if (unlikely(test)) \ printf("WARNING: %s\n", #test); \ unlikely(test); \ }) /* * This is a WARN_ON for some other architectures that don't * use the bugtrap section, it calls the slowpath function * which leads to more code size. But when you've added * parameters to your WARN_ON those need to be calculated * as well so you've already increased code size. */ #define OUT_OF_LINE_WARN_ON(test, fmt...) ({ \ if (unlikely(test)) \ warn_slowpath(hasargs(fmt) , ## fmt); \ unlikely(test); \ }) /* * This new version determines whether to do a bugtrap * entry or not depending on whether there were any extra * arguments given. */ #define CONFIG_BUG_EXTRA_VERBOSE #ifdef CONFIG_BUG_EXTRA_VERBOSE #define WARN_ON(test, fmt...) ({ \ if (!hasargs(fmt)) \ BUGTRAP_WARN_ON(test); \ else \ OUT_OF_LINE_WARN_ON(test , ## fmt); \ }) #else #define WARN_ON(test, fmt...) BUGTRAP_WARN_ON(test) #endif int main(void) { WARN_ON(1); WARN_ON(2, "asdf %d %d\n", 7, 8); WARN_ON(3, "asdf\n"); return 0; } -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists