source: mainline/kernel/Makefile@ 74c57908

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 74c57908 was 9ded977, checked in by Martin Decky <martin@…>, 15 years ago

add initial support for line debugging information and generating disassembly outputs with source code intermixed (useful for analyzing of stack traces)
currently the disassembly and source is intermixed only in the case of amd64 kernel (other linker scripts strip the debugging sections so far)

  • Property mode set to 100644
File size: 13.7 KB
Line 
1#
2# Copyright (c) 2005 Martin Decky
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# - Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# - Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# - The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28
29## Configuration
30#
31
32ROOT_PATH = ..
33
34VERSION_DEF = $(ROOT_PATH)/version
35
36COMMON_MAKEFILE = $(ROOT_PATH)/Makefile.common
37COMMON_HEADER = $(ROOT_PATH)/common.h
38COMMON_HEADER_ARCH = arch/$(KARCH)/include/common.h
39
40CONFIG_MAKEFILE = $(ROOT_PATH)/Makefile.config
41CONFIG_HEADER = $(ROOT_PATH)/config.h
42
43-include $(VERSION_DEF)
44-include $(COMMON_MAKEFILE)
45-include $(CONFIG_MAKEFILE)
46
47## Common names
48#
49
50DEPEND = Makefile.depend
51DEPEND_PREV = $(DEPEND).prev
52RAW = kernel.raw
53BIN = kernel.bin
54MAP = kernel.map
55JOB = kernel.job
56MAP_PREV = $(MAP).prev
57DISASM = kernel.disasm
58DUMP = kernel.dump
59REAL_MAP = generic/src/debug/real_map
60
61ARCH_INCLUDE = generic/include/arch
62GENARCH_INCLUDE = generic/include/genarch
63
64GENMAP = tools/genmap.py
65JOBFILE = $(ROOT_PATH)/tools/jobfile.py
66
67LINK = arch/$(KARCH)/_link.ld
68EMPTY_MAP = generic/src/debug/empty_map.o
69SIZEOK_MAP = generic/src/debug/sizeok_map.o
70
71.PHONY: all clean
72
73all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(BIN) $(DISASM)
74 -[ -f $(DEPEND) ] && cp -a $(DEPEND) $(DEPEND_PREV)
75
76clean:
77 rm -f $(DEPEND) $(DEPEND_PREV) $(RAW) $(BIN) $(MAP) $(JOB) $(MAP_PREV) $(DISASM) $(DUMP) $(REAL_MAP).* $(ARCH_INCLUDE) $(GENARCH_INCLUDE) arch/*/_link.ld arch/*/include/common.h
78 find generic/src/ arch/*/src/ genarch/src/ test/ -name '*.o' -follow -exec rm \{\} \;
79
80## Common compiler flags
81#
82
83INCLUDES = generic/include
84
85ifeq ($(CONFIG_OPTIMIZE_FOR_SIZE),y)
86 OPTIMIZATION = s
87else
88 OPTIMIZATION = 3
89endif
90
91DEFS = -DKERNEL -DRELEASE=$(RELEASE) "-DNAME=$(NAME)" -D__$(BITS)_BITS__ -D__$(ENDIANESS)__
92
93GCC_CFLAGS = -I$(INCLUDES) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
94 -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) \
95 -finput-charset=UTF-8 -ffreestanding -fno-builtin -nostdlib -nostdinc \
96 -Wall -Wextra -Wno-unused-parameter -Wmissing-prototypes \
97 -Werror-implicit-function-declaration -Wwrite-strings \
98 -pipe
99
100ICC_CFLAGS = -I$(INCLUDES) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
101 -ffreestanding -fno-builtin -nostdlib -nostdinc -Wall -Wmissing-prototypes \
102 -Werror-implicit-function-declaration -wd170
103
104SUNCC_CFLAGS = -I$(INCLUDES) -xO$(OPTIMIZATION) \
105 -xnolib -xc99=all -features=extensions \
106 -erroff=E_ZERO_SIZED_STRUCT_UNION
107
108CLANG_CFLAGS = -I$(INCLUDES) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
109 -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) \
110 -finput-charset=UTF-8 -ffreestanding -fno-builtin -nostdlib -nostdinc \
111 -Wall -Wextra -Wno-unused-parameter -Wmissing-prototypes \
112 -Werror-implicit-function-declaration -Wwrite-strings \
113 -pipe -arch $(CLANG_ARCH)
114
115ifeq ($(CONFIG_DEBUG),y)
116 GCC_CFLAGS += -Werror
117 ICC_CFLAGS += -Werror
118endif
119
120ifeq ($(CONFIG_LTO),y)
121 GCC_CFLAGS += -flto
122endif
123
124ifeq ($(CONFIG_LINE_DEBUG),y)
125 GCC_CFLAGS += -g
126 ICC_CFLAGS += -g
127 SUNCC_CFLAGS += -g
128 CLANG_CFLAGS += -g
129endif
130
131#
132# Mind the mutual ordering with the inclusion of the arch Makefile.inc.
133# AFLAGS and LFLAGS must be initialized before the inclusion.
134#
135AFLAGS =
136LFLAGS = -N -T $(LINK) -M
137
138#
139# Mind the mutual ordering with the initialization of AFLAGS and LFLAGS.
140# The arch Makefile.inc must be included after the initialization.
141#
142-include arch/$(KARCH)/Makefile.inc
143-include genarch/Makefile.inc
144-include $(DEPEND)
145
146## The at-sign
147#
148# The $(ATSIGN) variable holds the ASCII character representing the at-sign
149# ('@') used in various $(AS) constructs (e.g. @progbits). On architectures that
150# don't use '@' for starting a comment, $(ATSIGN) is merely '@'. However, on
151# those that do use it for starting a comment (e.g. arm32), $(ATSIGN) must be
152# defined as the percentile-sign ('%') in the architecture-dependent
153# Makefile.inc.
154#
155
156ATSIGN ?= @
157
158## Cross-platform assembly to start a symtab.data section
159#
160
161SYMTAB_SECTION = ".section symtab.data, \"a\", $(ATSIGN)progbits;"
162
163## Compilation options
164#
165
166ifeq ($(COMPILER),gcc_native)
167 CFLAGS = $(GCC_CFLAGS)
168 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
169 INSTRUMENTATION = -finstrument-functions
170endif
171
172ifeq ($(COMPILER),gcc_cross)
173 CFLAGS = $(GCC_CFLAGS)
174 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
175 INSTRUMENTATION = -finstrument-functions
176endif
177
178ifeq ($(COMPILER),icc)
179 CFLAGS = $(ICC_CFLAGS)
180 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
181 INSTRUMENTATION =
182endif
183
184ifeq ($(COMPILER),suncc)
185 CFLAGS = $(SUNCC_CFLAGS)
186 DEFS += $(CONFIG_DEFS)
187 DEPEND_DEFS = $(DEFS)
188 INSTRUMENTATION =
189endif
190
191ifeq ($(COMPILER),clang)
192 CFLAGS = $(CLANG_CFLAGS)
193 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
194 INSTRUMENTATION =
195endif
196
197
198## Generic kernel sources
199#
200
201GENERIC_SOURCES = \
202 generic/src/adt/avl.c \
203 generic/src/adt/bitmap.c \
204 generic/src/adt/btree.c \
205 generic/src/adt/hash_table.c \
206 generic/src/adt/list.c \
207 generic/src/console/chardev.c \
208 generic/src/console/console.c \
209 generic/src/cpu/cpu.c \
210 generic/src/ddi/ddi.c \
211 generic/src/ddi/irq.c \
212 generic/src/ddi/device.c \
213 generic/src/debug/symtab.c \
214 generic/src/debug/stacktrace.c \
215 generic/src/debug/panic.c \
216 generic/src/debug/debug.c \
217 generic/src/interrupt/interrupt.c \
218 generic/src/main/main.c \
219 generic/src/main/kinit.c \
220 generic/src/main/uinit.c \
221 generic/src/main/version.c \
222 generic/src/main/shutdown.c \
223 generic/src/proc/program.c \
224 generic/src/proc/scheduler.c \
225 generic/src/proc/thread.c \
226 generic/src/proc/task.c \
227 generic/src/proc/the.c \
228 generic/src/proc/tasklet.c \
229 generic/src/syscall/syscall.c \
230 generic/src/syscall/copy.c \
231 generic/src/mm/buddy.c \
232 generic/src/mm/frame.c \
233 generic/src/mm/page.c \
234 generic/src/mm/tlb.c \
235 generic/src/mm/as.c \
236 generic/src/mm/backend_anon.c \
237 generic/src/mm/backend_elf.c \
238 generic/src/mm/backend_phys.c \
239 generic/src/mm/slab.c \
240 generic/src/lib/func.c \
241 generic/src/lib/memstr.c \
242 generic/src/lib/sort.c \
243 generic/src/lib/str.c \
244 generic/src/lib/elf.c \
245 generic/src/lib/rd.c \
246 generic/src/printf/printf_core.c \
247 generic/src/printf/printf.c \
248 generic/src/printf/snprintf.c \
249 generic/src/printf/vprintf.c \
250 generic/src/printf/vsnprintf.c \
251 generic/src/time/clock.c \
252 generic/src/time/timeout.c \
253 generic/src/time/delay.c \
254 generic/src/preempt/preemption.c \
255 generic/src/synch/spinlock.c \
256 generic/src/synch/condvar.c \
257 generic/src/synch/mutex.c \
258 generic/src/synch/semaphore.c \
259 generic/src/synch/smc.c \
260 generic/src/synch/waitq.c \
261 generic/src/synch/futex.c \
262 generic/src/smp/ipi.c \
263 generic/src/smp/smp.c \
264 generic/src/ipc/ipc.c \
265 generic/src/ipc/sysipc.c \
266 generic/src/ipc/ipcrsc.c \
267 generic/src/ipc/irq.c \
268 generic/src/ipc/event.c \
269 generic/src/security/cap.c \
270 generic/src/sysinfo/sysinfo.c \
271 generic/src/sysinfo/stats.c
272
273## Kernel console support
274#
275
276ifeq ($(CONFIG_KCONSOLE),y)
277GENERIC_SOURCES += \
278 generic/src/console/kconsole.c \
279 generic/src/console/cmd.c
280endif
281
282## Udebug interface sources
283#
284
285ifeq ($(CONFIG_UDEBUG),y)
286GENERIC_SOURCES += \
287 generic/src/ipc/kbox.c \
288 generic/src/udebug/udebug.c \
289 generic/src/udebug/udebug_ops.c \
290 generic/src/udebug/udebug_ipc.c
291endif
292
293## Test sources
294#
295
296ifeq ($(CONFIG_TEST),y)
297 CFLAGS += -Itest/
298 GENERIC_SOURCES += \
299 test/test.c \
300 test/atomic/atomic1.c \
301 test/btree/btree1.c \
302 test/avltree/avltree1.c \
303 test/fault/fault1.c \
304 test/mm/falloc1.c \
305 test/mm/falloc2.c \
306 test/mm/mapping1.c \
307 test/mm/slab1.c \
308 test/mm/slab2.c \
309 test/synch/semaphore1.c \
310 test/synch/semaphore2.c \
311 test/print/print1.c \
312 test/print/print2.c \
313 test/print/print3.c \
314 test/print/print4.c \
315 test/thread/thread1.c
316
317 ifeq ($(KARCH),mips32)
318 GENERIC_SOURCES += test/debug/mips1.c
319 else
320 GENERIC_SOURCES += test/debug/mips1_skip.c
321 endif
322
323 ifeq ($(KARCH),ia64)
324 GENERIC_SOURCES += test/mm/purge1.c
325 else
326 GENERIC_SOURCES += test/mm/purge1_skip.c
327 endif
328
329 ifeq ($(CONFIG_FPU),y)
330 ifeq ($(KARCH),ia32)
331 TEST_FPU1 = y
332 TEST_SSE1 = y
333 GENERIC_SOURCES += test/fpu/fpu1_x86.c
334 endif
335
336 ifeq ($(KARCH),amd64)
337 TEST_FPU1 = y
338 TEST_SSE1 = y
339 GENERIC_SOURCES += test/fpu/fpu1_x86.c
340 endif
341
342 ifeq ($(KARCH),ia64)
343 TEST_FPU1 = y
344 GENERIC_SOURCES += test/fpu/fpu1_ia64.c
345 endif
346
347 ifeq ($(KARCH),mips32)
348 TEST_MIPS2 = y
349 endif
350 endif
351
352 ifneq ($(TEST_FPU1),y)
353 GENERIC_SOURCES += test/fpu/fpu1_skip.c
354 endif
355
356 ifeq ($(TEST_SSE1),y)
357 GENERIC_SOURCES += test/fpu/sse1.c
358 else
359 GENERIC_SOURCES += test/fpu/sse1_skip.c
360 endif
361
362 ifeq ($(TEST_MIPS2),y)
363 GENERIC_SOURCES += test/fpu/mips2.c
364 else
365 GENERIC_SOURCES += test/fpu/mips2_skip.c
366 endif
367
368endif
369
370## Sources where instrumentation is enabled
371#
372
373ifeq ($(CONFIG_TRACE),y)
374 INSTRUMENTED_SOURCES = \
375 generic/src/adt/btree.c \
376 generic/src/cpu/cpu.c \
377 generic/src/ddi/ddi.c \
378 generic/src/interrupt/interrupt.c \
379 generic/src/main/main.c \
380 generic/src/main/kinit.c \
381 generic/src/proc/the.c \
382 generic/src/proc/tasklet.c \
383 generic/src/mm/frame.c \
384 generic/src/mm/page.c \
385 generic/src/mm/tlb.c \
386 generic/src/mm/as.c \
387 generic/src/mm/slab.c \
388 generic/src/sysinfo/sysinfo.c \
389 generic/src/console/kconsole.c
390else
391 INSTRUMENTED_SOURCES =
392endif
393
394GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES)))
395ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES)))
396GENARCH_OBJECTS := $(addsuffix .o,$(basename $(GENARCH_SOURCES)))
397
398LFLAGS_LTO := $(addprefix -Xlinker ,$(LFLAGS))
399
400ifeq ($(CONFIG_SYMTAB),y)
401 SYMTAB_OBJECTS := generic/src/debug/real_map.o
402else
403 SYMTAB_OBJECTS :=
404endif
405
406$(BIN): $(RAW)
407 $(OBJCOPY) -O $(BFD) $< $@
408
409$(DISASM): $(RAW)
410ifeq ($(CONFIG_LINE_DEBUG),y)
411 $(OBJDUMP) -d -S $< > $@
412else
413 $(OBJDUMP) -d $< > $@
414endif
415
416$(RAW): $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(SYMTAB_OBJECTS)
417ifeq ($(CONFIG_LTO),y)
418 $(GCC) $(LFLAGS_LTO) -Xlinker -Map -Xlinker $(MAP) $(DEFS) $(GCC_CFLAGS) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SYMTAB_OBJECTS)
419else
420 $(LD) $(LFLAGS) -Map $(MAP) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SYMTAB_OBJECTS)
421endif
422ifeq ($(CONFIG_STRIP_BINARIES),y)
423 $(STRIP) $(RAW)
424endif
425
426$(LINK): $(LINK).in $(DEPEND)
427 $(GCC) $(DEFS) $(GCC_CFLAGS) -D__ASM__ -D__LINKER__ -E -x c $< | grep -v "^\#" > $@
428
429%.o: %.S $(DEPEND)
430 $(GCC) $(DEFS) $(GCC_CFLAGS) -D__ASM__ -c -o $@ $<
431ifeq ($(PRECHECK),y)
432 $(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(GCC_CFLAGS) -D__ASM__
433endif
434
435%.o: %.s $(DEPEND)
436 $(AS) $(AFLAGS) -o $@ $<
437ifeq ($(PRECHECK),y)
438 $(JOBFILE) $(JOB) $< $@ as asm $(DEFS) $(CFLAGS) $(EXTRA_FLAGS)
439endif
440
441#
442# The FPU tests are the only objects for which we allow the compiler to generate
443# FPU instructions.
444#
445
446test/fpu/%.o: test/fpu/%.c $(DEPEND)
447 $(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) -c -o $@ $<
448ifeq ($(PRECHECK),y)
449 $(JOBFILE) $(JOB) $< $@ cc test $(DEFS) $(CFLAGS) $(EXTRA_FLAGS)
450endif
451
452#
453# Ordinary objects.
454#
455
456%.o: %.c $(DEPEND)
457 $(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS) $(if $(findstring $<,$(INSTRUMENTED_SOURCES)),$(INSTRUMENTATION)) -c -o $@ $<
458ifeq ($(PRECHECK),y)
459 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS)
460endif
461
462$(REAL_MAP).o: $(REAL_MAP).bin
463 echo $(SYMTAB_SECTION)" .incbin \"$<\"" | $(AS) $(AFLAGS) -o $@
464
465$(REAL_MAP).bin: $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS)
466 echo $(SYMTAB_SECTION) | $(AS) $(AFLAGS) -o $(EMPTY_MAP)
467ifeq ($(CONFIG_LTO),y)
468 $(GCC) $(LFLAGS_LTO) -Xlinker -Map -Xlinker $(MAP_PREV) $(DEFS) $(GCC_CFLAGS) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(EMPTY_MAP)
469else
470 $(LD) $(LFLAGS) -Map $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(EMPTY_MAP)
471endif
472 $(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
473 $(GENMAP) $(MAP_PREV) $(DUMP) $@
474
475 # Do it once again, this time to get correct even the symbols
476 # on architectures that have bss after symtab
477
478 echo $(SYMTAB_SECTION)" .incbin \"$@\"" | $(AS) $(AFLAGS) -o $(SIZEOK_MAP)
479ifeq ($(CONFIG_LTO),y)
480 $(GCC) $(LFLAGS_LTO) -Xlinker -Map -Xlinker $(MAP_PREV) $(DEFS) $(GCC_CFLAGS) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SIZEOK_MAP)
481else
482 $(LD) $(LFLAGS) -Map $(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SIZEOK_MAP)
483endif
484 $(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
485 $(GENMAP) $(MAP_PREV) $(DUMP) $@
486
487$(DEPEND): $(ARCH_INCLUDE) $(GENARCH_INCLUDE) $(COMMON_HEADER_ARCH)
488 makedepend -f - -- $(DEPEND_DEFS) $(CFLAGS) -- $(ARCH_SOURCES) $(GENARCH_SOURCES) $(GENERIC_SOURCES) > $@ 2> /dev/null
489 -[ -f $(DEPEND_PREV) ] && diff -q $(DEPEND_PREV) $@ && mv -f $(DEPEND_PREV) $@
490
491$(ARCH_INCLUDE): arch/$(KARCH)/include/
492 ln -sfn ../../$< $@
493
494$(GENARCH_INCLUDE): genarch/include/
495 ln -sfn ../../$< $@
496
497$(COMMON_HEADER_ARCH): $(COMMON_HEADER)
498 ln -sfn ../../../$< $@
Note: See TracBrowser for help on using the repository browser.