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