Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


updated test_vm
[palacios.git] / palacios / build / Makefile
1 # Makefile for GeekOS kernel, userspace, and tools
2 #
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> 
8 #
9 # Based on GeekOS Makefile:
10 # Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu>
11 # $Revision: 1.71 $
12
13
14 # This is free software.  You are permitted to use,
15 # redistribute, and modify it as specified in the file "COPYING".
16
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
21 #
22 # Cygwin (http://cygwin.com) may be used to build GeekOS.
23 # Make sure that gcc, binutils, nasm, and perl are installed.
24
25 # NOTES:
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.
29
30
31 # Base address of kernel
32 #
33 # Note: at top of memory minus three pages (GDT/TSS/IDT) 
34 # minus maximum size
35 #
36 #
37 # Note that the code will initially load at 0x10000
38 #
39 # The setup code needs to copy it up to this address and jump there
40 #
41
42
43
44
45 PROJECT_ROOT := ..
46 VPATH := $(PROJECT_ROOT)/src
47
48 #when -DNDEBUG is set the kassert functions are disabled
49 #JRLDEBUG=-DNDEBUG
50
51 # DEBUG=1 means VMM_DEBUG, VMM_INFO, and VMM_TRACE are enabled
52 # as are SERIAL_PRINT_DEBUG
53
54
55 ifeq ($(LEAN_AND_MEAN),1) 
56 DEBUG := 0
57 DEBUG_SECTIONS :=
58 else
59 DEBUG := 1
60 DEBUG_SECTIONS := 
61 endif
62
63
64 ifeq ($(DEBUG_ALL),1)
65   DEBUG_SECTIONS:= $(DEBUG_SECTIONS) -DDEBUG_SHADOW_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
67 endif
68
69
70 ifeq ($(DEBUG_SHADOW_PAGING),1)
71 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_SHADOW_PAGING
72 else 
73 ifeq ($(DEBUG_SHADOW_PAGING),0) 
74 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_SHADOW_PAGING
75 endif
76 endif
77
78 ifeq ($(DEBUG_CTRL_REGS),1)
79 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_CTRL_REGS
80 else 
81 ifeq ($(DEBUG_CTRL_REGS),0) 
82 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_CTRL_REGS
83 endif
84 endif
85
86 ifeq ($(DEBUG_INTERRUPTS),1)
87 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_INTERRUPTS
88 else 
89 ifeq ($(DEBUG_INTERRUPTS),0) 
90 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_INTERRUPTS
91 endif
92 endif
93
94 ifeq ($(DEBUG_IO),1)
95 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_IO
96 else 
97 ifeq ($(DEBUG_IO),0) 
98 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_IO
99 endif
100 endif
101
102 ifeq ($(DEBUG_KEYBOARD),1)
103 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_KEYBOARD
104 else 
105 ifeq ($(DEBUG_KEYBOARD),0) 
106 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_KEYBOARD
107 endif
108 endif
109
110 ifeq ($(DEBUG_PIC),1)
111 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIC
112 else 
113 ifeq ($(DEBUG_PIC),0) 
114 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PIC
115 endif
116 endif
117
118 ifeq ($(DEBUG_PIT),1)
119 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIT
120 else 
121 ifeq ($(DEBUG_PIT),0) 
122 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PIT
123 endif
124 endif
125
126 ifeq ($(DEBUG_NVRAM),1)
127 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_NVRAM
128 else 
129 ifeq ($(DEBUG_NVRAM),0) 
130 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_NVRAM
131 endif
132 endif
133
134 ifeq ($(DEBUG_GENERIC),1)
135 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_GENERIC
136 else 
137 ifeq ($(DEBUG_GENERIC),0) 
138 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_GENERIC
139 endif
140 endif
141
142 ifeq ($(DEBUG_EMULATOR),1)
143 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_EMULATOR
144 else 
145 ifeq ($(DEBUG_EMULATOR),0) 
146 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_EMULATOR
147 endif
148 endif
149
150 ifeq ($(DEBUG_IDE),1)
151 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_IDE
152 else 
153 ifeq ($(DEBUG_IDE),0) 
154 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_IDE
155 endif
156 endif
157
158 ifeq ($(DEBUG_XED),1)
159 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_XED
160 else 
161 ifeq ($(DEBUG_XED),0) 
162 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_XED
163 endif
164 endif
165
166 ifeq ($(DEBUG_HALT),1)
167 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_HALT
168 else 
169 ifeq ($(DEBUG_HALT),0) 
170 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_HALT
171 endif
172 endif
173
174 ifeq ($(DEBUG_APIC),1)
175 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_APIC
176 else 
177 ifeq ($(DEBUG_APIC),0) 
178 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_APIC
179 endif
180 endif
181
182 ifeq ($(DEBUG_PCI),1)
183 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PCI
184 else 
185 ifeq ($(DEBUG_PCI),0) 
186 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PCI
187 endif
188 endif
189
190 ifeq ($(DEBUG_DEV_MGR),1)
191 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_DEV_MGR
192 else 
193 ifeq ($(DEBUG_DEV_MGR),0)
194 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_DEV_MGR
195 endif
196 endif
197
198 #DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DTEST_NE2K
199
200 ifeq ($(DEBUG),1)
201   JRLDEBUG=  -DVMM_DEBUG -DVMM_INFO -DVMM_TRACE $(DEBUG_SECTIONS)
202 else
203
204 endif
205
206
207
208
209
210
211 #
212 # This is wrong for current cygwin - no changes needed
213 #
214 # Figure out if we're compiling with cygwin, http://cygwin.com
215 #
216
217 #SYSTEM_NAME := $(shell uname -s)
218 #ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
219 #SYM_PFX            := _
220 #EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
221 #EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
222 #NON_ELF_SYSTEM     := yes
223 #EXTRA_CC_USER_OPTS := -Dmain=geekos_main
224 #endif
225
226
227
228 ifeq ($(INSTRUMENT_VMM),1)
229   EXTRA_C_OPTS:= -DINSTRUMENT_VMM
230   INSTRUMENT_OPT := -finstrument-functions
231   OBJ_FILES := palacios/vmm_instrument.o
232 else
233   INSTRUMENT_OPT := 
234 endif
235
236
237
238 # ----------------------------------------------------------------------
239 # Configuration -
240 #   Various options specifying how GeekOS should be built,
241 #   what source files to build, which user programs to build,
242 #   etc.  This is generally the only section of the makefile
243 #   that will need to be modified.
244 # ----------------------------------------------------------------------
245
246 # List of targets to build by default.
247 # These targets encompass everything needed to boot
248 # and run GeekOS.
249 ALL_TARGETS := vmm force_payload
250
251
252 VMM_OBJS := \
253         palacios/vm_guest.o \
254         palacios/svm.o \
255         palacios/svm_handler.o \
256         palacios/vmm.o \
257         palacios/vmm_util.o \
258         palacios/vmm_ctrl_regs.o \
259         palacios/vmcb.o \
260         palacios/vmm_mem.o \
261         palacios/vmm_paging.o \
262         palacios/vmm_io.o \
263         palacios/vmm_debug.o \
264         palacios/svm_io.o \
265         palacios/vmm_intr.o \
266         palacios/vmm_time.o \
267         palacios/vmm_shadow_paging.o \
268         palacios/vm_guest_mem.o \
269         palacios/vm_dev.o \
270         palacios/vmm_dev_mgr.o \
271         palacios/vmm_decoder.o \
272         palacios/svm_halt.o \
273         palacios/svm_pause.o \
274         palacios/svm_wbinvd.o \
275         palacios/vmm_config.o \
276         palacios/vmm_hashtable.o \
277         palacios/vmm_string.o \
278         palacios/vmm_emulator.o \
279         palacios/vmm_queue.o \
280         palacios/vmm_host_events.o \
281         palacios/svm_lowlevel.o \
282         palacios/vmm_msr.o \
283         palacios/svm_msr.o \
284         palacios/vmm_socket.o \
285         palacios/vmm_xed.o \
286         palacios/vmm_rbtree.o \
287         palacios/vmm_profiler.o \
288         palacios/vmm_direct_paging.o \
289         palacios/vmm_ringbuffer.o \
290         palacios/vmm_hypercall.o \
291         $(OBJ_FILES)
292
293 #               vmx.c vmcs_gen.c vmcs.c
294
295 # Extra C flags for the VMM objects
296 $(VMM_OBJS) :: EXTRA_CFLAGS = \
297         $(JRLDEBUG) \
298
299
300
301 XED_OBJS := \
302         xed/v3-xed-compat.o \
303         xed/v3-udiv-compat.o \
304
305 $(XED_OBJS) :: EXTRA_CFLAGS = \
306         $(JRLDEBUG) \
307
308 DEVICES_OBJS := \
309         devices/generic.o \
310         devices/keyboard.o \
311         devices/nvram.o \
312         devices/timer.o \
313         devices/simple_pic.o \
314         devices/8259a.o \
315         devices/8254.o \
316         devices/serial.o \
317         devices/bochs_debug.o \
318         devices/os_debug.o \
319         devices/apic.o  \
320         devices/io_apic.o \
321         devices/pci.o \
322         devices/para_net.o \
323         devices/ide.o \
324         devices/ram_cd.o \
325
326 #       devices/cdrom.o \
327 #       devices/ramdisk.o \
328 #       devices/vnic.o \
329
330 $(DEVICES_OBJS) :: EXTRA_CFLAGS = \
331         $(JRLDEBUG) \
332
333
334
335 # ----------------------------------------------------------------------
336 # Tools -
337 #   This section defines programs that are used to build GeekOS.
338 # ----------------------------------------------------------------------
339
340 ifeq ($(ARCH),64)
341 V3_ARCH := __V3_64BIT__
342 else 
343 V3_ARCH := __V3_32BIT__
344 endif
345
346
347 ifeq ($(CRAY_XT),1)
348 EXTRA_C_OPTS := $(EXTRA_C_OPTS) -DCRAY_XT
349 endif
350
351
352 # Uncomment if cross compiling
353 #TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
354 #TARGET_CC_PREFIX :=  i386-elf-
355
356 # Target C compiler.  gcc 2.95.2 or later should work.
357 ifeq ($(ARCH),64)
358 TARGET_CC := $(TARGET_CC_PREFIX)gcc -m64
359 else 
360 TARGET_CC := $(TARGET_CC_PREFIX)gcc -m32
361 endif
362 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
363
364
365 # Target linker.  GNU ld is probably to only one that will work.
366 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
367
368 # Target archiver
369 TARGET_AR := $(TARGET_CC_PREFIX)ar
370
371 # Target ranlib
372 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
373
374 # Target nm
375 TARGET_NM := $(TARGET_CC_PREFIX)nm
376
377 # Target objcopy
378 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
379
380 # Nasm (http://nasm.sourceforge.net)
381 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
382 #NASM := /opt/vmm-tools/bin/nasm
383
384 CPP := cpp
385
386
387 ifeq ($(ARCH),64)
388 AS = as --64
389 else 
390 AS = as --32
391 endif
392
393
394 # Tool to build PFAT filesystem images.
395 BUILDFAT := tools/builtFat.exe
396
397 # Perl5 or later
398 PERL := perl
399
400 # Pad a file so its size is a multiple of some unit (i.e., sector size)
401 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
402
403 # Create a file filled with zeroes.
404 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
405
406 # Calculate size of file in sectors
407 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
408
409
410 FD_SECTORS_PER_TRACK := $(PERL) $(PROJECT_ROOT)/scripts/numsecs_per_track
411
412
413 # ----------------------------------------------------------------------
414 # Definitions -
415 #   Options passed to the tools.
416 # ----------------------------------------------------------------------
417
418 # Flags used for all C source files
419
420 CC_GENERAL_OPTS = \
421         -O \
422         -Wall \
423         -g \
424         -D__V3VEE__ \
425         -D$(V3_ARCH) \
426         $(EXTRA_C_OPTS) \
427         $(VMM_FLAGS) \
428         -I$(PROJECT_ROOT)/include \
429         -Werror \
430         -fPIC \
431         -mno-red-zone \
432         -Wp,-MD,$(@D)/.$(@F).d \
433         -Wp,-MT,$@ \
434
435 #-fPIC \
436 #-fvisibility=hidden
437
438
439 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
440 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
441
442 # ----------------------------------------------------------------------
443 # Rules -
444 #   Describes how to compile the source files.
445 # ----------------------------------------------------------------------
446
447 # Compilation of kernel C source files
448 # Usage:
449 #       $(call build,TAG,commandline)
450 #
451 # If V=1 on the command line or the environment, then the actual
452 # command executed will be echoed to the terminal.  Otherwise
453 # only the tag and the output file will be printed to make
454 # any warnings stand out from the compile messages.
455 #
456 build = \
457         @if [ -z "$V" ]; then \
458                 echo '    [$1]  $@'; \
459                 $2; \
460         else \
461                 echo '$2'; \
462                 $2; \
463         fi
464
465
466
467 CC_COMPILE = \
468         $(call build,CC,$(TARGET_CC) \
469                 $(CC_GENERAL_OPTS) \
470                 $(EXTRA_CFLAGS) \
471                 -c \
472                 $< \
473                 -o $@ \
474                 $(INSTRUMENT_OPT) \
475         )
476
477 AS_COMPILE = \
478         $(call build,AS,$(TARGET_CC) \
479                 $(CC_GENERAL_OPTS) \
480                 $(EXTRA_CFLAGS) \
481                 -c \
482                 $< \
483                 -o $@ \
484                 $(INSTRUMENT_OPT) \
485         )
486
487
488 %.o: %.c
489         $(CC_COMPILE)
490 %.o: %.S
491         $(AS_COMPILE)
492 %.o: %.s
493         $(AS_COMPILE)
494
495
496 # ----------------------------------------------------------------------
497 # Targets -
498 #   Specifies files to be built
499 # ----------------------------------------------------------------------
500
501 # Default target - see definition of ALL_TARGETS in Configuration section
502 all : $(ALL_TARGETS)
503
504
505 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
506 #       $(NASM) -O99 \
507 #       -f elf \
508 #               -I$(PROJECT_ROOT)/src/geekos/ \
509 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
510 #       -o $@
511
512
513 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
514 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
515
516
517
518 rombios_link:
519         ln -s -f ../src/vmboot/rombios/BIOS-bochs-latest rombios
520
521 vgabios_link:
522         ln -s -f ../src/vmboot/vgabios/VGABIOS-lgpl-latest.bin vgabios
523
524
525 force_rombios: rombios_link
526         (cd ../src/vmboot/rombios; make clean; make)
527
528 force_vgabios: vgabios_link
529         (cd ../src/vmboot/vgabios; make clean; make)
530
531 force_payload: force_rombios force_vgabios
532         ../scripts/make_payload.pl payload_layout.txt vm_kernel
533
534 inter1: force_payload
535         -make clean
536
537 world: inter1 vmm
538
539 vmm: palacios/vmm.lib 
540
541
542
543
544 # Loadable (flat) kernel image.
545 palacios/vmm.bin : palacios/vmm.lib
546         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary palacios/vmm.lib palacios/vmm.bin
547
548
549 # The kernel executable and symbol map.
550 palacios/vmm.lib: libv3vee.a
551 libv3vee.a: \
552         $(VMM_OBJS) \
553         $(DEVICES_OBJS) \
554         $(XED_OBJS) \
555
556         $(call build,AR,$(TARGET_AR) rcs $@ $^)
557
558 force:
559
560
561
562
563
564 # Clean build directories of generated files
565 clean :
566         for d in palacios devices xed; do \
567                 (cd $$d && rm -f * .*.d); \
568         done
569
570
571 # Include all of the generated dependency files if they exist
572 -include */.*.o.d