Hello community,
here is the log from the commit of package lcrash
checked in at Tue Dec 11 00:04:57 CET 2007.
--------
--- lcrash/lcrash.changes 2007-10-17 10:40:50.000000000 +0200
+++ /mounts/work_src_done/STABLE/lcrash/lcrash.changes 2007-12-10 20:33:23.751050000 +0100
@@ -1,0 +2,9 @@
+Mon Dec 10 20:41:14 CET 2007 - bwalle@suse.de
+
+- update to upstream SVN version 1415
+ o Add zfcp debug view.
+ o The page table walk is done now only according to the s390
+ architecture without assumptions on the implementation in the
+ kernel.
+
+-------------------------------------------------------------------
Old:
----
lkcdutils-svn-r1411.tar.bz2
New:
----
lkcdutils-svn-r1415.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ lcrash.spec ++++++
--- /var/tmp/diff_new_pack.x26640/_old 2007-12-11 00:04:31.000000000 +0100
+++ /var/tmp/diff_new_pack.x26640/_new 2007-12-11 00:04:31.000000000 +0100
@@ -1,5 +1,5 @@
#
-# spec file for package lcrash (Version 7.0.1_1411)
+# spec file for package lcrash (Version 7.0.1_1415)
#
# Copyright (c) 2007 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -19,7 +19,7 @@
BuildRequires: glib2-devel popt-devel zlib-devel
BuildRequires: bison flex module-init-tools ncurses-devel
Summary: Linux Kernel Crash Dump (LKCD) Utilities
-Version: 7.0.1_1411
+Version: 7.0.1_1415
Release: 1
%define sourcename lkcdutils
%define svnversion %(echo %{version} | cut -d _ -f 2)
@@ -145,7 +145,14 @@
%defattr(-,root,root)
%doc ./docs/lkcd_tutorial.pdf
%doc ./docs/lcrash/lcrash-howto/lcrash.pdf
+
%changelog
+* Mon Dec 10 2007 - bwalle@suse.de
+- update to upstream SVN version 1415
+ o Add zfcp debug view.
+ o The page table walk is done now only according to the s390
+ architecture without assumptions on the implementation in the
+ kernel.
* Wed Oct 17 2007 - bwalle@suse.de
- update to upstream SVN version 1411
o Close a hole in task_has_cpu() that can cause memory bloat
++++++ lkcdutils-svn-r1411.tar.bz2 -> lkcdutils-svn-r1415.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/lkcdutils-svn-r1411/lcrash/cmds/cmd_dbf_s390.c new/lkcdutils-svn-r1415/lcrash/cmds/cmd_dbf_s390.c
--- old/lkcdutils-svn-r1411/lcrash/cmds/cmd_dbf_s390.c 2006-06-07 11:09:44.000000000 +0200
+++ new/lkcdutils-svn-r1415/lcrash/cmds/cmd_dbf_s390.c 2007-11-05 13:45:26.000000000 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: cmd_dbf_s390.c 1280 2006-06-07 09:09:44Z holzheu $
+ * $Id: cmd_dbf_s390.c 1412 2007-11-05 12:45:26Z holzheu $
*
* This file is part of lcrash, an analysis tool for Linux memory dumps.
*
@@ -33,17 +33,13 @@
#define LOAD_FLAG (1 << C_LFLG_SHFT)
#define VIEWS_FLAG (2 << C_LFLG_SHFT)
-#ifndef MIN
-#define MIN(a,b) (((a)<(b))?(a):(b))
-#endif
-
/* Stuff which has to match with include/asm-s390/debug.h */
#define DBF_VERSION_V1 1
#define DBF_VERSION_V2 2
#define PAGE_SIZE 4096
#define DEBUG_MAX_VIEWS 10 /* max number of views in proc fs */
-#define DEBUG_MAX_PROCF_LEN 16 /* max length for a proc file name */
+#define DEBUG_MAX_PROCF_LEN 64 /* max length for a proc file name */
#define DEBUG_SPRINTF_MAX_ARGS 10
/* define debug-structures for lcrash */
@@ -51,6 +47,8 @@
typedef struct debug_view_s debug_view_t;
+struct debug_view_s zfcp_view;
+
/* struct to hold contents of struct __debug_entry from dump
*/
typedef struct debug_entry_s{
@@ -531,7 +529,6 @@
&sprintf_format_fn,
};
-
static debug_entry_t *
debug_find_oldest_entry(debug_entry_t *entries, int num, int entry_size)
{
@@ -685,8 +682,7 @@
return NULL;
}
-static void
-dbf_init(void)
+static void dbf_init(void)
{
if (!initialized) {
if(dbf_version >= DBF_VERSION_V2)
@@ -698,6 +694,8 @@
add_lcrash_debug_view(&hex_ascii_view);
add_lcrash_debug_view(&sprintf_view);
add_lcrash_debug_view(&raw_view);
+ add_lcrash_debug_view(&zfcp_view);
+
ebcdic_ascii_conv = iconv_open("ISO-8859-1", "EBCDIC-US");
initialized = 1;
}
@@ -1189,3 +1187,647 @@
}
return (0);
}
+
+/*
+ * stuff for zfcp's structured view
+ */
+#define DBF_TAG_SIZE 4
+
+struct dbf_rec_header {
+ uint8_t tag[DBF_TAG_SIZE];
+ uint8_t tag2[DBF_TAG_SIZE];
+} __attribute__ ((packed));
+
+struct dbf_rec_dump {
+ uint8_t tag[DBF_TAG_SIZE];
+ uint32_t total_size;
+ uint32_t offset;
+ uint32_t size;
+ uint8_t data[];
+} __attribute__ ((packed));
+
+static int dbf_stck(char *, const char *, unsigned long long);
+static int dbf_tag(char *, const char *, const char *);
+static int dbf_view(char *, const char *, const char *, ...);
+static int dbf_view_dump(char *, const char *, char *, int, int, int);
+
+#define TAG(t) (const char*) (t)
+#define BYTE(x) KL_GET_UINT8(&x)
+#define VAL16(x) KL_GET_UINT16(&x)
+#define VAL32(x) KL_GET_UINT32(&x)
+#define VAL64(x) KL_GET_UINT64(&x)
+#define is_tag(t,m) (strncmp(TAG(t),m,DBF_TAG_SIZE) == 0)
+
+#define QTCB_FCP_CMND 0x00000001
+#define QTCB_ABORT_FCP_CMND 0x00000002
+#define QTCB_OPEN_PORT_WITH_DID 0x00000005
+#define QTCB_OPEN_LUN 0x00000006
+#define QTCB_CLOSE_LUN 0x00000007
+#define QTCB_CLOSE_PORT 0x00000008
+#define QTCB_CLOSE_PHYSICAL_PORT 0x00000009
+#define QTCB_SEND_ELS 0x0000000B
+#define QTCB_SEND_GENERIC 0x0000000C
+#define QTCB_EXCHANGE_CONFIG_DATA 0x0000000D
+#define QTCB_EXCHANGE_PORT_DATA 0x0000000E
+#define QTCB_DOWNLOAD_CONTROL_FILE 0x00000012
+#define QTCB_UPLOAD_CONTROL_FILE 0x00000013
+
+#define PROT_STATUS_QUAL_SIZE 16
+#define STATUS_QUALIFIER_SIZE 16
+
+struct queue_designator {
+ uint8_t cssid;
+ uint8_t chpid;
+ uint8_t hla;
+ uint8_t ua;
+ uint32_t res1;
+} __attribute__ ((packed));
+
+struct zfcp_rec_erp {
+ uint8_t tag[DBF_TAG_SIZE];
+ uint8_t tag2[DBF_TAG_SIZE];
+ union {
+ struct {
+ uint32_t dbg_info;
+ uint32_t action;
+ uint32_t status;
+ uint32_t step;
+ uint64_t adapter;
+ uint64_t port;
+ uint64_t unit;
+ uint64_t fsf_req;
+ } erp;
+ struct {
+ uint64_t ccw_device;
+ } ccw;
+ struct {
+ uint32_t dbg_info;
+ uint32_t adapter_status;
+ } adapter;
+ struct {
+ uint32_t dbg_info;
+ uint32_t adapter_status;
+ uint32_t port_status;
+ uint64_t port;
+ } port;
+ struct {
+ uint32_t dbg_info;
+ uint32_t adapter_status;
+ uint32_t port_status;
+ uint32_t unit_status;
+ uint64_t port;
+ uint64_t unit;
+ } unit;
+ } data;
+} __attribute__ ((packed));
+
+struct zfcp_rec_hba_resp {
+ uint32_t command;
+ uint64_t reqid;
+ uint32_t seqno;
+ uint64_t issued;
+ uint32_t prot_status;
+ uint32_t status;
+ uint8_t prot_status_qual[PROT_STATUS_QUAL_SIZE];
+ uint8_t status_qual[STATUS_QUALIFIER_SIZE];
+ uint32_t req_status;
+ uint8_t sbal_first;
+ uint8_t sbal_curr;
+ uint8_t sbal_last;
+ uint8_t pool;
+ uint64_t erp_action;
+ union {
+ struct {
+ uint64_t scsi_cmnd;
+ uint64_t scsi_serial;
+ } fcp;
+ struct {
+ uint64_t reqid;
+ uint32_t seqno;
+ } abort;
+ struct {
+ uint64_t wwpn;
+ uint32_t d_id;
+ uint32_t port_handle;
+ } port;
+ struct {
+ uint64_t wwpn;
+ uint64_t fcp_lun;
+ uint32_t port_handle;
+ uint32_t lun_handle;
+ } unit;
+ struct {
+ uint32_t d_id;
+ uint8_t ls_code;
+ } els;
+ } data;
+} __attribute__ ((packed));
+
+struct zfcp_rec_hba_status {
+ uint8_t failed;
+ uint32_t status_type;
+ uint32_t status_subtype;
+ struct queue_designator queue_designator;
+} __attribute__ ((packed));
+
+struct zfcp_rec_hba_qdio {
+ uint32_t status;
+ uint32_t qdio_error;
+ uint32_t siga_error;
+ uint8_t sbal_index;
+ uint8_t sbal_count;
+} __attribute__ ((packed));
+
+struct zfcp_rec_hba {
+ uint8_t tag[DBF_TAG_SIZE];
+ uint8_t tag2[DBF_TAG_SIZE];
+ union {
+ struct zfcp_rec_hba_resp resp;
+ struct zfcp_rec_hba_status status;
+ struct zfcp_rec_hba_qdio qdio;
+ } type;
+} __attribute__ ((packed));
+
+#define DBF_CT_PAYLOAD 24
+struct zfcp_rec_san_ct {
+ union {
+ struct {
+ uint16_t cmd_code;
+ uint8_t rev;
+ uint8_t gs_type;
+ uint8_t gs_subtype;
+ uint8_t options;
+ uint16_t max_res_size;
+ } req;
+ struct {
+ uint16_t rsp_code;
+ uint8_t rev;
+ uint8_t rc;
+ uint8_t rc_expl;
+ uint8_t vendor_unique;
+ } resp;
+ } type;
+ uint32_t payload_size;
+ uint8_t payload[DBF_CT_PAYLOAD];
+} __attribute__ ((packed));
+
+#define DBF_ELS_PAYLOAD 32
+#define DBF_ELS_MAX_PAYLOAD 1024
+struct zfcp_rec_san_els {
+ uint8_t ls_code;
+ uint32_t payload_size;
+ uint8_t payload[DBF_ELS_PAYLOAD];
+} __attribute__ ((packed));
+
+struct zfcp_rec_san {
+ uint8_t tag[DBF_TAG_SIZE];
+ uint64_t reqid;
+ uint32_t seqno;
+ uint32_t s_id;
+ uint32_t d_id;
+ union {
+ struct zfcp_rec_san_ct ct;
+ struct zfcp_rec_san_els els;
+ } type;
+} __attribute__ ((packed));
+
+#define DBF_SCSI_OPCODE 16
+#define DBF_SCSI_FCP_SNS_INFO 16
+struct zfcp_rec_scsi {
+ uint8_t tag[DBF_TAG_SIZE];
+ uint8_t tag2[DBF_TAG_SIZE];
+ uint32_t scsi_id;
+ uint32_t scsi_lun;
+ uint32_t scsi_result;
+ uint64_t scsi_cmnd;
+ uint64_t scsi_serial;
+ uint8_t scsi_opcode[DBF_SCSI_OPCODE];
+ uint8_t scsi_retries;
+ uint8_t scsi_allowed;
+ uint64_t reqid;
+ uint32_t seqno;
+ uint64_t issued;
+ union {
+ uint64_t old_reqid;
+ struct {
+ uint8_t rsp_validity;
+ uint8_t rsp_status;
+ uint32_t rsp_resid;
+ uint8_t rsp_code;
+ uint32_t sns_info_len;
+ uint8_t sns_info[DBF_SCSI_FCP_SNS_INFO];
+ } fcp;
+ } type;
+} __attribute__ ((packed));
+
+int dbf_tag(char *buf, const char *label, const char *tag)
+{
+ int i = 0, j;
+
+ i += sprintf(buf+i, "%-24s", label);
+ for (j = 0; j < DBF_TAG_SIZE; j++)
+ i += sprintf(buf+i, "%c", tag[j]);
+ i += sprintf(buf+i, "\n");
+
+ return i;
+}
+
+int dbf_view(char *buf, const char *label, const char *format, ...)
+{
+ va_list arg;
+ int i = 0;
+
+ i += sprintf(buf+i, "%-24s", label);
+ va_start(arg, format);
+ i += vsprintf(buf+i, format, arg);
+ va_end(arg);
+ i += sprintf(buf+i, "\n");
+
+ return i;
+}
+
+int dbf_view_dump(char *buf, const char *label,
+ char *buffer, int buflen, int offset, int total_size)
+{
+ int i = 0;
+
+ if (offset == 0)
+ i += sprintf(buf+i, "%-24s ", label);
+
+ while (buflen--) {
+ if (offset > 0) {
+ if ((offset % 32) == 0)
+ i += sprintf(buf+i, "\n%-24c ", ' ');
+ else if ((offset % 4) == 0)
+ i += sprintf(buf+i, " ");
+ }
+ i += sprintf(buf+i, "%02x", *buffer++);
+ if (++offset == total_size) {
+ i += sprintf(buf+i, "\n");
+ break;
+ }
+ }
+
+ if (total_size == 0)
+ i += sprintf(buf+i, "\n");
+
+ return i;
+}
+
+int zfcp_erp_action(char *buf, struct zfcp_rec_erp *rec)
+{
+ int i = 0;
+ i += dbf_tag(buf+i, "tag", TAG(rec->tag));
+ i += dbf_tag(buf+i, "tag2", TAG(rec->tag2));
+ i += dbf_view(buf+i, "debug_info", "0x%08x",
+ VAL32(rec->data.erp.dbg_info));
+ i += dbf_view(buf+i, "action", "0x%08x", VAL32(rec->data.erp.action));
+ i += dbf_view(buf+i, "step", "0x%08x", VAL32(rec->data.erp.step));
+ i += dbf_view(buf+i, "status", "0x%08x", VAL32(rec->data.erp.status));
+ i += dbf_view(buf+i, "adapter", "0x%0Lx", VAL64(rec->data.erp.adapter));
+ i += dbf_view(buf+i, "port", "0x%0Lx", VAL64(rec->data.erp.port));
+ i += dbf_view(buf+i, "unit", "0x%0Lx", VAL64(rec->data.erp.unit));
+ i += dbf_view(buf+i, "fsf_req", "0x%0Lx", VAL64(rec->data.erp.fsf_req));
+ return i;
+}
+
+int zfcp_erp_ccw(char *buf, struct zfcp_rec_erp *rec)
+{
+ int i = 0;
+ i += dbf_tag(buf+i, "tag", TAG(rec->tag));
+ i += dbf_tag(buf+i, "tag2", TAG(rec->tag2));
+ return i;
+}
+
+int zfcp_erp_adapter(char *buf, struct zfcp_rec_erp *rec)
+{
+ int i = 0;
+ i += dbf_tag(buf+i, "tag", TAG(rec->tag));
+ i += dbf_tag(buf+i, "tag2", TAG(rec->tag2));
+ i += dbf_view(buf+i, "debug_info", "0x%08x",
+ VAL32(rec->data.adapter.dbg_info));
+ i += dbf_view(buf+i, "adapter_status", "0x%08x",
+ VAL32(rec->data.adapter.adapter_status));
+ return i;
+}
+
+int zfcp_erp_port(char *buf, struct zfcp_rec_erp *rec)
+{
+ int i = 0;
+ i += dbf_tag(buf+i, "tag", TAG(rec->tag));
+ i += dbf_tag(buf+i, "tag2", TAG(rec->tag2));
+ i += dbf_view(buf+i, "debug_info", "0x%08x",
+ VAL32(rec->data.port.dbg_info));
+ i += dbf_view(buf+i, "adapter_status", "0x%08x",
+ VAL32(rec->data.port.adapter_status));
+ i += dbf_view(buf+i, "port_status", "0x%08x",
+ VAL32(rec->data.port.port_status));
+ i += dbf_view(buf+i, "port", "0x%0Lx", VAL32(rec->data.port.port));
+ return i;
+}
+
+int zfcp_erp_unit(char *buf, struct zfcp_rec_erp *rec)
+{
+ int i = 0;
+ i += dbf_tag(buf+i, "tag", TAG(rec->tag));
+ i += dbf_tag(buf+i, "tag2", TAG(rec->tag2));
+ i += dbf_view(buf+i, "debug_info", "0x%08x",
+ VAL32(rec->data.unit.dbg_info));
+ i += dbf_view(buf+i, "adapter_status", "0x%08x",
+ VAL32(rec->data.unit.adapter_status));
+ i += dbf_view(buf+i, "port_status", "0x%08x",
+ VAL32(rec->data.unit.port_status));
+ i += dbf_view(buf+i, "unit_status", "0x%08x",
+ VAL32(rec->data.unit.unit_status));
+ i += dbf_view(buf+i, "port", "0x%0Lx", VAL64(rec->data.unit.port));
+ i += dbf_view(buf+i, "unit", "0x%0Lx", VAL64(rec->data.unit.unit));
+ return i;
+}
+
+#define FSFREQ_TASK_MANAGEMENT 0x00000002
+int zfcp_hba_resp(char *buf, struct zfcp_rec_hba *rec)
+{
+ struct zfcp_rec_hba_resp *resp = &rec->type.resp;
+ int i = 0;
+ i += dbf_tag(buf+i, "tag", TAG(rec->tag));
+ i += dbf_tag(buf+i, "tag2", TAG(rec->tag2));
+ i += dbf_view(buf+i, "fsf_command", "0x%08x", VAL32(resp->command));
+ i += dbf_view(buf+i, "fsf_reqid", "0x%0Lx", VAL64(resp->reqid));
+ i += dbf_view(buf+i, "fsf_seqno", "0x%08x", VAL32(resp->seqno));
+ i += dbf_stck(buf+i, "fsf_issued", VAL64(resp->issued));
+ i += dbf_view(buf+i, "fsf_prot_status", "0x%08x",
+ VAL32(resp->prot_status));
+ i += dbf_view(buf+i, "fsf_status", "0x%08x", VAL32(resp->status));
+ i += dbf_view_dump(buf+i, "fsf_prot_status_qual",
+ (char*) resp->prot_status_qual,
+ sizeof(resp->prot_status_qual),
+ 0, sizeof(resp->prot_status_qual));
+ i += dbf_view_dump(buf+i, "fsf_status_qual", (char*) resp->status_qual,
+ sizeof(resp->status_qual), 0,
+ sizeof(resp->status_qual));
+ i += dbf_view(buf+i, "fsf_req_status", "0x%08x",
+ VAL32(resp->req_status));
+ i += dbf_view(buf+i, "sbal_first", "0x%02x", BYTE(resp->sbal_first));
+ i += dbf_view(buf+i, "sbal_curr", "0x%02x", BYTE(resp->sbal_curr));
+ i += dbf_view(buf+i, "sbal_last", "0x%02x", BYTE(resp->sbal_last));
+ i += dbf_view(buf+i, "pool", "0x%02x", BYTE(resp->pool));
+
+ switch (VAL32(resp->command)) {
+ case QTCB_FCP_CMND:
+ if (VAL32(resp->req_status) & FSFREQ_TASK_MANAGEMENT)
+ break;
+ i += dbf_view(buf+i, "scsi_cmnd", "0x%0Lx",
+ VAL64(resp->data.fcp.scsi_cmnd));
+ i += dbf_view(buf+i, "scsi_serial", "0x%016Lx",
+ VAL64(resp->data.fcp.scsi_serial));
+ break;
+ case QTCB_ABORT_FCP_CMND:
+ i += dbf_view(buf+i, "abort_fsf_reqid", "0x%0Lx",
+ VAL64(resp->data.abort.reqid));
+ i += dbf_view(buf+i, "abort_fsf_seqno", "0x%08x",
+ VAL32(resp->data.abort.seqno));
+ break;
+ case QTCB_OPEN_PORT_WITH_DID:
+ case QTCB_CLOSE_PORT:
+ case QTCB_CLOSE_PHYSICAL_PORT:
+ i += dbf_view(buf+i, "wwpn", "0x%016Lx",
+ VAL64(resp->data.port.wwpn));
+ i += dbf_view(buf+i, "d_id", "0x%06x",
+ VAL32(resp->data.port.d_id));
+ i += dbf_view(buf+i, "port_handle", "0x%08x",
+ VAL32(resp->data.port.port_handle));
+ break;
+ case QTCB_OPEN_LUN:
+ case QTCB_CLOSE_LUN:
+ i += dbf_view(buf+i, "wwpn", "0x%016Lx",
+ VAL64(resp->data.unit.wwpn));
+ i += dbf_view(buf+i, "fcp_lun", "0x%016Lx",
+ VAL64(resp->data.unit.fcp_lun));
+ i += dbf_view(buf+i, "port_handle", "0x%08x",
+ VAL32(resp->data.unit.port_handle));
+ i += dbf_view(buf+i, "lun_handle", "0x%08x",
+ VAL32(resp->data.unit.lun_handle));
+ break;
+ case QTCB_SEND_ELS:
+ i += dbf_view(buf+i, "d_id", "0x%06x",
+ VAL32(resp->data.els.d_id));
+ i += dbf_view(buf+i, "ls_code", "0x%02x",
+ BYTE(resp->data.els.ls_code));
+ break;
+ case QTCB_SEND_GENERIC:
+ case QTCB_EXCHANGE_CONFIG_DATA:
+ case QTCB_EXCHANGE_PORT_DATA:
+ case QTCB_DOWNLOAD_CONTROL_FILE:
+ case QTCB_UPLOAD_CONTROL_FILE:
+ break;
+ }
+ return i;
+}
+
+int zfcp_hba_status(char *buf, struct zfcp_rec_hba *rec)
+{
+ struct zfcp_rec_hba_status *status = &rec->type.status;
+ int i = 0;
+ i += dbf_tag(buf+i, "tag", TAG(rec->tag));
+ i += dbf_tag(buf+i, "tag2", TAG(rec->tag2));
+ i += dbf_view(buf+i, "failed", "0x%02x", BYTE(status->failed));
+ i += dbf_view(buf+i, "status_type", "0x%08x",
+ VAL32(status->status_type));
+ i += dbf_view(buf+i, "status_subtype", "0x%08x",
+ VAL32(status->status_subtype));
+ i += dbf_view_dump(buf+i, "queue_designator",
+ (char*) &status->queue_designator,
+ sizeof(status->queue_designator), 0,
+ sizeof(status->queue_designator));
+ return i;
+}
+
+int zfcp_hba_qdio(char *buf, struct zfcp_rec_hba *rec)
+{
+ struct zfcp_rec_hba_qdio *qdio = &rec->type.qdio;
+ int i = 0;
+ i += dbf_tag(buf+i, "tag", TAG(rec->tag));
+ i += dbf_view(buf+i, "status", "0x%08x", VAL32(qdio->status));
+ i += dbf_view(buf+i, "qdio_error", "0x%08x", VAL32(qdio->qdio_error));
+ i += dbf_view(buf+i, "siga_error", "0x%08x", VAL32(qdio->siga_error));
+ i += dbf_view(buf+i, "sbal_index", "0x%02x", BYTE(qdio->sbal_index));
+ i += dbf_view(buf+i, "sbal_count", "0x%02x", BYTE(qdio->sbal_count));
+ return i;
+}
+
+int zfcp_san(char *buf, struct zfcp_rec_san *rec)
+{
+ char *buffer = NULL;
+ int buflen = 0, total = 0;
+ int i = 0;
+ i += dbf_tag(buf+i, "tag", TAG(rec->tag));
+ i += dbf_view(buf+i, "fsf_reqid", "0x%0Lx", VAL64(rec->reqid));
+ i += dbf_view(buf+i, "fsf_seqno", "0x%08x", VAL32(rec->seqno));
+ i += dbf_view(buf+i, "s_id", "0x%06x", VAL32(rec->s_id));
+ i += dbf_view(buf+i, "d_id", "0x%06x", VAL32(rec->d_id));
+
+ if (is_tag(rec->tag, "octc")) {
+ i += dbf_view(buf+i, "cmd_req_code", "0x%04x",
+ VAL16(rec->type.ct.type.req.cmd_code));
+ i += dbf_view(buf+i, "revision", "0x%02x",
+ BYTE(rec->type.ct.type.req.rev));
+ i += dbf_view(buf+i, "gs_type", "0x%02x",
+ BYTE(rec->type.ct.type.req.gs_type));
+ i += dbf_view(buf+i, "gs_subtype", "0x%02x",
+ BYTE(rec->type.ct.type.req.gs_subtype));
+ i += dbf_view(buf+i, "options", "0x%02x",
+ BYTE(rec->type.ct.type.req.options));
+ i += dbf_view(buf+i, "max_res_size", "0x%04x",
+ VAL16(rec->type.ct.type.req.max_res_size));
+ total = VAL32(rec->type.ct.payload_size);
+ buffer = (char*) rec->type.ct.payload;
+ buflen = MIN(total, DBF_CT_PAYLOAD);
+ } else if (is_tag(rec->tag, "rctc")) {
+ i += dbf_view(buf+i, "cmd_rsp_code", "0x%04x",
+ VAL16(rec->type.ct.type.resp.rsp_code));
+ i += dbf_view(buf+i, "revision", "0x%02x",
+ BYTE(rec->type.ct.type.resp.rev));
+ i += dbf_view(buf+i, "reason_code", "0x%02x",
+ BYTE(rec->type.ct.type.resp.rc));
+ i += dbf_view(buf+i, "reason_code_expl", "0x%02x",
+ BYTE(rec->type.ct.type.resp.rc_expl));
+ i += dbf_view(buf+i, "vendor_unique", "0x%02x",
+ BYTE(rec->type.ct.type.resp.vendor_unique));
+ total = VAL32(rec->type.ct.payload_size);
+ buffer = (char*) rec->type.ct.payload;
+ buflen = MIN(total, DBF_CT_PAYLOAD);
+ } else if (is_tag(rec->tag, "oels") || is_tag(rec->tag, "rels") ||
+ is_tag(rec->tag, "iels")) {
+ i += dbf_view(buf+i, "ls_code", "0x%02x",
+ BYTE(rec->type.els.ls_code));
+ total = VAL32(rec->type.els.payload_size);
+ buffer = (char*) rec->type.els.payload;
+ buflen = MIN(total, DBF_ELS_PAYLOAD);
+ }
+ i += dbf_view_dump(buf+i, "payload", buffer, buflen, 0, total);
+ if (buflen == total)
+ i += sprintf(buf+i, "\n");
+ return i;
+}
+
+int zfcp_scsi(char *buf, struct zfcp_rec_scsi *rec)
+{
+ int i = 0;
+ i += dbf_tag(buf+i, "tag", TAG(rec->tag));
+ i += dbf_tag(buf+i, "tag2", TAG(rec->tag2));
+ i += dbf_view(buf+i, "scsi_id", "0x%08x", VAL32(rec->scsi_id));
+ i += dbf_view(buf+i, "scsi_lun", "0x%08x", VAL32(rec->scsi_lun));
+ i += dbf_view(buf+i, "scsi_result", "0x%08x", VAL32(rec->scsi_result));
+ i += dbf_view(buf+i, "scsi_cmnd", "0x%0Lx", VAL64(rec->scsi_cmnd));
+ i += dbf_view(buf+i, "scsi_serial", "0x%016Lx",
+ VAL64(rec->scsi_serial));
+ i += dbf_view_dump(buf+i, "scsi_opcode", (char*) rec->scsi_opcode,
+ DBF_SCSI_OPCODE, 0, DBF_SCSI_OPCODE);
+ i += dbf_view(buf+i, "scsi_retries", "0x%02x", BYTE(rec->scsi_retries));
+ i += dbf_view(buf+i, "scsi_allowed", "0x%02x", BYTE(rec->scsi_allowed));
+ if (is_tag(rec->tag, "abrt"))
+ i += dbf_view(buf+i, "old_fsf_reqid", "0x%0Lx",
+ VAL64(rec->type.old_reqid));
+ i += dbf_view(buf+i, "fsf_reqid", "0x%0Lx", VAL64(rec->reqid));
+ i += dbf_view(buf+i, "fsf_seqno", "0x%08x", VAL32(rec->seqno));
+ i += dbf_stck(buf+i, "fsf_issued", VAL64(rec->issued));
+ if (is_tag(rec->tag, "rslt")) {
+ i += dbf_view(buf+i, "fcp_rsp_validity", "0x%02x",
+ BYTE(rec->type.fcp.rsp_validity));
+ i += dbf_view(buf+i, "fcp_rsp_scsi_status", "0x%02x",
+ BYTE(rec->type.fcp.rsp_status));
+ i += dbf_view(buf+i, "fcp_rsp_resid", "0x%08x",
+ VAL32(rec->type.fcp.rsp_resid));
+ i += dbf_view(buf+i, "fcp_rsp_code", "0x%02x",
+ BYTE(rec->type.fcp.rsp_code));
+ i += dbf_view(buf+i, "fcp_sns_info_len", "0x%08x",
+ VAL32(rec->type.fcp.sns_info_len));
+ i += dbf_view_dump(buf+i, "fcp_sns_info",
+ (char*) rec->type.fcp.sns_info,
+ MIN((int) VAL32(rec->type.fcp.sns_info_len),
+ DBF_SCSI_FCP_SNS_INFO), 0,
+ VAL32(rec->type.fcp.sns_info_len));
+ }
+ return i;
+}
+
+int structured_header_fn(debug_info_t *id, debug_view_t *view, int area,
+ debug_entry_t *entry, char *buf)
+{
+ struct dbf_rec_dump *dump = (struct dbf_rec_dump*) DEBUG_DATA(entry);
+ int total_size = VAL32(dump->total_size);
+ int offset = VAL32(dump->offset);
+ int size = VAL32(dump->size);
+ int i = 0;
+ if (!is_tag(dump->tag, "dump")) {
+ i += dbf_stck(buf+i, "timestamp", entry->id.stck);
+ i += dbf_view(buf+i, "cpu", "%02i", entry->id.fields.cpuid);
+ } else {
+ i += dbf_view_dump(buf+i, NULL, (char*) dump->data, size,
+ offset, total_size);
+ if ((offset + size) == total_size)
+ i += sprintf(buf+i, "\n");
+ }
+ return i;
+}
+
+int structured_format_fn(debug_info_t *id, debug_view_t *view,
+ char *buf, const char *in_buf)
+{
+ struct dbf_rec_header *rec = (struct dbf_rec_header*) in_buf;
+ int i = 0;
+
+ if (is_tag(rec->tag, "dump"))
+ return 0;
+ else if (is_tag(rec->tag, "actn"))
+ i += zfcp_erp_action(buf+i, (struct zfcp_rec_erp*) rec);
+ else if (is_tag(rec->tag, "ccwn"))
+ i += zfcp_erp_ccw(buf+i, (struct zfcp_rec_erp*) rec);
+ else if (is_tag(rec->tag, "adap"))
+ i += zfcp_erp_adapter(buf+i, (struct zfcp_rec_erp*) rec);
+ else if (is_tag(rec->tag, "port"))
+ i += zfcp_erp_port(buf+i, (struct zfcp_rec_erp*) rec);
+ else if (is_tag(rec->tag, "unit"))
+ i += zfcp_erp_unit(buf+i, (struct zfcp_rec_erp*) rec);
+ else if (is_tag(rec->tag, "resp"))
+ i += zfcp_hba_resp(buf+i, (struct zfcp_rec_hba*) rec);
+ else if (is_tag(rec->tag, "stat"))
+ i += zfcp_hba_status(buf+i, (struct zfcp_rec_hba*) rec);
+ else if (is_tag(rec->tag, "qdio"))
+ i += zfcp_hba_qdio(buf+i, (struct zfcp_rec_hba*) rec);
+ else if (is_tag(rec->tag, "octc") || is_tag(rec->tag, "rctc") ||
+ is_tag(rec->tag, "oels") || is_tag(rec->tag, "rels") ||
+ is_tag(rec->tag, "iels"))
+ i += zfcp_san(buf+i, (struct zfcp_rec_san*) rec);
+ else if (is_tag(rec->tag, "rslt") || is_tag(rec->tag, "abrt") ||
+ is_tag(rec->tag, "trst") || is_tag(rec->tag, "lrst"))
+ i += zfcp_scsi(buf+i, (struct zfcp_rec_scsi*) rec);
+
+ i += sprintf(buf+i, "\n");
+ return i;
+}
+
+int dbf_stck(char *buf, const char *label, unsigned long long stck)
+{
+ unsigned long long sec;
+ struct timespec xtime;
+ int i = 0;
+
+ stck -= 0x8126d60e46000000LL - (0x3c26700LL * 1000000 * 4096);
+ sec = stck >> 12;
+ sec/=1000000;
+ xtime.tv_sec = sec;
+ stck -= (sec * 1000000) << 12;
+ xtime.tv_nsec = ((stck * 1000) >> 12);
+ i += sprintf(buf+i, "%-24s%011lu:%06lu\n", label, xtime.tv_sec,
+ xtime.tv_nsec);
+ return i;
+}
+
+struct debug_view_s zfcp_view = {
+ "structured",
+ NULL,
+ &structured_header_fn,
+ &structured_format_fn,
+ NULL
+};
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/lkcdutils-svn-r1411/lib/libklib/include/kl_mem_s390.h new/lkcdutils-svn-r1415/lib/libklib/include/kl_mem_s390.h
--- old/lkcdutils-svn-r1411/lib/libklib/include/kl_mem_s390.h 2004-12-22 00:26:23.000000000 +0100
+++ new/lkcdutils-svn-r1415/lib/libklib/include/kl_mem_s390.h 2007-11-15 19:06:10.000000000 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: kl_mem_s390.h 1122 2004-12-21 23:26:23Z tjm $
+ * $Id: kl_mem_s390.h 1415 2007-11-15 18:06:10Z holzheu $
*
* This file is part of libklib.
* A library which provides access to Linux system kernel dumps.
@@ -28,51 +28,6 @@
#define KL_PAGE_SIZE_S390 (1UL << KL_PAGE_SHIFT_S390)
#define KL_PAGE_MASK_S390 (~(KL_PAGE_SIZE_S390-1))
-#define KL_PGDIR_SHIFT_S390 20
-#define KL_PGDIR_SIZE_S390 (1UL << KL_PGDIR_SHIFT_S390)
-#define KL_PGDIR_MASK_S390 (~(KL_PGDIR_SIZE_S390-1))
-
-#define KL_PMD_SHIFT_S390 KL_PGDIR_SHIFT_S390
-#define KL_PMD_SIZE_S390 KL_PGDIR_SIZE_S390
-#define KL_PMD_MASK_S390 KL_PGDIR_MASK_S390
-
-#define KL_PTRS_PER_PGD_S390 2048
-#define KL_PTRS_PER_PMD_S390 1
-#define KL_PTRS_PER_PTE_S390 256
-
-#define KL_PMD_BASE_MASK_S390 (~((1UL<<6)-1))
-#define KL_PT_BASE_MASK_S390 KL_PMD_BASE_MASK_S390
-#define KL_PAGE_BASE_MASK_S390 (~((1UL<<12)-1))
-
-/* Flags used in entries of page dirs and page tables.
- */
-#define KL_PAGE_PRESENT_S390 0x001 /* set: loaded in physical memory
- * clear: not loaded in physical mem */
-#define KL_PAGE_RO_S390 0x200 /* HW read-only */
-#define KL_PAGE_INVALID_S390 0x400 /* HW invalid */
-#define KL_PAGE_INVALID_MASK_S390 0x601ULL /* for linux 2.6 */
-#define KL_PAGE_INVALID_NONE_S390 0x401ULL /* for linux 2.6 */
-#define KL_PAGE_TABLE_LEN_S390 0xf /* only full page-tables */
-#define KL_PAGE_TABLE_INV_S390 0x20 /* invalid page-table */
-
-/* bit 0 must be zero in a segment table entry */
-#define KL_PMD_INVALID_MASK_S390 (0x80000000)
-#define KL_PMD_INVALID_S390(x) ((x) & KL_PMD_INVALID_MASK_S390)
-
-/* bits 0, 20, 23 must contain zeroes in a pte*/
-#define KL_PTE_INVALID_MASK_S390 0x80000900
-#define KL_PTE_INVALID_S390(x) ((x) & KL_PTE_INVALID_MASK_S390)
-
-/* pgd/pmd/pte query functions */
-#define kl_pmd_none_s390(x) ((x) & KL_PAGE_TABLE_INV_S390)
-#define kl_pmd_bad_s390(x) (((x) & (~KL_PMD_BASE_MASK_S390 & \
- ~KL_PAGE_TABLE_INV_S390)) != \
- KL_PAGE_TABLE_LEN_S390)
-
-#define kl_pte_none_s390(x) (((x) & (KL_PAGE_INVALID_S390 | KL_PAGE_RO_S390 | \
- KL_PAGE_PRESENT_S390)) == \
- KL_PAGE_INVALID_S390)
-
/* functions needed for dump architecture specific memory mapping */
kaddr_t kl_mmap_virtop_s390(
kaddr_t vaddr /* kernel virtual address */,
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/lkcdutils-svn-r1411/lib/libklib/include/kl_mem_s390x.h new/lkcdutils-svn-r1415/lib/libklib/include/kl_mem_s390x.h
--- old/lkcdutils-svn-r1411/lib/libklib/include/kl_mem_s390x.h 2004-12-22 00:26:23.000000000 +0100
+++ new/lkcdutils-svn-r1415/lib/libklib/include/kl_mem_s390x.h 2007-11-15 19:06:10.000000000 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: kl_mem_s390x.h 1122 2004-12-21 23:26:23Z tjm $
+ * $Id: kl_mem_s390x.h 1415 2007-11-15 18:06:10Z holzheu $
*
* This file is part of libklib.
* A library which provides access to Linux system kernel dumps.
@@ -28,62 +28,6 @@
#define KL_PAGE_SIZE_S390X (1ULL << KL_PAGE_SHIFT_S390X)
#define KL_PAGE_MASK_S390X (~(KL_PAGE_SIZE_S390X-1))
-#define KL_PGDIR_SHIFT_S390X 31
-#define KL_PGDIR_SIZE_S390X (1ULL << KL_PGDIR_SHIFT_S390X)
-#define KL_PGDIR_MASK_S390X (~(KL_PGDIR_SIZE_S390X-1))
-
-#define KL_PMD_SHIFT_S390X 20
-#define KL_PMD_SIZE_S390X (1ULL << KL_PMD_SHIFT_S390X)
-#define KL_PMD_MASK_S390X (~(KL_PMD_SIZE_S390X-1))
-
-#define KL_PTRS_PER_PGD_S390X 2048
-#define KL_PTRS_PER_PMD_S390X 2048
-#define KL_PTRS_PER_PTE_S390X 256
-
-#define KL_PMD_BASE_MASK_S390X (~((1ULL<<12)-1))
-#define KL_PT_BASE_MASK_S390X (~((1ULL<<11)-1))
-#define KL_PAGE_BASE_MASK_S390X (~((1ULL<<12)-1))
-
-
-/* Flags used in entries of page dirs and page tables.
- */
-#define KL_PAGE_PRESENT_S390X 0x001ULL /* set: loaded in physical memory
- * clear: not loaded in physical mem */
-#define KL_PAGE_RO_S390X 0x200ULL /* HW read-only */
-#define KL_PAGE_INVALID_S390X 0x400ULL /* HW invalid */
-#define KL_PAGE_INVALID_MASK_S390X 0x601ULL /* for linux 2.6 */
-#define KL_PAGE_INVALID_NONE_S390X 0x401ULL /* for linux 2.6 */
-#define KL_PMD_ENTRY_INV_S390X 0x20ULL /* invalid segment table entry */
-#define KL_PGD_ENTRY_INV_S390X 0x20ULL /* invalid region table entry */
-#define KL_PMD_ENTRY_S390X 0x00
-#define KL_PGD_ENTRY_FIRST_S390X 0x05 /* first part of pmd is valid */
-#define KL_PGD_ENTRY_SECOND_S390X 0xc7 /* second part of pmd is valid */
-#define KL_PGD_ENTRY_FULL_S390X 0x07 /* complete pmd is valid */
-
-/* bits 52, 55 must contain zeroes in a pte */
-#define KL_PTE_INVALID_MASK_S390X 0x900ULL
-#define KL_PTE_INVALID_S390X(x) ((x) & KL_PTE_INVALID_MASK_S390X)
-
-/* pgd/pmd/pte query functions */
-#define kl_pgd_none_s390x(x) ((x) & KL_PGD_ENTRY_INV_S390X)
-#define kl_pgd_bad_s390x(x) !( (((x) & KL_PGD_ENTRY_FIRST_S390X) == \
- KL_PGD_ENTRY_FIRST_S390X) || \
- (((x) & KL_PGD_ENTRY_SECOND_S390X) == \
- KL_PGD_ENTRY_SECOND_S390X) || \
- (((x) & KL_PGD_ENTRY_FULL_S390X) == \
- KL_PGD_ENTRY_FULL_S390X))
-
-#define kl_pmd_none_s390x(x) ((x) & KL_PMD_ENTRY_INV_S390X)
-#define kl_pmd_bad_s390x(x) (((x) & (~KL_PT_BASE_MASK_S390X & \
- ~KL_PMD_ENTRY_INV_S390X)) != \
- KL_PMD_ENTRY_S390X)
-
-#define kl_pte_none_s390x(x) (((x) & (KL_PAGE_INVALID_S390X | \
- KL_PAGE_RO_S390X | \
- KL_PAGE_PRESENT_S390X)) == \
- KL_PAGE_INVALID_S390X)
-
-
/* functions needed for dump architecture specific memory mapping */
kaddr_t kl_mmap_virtop_s390x(
kaddr_t vaddr /* kernel virtual address */,
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/lkcdutils-svn-r1411/lib/libklib/kl_dump_s390.c new/lkcdutils-svn-r1415/lib/libklib/kl_dump_s390.c
--- old/lkcdutils-svn-r1411/lib/libklib/kl_dump_s390.c 2004-12-22 00:26:23.000000000 +0100
+++ new/lkcdutils-svn-r1415/lib/libklib/kl_dump_s390.c 2007-11-15 19:06:10.000000000 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: kl_dump_s390.c 1122 2004-12-21 23:26:23Z tjm $
+ * $Id: kl_dump_s390.c 1415 2007-11-15 18:06:10Z holzheu $
*
* This file is part of libklib.
* A library which provides access to Linux system kernel dumps.
@@ -34,15 +34,6 @@
KLP->dump->arch.pageshift = KL_PAGE_SHIFT_S390;
KLP->dump->arch.pagesize = KL_PAGE_SIZE_S390;
KLP->dump->arch.pagemask = KL_PAGE_MASK_S390;
- KLP->dump->arch.pgdshift = KL_PGDIR_SHIFT_S390;
- KLP->dump->arch.pgdsize = KL_PGDIR_SIZE_S390;
- KLP->dump->arch.pgdmask = KL_PGDIR_MASK_S390;
- KLP->dump->arch.pmdshift = KL_PMD_SHIFT_S390;
- KLP->dump->arch.pmdsize = KL_PMD_SIZE_S390;
- KLP->dump->arch.pmdmask = KL_PMD_MASK_S390;
- KLP->dump->arch.ptrsperpgd = KL_PTRS_PER_PGD_S390;
- KLP->dump->arch.ptrsperpmd = KL_PTRS_PER_PMD_S390;
- KLP->dump->arch.ptrsperpte = KL_PTRS_PER_PTE_S390;
KLP->dump->arch.kernelstack = kl_kernelstack_s390;
KLP->dump->arch.mmap_virtop = kl_mmap_virtop_s390;
KLP->dump->arch.dha_size = sizeof(kl_dump_header_s390_t);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/lkcdutils-svn-r1411/lib/libklib/kl_dump_s390x.c new/lkcdutils-svn-r1415/lib/libklib/kl_dump_s390x.c
--- old/lkcdutils-svn-r1411/lib/libklib/kl_dump_s390x.c 2004-12-22 00:26:23.000000000 +0100
+++ new/lkcdutils-svn-r1415/lib/libklib/kl_dump_s390x.c 2007-11-15 19:06:10.000000000 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: kl_dump_s390x.c 1122 2004-12-21 23:26:23Z tjm $
+ * $Id: kl_dump_s390x.c 1415 2007-11-15 18:06:10Z holzheu $
*
* This file is part of libklib.
* A library which provides access to Linux system kernel dumps.
@@ -33,15 +33,6 @@
KLP->dump->arch.pageshift = KL_PAGE_SHIFT_S390X;
KLP->dump->arch.pagesize = KL_PAGE_SIZE_S390X;
KLP->dump->arch.pagemask = KL_PAGE_MASK_S390X;
- KLP->dump->arch.pgdshift = KL_PGDIR_SHIFT_S390X;
- KLP->dump->arch.pgdsize = KL_PGDIR_SIZE_S390X;
- KLP->dump->arch.pgdmask = KL_PGDIR_MASK_S390X;
- KLP->dump->arch.pmdshift = KL_PMD_SHIFT_S390X;
- KLP->dump->arch.pmdsize = KL_PMD_SIZE_S390X;
- KLP->dump->arch.pmdmask = KL_PMD_MASK_S390X;
- KLP->dump->arch.ptrsperpgd = KL_PTRS_PER_PGD_S390X;
- KLP->dump->arch.ptrsperpmd = KL_PTRS_PER_PMD_S390X;
- KLP->dump->arch.ptrsperpte = KL_PTRS_PER_PTE_S390X;
KLP->dump->arch.kernelstack = kl_kernelstack_s390x;
KLP->dump->arch.mmap_virtop = kl_mmap_virtop_s390x;
KLP->dump->arch.dha_size = sizeof(kl_dump_header_s390_t);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/lkcdutils-svn-r1411/lib/libklib/kl_page_s390.c new/lkcdutils-svn-r1415/lib/libklib/kl_page_s390.c
--- old/lkcdutils-svn-r1411/lib/libklib/kl_page_s390.c 2004-12-22 00:26:23.000000000 +0100
+++ new/lkcdutils-svn-r1415/lib/libklib/kl_page_s390.c 2007-11-15 19:06:10.000000000 +0100
@@ -1,5 +1,5 @@
/*
- * $Id: kl_page_s390.c 1122 2004-12-21 23:26:23Z tjm $
+ * $Id: kl_page_s390.c 1415 2007-11-15 18:06:10Z holzheu $
*
* This file is part of libklib.
* A library which provides access to Linux system kernel dumps.
@@ -20,85 +20,93 @@
#include