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

vas-debug.c (4398B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Copyright 2016-17 IBM Corp.
      4 */
      5
      6#define pr_fmt(fmt) "vas: " fmt
      7
      8#include <linux/types.h>
      9#include <linux/slab.h>
     10#include <linux/debugfs.h>
     11#include <linux/seq_file.h>
     12#include <asm/vas.h>
     13#include "vas.h"
     14
     15static struct dentry *vas_debugfs;
     16
     17static char *cop_to_str(int cop)
     18{
     19	switch (cop) {
     20	case VAS_COP_TYPE_FAULT:	return "Fault";
     21	case VAS_COP_TYPE_842:		return "NX-842 Normal Priority";
     22	case VAS_COP_TYPE_842_HIPRI:	return "NX-842 High Priority";
     23	case VAS_COP_TYPE_GZIP:		return "NX-GZIP Normal Priority";
     24	case VAS_COP_TYPE_GZIP_HIPRI:	return "NX-GZIP High Priority";
     25	case VAS_COP_TYPE_FTW:		return "Fast Thread-wakeup";
     26	default:			return "Unknown";
     27	}
     28}
     29
     30static int info_show(struct seq_file *s, void *private)
     31{
     32	struct pnv_vas_window *window = s->private;
     33
     34	mutex_lock(&vas_mutex);
     35
     36	/* ensure window is not unmapped */
     37	if (!window->hvwc_map)
     38		goto unlock;
     39
     40	seq_printf(s, "Type: %s, %s\n", cop_to_str(window->vas_win.cop),
     41					window->tx_win ? "Send" : "Receive");
     42	seq_printf(s, "Pid : %d\n", vas_window_pid(&window->vas_win));
     43
     44unlock:
     45	mutex_unlock(&vas_mutex);
     46	return 0;
     47}
     48
     49DEFINE_SHOW_ATTRIBUTE(info);
     50
     51static inline void print_reg(struct seq_file *s, struct pnv_vas_window *win,
     52			char *name, u32 reg)
     53{
     54	seq_printf(s, "0x%016llx %s\n", read_hvwc_reg(win, name, reg), name);
     55}
     56
     57static int hvwc_show(struct seq_file *s, void *private)
     58{
     59	struct pnv_vas_window *window = s->private;
     60
     61	mutex_lock(&vas_mutex);
     62
     63	/* ensure window is not unmapped */
     64	if (!window->hvwc_map)
     65		goto unlock;
     66
     67	print_reg(s, window, VREG(LPID));
     68	print_reg(s, window, VREG(PID));
     69	print_reg(s, window, VREG(XLATE_MSR));
     70	print_reg(s, window, VREG(XLATE_LPCR));
     71	print_reg(s, window, VREG(XLATE_CTL));
     72	print_reg(s, window, VREG(AMR));
     73	print_reg(s, window, VREG(SEIDR));
     74	print_reg(s, window, VREG(FAULT_TX_WIN));
     75	print_reg(s, window, VREG(OSU_INTR_SRC_RA));
     76	print_reg(s, window, VREG(HV_INTR_SRC_RA));
     77	print_reg(s, window, VREG(PSWID));
     78	print_reg(s, window, VREG(LFIFO_BAR));
     79	print_reg(s, window, VREG(LDATA_STAMP_CTL));
     80	print_reg(s, window, VREG(LDMA_CACHE_CTL));
     81	print_reg(s, window, VREG(LRFIFO_PUSH));
     82	print_reg(s, window, VREG(CURR_MSG_COUNT));
     83	print_reg(s, window, VREG(LNOTIFY_AFTER_COUNT));
     84	print_reg(s, window, VREG(LRX_WCRED));
     85	print_reg(s, window, VREG(LRX_WCRED_ADDER));
     86	print_reg(s, window, VREG(TX_WCRED));
     87	print_reg(s, window, VREG(TX_WCRED_ADDER));
     88	print_reg(s, window, VREG(LFIFO_SIZE));
     89	print_reg(s, window, VREG(WINCTL));
     90	print_reg(s, window, VREG(WIN_STATUS));
     91	print_reg(s, window, VREG(WIN_CTX_CACHING_CTL));
     92	print_reg(s, window, VREG(TX_RSVD_BUF_COUNT));
     93	print_reg(s, window, VREG(LRFIFO_WIN_PTR));
     94	print_reg(s, window, VREG(LNOTIFY_CTL));
     95	print_reg(s, window, VREG(LNOTIFY_PID));
     96	print_reg(s, window, VREG(LNOTIFY_LPID));
     97	print_reg(s, window, VREG(LNOTIFY_TID));
     98	print_reg(s, window, VREG(LNOTIFY_SCOPE));
     99	print_reg(s, window, VREG(NX_UTIL_ADDER));
    100unlock:
    101	mutex_unlock(&vas_mutex);
    102	return 0;
    103}
    104
    105DEFINE_SHOW_ATTRIBUTE(hvwc);
    106
    107void vas_window_free_dbgdir(struct pnv_vas_window *pnv_win)
    108{
    109	struct vas_window *window =  &pnv_win->vas_win;
    110
    111	if (window->dbgdir) {
    112		debugfs_remove_recursive(window->dbgdir);
    113		kfree(window->dbgname);
    114		window->dbgdir = NULL;
    115		window->dbgname = NULL;
    116	}
    117}
    118
    119void vas_window_init_dbgdir(struct pnv_vas_window *window)
    120{
    121	struct dentry *d;
    122
    123	if (!window->vinst->dbgdir)
    124		return;
    125
    126	window->vas_win.dbgname = kzalloc(16, GFP_KERNEL);
    127	if (!window->vas_win.dbgname)
    128		return;
    129
    130	snprintf(window->vas_win.dbgname, 16, "w%d", window->vas_win.winid);
    131
    132	d = debugfs_create_dir(window->vas_win.dbgname, window->vinst->dbgdir);
    133	window->vas_win.dbgdir = d;
    134
    135	debugfs_create_file("info", 0444, d, window, &info_fops);
    136	debugfs_create_file("hvwc", 0444, d, window, &hvwc_fops);
    137}
    138
    139void vas_instance_init_dbgdir(struct vas_instance *vinst)
    140{
    141	struct dentry *d;
    142
    143	vas_init_dbgdir();
    144
    145	vinst->dbgname = kzalloc(16, GFP_KERNEL);
    146	if (!vinst->dbgname)
    147		return;
    148
    149	snprintf(vinst->dbgname, 16, "v%d", vinst->vas_id);
    150
    151	d = debugfs_create_dir(vinst->dbgname, vas_debugfs);
    152	vinst->dbgdir = d;
    153}
    154
    155/*
    156 * Set up the "root" VAS debugfs dir. Return if we already set it up
    157 * (or failed to) in an earlier instance of VAS.
    158 */
    159void vas_init_dbgdir(void)
    160{
    161	static bool first_time = true;
    162
    163	if (!first_time)
    164		return;
    165
    166	first_time = false;
    167	vas_debugfs = debugfs_create_dir("vas", NULL);
    168}