1275c9da8Seschrock /* 2275c9da8Seschrock * CDDL HEADER START 3275c9da8Seschrock * 4275c9da8Seschrock * The contents of this file are subject to the terms of the 5275c9da8Seschrock * Common Development and Distribution License (the "License"). 6275c9da8Seschrock * You may not use this file except in compliance with the License. 7275c9da8Seschrock * 8275c9da8Seschrock * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9275c9da8Seschrock * or http://www.opensolaris.org/os/licensing. 10275c9da8Seschrock * See the License for the specific language governing permissions 11275c9da8Seschrock * and limitations under the License. 12275c9da8Seschrock * 13275c9da8Seschrock * When distributing Covered Code, include this CDDL HEADER in each 14275c9da8Seschrock * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15275c9da8Seschrock * If applicable, add the following below this CDDL HEADER, with the 16275c9da8Seschrock * fields enclosed by brackets "[]" replaced with your own identifying 17275c9da8Seschrock * information: Portions Copyright [yyyy] [name of copyright owner] 18275c9da8Seschrock * 19275c9da8Seschrock * CDDL HEADER END 20275c9da8Seschrock */ 21275c9da8Seschrock 22275c9da8Seschrock /* 23*ac88567aSHyon Kim * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 24275c9da8Seschrock */ 25275c9da8Seschrock 26275c9da8Seschrock #ifndef _LIBSES_PLUGIN_H 27275c9da8Seschrock #define _LIBSES_PLUGIN_H 28275c9da8Seschrock 29275c9da8Seschrock #ifdef __cplusplus 30275c9da8Seschrock extern "C" { 31275c9da8Seschrock #endif 32275c9da8Seschrock 33275c9da8Seschrock #define LIBSES_PLUGIN_VERSION 1 34275c9da8Seschrock 35275c9da8Seschrock /* 36275c9da8Seschrock * These are the primary APIs for plugins to interact with libses. 37275c9da8Seschrock */ 38275c9da8Seschrock 39275c9da8Seschrock struct ses_plugin; 40275c9da8Seschrock typedef struct ses_plugin ses_plugin_t; 41275c9da8Seschrock 42275c9da8Seschrock typedef enum { 43275c9da8Seschrock SES_PAGE_DIAG, 44275c9da8Seschrock SES_PAGE_CTL 45275c9da8Seschrock } ses_pagetype_t; 46275c9da8Seschrock 47*ac88567aSHyon Kim typedef enum ses_page_req { 48*ac88567aSHyon Kim SES_REQ_OPTIONAL, 49*ac88567aSHyon Kim SES_REQ_MANDATORY_ALL, 50*ac88567aSHyon Kim SES_REQ_MANDATORY_STANDARD, 51*ac88567aSHyon Kim SES_REQ_OPTIONAL_STANDARD 52*ac88567aSHyon Kim } ses_page_req_t; 53*ac88567aSHyon Kim 54275c9da8Seschrock typedef struct ses_pagedesc { 55275c9da8Seschrock int spd_pagenum; 56275c9da8Seschrock size_t (*spd_ctl_len)(uint_t, int, size_t); 57275c9da8Seschrock void *(*spd_ctl_fill)(ses_plugin_t *, void *, size_t, 58275c9da8Seschrock ses_node_t *); 59275c9da8Seschrock void *(*spd_index)(ses_plugin_t *, ses_node_t *, 60275c9da8Seschrock void *, size_t, size_t *); 61275c9da8Seschrock int spd_gcoff; 62*ac88567aSHyon Kim ses_page_req_t spd_req; 63275c9da8Seschrock } ses_pagedesc_t; 64275c9da8Seschrock 65275c9da8Seschrock typedef struct ses_plugin_config { 66275c9da8Seschrock ses_pagedesc_t *spc_pages; 67275c9da8Seschrock int (*spc_node_parse)(ses_plugin_t *, ses_node_t *); 68275c9da8Seschrock int (*spc_node_ctl)(ses_plugin_t *, ses_node_t *, 69275c9da8Seschrock const char *, nvlist_t *); 70275c9da8Seschrock } ses_plugin_config_t; 71275c9da8Seschrock 72275c9da8Seschrock extern int ses_plugin_register(ses_plugin_t *, int, ses_plugin_config_t *); 73275c9da8Seschrock 74275c9da8Seschrock extern void *ses_plugin_page_lookup(ses_plugin_t *, ses_snap_t *, int, 75275c9da8Seschrock ses_node_t *, size_t *); 76275c9da8Seschrock 77275c9da8Seschrock extern void *ses_plugin_ctlpage_lookup(ses_plugin_t *, ses_snap_t *, int, 78275c9da8Seschrock size_t, ses_node_t *, boolean_t); 79275c9da8Seschrock 80275c9da8Seschrock extern void ses_plugin_setspecific(ses_plugin_t *, void *); 81275c9da8Seschrock extern void *ses_plugin_getspecific(ses_plugin_t *); 82275c9da8Seschrock 83275c9da8Seschrock /* 84275c9da8Seschrock * The following are support functions provided by libses. 85275c9da8Seschrock */ 86275c9da8Seschrock 87275c9da8Seschrock extern int ses_assert(const char *, const char *, int); 88275c9da8Seschrock 89275c9da8Seschrock #define VERIFY(x) ((void)((x) || ses_assert(#x, __FILE__, __LINE__))) 90275c9da8Seschrock 91275c9da8Seschrock #ifdef DEBUG 92275c9da8Seschrock #define ASSERT(x) VERIFY(x) 93275c9da8Seschrock #else 94275c9da8Seschrock #define ASSERT(x) 95275c9da8Seschrock #endif 96275c9da8Seschrock 97275c9da8Seschrock #define SES_NV_ADD(_t, _e, _l, _n, ...) \ 98275c9da8Seschrock if (((_e) = nvlist_add_##_t((_l), (_n), __VA_ARGS__)) != 0) \ 99275c9da8Seschrock return (ses_set_nverrno((_e), (_n))) 100275c9da8Seschrock 101275c9da8Seschrock #define SES_NV_ADD_OR_FREE(_t, _e, _l, _n, ...) \ 102275c9da8Seschrock if (((_e) = nvlist_add_##_t((_l), (_n), __VA_ARGS__)) != 0) { \ 103275c9da8Seschrock nvlist_free(_l); return (ses_set_nverrno((_e), (_n))); } 104275c9da8Seschrock 105275c9da8Seschrock #define SES_NV_ADD_FS(_e, _l, _name, _buf) \ 106275c9da8Seschrock SES_NV_ADD(fixed_string, (_e), (_l), (_name), (_buf), sizeof (_buf)) 107275c9da8Seschrock 108275c9da8Seschrock #define SES_NV_ADD_FS_TRUNC(_e, _l, _name, _buf) \ 109275c9da8Seschrock SES_NV_ADD(fixed_string_trunc, (_e), (_l), (_name), (_buf), \ 110275c9da8Seschrock sizeof (_buf)) 111275c9da8Seschrock 112275c9da8Seschrock #define SES_NV_CTLBOOL(_l, _n, _b) \ 113275c9da8Seschrock { \ 114275c9da8Seschrock boolean_t v = B_FALSE; \ 115275c9da8Seschrock (void) nvlist_lookup_boolean_value((_l), (_n), &v); \ 116275c9da8Seschrock (_b) = v; \ 117275c9da8Seschrock } 118275c9da8Seschrock 119275c9da8Seschrock #define SES_NV_CTLBOOL_INVERT(_l, _n, _b) \ 120275c9da8Seschrock { \ 121275c9da8Seschrock boolean_t v = B_FALSE; \ 122275c9da8Seschrock (void) nvlist_lookup_boolean_value((_l), (_n), &v); \ 123275c9da8Seschrock (_b) = !v; \ 124275c9da8Seschrock } 125275c9da8Seschrock 126275c9da8Seschrock #define SES_NV_CTL64(_l, _n, _v) \ 127275c9da8Seschrock { \ 128275c9da8Seschrock uint64_t v = 0; \ 129275c9da8Seschrock (void) nvlist_lookup_uint64((_l), (_n), &v); \ 130275c9da8Seschrock (_v) = v; \ 131275c9da8Seschrock } 132275c9da8Seschrock 133275c9da8Seschrock #define SES_NV_CTL16(_l, _n, _v) \ 134275c9da8Seschrock { \ 135275c9da8Seschrock uint16_t v = 0; \ 136275c9da8Seschrock (void) nvlist_lookup_uint16((_l), (_n), &v); \ 137275c9da8Seschrock SCSI_WRITE16(&(_v), v); \ 138275c9da8Seschrock } 139275c9da8Seschrock 140275c9da8Seschrock extern void *ses_alloc(size_t); 141275c9da8Seschrock extern void *ses_zalloc(size_t); 142275c9da8Seschrock extern char *ses_strdup(const char *); 143275c9da8Seschrock extern void *ses_realloc(void *, size_t); 144275c9da8Seschrock extern void ses_free(void *); 145275c9da8Seschrock 146275c9da8Seschrock extern int ses_set_errno(ses_errno_t); 147275c9da8Seschrock extern int ses_set_nverrno(int, const char *); 148275c9da8Seschrock extern int ses_error(ses_errno_t, const char *, ...); 149275c9da8Seschrock extern int ses_nverror(int, const char *, const char *, ...); 150275c9da8Seschrock extern void ses_panic(const char *, ...) __NORETURN; 151275c9da8Seschrock 152275c9da8Seschrock extern int nvlist_add_fixed_string(nvlist_t *, const char *, 153275c9da8Seschrock const char *, size_t); 154275c9da8Seschrock extern int nvlist_add_fixed_string_trunc(nvlist_t *, const char *, 155275c9da8Seschrock const char *, size_t); 156275c9da8Seschrock 157275c9da8Seschrock #define SES_WITHIN_PAGE(sp, size, data, len) \ 158275c9da8Seschrock ((char *)(sp) <= (char *)(data) + (len) - (size)) 159275c9da8Seschrock #define SES_WITHIN_PAGE_STRUCT(sp, data, len) \ 160275c9da8Seschrock SES_WITHIN_PAGE((sp), sizeof (*(sp)), (data), (len)) 161275c9da8Seschrock 162275c9da8Seschrock #ifdef __cplusplus 163275c9da8Seschrock } 164275c9da8Seschrock #endif 165275c9da8Seschrock 166275c9da8Seschrock #endif /* _LIBSES_PLUGIN_H */ 167