1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
6 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 only,
10 * as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License version 2 for more details (a copy is included
16 * in the LICENSE file that accompanied this code).
18 * You should have received a copy of the GNU General Public License
19 * version 2 along with this program; If not, see
20 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
22 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23 * CA 95054 USA or visit www.sun.com if you need additional information or
29 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
30 * Use is subject to license terms.
33 * This file is part of Lustre, http://www.lustre.org/
34 * Lustre is a trademark of Sun Microsystems, Inc.
37 #ifndef __LIBCFS_DARWIN_LIBCFS_H__
38 #define __LIBCFS_DARWIN_LIBCFS_H__
40 #ifndef __LIBCFS_LIBCFS_H__
41 #error Do not #include this file directly. #include <libcfs/libcfs.h> instead
44 #include <mach/mach_types.h>
45 #include <sys/errno.h>
47 #include <libcfs/darwin/darwin-types.h>
48 #include <libcfs/darwin/darwin-time.h>
49 #include <libcfs/darwin/darwin-prim.h>
50 #include <libcfs/darwin/darwin-mem.h>
51 #include <libcfs/darwin/darwin-lock.h>
52 #include <libcfs/darwin/darwin-fs.h>
53 #include <libcfs/darwin/darwin-tcpip.h>
54 #include <libcfs/darwin/kp30.h>
57 # include <sys/types.h>
58 # include <sys/time.h>
59 # define do_gettimeofday(tv) microuptime(tv)
61 # include <sys/time.h>
62 # define do_gettimeofday(tv) gettimeofday(tv, NULL);
63 typedef unsigned long long cycles_t;
66 #define __cpu_to_le64(x) OSSwapHostToLittleInt64(x)
67 #define __cpu_to_le32(x) OSSwapHostToLittleInt32(x)
68 #define __cpu_to_le16(x) OSSwapHostToLittleInt16(x)
70 #define __le16_to_cpu(x) OSSwapLittleToHostInt16(x)
71 #define __le32_to_cpu(x) OSSwapLittleToHostInt32(x)
72 #define __le64_to_cpu(x) OSSwapLittleToHostInt64(x)
74 #define cpu_to_le64(x) __cpu_to_le64(x)
75 #define cpu_to_le32(x) __cpu_to_le32(x)
76 #define cpu_to_le16(x) __cpu_to_le16(x)
78 #define le64_to_cpu(x) __le64_to_cpu(x)
79 #define le32_to_cpu(x) __le32_to_cpu(x)
80 #define le16_to_cpu(x) __le16_to_cpu(x)
82 #define __swab16(x) OSSwapInt16(x)
83 #define __swab32(x) OSSwapInt32(x)
84 #define __swab64(x) OSSwapInt64(x)
85 #define __swab16s(x) do { *(x) = __swab16(*(x)); } while (0)
86 #define __swab32s(x) do { *(x) = __swab32(*(x)); } while (0)
87 #define __swab64s(x) do { *(x) = __swab64(*(x)); } while (0)
91 # include <sys/systm.h>
92 # include <pexpert/pexpert.h>
94 # define THREAD_SIZE 8192
96 # define THREAD_SIZE 8192
98 #define LUSTRE_TRACE_SIZE (THREAD_SIZE >> 5)
100 #define CHECK_STACK() do { } while(0)
101 #define CDEBUG_STACK() (0L)
103 /* Darwin has defined RETURN, so we have to undef it in lustre */
109 * When this is enabled debugging messages are indented according to the
110 * current "nesting level". Nesting level in increased when ENTRY macro
111 * is executed, and decreased on EXIT and RETURN.
114 #define ENTRY_NESTING_SUPPORT (0)
117 #if ENTRY_NESTING_SUPPORT
120 * Currently ENTRY_NESTING_SUPPORT is only supported for XNU port. Basic
121 * idea is to keep per-thread pointer to small data structure (struct
122 * cfs_debug_data) describing current nesting level. In XNU unused
123 * proc->p_wmegs field in hijacked for this. On Linux
124 * current->journal_info can be used. In user space
125 * pthread_{g,s}etspecific().
127 * ENTRY macro allocates new cfs_debug_data on stack, and installs it as
128 * a current nesting level, storing old data in cfs_debug_data it just
131 * EXIT pops old value back.
136 * One problem with this approach is that there is a lot of code that
137 * does ENTRY and then escapes scope without doing EXIT/RETURN. In this
138 * case per-thread current nesting level pointer is dangling (it points
139 * to the stack area that is possible already overridden). To detect
140 * such cases, we add two magic fields to the cfs_debug_data and check
141 * them whenever current nesting level pointer is dereferenced. While
142 * looking flaky this works because stack is always consumed
146 CDD_MAGIC1 = 0x02128506,
147 CDD_MAGIC2 = 0x42424242
150 struct cfs_debug_data {
152 struct cfs_debug_data *parent;
157 void __entry_nesting(struct cfs_debug_data *child);
158 void __exit_nesting(struct cfs_debug_data *child);
159 unsigned int __current_nesting_level(void);
161 #define ENTRY_NESTING \
162 struct cfs_debug_data __cdd = { .magic1 = CDD_MAGIC1, \
164 .nesting_level = 0, \
165 .magic2 = CDD_MAGIC2 }; \
166 __entry_nesting(&__cdd);
168 #define EXIT_NESTING __exit_nesting(&__cdd)
170 /* ENTRY_NESTING_SUPPORT */
173 #define ENTRY_NESTING do {;} while (0)
174 #define EXIT_NESTING do {;} while (0)
175 #define __current_nesting_level() (0)
177 /* ENTRY_NESTING_SUPPORT */
180 #define LUSTRE_LNET_PID 12345
182 #define _XNU_LIBCFS_H
185 * Platform specific declarations for cfs_curproc API (libcfs/curproc.h)
187 * Implementation is in darwin-curproc.c
189 #define CFS_CURPROC_COMM_MAX MAXCOMLEN
191 * XNU has no capabilities
193 typedef __u32 cfs_kernel_cap_t;
197 /* if you change this, update darwin-util.c:cfs_stack_trace_fill() */
198 CFS_STACK_TRACE_DEPTH = 16
201 struct cfs_stack_trace {
202 void *frame[CFS_STACK_TRACE_DEPTH];
205 #define printk(format, args...) printf(format, ## args)
211 #endif /* __KERNEL__ */
213 #endif /* _XNU_LIBCFS_H */