1 # Makefile for GeekOS kernel, userspace, and tools
3 # Northwestern University
4 # (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
5 # (c) 2008, Peter Dinda <pdinda@northwestern.edu>
6 # (c) 2008, Lei Xia <lxia@northwestern.edu>
7 # (c) 2008, The V3VEE Project <http://www.v3vee.org>
9 # Based on GeekOS Makefile:
10 # Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu>
14 # This is free software. You are permitted to use,
15 # redistribute, and modify it as specified in the file "COPYING".
17 # Required software to build GeekOS:
18 # - GNU Make (http://www.gnu.org/software/make)
19 # - gcc 2.95.2 generating code for target (i386/ELF) and host platforms
20 # - Perl5, AWK (any version), egrep
22 # Cygwin (http://cygwin.com) may be used to build GeekOS.
23 # Make sure that gcc, binutils, nasm, and perl are installed.
26 # - This makefile has been written carefully to work correctly
27 # with the -j (parallel make) option. I regularly use "make -j 2"
28 # to speed the build process on 2 processor systems.
31 # Base address of kernel
33 # Note: at top of memory minus three pages (GDT/TSS/IDT)
37 # Note that the code will initially load at 0x10000
39 # The setup code needs to copy it up to this address and jump there
46 VPATH := $(PROJECT_ROOT)/src
48 #when -DNDEBUG is set the kassert functions are disabled
51 # DEBUG=1 means VMM_DEBUG, VMM_INFO, and VMM_TRACE are enabled
52 # as are SERIAL_PRINT_DEBUG
55 ifeq ($(LEAN_AND_MEAN),1)
65 DEBUG_SECTIONS:= $(DEBUG_SECTIONS) -DDEBUG_SHADOW_PAGING -DDEBUG_NESTED_PAGING -DDEBUG_CTRL_REGS -DDEBUG_INTERRUPTS -DDEBUG_KEYBOARD -DDEBUG_PIC -DDEBUG_PIT -DDEBUG_NVRAM -DDEBUG_EMULATOR -DDEBUG_XED -DDEBUG_HALT -DDEBUG_DEV_MGR
66 # -DDEBUG_IO -DDEBUG_GENERIC -DDEBUG_IDE
70 ifeq ($(DEBUG_SHADOW_PAGING),1)
71 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_SHADOW_PAGING
73 ifeq ($(DEBUG_SHADOW_PAGING),0)
74 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_SHADOW_PAGING
78 ifeq ($(DEBUG_NESTED_PAGING),1)
79 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_NESTED_PAGING
81 ifeq ($(DEBUG_NESTED_PAGING),0)
82 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_NESTED_PAGING
86 ifeq ($(DEBUG_CTRL_REGS),1)
87 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_CTRL_REGS
89 ifeq ($(DEBUG_CTRL_REGS),0)
90 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_CTRL_REGS
94 ifeq ($(DEBUG_INTERRUPTS),1)
95 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_INTERRUPTS
97 ifeq ($(DEBUG_INTERRUPTS),0)
98 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_INTERRUPTS
103 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_IO
106 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_IO
110 ifeq ($(DEBUG_KEYBOARD),1)
111 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_KEYBOARD
113 ifeq ($(DEBUG_KEYBOARD),0)
114 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_KEYBOARD
118 ifeq ($(DEBUG_PIC),1)
119 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIC
121 ifeq ($(DEBUG_PIC),0)
122 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PIC
126 ifeq ($(DEBUG_PIT),1)
127 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIT
129 ifeq ($(DEBUG_PIT),0)
130 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PIT
134 ifeq ($(DEBUG_NVRAM),1)
135 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_NVRAM
137 ifeq ($(DEBUG_NVRAM),0)
138 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_NVRAM
142 ifeq ($(DEBUG_GENERIC),1)
143 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_GENERIC
145 ifeq ($(DEBUG_GENERIC),0)
146 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_GENERIC
150 ifeq ($(DEBUG_EMULATOR),1)
151 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_EMULATOR
153 ifeq ($(DEBUG_EMULATOR),0)
154 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_EMULATOR
158 ifeq ($(DEBUG_IDE),1)
159 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_IDE
161 ifeq ($(DEBUG_IDE),0)
162 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_IDE
166 ifeq ($(DEBUG_XED),1)
167 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_XED
169 ifeq ($(DEBUG_XED),0)
170 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_XED
174 ifeq ($(DEBUG_HALT),1)
175 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_HALT
177 ifeq ($(DEBUG_HALT),0)
178 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_HALT
182 ifeq ($(DEBUG_APIC),1)
183 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_APIC
185 ifeq ($(DEBUG_APIC),0)
186 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_APIC
190 ifeq ($(DEBUG_PCI),1)
191 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PCI
193 ifeq ($(DEBUG_PCI),0)
194 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PCI
198 ifeq ($(DEBUG_DEV_MGR),1)
199 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_DEV_MGR
201 ifeq ($(DEBUG_DEV_MGR),0)
202 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_DEV_MGR
206 ifeq ($(DEBUG_NE2K),1)
207 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_NE2K
209 ifeq ($(DEBUG_NE2K),0)
210 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_NE2K
214 #DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DTEST_NE2K
217 JRLDEBUG= -DVMM_DEBUG -DVMM_INFO -DVMM_TRACE $(DEBUG_SECTIONS)
228 # This is wrong for current cygwin - no changes needed
230 # Figure out if we're compiling with cygwin, http://cygwin.com
233 #SYSTEM_NAME := $(shell uname -s)
234 #ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
236 #EXTRA_C_OPTS := -DNEED_UNDERSCORE -DGNU_WIN32
237 #EXTRA_NASM_OPTS := -DNEED_UNDERSCORE
238 #NON_ELF_SYSTEM := yes
239 #EXTRA_CC_USER_OPTS := -Dmain=geekos_main
244 ifeq ($(INSTRUMENT_VMM),1)
245 EXTRA_C_OPTS:= -DINSTRUMENT_VMM
246 INSTRUMENT_OPT := -finstrument-functions
247 OBJ_FILES := palacios/vmm_instrument.o
252 CFLAGS = -fno-stack-protector
255 # ----------------------------------------------------------------------
257 # Various options specifying how GeekOS should be built,
258 # what source files to build, which user programs to build,
259 # etc. This is generally the only section of the makefile
260 # that will need to be modified.
261 # ----------------------------------------------------------------------
263 # List of targets to build by default.
264 # These targets encompass everything needed to boot
266 ALL_TARGETS := vmm force_payload
270 palacios/vm_guest.o \
272 palacios/svm_handler.o \
274 palacios/vmm_util.o \
275 palacios/vmm_ctrl_regs.o \
278 palacios/vmm_paging.o \
280 palacios/vmm_debug.o \
282 palacios/vmm_intr.o \
283 palacios/vmm_excp.o \
284 palacios/vmm_time.o \
285 palacios/vmm_shadow_paging.o \
286 palacios/vm_guest_mem.o \
287 palacios/vmm_dev_mgr.o \
288 palacios/vmm_decoder.o \
289 palacios/svm_halt.o \
290 palacios/svm_pause.o \
291 palacios/svm_wbinvd.o \
292 palacios/vmm_config.o \
293 palacios/vmm_hashtable.o \
294 palacios/vmm_string.o \
295 palacios/vmm_emulator.o \
296 palacios/vmm_sprintf.o \
297 palacios/vmm_queue.o \
298 palacios/vmm_host_events.o \
299 palacios/svm_lowlevel.o \
302 palacios/vmm_socket.o \
304 palacios/vmm_rbtree.o \
305 palacios/vmm_profiler.o \
306 palacios/vmm_direct_paging.o \
307 palacios/vmm_ringbuffer.o \
308 palacios/vmm_hypercall.o \
309 palacios/vmm_lock.o \
312 palacios/vmx_handler.o \
313 palacios/vmx_lowlevel.o \
314 palacios/vmxassist.o \
320 # Extra C flags for the VMM objects
321 $(VMM_OBJS) :: EXTRA_CFLAGS = \
322 $(JRLDEBUG) $(CFLAGS) -DVMXASSIST_PATH="\"../build/vmxassist\"" \
327 xed/v3-xed-compat.o \
328 xed/v3-udiv-compat.o \
330 $(XED_OBJS) :: EXTRA_CFLAGS = \
331 $(JRLDEBUG) $(CFLAGS)\
338 devices/simple_pic.o \
342 devices/bochs_debug.o \
355 devices/lnx_virtio_blk.o \
356 devices/lnx_virtio_balloon.o \
361 # devices/ramdisk.o \
364 $(DEVICES_OBJS) :: EXTRA_CFLAGS = \
365 $(JRLDEBUG) $(CFLAGS)\
369 # ----------------------------------------------------------------------
371 # This section defines programs that are used to build GeekOS.
372 # ----------------------------------------------------------------------
375 V3_ARCH := __V3_64BIT__
377 V3_ARCH := __V3_32BIT__
382 EXTRA_C_OPTS := $(EXTRA_C_OPTS) -DCRAY_XT
386 # Uncomment if cross compiling
387 #TARGET_CC_PREFIX := $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
388 #TARGET_CC_PREFIX := i386-elf-
390 # Target C compiler. gcc 2.95.2 or later should work.
392 TARGET_CC := $(TARGET_CC_PREFIX)gcc -m64
394 TARGET_CC := $(TARGET_CC_PREFIX)gcc -m32
396 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
399 # Target linker. GNU ld is probably to only one that will work.
400 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
403 TARGET_AR := $(TARGET_CC_PREFIX)ar
406 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
409 TARGET_NM := $(TARGET_CC_PREFIX)nm
412 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
414 # Nasm (http://nasm.sourceforge.net)
415 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
416 #NASM := /opt/vmm-tools/bin/nasm
428 # Tool to build PFAT filesystem images.
429 BUILDFAT := tools/builtFat.exe
434 # Pad a file so its size is a multiple of some unit (i.e., sector size)
435 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
437 # Create a file filled with zeroes.
438 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
440 # Calculate size of file in sectors
441 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
444 FD_SECTORS_PER_TRACK := $(PERL) $(PROJECT_ROOT)/scripts/numsecs_per_track
447 # ----------------------------------------------------------------------
449 # Options passed to the tools.
450 # ----------------------------------------------------------------------
452 # Flags used for all C source files
462 -I$(PROJECT_ROOT)/include \
466 -Wp,-MD,$(@D)/.$(@F).d \
473 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
474 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
476 # ----------------------------------------------------------------------
478 # Describes how to compile the source files.
479 # ----------------------------------------------------------------------
481 # Compilation of kernel C source files
483 # $(call build,TAG,commandline)
485 # If V=1 on the command line or the environment, then the actual
486 # command executed will be echoed to the terminal. Otherwise
487 # only the tag and the output file will be printed to make
488 # any warnings stand out from the compile messages.
491 @if [ -z "$V" ]; then \
502 $(call build,CC,$(TARGET_CC) \
512 $(call build,AS,$(TARGET_CC) \
530 # ----------------------------------------------------------------------
532 # Specifies files to be built
533 # ----------------------------------------------------------------------
535 # Default target - see definition of ALL_TARGETS in Configuration section
539 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
542 # -I$(PROJECT_ROOT)/src/geekos/ \
543 # $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
547 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o
548 # $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o -o geekos/test
553 ln -s -f ../src/vmboot/rombios/BIOS-bochs-latest rombios
556 ln -s -f ../src/vmboot/vgabios/VGABIOS-lgpl-latest.bin vgabios
559 ln -s -f ../src/vmboot/vmxassist/vmxassist.bin vmxassist
562 force_payload: rombios_link vgabios_link vmxassist_link
563 ../scripts/make_payload.pl payload_layout.txt vm_kernel
565 inter1: force_payload
570 vmm: palacios/vmm.lib
575 # Loadable (flat) kernel image.
576 palacios/vmm.bin : palacios/vmm.lib
577 $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary palacios/vmm.lib palacios/vmm.bin
580 # The kernel executable and symbol map.
581 palacios/vmm.lib: libv3vee.a
587 $(call build,AR,$(TARGET_AR) rcs $@ $^)
595 # Clean build directories of generated files
597 for d in palacios devices xed; do \
598 (cd $$d && rm -f * .*.d); \
603 # Include all of the generated dependency files if they exist