summaryrefslogtreecommitdiffstats
path: root/src/VBox/HostDrivers/Support/linux/Makefile-wrapper.gmk
blob: a47d55bee944195b51ec9a0f89f21f0be55e32c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# $Id: Makefile-wrapper.gmk $
## @file
# Makefile template for a wrapper module.
#

#
# Copyright (C) 2006-2023 Oracle and/or its affiliates.
#
# This file is part of VirtualBox base platform packages, as
# available from https://www.virtualbox.org.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation, in version 3 of the
# License.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <https://www.gnu.org/licenses>.
#
# The contents of this file may alternatively be used under the terms
# of the Common Development and Distribution License Version 1.0
# (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
# in the VirtualBox distribution, in which case the provisions of the
# CDDL are applicable instead of those of the GPL.
#
# You may elect to license modified versions of this file under the
# terms and conditions of either the GPL or the CDDL or both.
#
# SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
#

# Check template parameters.
ifndef WRAPPED_MODULE_NAME
$(error WRAPPED_MODULE_NAME not defined)
endif
ifndef VBOXMOD_NAME
$(error VBOXMOD_NAME not defined)
endif


# Linux kbuild sets this to our source directory if we are called from there
ifndef VBOX_MODULE_SRC_DIR
 VBOX_MODULE_SRC_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))/
endif
VBOXDRV_DIR          := $(abspath $(VBOX_MODULE_SRC_DIR)../vboxdrv/)/
VBOX_VMMR0_DIR       := $(abspath $(VBOX_MODULE_SRC_DIR)../vbox_vmmr0/)/
include $(VBOXDRV_DIR)Makefile-header.gmk

# All of these wrappers depend on
ifndef KBUILD_EXTRA_SYMBOLS
KBUILD_EXTRA_SYMBOLS := $(VBOXDRV_DIR)Module.symvers
 ifdef WRAPPER_NEED_VMMR0
KBUILD_EXTRA_SYMBOLS += $(VBOX_VMMR0_DIR)Module.symvers
 endif
endif

VBOXMOD_OBJS = \
	SUPWrapperMod-linux.o \
	$(WRAPPED_MODULE_NAME).o

VBOXMOD_INCL  = \
	$(VBOXDRV_DIR) \
	$(VBOXDRV_DIR)include \
	$(VBOXDRV_DIR)r0drv/linux

VBOXMOD_DEFS += \
	RT_OS_LINUX \
	IN_RING0 \
	IN_RT_R0 \
	IN_SUP_R0 \
	VBOX \
       \
	WRAPPED_MODULE_NAME=\"$(WRAPPED_MODULE_NAME).r0\" \
	WRAPPED_MODULE_SYMBOL_INCLUDE=\"$(WRAPPED_MODULE_NAME)-symbols.h\"
ifdef WRAPPED_MODULE_FLAGS
VBOXMOD_DEFS += WRAPPED_MODULE_FLAGS="$(WRAPPED_MODULE_FLAGS)"
endif
ifdef WRAPPED_MODULE_LINUX_EXPORTS
VBOXMOD_DEFS += WRAPPED_MODULE_LINUX_EXPORTS
endif
ifdef WRAPPED_MODULE_SRV_REQ_HANDLER
VBOXMOD_DEFS += WRAPPED_MODULE_SRV_REQ_HANDLER="$(WRAPPED_MODULE_SRV_REQ_HANDLER)"
endif
ifdef WRAPPED_MODULE_IS_VMMR0
VBOXMOD_DEFS += WRAPPED_MODULE_VMMR0_ENTRY_FAST=VMMR0EntryFast
VBOXMOD_DEFS += WRAPPED_MODULE_VMMR0_ENTRY_EX=VMMR0EntryEx
endif
ifdef WRAPPED_MODULE_NO_INIT
VBOXMOD_DEFS += WRAPPED_MODULE_INIT=NULL
endif
ifdef WRAPPED_MODULE_NO_TERM
VBOXMOD_DEFS += WRAPPED_MODULE_TERM=NULL
endif
ifdef WRAPPED_MODULE_LICENSE_PROPRIETARY
VBOXMOD_DEFS += WRAPPED_MODULE_LICENSE_PROPRIETARY
endif

