source: mainline/kernel/Makefile@ fdc190f

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since fdc190f was b60615bd, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 7 years ago

Modify kernel malloc()

This new implementation places the allocation size in front of the allocated
object, instead of relying on the slab allocator being able to determine source
slab cache for an object. This should improve scalability and help reduce
complexity of the memory management subsystem (further changes coming).

The drawback is more memory consumed by small malloc() allocations, however that
can be mitigated by switching to an API where the user provides known object
size to deallocation (most users know it either statically or from length they
necessarily remember).

  • Property mode set to 100644
File size: 11.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/arch/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
50AUTOCHECK = $(realpath $(ROOT_PATH)/tools/autocheck.awk)
51KERNEL = kernel.elf
52MAP = kernel.map
53JOB = kernel.job
54MAP_PREV = $(MAP).prev
55DISASM = kernel.disasm
56DUMP = kernel.dump
57REAL_MAP = generic/src/debug/real_map
58
59GENMAP = tools/genmap.py
60
61LINK = arch/$(KARCH)/_link.ld
62EMPTY_MAP = generic/src/debug/empty_map.o
63SIZEOK_MAP = generic/src/debug/sizeok_map.o
64
65ifeq ($(PRECHECK),y)
66 JOBFILE = $(ROOT_PATH)/tools/jobfile.py
67 # NOTE: You must not change the order of arguments.
68 CC_JOB = $(JOBFILE) $(JOB) $(CC) $< -o $@
69else
70 CC_JOB = $(CC) $< -o $@
71endif
72
73.PHONY: all clean autogen_clean depend
74.DELETE_ON_ERROR:
75
76all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(KERNEL) $(DISASM)
77
78clean: autogen_clean
79 rm -f $(KERNEL) $(MAP) $(JOB) $(MAP_PREV) $(DISASM) $(DUMP) $(REAL_MAP).* arch/*/_link.ld arch/*/include/arch/common.h
80 find generic/src/ arch/*/src/ genarch/src/ test/ -name '*.o' -follow -exec rm '{}' \;
81 find generic/src/ arch/*/src/ genarch/src/ test/ -name '*.d' -follow -exec rm '{}' \;
82
83## Common compiler flags
84#
85
86INCLUDES = generic/include genarch/include arch/$(KARCH)/include ../abi/arch/$(KARCH)/include ../abi/include
87INCLUDES_FLAGS = $(addprefix -I,$(INCLUDES))
88
89DEFS = -DKERNEL -DRELEASE=$(RELEASE) "-DCOPYRIGHT=$(COPYRIGHT)" "-DNAME=$(NAME)" -D__$(BITS)_BITS__ -D__$(ENDIANESS)__
90
91COMMON_CFLAGS = $(INCLUDES_FLAGS) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
92 -ffreestanding -nostdlib \
93 -fexec-charset=UTF-8 -finput-charset=UTF-8 -fno-common \
94 -fdebug-prefix-map=$(realpath $(ROOT_PATH))=.
95
96GCC_CFLAGS = -std=gnu11 -Wall -Wextra -Wno-unused-parameter \
97 -Wmissing-prototypes -Werror-implicit-function-declaration \
98 -Wwrite-strings -pipe -Wno-cast-function-type
99
100CLANG_CFLAGS = -std=gnu11 -Wall -Wextra -Wno-unused-parameter \
101 -Wno-missing-field-initializers -Wno-unused-command-line-argument \
102 -Wmissing-prototypes -Werror-implicit-function-declaration \
103 -Wwrite-strings -pipe -fno-stack-protector -fno-PIC
104
105ifeq ($(CONFIG_DEBUG),y)
106 COMMON_CFLAGS += -Werror
107endif
108
109ifeq ($(CONFIG_UBSAN_KERNEL),y)
110 COMMON_CFLAGS += -fsanitize=undefined
111endif
112
113ifeq ($(CONFIG_LTO),y)
114 COMMON_CFLAGS += -flto
115endif
116
117ifeq ($(CONFIG_LINE_DEBUG),y)
118 COMMON_CFLAGS += -g
119endif
120
121AFLAGS += --fatal-warnings
122LDFLAGS += -Wl,-n -T $(LINK) -Wl,-M,--fatal-warnings,--warn-common
123
124ifeq ($(CONFIG_STRIP_BINARIES),y)
125 LDFLAGS += -s
126endif
127
128-include arch/$(KARCH)/Makefile.inc
129-include genarch/Makefile.inc
130
131## The at-sign
132#
133# The $(ATSIGN) variable holds the ASCII character representing the at-sign
134# ('@') used in various $(AS) constructs (e.g. @progbits). On architectures that
135# don't use '@' for starting a comment, $(ATSIGN) is merely '@'. However, on
136# those that do use it for starting a comment (e.g. arm32), $(ATSIGN) must be
137# defined as the percentile-sign ('%') in the architecture-dependent
138# Makefile.inc.
139#
140
141ATSIGN ?= @
142
143## Cross-platform assembly to start a symtab.data section
144#
145
146SYMTAB_SECTION = .section symtab.data, \"a\", $(ATSIGN)progbits;
147
148## Compilation options
149#
150
151ifeq ($(COMPILER),clang)
152 CFLAGS = $(COMMON_CFLAGS) $(CLANG_CFLAGS)
153else
154 CFLAGS = $(COMMON_CFLAGS) $(GCC_CFLAGS)
155endif
156
157INSTRUMENTATION = -finstrument-functions
158
159## Generic kernel sources
160#
161
162GENERIC_SOURCES = \
163 generic/src/adt/bitmap.c \
164 generic/src/adt/btree.c \
165 generic/src/adt/hash_table.c \
166 generic/src/adt/list.c \
167 generic/src/adt/odict.c \
168 generic/src/console/chardev.c \
169 generic/src/console/console.c \
170 generic/src/console/prompt.c \
171 generic/src/cpu/cpu.c \
172 generic/src/cpu/cpu_mask.c \
173 generic/src/ddi/ddi.c \
174 generic/src/ddi/irq.c \
175 generic/src/debug/symtab.c \
176 generic/src/debug/stacktrace.c \
177 generic/src/debug/panic.c \
178 generic/src/debug/debug.c \
179 generic/src/interrupt/interrupt.c \
180 generic/src/log/log.c \
181 generic/src/main/main.c \
182 generic/src/main/kinit.c \
183 generic/src/main/uinit.c \
184 generic/src/main/version.c \
185 generic/src/main/shutdown.c \
186 generic/src/proc/current.c \
187 generic/src/proc/program.c \
188 generic/src/proc/scheduler.c \
189 generic/src/proc/thread.c \
190 generic/src/proc/task.c \
191 generic/src/syscall/syscall.c \
192 generic/src/syscall/copy.c \
193 generic/src/mm/km.c \
194 generic/src/mm/reserve.c \
195 generic/src/mm/frame.c \
196 generic/src/mm/page.c \
197 generic/src/mm/tlb.c \
198 generic/src/mm/as.c \
199 generic/src/mm/malloc.c \
200 generic/src/mm/backend_anon.c \
201 generic/src/mm/backend_elf.c \
202 generic/src/mm/backend_phys.c \
203 generic/src/mm/backend_user.c \
204 generic/src/mm/slab.c \
205 generic/src/lib/halt.c \
206 generic/src/lib/mem.c \
207 generic/src/lib/memfnc.c \
208 generic/src/lib/gsort.c \
209 generic/src/lib/str.c \
210 generic/src/lib/str_error.c \
211 generic/src/lib/elf.c \
212 generic/src/lib/ra.c \
213 generic/src/lib/rd.c \
214 generic/src/lib/ubsan.c \
215 generic/src/printf/printf_core.c \
216 generic/src/printf/printf.c \
217 generic/src/printf/snprintf.c \
218 generic/src/printf/vprintf.c \
219 generic/src/printf/vsnprintf.c \
220 generic/src/time/clock.c \
221 generic/src/time/timeout.c \
222 generic/src/time/delay.c \
223 generic/src/preempt/preemption.c \
224 generic/src/synch/spinlock.c \
225 generic/src/synch/condvar.c \
226 generic/src/synch/mutex.c \
227 generic/src/synch/semaphore.c \
228 generic/src/synch/smc.c \
229 generic/src/synch/waitq.c \
230 generic/src/synch/syswaitq.c \
231 generic/src/smp/ipi.c \
232 generic/src/smp/smp.c \
233 generic/src/ipc/ipc.c \
234 generic/src/ipc/sysipc.c \
235 generic/src/ipc/sysipc_ops.c \
236 generic/src/ipc/ops/conctmeto.c \
237 generic/src/ipc/ops/concttome.c \
238 generic/src/ipc/ops/dataread.c \
239 generic/src/ipc/ops/datawrite.c \
240 generic/src/ipc/ops/debug.c \
241 generic/src/ipc/ops/pagein.c \
242 generic/src/ipc/ops/sharein.c \
243 generic/src/ipc/ops/shareout.c \
244 generic/src/ipc/ops/stchngath.c \
245 generic/src/ipc/ipcrsc.c \
246 generic/src/ipc/irq.c \
247 generic/src/ipc/event.c \
248 generic/src/cap/cap.c \
249 generic/src/security/perm.c \
250 generic/src/sysinfo/sysinfo.c \
251 generic/src/sysinfo/stats.c
252
253## Kernel console support
254#
255
256ifeq ($(CONFIG_KCONSOLE),y)
257GENERIC_SOURCES += \
258 generic/src/console/kconsole.c \
259 generic/src/console/cmd.c
260endif
261
262## Udebug interface sources
263#
264
265ifeq ($(CONFIG_UDEBUG),y)
266GENERIC_SOURCES += \
267 generic/src/ipc/kbox.c \
268 generic/src/udebug/udebug.c \
269 generic/src/udebug/udebug_ops.c \
270 generic/src/udebug/udebug_ipc.c
271endif
272
273## Test sources
274#
275
276ifeq ($(CONFIG_TEST),y)
277 CFLAGS += -Itest/
278 GENERIC_SOURCES += \
279 test/test.c \
280 test/atomic/atomic1.c \
281 test/btree/btree1.c \
282 test/fault/fault1.c \
283 test/mm/falloc1.c \
284 test/mm/falloc2.c \
285 test/mm/mapping1.c \
286 test/mm/slab1.c \
287 test/mm/slab2.c \
288 test/synch/semaphore1.c \
289 test/synch/semaphore2.c \
290 test/print/print1.c \
291 test/print/print2.c \
292 test/print/print3.c \
293 test/print/print4.c \
294 test/print/print5.c \
295 test/thread/thread1.c
296
297 ifeq ($(KARCH),mips32)
298 GENERIC_SOURCES += test/debug/mips1.c
299 else
300 GENERIC_SOURCES += test/debug/mips1_skip.c
301 endif
302
303 ifeq ($(KARCH),ia64)
304 GENERIC_SOURCES += test/mm/purge1.c
305 else
306 GENERIC_SOURCES += test/mm/purge1_skip.c
307 endif
308
309endif
310
311## Sources where instrumentation is enabled
312#
313
314ifeq ($(CONFIG_TRACE),y)
315 INSTRUMENTED_SOURCES = \
316 generic/src/adt/btree.c \
317 generic/src/cpu/cpu.c \
318 generic/src/ddi/ddi.c \
319 generic/src/interrupt/interrupt.c \
320 generic/src/main/main.c \
321 generic/src/main/kinit.c \
322 generic/src/proc/the.c \
323 generic/src/mm/frame.c \
324 generic/src/mm/page.c \
325 generic/src/mm/tlb.c \
326 generic/src/mm/as.c \
327 generic/src/mm/slab.c \
328 generic/src/sysinfo/sysinfo.c \
329 generic/src/console/kconsole.c
330else
331 INSTRUMENTED_SOURCES =
332endif
333
334ARCH_SOURCES += $(ARCH_AUTOCHECK_HEADERS:%.h=%.check.c)
335GENARCH_SOURCES += $(GENARCH_AUTOCHECK_HEADERS:%.h=%.check.c)
336
337GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES)))
338ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES)))
339GENARCH_OBJECTS := $(addsuffix .o,$(basename $(GENARCH_SOURCES)))
340
341GENERIC_DEPENDS := $(addsuffix .d,$(basename $(GENERIC_SOURCES)))
342ARCH_DEPENDS := $(addsuffix .d,$(basename $(ARCH_SOURCES)))
343GENARCH_DEPENDS := $(addsuffix .d,$(basename $(GENARCH_SOURCES)))
344
345AS_CFLAGS := $(addprefix -Xassembler ,$(AFLAGS))
346
347-include $(GENERIC_DEPENDS)
348-include $(ARCH_DEPENDS)
349-include $(GENARCH_DEPENDS)
350
351ifeq ($(COMPILER),clang)
352 AS_CFLAGS += -mllvm -asm-macro-max-nesting-depth=1000
353endif
354
355ifeq ($(CONFIG_SYMTAB),y)
356 SYMTAB_OBJECTS := generic/src/debug/real_map.o
357else
358 SYMTAB_OBJECTS :=
359endif
360
361$(DISASM): $(KERNEL)
362ifeq ($(CONFIG_LINE_DEBUG),y)
363 $(OBJDUMP) -d -S $< > $@
364else
365 $(OBJDUMP) -d $< > $@
366endif
367
368$(KERNEL): $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(SYMTAB_OBJECTS)
369 $(CC) $(DEFS) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$(MAP) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SYMTAB_OBJECTS)
370
371$(LINK): $(LINK).in
372 $(CC) $(DEFS) $(CFLAGS) -D__ASSEMBLER__ -D__LINKER__ -E -x c $< | grep -v "^\#" > $@
373
374%.check.c: %.h $(AUTOCHECK)
375 cd $(<D) && $(AUTOCHECK) $(<F) > $(@F)
376
377%.o: %.S
378 $(CC_JOB) -c -MD -MP $(DEFS) $(CFLAGS) $(AS_CFLAGS)
379
380%.o: %.s
381 $(CC_JOB) -c -MD -MP $(DEFS) $(CFLAGS) $(AS_CFLAGS)
382
383%.o: %.c
384 $(CC_JOB) -c -MD -MP $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS) $(if $(findstring $<,$(INSTRUMENTED_SOURCES)),$(INSTRUMENTATION))
385
386$(REAL_MAP).o: $(REAL_MAP).bin
387 echo "$(AS_PROLOG)""$(SYMTAB_SECTION)"" .incbin \"$<\"" | $(CC) $(CFLAGS) $(AS_CFLAGS) -x assembler -c -o $@ -
388
389$(REAL_MAP).bin: $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS)
390 echo "$(AS_PROLOG)""$(SYMTAB_SECTION)" | $(CC) $(CFLAGS) $(AS_CFLAGS) -x assembler -c -o $(EMPTY_MAP) -
391 $(CC) $(DEFS) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(EMPTY_MAP)
392 $(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
393 $(GENMAP) $(MAP_PREV) $(DUMP) $@
394
395 # Do it once again, this time to get correct even the symbols
396 # on architectures that have bss after symtab
397
398 echo "$(AS_PROLOG)""$(SYMTAB_SECTION)"" .incbin \"$@\"" | $(CC) $(CFLAGS) $(AS_CFLAGS) -x assembler -c -o $(SIZEOK_MAP) -
399 $(CC) $(DEFS) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$(MAP_PREV) -o $@ $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) $(SIZEOK_MAP)
400 $(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > $(DUMP)
401 $(GENMAP) $(MAP_PREV) $(DUMP) $@
Note: See TracBrowser for help on using the repository browser.