[ofw][patches][ibbus] added support to logging to System Event Log.

Leonid Keller leonid at mellanox.co.il
Mon Jun 1 01:37:09 PDT 2009


Added macro CL_PRINT_TO_EVENT_LOG, sending a string to System Event Log.
 
    CL_PRINT_TO_EVENT_LOG(_obj_,_event_id_,_msg_)
       obj - FDO of IBBUS
       event_id - EVENT_IBBUS_ANY_ERROR, EVENT_IBBUS_ANY_WARN,
EVENT_IBBUS_ANY_INFO
       msg - (<format_string>[,param_list])
 
FDO is stored in CA object.
 
 
 
Index: V:/svn/winib/trunk/core/complib/kernel/cl_log.c
===================================================================
--- V:/svn/winib/trunk/core/complib/kernel/cl_log.c (revision 4394)
+++ V:/svn/winib/trunk/core/complib/kernel/cl_log.c (revision 4395)
@@ -29,10 +29,123 @@
  * $Id$
  */
 
-
+#include <stdarg.h>
 #include "complib/cl_log.h"
 
+WCHAR g_cl_wlog[ CL_LOG_BUF_LEN ]; 
+UCHAR g_cl_slog[ CL_LOG_BUF_LEN ]; 
 
+
+VOID
+cl_event_log_write(
+ PVOID p_io_object,
+ ULONG p_error_code,
+ ULONG p_unique_error_code,
+ ULONG p_final_status,
+ PWCHAR p_insertion_string,
+ ULONG p_n_data_items,
+ ...
+ )
+/*++
+
+Routine Description:
+    Writes an event log entry to the event log.
+
+Arguments:
+
+ p_io_object......... The IO object ( driver object or device object ).
+ p_error_code......... The error code.
+ p_unique_error_code... A specific error code.
+ p_final_status....... The final status.
+ p_n_data_items........ Number of data items.
+ .
+ . data items values
+ .
+
+Return Value:
+
+ None .
+
+--*/
+{ /* WriteEventLogEntryStr */
+
+ /* Variable argument list */    
+ va_list     l_Argptr;
+ /* Pointer to an error log entry */
+ PIO_ERROR_LOG_PACKET l_pErrorLogEntry; 
+ /* sizeof insertion string */
+ int  l_Size = (int)((p_insertion_string) ?
((wcslen(p_insertion_string) + 1) * sizeof( WCHAR )) : 0);
+ int l_PktSize
=sizeof(IO_ERROR_LOG_PACKET)+p_n_data_items*sizeof(ULONG);
+ int l_TotalSize =l_PktSize +l_Size;
+
+ if (p_io_object == NULL) {
+  ASSERT(p_io_object != NULL);
+  return;
+ }
+
+ /* Init the variable argument list */   
+ va_start(l_Argptr, p_n_data_items);
+
+ /* Allocate an error log entry */ 
+ if (l_TotalSize >= ERROR_LOG_MAXIMUM_SIZE - 2) 
+  l_TotalSize = ERROR_LOG_MAXIMUM_SIZE - 2;
+ l_pErrorLogEntry = (PIO_ERROR_LOG_PACKET)IoAllocateErrorLogEntry(
+  p_io_object,  (UCHAR)l_TotalSize );
+
+ /* Check allocation */
+ if ( l_pErrorLogEntry != NULL) 
+ { /* OK */
+
+  /* Data item index */
+  USHORT l_nDataItem ;
+
+  /* Set the error log entry header */
+  l_pErrorLogEntry->ErrorCode   = p_error_code; 
+  l_pErrorLogEntry->DumpDataSize  = (USHORT)
(p_n_data_items*sizeof(ULONG)); 
+  l_pErrorLogEntry->SequenceNumber = 0; 
+  l_pErrorLogEntry->MajorFunctionCode = 0; 
+  l_pErrorLogEntry->IoControlCode  = 0; 
+  l_pErrorLogEntry->RetryCount  = 0; 
+  l_pErrorLogEntry->UniqueErrorValue = p_unique_error_code; 
+  l_pErrorLogEntry->FinalStatus  = p_final_status; 
+
+  /* Insert the data items */
+  for (l_nDataItem = 0; l_nDataItem < p_n_data_items; l_nDataItem++) 
+  { /* Inset a data item */
+
+   /* Current data item */
+   int l_CurDataItem ;
+    
+   /* Get next data item */
+   l_CurDataItem = va_arg( l_Argptr, int);
+
+   /* Put it into the data array */
+   l_pErrorLogEntry->DumpData[l_nDataItem] = l_CurDataItem ;
+
+  } /* Inset a data item */
+
+  /* add insertion string */
+  if (p_insertion_string) {
+   char *ptr; 
+   int sz = min( l_TotalSize - l_PktSize, l_Size );
+   l_pErrorLogEntry->NumberOfStrings = 1;
+   l_pErrorLogEntry->StringOffset = sizeof(IO_ERROR_LOG_PACKET) +
l_pErrorLogEntry->DumpDataSize;
+   ptr = (char*)l_pErrorLogEntry + l_pErrorLogEntry->StringOffset;
+   memcpy( ptr, p_insertion_string, sz );
+   *(WCHAR*)&ptr[sz - 2] = (WCHAR)0;
+  }
+  
+  /* Write the packet */
+  IoWriteErrorLogEntry(l_pErrorLogEntry);
+
+ } /* OK */
+
+ /* Term the variable argument list */   
+ va_end(l_Argptr);
+
+} /* WriteEventLogEntry */
+
+
 /*
  * The IO Object required to allocate an event log entry is passed in
  * via the "name" parameter.
Index: V:/svn/winib/trunk/core/bus/kernel/bus_ev_log.mc
===================================================================
--- V:/svn/winib/trunk/core/bus/kernel/bus_ev_log.mc (revision 0)
+++ V:/svn/winib/trunk/core/bus/kernel/bus_ev_log.mc (revision 4395)
@@ -0,0 +1,56 @@
+;/*++
+;======================================================================
=======
+;Copyright (c) 2009 Mellanox Technologies
+;
+;Module Name:
+;
+;    bus_ev_log.mc
+;
+;Abstract:
+;
+;    IB Driver event log messages
+;
+;Authors:
+;
+;    Leonid Keller
+;
+;Environment:
+;
+;   Kernel Mode .
+;
+;======================================================================
=======
+;--*/
+;
+MessageIdTypedef = NTSTATUS
+
+SeverityNames = (
+ Success   = 0x0:STATUS_SEVERITY_SUCCESS
+ Informational = 0x1:STATUS_SEVERITY_INFORMATIONAL
+ Warning   = 0x2:STATUS_SEVERITY_WARNING
+ Error   = 0x3:STATUS_SEVERITY_ERROR
+ )
+
+FacilityNames = (
+ System   = 0x0
+ RpcRuntime  = 0x2:FACILITY_RPC_RUNTIME
+ RpcStubs  = 0x3:FACILITY_RPC_STUBS
+ Io    = 0x4:FACILITY_IO_ERROR_CODE
+ IBBUS   = 0x9:FACILITY_IB_ERROR_CODE
+ )
+
+
+MessageId=0x0001 Facility=IBBUS Severity=Informational
SymbolicName=EVENT_IBBUS_ANY_INFO
+Language=English
+%2
+.
+
+MessageId=0x0002 Facility=IBBUS Severity=Warning
SymbolicName=EVENT_IBBUS_ANY_WARN
+Language=English
+%2
+.
+
+MessageId=0x0003 Facility=IBBUS Severity=Error
SymbolicName=EVENT_IBBUS_ANY_ERROR
+Language=English
+%2
+.
+
Index: V:/svn/winib/trunk/core/bus/kernel/SOURCES
===================================================================
--- V:/svn/winib/trunk/core/bus/kernel/SOURCES (revision 4394)
+++ V:/svn/winib/trunk/core/bus/kernel/SOURCES (revision 4395)
@@ -10,16 +10,18 @@
 
 
 SOURCES= ibbus.rc  \
