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

libata-trace.c (6733B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * libata-trace.c - trace functions for libata
      4 *
      5 * Copyright 2015 Hannes Reinecke
      6 * Copyright 2015 SUSE Linux GmbH
      7 */
      8
      9#include <linux/kernel.h>
     10#include <linux/trace_seq.h>
     11#include <trace/events/libata.h>
     12
     13const char *
     14libata_trace_parse_status(struct trace_seq *p, unsigned char status)
     15{
     16	const char *ret = trace_seq_buffer_ptr(p);
     17
     18	trace_seq_printf(p, "{ ");
     19	if (status & ATA_BUSY)
     20		trace_seq_printf(p, "BUSY ");
     21	if (status & ATA_DRDY)
     22		trace_seq_printf(p, "DRDY ");
     23	if (status & ATA_DF)
     24		trace_seq_printf(p, "DF ");
     25	if (status & ATA_DSC)
     26		trace_seq_printf(p, "DSC ");
     27	if (status & ATA_DRQ)
     28		trace_seq_printf(p, "DRQ ");
     29	if (status & ATA_CORR)
     30		trace_seq_printf(p, "CORR ");
     31	if (status & ATA_SENSE)
     32		trace_seq_printf(p, "SENSE ");
     33	if (status & ATA_ERR)
     34		trace_seq_printf(p, "ERR ");
     35	trace_seq_putc(p, '}');
     36	trace_seq_putc(p, 0);
     37
     38	return ret;
     39}
     40
     41const char *
     42libata_trace_parse_host_stat(struct trace_seq *p, unsigned char host_stat)
     43{
     44	const char *ret = trace_seq_buffer_ptr(p);
     45
     46	trace_seq_printf(p, "{ ");
     47	if (host_stat & ATA_DMA_INTR)
     48		trace_seq_printf(p, "INTR ");
     49	if (host_stat & ATA_DMA_ERR)
     50		trace_seq_printf(p, "ERR ");
     51	if (host_stat & ATA_DMA_ACTIVE)
     52		trace_seq_printf(p, "ACTIVE ");
     53	trace_seq_putc(p, '}');
     54	trace_seq_putc(p, 0);
     55
     56	return ret;
     57}
     58
     59const char *
     60libata_trace_parse_eh_action(struct trace_seq *p, unsigned int eh_action)
     61{
     62	const char *ret = trace_seq_buffer_ptr(p);
     63
     64	trace_seq_printf(p, "%x", eh_action);
     65	if (eh_action) {
     66		trace_seq_printf(p, "{ ");
     67		if (eh_action & ATA_EH_REVALIDATE)
     68			trace_seq_printf(p, "REVALIDATE ");
     69		if (eh_action & (ATA_EH_SOFTRESET | ATA_EH_HARDRESET))
     70			trace_seq_printf(p, "RESET ");
     71		else if (eh_action & ATA_EH_SOFTRESET)
     72			trace_seq_printf(p, "SOFTRESET ");
     73		else if (eh_action & ATA_EH_HARDRESET)
     74			trace_seq_printf(p, "HARDRESET ");
     75		if (eh_action & ATA_EH_ENABLE_LINK)
     76			trace_seq_printf(p, "ENABLE_LINK ");
     77		if (eh_action & ATA_EH_PARK)
     78			trace_seq_printf(p, "PARK ");
     79		trace_seq_putc(p, '}');
     80	}
     81	trace_seq_putc(p, 0);
     82
     83	return ret;
     84}
     85
     86const char *
     87libata_trace_parse_eh_err_mask(struct trace_seq *p, unsigned int eh_err_mask)
     88{
     89	const char *ret = trace_seq_buffer_ptr(p);
     90
     91	trace_seq_printf(p, "%x", eh_err_mask);
     92	if (eh_err_mask) {
     93		trace_seq_printf(p, "{ ");
     94		if (eh_err_mask & AC_ERR_DEV)
     95			trace_seq_printf(p, "DEV ");
     96		if (eh_err_mask & AC_ERR_HSM)
     97			trace_seq_printf(p, "HSM ");
     98		if (eh_err_mask & AC_ERR_TIMEOUT)
     99			trace_seq_printf(p, "TIMEOUT ");
    100		if (eh_err_mask & AC_ERR_MEDIA)
    101			trace_seq_printf(p, "MEDIA ");
    102		if (eh_err_mask & AC_ERR_ATA_BUS)
    103			trace_seq_printf(p, "ATA_BUS ");
    104		if (eh_err_mask & AC_ERR_HOST_BUS)
    105			trace_seq_printf(p, "HOST_BUS ");
    106		if (eh_err_mask & AC_ERR_SYSTEM)
    107			trace_seq_printf(p, "SYSTEM ");
    108		if (eh_err_mask & AC_ERR_INVALID)
    109			trace_seq_printf(p, "INVALID ");
    110		if (eh_err_mask & AC_ERR_OTHER)
    111			trace_seq_printf(p, "OTHER ");
    112		if (eh_err_mask & AC_ERR_NODEV_HINT)
    113			trace_seq_printf(p, "NODEV_HINT ");
    114		if (eh_err_mask & AC_ERR_NCQ)
    115			trace_seq_printf(p, "NCQ ");
    116		trace_seq_putc(p, '}');
    117	}
    118	trace_seq_putc(p, 0);
    119
    120	return ret;
    121}
    122
    123const char *
    124libata_trace_parse_qc_flags(struct trace_seq *p, unsigned int qc_flags)
    125{
    126	const char *ret = trace_seq_buffer_ptr(p);
    127
    128	trace_seq_printf(p, "%x", qc_flags);
    129	if (qc_flags) {
    130		trace_seq_printf(p, "{ ");
    131		if (qc_flags & ATA_QCFLAG_ACTIVE)
    132			trace_seq_printf(p, "ACTIVE ");
    133		if (qc_flags & ATA_QCFLAG_DMAMAP)
    134			trace_seq_printf(p, "DMAMAP ");
    135		if (qc_flags & ATA_QCFLAG_IO)
    136			trace_seq_printf(p, "IO ");
    137		if (qc_flags & ATA_QCFLAG_RESULT_TF)
    138			trace_seq_printf(p, "RESULT_TF ");
    139		if (qc_flags & ATA_QCFLAG_CLEAR_EXCL)
    140			trace_seq_printf(p, "CLEAR_EXCL ");
    141		if (qc_flags & ATA_QCFLAG_QUIET)
    142			trace_seq_printf(p, "QUIET ");
    143		if (qc_flags & ATA_QCFLAG_RETRY)
    144			trace_seq_printf(p, "RETRY ");
    145		if (qc_flags & ATA_QCFLAG_FAILED)
    146			trace_seq_printf(p, "FAILED ");
    147		if (qc_flags & ATA_QCFLAG_SENSE_VALID)
    148			trace_seq_printf(p, "SENSE_VALID ");
    149		if (qc_flags & ATA_QCFLAG_EH_SCHEDULED)
    150			trace_seq_printf(p, "EH_SCHEDULED ");
    151		trace_seq_putc(p, '}');
    152	}
    153	trace_seq_putc(p, 0);
    154
    155	return ret;
    156}
    157
    158const char *
    159libata_trace_parse_tf_flags(struct trace_seq *p, unsigned int tf_flags)
    160{
    161	const char *ret = trace_seq_buffer_ptr(p);
    162
    163	trace_seq_printf(p, "%x", tf_flags);
    164	if (tf_flags) {
    165		trace_seq_printf(p, "{ ");
    166		if (tf_flags & ATA_TFLAG_LBA48)
    167			trace_seq_printf(p, "LBA48 ");
    168		if (tf_flags & ATA_TFLAG_ISADDR)
    169			trace_seq_printf(p, "ISADDR ");
    170		if (tf_flags & ATA_TFLAG_DEVICE)
    171			trace_seq_printf(p, "DEV ");
    172		if (tf_flags & ATA_TFLAG_WRITE)
    173			trace_seq_printf(p, "WRITE ");
    174		if (tf_flags & ATA_TFLAG_LBA)
    175			trace_seq_printf(p, "LBA ");
    176		if (tf_flags & ATA_TFLAG_FUA)
    177			trace_seq_printf(p, "FUA ");
    178		if (tf_flags & ATA_TFLAG_POLLING)
    179			trace_seq_printf(p, "POLL ");
    180		trace_seq_putc(p, '}');
    181	}
    182	trace_seq_putc(p, 0);
    183
    184	return ret;
    185}
    186
    187const char *
    188libata_trace_parse_subcmd(struct trace_seq *p, unsigned char cmd,
    189			  unsigned char feature, unsigned char hob_nsect)
    190{
    191	const char *ret = trace_seq_buffer_ptr(p);
    192
    193	switch (cmd) {
    194	case ATA_CMD_FPDMA_RECV:
    195		switch (hob_nsect & 0x5f) {
    196		case ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT:
    197			trace_seq_printf(p, " READ_LOG_DMA_EXT");
    198			break;
    199		case ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN:
    200			trace_seq_printf(p, " ZAC_MGMT_IN");
    201			break;
    202		}
    203		break;
    204	case ATA_CMD_FPDMA_SEND:
    205		switch (hob_nsect & 0x5f) {
    206		case ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT:
    207			trace_seq_printf(p, " WRITE_LOG_DMA_EXT");
    208			break;
    209		case ATA_SUBCMD_FPDMA_SEND_DSM:
    210			trace_seq_printf(p, " DATASET_MANAGEMENT");
    211			break;
    212		}
    213		break;
    214	case ATA_CMD_NCQ_NON_DATA:
    215		switch (feature) {
    216		case ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE:
    217			trace_seq_printf(p, " ABORT_QUEUE");
    218			break;
    219		case ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES:
    220			trace_seq_printf(p, " SET_FEATURES");
    221			break;
    222		case ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT:
    223			trace_seq_printf(p, " ZERO_EXT");
    224			break;
    225		case ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT:
    226			trace_seq_printf(p, " ZAC_MGMT_OUT");
    227			break;
    228		}
    229		break;
    230	case ATA_CMD_ZAC_MGMT_IN:
    231		switch (feature) {
    232		case ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES:
    233			trace_seq_printf(p, " REPORT_ZONES");
    234			break;
    235		}
    236		break;
    237	case ATA_CMD_ZAC_MGMT_OUT:
    238		switch (feature) {
    239		case ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE:
    240			trace_seq_printf(p, " CLOSE_ZONE");
    241			break;
    242		case ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE:
    243			trace_seq_printf(p, " FINISH_ZONE");
    244			break;
    245		case ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE:
    246			trace_seq_printf(p, " OPEN_ZONE");
    247			break;
    248		case ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER:
    249			trace_seq_printf(p, " RESET_WRITE_POINTER");
    250			break;
    251		}
    252		break;
    253	}
    254	trace_seq_putc(p, 0);
    255
    256	return ret;
    257}