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.


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