+ bus_ev_log.mc  \
  bus_driver.c  \
  bus_pnp.c   \
  bus_port_mgr.c  \
  bus_iou_mgr.c
 
-INCLUDES=..\..\..\inc;..\..\..\inc\kernel;..\..\al;..\..\al\kernel;
+INCLUDES=..\..\..\inc;..\..\..\inc\kernel;..\..\al;..\..\al\kernel;..\.
.\bus\kernel\$O;
 
 C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS -DNEED_CL_OBJ
 
 TARGETLIBS= \
+    $(DDK_LIB_PATH)\ntstrsafe.lib \
  $(TARGETPATH)\*\complib.lib \
  $(TARGETPATH)\*\ibal.lib
  
Index: V:/svn/winib/trunk/core/bus/kernel/ibbus.rc
===================================================================
--- V:/svn/winib/trunk/core/bus/kernel/ibbus.rc (revision 4394)
+++ V:/svn/winib/trunk/core/bus/kernel/ibbus.rc (revision 4395)
@@ -44,4 +44,6 @@
 #define VER_INTERNALNAME_STR  "ibbus.sys"
 #define VER_ORIGINALFILENAME_STR "ibbus.sys"
 
+#include "bus_ev_log.rc"
+
 #include <common.ver>
Index: V:/svn/winib/trunk/core/al/kernel/al_mgr.c
===================================================================
--- V:/svn/winib/trunk/core/al/kernel/al_mgr.c (revision 4394)
+++ V:/svn/winib/trunk/core/al/kernel/al_mgr.c (revision 4395)
@@ -257,7 +257,8 @@
 ib_api_status_t
 ib_register_ca(
  IN  const ci_interface_t*    p_ci,
- IN  const PDEVICE_OBJECT    p_hca_dev
+ IN  const PDEVICE_OBJECT    p_hca_dev,
+ IN  const PDEVICE_OBJECT    p_fdo
  )
 {
  ib_api_status_t  status;
@@ -285,7 +286,7 @@
  }
 
  /* Construct and initialize the CA structure. */
