xref: /titanic_51/usr/src/lib/librsm/common/rsmloopback.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright (c) 1998-2001 by Sun Microsystems, Inc.
24*7c478bd9Sstevel@tonic-gate  * All rights reserved.
25*7c478bd9Sstevel@tonic-gate  */
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
28*7c478bd9Sstevel@tonic-gate 
29*7c478bd9Sstevel@tonic-gate #include <stdio.h>
30*7c478bd9Sstevel@tonic-gate #include <sys/types.h>
31*7c478bd9Sstevel@tonic-gate #include <sys/stat.h>
32*7c478bd9Sstevel@tonic-gate #include <sys/mman.h>
33*7c478bd9Sstevel@tonic-gate #include <sys/uio.h>
34*7c478bd9Sstevel@tonic-gate #include <sys/sysmacros.h>
35*7c478bd9Sstevel@tonic-gate #include <unistd.h>
36*7c478bd9Sstevel@tonic-gate #include <fcntl.h>
37*7c478bd9Sstevel@tonic-gate #include <dlfcn.h>
38*7c478bd9Sstevel@tonic-gate #include <sched.h>
39*7c478bd9Sstevel@tonic-gate #include <errno.h>
40*7c478bd9Sstevel@tonic-gate #include <strings.h>
41*7c478bd9Sstevel@tonic-gate 
42*7c478bd9Sstevel@tonic-gate #include <rsmapi.h>
43*7c478bd9Sstevel@tonic-gate #include <sys/rsm/rsmndi.h>
44*7c478bd9Sstevel@tonic-gate #include <rsmlib_in.h>
45*7c478bd9Sstevel@tonic-gate #include <sys/rsm/rsm.h>
46*7c478bd9Sstevel@tonic-gate 
47*7c478bd9Sstevel@tonic-gate extern int _rsm_memseg_import_map(rsm_memseg_import_handle_t,
48*7c478bd9Sstevel@tonic-gate     void **,
49*7c478bd9Sstevel@tonic-gate     rsm_attribute_t,
50*7c478bd9Sstevel@tonic-gate     rsm_permission_t,
51*7c478bd9Sstevel@tonic-gate     off_t, size_t);
52*7c478bd9Sstevel@tonic-gate 
53*7c478bd9Sstevel@tonic-gate extern int _rsm_memseg_import_unmap(rsm_memseg_import_handle_t);
54*7c478bd9Sstevel@tonic-gate 
55*7c478bd9Sstevel@tonic-gate static rsm_ndlib_attr_t _rsm_loopback_attr = {
56*7c478bd9Sstevel@tonic-gate 	B_TRUE,		/* mapping needed for put/get */
57*7c478bd9Sstevel@tonic-gate 	B_TRUE		/* mapping needed for putv/getv */
58*7c478bd9Sstevel@tonic-gate };
59*7c478bd9Sstevel@tonic-gate 
60*7c478bd9Sstevel@tonic-gate static int
61*7c478bd9Sstevel@tonic-gate loopback_get8(rsm_memseg_import_handle_t im_memseg, off_t off,
62*7c478bd9Sstevel@tonic-gate     uint8_t *datap,
63*7c478bd9Sstevel@tonic-gate     ulong_t rep_cnt,
64*7c478bd9Sstevel@tonic-gate     boolean_t swap)
65*7c478bd9Sstevel@tonic-gate {
66*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *seg = (rsmseg_handle_t *)im_memseg;
67*7c478bd9Sstevel@tonic-gate 	uint8_t *data_addr =
68*7c478bd9Sstevel@tonic-gate 	    (uint8_t *)&seg->rsmseg_vaddr[off - seg->rsmseg_mapoffset];
69*7c478bd9Sstevel@tonic-gate 	uint_t i = 0;
70*7c478bd9Sstevel@tonic-gate 	int	e;
71*7c478bd9Sstevel@tonic-gate 
72*7c478bd9Sstevel@tonic-gate 	swap = swap;
73*7c478bd9Sstevel@tonic-gate 
74*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
75*7c478bd9Sstevel@tonic-gate 	    "loopback_get8: enter\n"));
76*7c478bd9Sstevel@tonic-gate 
77*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
78*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_open_barrier(
79*7c478bd9Sstevel@tonic-gate 				(rsm_barrier_handle_t)seg->rsmseg_barrier);
80*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
81*7c478bd9Sstevel@tonic-gate 			return (e);
82*7c478bd9Sstevel@tonic-gate 		}
83*7c478bd9Sstevel@tonic-gate 	}
84*7c478bd9Sstevel@tonic-gate 
85*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < rep_cnt; i++) {
86*7c478bd9Sstevel@tonic-gate 		datap[i] = data_addr[i];
87*7c478bd9Sstevel@tonic-gate 	}
88*7c478bd9Sstevel@tonic-gate 
89*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
90*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_close_barrier(
91*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
92*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
93*7c478bd9Sstevel@tonic-gate 			return (e);
94*7c478bd9Sstevel@tonic-gate 		}
95*7c478bd9Sstevel@tonic-gate 	}
96*7c478bd9Sstevel@tonic-gate 
97*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
98*7c478bd9Sstevel@tonic-gate 	    "loopback_get8: exit\n"));
99*7c478bd9Sstevel@tonic-gate 
100*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
101*7c478bd9Sstevel@tonic-gate }
102*7c478bd9Sstevel@tonic-gate 
103*7c478bd9Sstevel@tonic-gate static int
104*7c478bd9Sstevel@tonic-gate loopback_get16(rsm_memseg_import_handle_t im_memseg, off_t off,
105*7c478bd9Sstevel@tonic-gate     uint16_t *datap,
106*7c478bd9Sstevel@tonic-gate     ulong_t rep_cnt,
107*7c478bd9Sstevel@tonic-gate     boolean_t swap)
108*7c478bd9Sstevel@tonic-gate {
109*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *seg = (rsmseg_handle_t *)im_memseg;
110*7c478bd9Sstevel@tonic-gate 	uint16_t *data_addr =
111*7c478bd9Sstevel@tonic-gate 	    /* LINTED */
112*7c478bd9Sstevel@tonic-gate 	    (uint16_t *)&seg->rsmseg_vaddr[off - seg->rsmseg_mapoffset];
113*7c478bd9Sstevel@tonic-gate 	uint_t i = 0;
114*7c478bd9Sstevel@tonic-gate 	int	e;
115*7c478bd9Sstevel@tonic-gate 
116*7c478bd9Sstevel@tonic-gate 	swap = swap;
117*7c478bd9Sstevel@tonic-gate 
118*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
119*7c478bd9Sstevel@tonic-gate 	    "loopback_get16: enter\n"));
120*7c478bd9Sstevel@tonic-gate 
121*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
122*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_open_barrier(
123*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
124*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
125*7c478bd9Sstevel@tonic-gate 			return (e);
126*7c478bd9Sstevel@tonic-gate 		}
127*7c478bd9Sstevel@tonic-gate 	}
128*7c478bd9Sstevel@tonic-gate 
129*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < rep_cnt; i++) {
130*7c478bd9Sstevel@tonic-gate 		datap[i] = data_addr[i];
131*7c478bd9Sstevel@tonic-gate 	}
132*7c478bd9Sstevel@tonic-gate 
133*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
134*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_close_barrier(
135*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
136*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
137*7c478bd9Sstevel@tonic-gate 			return (e);
138*7c478bd9Sstevel@tonic-gate 		}
139*7c478bd9Sstevel@tonic-gate 	}
140*7c478bd9Sstevel@tonic-gate 
141*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
142*7c478bd9Sstevel@tonic-gate 	    "loopback_get16: exit\n"));
143*7c478bd9Sstevel@tonic-gate 
144*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
145*7c478bd9Sstevel@tonic-gate }
146*7c478bd9Sstevel@tonic-gate 
147*7c478bd9Sstevel@tonic-gate static int
148*7c478bd9Sstevel@tonic-gate loopback_get32(rsm_memseg_import_handle_t im_memseg, off_t off,
149*7c478bd9Sstevel@tonic-gate     uint32_t *datap,
150*7c478bd9Sstevel@tonic-gate     ulong_t rep_cnt,
151*7c478bd9Sstevel@tonic-gate     boolean_t swap)
152*7c478bd9Sstevel@tonic-gate {
153*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *seg = (rsmseg_handle_t *)im_memseg;
154*7c478bd9Sstevel@tonic-gate 	uint32_t *data_addr =
155*7c478bd9Sstevel@tonic-gate 	    /* LINTED */
156*7c478bd9Sstevel@tonic-gate 	    (uint32_t *)&seg->rsmseg_vaddr[off - seg->rsmseg_mapoffset];
157*7c478bd9Sstevel@tonic-gate 	uint_t i = 0;
158*7c478bd9Sstevel@tonic-gate 	int	e;
159*7c478bd9Sstevel@tonic-gate 
160*7c478bd9Sstevel@tonic-gate 	swap = swap;
161*7c478bd9Sstevel@tonic-gate 
162*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
163*7c478bd9Sstevel@tonic-gate 	    "loopback_get32: enter\n"));
164*7c478bd9Sstevel@tonic-gate 
165*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
166*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_open_barrier(
167*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
168*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
169*7c478bd9Sstevel@tonic-gate 			return (e);
170*7c478bd9Sstevel@tonic-gate 		}
171*7c478bd9Sstevel@tonic-gate 	}
172*7c478bd9Sstevel@tonic-gate 
173*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < rep_cnt; i++) {
174*7c478bd9Sstevel@tonic-gate 		datap[i] = data_addr[i];
175*7c478bd9Sstevel@tonic-gate 	}
176*7c478bd9Sstevel@tonic-gate 
177*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
178*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_close_barrier(
179*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
180*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
181*7c478bd9Sstevel@tonic-gate 			return (e);
182*7c478bd9Sstevel@tonic-gate 		}
183*7c478bd9Sstevel@tonic-gate 	}
184*7c478bd9Sstevel@tonic-gate 
185*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
186*7c478bd9Sstevel@tonic-gate 	    "loopback_get32: exit\n"));
187*7c478bd9Sstevel@tonic-gate 
188*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
189*7c478bd9Sstevel@tonic-gate }
190*7c478bd9Sstevel@tonic-gate 
191*7c478bd9Sstevel@tonic-gate static int
192*7c478bd9Sstevel@tonic-gate loopback_get64(rsm_memseg_import_handle_t im_memseg, off_t off,
193*7c478bd9Sstevel@tonic-gate     uint64_t *datap,
194*7c478bd9Sstevel@tonic-gate     ulong_t rep_cnt,
195*7c478bd9Sstevel@tonic-gate     boolean_t swap)
196*7c478bd9Sstevel@tonic-gate {
197*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *seg = (rsmseg_handle_t *)im_memseg;
198*7c478bd9Sstevel@tonic-gate 	uint64_t *data_addr =
199*7c478bd9Sstevel@tonic-gate 	    /* LINTED */
200*7c478bd9Sstevel@tonic-gate 	    (uint64_t *)&seg->rsmseg_vaddr[off - seg->rsmseg_mapoffset];
201*7c478bd9Sstevel@tonic-gate 	uint_t i = 0;
202*7c478bd9Sstevel@tonic-gate 	int	e;
203*7c478bd9Sstevel@tonic-gate 
204*7c478bd9Sstevel@tonic-gate 	swap = swap;
205*7c478bd9Sstevel@tonic-gate 
206*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
207*7c478bd9Sstevel@tonic-gate 	    "loopback_get64: enter\n"));
208*7c478bd9Sstevel@tonic-gate 
209*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
210*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_open_barrier(
211*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
212*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
213*7c478bd9Sstevel@tonic-gate 			return (e);
214*7c478bd9Sstevel@tonic-gate 		}
215*7c478bd9Sstevel@tonic-gate 	}
216*7c478bd9Sstevel@tonic-gate 
217*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < rep_cnt; i++) {
218*7c478bd9Sstevel@tonic-gate 		datap[i] = data_addr[i];
219*7c478bd9Sstevel@tonic-gate 	}
220*7c478bd9Sstevel@tonic-gate 
221*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
222*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_close_barrier(
223*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
224*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
225*7c478bd9Sstevel@tonic-gate 			return (e);
226*7c478bd9Sstevel@tonic-gate 		}
227*7c478bd9Sstevel@tonic-gate 	}
228*7c478bd9Sstevel@tonic-gate 
229*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
230*7c478bd9Sstevel@tonic-gate 	    "loopback_get64: exit\n"));
231*7c478bd9Sstevel@tonic-gate 
232*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
233*7c478bd9Sstevel@tonic-gate }
234*7c478bd9Sstevel@tonic-gate 
235*7c478bd9Sstevel@tonic-gate static int
236*7c478bd9Sstevel@tonic-gate loopback_put8(rsm_memseg_import_handle_t im_memseg, off_t off,
237*7c478bd9Sstevel@tonic-gate     uint8_t *datap,
238*7c478bd9Sstevel@tonic-gate     ulong_t rep_cnt,
239*7c478bd9Sstevel@tonic-gate     boolean_t swap)
240*7c478bd9Sstevel@tonic-gate {
241*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *seg = (rsmseg_handle_t *)im_memseg;
242*7c478bd9Sstevel@tonic-gate 	uint8_t *data_addr =
243*7c478bd9Sstevel@tonic-gate 		(uint8_t *)&seg->rsmseg_vaddr[off - seg->rsmseg_mapoffset];
244*7c478bd9Sstevel@tonic-gate 	uint_t i = 0;
245*7c478bd9Sstevel@tonic-gate 	int	e;
246*7c478bd9Sstevel@tonic-gate 
247*7c478bd9Sstevel@tonic-gate 	swap = swap;
248*7c478bd9Sstevel@tonic-gate 
249*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
250*7c478bd9Sstevel@tonic-gate 	    "loopback_put8: enter\n"));
251*7c478bd9Sstevel@tonic-gate 
252*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
253*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_open_barrier(
254*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
255*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
256*7c478bd9Sstevel@tonic-gate 			return (e);
257*7c478bd9Sstevel@tonic-gate 		}
258*7c478bd9Sstevel@tonic-gate 	}
259*7c478bd9Sstevel@tonic-gate 
260*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < rep_cnt; i++) {
261*7c478bd9Sstevel@tonic-gate 		data_addr[i] = datap[i];
262*7c478bd9Sstevel@tonic-gate 	}
263*7c478bd9Sstevel@tonic-gate 
264*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
265*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_close_barrier(
266*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
267*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
268*7c478bd9Sstevel@tonic-gate 			return (e);
269*7c478bd9Sstevel@tonic-gate 		}
270*7c478bd9Sstevel@tonic-gate 	}
271*7c478bd9Sstevel@tonic-gate 
272*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
273*7c478bd9Sstevel@tonic-gate 	    "loopback_put8: exit\n"));
274*7c478bd9Sstevel@tonic-gate 
275*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
276*7c478bd9Sstevel@tonic-gate }
277*7c478bd9Sstevel@tonic-gate 
278*7c478bd9Sstevel@tonic-gate static int
279*7c478bd9Sstevel@tonic-gate loopback_put16(rsm_memseg_import_handle_t im_memseg, off_t off,
280*7c478bd9Sstevel@tonic-gate     uint16_t *datap,
281*7c478bd9Sstevel@tonic-gate     ulong_t rep_cnt,
282*7c478bd9Sstevel@tonic-gate     boolean_t swap)
283*7c478bd9Sstevel@tonic-gate {
284*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *seg = (rsmseg_handle_t *)im_memseg;
285*7c478bd9Sstevel@tonic-gate 	uint16_t *data_addr =
286*7c478bd9Sstevel@tonic-gate 	    /* LINTED */
287*7c478bd9Sstevel@tonic-gate 	    (uint16_t *)&seg->rsmseg_vaddr[off - seg->rsmseg_mapoffset];
288*7c478bd9Sstevel@tonic-gate 	uint_t i = 0;
289*7c478bd9Sstevel@tonic-gate 	int	e;
290*7c478bd9Sstevel@tonic-gate 
291*7c478bd9Sstevel@tonic-gate 	swap = swap;
292*7c478bd9Sstevel@tonic-gate 
293*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
294*7c478bd9Sstevel@tonic-gate 	    "loopback_put16: enter\n"));
295*7c478bd9Sstevel@tonic-gate 
296*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
297*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_open_barrier(
298*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
299*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
300*7c478bd9Sstevel@tonic-gate 			return (e);
301*7c478bd9Sstevel@tonic-gate 		}
302*7c478bd9Sstevel@tonic-gate 	}
303*7c478bd9Sstevel@tonic-gate 
304*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < rep_cnt; i++) {
305*7c478bd9Sstevel@tonic-gate 		data_addr[i] = datap[i];
306*7c478bd9Sstevel@tonic-gate 	}
307*7c478bd9Sstevel@tonic-gate 
308*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
309*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_close_barrier(
310*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
311*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
312*7c478bd9Sstevel@tonic-gate 			return (e);
313*7c478bd9Sstevel@tonic-gate 		}
314*7c478bd9Sstevel@tonic-gate 	}
315*7c478bd9Sstevel@tonic-gate 
316*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
317*7c478bd9Sstevel@tonic-gate 	    "loopback_put16: exit\n"));
318*7c478bd9Sstevel@tonic-gate 
319*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
320*7c478bd9Sstevel@tonic-gate }
321*7c478bd9Sstevel@tonic-gate 
322*7c478bd9Sstevel@tonic-gate static int
323*7c478bd9Sstevel@tonic-gate loopback_put32(rsm_memseg_import_handle_t im_memseg, off_t off,
324*7c478bd9Sstevel@tonic-gate     uint32_t *datap,
325*7c478bd9Sstevel@tonic-gate     ulong_t rep_cnt,
326*7c478bd9Sstevel@tonic-gate     boolean_t swap)
327*7c478bd9Sstevel@tonic-gate {
328*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *seg = (rsmseg_handle_t *)im_memseg;
329*7c478bd9Sstevel@tonic-gate 	uint32_t *data_addr =
330*7c478bd9Sstevel@tonic-gate 	    /* LINTED */
331*7c478bd9Sstevel@tonic-gate 	    (uint32_t *)&seg->rsmseg_vaddr[off - seg->rsmseg_mapoffset];
332*7c478bd9Sstevel@tonic-gate 	uint_t i = 0;
333*7c478bd9Sstevel@tonic-gate 	int	e;
334*7c478bd9Sstevel@tonic-gate 
335*7c478bd9Sstevel@tonic-gate 	swap = swap;
336*7c478bd9Sstevel@tonic-gate 
337*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
338*7c478bd9Sstevel@tonic-gate 	    "loopback_put32: enter\n"));
339*7c478bd9Sstevel@tonic-gate 
340*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
341*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_open_barrier(
342*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
343*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
344*7c478bd9Sstevel@tonic-gate 			return (e);
345*7c478bd9Sstevel@tonic-gate 		}
346*7c478bd9Sstevel@tonic-gate 	}
347*7c478bd9Sstevel@tonic-gate 
348*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < rep_cnt; i++) {
349*7c478bd9Sstevel@tonic-gate 		data_addr[i] = datap[i];
350*7c478bd9Sstevel@tonic-gate 	}
351*7c478bd9Sstevel@tonic-gate 
352*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
353*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_close_barrier(
354*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
355*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
356*7c478bd9Sstevel@tonic-gate 			return (e);
357*7c478bd9Sstevel@tonic-gate 		}
358*7c478bd9Sstevel@tonic-gate 	}
359*7c478bd9Sstevel@tonic-gate 
360*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
361*7c478bd9Sstevel@tonic-gate 	    "loopback_put32: exit\n"));
362*7c478bd9Sstevel@tonic-gate 
363*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
364*7c478bd9Sstevel@tonic-gate }
365*7c478bd9Sstevel@tonic-gate 
366*7c478bd9Sstevel@tonic-gate static int
367*7c478bd9Sstevel@tonic-gate loopback_put64(rsm_memseg_import_handle_t im_memseg, off_t off,
368*7c478bd9Sstevel@tonic-gate     uint64_t *datap,
369*7c478bd9Sstevel@tonic-gate     ulong_t rep_cnt,
370*7c478bd9Sstevel@tonic-gate     boolean_t swap)
371*7c478bd9Sstevel@tonic-gate {
372*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *seg = (rsmseg_handle_t *)im_memseg;
373*7c478bd9Sstevel@tonic-gate 	uint64_t *data_addr =
374*7c478bd9Sstevel@tonic-gate 	    /* LINTED */
375*7c478bd9Sstevel@tonic-gate 	    (uint64_t *)&seg->rsmseg_vaddr[off - seg->rsmseg_mapoffset];
376*7c478bd9Sstevel@tonic-gate 	uint_t i = 0;
377*7c478bd9Sstevel@tonic-gate 	int	e;
378*7c478bd9Sstevel@tonic-gate 
379*7c478bd9Sstevel@tonic-gate 	swap = swap;
380*7c478bd9Sstevel@tonic-gate 
381*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
382*7c478bd9Sstevel@tonic-gate 	    "loopback_put64: enter\n"));
383*7c478bd9Sstevel@tonic-gate 
384*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
385*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_open_barrier(
386*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
387*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
388*7c478bd9Sstevel@tonic-gate 			return (e);
389*7c478bd9Sstevel@tonic-gate 		}
390*7c478bd9Sstevel@tonic-gate 	}
391*7c478bd9Sstevel@tonic-gate 
392*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < rep_cnt; i++) {
393*7c478bd9Sstevel@tonic-gate 		data_addr[i] = datap[i];
394*7c478bd9Sstevel@tonic-gate 	}
395*7c478bd9Sstevel@tonic-gate 
396*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
397*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_close_barrier(
398*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
399*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
400*7c478bd9Sstevel@tonic-gate 			return (e);
401*7c478bd9Sstevel@tonic-gate 		}
402*7c478bd9Sstevel@tonic-gate 	}
403*7c478bd9Sstevel@tonic-gate 
404*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
405*7c478bd9Sstevel@tonic-gate 	    "loopback_put64: exit\n"));
406*7c478bd9Sstevel@tonic-gate 
407*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
408*7c478bd9Sstevel@tonic-gate }
409*7c478bd9Sstevel@tonic-gate 
410*7c478bd9Sstevel@tonic-gate static int
411*7c478bd9Sstevel@tonic-gate loopback_get(rsm_memseg_import_handle_t im_memseg, off_t offset, void *dst_addr,
412*7c478bd9Sstevel@tonic-gate     size_t length)
413*7c478bd9Sstevel@tonic-gate {
414*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *seg = (rsmseg_handle_t *)im_memseg;
415*7c478bd9Sstevel@tonic-gate 	int	e;
416*7c478bd9Sstevel@tonic-gate 
417*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
418*7c478bd9Sstevel@tonic-gate 	    "loopback_get: enter\n"));
419*7c478bd9Sstevel@tonic-gate 
420*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
421*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_open_barrier(
422*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
423*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
424*7c478bd9Sstevel@tonic-gate 			return (e);
425*7c478bd9Sstevel@tonic-gate 		}
426*7c478bd9Sstevel@tonic-gate 	}
427*7c478bd9Sstevel@tonic-gate 
428*7c478bd9Sstevel@tonic-gate 	bcopy(seg->rsmseg_vaddr + offset - seg->rsmseg_mapoffset, dst_addr,
429*7c478bd9Sstevel@tonic-gate 		length);
430*7c478bd9Sstevel@tonic-gate 
431*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
432*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_close_barrier(
433*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
434*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
435*7c478bd9Sstevel@tonic-gate 			return (e);
436*7c478bd9Sstevel@tonic-gate 		}
437*7c478bd9Sstevel@tonic-gate 	}
438*7c478bd9Sstevel@tonic-gate 
439*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
440*7c478bd9Sstevel@tonic-gate 	    "loopback_get: exit\n"));
441*7c478bd9Sstevel@tonic-gate 
442*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
443*7c478bd9Sstevel@tonic-gate }
444*7c478bd9Sstevel@tonic-gate 
445*7c478bd9Sstevel@tonic-gate 
446*7c478bd9Sstevel@tonic-gate /*
447*7c478bd9Sstevel@tonic-gate  * Move data to each component of the io vector from the remote segment
448*7c478bd9Sstevel@tonic-gate  */
449*7c478bd9Sstevel@tonic-gate int
450*7c478bd9Sstevel@tonic-gate loopback_getv(rsm_scat_gath_t *sg_io)
451*7c478bd9Sstevel@tonic-gate {
452*7c478bd9Sstevel@tonic-gate 	rsm_iovec_t	*iovec = sg_io->iovec;
453*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *im_seg = (rsmseg_handle_t *)sg_io->remote_handle;
454*7c478bd9Sstevel@tonic-gate 	int i;
455*7c478bd9Sstevel@tonic-gate 
456*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
457*7c478bd9Sstevel@tonic-gate 	    "loopback_getv: enter\n"));
458*7c478bd9Sstevel@tonic-gate 
459*7c478bd9Sstevel@tonic-gate 	/* do the vector data transfer */
460*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < sg_io->io_request_count; i++) {
461*7c478bd9Sstevel@tonic-gate 		(void) bcopy(im_seg->rsmseg_vaddr + iovec->remote_offset,
462*7c478bd9Sstevel@tonic-gate 		    iovec->local.vaddr + iovec->local_offset,
463*7c478bd9Sstevel@tonic-gate 		    iovec->transfer_length);
464*7c478bd9Sstevel@tonic-gate 		iovec++;
465*7c478bd9Sstevel@tonic-gate 	}
466*7c478bd9Sstevel@tonic-gate 
467*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
468*7c478bd9Sstevel@tonic-gate 	    "loopback_getv: exit\n"));
469*7c478bd9Sstevel@tonic-gate 
470*7c478bd9Sstevel@tonic-gate 	sg_io->io_residual_count = 0;
471*7c478bd9Sstevel@tonic-gate 
472*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
473*7c478bd9Sstevel@tonic-gate }
474*7c478bd9Sstevel@tonic-gate 
475*7c478bd9Sstevel@tonic-gate static int
476*7c478bd9Sstevel@tonic-gate loopback_put(rsm_memseg_import_handle_t im_memseg, off_t offset, void *src_addr,
477*7c478bd9Sstevel@tonic-gate     size_t length)
478*7c478bd9Sstevel@tonic-gate {
479*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *seg = (rsmseg_handle_t *)im_memseg;
480*7c478bd9Sstevel@tonic-gate 	int	e;
481*7c478bd9Sstevel@tonic-gate 
482*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
483*7c478bd9Sstevel@tonic-gate 	    "loopback_put: enter\n"));
484*7c478bd9Sstevel@tonic-gate 
485*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
486*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_open_barrier(
487*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
488*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
489*7c478bd9Sstevel@tonic-gate 			return (e);
490*7c478bd9Sstevel@tonic-gate 		}
491*7c478bd9Sstevel@tonic-gate 	}
492*7c478bd9Sstevel@tonic-gate 
493*7c478bd9Sstevel@tonic-gate 	bcopy(src_addr, seg->rsmseg_vaddr + offset - seg->rsmseg_mapoffset,
494*7c478bd9Sstevel@tonic-gate 		length);
495*7c478bd9Sstevel@tonic-gate 
496*7c478bd9Sstevel@tonic-gate 	if (seg->rsmseg_barmode == RSM_BARRIER_MODE_IMPLICIT) {
497*7c478bd9Sstevel@tonic-gate 		e = seg->rsmseg_ops->rsm_memseg_import_close_barrier(
498*7c478bd9Sstevel@tonic-gate 		    (rsm_barrier_handle_t)seg->rsmseg_barrier);
499*7c478bd9Sstevel@tonic-gate 		if (e != RSM_SUCCESS) {
500*7c478bd9Sstevel@tonic-gate 			return (e);
501*7c478bd9Sstevel@tonic-gate 		}
502*7c478bd9Sstevel@tonic-gate 	}
503*7c478bd9Sstevel@tonic-gate 
504*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
505*7c478bd9Sstevel@tonic-gate 	    "loopback_put: exit\n"));
506*7c478bd9Sstevel@tonic-gate 
507*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
508*7c478bd9Sstevel@tonic-gate }
509*7c478bd9Sstevel@tonic-gate 
510*7c478bd9Sstevel@tonic-gate 
511*7c478bd9Sstevel@tonic-gate /*
512*7c478bd9Sstevel@tonic-gate  * Move data from each component of the io vector to the remote segment
513*7c478bd9Sstevel@tonic-gate  */
514*7c478bd9Sstevel@tonic-gate int
515*7c478bd9Sstevel@tonic-gate loopback_putv(rsm_scat_gath_t *sg_io)
516*7c478bd9Sstevel@tonic-gate {
517*7c478bd9Sstevel@tonic-gate 	rsm_iovec_t	*iovec = sg_io->iovec;
518*7c478bd9Sstevel@tonic-gate 	rsmseg_handle_t *im_seg = (rsmseg_handle_t *)sg_io->remote_handle;
519*7c478bd9Sstevel@tonic-gate 	int i;
520*7c478bd9Sstevel@tonic-gate 
521*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
522*7c478bd9Sstevel@tonic-gate 	    "loopback_putv: enter\n"));
523*7c478bd9Sstevel@tonic-gate 
524*7c478bd9Sstevel@tonic-gate 	/* do the vector data transfer */
525*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < sg_io->io_request_count; i++) {
526*7c478bd9Sstevel@tonic-gate 		(void) bcopy(iovec->local.vaddr + iovec->local_offset,
527*7c478bd9Sstevel@tonic-gate 		    im_seg->rsmseg_vaddr + iovec->remote_offset,
528*7c478bd9Sstevel@tonic-gate 		    iovec->transfer_length);
529*7c478bd9Sstevel@tonic-gate 		iovec++;
530*7c478bd9Sstevel@tonic-gate 	}
531*7c478bd9Sstevel@tonic-gate 
532*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
533*7c478bd9Sstevel@tonic-gate 	    "loopback_putv: exit\n"));
534*7c478bd9Sstevel@tonic-gate 
535*7c478bd9Sstevel@tonic-gate 	sg_io->io_residual_count = 0;
536*7c478bd9Sstevel@tonic-gate 
537*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
538*7c478bd9Sstevel@tonic-gate }
539*7c478bd9Sstevel@tonic-gate 
540*7c478bd9Sstevel@tonic-gate static int
541*7c478bd9Sstevel@tonic-gate loopback_create_handle(rsmapi_controller_handle_t controller,
542*7c478bd9Sstevel@tonic-gate     rsm_localmemory_handle_t *local_handle,
543*7c478bd9Sstevel@tonic-gate     caddr_t vaddr, size_t len)
544*7c478bd9Sstevel@tonic-gate {
545*7c478bd9Sstevel@tonic-gate 
546*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
547*7c478bd9Sstevel@tonic-gate 	    "loopback_create_handle: enter\n"));
548*7c478bd9Sstevel@tonic-gate 
549*7c478bd9Sstevel@tonic-gate 	controller = controller;
550*7c478bd9Sstevel@tonic-gate 	len = len;
551*7c478bd9Sstevel@tonic-gate 
552*7c478bd9Sstevel@tonic-gate 	*local_handle = (rsm_localmemory_handle_t)vaddr;
553*7c478bd9Sstevel@tonic-gate 
554*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
555*7c478bd9Sstevel@tonic-gate 	    "loopback_create_handle: exit\n"));
556*7c478bd9Sstevel@tonic-gate 
557*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
558*7c478bd9Sstevel@tonic-gate }
559*7c478bd9Sstevel@tonic-gate 
560*7c478bd9Sstevel@tonic-gate static int
561*7c478bd9Sstevel@tonic-gate loopback_free_handle(rsm_localmemory_handle_t handle)
562*7c478bd9Sstevel@tonic-gate {
563*7c478bd9Sstevel@tonic-gate 
564*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
565*7c478bd9Sstevel@tonic-gate 	    "loopback_free_handle: enter\n"));
566*7c478bd9Sstevel@tonic-gate 
567*7c478bd9Sstevel@tonic-gate 	handle = handle;
568*7c478bd9Sstevel@tonic-gate 
569*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
570*7c478bd9Sstevel@tonic-gate 	    "loopback_free_handle: exit\n"));
571*7c478bd9Sstevel@tonic-gate 
572*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
573*7c478bd9Sstevel@tonic-gate }
574*7c478bd9Sstevel@tonic-gate 
575*7c478bd9Sstevel@tonic-gate 
576*7c478bd9Sstevel@tonic-gate 	/*
577*7c478bd9Sstevel@tonic-gate 	 * import side memory segment operations (barriers):
578*7c478bd9Sstevel@tonic-gate 	 */
579*7c478bd9Sstevel@tonic-gate static int
580*7c478bd9Sstevel@tonic-gate loopback_init_barrier(rsm_memseg_import_handle_t im_memseg,
581*7c478bd9Sstevel@tonic-gate     rsm_barrier_type_t type,
582*7c478bd9Sstevel@tonic-gate     rsm_barrier_handle_t barrier)
583*7c478bd9Sstevel@tonic-gate {
584*7c478bd9Sstevel@tonic-gate 
585*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
586*7c478bd9Sstevel@tonic-gate 	    "loopback_init_barrier: enter\n"));
587*7c478bd9Sstevel@tonic-gate 
588*7c478bd9Sstevel@tonic-gate 	type = type; im_memseg = im_memseg; barrier = barrier;
589*7c478bd9Sstevel@tonic-gate 
590*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
591*7c478bd9Sstevel@tonic-gate 	    "loopback_init_barrier: exit\n"));
592*7c478bd9Sstevel@tonic-gate 
593*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
594*7c478bd9Sstevel@tonic-gate }
595*7c478bd9Sstevel@tonic-gate 
596*7c478bd9Sstevel@tonic-gate static int
597*7c478bd9Sstevel@tonic-gate loopback_open_barrier(rsm_barrier_handle_t barrier)
598*7c478bd9Sstevel@tonic-gate {
599*7c478bd9Sstevel@tonic-gate 
600*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
601*7c478bd9Sstevel@tonic-gate 	    "loopback_open_barrier: enter\n"));
602*7c478bd9Sstevel@tonic-gate 
603*7c478bd9Sstevel@tonic-gate 	barrier = barrier;
604*7c478bd9Sstevel@tonic-gate 
605*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
606*7c478bd9Sstevel@tonic-gate 	    "loopback_open_barrier: exit\n"));
607*7c478bd9Sstevel@tonic-gate 
608*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
609*7c478bd9Sstevel@tonic-gate }
610*7c478bd9Sstevel@tonic-gate 
611*7c478bd9Sstevel@tonic-gate static int
612*7c478bd9Sstevel@tonic-gate loopback_order_barrier(rsm_barrier_handle_t barrier)
613*7c478bd9Sstevel@tonic-gate {
614*7c478bd9Sstevel@tonic-gate 
615*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
616*7c478bd9Sstevel@tonic-gate 	    "loopback_order_barrier: enter\n"));
617*7c478bd9Sstevel@tonic-gate 
618*7c478bd9Sstevel@tonic-gate 	barrier = barrier;
619*7c478bd9Sstevel@tonic-gate 
620*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
621*7c478bd9Sstevel@tonic-gate 	    "loopback_order_barrier: exit\n"));
622*7c478bd9Sstevel@tonic-gate 
623*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
624*7c478bd9Sstevel@tonic-gate }
625*7c478bd9Sstevel@tonic-gate 
626*7c478bd9Sstevel@tonic-gate static int
627*7c478bd9Sstevel@tonic-gate loopback_close_barrier(rsm_barrier_handle_t barrier)
628*7c478bd9Sstevel@tonic-gate {
629*7c478bd9Sstevel@tonic-gate 
630*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
631*7c478bd9Sstevel@tonic-gate 	    "loopback_close_barrier: enter\n"));
632*7c478bd9Sstevel@tonic-gate 
633*7c478bd9Sstevel@tonic-gate 	barrier = barrier;
634*7c478bd9Sstevel@tonic-gate 
635*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
636*7c478bd9Sstevel@tonic-gate 	    "loopback_close_barrier: exit\n"));
637*7c478bd9Sstevel@tonic-gate 
638*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
639*7c478bd9Sstevel@tonic-gate }
640*7c478bd9Sstevel@tonic-gate 
641*7c478bd9Sstevel@tonic-gate static int
642*7c478bd9Sstevel@tonic-gate loopback_destroy_barrier(rsm_barrier_handle_t barrier)
643*7c478bd9Sstevel@tonic-gate {
644*7c478bd9Sstevel@tonic-gate 
645*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
646*7c478bd9Sstevel@tonic-gate 	    "loopback_destroy_barrier: enter\n"));
647*7c478bd9Sstevel@tonic-gate 
648*7c478bd9Sstevel@tonic-gate 	barrier = barrier;
649*7c478bd9Sstevel@tonic-gate 
650*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
651*7c478bd9Sstevel@tonic-gate 	    "loopback_destroy_barrier: exit\n"));
652*7c478bd9Sstevel@tonic-gate 
653*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
654*7c478bd9Sstevel@tonic-gate }
655*7c478bd9Sstevel@tonic-gate 
656*7c478bd9Sstevel@tonic-gate static int
657*7c478bd9Sstevel@tonic-gate loopback_get_lib_attr(rsm_ndlib_attr_t **libattrp)
658*7c478bd9Sstevel@tonic-gate {
659*7c478bd9Sstevel@tonic-gate 
660*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
661*7c478bd9Sstevel@tonic-gate 	    "loopback_get_lib_attr: enter\n"));
662*7c478bd9Sstevel@tonic-gate 
663*7c478bd9Sstevel@tonic-gate 	*libattrp = &_rsm_loopback_attr;
664*7c478bd9Sstevel@tonic-gate 
665*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
666*7c478bd9Sstevel@tonic-gate 	    "loopback_get_lib_attr: exit\n"));
667*7c478bd9Sstevel@tonic-gate 
668*7c478bd9Sstevel@tonic-gate 	return (RSM_SUCCESS);
669*7c478bd9Sstevel@tonic-gate }
670*7c478bd9Sstevel@tonic-gate /*
671*7c478bd9Sstevel@tonic-gate  * If an entry is NULL, the parent will fill it out with its entry point.
672*7c478bd9Sstevel@tonic-gate  */
673*7c478bd9Sstevel@tonic-gate void
674*7c478bd9Sstevel@tonic-gate __rsmloopback_init_ops(rsm_segops_t *segops)
675*7c478bd9Sstevel@tonic-gate {
676*7c478bd9Sstevel@tonic-gate 
677*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
678*7c478bd9Sstevel@tonic-gate 	    "__rsmloopback_init_ops: enter\n"));
679*7c478bd9Sstevel@tonic-gate 
680*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_get8 = loopback_get8;
681*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_get16 = loopback_get16;
682*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_get32 = loopback_get32;
683*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_get64 = loopback_get64;
684*7c478bd9Sstevel@tonic-gate 
685*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_put8 = loopback_put8;
686*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_put16 = loopback_put16;
687*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_put32 = loopback_put32;
688*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_put64 = loopback_put64;
689*7c478bd9Sstevel@tonic-gate 
690*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_put = loopback_put;
691*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_get = loopback_get;
692*7c478bd9Sstevel@tonic-gate 
693*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_putv = loopback_putv;
694*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_getv = loopback_getv;
695*7c478bd9Sstevel@tonic-gate 
696*7c478bd9Sstevel@tonic-gate 	segops->rsm_create_localmemory_handle = loopback_create_handle;
697*7c478bd9Sstevel@tonic-gate 	segops->rsm_free_localmemory_handle = loopback_free_handle;
698*7c478bd9Sstevel@tonic-gate 
699*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_init_barrier = loopback_init_barrier;
700*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_open_barrier = loopback_open_barrier;
701*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_order_barrier = loopback_order_barrier;
702*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_close_barrier = loopback_close_barrier;
703*7c478bd9Sstevel@tonic-gate 	segops->rsm_memseg_import_destroy_barrier = loopback_destroy_barrier;
704*7c478bd9Sstevel@tonic-gate 
705*7c478bd9Sstevel@tonic-gate 	segops->rsm_get_lib_attr = loopback_get_lib_attr;
706*7c478bd9Sstevel@tonic-gate 
707*7c478bd9Sstevel@tonic-gate 	DBPRINTF((RSM_LIBRARY|RSM_LOOPBACK, RSM_DEBUG_VERBOSE,
708*7c478bd9Sstevel@tonic-gate 	    "__rsmloopback_init_ops: exit\n"));
709*7c478bd9Sstevel@tonic-gate 
710*7c478bd9Sstevel@tonic-gate }
711