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.


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