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.


*** empty log message ***
[palacios.git] / palacios / build / Makefile
1 # Makefile for GeekOS kernel, userspace, and tools
2 # Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu>
3 # $Revision: 1.61 $
4
5 # This is free software.  You are permitted to use,
6 # redistribute, and modify it as specified in the file "COPYING".
7
8 # Required software to build GeekOS:
9 # - GNU Make (http://www.gnu.org/software/make)
10 # - gcc 2.95.2 generating code for target (i386/ELF) and host platforms
11 # - nasm (http://nasm.sourceforge.net)
12 # - Perl5, AWK (any version), egrep
13 #
14 # Cygwin (http://cygwin.com) may be used to build GeekOS.
15 # Make sure that gcc, binutils, nasm, and perl are installed.
16
17 # NOTES:
18 # - This makefile has been written carefully to work correctly
19 #   with the -j (parallel make) option.  I regularly use "make -j 2"
20 #   to speed the build process on 2 processor systems.
21
22
23 # Base address of kernel
24 #
25 # Note: at top of memory minus three pages (GDT/TSS/IDT) 
26 # minus maximum size
27 #
28 #
29 # Note that the code will initially load at 0x10000
30 #
31 # The setup code needs to copy it up to this address and jump there
32 #
33 KERNEL_BASE_ADDR := 0x00100000
34
35 # Kernel entry point function
36 KERNEL_ENTRY = $(SYM_PFX)Main
37
38
39 PROJECT_ROOT := ..
40 VPATH := $(PROJECT_ROOT)/src
41
42 #when -DNDEBUG is set the kassert functions are disabled
43 #JRLDEBUG=-DNDEBUG
44
45 # DEBUG=1 means VMM_DEBUG, VMM_INFO, and VMM_TRACE are enabled
46 # as are SERIAL_PRINT_DEBUG
47
48 DEBUG=1
49 DEBUG_SECTIONS= 
50
51 ifeq ($(DEBUG_ALL),1)
52   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 
53 endif
54 ifeq ($(DEBUG_SHADOW_PAGING),1)
55 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_SHADOW_PAGING
56 endif
57 ifeq ($(DEBUG_CTRL_REGS),1)
58 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_CTRL_REGS
59 endif
60 ifeq ($(DEBUG_INTERRUPTS),1)
61 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_INTERRUPTS
62 endif
63 ifeq ($(DEBUG_IO),1)
64 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_IO
65 endif
66 ifeq ($(DEBUG_KEYBOARD),1)
67 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_KEYBOARD
68 endif
69 ifeq ($(DEBUG_PIC),1)
70 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIC
71 endif
72 ifeq ($(DEBUG_PIT),1)
73 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIT
74 endif
75 ifeq ($(DEBUG_NVRAM),1)
76 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_NVRAM
77 endif
78 ifeq ($(DEBUG_GENERIC),1)
79 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_GENERIC
80 endif
81 ifeq ($(DEBUG_EMULATOR),1)
82 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_EMULATOR
83 endif
84 ifeq ($(DEBUG_RAMDISK),1)
85 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_RAMDISK
86 endif
87
88
89 ifeq ($(DEBUG),1)
90   JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1 -DVMM_DEBUG=1 -DVMM_INFO=1 -DVMM_TRACE=1 $(DEBUG_SECTIONS)
91
92 else
93   JRLDEBUG= -DSERIAL_PRINT_DEBUG=0 -DSERIAL_PRINT_DEBUG_LEVEL=999999 -DSERIAL_PRINT=0 -DVMM_DEBUG=0 -DVMM_INFO=0 -DVMM_TRACE=0
94 endif
95
96
97 #
98 # DECODER is the decoder that will be used 
99 # currently we only support xed
100 #
101 DECODER=XED
102
103 DECODER_FLAGS=
104 DECODER_SRCS=
105 DECODER_LIBS=
106
107 ifeq ($(DECODER),XED)
108 DECODER_SRCS := vmm_xed.c
109 DECODER_FLAGS :=  -L../lib/xed
110 DECODER_LIBS := -lxed
111 else
112 # This is an error
113 endif
114
115 #
116 #TCPSTACK, uIP is used currently
117 #
118 TCPSTACK=UIP
119
120 #
121 #RAMDISK
122 #
123 RAMDISK_SRCS=
124 BOOT_FLAGS=
125
126 ifeq ($(RAMDISK_BOOT),1)
127 BOOT_FLAGS := $(BOOT_FLAGS) -DRAMDISK_BOOT
128 RAMDISK_SRCS := ramdisk.c cdrom.c
129 endif
130
131
132
133 #
134 # This is wrong for current cygwin - no changes needed
135 #
136 # Figure out if we're compiling with cygwin, http://cygwin.com
137 #
138
139 #SYSTEM_NAME := $(shell uname -s)
140 #ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
141 #SYM_PFX            := _
142 #EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
143 #EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
144 #NON_ELF_SYSTEM     := yes
145 #EXTRA_CC_USER_OPTS := -Dmain=geekos_main
146 #endif
147
148
149
150
151 # ----------------------------------------------------------------------
152 # Configuration -
153 #   Various options specifying how GeekOS should be built,
154 #   what source files to build, which user programs to build,
155 #   etc.  This is generally the only section of the makefile
156 #   that will need to be modified.
157 # ----------------------------------------------------------------------
158
159 # List of targets to build by default.
160 # These targets encompass everything needed to boot
161 # and run GeekOS.
162 ALL_TARGETS := vmm.img vm_kernel
163
164
165 # Kernel source files
166 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
167         blockdev.c ide.c ne2k.c \
168         keyboard.c screen.c timer.c \
169         mem.c crc32.c \
170         gdt.c tss.c segment.c \
171         bget.c malloc.c \
172         synch.c kthread.c \
173         serial.c  reboot.c \
174         paging.c \
175         debug.c vmm_stubs.c  vm.c  pci.c\
176         main.c
177
178 # Kernel object files built from C source files
179 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
180
181 # Kernel assembly files
182 KERNEL_ASM_SRCS := lowlevel.asm
183
184 KERNEL_GAS_SRCS := testvm.s udivdi3.s
185
186 # Kernel object files build from assembler source files
187 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
188
189 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
190
191
192 # All kernel object files
193 KERNEL_OBJS := $(KERNEL_C_OBJS) \
194   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
195
196 # Common library source files.
197 # This library is linked into both the kernel and user programs.
198 # It provides string functions and generic printf()-style
199 # formatted output.
200 COMMON_C_SRCS := fmtout.c string.c memmove.c
201
202 # Common library object files.
203 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
204
205 VMM_ASM_SRCS :=  svm_lowlevel.asm \
206 #                       vmx_lowlevel.asm
207
208 VMM_ASM_OBJS := $(VMM_ASM_SRCS:%.asm=palacios/%.o)
209
210
211 VMM_C_SRCS :=   vm_guest.c \
212                 svm.c svm_handler.c vmm.c vmm_util.c vmm_ctrl_regs.c \
213                 vmcb.c vmm_mem.c vmm_paging.c vmm_io.c vmm_debug.c svm_io.c \
214                 vmm_intr.c vmm_time.c \
215                 vmm_shadow_paging.c vm_guest_mem.c  \
216                 vm_dev.c vmm_dev_mgr.c vmm_decoder.c \
217                 svm_halt.c svm_pause.c svm_wbinvd.c \
218                 vmm_config.c vmm_hashtable.c \
219                 vmm_string.c vmm_emulator.c \
220                  $(DECODER_SRCS)
221 #               vmx.c vmcs_gen.c vmcs.c
222
223 VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o)
224
225 VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS)
226
227
228
229
230 DEVICE_C_SRCS := generic.c keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c serial.c $(RAMDISK_SRCS)
231
232 DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o)
233
234 DEVICE_OBJS := $(DEVICE_C_OBJS)
235
236 V3LIBS := $(DECODER_LIBS)
237
238
239 TCPSTACK_C_SRCS := psock.c timer.c uip_arp.c uip.c uip-fw.c uiplib.c uip-neighbor.c uip-split.c resolv.c
240
241 TCPSTACK_C_OBJS := $(TCPSTACK_C_SRCS:%.c=net/%.o)
242
243 TCPSTACK_OBJS := $(TCPSTACK_C_OBJS)
244
245
246
247
248 # ----------------------------------------------------------------------
249 # Tools -
250 #   This section defines programs that are used to build GeekOS.
251 # ----------------------------------------------------------------------
252
253 # Uncomment if cross compiling
254 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
255 #TARGET_CC_PREFIX :=  i386-elf-
256
257 # Target C compiler.  gcc 2.95.2 or later should work.
258 TARGET_CC := $(TARGET_CC_PREFIX)gcc
259 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
260
261 # Host C compiler.  This is used to compile programs to execute on
262 # the host platform, not the target (x86) platform.  On x86/ELF
263 # systems, such as Linux and FreeBSD, it can generally be the same
264 # as the target C compiler.
265 HOST_CC := gcc
266
267 # Target linker.  GNU ld is probably to only one that will work.
268 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
269
270 # Target archiver
271 TARGET_AR := $(TARGET_CC_PREFIX)ar
272
273 # Target ranlib
274 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
275
276 # Target nm
277 TARGET_NM := $(TARGET_CC_PREFIX)nm
278
279 # Target objcopy
280 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
281
282 # Nasm (http://nasm.sourceforge.net)
283 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
284 #NASM := /opt/vmm-tools/bin/nasm
285
286 AS = as --32
287
288 # Tool to build PFAT filesystem images.
289 BUILDFAT := tools/builtFat.exe
290
291 # Perl5 or later
292 PERL := perl
293
294 # Pad a file so its size is a multiple of some unit (i.e., sector size)
295 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
296
297 # Create a file filled with zeroes.
298 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
299
300 # Calculate size of file in sectors
301 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
302
303
304 FD_SECTORS_PER_TRACK := $(PERL) $(PROJECT_ROOT)/scripts/numsecs_per_track
305
306
307 # ----------------------------------------------------------------------
308 # Definitions -
309 #   Options passed to the tools.
310 # ----------------------------------------------------------------------
311
312 # Flags used for all C source files
313 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(VMM_FLAGS) $(BOOT_FLAGS) -fPIC
314 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
315
316 # Flags used for kernel C source files
317 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
318
319 # Flags used for VMM C source files
320 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__ -D__V3_32BIT__ $(DECODER_FLAGS) $(JRLDEBUG)
321
322 # Flags used for VMM C ASM files
323 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
324
325 # Flags user for kernel assembly files
326 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
327
328 # Flags used for common library and libc source files
329 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
330         $(EXTRA_CC_USER_OPTS)
331
332 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
333 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
334
335 # ----------------------------------------------------------------------
336 # Rules -
337 #   Describes how to compile the source files.
338 # ----------------------------------------------------------------------
339
340 # Compilation of kernel C source files
341
342 geekos/%.o : geekos/%.c
343         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
344
345
346 # Compilation of kernel assembly source files
347 geekos/%.o : geekos/%.asm
348         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
349
350 # Compilation of test VM
351 geekos/%.o : geekos/%.s
352         $(AS) $< -o geekos/$*.o
353
354 geekos/%.o : geekos/%.S
355         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
356
357 # Compilation of common library C source files
358 common/%.o : common/%.c
359         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
360
361 palacios/%.o : palacios/%.c
362         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
363
364 palacios/%.o : palacios/%.asm
365         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
366
367 devices/%.o : devices/%.c
368         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o devices/$*.o
369
370 devices/%.o : devices/%.asm
371         $(NASM) $(NASM_VMM_OPTS) $< -o devices/$*.o
372
373 net/%.o : net/%.c
374         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS)  $(CC_USER_OPTS) $< -o net/$*.o
375
376 # ----------------------------------------------------------------------
377 # Targets -
378 #   Specifies files to be built
379 # ----------------------------------------------------------------------
380
381 # Default target - see definition of ALL_TARGETS in Configuration section
382 all : $(ALL_TARGETS)
383
384
385 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
386 #       $(NASM) -O99 \
387 #       -f elf \
388 #               -I$(PROJECT_ROOT)/src/geekos/ \
389 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
390 #       -o $@
391
392
393 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
394 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
395
396 # Standard floppy image - just boots the kernel
397 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin
398         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
399         $(PAD) _temp 512
400         cp _temp fd.img
401
402 vmm.img : fd.img
403         cp fd.img vmm.img
404         $(PAD) vmm.img 1474560
405
406 force_rombios: 
407         (cd ../src/vmboot/rombios; make clean; make)
408
409 force_vgabios:
410         (cd ../src/vmboot/vgabios; make clean; make)
411
412 force_payload: force_rombios force_vgabios
413         ../scripts/make_payload.pl payload_layout.txt vm_kernel
414
415 inter1: force_payload
416         -make clean
417
418 world: inter1 vmm.img
419
420 # make ready to boot over PXE
421 pxe:    vmm.img
422         cp vmm.img /tftpboot/vmm.img
423
424 run: vmm.img
425         /usr/local/qemu/bin/qemu-system-x86_64 -m 1024 -serial file:serial.out -cdrom puppy.iso -fda vmm.img 
426
427
428
429
430 # Floppy boot sector (first stage boot loader).
431 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm
432         $(NASM) -f bin \
433                 -I$(PROJECT_ROOT)/src/geekos/ \
434                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
435                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
436                 -DSECTORS_PER_TRACK=`$(FD_SECTORS_PER_TRACK) geekos/kernel.bin geekos/setup.bin` \
437                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
438                 -o $@
439
440 # Setup program (second stage boot loader).
441 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
442         $(NASM) -f bin \
443                 -I$(PROJECT_ROOT)/src/geekos/ \
444                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
445                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
446                 $(PROJECT_ROOT)/src/geekos/setup.asm \
447                 -o $@
448         $(PAD) $@ 2048
449
450 # Loadable (flat) kernel image.
451 geekos/kernel.bin : geekos/kernel.exe
452         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
453         $(PAD) $@ 512
454
455 # The kernel executable and symbol map.
456 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) $(TCPSTACK_OBJS) vm_kernel
457         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
458                 $(DECODER_FLAGS) \
459                 $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) $(V3LIBS) $(TCPSTACK_OBJS) -b binary vm_kernel
460         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
461
462
463 force:
464
465
466 #vm_kernel: force
467 #       $(PAD) vm_kernel 512
468 #       @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
469
470
471
472
473 # Clean build directories of generated files
474 clean :
475         for d in geekos common libc user tools palacios devices net; do \
476                 (cd $$d && rm -f *); \
477         done
478
479
480 # Build header file dependencies, so source files are recompiled when
481 # header files they depend on are modified.
482 depend : $(GENERATED_LIBC_SRCS)
483         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
484                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
485                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
486                 > depend.mak
487         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
488                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
489                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
490                 >> depend.mak
491         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
492                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
493                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
494                 >> depend.mak
495         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
496                 $(DEVICE_C_SRCS:%.c=$(PROJECT_ROOT)/src/devices/%.c) \
497                 | $(PERL) -n -e 's,^(\S),devices/$$1,;print' \
498                 >> depend.mak
499
500 # By default, there are no header file dependencies.
501 depend.mak :
502         touch $@
503
504 include depend.mak