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

misc_32.c (2699B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * misc.c:  Miscellaneous prom functions that don't belong
      4 *          anywhere else.
      5 *
      6 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
      7 */
      8
      9#include <linux/types.h>
     10#include <linux/kernel.h>
     11#include <linux/sched.h>
     12#include <linux/module.h>
     13
     14#include <asm/openprom.h>
     15#include <asm/oplib.h>
     16#include <asm/auxio.h>
     17
     18extern void restore_current(void);
     19
     20DEFINE_SPINLOCK(prom_lock);
     21
     22/* Reset and reboot the machine with the command 'bcommand'. */
     23void
     24prom_reboot(char *bcommand)
     25{
     26	unsigned long flags;
     27	spin_lock_irqsave(&prom_lock, flags);
     28	(*(romvec->pv_reboot))(bcommand);
     29	/* Never get here. */
     30	restore_current();
     31	spin_unlock_irqrestore(&prom_lock, flags);
     32}
     33
     34/* Forth evaluate the expression contained in 'fstring'. */
     35void
     36prom_feval(char *fstring)
     37{
     38	unsigned long flags;
     39	if(!fstring || fstring[0] == 0)
     40		return;
     41	spin_lock_irqsave(&prom_lock, flags);
     42	if(prom_vers == PROM_V0)
     43		(*(romvec->pv_fortheval.v0_eval))(strlen(fstring), fstring);
     44	else
     45		(*(romvec->pv_fortheval.v2_eval))(fstring);
     46	restore_current();
     47	spin_unlock_irqrestore(&prom_lock, flags);
     48}
     49EXPORT_SYMBOL(prom_feval);
     50
     51/* Drop into the prom, with the chance to continue with the 'go'
     52 * prom command.
     53 */
     54void
     55prom_cmdline(void)
     56{
     57	unsigned long flags;
     58
     59	spin_lock_irqsave(&prom_lock, flags);
     60	(*(romvec->pv_abort))();
     61	restore_current();
     62	spin_unlock_irqrestore(&prom_lock, flags);
     63	set_auxio(AUXIO_LED, 0);
     64}
     65
     66/* Drop into the prom, but completely terminate the program.
     67 * No chance of continuing.
     68 */
     69void __noreturn
     70prom_halt(void)
     71{
     72	unsigned long flags;
     73again:
     74	spin_lock_irqsave(&prom_lock, flags);
     75	(*(romvec->pv_halt))();
     76	/* Never get here. */
     77	restore_current();
     78	spin_unlock_irqrestore(&prom_lock, flags);
     79	goto again; /* PROM is out to get me -DaveM */
     80}
     81
     82typedef void (*sfunc_t)(void);
     83
     84/* Set prom sync handler to call function 'funcp'. */
     85void
     86prom_setsync(sfunc_t funcp)
     87{
     88	if(!funcp) return;
     89	*romvec->pv_synchook = funcp;
     90}
     91
     92/* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
     93 * format type.  'num_bytes' is the number of bytes that your idbuf
     94 * has space for.  Returns 0xff on error.
     95 */
     96unsigned char
     97prom_get_idprom(char *idbuf, int num_bytes)
     98{
     99	int len;
    100
    101	len = prom_getproplen(prom_root_node, "idprom");
    102	if((len>num_bytes) || (len==-1)) return 0xff;
    103	if(!prom_getproperty(prom_root_node, "idprom", idbuf, num_bytes))
    104		return idbuf[0];
    105
    106	return 0xff;
    107}
    108
    109/* Get the major prom version number. */
    110int
    111prom_version(void)
    112{
    113	return romvec->pv_romvers;
    114}
    115
    116/* Get the prom plugin-revision. */
    117int
    118prom_getrev(void)
    119{
    120	return prom_rev;
    121}
    122
    123/* Get the prom firmware print revision. */
    124int
    125prom_getprev(void)
    126{
    127	return prom_prev;
    128}