- status = create_ci_ca( &gp_al_mgr->obj, p_ci, p_hca_dev );
+ status = create_ci_ca( &gp_al_mgr->obj, p_ci, p_hca_dev, p_fdo );
  if( status != IB_SUCCESS )
  {
   AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
Index: V:/svn/winib/trunk/core/al/kernel/SOURCES
===================================================================
--- V:/svn/winib/trunk/core/al/kernel/SOURCES (revision 4394)
+++ V:/svn/winib/trunk/core/al/kernel/SOURCES (revision 4395)
@@ -56,12 +56,13 @@
  ..\ib_common.c   \
  ..\ib_statustext.c
 
-INCLUDES=..;..\..\..\inc;..\..\..\inc\kernel;
+INCLUDES=..;..\..\..\inc;..\..\..\inc\kernel;..\..\bus\kernel\$O;
 
 C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS \
  -DEXPORT_AL_SYMBOLS
 
 TARGETLIBS= \
+    $(DDK_LIB_PATH)\ntstrsafe.lib \
  $(TARGETPATH)\*\complib.lib
 
 !IFDEF ENABLE_EVENT_TRACING
Index: V:/svn/winib/trunk/core/al/kernel/al_ci_ca.c
===================================================================
--- V:/svn/winib/trunk/core/al/kernel/al_ci_ca.c (revision 4394)
+++ V:/svn/winib/trunk/core/al/kernel/al_ci_ca.c (revision 4395)
@@ -85,7 +85,8 @@
 create_ci_ca(
  IN    al_obj_t     *p_parent_obj,
  IN  const ci_interface_t*    p_ci,
- IN  const PDEVICE_OBJECT    p_hca_dev
+ IN  const PDEVICE_OBJECT    p_hca_dev,
+ IN  const PDEVICE_OBJECT    p_fdo
  )
 {
  ib_api_status_t   status;
@@ -189,8 +190,10 @@
   return status;
  }
 
+
  /* store HCA device object into CA object */
  p_ci_ca->h_ca->p_hca_dev = p_hca_dev;
+ p_ci_ca->h_ca->p_fdo = p_fdo;
  
  /* Get a list of the port GUIDs on this CI CA. */
  status = get_port_info( p_ci_ca );
Index: V:/svn/winib/trunk/core/al/al_ca.h
===================================================================
--- V:/svn/winib/trunk/core/al/al_ca.h (revision 4394)
+++ V:/svn/winib/trunk/core/al/al_ca.h (revision 4395)
@@ -51,6 +51,7 @@
 #if defined(CL_KERNEL)
  ib_ca_handle_t   h_um_ca;
  PDEVICE_OBJECT   p_hca_dev;
+ PDEVICE_OBJECT   p_fdo;
 #endif
 
 } ib_ca_t;