VBOXMOD_CFLAGS = -include $(VBOXDRV_DIR)include/VBox/SUPDrvMangling.h \
	-fno-omit-frame-pointer -fno-pie -Wno-declaration-after-statement

## @todo cleanup

include $(VBOXDRV_DIR)Makefile-footer.gmk


#
# Custom rules (some of this could later be done before install).
#
SUPWrapperMod-linux.c \
$(VBOX_MODULE_SRC_DIR)SUPWrapperMod-linux.c \
$(VBOX_MODULE_SRC_DIR)SUPWrapperMod-linux.o \
: $(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME)-symbols.h

$(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME)-symbols.h: \
		$(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME).r0 \
		$(VBOX_MODULE_SRC_DIR)Makefile-wrapper.gmk \
		$(VBOX_MODULE_SRC_DIR)Makefile
	rm -f -- "$@" "$@-tmp1" "$@-tmp2"
	objdump --syms "$<" > "$@-tmp1"
	sed 	-e '/[[:space:]].hidden[[:space:]]/d' \
		-e '/[[:space:]]\*UND\*[[:space:]]/d' \
		-e '/[[:space:]]vboxr0mod_/d' \
		-e '/^[[:xdigit:]][[:xdigit:]]*[[:space:]][gu]/!d' \
		-e 's/^\([[:xdigit:]]*\)[[:space:]].*000[[:xdigit:]]*[[:space:]]\([_a-zA-Z].*\)$$/SYMBOL_ENTRY(\2)/' \
		-e '/SYMBOL_ENTRY(ModuleInit)/d' \
		-e '/SYMBOL_ENTRY(ModuleTerm)/d' \
		"$@-tmp1" > "$@-tmp2"
	sort "$@-tmp2" > "$@"
	rm -f -- "$@-tmp1" "$@-tmp2"


$(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME).mangle-symbols: \
		$(VBOXDRV_DIR)Module.symvers \
		$(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME)-symbols.h \
		$(VBOX_MODULE_SRC_DIR)Makefile-wrapper.gmk \
		$(VBOX_MODULE_SRC_DIR)Makefile
	sed	-e 's/SYMBOL_ENTRY(\([^)]*\))/\/\1 VBoxHost_\1\/d/' \
		"$(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME)-symbols.h" \
               > "$@-ignore.sed"
	sed	-e '/[[:space:]]VBoxHost_/!d' \
		-e 's/^0x[[:xdigit:]]*[[:space:]]VBoxHost_\([^[:space:]]*\)[[:space:]].*$$/\1 VBoxHost_\1/' \
		-f "$@-ignore.sed" \
		"$<" \
		> "$@"

$(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME).o: \
		$(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME).r0 \
		$(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME).debug \
		$(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME).mangle-symbols \
		$(VBOX_MODULE_SRC_DIR)Makefile-wrapper.gmk \
		$(VBOX_MODULE_SRC_DIR)Makefile \
               $(if $(CONFIG_UNWINDER_ORC),$(objtool_dep),)
	rm -f -- "$@" "$@-tmp"
	eu-unstrip -o "$@-tmp" $(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME).r0 $(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME).debug
	objcopy --redefine-syms=$(VBOX_MODULE_SRC_DIR)$(WRAPPED_MODULE_NAME).mangle-symbols "$@-tmp" "$@"
	rm -f -- "$@-tmp"
ifdef CONFIG_UNWINDER_ORC # Must generate the ORC sections.
	$(__objtool_obj) $(objtool_args)  $@
endif
	touch $(VBOX_MODULE_SRC_DIR).$(WRAPPED_MODULE_NAME).o.cmd