cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

printf.c (1764B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * printf.c:  Internal prom library printf facility.
      4 *
      5 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
      6 * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
      7 * Copyright (c) 2002 Pete Zaitcev (zaitcev@yahoo.com)
      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
     26static char ppbuf[1024];
     27static char console_write_buf[CONSOLE_WRITE_BUF_SIZE];
     28static DEFINE_RAW_SPINLOCK(console_write_lock);
     29
     30void 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
     60void 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}