Win32 API 日本語リファレンス
ホームStorage.Nvme › NVME_ERROR_INFO_LOG

NVME_ERROR_INFO_LOG

構造体
サイズx64: 64 バイト / x86: 64 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
ErrorCountULONGLONG8+0+0

64 ビットのインクリメントされるエラーカウントで、このエラーの一意の識別子を示します。

エラーカウントは 1h から始まり、一意のエラーログエントリごとにインクリメントされ、電源オフの状態をまたいで保持されます。値 0h は無効なエントリを示します。この値は、エントリが失われた場合や、コントローラーがサポートするエントリの最大数よりもエラーの数が少ない場合に使用されることがあります。

SQIDWORD2+8+8エラー情報が関連付けられているコマンドの Submission Queue Identifier (SQID) を示します。エラーが特定のコマンドに固有でない場合、このフィールドは FFFFh に設定されます。
CMDIDWORD2+10+10エラーが関連付けられているコマンドの Command Identifier (CMDID) を示します。エラーが特定のコマンドに固有でない場合、これは FFFFh に設定されます。
StatusNVME_COMMAND_STATUS2+12+12

完了したコマンドの Status フィールドを示します。

Status フィールドはビット 01:15 に位置します。ビット 0 は、そのコマンドに対してポストされた Phase Tag (P) に対応します。エラーが特定のコマンドに固有でない場合、このフィールドは最も適切なステータス値を報告します。

ParameterErrorLocation_ParameterErrorLocation_e__Struct2+14+14

該当する場合に、エラーが関連付けられているコマンドパラメーターのバイトおよびビットを示すフィールドを含む ParameterErrorLocation 構造体です。

パラメーターが複数のバイトまたはビットにまたがる場合、この位置はそのパラメーターの先頭のバイトおよびビットを示します。エラーが特定のコマンドに固有でない場合、このフィールドは FFFFh に設定されます。

LbaULONGLONG8+16+16該当する場合に、エラー状態が発生した最初の Logical Block Address (LBA) を示します。
NameSpaceDWORD4+24+24該当する場合に、エラーが関連付けられている名前空間を示します。
VendorInfoAvailableBYTE1+28+28

追加のベンダー固有のエラー情報が利用可能な場合、このフィールドはそのページに関連付けられたログページ識別子を提供します。

00h は追加情報が利用できないことを示します。有効な値は 80h から FFh の範囲です。

TRTYPEBYTE1+29+29ファブリック転送タイプ(Transport Type)。
Reserved0BYTE2+30+30予約済みのフィールドです。
CommandSpecificInfoULONGLONG8+32+32コマンド固有の情報を格納します。使用される場合、返される情報はコマンドの定義で規定されます。
TransportTypeSpecificInfoWORD2+40+40転送タイプ固有のエラー情報。
Reserved1BYTE22+42+42予約済みのフィールドです。

構造体: _ParameterErrorLocation_e__Struct x64 2B / x86 2B

フィールドサイズx64x86
_bitfieldWORD2+0+0

公式ドキュメント

Error Information ログページ内の情報を指定するフィールドを格納します。

Error Information ログページには、エラーで完了したコマンド、または特定のコマンドに固有ではないエラーを報告したコマンドの拡張エラー情報が格納されます。拡張エラー情報は、エラーで完了したコマンドに関連付けられた Completion Queue EntryStatus フィールドで More (M)1 に設定されている場合、または Error ステータス種別を持つ非同期イベントの一部として提供されます。

Error Information ログページはコントローラー全体に対してグローバルです。このエラーログは直近の n 件のエラーを返すことがあります。ホストソフトウェアが n 件分のエラーログのサイズのデータ転送を指定した場合、直近の n 件のエラーに対するエラーログが返されます。エントリの順序はエラーが発生した時刻に基づいており、最も新しいエラーが最初のログとして返されます。

Error Information ログページは 64 バイトのエントリの集合です。サポートされるエントリの数は Identify Controller データ構造で示されます。

この構造体は Get Log Page コマンドによって返されます。詳細については、NVME_CDW10_GET_LOG_PAGE を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// NVME_COMMAND_STATUS  (x64 2 / x86 2 バイト)
typedef struct NVME_COMMAND_STATUS {
    _Anonymous_e__Struct Anonymous;
    WORD AsUshort;
} NVME_COMMAND_STATUS;

