1f30828a6745281edda735f642b5f814e1123ecd3Adrian Bunk/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * printf.c:  Internal prom library printf facility.
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* This routine is internal to the prom library, no one else should know
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * about or use it!  It's simple and smelly anyway....
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/openprom.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/oplib.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_KGDB
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int kgdb_initialized;
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char ppbuf[1024];
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsprom_printf(char *fmt, ...)
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	va_list args;
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char ch, *bptr;
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	va_start(args, fmt);
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_KGDB
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ppbuf[0] = 'O';
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	i = vsprintf(ppbuf + 1, fmt, args) + 1;
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	i = vsprintf(ppbuf, fmt, args);
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bptr = ppbuf;
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_KGDB
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (kgdb_initialized) {
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("kgdb_initialized = %d\n", kgdb_initialized);
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		putpacket(bptr, 1);
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while((ch = *(bptr++)) != 0) {
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ch == '\n')
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			prom_putchar('\r');
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		prom_putchar(ch);
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	va_end(args);
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return;
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
56