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