1/*
2 * Copyright (c) 2007-2012 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28#ifndef _KXLD_TYPES_H
29#define _KXLD_TYPES_H
30
31#include <stdarg.h>
32#include <stdint.h>
33#include <mach/boolean.h>       // boolean_t
34#include <mach/kern_return.h>
35
36/*******************************************************************************
37* Macros
38*******************************************************************************/
39
40/* For 32-bit-specific linking code */
41#if (!KERNEL || !__LP64__)
42    #define KXLD_USER_OR_ILP32 1
43#endif
44
45/* For 64-bit-specific linking code */
46#if (!KERNEL || __LP64__)
47    #define KXLD_USER_OR_LP64 1
48#endif
49
50/* For i386-specific linking code */
51#if (!KERNEL || __i386__)
52    #define KXLD_USER_OR_I386 1
53#endif
54
55/* For x86_64-specific linking code */
56#if (!KERNEL || __x86_64__)
57    #define KXLD_USER_OR_X86_64 1
58#endif
59
60/* For arm-specific linking code */
61#if (!KERNEL || __arm__)
62    #define KXLD_USER_OR_ARM 1
63#endif
64
65/* For linking code specific to architectures that support common symbols */
66#if (!KERNEL || __i386__)
67    #define KXLD_USER_OR_COMMON 1
68#endif
69
70/* For linking code specific to architectures that support strict patching */
71    #define KXLD_USER_OR_STRICT_PATCHING 1
72
73/* For linking code specific to architectures that use MH_OBJECT */
74#if (!KERNEL || __i386__)
75    #define KXLD_USER_OR_OBJECT 1
76#endif
77
78/* For linking code specific to architectures that use MH_KEXT_BUNDLE */
79#define KXLD_USER_OR_BUNDLE 1
80
81/* We no longer need to generate our own GOT for any architectures, but the code
82 * required to do this will be saved inside this macro.
83 */
84#define KXLD_USER_OR_GOT 0
85
86/* for building the dysymtab command generation into the dylib */
87#if (!KERNEL)
88    #define KXLD_PIC_KEXTS 1
89#endif
90
91/*******************************************************************************
92* Types
93*******************************************************************************/
94
95/* Maintains linker state across links.  One context should be allocate for
96 * each link thread.
97 */
98typedef struct kxld_context KXLDContext;
99
100/* Unless we're in a 32-bit kernel, all internal math is performed in 64 bits
101 * and cast to smaller values as needed by the architecture for which we are
102 * linking.  All returned arguments should be handled similarly.
103 * Note: This size can be increased for future architectural size increases
104 */
105#if KERNEL && !__LP64__
106typedef uint32_t kxld_addr_t;
107typedef uint32_t kxld_size_t;
108#else
109typedef uint64_t kxld_addr_t;
110typedef uint64_t kxld_size_t;
111#endif /* KERNEL && !__LP64__ */
112
113/* Flags for general linker behavior */
114enum kxld_flags {
115    kKxldFlagDefault = 0x0,
116    kKXLDFlagIncludeRelocs = 0x01
117};
118typedef enum kxld_flags KXLDFlags;
119
120/* Flags for the allocation callback */
121enum kxld_allocate_flags {
122    kKxldAllocateDefault = 0x0,
123    kKxldAllocateWritable = 0x1,        /* kxld may write into the allocated memory */
124};
125typedef enum kxld_allocate_flags KXLDAllocateFlags;
126
127/* This specifies the function type of the callback that the linker uses to get
128 * the base address and allocated memory for relocation and linker output,
129 * respectively.  Note that it is compatible with the standard allocators (e.g.
130 * malloc).
131 */
132typedef kxld_addr_t (*KXLDAllocateCallback)(size_t size,
133    KXLDAllocateFlags *flags, void *user_data);
134
135/* Flags for the logging callback */
136typedef enum kxld_log_subsystem {
137    kKxldLogLinking = 0x0,
138    kKxldLogPatching = 0x01
139} KXLDLogSubsystem;
140
141typedef enum kxld_log_level {
142    kKxldLogExplicit = 0x0,
143    kKxldLogErr = 0x1,
144    kKxldLogWarn = 0x2,
145    kKxldLogBasic = 0x3,
146    kKxldLogDetail = 0x4,
147    kKxldLogDebug = 0x5
148} KXLDLogLevel;
149
150/* This structure is used to describe a dependency kext. The kext field
151 * is a pointer to the binary executable of the dependency. The interface
152 * field is a pointer to an optional interface kext that restricts the
153 * symbols that may be accessed in the dependency kext.
154 *
155 * For example, to use this structure with the KPIs, set the kext field
156 * to point to the kernel's Mach-O binary, and set interface to point
157 * to the KPI's Mach-O binary.
158 */
159typedef struct kxld_dependency {
160    u_char      * kext;
161    u_long        kext_size;
162    char        * kext_name;
163    u_char      * interface;
164    u_long        interface_size;
165    char        * interface_name;
166    boolean_t     is_direct_dependency;
167} KXLDDependency;
168
169typedef void (*KXLDLoggingCallback) (KXLDLogSubsystem sys, KXLDLogLevel level,
170    const char *format, va_list ap, void *user_data);
171
172#endif /* _KXLD_TYPES_H */
173
174