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.


5e6f18d31737709dc86d888e52ef755d6313814c
[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.53 $
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
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
79
80 ifeq ($(DEBUG),1)
81   JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1 -DVMM_DEBUG=1 -DVMM_INFO=1 -DVMM_TRACE=1 $(DEBUG_SECTIONS)
82
83 else
84   JRLDEBUG= -DSERIAL_PRINT_DEBUG=0 -DSERIAL_PRINT_DEBUG_LEVEL=999999 -DSERIAL_PRINT=0 -DVMM_DEBUG=0 -DVMM_INFO=0 -DVMM_TRACE=0
85 endif
86
87
88 #
89 # DECODER is the decoder that will be used 
90 # currently we only support xed
91 #
92 DECODER=XED
93
94 DECODER_FLAGS=
95 DECODER_SRCS=
96 DECODER_LIBS=
97
98 ifeq ($(DECODER),XED)
99 DECODER_SRCS := vmm_xed.c
100 DECODER_FLAGS :=  -L../lib/xed
101 DECODER_LIBS := -lxed
102 else
103 # This is an error
104 endif
105
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                  $(DECODER_SRCS)
193 #\
194 #               vmx.c vmcs_gen.c vmcs.c
195
196 VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o)
197
198 VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS)
199
200
201
202
203 DEVICE_C_SRCS := generic.c keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c serial.c
204
205 DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o)
206
207 DEVICE_OBJS := $(DEVICE_C_OBJS)
208
209 V3LIBS := $(DECODER_LIBS)
210
211
212
213 # ----------------------------------------------------------------------
214 # Tools -
215 #   This section defines programs that are used to build GeekOS.
216 # ----------------------------------------------------------------------
217
218 # Uncomment if cross compiling
219 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
220 #TARGET_CC_PREFIX :=  i386-elf-
221
222 # Target C compiler.  gcc 2.95.2 or later should work.
223 TARGET_CC := $(TARGET_CC_PREFIX)gcc
224 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
225
226 # Host C compiler.  This is used to compile programs to execute on
227 # the host platform, not the target (x86) platform.  On x86/ELF
228 # systems, such as Linux and FreeBSD, it can generally be the same
229 # as the target C compiler.
230 HOST_CC := gcc
231
232 # Target linker.  GNU ld is probably to only one that will work.
233 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
234
235 # Target archiver
236 TARGET_AR := $(TARGET_CC_PREFIX)ar
237
238 # Target ranlib
239 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
240
241 # Target nm
242 TARGET_NM := $(TARGET_CC_PREFIX)nm
243
244 # Target objcopy
245 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
246
247 # Nasm (http://nasm.sourceforge.net)
248 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
249 #NASM := /opt/vmm-tools/bin/nasm
250
251 AS = as --32
252
253 # Tool to build PFAT filesystem images.
254 BUILDFAT := tools/builtFat.exe
255
256 # Perl5 or later
257 PERL := perl
258
259 # Pad a file so its size is a multiple of some unit (i.e., sector size)
260 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
261
262 # Create a file filled with zeroes.
263 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
264
265 # Calculate size of file in sectors
266 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
267
268
269 FD_SECTORS_PER_TRACK := $(PERL) $(PROJECT_ROOT)/scripts/numsecs_per_track
270
271
272 # ----------------------------------------------------------------------
273 # Definitions -
274 #   Options passed to the tools.
275 # ----------------------------------------------------------------------
276
277 # Flags used for all C source files
278 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(VMM_FLAGS) -fPIC
279 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
280
281 # Flags used for kernel C source files
282 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
283
284 # Flags used for VMM C source files
285 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__ -D__V3_32BIT__ $(DECODER_FLAGS) $(JRLDEBUG)
286
287 # Flags used for VMM C ASM files
288 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
289
290 # Flags user for kernel assembly files
291 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
292
293 # Flags used for common library and libc source files
294 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
295         $(EXTRA_CC_USER_OPTS)
296
297 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
298 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
299
300 # ----------------------------------------------------------------------
301 # Rules -
302 #   Describes how to compile the source files.
303 # ----------------------------------------------------------------------
304
305 # Compilation of kernel C source files
306
307 geekos/%.o : geekos/%.c
308         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
309
310
311 # Compilation of kernel assembly source files
312 geekos/%.o : geekos/%.asm
313         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
314
315 # Compilation of test VM
316 geekos/%.o : geekos/%.s
317         $(AS) $< -o geekos/$*.o
318
319 geekos/%.o : geekos/%.S
320         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
321
322 # Compilation of common library C source files
323 common/%.o : common/%.c
324         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
325
326 palacios/%.o : palacios/%.c
327         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
328
329 palacios/%.o : palacios/%.asm
330         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
331
332 devices/%.o : devices/%.c
333         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o devices/$*.o
334
335 devices/%.o : devices/%.asm
336         $(NASM) $(NASM_VMM_OPTS) $< -o devices/$*.o
337
338 # ----------------------------------------------------------------------
339 # Targets -
340 #   Specifies files to be built
341 # ----------------------------------------------------------------------
342
343 # Default target - see definition of ALL_TARGETS in Configuration section
344 all : $(ALL_TARGETS)
345
346
347 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
348 #       $(NASM) -O99 \
349 #       -f elf \
350 #               -I$(PROJECT_ROOT)/src/geekos/ \
351 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
352 #       -o $@
353
354
355 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
356 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
357
358 # Standard floppy image - just boots the kernel
359 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin
360         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
361         $(PAD) _temp 512
362         cp _temp fd.img
363
364 vmm.img : fd.img
365         cp fd.img vmm.img
366         $(PAD) vmm.img 1474560
367
368 force_rombios: 
369         (cd ../src/vmboot/rombios; make clean; make)
370
371 force_vgabios:
372         (cd ../src/vmboot/vgabios; make clean; make)
373
374 force_payload: force_rombios force_vgabios
375         ../scripts/make_payload.pl payload_layout.txt vm_kernel
376
377 inter1: force_payload
378         -make clean
379
380 world: inter1 vmm.img
381
382 # make ready to boot over PXE
383 pxe:    vmm.img
384         cp vmm.img /tftpboot/vmm.img
385
386 run: vmm.img
387         /usr/local/qemu/bin/qemu-system-x86_64 -m 1024 -serial file:serial.out -cdrom puppy.iso -fda vmm.img 
388
389
390
391
392 # Floppy boot sector (first stage boot loader).
393 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm
394         $(NASM) -f bin \
395                 -I$(PROJECT_ROOT)/src/geekos/ \
396                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
397                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
398                 -DSECTORS_PER_TRACK=`$(FD_SECTORS_PER_TRACK) geekos/kernel.bin geekos/setup.bin` \
399                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
400                 -o $@
401
402 # Setup program (second stage boot loader).
403 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
404         $(NASM) -f bin \
405                 -I$(PROJECT_ROOT)/src/geekos/ \
406                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
407                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
408                 $(PROJECT_ROOT)/src/geekos/setup.asm \
409                 -o $@
410         $(PAD) $@ 512
411
412 # Loadable (flat) kernel image.
413 geekos/kernel.bin : geekos/kernel.exe
414         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
415         $(PAD) $@ 512
416
417 # The kernel executable and symbol map.
418 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) vm_kernel
419         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
420                 $(DECODER_FLAGS) \
421                 $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) $(V3LIBS) -b binary vm_kernel
422         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
423
424
425 force:
426
427
428 #vm_kernel: force
429 #       $(PAD) vm_kernel 512
430 #       @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
431
432
433
434
435 # Clean build directories of generated files
436 clean :
437         for d in geekos common libc user tools palacios devices; do \
438                 (cd $$d && rm -f *); \
439         done
440
441
442 # Build header file dependencies, so source files are recompiled when
443 # header files they depend on are modified.
444 depend : $(GENERATED_LIBC_SRCS)
445         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
446                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
447                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
448                 > depend.mak
449         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
450                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
451                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
452                 >> depend.mak
453         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
454                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
455                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
456                 >> depend.mak
457         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
458                 $(DEVICE_C_SRCS:%.c=$(PROJECT_ROOT)/src/devices/%.c) \
459                 | $(PERL) -n -e 's,^(\S),devices/$$1,;print' \
460                 >> depend.mak
461
462 # By default, there are no header file dependencies.
463 depend.mak :
464         touch $@
465
466 include depend.mak