X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/cf7d32b81c573a0536dc4da4157f9c26f8d0bed3..c7d2c2c6ee645e10cbccdd01c6191873ec77239d:/osfmk/kern/printf.c diff --git a/osfmk/kern/printf.c b/osfmk/kern/printf.c index a922e3688..82ad32bb9 100644 --- a/osfmk/kern/printf.c +++ b/osfmk/kern/printf.c @@ -94,9 +94,7 @@ * %0m.n zero-padding * %*.* width and precision taken from arguments * - * This version does not implement %f, %e, or %g. It accepts, but - * ignores, an `l' as in %ld, %lo, %lx, and %lu, and therefore will not - * work correctly on machines for which sizeof(long) != sizeof(int). + * This version does not implement %f, %e, or %g. * * As mentioned, this version does not return any reasonable value. * @@ -157,12 +155,9 @@ */ #include -#include #include -#include #include #include -#include #include #include #include @@ -174,21 +169,25 @@ #endif #include -#ifdef __ppc__ -#include -#endif - #define isdigit(d) ((d) >= '0' && (d) <= '9') #define Ctod(c) ((c) - '0') #define MAXBUF (sizeof(long long int) * 8) /* enough for binary */ static char digs[] = "0123456789abcdef"; - #if CONFIG_NO_PRINTF_STRINGS -#undef printf(x, ...) +/* Prevent CPP from breaking the definition below */ +#undef printf #endif +int _consume_printf_args(int a __unused, ...) +{ + return 0; +} +void _consume_kprintf_args(int a __unused, ...) +{ +} + static int printnum( unsigned long long int u, /* number to print */ @@ -215,14 +214,21 @@ printnum( boolean_t _doprnt_truncates = FALSE; +#if (DEVELOPMENT || DEBUG) +boolean_t doprnt_hide_pointers = FALSE; +#else +boolean_t doprnt_hide_pointers = TRUE; +#endif + int __doprnt( const char *fmt, - va_list *argp, + va_list argp, /* character output routine */ void (*putc)(int, void *arg), void *arg, - int radix) /* default radix - for '%r' */ + int radix, /* default radix - for '%r' */ + int is_log) { int length; int prec; @@ -290,7 +296,7 @@ __doprnt( } } else if (c == '*') { - length = va_arg(*argp, int); + length = va_arg(argp, int); c = *++fmt; if (length < 0) { ladjust = !ladjust; @@ -308,13 +314,15 @@ __doprnt( } } else if (c == '*') { - prec = va_arg(*argp, int); + prec = va_arg(argp, int); c = *++fmt; } } if (c == 'l') { c = *++fmt; /* need it if sizeof(int) < sizeof(long) */ + if (sizeof(int)= 0) { u = n; @@ -547,9 +558,9 @@ __doprnt( print_unsigned: if (long_long) { - u = va_arg(*argp, unsigned long long); + u = va_arg(argp, unsigned long long); } else { - u = va_arg(*argp, unsigned long); + u = va_arg(argp, unsigned int); } goto print_num; @@ -562,6 +573,21 @@ __doprnt( if (truncate) u = (long long)((int)(u)); + if (doprnt_hide_pointers && is_log) { + const char str[] = ""; + const char* strp = str; + int strl = sizeof(str) - 1; + + if (u >= VM_MIN_KERNEL_AND_KEXT_ADDRESS && u <= VM_MAX_KERNEL_ADDRESS) { + while(*strp != '\0') { + (*putc)(*strp, arg); + strp++; + } + nprinted += strl; + break; + } + } + if (u != 0 && altfmt) { if (base == 8) prefix = "0"; @@ -575,11 +601,11 @@ __doprnt( u /= base; } while (u != 0); - length -= (&buf[MAXBUF-1] - p); + length -= (int)(&buf[MAXBUF-1] - p); if (sign_char) length--; if (prefix) - length -= strlen(prefix); + length -= (int)strlen(prefix); if (padc == ' ' && !ladjust) { /* blank padding goes before prefix */ @@ -649,7 +675,18 @@ _doprnt( void (*putc)(char), int radix) /* default radix - for '%r' */ { - __doprnt(fmt, argp, dummy_putc, putc, radix); + __doprnt(fmt, *argp, dummy_putc, putc, radix, FALSE); +} + +void +_doprnt_log( + register const char *fmt, + va_list *argp, + /* character output routine */ + void (*putc)(char), + int radix) /* default radix - for '%r' */ +{ + __doprnt(fmt, *argp, dummy_putc, putc, radix, TRUE); } #if MP_PRINTF @@ -745,26 +782,17 @@ conslog_putc( cnputc(c); #ifdef MACH_BSD - log_putc(c); + if (debug_mode == 0) + log_putc(c); #endif } -#if MACH_KDB -extern void db_putchar(char c); -#endif - void -dbugprintf(__unused const char *fmt, ...) +cons_putc_locked( + char c) { - -#if MACH_KDB - va_list listp; - - va_start(listp, fmt); - _doprnt(fmt, &listp, db_putchar, 16); - va_end(listp); -#endif - return; + if ((debug_mode && !disable_debug_output) || !disableConsoleOutput) + cnputc(c); } int @@ -775,7 +803,7 @@ printf(const char *fmt, ...) if (fmt) { disable_preemption(); va_start(listp, fmt); - _doprnt(fmt, &listp, conslog_putc, 16); + _doprnt_log(fmt, &listp, conslog_putc, 16); va_end(listp); enable_preemption(); } @@ -795,17 +823,59 @@ consdebug_putc(char c) PE_kputc(c); } +void +consdebug_putc_unbuffered(char c) +{ + if ((debug_mode && !disable_debug_output) || !disableConsoleOutput) + cnputc_unbuffered(c); + + debug_putc(c); + + if (!console_is_serial()) + if (!disable_serial_output) + PE_kputc(c); +} + +void +consdebug_log(char c) +{ + debug_putc(c); +} + int kdb_printf(const char *fmt, ...) { va_list listp; va_start(listp, fmt); - _doprnt(fmt, &listp, consdebug_putc, 16); + _doprnt_log(fmt, &listp, consdebug_putc, 16); va_end(listp); return 0; } +int +kdb_log(const char *fmt, ...) +{ + va_list listp; + + va_start(listp, fmt); + _doprnt(fmt, &listp, consdebug_log, 16); + va_end(listp); + return 0; +} + +int +kdb_printf_unbuffered(const char *fmt, ...) +{ + va_list listp; + + va_start(listp, fmt); + _doprnt(fmt, &listp, consdebug_putc_unbuffered, 16); + va_end(listp); + return 0; +} + + static void copybyte(int c, void *arg) { @@ -832,8 +902,8 @@ sprintf(char *buf, const char *fmt, ...) va_start(listp, fmt); copybyte_str = buf; - __doprnt(fmt, &listp, copybyte, ©byte_str, 16); + __doprnt(fmt, listp, copybyte, ©byte_str, 16, FALSE); va_end(listp); *copybyte_str = '\0'; - return strlen(buf); + return (int)strlen(buf); }