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.


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