Index: V:/svn/winib/trunk/core/al/al_ci_ca.h
===================================================================
--- V:/svn/winib/trunk/core/al/al_ci_ca.h (revision 4394)
+++ V:/svn/winib/trunk/core/al/al_ci_ca.h (revision 4395)
@@ -57,7 +57,8 @@
 create_ci_ca(
  IN    al_obj_t     *p_parent_obj,
  IN  const ci_interface_t*    p_ci,
- IN  const PDEVICE_OBJECT    p_hca_dev
+ IN  const PDEVICE_OBJECT    p_hca_dev,
+ IN  const PDEVICE_OBJECT    p_fdo
  );
 
 DEVICE_OBJECT*
Index: V:/svn/winib/trunk/inc/kernel/iba/ib_ci_ifc.h
===================================================================
--- V:/svn/winib/trunk/inc/kernel/iba/ib_ci_ifc.h (revision 4394)
+++ V:/svn/winib/trunk/inc/kernel/iba/ib_ci_ifc.h (revision 4395)
@@ -56,7 +56,8 @@
 typedef ib_api_status_t
 (*ib_pfn_register_ca_t)(
  IN  const ci_interface_t* const  p_ci,
- IN  const PDEVICE_OBJECT    p_hca_dev
+ IN  const PDEVICE_OBJECT    p_hca_dev,
+ IN  const PDEVICE_OBJECT    p_fdo
  );
 
 
Index: V:/svn/winib/trunk/inc/complib/cl_log.h
===================================================================
--- V:/svn/winib/trunk/inc/complib/cl_log.h (revision 4394)
+++ V:/svn/winib/trunk/inc/complib/cl_log.h (revision 4395)
@@ -43,7 +43,6 @@
 #ifndef _CL_LOG_H_
 #define _CL_LOG_H_
 
-
 #include <complib/cl_types.h>
 
 
@@ -147,9 +146,99 @@
 *********/
 
 
+/****f* Component Library: Debug Output/cl_msg_out
+* NAME
+* cl_event_log_write
+*
+* DESCRIPTION
+* The cl_event_log_write function sends a message to System Event
Logger.
+*
+* SYNOPSIS
+*/
+CL_EXPORT void
+cl_event_log_write(
+ PVOID p_io_object,
+ ULONG p_error_code,
+ ULONG p_unique_error_code,
+ ULONG p_final_status,
+ PWCHAR p_insertion_string,
+ ULONG p_n_data_items,
+  ...
+  );
+/*
+* PARAMETERS
+* p_io_object
+*  [in] The IO object ( driver object or device object ).
+* 
+* p_error_code
+*  [in] The error code.
+*
+* p_unique_error_code
+*  [in] A specific error code.
+*
+* p_final_status
+*  [in] The final status.
+*
+* p_insertion_string
+*  [in] String to print.
+*
+* p_n_data_items
+*  [in] Number of data items
+*
+* ...
+*  [in] data items values
+*
+* RETURN VALUE
+* This function does not return a value.
+*
+* NOTES
+* cl_event_log_write is available in both debug and release builds.
+*
+* The function uses IoAllocateErrorLogEntry and IoWriteErrorLogEntry
+* functions to send data to System Event Log.
+*
+* SEE ALSO
+* 
+*********/
+
 #ifdef __cplusplus
 }
 #endif
 
+#ifdef CL_KERNEL
+#include <ntddk.h>
+#define NTSTRSAFE_LIB
+#include <ntstrsafe.h>
 
+#define CL_LOG_BUF_LEN  512
+extern WCHAR g_cl_wlog[ CL_LOG_BUF_LEN ]; 
+extern UCHAR g_cl_slog[ CL_LOG_BUF_LEN ]; 
+
+static void __build_str( const char * format, ... )
+{
+ NTSTATUS status;
+ va_list p_arg;
+ va_start(p_arg, format);
+ status = RtlStringCbVPrintfA((char *)g_cl_slog, sizeof(g_cl_slog),
format , p_arg);
+ if (status)
+  goto end;
+ status = RtlStringCchPrintfW(g_cl_wlog,
sizeof(g_cl_wlog)/sizeof(g_cl_wlog[0]), L"%S", g_cl_slog);
+ if (status)
+  goto end;
+end:
+ va_end(p_arg);
+}
+
+#define CL_PRINT_TO_EVENT_LOG(_obj_,_event_id_,_msg_)  \
+ { \
+  NTSTATUS event_id = _event_id_; \
+  __build_str _msg_; \
+  cl_event_log_write( _obj_, (ULONG)event_id, 0, 0, g_cl_wlog, 0, 0 );
\
+ }
+#else
+
+#define CL_PRINT_TO_EVENT_LOG(_obj_,_event_id_,_msg_)
+
+#endif
+
 #endif /* _CL_LOG_H_ */