// NVME_ERROR_INFO_LOG  (x64 64 / x86 64 バイト)
typedef struct NVME_ERROR_INFO_LOG {
    ULONGLONG ErrorCount;
    WORD SQID;
    WORD CMDID;
    NVME_COMMAND_STATUS Status;
    _ParameterErrorLocation_e__Struct ParameterErrorLocation;
    ULONGLONG Lba;
    DWORD NameSpace;
    BYTE VendorInfoAvailable;
    BYTE TRTYPE;
    BYTE Reserved0[2];
    ULONGLONG CommandSpecificInfo;
    WORD TransportTypeSpecificInfo;
    BYTE Reserved1[22];
} NVME_ERROR_INFO_LOG;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NVME_COMMAND_STATUS
{
    public _Anonymous_e__Struct Anonymous;
    public ushort AsUshort;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NVME_ERROR_INFO_LOG
{
    public ulong ErrorCount;
    public ushort SQID;
    public ushort CMDID;
    public NVME_COMMAND_STATUS Status;
    public _ParameterErrorLocation_e__Struct ParameterErrorLocation;
    public ulong Lba;
    public uint NameSpace;
    public byte VendorInfoAvailable;
    public byte TRTYPE;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] Reserved0;
    public ulong CommandSpecificInfo;
    public ushort TransportTypeSpecificInfo;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)] public byte[] Reserved1;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NVME_COMMAND_STATUS
    Public Anonymous As _Anonymous_e__Struct
    Public AsUshort As UShort
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NVME_ERROR_INFO_LOG
    Public ErrorCount As ULong
    Public SQID As UShort
    Public CMDID As UShort
    Public Status As NVME_COMMAND_STATUS
    Public ParameterErrorLocation As _ParameterErrorLocation_e__Struct
    Public Lba As ULong
    Public NameSpace As UInteger
    Public VendorInfoAvailable As Byte
    Public TRTYPE As Byte
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Public Reserved0() As Byte
    Public CommandSpecificInfo As ULong
    Public TransportTypeSpecificInfo As UShort
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=22)> Public Reserved1() As Byte
End Structure
import ctypes
from ctypes import wintypes

class NVME_COMMAND_STATUS(ctypes.Structure):
    _fields_ = [
        ("Anonymous", _Anonymous_e__Struct),
        ("AsUshort", ctypes.c_ushort),
    ]

class NVME_ERROR_INFO_LOG(ctypes.Structure):
    _fields_ = [
        ("ErrorCount", ctypes.c_ulonglong),
        ("SQID", ctypes.c_ushort),
        ("CMDID", ctypes.c_ushort),
        ("Status", NVME_COMMAND_STATUS),
        ("ParameterErrorLocation", _ParameterErrorLocation_e__Struct),
        ("Lba", ctypes.c_ulonglong),
        ("NameSpace", wintypes.DWORD),
        ("VendorInfoAvailable", ctypes.c_ubyte),
        ("TRTYPE", ctypes.c_ubyte),
        ("Reserved0", ctypes.c_ubyte * 2),
        ("CommandSpecificInfo", ctypes.c_ulonglong),
        ("TransportTypeSpecificInfo", ctypes.c_ushort),
        ("Reserved1", ctypes.c_ubyte * 22),
    ]
#[repr(C)]
pub struct NVME_COMMAND_STATUS {
    pub Anonymous: _Anonymous_e__Struct,
    pub AsUshort: u16,
}

#[repr(C)]
pub struct NVME_ERROR_INFO_LOG {
    pub ErrorCount: u64,
    pub SQID: u16,
    pub CMDID: u16,
    pub Status: NVME_COMMAND_STATUS,
    pub ParameterErrorLocation: _ParameterErrorLocation_e__Struct,
    pub Lba: u64,
    pub NameSpace: u32,
    pub VendorInfoAvailable: u8,
    pub TRTYPE: u8,
    pub Reserved0: [u8; 2],
    pub CommandSpecificInfo: u64,
    pub TransportTypeSpecificInfo: u16,
    pub Reserved1: [u8; 22],
}
import "golang.org/x/sys/windows"

type NVME_COMMAND_STATUS struct {
	Anonymous _Anonymous_e__Struct
	AsUshort uint16
}

type NVME_ERROR_INFO_LOG struct {
	ErrorCount uint64
	SQID uint16
	CMDID uint16
	Status NVME_COMMAND_STATUS
	ParameterErrorLocation _ParameterErrorLocation_e__Struct
	Lba uint64
	NameSpace uint32
	VendorInfoAvailable byte
	TRTYPE byte
	Reserved0 [2]byte
	CommandSpecificInfo uint64
	TransportTypeSpecificInfo uint16
	Reserved1 [22]byte
}
type
  NVME_COMMAND_STATUS = record
    Anonymous: _Anonymous_e__Struct;
    AsUshort: Word;
  end;

  NVME_ERROR_INFO_LOG = record
    ErrorCount: UInt64;
    SQID: Word;
    CMDID: Word;
    Status: NVME_COMMAND_STATUS;
    ParameterErrorLocation: _ParameterErrorLocation_e__Struct;
    Lba: UInt64;
    NameSpace: DWORD;
    VendorInfoAvailable: Byte;
    TRTYPE: Byte;
    Reserved0: array[0..1] of Byte;
    CommandSpecificInfo: UInt64;
    TransportTypeSpecificInfo: Word;
    Reserved1: array[0..21] of Byte;
  end;
