]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/kern/subr_prf.c
xnu-7195.101.1.tar.gz
[apple/xnu.git] / bsd / kern / subr_prf.c
index d090a242923d1739a30c173187cd0e1b5219b1a4..d5d5c7de7875f4be0087c817ee8e902b07f319ab 100644 (file)
 #include <os/log_private.h>
 
 /* for vaddlog(): the following are implemented in osfmk/kern/printf.c  */
 #include <os/log_private.h>
 
 /* for vaddlog(): the following are implemented in osfmk/kern/printf.c  */
-extern void bsd_log_lock(void);
+extern bool bsd_log_lock(bool);
 extern void bsd_log_unlock(void);
 
 extern void bsd_log_unlock(void);
 
+uint32_t vaddlog_msgcount = 0;
+uint32_t vaddlog_msgcount_dropped = 0;
+
 /* Keep this around only because it's exported */
 void _printf(int, struct tty *, const char *, ...);
 
 /* Keep this around only because it's exported */
 void _printf(int, struct tty *, const char *, ...);
 
@@ -122,7 +125,6 @@ struct snprintf_arg {
 extern const char       *debugger_panic_str;
 
 extern  void cnputc(char);              /* standard console putc */
 extern const char       *debugger_panic_str;
 
 extern  void cnputc(char);              /* standard console putc */
-void    (*v_putc)(char) = cnputc;       /* routine to putc on virtual console */
 
 extern  struct tty cons;                /* standard console tty */
 extern struct   tty *constty;           /* pointer to console "window" tty */
 
 extern  struct tty cons;                /* standard console tty */
 extern struct   tty *constty;           /* pointer to console "window" tty */
@@ -146,6 +148,7 @@ snprintf_func(int ch, void *arg);
 struct putchar_args {
        int flags;
        struct tty *tty;
 struct putchar_args {
        int flags;
        struct tty *tty;
+       bool last_char_was_cr;
 };
 static void putchar(int c, void *arg);
 
 };
 static void putchar(int c, void *arg);
 
@@ -236,14 +239,6 @@ tprintf(tpr_t tpr, const char *fmt, ...)
                tty_unlock(tp);
        }
 
                tty_unlock(tp);
        }
 
-       pca.flags = TOLOG;
-       pca.tty   = TTY_NULL;
-       va_start(ap, fmt);
-       __doprnt(fmt, ap, putchar, &pca, 10, TRUE);
-       va_end(ap);
-
-       logwakeup(msgbufp);
-
        va_start(ap, fmt);
        os_log_with_args(OS_LOG_DEFAULT, OS_LOG_TYPE_DEFAULT, fmt, ap, __builtin_return_address(0));
        va_end(ap);
        va_start(ap, fmt);
        os_log_with_args(OS_LOG_DEFAULT, OS_LOG_TYPE_DEFAULT, fmt, ap, __builtin_return_address(0));
        va_end(ap);
@@ -277,7 +272,7 @@ ttyprintf(struct tty *tp, const char *fmt, ...)
 void
 logtime(time_t secs)
 {
 void
 logtime(time_t secs)
 {
-       printf("Time %ld Message ", secs);
+       printf("Time 0x%lx Message ", secs);
 }
 
 static void
 }
 
 static void
@@ -286,7 +281,7 @@ putchar_asl(int c, void *arg)
        struct putchar_args *pca = arg;
 
        if ((pca->flags & TOLOGLOCKED) && c != '\0' && c != '\r' && c != 0177) {
        struct putchar_args *pca = arg;
 
        if ((pca->flags & TOLOGLOCKED) && c != '\0' && c != '\r' && c != 0177) {
-               log_putc_locked(aslbufp, c);
+               log_putc_locked(aslbufp, (char)c);
        }
        putchar(c, arg);
 }
        }
        putchar(c, arg);
 }
@@ -297,16 +292,21 @@ putchar_asl(int c, void *arg)
 int
 vaddlog(const char *fmt, va_list ap)
 {
 int
 vaddlog(const char *fmt, va_list ap)
 {
+       if (!bsd_log_lock(oslog_is_safe())) {
+               os_atomic_inc(&vaddlog_msgcount_dropped, relaxed);
+               return 1;
+       }
+
        struct putchar_args pca = {
                .flags = TOLOGLOCKED,
                .tty = NULL,
        };
 
        struct putchar_args pca = {
                .flags = TOLOGLOCKED,
                .tty = NULL,
        };
 
-       bsd_log_lock();
        __doprnt(fmt, ap, putchar_asl, &pca, 10, TRUE);
        bsd_log_unlock();
        logwakeup(NULL);
 
        __doprnt(fmt, ap, putchar_asl, &pca, 10, TRUE);
        bsd_log_unlock();
        logwakeup(NULL);
 
+       os_atomic_inc(&vaddlog_msgcount, relaxed);
        return 0;
 }
 
        return 0;
 }
 