Index: V:/svn/winib/trunk/inc/iba/ib_ci.h
===================================================================
--- V:/svn/winib/trunk/inc/iba/ib_ci.h (revision 4394)
+++ V:/svn/winib/trunk/inc/iba/ib_ci.h (revision 4395)
@@ -2937,7 +2937,8 @@
 AL_EXPORT ib_api_status_t
 ib_register_ca (
  IN  const ci_interface_t*    p_ci,
- IN  const PDEVICE_OBJECT    p_hca_dev
+ IN  const PDEVICE_OBJECT    p_hca_dev,
+ IN  const PDEVICE_OBJECT    p_fdo
  );
 /*
 * DESCRIPTION
@@ -2954,6 +2955,8 @@
 *  vector to support verbs functionality.
 * p_hca_dev
 *  PDO of HCA device
+* p_fdo
+*  FDO of IBBUS device
 *
 * RETURN VALUE
 * IB_SUCCESS
Index: V:/svn/winib/trunk/hw/mlx4/kernel/hca/mlx4_hca.inx
===================================================================
--- V:/svn/winib/trunk/hw/mlx4/kernel/hca/mlx4_hca.inx (revision 4394)
+++ V:/svn/winib/trunk/hw/mlx4/kernel/hca/mlx4_hca.inx (revision 4395)
@@ -177,19 +177,19 @@
 
 [MLX4HCA.DDInstall.ntx86.Services]
 AddService =
mlx4_hca,%SPSVCINST_ASSOCSERVICE%,MLX4HCA.ServiceInstall,MLX4HCA.EventLo
g
-AddService = ibbus,,Ibbus.ServiceInstall
+AddService = ibbus,,Ibbus.ServiceInstall,IBBUS.EventLog
 AddService = WinVerbs,,WinVerbs.ServiceInstall
 AddService = WinMad,,WinMad.ServiceInstall
 
 [MLX4HCA.DDInstall.ntamd64.Services]
 AddService =
mlx4_hca,%SPSVCINST_ASSOCSERVICE%,MLX4HCA.ServiceInstall,MLX4HCA.EventLo
g
-AddService = ibbus,,Ibbus.ServiceInstall
+AddService = ibbus,,Ibbus.ServiceInstall,IBBUS.EventLog
 AddService = WinVerbs,,WinVerbs.ServiceInstall
 AddService = WinMad,,WinMad.ServiceInstall
 
 [MLX4HCA.DDInstall.ntia64.Services]
 AddService =
mlx4_hca,%SPSVCINST_ASSOCSERVICE%,MLX4HCA.ServiceInstall,MLX4HCA.EventLo
g
-AddService = ibbus,,Ibbus.ServiceInstall
+AddService = ibbus,,Ibbus.ServiceInstall,IBBUS.EventLog
 AddService = WinVerbs,,WinVerbs.ServiceInstall
 AddService = WinMad,,WinMad.ServiceInstall
 
@@ -282,6 +282,14 @@
 AddReg          = Ibbus.ParamsReg
 Dependencies = mlx4_hca
 
+[IBBUS.EventLog]
+AddReg = IBBUS.AddEventLogReg
+
+[IBBUS.AddEventLogReg]
+HKR, , EventMessageFile, 0x00020000,
"%%SystemRoot%%\System32\IoLogMsg.dll;%%SystemRoot%%\System32\drivers\ib
bus.sys"
+HKR, , TypesSupported,   0x00010001, 7
+
+
 [Ibbus.ParamsReg]
 HKR,"Parameters","IbalDebugLevel",%REG_DWORD%,2
 HKR,"Parameters","IbalDebugFlags",%REG_DWORD%,0x00ffffff

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20090601/611d19c0/attachment.html>


More information about the ofw mailing list