const NVME_COMMAND_STATUS = extern struct {
    Anonymous: _Anonymous_e__Struct,
    AsUshort: u16,
};

const NVME_ERROR_INFO_LOG = extern struct {
    ErrorCount: u64,
    SQID: u16,
    CMDID: u16,
    Status: NVME_COMMAND_STATUS,
    ParameterErrorLocation: _ParameterErrorLocation_e__Struct,
    Lba: u64,
    NameSpace: u32,
    VendorInfoAvailable: u8,
    TRTYPE: u8,
    Reserved0: [2]u8,
    CommandSpecificInfo: u64,
    TransportTypeSpecificInfo: u16,
    Reserved1: [22]u8,
};
type
  NVME_COMMAND_STATUS {.bycopy.} = object
    Anonymous: _Anonymous_e__Struct
    AsUshort: uint16

  NVME_ERROR_INFO_LOG {.bycopy.} = object
    ErrorCount: uint64
    SQID: uint16
    CMDID: uint16
    Status: NVME_COMMAND_STATUS
    ParameterErrorLocation: _ParameterErrorLocation_e__Struct
    Lba: uint64
    NameSpace: uint32
    VendorInfoAvailable: uint8
    TRTYPE: uint8
    Reserved0: array[2, uint8]
    CommandSpecificInfo: uint64
    TransportTypeSpecificInfo: uint16
    Reserved1: array[22, uint8]
struct NVME_COMMAND_STATUS
{
    _Anonymous_e__Struct Anonymous;
    ushort AsUshort;
}

struct NVME_ERROR_INFO_LOG
{
    ulong ErrorCount;
    ushort SQID;
    ushort CMDID;
    NVME_COMMAND_STATUS Status;
    _ParameterErrorLocation_e__Struct ParameterErrorLocation;
    ulong Lba;
    uint NameSpace;
    ubyte VendorInfoAvailable;
    ubyte TRTYPE;
    ubyte[2] Reserved0;
    ulong CommandSpecificInfo;
    ushort TransportTypeSpecificInfo;
    ubyte[22] Reserved1;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NVME_ERROR_INFO_LOG サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; ErrorCount : ULONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; SQID : WORD (+8, 2byte)  wpoke st,8,値  /  値 = wpeek(st,8)
; CMDID : WORD (+10, 2byte)  wpoke st,10,値  /  値 = wpeek(st,10)
; Status : NVME_COMMAND_STATUS (+12, 2byte)  varptr(st)+12 を基点に操作(2byte:入れ子/配列)
; ParameterErrorLocation : _ParameterErrorLocation_e__Struct (+14, 2byte)  varptr(st)+14 を基点に操作(2byte:入れ子/配列)
; Lba : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; NameSpace : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; VendorInfoAvailable : BYTE (+28, 1byte)  poke st,28,値  /  値 = peek(st,28)
; TRTYPE : BYTE (+29, 1byte)  poke st,29,値  /  値 = peek(st,29)
; Reserved0 : BYTE (+30, 2byte)  varptr(st)+30 を基点に操作(2byte:入れ子/配列)
; CommandSpecificInfo : ULONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; TransportTypeSpecificInfo : WORD (+40, 2byte)  wpoke st,40,値  /  値 = wpeek(st,40)
; Reserved1 : BYTE (+42, 22byte)  varptr(st)+42 を基点に操作(22byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global NVME_ERROR_INFO_LOG
    #field int64 ErrorCount
    #field short SQID
    #field short CMDID
    #field byte Status 2
    #field _ParameterErrorLocation_e__Struct ParameterErrorLocation
    #field int64 Lba
    #field int NameSpace
    #field byte VendorInfoAvailable
    #field byte TRTYPE
    #field byte Reserved0 2
    #field int64 CommandSpecificInfo
    #field short TransportTypeSpecificInfo
    #field byte Reserved1 22
#endstruct

stdim st, NVME_ERROR_INFO_LOG        ; NSTRUCT 変数を確保
st->ErrorCount = 100
mes "ErrorCount=" + st->ErrorCount
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。