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.


moved guest files to kernel image
[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.45 $
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
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 svm_pause.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 #Round a value up to a certain factor (hex values)
215 ROUND_UP_HEX := $(PERL) $(PROJECT_ROOT)/scripts/round_up_hex.pl
216
217 # ----------------------------------------------------------------------
218 # Definitions -
219 #   Options passed to the tools.
220 # ----------------------------------------------------------------------
221
222 # Flags used for all C source files
223 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS) -fPIC
224 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
225
226 # Flags used for kernel C source files
227 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
228
229 # Flags used for VMM C source files
230 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__ -D__V3_32BIT__
231
232 # Flags used for VMM C ASM files
233 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
234
235 # Flags user for kernel assembly files
236 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
237
238 # Flags used for common library and libc source files
239 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
240         $(EXTRA_CC_USER_OPTS)
241
242 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
243 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
244
245 # ----------------------------------------------------------------------
246 # Rules -
247 #   Describes how to compile the source files.
248 # ----------------------------------------------------------------------
249
250 # Compilation of kernel C source files
251
252 geekos/%.o : geekos/%.c
253         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
254
255
256 # Compilation of kernel assembly source files
257 geekos/%.o : geekos/%.asm
258         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
259
260 # Compilation of test VM
261 geekos/%.o : geekos/%.s
262         $(AS) $< -o geekos/$*.o
263
264 geekos/%.o : geekos/%.S
265         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
266
267 # Compilation of common library C source files
268 common/%.o : common/%.c
269         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
270
271 palacios/%.o : palacios/%.c
272         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
273
274 palacios/%.o : palacios/%.asm
275         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
276
277 devices/%.o : devices/%.c
278         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o devices/$*.o
279
280 devices/%.o : devices/%.asm
281         $(NASM) $(NASM_VMM_OPTS) $< -o devices/$*.o
282
283 # ----------------------------------------------------------------------
284 # Targets -
285 #   Specifies files to be built
286 # ----------------------------------------------------------------------
287
288 # Default target - see definition of ALL_TARGETS in Configuration section
289 all : $(ALL_TARGETS)
290
291
292 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
293 #       $(NASM) -O99 \
294 #       -f elf \
295 #               -I$(PROJECT_ROOT)/src/geekos/ \
296 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
297 #       -o $@
298
299
300 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
301 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
302
303 # Standard floppy image - just boots the kernel
304 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin
305         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
306         $(PAD) _temp 512
307         cp _temp fd.img
308
309 vmm.img : fd.img
310         cp fd.img vmm.img
311         $(PAD) vmm.img 1474560
312
313 force_rombios: 
314         (cd ../src/vmboot/rombios; make clean; make)
315
316 force_vgabios:
317         (cd ../src/vmboot/vgabios; make clean; make)
318
319 force_payload: force_rombios force_vgabios
320         ../scripts/make_payload.pl payload_layout.txt vm_kernel
321
322 inter1: force_payload
323         -make clean
324
325 world: inter1 vmm.img
326
327 # make ready to boot over PXE
328 pxe:    vmm.img
329         cp vmm.img /tftpboot/vmm.img
330
331 run: vmm.img
332         /usr/local/qemu/bin/qemu-system-x86_64 -m 1024 -serial file:serial.out -cdrom puppy.iso -fda vmm.img 
333
334
335
336
337 # Floppy boot sector (first stage boot loader).
338 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm
339         $(NASM) -f bin \
340                 -I$(PROJECT_ROOT)/src/geekos/ \
341                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
342                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
343                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
344                 -o $@
345
346 # Setup program (second stage boot loader).
347 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
348         $(NASM) -f bin \
349                 -I$(PROJECT_ROOT)/src/geekos/ \
350                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
351                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
352                 $(PROJECT_ROOT)/src/geekos/setup.asm \
353                 -o $@
354         $(PAD) $@ 512
355
356 # Loadable (flat) kernel image.
357 geekos/kernel.bin : geekos/kernel.exe
358         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
359         $(PAD) $@ 512
360
361 # The kernel executable and symbol map.
362 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) vm_kernel
363         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
364                  $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) -b binary vm_kernel
365         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
366
367
368 force:
369
370
371 #vm_kernel: force
372 #       $(PAD) vm_kernel 512
373 #       @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
374
375
376
377
378 # Clean build directories of generated files
379 clean :
380         for d in geekos common libc user tools palacios devices; do \
381                 (cd $$d && rm -f *); \
382         done
383
384
385 # Build header file dependencies, so source files are recompiled when
386 # header files they depend on are modified.
387 depend : $(GENERATED_LIBC_SRCS)
388         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
389                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
390                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
391                 > depend.mak
392         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
393                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
394                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
395                 >> depend.mak
396         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
397                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
398                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
399                 >> depend.mak
400         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
401                 $(DEVICE_C_SRCS:%.c=$(PROJECT_ROOT)/src/devices/%.c) \
402                 | $(PERL) -n -e 's,^(\S),devices/$$1,;print' \
403                 >> depend.mak
404
405 # By default, there are no header file dependencies.
406 depend.mak :
407         touch $@
408
409 include depend.mak