1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _MACH_DESCRIP_H
28 #define	_MACH_DESCRIP_H
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 #include <sys/kstat.h>
35 #include <sys/ksynch.h>
36 #include <sys/mdesc.h>
37 
38 /*
39  * MD memory operations (memops) are of two types:
40  * buf:
41  * 	Buffer allocator routines used to allocate the MD buffer.
42  *	Allocator must support an alignment argument.
43  *
44  * meta:
45  *	Meta allocator routines to allocate meta data strcutures.
46  *	These allocations are small and don't have alignment
47  *	requirements. Examples, md_t handles and the machine_descrip_t
48  *	structure.
49  */
50 typedef struct machine_descrip_memops {
51 	void 		*(*buf_allocp)(size_t size, size_t align);
52 	void 		(*buf_freep)(void *, size_t size);
53 	void 		*(*meta_allocp)(size_t size);
54 	void 		(*meta_freep)(void *, size_t size);
55 } machine_descrip_memops_t;
56 
57 /*
58  * Common structure/list between kernel and mdesc driver enabling
59  * the current machine description to be retrieved or updated.
60  *
61  * Locks:
62  * The current global MD is protected by the curr_mach_descrip_lock.
63  * Each Machine description has a lock to synchronize its ref count.
64  * The Obsolete MD list is protected by the obs_list_lock.
65  */
66 typedef struct machine_descrip_s {
67 	uint64_t	gen;		/* Generation number for MD */
68 	kmutex_t	lock;		/* synchronize access to MD */
69 	void		*va;		/* virtual address */
70 	uint64_t	size;		/* size of MD */
71 	uint64_t	space;		/* space allocated for MD */
72 	int		refcnt;		/* MD ref count */
73 	struct machine_descrip_s *next;	/* Next MD in list */
74 	machine_descrip_memops_t *memops; /* Memory operations for MD */
75 } machine_descrip_t;
76 
77 /*
78  * Utility wrappers to get/fini a handle to the current MD.
79  */
80 extern md_t *md_get_handle(void);
81 extern int md_fini_handle(md_t *);
82 extern caddr_t md_get_md_raw(md_t *);
83 extern int md_alloc_scan_dag(md_t *, mde_cookie_t, char *, char *,
84 	    mde_cookie_t **);
85 extern void md_free_scan_dag(md_t *, mde_cookie_t **);
86 extern uint64_t md_get_current_gen(void);
87 
88 #ifdef __cplusplus
89 }
90 #endif
91 
92 #endif	/* _MACH_DESCRIP_H */
93