16316Seschrock /* 26316Seschrock * CDDL HEADER START 36316Seschrock * 46316Seschrock * The contents of this file are subject to the terms of the 56316Seschrock * Common Development and Distribution License (the "License"). 66316Seschrock * You may not use this file except in compliance with the License. 76316Seschrock * 86316Seschrock * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 96316Seschrock * or http://www.opensolaris.org/os/licensing. 106316Seschrock * See the License for the specific language governing permissions 116316Seschrock * and limitations under the License. 126316Seschrock * 136316Seschrock * When distributing Covered Code, include this CDDL HEADER in each 146316Seschrock * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 156316Seschrock * If applicable, add the following below this CDDL HEADER, with the 166316Seschrock * fields enclosed by brackets "[]" replaced with your own identifying 176316Seschrock * information: Portions Copyright [yyyy] [name of copyright owner] 186316Seschrock * 196316Seschrock * CDDL HEADER END 206316Seschrock */ 216316Seschrock 226316Seschrock /* 23*12126SHyon.Kim@Sun.COM * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 246316Seschrock */ 256316Seschrock 266316Seschrock #ifndef _LIBSES_PLUGIN_H 276316Seschrock #define _LIBSES_PLUGIN_H 286316Seschrock 296316Seschrock #ifdef __cplusplus 306316Seschrock extern "C" { 316316Seschrock #endif 326316Seschrock 336316Seschrock #define LIBSES_PLUGIN_VERSION 1 346316Seschrock 356316Seschrock /* 366316Seschrock * These are the primary APIs for plugins to interact with libses. 376316Seschrock */ 386316Seschrock 396316Seschrock struct ses_plugin; 406316Seschrock typedef struct ses_plugin ses_plugin_t; 416316Seschrock 426316Seschrock typedef enum { 436316Seschrock SES_PAGE_DIAG, 446316Seschrock SES_PAGE_CTL 456316Seschrock } ses_pagetype_t; 466316Seschrock 47*12126SHyon.Kim@Sun.COM typedef enum ses_page_req { 48*12126SHyon.Kim@Sun.COM SES_REQ_OPTIONAL, 49*12126SHyon.Kim@Sun.COM SES_REQ_MANDATORY_ALL, 50*12126SHyon.Kim@Sun.COM SES_REQ_MANDATORY_STANDARD, 51*12126SHyon.Kim@Sun.COM SES_REQ_OPTIONAL_STANDARD 52*12126SHyon.Kim@Sun.COM } ses_page_req_t; 53*12126SHyon.Kim@Sun.COM 546316Seschrock typedef struct ses_pagedesc { 556316Seschrock int spd_pagenum; 566316Seschrock size_t (*spd_ctl_len)(uint_t, int, size_t); 576316Seschrock void *(*spd_ctl_fill)(ses_plugin_t *, void *, size_t, 586316Seschrock ses_node_t *); 596316Seschrock void *(*spd_index)(ses_plugin_t *, ses_node_t *, 606316Seschrock void *, size_t, size_t *); 616316Seschrock int spd_gcoff; 62*12126SHyon.Kim@Sun.COM ses_page_req_t spd_req; 636316Seschrock } ses_pagedesc_t; 646316Seschrock 656316Seschrock typedef struct ses_plugin_config { 666316Seschrock ses_pagedesc_t *spc_pages; 676316Seschrock int (*spc_node_parse)(ses_plugin_t *, ses_node_t *); 686316Seschrock int (*spc_node_ctl)(ses_plugin_t *, ses_node_t *, 696316Seschrock const char *, nvlist_t *); 706316Seschrock } ses_plugin_config_t; 716316Seschrock 726316Seschrock extern int ses_plugin_register(ses_plugin_t *, int, ses_plugin_config_t *); 736316Seschrock 746316Seschrock extern void *ses_plugin_page_lookup(ses_plugin_t *, ses_snap_t *, int, 756316Seschrock ses_node_t *, size_t *); 766316Seschrock 776316Seschrock extern void *ses_plugin_ctlpage_lookup(ses_plugin_t *, ses_snap_t *, int, 786316Seschrock size_t, ses_node_t *, boolean_t); 796316Seschrock 806316Seschrock extern void ses_plugin_setspecific(ses_plugin_t *, void *); 816316Seschrock extern void *ses_plugin_getspecific(ses_plugin_t *); 826316Seschrock 836316Seschrock /* 846316Seschrock * The following are support functions provided by libses. 856316Seschrock */ 866316Seschrock 876316Seschrock extern int ses_assert(const char *, const char *, int); 886316Seschrock 896316Seschrock #define VERIFY(x) ((void)((x) || ses_assert(#x, __FILE__, __LINE__))) 906316Seschrock 916316Seschrock #ifdef DEBUG 926316Seschrock #define ASSERT(x) VERIFY(x) 936316Seschrock #else 946316Seschrock #define ASSERT(x) 956316Seschrock #endif 966316Seschrock 976316Seschrock #define SES_NV_ADD(_t, _e, _l, _n, ...) \ 986316Seschrock if (((_e) = nvlist_add_##_t((_l), (_n), __VA_ARGS__)) != 0) \ 996316Seschrock return (ses_set_nverrno((_e), (_n))) 1006316Seschrock 1016316Seschrock #define SES_NV_ADD_OR_FREE(_t, _e, _l, _n, ...) \ 1026316Seschrock if (((_e) = nvlist_add_##_t((_l), (_n), __VA_ARGS__)) != 0) { \ 1036316Seschrock nvlist_free(_l); return (ses_set_nverrno((_e), (_n))); } 1046316Seschrock 1056316Seschrock #define SES_NV_ADD_FS(_e, _l, _name, _buf) \ 1066316Seschrock SES_NV_ADD(fixed_string, (_e), (_l), (_name), (_buf), sizeof (_buf)) 1076316Seschrock 1086316Seschrock #define SES_NV_ADD_FS_TRUNC(_e, _l, _name, _buf) \ 1096316Seschrock SES_NV_ADD(fixed_string_trunc, (_e), (_l), (_name), (_buf), \ 1106316Seschrock sizeof (_buf)) 1116316Seschrock 1126316Seschrock #define SES_NV_CTLBOOL(_l, _n, _b) \ 1136316Seschrock { \ 1146316Seschrock boolean_t v = B_FALSE; \ 1156316Seschrock (void) nvlist_lookup_boolean_value((_l), (_n), &v); \ 1166316Seschrock (_b) = v; \ 1176316Seschrock } 1186316Seschrock 1196316Seschrock #define SES_NV_CTLBOOL_INVERT(_l, _n, _b) \ 1206316Seschrock { \ 1216316Seschrock boolean_t v = B_FALSE; \ 1226316Seschrock (void) nvlist_lookup_boolean_value((_l), (_n), &v); \ 1236316Seschrock (_b) = !v; \ 1246316Seschrock } 1256316Seschrock 1266316Seschrock #define SES_NV_CTL64(_l, _n, _v) \ 1276316Seschrock { \ 1286316Seschrock uint64_t v = 0; \ 1296316Seschrock (void) nvlist_lookup_uint64((_l), (_n), &v); \ 1306316Seschrock (_v) = v; \ 1316316Seschrock } 1326316Seschrock 1336316Seschrock #define SES_NV_CTL16(_l, _n, _v) \ 1346316Seschrock { \ 1356316Seschrock uint16_t v = 0; \ 1366316Seschrock (void) nvlist_lookup_uint16((_l), (_n), &v); \ 1376316Seschrock SCSI_WRITE16(&(_v), v); \ 1386316Seschrock } 1396316Seschrock 1406316Seschrock extern void *ses_alloc(size_t); 1416316Seschrock extern void *ses_zalloc(size_t); 1426316Seschrock extern char *ses_strdup(const char *); 1436316Seschrock extern void *ses_realloc(void *, size_t); 1446316Seschrock extern void ses_free(void *); 1456316Seschrock 1466316Seschrock extern int ses_set_errno(ses_errno_t); 1476316Seschrock extern int ses_set_nverrno(int, const char *); 1486316Seschrock extern int ses_error(ses_errno_t, const char *, ...); 1496316Seschrock extern int ses_nverror(int, const char *, const char *, ...); 1506316Seschrock extern void ses_panic(const char *, ...) __NORETURN; 1516316Seschrock 1526316Seschrock extern int nvlist_add_fixed_string(nvlist_t *, const char *, 1536316Seschrock const char *, size_t); 1546316Seschrock extern int nvlist_add_fixed_string_trunc(nvlist_t *, const char *, 1556316Seschrock const char *, size_t); 1566316Seschrock 1576316Seschrock #define SES_WITHIN_PAGE(sp, size, data, len) \ 1586316Seschrock ((char *)(sp) <= (char *)(data) + (len) - (size)) 1596316Seschrock #define SES_WITHIN_PAGE_STRUCT(sp, data, len) \ 1606316Seschrock SES_WITHIN_PAGE((sp), sizeof (*(sp)), (data), (len)) 1616316Seschrock 1626316Seschrock #ifdef __cplusplus 1636316Seschrock } 1646316Seschrock #endif 1656316Seschrock 1666316Seschrock #endif /* _LIBSES_PLUGIN_H */ 167