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.


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