@@ -379,33 +379,51 @@ putchar(int c, void *arg)
                constty = 0;
        }
        if ((pca->flags & TOLOG) && c != '\0' && c != '\r' && c != 0177) {
                constty = 0;
        }
        if ((pca->flags & TOLOG) && c != '\0' && c != '\r' && c != 0177) {
-               log_putc(c);
+               log_putc((char)c);
        }
        if ((pca->flags & TOLOGLOCKED) && c != '\0' && c != '\r' && c != 0177) {
        }
        if ((pca->flags & TOLOGLOCKED) && c != '\0' && c != '\r' && c != 0177) {
-               log_putc_locked(msgbufp, c);
+               log_putc_locked(msgbufp, (char)c);
        }
        if ((pca->flags & TOCONS) && constty == 0 && c != '\0') {
        }
        if ((pca->flags & TOCONS) && constty == 0 && c != '\0') {
-               (*v_putc)(c);
+               cnputc((char)c);
        }
        if (pca->flags & TOSTR) {
        }
        if (pca->flags & TOSTR) {
-               **sp = c;
+               **sp = (char)c;
                (*sp)++;
        }
                (*sp)++;
        }
+
+       pca->last_char_was_cr = ('\n' == c);
 }
 
 }
 
-int
-vprintf_log_locked(const char *fmt, va_list ap)
+bool
+printf_log_locked(bool addcr, const char *fmt, ...)
+{
+       bool retval;
+       va_list args;
+
+       va_start(args, fmt);
+       retval = vprintf_log_locked(fmt, args, addcr);
+       va_end(args);
+
+       return retval;
+}
+
+bool
+vprintf_log_locked(const char *fmt, va_list ap, bool addcr)
 {
        struct putchar_args pca;
 
        pca.flags = TOLOGLOCKED;
        pca.tty   = NULL;
 {
        struct putchar_args pca;
 
        pca.flags = TOLOGLOCKED;
        pca.tty   = NULL;
+       pca.last_char_was_cr = false;
        __doprnt(fmt, ap, putchar, &pca, 10, TRUE);
        __doprnt(fmt, ap, putchar, &pca, 10, TRUE);
-       return 0;
+       if (addcr) {
+               putchar('\n', &pca);
+       }
+       return pca.last_char_was_cr;
 }
 
 }
 
-#if !CONFIG_EMBEDDED
-
+#if CONFIG_VSPRINTF
 /*
  * Scaled down version of vsprintf(3).
  *
 /*
  * Scaled down version of vsprintf(3).
  *
@@ -427,7 +445,7 @@ vsprintf(char *buf, const char *cfmt, va_list ap)
        }
        return 0;
 }
        }
        return 0;
 }
-#endif  /* !CONFIG_EMBEDDED */
+#endif  /* CONFIG_VSPRINTF */
 
 /*
  * Scaled down version of snprintf(3).
 
 /*
  * Scaled down version of snprintf(3).
@@ -462,13 +480,37 @@ vsnprintf(char *str, size_t size, const char *format, va_list ap)
        return retval;
 }
 
        return retval;
 }
 
+int
+vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
+{
+       ssize_t ssize = size;
+       int i;
+
+       i = vsnprintf(buf, size, fmt, args);
+
+       return (i >= ssize) ? (int)(ssize - 1) : i;
+}
+
+int
+scnprintf(char *buf, size_t size, const char *fmt, ...)
+{
+       va_list args;
+       int i;
+
+       va_start(args, fmt);
+       i = vscnprintf(buf, size, fmt, args);
+       va_end(args);
+
+       return i;
+}
+
 static void
 snprintf_func(int ch, void *arg)
 {
        struct snprintf_arg *const info = arg;
 
        if (info->remain >= 2) {
 static void
 snprintf_func(int ch, void *arg)
 {
        struct snprintf_arg *const info = arg;
 
        if (info->remain >= 2) {
-               *info->str++ = ch;
+               *info->str++ = (char)ch;
                info->remain--;
        }
 }
                info->remain--;
        }
 }