/* IBM_PROLOG_BEGIN_TAG */ /* This is an automatically generated prolog. */ /* */ /* bos72X src/bos/kernel/sys/livedump.h 1.22.2.1 */ /* */ /* Licensed Materials - Property of IBM */ /* */ /* Restricted Materials of IBM */ /* */ /* COPYRIGHT International Business Machines Corp. 2006,2021 */ /* All Rights Reserved */ /* */ /* US Government Users Restricted Rights - Use, duplication or */ /* disclosure restricted by GSA ADP Schedule Contract with IBM Corp. */ /* */ /* IBM_PROLOG_END_TAG */ /* @(#)02 1.22.2.1 src/bos/kernel/sys/livedump.h, sysdump, bos72X, x2022_10A6 11/16/21 02:08:26 */ #ifndef _H_livedump #define _H_livedump #ifdef __cplusplus extern "C" { #endif #include #include #include #include /* live dump type flags. */ #define LDT_UNSERIALIZED 0x1 /* dump is not serialized */ #define LDT_ONEPASS 0x2 /* limit dump to one pass */ #define LDT_ASYNC 0x4 /* dump is asynchronous */ #define LDT_NOADDCOMPS 0x8 /* components can't be added by callbacks */ #define LDT_NOLOG 0x10 /* no error is to be logged */ #define LDT_FORCE 0x20 /* force this dump */ #define LDT_ESTIMATE 0x40 /* used if this is an estimate dump */ #define LDT_POST 0x80 /* post this tid when i/o complete */ /* Posted events */ #define LDMP_IODONE_EVENT 0x80000000 /* i/o finished */ #define LDMP_HELD_EVENT 0x40000000 /* Dump moved to held list */ #define LDMP_DROP_EVENT 0x20000000 /* Dump dropped due to error */ /* Live Dump priorities. */ #define LDPP_INFO 1 /* informational dump */ #define LDPP_CRITICAL 7 /* critical dump */ /* Valid Live Dump priorities */ #define LDPP_VALID(p) \ ((p==LDPP_INFO) || (p==LDPP_CRITICAL)) #if (defined _RAS_INTERNAL) || (defined _KERNEL) typedef long dumpid_t; /* * There will be a work area in the ldmp_prepare_t, ldmp_start_t, and * sdmp_start_t data structures for use in keeping state across calls when * necessary. */ #define DMP_WKSZ 256 /* dump work area size */ #define LDMP_ERRBUF_SZ 2048 /* dump error buffer size */ /* Optional returned file name. */ typedef struct ldmp_filename { char ldf_name[PATH_MAX]; } ldmp_filename_t; /* Optional returned error record. */ typedef struct ldmp_errbuf { char ler_data[LDMP_ERRBUF_SZ]; /* detail data */ } ldmp_errbuf_t; /* * Parameter definition for the livedump kernel service. */ typedef struct ldmp_parms { int ldp_eyec; /* must be EYEC_LDP */ int ldp_vers; /* version */ int ldp_flags; /* dump characteristics (LDT_) */ int ldp_prio; /* dump priority (LDPP_) */ union { long _d; /* dump disposition (LDPD_) */ long _e; /* estimate */ } _ldpu; char *ldp_recov; /* optional recovery func name */ char *ldp_func; /* optional failing func name */ char *ldp_namepref; /* dump file name prefix, may be NULL */ long ldp_errcode; /* error code */ char *ldp_symptom; /* symptom, 2k max, null terminated */ char *ldp_title; /* title, 128 byte max */ ldmp_filename_t *ldp_filename; /* dump file name (optional) */ ldmp_errbuf_t *ldp_errbuf; /* Error data (optional) */ void *ldp_rsvd1; /* Reserved */ } ldmp_parms_t; #define EYEC_LDP __EYEC4('l','d','p','m') /* ldpm */ #define ldp_disposition _ldpu._d /* dump disposition */ #define ldp_estimate _ldpu._e /* dump size estimate */ #define LDP_VERS1 0 /* version 1 */ #define LDP_VERS LDP_VERS1 /* current version */ #define LDMP_RECOV_MAX 128 /* max recov func name length */ #define LDMP_FUNC_MAX 128 /* max failing func name length */ #define LDMP_PREFIX_MAX 64 /* MAX filename prefix length */ #define LDMP_SYMPTOM_MAX 2048 /* max sympt string length */ #define LDMP_TITLE_MAX 128 /* max title length */ /* live dump priorities */ #define LDPP_INFO 1 /* informational */ #define LDPP_CRITICAL 7 /* critical */ /* * Live dump dispositions. * This field informs the caller whether i/o was started for the dump. * LDPD_NODUMP means the dump could not be taken, and no i/o was attempted. * LDPD_IO_STARTED indicates that the dump was sent to the i/o process. * This does not mean that all i/o was successful. * LDPD_NOIO_HELD indicates that the dump was buffered, but was put on the * held list, because no i/o process was running. * LDPD_NOIO_DROP indicates that the dump was dropped since it was multi-pass * capable and the i/o process was not running or returned error during the * first pass. If failure occurred on subsequent passes, disposition * will be LDPD_IO_STARTED since some passes have made it to the filesystem. * The remaining passes will be dropped. */ #define LDPD_NODUMP 1 /* No dump was possible */ #define LDPD_IO_STARTED 2 /* i/o was started for this dump */ #define LDPD_NOIO_HELD 3 /* The dump was put on the held list */ #define LDPD_NOIO_DROP 4 /* The dump was dropped. */ /* * This structure is received by a callback to prepare for a live dump. */ typedef struct ldmp_prepare { int ldpr_eyec; /* EYEC_LDPR */ int ldpr_vers; int ldpr_flags; /* type flags, LDT_ */ dmp_lvl_t ldpr_lvl; /* level at which to dump this component */ short ldpr_pflags; /* prepare flags, LDPF_ */ #define LDPF_MOREDATA 0x1 /* Always called to provide more data */ dumpid_t ldpr_dumpid; /* id of this dump */ size_t ldpr_plen; /* parameters length */ char *ldpr_parms; /* Pointer to parameters */ size_t ldpr_datasize; /* amount of data to be dumped */ size_t ldpr_sbufsz; /* staging buffer size */ void *ldpr_rsvd1; /* reserved */ void *ldpr_rsvd2; /* reserved */ char ldpr_wk[DMP_WKSZ]; /* Work area */ int ldpr_eyec2; /* overflow protection */ } ldmp_prepare_t; #define EYEC_LDPR __EYEC4('l','d','p','r') /* ldpr */ #define LDPR_VERS1 0 /* version 1 */ #define LDPR_VERS LDPR_VERS1 /* current version */ #define ldpr_estimate ldpr_datasize /* set for RASCD_LDMP_ESTIMATE */ /* * This structure is passed to a callback when it is to dump its data for a * live dump, RASCD_LDMP_START. */ typedef struct ldmp_start { int ldmpst_eyec; /* EYEC_LDMPST */ int ldmpst_vers; /* version */ int ldmpst_flags; /* type flags, see ldmp_parms_t */ dmp_lvl_t ldmpst_lvl; /* level at which to dump */ dumpid_t ldmpst_dumpid; /* dump id */ size_t ldmpst_plen; /* parameters length */ char *ldmpst_parms; /* passed parameters */ void *ldmpst_buffer; /* staging buffer if requested */ size_t ldmpst_sbufsz; /* staging buffer size */ void *ldmpst_table; /* dump table ptr set by callback */ char ldmpst_wk[DMP_WKSZ]; /* Work area */ int ldmpst_eyec2; /* for integrity check */ } ldmp_start_t; #define EYEC_LDMPST __EYEC4('l','d','s','t') /* ldst */ #define LDMPST_VERS1 0 /* version 1 */ #define LDMPST_VERS LDMPST_VERS1 /* current version */ /* Sizes */ #define LDMP_SBUFSZ_MAX (64*1024*1024) /* max staging buf size=64mb -- refer to defect 1143922 */ #define LDMP_DATASIZE_MINIMAL (2*1024*1024) #define LDMP_DATASIZE_NORMAL (4*1024*1024) #define LDMP_DATASIZE_DETAIL (8*1024*1024) #define LDMP_DATASIZE_LEVEL9 ((size_t)4*1024*1024*1024) #define LDMP_MAX_DATASIZE(lvl)\ ((lvl < CD_LVL_NORMAL) ? LDMP_DATASIZE_MINIMAL : \ ((lvl < CD_LVL_DETAIL) ? LDMP_DATASIZE_NORMAL : \ LDMP_DATASIZE_DETAIL)) #define LDMP_ERRSTR_MAX 128 /* error string max */ /* external functions */ extern kerrno_t livedump(ldmp_parms_t *p); extern kerrno_t ldmp_setupparms(ldmp_parms_t *p); extern kerrno_t ldmp_freeparms(ldmp_parms_t *p); extern kerrno_t ldmp_xmalloc(dumpid_t id, size_t sz, uint align, void **p); extern kerrno_t ldmp_xmfree(dumpid_t id, void *addr); extern kerrno_t ldmp_errstr(dumpid_t, ras_block_t, char *); extern kerrno_t ldmp_bufest(dumpid_t, ras_block_t, size_t*); extern kerrno_t ldmp_timeleft(dumpid_t, long *); /* Errors returned. */ /* EEEE0000962208xx - LDMP_SUBBLK is defined in dump.h */ #define EBUSY_RAS_LIVEDUMP KERROR(EBUSY, sysdump_BLOCK_00, 0x800+0) #define EFAULT_RAS_LDMP_SETUPPARMS KERROR(EFAULT, sysdump_BLOCK_00, 0x800+1) #define EINVAL_RAS_LDMP_XMALLOC_ID KERROR(EINVAL, sysdump_BLOCK_00, 0x800+2) #define EINVAL_RAS_LDMP_XMALLOC_SZ KERROR(EINVAL, sysdump_BLOCK_00, 0x800+3) #define EINVAL_RAS_LDMP_XMALLOC_ALIGN KERROR(EINVAL, sysdump_BLOCK_00, 0x800+4) #define EFAULT_RAS_LDMP_XMALLOC KERROR(EFAULT, sysdump_BLOCK_00, 0x800+5) #define ENOMEM_RAS_LDMP_XMALLOC KERROR(ENOMEM, sysdump_BLOCK_00, 0x800+6) #define EINVAL_RAS_LDMP_XMFREE_ID KERROR(EINVAL, sysdump_BLOCK_00, 0x800+7) #define EINVAL_RAS_LDMP_XMFREE_ADDR KERROR(EINVAL, sysdump_BLOCK_00, 0x800+8) #define EFAULT_RAS_LIVEDUMP_PARM KERROR(EFAULT, sysdump_BLOCK_00, 0x800+9) #define EINVAL_RAS_LIVEDUMP_PARM KERROR(EINVAL, sysdump_BLOCK_00, 0x800+10) #define EINVAL_RAS_LIVEDUMP_PARM_STR_TOOLONG KERROR(EINVAL, sysdump_BLOCK_00, 0x800+11) #define EINVAL_RAS_LIVEDUMP_NOSYMP KERROR(EINVAL, sysdump_BLOCK_00, 0x800+12) #define EINVAL_RAS_LIVEDUMP_COMP KERROR(EINVAL, sysdump_BLOCK_00, 0x800+13) #define ENOTREADY_RAS_LIVEDUMP KERROR(ENOTREADY, sysdump_BLOCK_00, 0x800+14) #define ENOMEM_RAS_LIVEDUMP_ERR KERROR(ENOMEM, sysdump_BLOCK_00, 0x800+15) #define EINVAL_RAS_LIVEDUMP_SER KERROR(EINVAL, sysdump_BLOCK_00, 0x800+16) #define ETIMEDOUT_RAS_LIVEDUMP_FREEZE_STOP KERROR(ETIMEDOUT, sysdump_BLOCK_00, 0x800+17) #define EINVAL_RAS_LDMP_ERRSTR_ID KERROR(EINVAL, sysdump_BLOCK_00, 0x800+18) #define EINVAL_RAS_LDMP_ERRSTR_COMP KERROR(EINVAL, sysdump_BLOCK_00, 0x800+19) #define EINVAL_RAS_LDMP_ERRSTR_STR KERROR(EINVAL, sysdump_BLOCK_00, 0x800+20) #define EFAULT_RAS_LIVEDUMP_ERRBUF KERROR(EFAULT, sysdump_BLOCK_00, 0x800+21) #define EFAULT_RAS_LDMP_FREEPARMS KERROR(EFAULT, sysdump_BLOCK_00, 0x800+22) #define EINVAL_RAS_LDMP_FREEPARMS KERROR(EINVAL, sysdump_BLOCK_00, 0x800+23) #define EBUSY_RAS_LDMP_FREEPARMS KERROR(EBUSY, sysdump_BLOCK_00, 0x800+24) #define EINVAL_RAS_LDMP_BUFEST KERROR(EINVAL, sysdump_BLOCK_00, 0x800+25) #define EFAULT_RAS_LDMP_BUFEST KERROR(EFAULT, sysdump_BLOCK_00, 0x800+26) #define EINVAL_RAS_LDMP_TIMELEFT KERROR(EINVAL, sysdump_BLOCK_00, 0x800+27) #define EFAULT_RAS_LDMP_TIMELEFT KERROR(EFAULT, sysdump_BLOCK_00, 0x800+28) #define ENOMEM_LDMP_GETHS KERROR(ENOMEM, sysdump_BLOCK_00, 0x800+29) #define EINVAL_RAS_LDMP_ESTIMATE KERROR(EINVAL, sysdump_BLOCK_00, 0x800+30) #define EFAULT_RAS_LIVEDUMP_FILENAME KERROR(EFAULT, sysdump_BLOCK_00, 0x800+31) #define EINVAL_RAS_LIVEDUMP_EMPTY_DUMP KERROR(EINVAL, sysdump_BLOCK_00, 0x800+32) #define EINVAL_RAS_LDMP_IO_PASS_ERR KERROR(EINVAL, sysdump_BLOCK_00, 0x800+33) #define EEXIST_RAS_LIVEDUMP KERROR(EEXIST, sysdump_BLOCK_00, 0x800+34) #define EINVAL_RAS_LDMP_EMPTY KERROR(EINVAL, sysdump_BLOCK_00, 0x800+35) #define ENOMEM_RAS_LIVEDUMP_CB KERROR(ENOMEM, sysdump_BLOCK_00, 0x800+36) #define ENOMEM_RAS_LIVEDUMP_PREP KERROR(ENOMEM, sysdump_BLOCK_00, 0x800+37) #define ENOMEM_RAS_LIVEDUMP_START KERROR(ENOMEM, sysdump_BLOCK_00, 0x800+38) #define ENOMEM_RAS_LIVEDUMP_MYPARM KERROR(ENOMEM, sysdump_BLOCK_00, 0x800+39) #define EINVAL_RAS_LIVEDUMP_BADCB KERROR(EINVAL, sysdump_BLOCK_00, 0x800+40) #define EINVAL_RAS_LIVEDUMP_EMPTY_VALRES KERROR(EINVAL, sysdump_BLOCK_00, 0x800+41) #define EINVAL_RAS_LIVEDUMP_EMPTY_DUP KERROR(EINVAL, sysdump_BLOCK_00, 0x800+42) #define EINVAL_RAS_LIVEDUMP_EMPTY_PREP KERROR(EINVAL, sysdump_BLOCK_00, 0x800+43) #define ETIMEDOUT_RAS_LIVEDUMP_FREEZE_TO KERROR(ETIMEDOUT, sysdump_BLOCK_00, 0x800+44) #define EAGAIN_RAS_LIVEDUMP_NEXTPASS KERROR(EAGAIN, sysdump_BLOCK_00, 0x800+45) #define ENOMEM_LDMP_GETHS1 KERROR(ENOMEM, sysdump_BLOCK_00, 0x800+46) #define ENOMEM_LDMP_GETHS2 KERROR(ENOMEM, sysdump_BLOCK_00, 0x800+47) #define ENOMEM_LDMP_GETHS3 KERROR(ENOMEM, sysdump_BLOCK_00, 0x800+48) #endif /* _RAS_INTERNAL || _KERNEL */ /* Command basis */ #define LDMP_FIRST 0x01 /* first live dump command */ #define SDMP_FIRST 0x40 /* first system dump command */ enum { LDMP_ON = LDMP_FIRST, LDMP_OFF, LDMP_LVL, LDMP_UNUSED1, LDMP_PREPARE, LDMP_ESTIMATE, LDMP_START, LDMP_AGAIN, LDMP_FINISHED, LDMP_LAST, SDMP_ON = SDMP_FIRST, SDMP_OFF, SDMP_LVL, SDMP_UNUSED2, SDMP_CALLONRESTART, SDMP_STAGING, SDMP_SHARED_STAGING, SDMP_START, SDMP_AGAIN, SDMP_FINISHED, SDMP_ESTIMATE, SDMP_RETRY, SDMP_SET_RETRY, SDMP_SET_SERIALIO, SDMP_LAST, DMP_PASS_THROUGH = 4094, /* Handled via live dump services */ DMP_NOCMD = 4095 }; /* Live dump callback commands */ #define RASCD_LDMP_ON RASC_COMMAND(RASD_DUMP, LDMP_ON) RAS_COMMAND_CHECK(RASCD_LDMP_ON, 0x5200000000000103ull); #define RASCD_LDMP_OFF RASC_COMMAND(RASD_DUMP, LDMP_OFF) RAS_COMMAND_CHECK(RASCD_LDMP_OFF, 0x5200000000000203ull); #define RASCD_LDMP_LVL RASC_COMMAND(RASD_DUMP, LDMP_LVL) RAS_COMMAND_CHECK(RASCD_LDMP_LVL, 0x5200000000000303ull); #define RASCD_LDMP_PREPARE RASC_COMMAND(RASD_DUMP, LDMP_PREPARE) RAS_COMMAND_CHECK(RASCD_LDMP_PREPARE, 0x5200000000000503ull); #define RASCD_LDMP_ESTIMATE RASC_COMMAND(RASD_DUMP, LDMP_ESTIMATE) RAS_COMMAND_CHECK(RASCD_LDMP_ESTIMATE, 0x5200000000000603ull); #define RASCD_LDMP_START RASC_COMMAND(RASD_DUMP, LDMP_START) RAS_COMMAND_CHECK(RASCD_LDMP_START, 0x5200000000000703ull); #define RASCD_LDMP_AGAIN RASC_COMMAND(RASD_DUMP, LDMP_AGAIN) RAS_COMMAND_CHECK(RASCD_LDMP_AGAIN, 0x5200000000000803ull); #define RASCD_LDMP_FINISHED RASC_COMMAND(RASD_DUMP, LDMP_FINISHED) RAS_COMMAND_CHECK(RASCD_LDMP_FINISHED, 0x5200000000000903ull); #define RASCD_DMP_PASS_THROUGH RASC_COMMAND(RASD_DUMP, DMP_PASS_THROUGH) RAS_COMMAND_CHECK(RASCD_DMP_PASS_THROUGH, 0x52000000000FFE03ull); /* System dump */ #define RASCD_SDMP_ON RASC_COMMAND(RASD_DUMP, SDMP_ON) RAS_COMMAND_CHECK(RASCD_SDMP_ON, 0x5200000000004003ull); #define RASCD_SDMP_OFF RASC_COMMAND(RASD_DUMP, SDMP_OFF) RAS_COMMAND_CHECK(RASCD_SDMP_OFF, 0x5200000000004103ull); #define RASCD_SDMP_LVL RASC_COMMAND(RASD_DUMP, SDMP_LVL) RAS_COMMAND_CHECK(RASCD_SDMP_LVL, 0x5200000000004203ull); #define RASCD_SDMP_START RASC_COMMAND(RASD_DUMP, SDMP_START) RAS_COMMAND_CHECK(RASCD_SDMP_START, 0x5200000000004703ull); #define RASCD_SDMP_AGAIN RASC_COMMAND(RASD_DUMP, SDMP_AGAIN) RAS_COMMAND_CHECK(RASCD_SDMP_AGAIN, 0x5200000000004803ull); #define RASCD_SDMP_FINISHED RASC_COMMAND(RASD_DUMP, SDMP_FINISHED) RAS_COMMAND_CHECK(RASCD_SDMP_FINISHED, 0x5200000000004903ull); #define RASCD_SDMP_ESTIMATE RASC_COMMAND(RASD_DUMP, SDMP_ESTIMATE) RAS_COMMAND_CHECK(RASCD_SDMP_ESTIMATE, 0x5200000000004A03ull); #define RASCD_SDMP_RETRY RASC_COMMAND(RASD_DUMP, SDMP_RETRY) RAS_COMMAND_CHECK(RASCD_SDMP_RETRY, 0x5200000000004B03ull); /* Special commands to (1) use buffer for multiple RAS attributes; * (2) delete persistent attribute customizations; * (3) query persistent customizations. */ #define RASCD_MULTI (RASC_COMMAND(RASD_DUMP, DMP_NOCMD) | RAS_BUFFER) #define RASCD_DELETE (RASC_COMMAND(RASD_DUMP, DMP_NOCMD) | RAS_DELETE) #define RASCD_QUERY (RASC_COMMAND(RASD_DUMP, DMP_NOCMD) | RAS_QUERY) #ifdef _KERNEL #define RASCD_SET_LDMP_ON \ RASC_COMMAND(RASD_DUMP, LDMP_ON | NOCALLBACK) RAS_COMMAND_CHECK(RASCD_SET_LDMP_ON, 0x5200000001000103ull); #define RASCD_SET_LDMP_OFF \ RASC_COMMAND(RASD_DUMP, LDMP_OFF | NOCALLBACK) RAS_COMMAND_CHECK(RASCD_SET_LDMP_OFF, 0x5200000001000203ull); #define RASCD_SET_LDMP_LVL \ RASC_COMMAND(RASD_DUMP, LDMP_LVL | NOCALLBACK) RAS_COMMAND_CHECK(RASCD_SET_LDMP_LVL, 0x5200000001000303ull); /* * This returns the current live dump level. * The component must be customized. */ #define rasrb_ldmp_level(__rasb) \ (((const rasr_block_t *)(__rasb))->rrb_ldmp_lvl) #define RASCD_SET_SDMP_ON \ RASC_COMMAND(RASD_DUMP, SDMP_ON | NOCALLBACK) RAS_COMMAND_CHECK(RASCD_SET_SDMP_ON, 0x5200000001004003ull); #define RASCD_SET_SDMP_OFF \ RASC_COMMAND(RASD_DUMP, SDMP_OFF | NOCALLBACK) RAS_COMMAND_CHECK(RASCD_SET_SDMP_OFF, 0x5200000001004103ull); #define RASCD_SET_SDMP_LVL \ RASC_COMMAND(RASD_DUMP, SDMP_LVL | NOCALLBACK) RAS_COMMAND_CHECK(RASCD_SET_SDMP_LVL, 0x5200000001004203ull); /* * This returns the current system dump level. * The component must be customized. */ #define rasrb_sdmp_level(__rasb) \ (((const rasr_block_t *)(__rasb))->rrb_sdmp_lvl) #define RASCD_SET_SDMP_CALLONRESTART \ RASC_COMMAND(RASD_DUMP, SDMP_CALLONRESTART | NOCALLBACK) RAS_COMMAND_CHECK(RASCD_SET_SDMP_CALLONRESTART, 0x5200000001004403ull); #define RASCD_SET_SDMP_STAGING \ RASC_COMMAND(RASD_DUMP, SDMP_STAGING | NOCALLBACK) RAS_COMMAND_CHECK(RASCD_SET_SDMP_STAGING, 0x5200000001004503ull); #define RASCD_SET_SDMP_SHARED_STAGING \ RASC_COMMAND(RASD_DUMP, SDMP_SHARED_STAGING | NOCALLBACK) RAS_COMMAND_CHECK(RASCD_SET_SDMP_SHARED_STAGING, 0x5200000001004603ull); #define RASCD_SET_SDMP_RETRY \ RASC_COMMAND(RASD_DUMP, SDMP_SET_RETRY | NOCALLBACK) RAS_COMMAND_CHECK(RASCD_SET_SDMP_RETRY, 0x5200000001004C03ull); #define RASCD_SET_SDMP_SERIALIO \ RASC_COMMAND(RASD_DUMP, SDMP_SET_SERIALIO | NOCALLBACK) RAS_COMMAND_CHECK(RASCD_SET_SDMP_SERIALIO, 0x5200000001004D03ull); /* Inline for checking whether a livedump return code means that the * caller should halt the system */ static __inline int DUMP_KERRNO_BAD(kerrno_t rc) { if (rc != 0) { if (KERROR2ERRNO(rc) == EINVAL || KERROR2ERRNO(rc) == EFAULT) { return 1; } } return 0; } #endif /* _KERNEL */ #ifdef __cplusplus } #endif #endif /* _H_livedump */