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.


General fixes and clean up
[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 <xiaxlei@gmail.com>
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 # - nasm (http://nasm.sourceforge.net)
21 # - Perl5, AWK (any version), egrep
22 #
23 # Cygwin (http://cygwin.com) may be used to build GeekOS.
24 # Make sure that gcc, binutils, nasm, and perl are installed.
25
26 # NOTES:
27 # - This makefile has been written carefully to work correctly
28 #   with the -j (parallel make) option.  I regularly use "make -j 2"
29 #   to speed the build process on 2 processor systems.
30
31
32 # Base address of kernel
33 #
34 # Note: at top of memory minus three pages (GDT/TSS/IDT) 
35 # minus maximum size
36 #
37 #
38 # Note that the code will initially load at 0x10000
39 #
40 # The setup code needs to copy it up to this address and jump there
41 #
42
43
44
45
46 PROJECT_ROOT := ..
47 VPATH := $(PROJECT_ROOT)/src
48
49 #when -DNDEBUG is set the kassert functions are disabled
50 #JRLDEBUG=-DNDEBUG
51
52 # DEBUG=1 means VMM_DEBUG, VMM_INFO, and VMM_TRACE are enabled
53 # as are SERIAL_PRINT_DEBUG
54
55 DEBUG=1
56 DEBUG_SECTIONS= 
57
58 ifeq ($(DEBUG_ALL),1)
59   DEBUG_SECTIONS:= $(DEBUG_SECTIONS) -DDEBUG_SHADOW_PAGING -DDEBUG_CTRL_REGS -DDEBUG_INTERRUPTS -DDEBUG_IO -DDEBUG_KEYBOARD -DDEBUG_PIC -DDEBUG_PIT -DDEBUG_NVRAM -DDEBUG_EMULATOR -DDEBUG_GENERIC -DDEBUG_RAMDISK
60 endif
61
62 ifeq ($(DEBUG_SHADOW_PAGING),1)
63 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_SHADOW_PAGING
64 else 
65 ifeq ($(DEBUG_SHADOW_PAGING),0) 
66 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_SHADOW_PAGING
67 endif
68 endif
69
70 ifeq ($(DEBUG_CTRL_REGS),1)
71 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_CTRL_REGS
72 else 
73 ifeq ($(DEBUG_CTRL_REGS),0) 
74 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_CTRL_REGS
75 endif
76 endif
77
78 ifeq ($(DEBUG_INTERRUPTS),1)
79 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_INTERRUPTS
80 else 
81 ifeq ($(DEBUG_INTERRUPTS),0) 
82 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_INTERRUPTS
83 endif
84 endif
85
86 ifeq ($(DEBUG_IO),1)
87 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_IO
88 else 
89 ifeq ($(DEBUG_IO),0) 
90 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_IO
91 endif
92 endif
93
94 ifeq ($(DEBUG_KEYBOARD),1)
95 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_KEYBOARD
96 else 
97 ifeq ($(DEBUG_KEYBOARD),0) 
98 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_KEYBOARD
99 endif
100 endif
101
102 ifeq ($(DEBUG_PIC),1)
103 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIC
104 else 
105 ifeq ($(DEBUG_PIC),0) 
106 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PIC
107 endif
108 endif
109
110 ifeq ($(DEBUG_PIT),1)
111 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIT
112 else 
113 ifeq ($(DEBUG_PIT),0) 
114 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PIT
115 endif
116 endif
117
118 ifeq ($(DEBUG_NVRAM),1)
119 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_NVRAM
120 else 
121 ifeq ($(DEBUG_NVRAM),0) 
122 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_NVRAM
123 endif
124 endif
125
126 ifeq ($(DEBUG_GENERIC),1)
127 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_GENERIC
128 else 
129 ifeq ($(DEBUG_GENERIC),0) 
130 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_GENERIC
131 endif
132 endif
133
134 ifeq ($(DEBUG_EMULATOR),1)
135 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_EMULATOR
136 else 
137 ifeq ($(DEBUG_EMULATOR),0) 
138 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_EMULATOR
139 endif
140 endif
141
142 ifeq ($(DEBUG_RAMDISK),1)
143 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_RAMDISK
144 else 
145 ifeq ($(DEBUG_RAMDISK),0) 
146 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_RAMDISK
147 endif
148 endif
149
150 ifeq ($(TRACE_RAMDISK),1)
151 DEBUG_SECTIONS := $(DEBUG_SECTIONS -DTRACE_RAMDISK
152 else
153 ifeq ($(TRACE_RAMDSK),0)
154 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UTRACE_RAMDISK
155 endif
156 endif
157
158
159
160 #DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DTEST_NE2K
161
162 ifeq ($(DEBUG),1)
163   JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1 -DVMM_DEBUG=1 -DVMM_INFO=1 -DVMM_TRACE=1 $(DEBUG_SECTIONS)
164
165 else
166   JRLDEBUG= -DSERIAL_PRINT_DEBUG=0 -DSERIAL_PRINT_DEBUG_LEVEL=999999 -DSERIAL_PRINT=0 -DVMM_DEBUG=0 -DVMM_INFO=0 -DVMM_TRACE=0
167 endif
168
169
170 #
171 # DECODER is the decoder that will be used 
172 # currently we only support xed
173 #
174 DECODER=XED
175
176 DECODER_FLAGS=
177 DECODER_SRCS=
178 DECODER_LIBS=
179
180 ifeq ($(DECODER),XED)
181 DECODER_SRCS := vmm_xed.c
182 DECODER_FLAGS :=  -L../lib/xed
183 DECODER_LIBS := $(PROJECT_ROOT)/lib/xed/libxed.a
184 else
185 # This is an error
186 endif
187
188
189
190
191
192
193 #
194 # This is wrong for current cygwin - no changes needed
195 #
196 # Figure out if we're compiling with cygwin, http://cygwin.com
197 #
198
199 #SYSTEM_NAME := $(shell uname -s)
200 #ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
201 #SYM_PFX            := _
202 #EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
203 #EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
204 #NON_ELF_SYSTEM     := yes
205 #EXTRA_CC_USER_OPTS := -Dmain=geekos_main
206 #endif
207
208
209
210
211 # ----------------------------------------------------------------------
212 # Configuration -
213 #   Various options specifying how GeekOS should be built,
214 #   what source files to build, which user programs to build,
215 #   etc.  This is generally the only section of the makefile
216 #   that will need to be modified.
217 # ----------------------------------------------------------------------
218
219 # List of targets to build by default.
220 # These targets encompass everything needed to boot
221 # and run GeekOS.
222 ALL_TARGETS := vmm vm_kernel
223
224
225
226
227
228
229 VMM_ASM_SRCS :=  svm_lowlevel.asm vmm_lowlevel.asm\
230 #                       vmx_lowlevel.asm
231
232 VMM_ASM_OBJS := $(VMM_ASM_SRCS:%.asm=palacios/%.o)
233
234
235 VMM_C_SRCS :=   vm_guest.c \
236                 svm.c svm_handler.c vmm.c vmm_util.c vmm_ctrl_regs.c \
237                 vmcb.c vmm_mem.c vmm_paging.c vmm_io.c vmm_debug.c svm_io.c \
238                 vmm_intr.c vmm_time.c \
239                 vmm_shadow_paging.c vm_guest_mem.c  \
240                 vm_dev.c vmm_dev_mgr.c vmm_decoder.c \
241                 svm_halt.c svm_pause.c svm_wbinvd.c \
242                 vmm_config.c vmm_hashtable.c \
243                 vmm_string.c vmm_emulator.c vmm_queue.c\
244                  $(DECODER_SRCS)
245 #               vmx.c vmcs_gen.c vmcs.c
246
247 VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o)
248
249 VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS)
250
251
252
253 XED_C_SRCS := v3-xed-compat.c
254
255 XED_C_OBJS := $(XED_C_SRCS:%.c=xed/%.o)
256
257 XED_GAS_SRCS := v3-udiv-compat.s
258
259 XED_GAS_OBJS := $(XED_GAS_SRCS:%.s=xed/%.o)
260
261 XED_OBJS := $(XED_C_OBJS) $(XED_GAS_OBJS)
262
263
264
265 DEVICE_C_SRCS := generic.c keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c serial.c ramdisk.c cdrom.c
266
267 DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o)
268
269 DEVICE_OBJS := $(DEVICE_C_OBJS)
270
271 V3LIBS := $(DECODER_LIBS)
272
273
274
275
276
277 # ----------------------------------------------------------------------
278 # Tools -
279 #   This section defines programs that are used to build GeekOS.
280 # ----------------------------------------------------------------------
281
282
283 V3_ARCH := __V3_32BIT__
284 #V3_ARCH := __V3_64BIT__
285
286 # Uncomment if cross compiling
287 #TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
288 #TARGET_CC_PREFIX :=  i386-elf-
289
290 # Target C compiler.  gcc 2.95.2 or later should work.
291 TARGET_CC := $(TARGET_CC_PREFIX)gcc -m32
292 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
293
294
295 # Target linker.  GNU ld is probably to only one that will work.
296 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
297
298 # Target archiver
299 TARGET_AR := $(TARGET_CC_PREFIX)ar
300
301 # Target ranlib
302 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
303
304 # Target nm
305 TARGET_NM := $(TARGET_CC_PREFIX)nm
306
307 # Target objcopy
308 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
309
310 # Nasm (http://nasm.sourceforge.net)
311 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
312 #NASM := /opt/vmm-tools/bin/nasm
313
314 AS = as --32
315
316 # Tool to build PFAT filesystem images.
317 BUILDFAT := tools/builtFat.exe
318
319 # Perl5 or later
320 PERL := perl
321
322 # Pad a file so its size is a multiple of some unit (i.e., sector size)
323 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
324
325 # Create a file filled with zeroes.
326 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
327
328 # Calculate size of file in sectors
329 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
330
331
332 FD_SECTORS_PER_TRACK := $(PERL) $(PROJECT_ROOT)/scripts/numsecs_per_track
333
334
335 # ----------------------------------------------------------------------
336 # Definitions -
337 #   Options passed to the tools.
338 # ----------------------------------------------------------------------
339
340 # Flags used for all C source files
341 #GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(VMM_FLAGS) -fPIC #-fvisibility=hidden
342 GENERAL_OPTS :=  -O -Wall  $(EXTRA_C_OPTS) $(VMM_FLAGS) -fPIC #-fvisibility=hidden
343 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
344
345 # Flags used for VMM C source files
346 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__ -D$(V3_ARCH) $(DECODER_FLAGS) $(JRLDEBUG)
347
348 # Flags used for VMM C ASM files
349 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
350
351
352
353
354
355 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
356 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
357
358 # ----------------------------------------------------------------------
359 # Rules -
360 #   Describes how to compile the source files.
361 # ----------------------------------------------------------------------
362
363
364
365 palacios/%.o : palacios/%.c
366         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
367
368 palacios/%.o : palacios/%.asm
369         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
370
371 devices/%.o : devices/%.c
372         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o devices/$*.o
373
374 devices/%.o : devices/%.asm
375         $(NASM) $(NASM_VMM_OPTS) $< -o devices/$*.o
376
377
378 xed/%.o : xed/%.c
379         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o xed/$*.o
380
381 xed/%.o : xed/%.s
382         $(AS) $< -o xed/$*.o
383
384
385 # ----------------------------------------------------------------------
386 # Targets -
387 #   Specifies files to be built
388 # ----------------------------------------------------------------------
389
390 # Default target - see definition of ALL_TARGETS in Configuration section
391 all : $(ALL_TARGETS)
392
393
394 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
395 #       $(NASM) -O99 \
396 #       -f elf \
397 #               -I$(PROJECT_ROOT)/src/geekos/ \
398 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
399 #       -o $@
400
401
402 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
403 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
404
405
406
407 rombios_link:
408         ln -s -f ../src/vmboot/rombios/BIOS-bochs-latest rombios
409
410 vgabios_link:
411         ln -s -f ../src/vmboot/vgabios/VGABIOS-lgpl-latest.bin vgabios
412
413 force_lwip:
414         (cd ../src/lwip/build; make clean; make)
415
416 force_rombios: rombios_link
417         (cd ../src/vmboot/rombios; make clean; make)
418
419 force_vgabios: vgabios_link
420         (cd ../src/vmboot/vgabios; make clean; make)
421
422 force_payload: force_rombios force_vgabios
423         ../scripts/make_payload.pl payload_layout.txt vm_kernel
424
425 inter1: force_payload force_lwip
426         -make clean
427
428 world: inter1 vmm
429
430 vmm: palacios/vmm.lib 
431
432
433
434
435 # Loadable (flat) kernel image.
436 palacios/vmm.bin : palacios/vmm.lib
437         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary palacios/vmm.lib palacios/vmm.bin
438
439
440 # The kernel executable and symbol map.
441 palacios/vmm.lib: $(VMM_OBJS) $(DEVICE_OBJS) $(XED_OBJS) vm_kernel
442 #       $(TARGET_LD) -o palacios/vmm.lib  \
443 #               $(DECODER_FLAGS) \
444 #                $(VMM_OBJS) $(DEVICE_OBJS) $(XED_OBJS) $(V3LIBS) -b binary vm_kernel
445 #       $(TARGET_NM) palacios/vmm.lib > palacios/vmm.syms
446         $(TARGET_AR) rcs libv3vee.a  \
447                  $(VMM_OBJS) $(DEVICE_OBJS) $(XED_OBJS)
448
449
450
451 force:
452
453
454
455
456
457 # Clean build directories of generated files
458 clean :
459         for d in palacios devices; do \
460                 (cd $$d && rm -f *); \
461         done
462
463
464 # Build header file dependencies, so source files are recompiled when
465 # header files they depend on are modified.
466 depend : $(GENERATED_LIBC_SRCS)
467
468         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
469                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
470                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
471                 >> depend.mak
472         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
473                 $(DEVICE_C_SRCS:%.c=$(PROJECT_ROOT)/src/devices/%.c) \
474                 | $(PERL) -n -e 's,^(\S),devices/$$1,;print' \
475                 >> depend.mak
476
477 # By default, there are no header file dependencies.
478 depend.mak :
479         touch $@
480
481 include depend.mak