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

natfeat.c (1957B)


      1/*
      2 * natfeat.c - ARAnyM hardware support via Native Features (natfeats)
      3 *
      4 * Copyright (c) 2005 Petr Stehlik of ARAnyM dev team
      5 *
      6 * Reworked for Linux by Roman Zippel <zippel@linux-m68k.org>
      7 *
      8 * This software may be used and distributed according to the terms of
      9 * the GNU General Public License (GPL), incorporated herein by reference.
     10 */
     11
     12#include <linux/init.h>
     13#include <linux/types.h>
     14#include <linux/console.h>
     15#include <linux/string.h>
     16#include <linux/kernel.h>
     17#include <linux/module.h>
     18#include <linux/reboot.h>
     19#include <linux/io.h>
     20#include <asm/machdep.h>
     21#include <asm/natfeat.h>
     22
     23extern long nf_get_id_phys(unsigned long feature_name);
     24
     25asm("\n"
     26"	.global nf_get_id_phys,nf_call\n"
     27"nf_get_id_phys:\n"
     28"	.short	0x7300\n"
     29"	rts\n"
     30"nf_call:\n"
     31"	.short	0x7301\n"
     32"	rts\n"
     33"1:	moveq.l	#0,%d0\n"
     34"	rts\n"
     35"	.section __ex_table,\"a\"\n"
     36"	.long	nf_get_id_phys,1b\n"
     37"	.long	nf_call,1b\n"
     38"	.previous");
     39EXPORT_SYMBOL_GPL(nf_call);
     40
     41long nf_get_id(const char *feature_name)
     42{
     43	/* feature_name may be in vmalloc()ed memory, so make a copy */
     44	char name_copy[32];
     45	size_t n;
     46
     47	n = strlcpy(name_copy, feature_name, sizeof(name_copy));
     48	if (n >= sizeof(name_copy))
     49		return 0;
     50
     51	return nf_get_id_phys(virt_to_phys(name_copy));
     52}
     53EXPORT_SYMBOL_GPL(nf_get_id);
     54
     55void nfprint(const char *fmt, ...)
     56{
     57	static char buf[256];
     58	va_list ap;
     59	int n;
     60
     61	va_start(ap, fmt);
     62	n = vsnprintf(buf, 256, fmt, ap);
     63	nf_call(nf_get_id("NF_STDERR"), virt_to_phys(buf));
     64	va_end(ap);
     65}
     66
     67static void nf_poweroff(void)
     68{
     69	long id = nf_get_id("NF_SHUTDOWN");
     70
     71	if (id)
     72		nf_call(id);
     73}
     74
     75void __init nf_init(void)
     76{
     77	unsigned long id, version;
     78	char buf[256];
     79
     80	id = nf_get_id("NF_VERSION");
     81	if (!id)
     82		return;
     83	version = nf_call(id);
     84
     85	id = nf_get_id("NF_NAME");
     86	if (!id)
     87		return;
     88	nf_call(id, virt_to_phys(buf), 256);
     89	buf[255] = 0;
     90
     91	pr_info("NatFeats found (%s, %lu.%lu)\n", buf, version >> 16,
     92		version & 0xffff);
     93
     94	register_platform_power_off(nf_poweroff);
     95}