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

hvc_udbg.c (1382B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * udbg interface to hvc_console.c
      4 *
      5 * (C) Copyright David Gibson, IBM Corporation 2008.
      6 */
      7
      8#include <linux/console.h>
      9#include <linux/delay.h>
     10#include <linux/err.h>
     11#include <linux/init.h>
     12#include <linux/moduleparam.h>
     13#include <linux/types.h>
     14#include <linux/irq.h>
     15
     16#include <asm/udbg.h>
     17
     18#include "hvc_console.h"
     19
     20static struct hvc_struct *hvc_udbg_dev;
     21
     22static int hvc_udbg_put(uint32_t vtermno, const char *buf, int count)
     23{
     24	int i;
     25
     26	for (i = 0; i < count && udbg_putc; i++)
     27		udbg_putc(buf[i]);
     28
     29	return i;
     30}
     31
     32static int hvc_udbg_get(uint32_t vtermno, char *buf, int count)
     33{
     34	int i, c;
     35
     36	if (!udbg_getc_poll)
     37		return 0;
     38
     39	for (i = 0; i < count; i++) {
     40		if ((c = udbg_getc_poll()) == -1)
     41			break;
     42		buf[i] = c;
     43	}
     44
     45	return i;
     46}
     47
     48static const struct hv_ops hvc_udbg_ops = {
     49	.get_chars = hvc_udbg_get,
     50	.put_chars = hvc_udbg_put,
     51};
     52
     53static int __init hvc_udbg_init(void)
     54{
     55	struct hvc_struct *hp;
     56
     57	if (!udbg_putc)
     58		return -ENODEV;
     59
     60	BUG_ON(hvc_udbg_dev);
     61
     62	hp = hvc_alloc(0, 0, &hvc_udbg_ops, 16);
     63	if (IS_ERR(hp))
     64		return PTR_ERR(hp);
     65
     66	hvc_udbg_dev = hp;
     67
     68	return 0;
     69}
     70device_initcall(hvc_udbg_init);
     71
     72static int __init hvc_udbg_console_init(void)
     73{
     74	if (!udbg_putc)
     75		return -ENODEV;
     76
     77	hvc_instantiate(0, 0, &hvc_udbg_ops);
     78	add_preferred_console("hvc", 0, NULL);
     79
     80	return 0;
     81}
     82console_initcall(hvc_udbg_console_init);