Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/sparc/prom/printf.c
26424 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* printf.c: Internal prom library printf facility.
4
*
5
* Copyright (C) 1995 David S. Miller ([email protected])
6
* Copyright (C) 1997 Jakub Jelinek ([email protected])
7
* Copyright (c) 2002 Pete Zaitcev ([email protected])
8
*
9
* We used to warn all over the code: DO NOT USE prom_printf(),
10
* and yet people do. Anton's banking code was outputting banks
11
* with prom_printf for most of the 2.4 lifetime. Since an effective
12
* stick is not available, we deployed a carrot: an early printk
13
* through PROM by means of -p boot option. This ought to fix it.
14
* USE printk; if you need, deploy -p.
15
*/
16
17
#include <linux/kernel.h>
18
#include <linux/compiler.h>
19
#include <linux/spinlock.h>
20
21
#include <asm/openprom.h>
22
#include <asm/oplib.h>
23
24
#define CONSOLE_WRITE_BUF_SIZE 1024
25
26
static char ppbuf[1024];
27
static char console_write_buf[CONSOLE_WRITE_BUF_SIZE];
28
static DEFINE_RAW_SPINLOCK(console_write_lock);
29
30
void notrace prom_write(const char *buf, unsigned int n)
31
{
32
unsigned int dest_len;
33
unsigned long flags;
34
char *dest;
35
36
dest = console_write_buf;
37
raw_spin_lock_irqsave(&console_write_lock, flags);
38
39
dest_len = 0;
40
while (n-- != 0) {
41
char ch = *buf++;
42
if (ch == '\n') {
43
*dest++ = '\r';
44
dest_len++;
45
}
46
*dest++ = ch;
47
dest_len++;
48
if (dest_len >= CONSOLE_WRITE_BUF_SIZE - 1) {
49
prom_console_write_buf(console_write_buf, dest_len);
50
dest = console_write_buf;
51
dest_len = 0;
52
}
53
}
54
if (dest_len)
55
prom_console_write_buf(console_write_buf, dest_len);
56
57
raw_spin_unlock_irqrestore(&console_write_lock, flags);
58
}
59
60
void notrace prom_printf(const char *fmt, ...)
61
{
62
va_list args;
63
int i;
64
65
va_start(args, fmt);
66
i = vscnprintf(ppbuf, sizeof(ppbuf), fmt, args);
67
va_end(args);
68
69
prom_write(ppbuf, i);
70
}
71
72